From cdeb37df0b3422a8d89e741fb012e91f409745cd Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard Date: Thu, 21 May 2020 14:52:48 +0800 Subject: [PATCH 001/484] Adds reproducibility constants.py --- .../dlg/reproducibility/__jnit__.py | 24 +++++++++++++++++++ .../dlg/reproducibility/constants.py | 12 ++++++++++ 2 files changed, 36 insertions(+) create mode 100644 daliuge-runtime/dlg/reproducibility/__jnit__.py create mode 100644 daliuge-runtime/dlg/reproducibility/constants.py diff --git a/daliuge-runtime/dlg/reproducibility/__jnit__.py b/daliuge-runtime/dlg/reproducibility/__jnit__.py new file mode 100644 index 000000000..23a4d8be3 --- /dev/null +++ b/daliuge-runtime/dlg/reproducibility/__jnit__.py @@ -0,0 +1,24 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2015 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +""" +This package contains code resources required to integrate reproduciblity measure into DALiuGE. +""" \ No newline at end of file diff --git a/daliuge-runtime/dlg/reproducibility/constants.py b/daliuge-runtime/dlg/reproducibility/constants.py new file mode 100644 index 000000000..03e954007 --- /dev/null +++ b/daliuge-runtime/dlg/reproducibility/constants.py @@ -0,0 +1,12 @@ +from enum import Enum + + +class ReproducibilityLevels(Enum): + # Handle None with the default keyword + NOTHING = 0 + RERUN = 1 + REPEAT = 2 + REPRODUCE = 3 + REPLICATE_COMP = 4 + REPLICATE_SCI = 5 + REPLICATE_FULL = 6 From 9f33e748bc1c1bb80b9fa420a816a362c3e00e15 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard Date: Thu, 21 May 2020 15:00:34 +0800 Subject: [PATCH 002/484] Adds rough cut for abstract_Drop merkleTree properties --- daliuge-runtime/dlg/drop.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 5ddc7427d..55eb3d199 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -51,6 +51,7 @@ from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking from .meta import dlg_float_param, dlg_int_param, dlg_list_param, \ dlg_string_param, dlg_bool_param, dlg_dict_param +from .reproducibility import constants # Opt into using per-drop checksum calculation checksum_disabled = 'DLG_DISABLE_CHECKSUM' in os.environ @@ -222,6 +223,11 @@ def __init__(self, oid, uid, **kwargs): self._checksumType = None self._size = None + self._merkleRoot = None + self._committed = False + self._MerkleTree = None + self._merkleData = [] + # The DataIO instance we use in our write method. It's initialized to # None because it's lazily initialized in the write method, since data # might be written externally and not through this DROP From 97cd0e86ea7f92256cb6765d65f7abc2b0f2d63b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 May 2020 16:03:18 +0800 Subject: [PATCH 003/484] Code cleanup --- .travis.yml | 24 +- OpenAPI/tests/managers_test_client.py | 1 - OpenAPI/tests/translator_test_client.py | 3 +- daliuge-common/dlg/__init__.py | 2 +- daliuge-common/dlg/clients.py | 14 +- daliuge-common/dlg/common/__init__.py | 10 +- daliuge-common/dlg/common/network.py | 9 +- daliuge-common/dlg/common/osutils.py | 3 +- daliuge-common/dlg/common/streams.py | 4 +- daliuge-common/dlg/common/tool.py | 17 +- daliuge-common/dlg/constants.py | 9 +- daliuge-common/dlg/exceptions.py | 13 +- daliuge-common/dlg/restutils.py | 23 +- daliuge-common/dlg/version_helper.py | 4 +- daliuge-common/setup.py | 2 + daliuge-runtime/dlg/__init__.py | 2 +- daliuge-runtime/dlg/apps/__init__.py | 3 +- daliuge-runtime/dlg/apps/archiving.py | 12 +- daliuge-runtime/dlg/apps/bash_shell_app.py | 37 +- daliuge-runtime/dlg/apps/crc.py | 4 +- daliuge-runtime/dlg/apps/dockerapp.py | 54 +- daliuge-runtime/dlg/apps/dynlib.py | 2 +- daliuge-runtime/dlg/apps/fileimport.py | 12 +- daliuge-runtime/dlg/apps/mpi.py | 17 +- daliuge-runtime/dlg/apps/pyfunc.py | 9 +- daliuge-runtime/dlg/apps/scp.py | 6 +- daliuge-runtime/dlg/apps/simple.py | 3 +- daliuge-runtime/dlg/apps/socket_listener.py | 3 +- daliuge-runtime/dlg/apps/spead_receiver.py | 22 +- daliuge-runtime/dlg/dask_emulation.py | 22 +- daliuge-runtime/dlg/deploy/common.py | 12 +- .../dlg/deploy/pawsey/dfms_monitor.py | 44 +- .../dlg/deploy/pawsey/dfms_proxy.py | 32 +- .../dlg/deploy/pawsey/ipython_notebook_toc.js | 106 +- daliuge-runtime/dlg/deploy/pawsey/remotes.py | 6 +- .../dlg/deploy/pawsey/scale_test.py | 118 +- .../dlg/deploy/pawsey/slurm_utils.py | 6 +- .../dlg/deploy/pawsey/start_dfms_cluster.py | 80 +- .../dlg/deploy/utils/monitor_replayer.py | 84 +- daliuge-runtime/dlg/drop.py | 104 +- daliuge-runtime/dlg/droputils.py | 45 +- daliuge-runtime/dlg/event.py | 5 +- daliuge-runtime/dlg/graph_loader.py | 60 +- daliuge-runtime/dlg/io.py | 71 +- daliuge-runtime/dlg/lifecycle/__init__.py | 2 +- daliuge-runtime/dlg/lifecycle/dlm.py | 23 +- daliuge-runtime/dlg/lifecycle/hsm/__init__.py | 2 +- daliuge-runtime/dlg/lifecycle/hsm/manager.py | 4 +- daliuge-runtime/dlg/lifecycle/hsm/store.py | 25 +- daliuge-runtime/dlg/lifecycle/registry.py | 35 +- daliuge-runtime/dlg/manager/client.py | 3 +- daliuge-runtime/dlg/manager/cmdline.py | 55 +- .../dlg/manager/composite_manager.py | 17 +- daliuge-runtime/dlg/manager/constants.py | 3 +- daliuge-runtime/dlg/manager/drop_manager.py | 2 +- daliuge-runtime/dlg/manager/node_manager.py | 26 +- daliuge-runtime/dlg/manager/proc_daemon.py | 40 +- daliuge-runtime/dlg/manager/replay.py | 8 +- daliuge-runtime/dlg/manager/rest.py | 103 +- daliuge-runtime/dlg/manager/session.py | 26 +- daliuge-runtime/dlg/manager/web/dim.html | 211 +- daliuge-runtime/dlg/manager/web/dm.html | 127 +- daliuge-runtime/dlg/manager/web/session.html | 539 +- .../dlg/manager/web/static/css/session.css | 124 +- .../fonts/glyphicons-halflings-regular.svg | 825 +- .../dlg/manager/web/static/js/dm.js | 778 +- daliuge-runtime/dlg/ngaslite.py | 8 +- daliuge-runtime/dlg/remote.py | 19 +- .../dlg/reproducibility/__jnit__.py | 2 +- daliuge-runtime/dlg/restserver.py | 4 +- daliuge-runtime/dlg/rpc.py | 61 +- daliuge-runtime/dlg/runtime/__init__.py | 6 +- daliuge-runtime/dlg/runtime/tool_commands.py | 10 +- daliuge-runtime/dlg/shoreClient.py | 62 +- daliuge-runtime/dlg/testutils.py | 7 +- daliuge-runtime/dlg/utils.py | 57 +- daliuge-runtime/fabfile/APPspecific.py | 96 +- daliuge-runtime/fabfile/__init__.py | 7 - daliuge-runtime/setup.py | 4 +- daliuge-runtime/test/__init__.py | 4 +- daliuge-runtime/test/apps/__init__.py | 2 +- daliuge-runtime/test/apps/test_bash.py | 15 +- daliuge-runtime/test/apps/test_crc.py | 3 +- daliuge-runtime/test/apps/test_docker.py | 20 +- daliuge-runtime/test/apps/test_dynlib.py | 7 +- daliuge-runtime/test/apps/test_dynlib2.py | 7 +- daliuge-runtime/test/apps/test_fileimport.py | 23 +- daliuge-runtime/test/apps/test_pyfunc.py | 32 +- daliuge-runtime/test/apps/test_simple.py | 2 +- daliuge-runtime/test/apps/test_socket.py | 11 +- daliuge-runtime/test/apps/test_spead.py | 9 +- daliuge-runtime/test/deploy/test_common.py | 16 +- .../test/deploy/test_slurm_utils.py | 1 + daliuge-runtime/test/graphs/complex.js | 306 +- daliuge-runtime/test/integrate/__init__.py | 2 +- .../test/integrate/chiles/__init__.py | 2 +- .../test/integrate/chiles/chilesdo.py | 94 +- .../test/integrate/chiles/chilesdoapp.py | 75 +- .../test/integrate/chiles/chilesdospec.py | 108 +- .../integrate/chiles/chilesdospec_docker.py | 107 +- .../test/integrate/example_split.py | 25 +- daliuge-runtime/test/integrate/freq_split.py | 85 +- .../integrate/msconverter/ms_converter.py | 24 +- daliuge-runtime/test/lifecycle/__init__.py | 2 +- daliuge-runtime/test/lifecycle/test_dlm.py | 7 +- .../test/lifecycle/test_registry.py | 12 +- daliuge-runtime/test/manager/__init__.py | 2 +- daliuge-runtime/test/manager/test_daemon.py | 29 +- daliuge-runtime/test/manager/test_dim.py | 47 +- daliuge-runtime/test/manager/test_dm.py | 22 +- daliuge-runtime/test/manager/test_mm.py | 53 +- daliuge-runtime/test/manager/test_rest.py | 22 +- .../test/manager/test_scalability.py | 17 +- daliuge-runtime/test/manager/testutils.py | 8 +- daliuge-runtime/test/memoryUsage.py | 17 +- daliuge-runtime/test/test_JsonDrop.py | 2 +- daliuge-runtime/test/test_S3Drop.py | 3 +- daliuge-runtime/test/test_dask_emulation.py | 32 +- daliuge-runtime/test/test_drop.py | 101 +- daliuge-runtime/test/test_droputils.py | 52 +- daliuge-runtime/test/test_graph_loader.py | 25 +- daliuge-runtime/test/test_io.py | 4 +- daliuge-runtime/test/test_session.py | 48 +- daliuge-runtime/test/test_tool.py | 2 +- daliuge-runtime/test/test_utils.py | 31 +- daliuge-translator/dlg/__init__.py | 2 +- daliuge-translator/dlg/dropmake/dm_utils.py | 8 +- .../dlg/dropmake/dropmake_api.py | 20 +- .../dlg/dropmake/pg_generator.py | 191 +- daliuge-translator/dlg/dropmake/pg_manager.py | 4 +- daliuge-translator/dlg/dropmake/pg_mapper.py | 13 +- .../dlg/dropmake/plot_lpl_parts.py | 36 +- daliuge-translator/dlg/dropmake/scheduler.py | 331 +- .../dlg/dropmake/stage_scheduler.py | 7 +- .../dlg/dropmake/utils/__init__.py | 1 - .../dlg/dropmake/utils/anneal.py | 30 +- .../dlg/dropmake/utils/antichains.py | 110 +- .../dlg/dropmake/utils/bash_parameter.py | 18 +- .../dlg/dropmake/utils/heft/base.py | 21 +- .../dlg/dropmake/utils/heft/dlg_heft.py | 41 +- .../dlg/dropmake/utils/heft/test.py | 88 +- daliuge-translator/dlg/dropmake/utils/mcts.py | 22 +- .../dlg/dropmake/web/Inspector_test.css | 116 +- .../dlg/dropmake/web/Inspector_test.js | 2042 +- .../dlg/dropmake/web/__init__.py | 1 - daliuge-translator/dlg/dropmake/web/go.js | 35734 +++++++++++++++- .../dlg/dropmake/web/jquery.min.map | 1212 +- .../dlg/dropmake/web/jsoneditor.map | 3227 +- .../dlg/dropmake/web/lg_editor.html | 3589 +- daliuge-translator/dlg/dropmake/web/lg_web.py | 13 +- .../dlg/dropmake/web/matrix_vis.html | 365 +- .../dlg/dropmake/web/pg_viewer.html | 1115 +- daliuge-translator/dlg/translator/__init__.py | 2 +- .../dlg/translator/tool_commands.py | 35 +- daliuge-translator/setup.py | 2 +- daliuge-translator/test/__init__.py | 4 +- daliuge-translator/test/dropmake/__init__.py | 2 +- .../logical_graphs/chiles_simple.json | 876 +- .../dropmake/logical_graphs/cont_img.json | 1433 +- .../dropmake/logical_graphs/eagle_gather.json | 1161 +- .../logical_graphs/eagle_gather_empty.json | 887 +- .../logical_graphs/eagle_gather_simple.json | 1066 +- .../dropmake/logical_graphs/lofar_std.json | 1254 +- .../logical_graphs/test_grpby_gather.json | 493 +- .../test/dropmake/test_lg_fill.py | 9 +- .../test/dropmake/test_lgweb.py | 18 +- .../test/dropmake/test_pg_gen.py | 37 +- .../test/dropmake/test_scheduler.py | 14 +- daliuge-translator/test/test_tool.py | 7 +- docs/api/apps.rst | 1 - docs/conf.py | 123 +- docs/index.rst | 6 +- docs/intro.rst | 1 - docs/managers.rst | 1 - docs/reference.rst | 1 - 175 files changed, 52841 insertions(+), 8907 deletions(-) diff --git a/.travis.yml b/.travis.yml index a19f06201..08723dd54 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,28 +43,28 @@ matrix: # We want to use docker during the tests services: - - docker + - docker # Try to speed up builds by caching our dependencies cache: pip before_install: - - pip install -U coveralls pytest pytest-cov - - pip install -U setuptools pip wheel + - pip install -U coveralls pytest pytest-cov + - pip install -U setuptools pip wheel install: - - pip install -e daliuge-common/ - - test -n "$NO_DLG_TRANSLATOR" || pip install -e daliuge-translator/ - - test -n "$NO_DLG_RUNTIME" || pip install -e daliuge-runtime/ + - pip install -e daliuge-common/ + - test -n "$NO_DLG_TRANSLATOR" || pip install -e daliuge-translator/ + - test -n "$NO_DLG_RUNTIME" || pip install -e daliuge-runtime/ # run the tests, making sure subprocesses generate coverage information script: - - COVFILES= - - test -n "$NO_DLG_TRANSLATOR" || { (cd daliuge-translator && py.test --cov) && COVFILES+=" daliuge-translator/.coverage"; } - - test -n "$NO_DLG_RUNTIME" || { (cd daliuge-runtime && py.test --cov) && COVFILES+=" daliuge-runtime/.coverage"; } - - coverage combine $COVFILES - - test -z "$TEST_OPENAPI" || (cd OpenAPI/tests && ./test_managers_openapi.sh) + - COVFILES= + - test -n "$NO_DLG_TRANSLATOR" || { (cd daliuge-translator && py.test --cov) && COVFILES+=" daliuge-translator/.coverage"; } + - test -n "$NO_DLG_RUNTIME" || { (cd daliuge-runtime && py.test --cov) && COVFILES+=" daliuge-runtime/.coverage"; } + - coverage combine $COVFILES + - test -z "$TEST_OPENAPI" || (cd OpenAPI/tests && ./test_managers_openapi.sh) # Publish to coveralls (only once per commit, so only using one environment) after_success: - - coveralls + - coveralls diff --git a/OpenAPI/tests/managers_test_client.py b/OpenAPI/tests/managers_test_client.py index cb026f139..8d0b6b298 100644 --- a/OpenAPI/tests/managers_test_client.py +++ b/OpenAPI/tests/managers_test_client.py @@ -1,7 +1,6 @@ import composite_manager_client as cmc import node_manager_client as nmc - nm_config = nmc.Configuration() nm_config.host = "127.0.0.1:8000" dim_config = cmc.Configuration() diff --git a/OpenAPI/tests/translator_test_client.py b/OpenAPI/tests/translator_test_client.py index 2e9be115b..9405dba1e 100644 --- a/OpenAPI/tests/translator_test_client.py +++ b/OpenAPI/tests/translator_test_client.py @@ -2,7 +2,6 @@ import translator_client as tc - translator_config = tc.Configuration() translator_config.host = "127.0.0.1:8084" @@ -12,7 +11,7 @@ with tc.ApiClient(translator_config) as translator_client: translator = tc.DefaultApi(translator_client) html_content = translator.gen_pgt(json_data=graph, - lg_name='test', algo='metis', num_islands=1) + lg_name='test', algo='metis', num_islands=1) print(html_content) html_content = translator.gen_pg( pgt_id='test', dlg_mgr_host='127.0.0.1', dlg_mgr_port=8001) diff --git a/daliuge-common/dlg/__init__.py b/daliuge-common/dlg/__init__.py index cfb3574be..74d07706f 100644 --- a/daliuge-common/dlg/__init__.py +++ b/daliuge-common/dlg/__init__.py @@ -21,4 +21,4 @@ # # Declaring this as a namespace package -__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment \ No newline at end of file +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment diff --git a/daliuge-common/dlg/clients.py b/daliuge-common/dlg/clients.py index 81690ba64..5d99de6b8 100644 --- a/daliuge-common/dlg/clients.py +++ b/daliuge-common/dlg/clients.py @@ -27,10 +27,10 @@ from . import constants from .restutils import RestClient - logger = logging.getLogger(__name__) compress = os.environ.get('DALIUGE_COMPRESSED_JSON', True) + class BaseDROPManagerClient(RestClient): """ Base class for REST clients that talk to the DROP managers. @@ -97,7 +97,8 @@ def graph(self, sessionId): the DROP specifications. """ graph = self._get_json('/sessions/%s/graph' % (urllib.quote(sessionId),)) - logger.debug('Successfully read graph (%d nodes) from session %s on %s:%s', len(graph), sessionId, self.host, self.port) + logger.debug('Successfully read graph (%d nodes) from session %s on %s:%s', len(graph), sessionId, self.host, + self.port) return graph def sessions(self): @@ -142,10 +143,12 @@ def graph_size(self, sessionId): getGraphSize = graph_size getGraph = graph + class NodeManagerClient(BaseDROPManagerClient): """ A NodeManager REST client """ + def __init__(self, host='localhost', port=constants.NODE_DEFAULT_REST_PORT, timeout=10): super(NodeManagerClient, self).__init__(host=host, port=port, timeout=timeout) @@ -158,6 +161,7 @@ def trigger_drops(self, sessionId, drop_uids): def shutdown_node_manager(self): self._GET('/shutdown') + class CompositeManagerClient(BaseDROPManagerClient): def nodes(self): @@ -169,19 +173,23 @@ def add_node(self, node): def remove_node(self, node): self._DELETE('/nodes/%s' % (node,)) + class DataIslandManagerClient(CompositeManagerClient): """ A DataIslandManager REST client """ + def __init__(self, host='localhost', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=10): super(DataIslandManagerClient, self).__init__(host=host, port=port, timeout=timeout) + class MasterManagerClient(CompositeManagerClient): """ A MasterManager REST client """ + def __init__(self, host='localhost', port=constants.MASTER_DEFAULT_REST_PORT, timeout=10): super(MasterManagerClient, self).__init__(host=host, port=port, timeout=timeout) def create_island(self, island_host, nodes): - self._post_json('/managers/%s/dataisland' % (urllib.quote(island_host)), {'nodes': nodes}) \ No newline at end of file + self._post_json('/managers/%s/dataisland' % (urllib.quote(island_host)), {'nodes': nodes}) diff --git a/daliuge-common/dlg/common/__init__.py b/daliuge-common/dlg/common/__init__.py index a161fc6bd..1b56134a7 100644 --- a/daliuge-common/dlg/common/__init__.py +++ b/daliuge-common/dlg/common/__init__.py @@ -22,8 +22,8 @@ """Common utilities used by daliuge packages""" import sys -from .osutils import terminate_or_kill, wait_or_kill from .network import check_port, connect_to, portIsClosed, portIsOpen, write_to +from .osutils import terminate_or_kill, wait_or_kill from .streams import ZlibCompressedStream, JSONStream STORAGE_TYPES = {'memory', 'file', 'ngas', 'null', 'json'} @@ -59,6 +59,7 @@ class dropdict(dict): repositories where graph templates are expected to be found by the DROPManager. """ + def _addSomething(self, other, key): if key not in self: self[key] = [] @@ -67,14 +68,19 @@ def _addSomething(self, other, key): def addConsumer(self, other): self._addSomething(other, 'consumers') + def addStreamingConsumer(self, other): self._addSomething(other, 'streamingConsumers') + def addInput(self, other): self._addSomething(other, 'inputs') + def addStreamingInput(self, other): self._addSomething(other, 'streamingInputs') + def addOutput(self, other): self._addSomething(other, 'outputs') + def addProducer(self, other): self._addSomething(other, 'producers') @@ -138,4 +144,4 @@ def get_leaves(pg_spec): if dropspec.get('consumers', None) or dropspec.get('streamingConsumers', None): nonleaves.add(oid) - return all_oids - nonleaves \ No newline at end of file + return all_oids - nonleaves diff --git a/daliuge-common/dlg/common/network.py b/daliuge-common/dlg/common/network.py index 4a9e151db..665efab4d 100644 --- a/daliuge-common/dlg/common/network.py +++ b/daliuge-common/dlg/common/network.py @@ -19,15 +19,15 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import contextlib import errno import logging import socket import time -import contextlib - logger = logging.getLogger(__name__) + def check_port(host, port, timeout=0, checking_open=True, return_socket=False): """ Checks that the port specified by ``host``:``port`` is either open or @@ -127,12 +127,14 @@ def portIsClosed(host, port, timeout): """ return check_port(host, port, timeout=timeout, checking_open=False) + def portIsOpen(host, port, timeout=0): """ Checks if a given ``host``/``port`` is open, with a given ``timeout``. """ return check_port(host, port, timeout=timeout, checking_open=True) + def connect_to(host, port, timeout=None): """ Connects to ``host``:``port`` within the given timeout and return the @@ -144,6 +146,7 @@ def connect_to(host, port, timeout=None): raise socket.timeout() return s + def write_to(host, port, data, timeout=None): """ Connects to ``host``:``port`` within the given timeout and write the given @@ -151,4 +154,4 @@ def write_to(host, port, data, timeout=None): """ sock = connect_to(host, port, timeout=timeout) with contextlib.closing(sock): - sock.send(data) \ No newline at end of file + sock.send(data) diff --git a/daliuge-common/dlg/common/osutils.py b/daliuge-common/dlg/common/osutils.py index 9464a5512..8e073e15b 100644 --- a/daliuge-common/dlg/common/osutils.py +++ b/daliuge-common/dlg/common/osutils.py @@ -24,9 +24,9 @@ import math import time - logger = logging.getLogger(__name__) + def terminate_or_kill(proc, timeout): """ Terminates a process and waits until it has completed its execution within @@ -41,6 +41,7 @@ def terminate_or_kill(proc, timeout): proc.terminate() wait_or_kill(proc, timeout) + def wait_or_kill(proc, timeout, period=0.1): waitLoops = 0 max_loops = math.ceil(timeout / period) diff --git a/daliuge-common/dlg/common/streams.py b/daliuge-common/dlg/common/streams.py index f9a3e492e..fc26bd8a2 100644 --- a/daliuge-common/dlg/common/streams.py +++ b/daliuge-common/dlg/common/streams.py @@ -160,12 +160,12 @@ def read(self, n=-1): if self.isiter: try: - i,obj = next(self.objects) + i, obj = next(self.objects) json_out = b'[' if i == 0 else b',' json_out += json.dumps(obj).encode('latin1') except StopIteration: json_out = b']' - self.isiter = False # not nice, but prevents more reads + self.isiter = False # not nice, but prevents more reads else: json_out = json.dumps(self.objects).encode('latin1') diff --git a/daliuge-common/dlg/common/tool.py b/daliuge-common/dlg/common/tool.py index c88bb1659..1c7372b1c 100644 --- a/daliuge-common/dlg/common/tool.py +++ b/daliuge-common/dlg/common/tool.py @@ -30,7 +30,6 @@ import pkg_resources - logger = logging.getLogger(__name__) @@ -42,7 +41,6 @@ def add_logging_options(parser): def setup_logging(opts): - levels = [ logging.NOTSET, logging.DEBUG, @@ -63,7 +61,8 @@ def setup_logging(opts): # Let's configure logging now # We use stderr for loggin because stdout is the default output file # for several operations - fmt = logging.Formatter("%(asctime)-15s [%(levelname)5.5s] [%(threadName)15.15s] %(name)s#%(funcName)s:%(lineno)s %(message)s") + fmt = logging.Formatter( + "%(asctime)-15s [%(levelname)5.5s] [%(threadName)15.15s] %(name)s#%(funcName)s:%(lineno)s %(message)s") fmt.converter = time.gmtime streamHdlr = logging.StreamHandler(sys.stderr) streamHdlr.setFormatter(fmt) @@ -72,8 +71,9 @@ def setup_logging(opts): commands = {} -def cmdwrap(cmdname, desc, f): + +def cmdwrap(cmdname, desc, f): # If it's not a callable we assume it's a string # in which case we lazy-load the module:function when it gets called if not callable(f): @@ -84,11 +84,13 @@ def __call__(self, *args, **kwargs): modname, fname = orig_f.split(':') module = importlib.import_module(modname) return getattr(module, fname)(*args, **kwargs) + f = Importer() def wrapped(*args, **kwargs): parser = optparse.OptionParser(description=desc) f(parser, *args, **kwargs) + commands[cmdname] = (desc, wrapped) @@ -97,22 +99,25 @@ def version(parser, args): print("Version: %s" % version) print("Git version: %s" % git_version) + cmdwrap('version', 'Reports the DALiuGE version and exits', version) + def _load_commands(): for entry_point in pkg_resources.iter_entry_points('dlg.tool_commands'): entry_point.load().register_commands() + def print_usage(prgname): print('Usage: %s [command] [options]' % (prgname)) print('') - print('\n'.join(['Commands are:'] + ['\t%-25.25s%s' % (cmdname,desc_and_f[0]) for cmdname,desc_and_f in sorted(commands.items())])) + print('\n'.join(['Commands are:'] + ['\t%-25.25s%s' % (cmdname, desc_and_f[0]) for cmdname, desc_and_f in + sorted(commands.items())])) print('') print('Try %s [command] --help for more details' % (prgname)) def run(args=sys.argv): - _load_commands() # Manually parse the first argument, which will be diff --git a/daliuge-common/dlg/constants.py b/daliuge-common/dlg/constants.py index 511548506..eac9bafa0 100644 --- a/daliuge-common/dlg/constants.py +++ b/daliuge-common/dlg/constants.py @@ -21,16 +21,16 @@ # # Constants used throughout the manager package -DEFAULT_PORTS = {'NODE_DEFAULT_REST_PORT': 8000, +DEFAULT_PORTS = {'NODE_DEFAULT_REST_PORT': 8000, 'ISLAND_DEFAULT_REST_PORT': 8001, 'MASTER_DEFAULT_REST_PORT': 8002, 'REPLAY_DEFAULT_REST_PORT': 8500, 'DAEMON_DEFAULT_REST_PORT': 9000, 'NODE_DEFAULT_EVENTS_PORT': 5555, - 'NODE_DEFAULT_RPC_PORT': 6666} + 'NODE_DEFAULT_RPC_PORT': 6666} # just for backwards compatibility -NODE_DEFAULT_REST_PORT = DEFAULT_PORTS['NODE_DEFAULT_REST_PORT'] +NODE_DEFAULT_REST_PORT = DEFAULT_PORTS['NODE_DEFAULT_REST_PORT'] ISLAND_DEFAULT_REST_PORT = DEFAULT_PORTS['ISLAND_DEFAULT_REST_PORT'] MASTER_DEFAULT_REST_PORT = DEFAULT_PORTS['MASTER_DEFAULT_REST_PORT'] @@ -38,7 +38,6 @@ DAEMON_DEFAULT_REST_PORT = DEFAULT_PORTS['DAEMON_DEFAULT_REST_PORT'] - # Others ports used by the Node Managers NODE_DEFAULT_EVENTS_PORT = DEFAULT_PORTS['NODE_DEFAULT_EVENTS_PORT'] -NODE_DEFAULT_RPC_PORT = DEFAULT_PORTS['NODE_DEFAULT_RPC_PORT'] +NODE_DEFAULT_RPC_PORT = DEFAULT_PORTS['NODE_DEFAULT_RPC_PORT'] diff --git a/daliuge-common/dlg/exceptions.py b/daliuge-common/dlg/exceptions.py index c4e07e643..23f57961f 100644 --- a/daliuge-common/dlg/exceptions.py +++ b/daliuge-common/dlg/exceptions.py @@ -24,15 +24,18 @@ In particular DaliugeException should be the root of all our exceptions. """ + class DaliugeException(Exception): """ The parent of all exceptions thrown by Daliuge """ + class InvalidDropException(DaliugeException): """ An exception thrown when a Drop is created with a set of invalid arguments. """ + def __init__(self, drop, reason): DaliugeException.__init__(self, drop, reason) if isinstance(drop, (list, tuple)): @@ -46,11 +49,13 @@ def __init__(self, drop, reason): def __str__(self, *args, **kwargs): return self.msg + class InvalidRelationshipException(DaliugeException): """ An exception thrown when a relationship between two Drops has been instructed but is invalid in nature. """ + def __init__(self, rel, reason): DaliugeException.__init__(self, rel, reason) self.rel = rel @@ -60,12 +65,14 @@ def __init__(self, rel, reason): def __str__(self, *args, **kwargs): return self.msg + class InvalidGraphException(DaliugeException): """ An exception thrown when an invalid graph, or part of a graph, is given to Daliuge. """ + class NoDropException(DaliugeException): """ An exception thrown when a Drop UID is pointing to a non-existing Drop @@ -82,6 +89,7 @@ def __str__(self): ret += ". Reason: %s" % (self._reason) return ret + class NoSessionException(DaliugeException): """ An exception thrown when a session ID is pointing to a non-existing session @@ -98,6 +106,7 @@ def __str__(self): ret += ". Reason: %s" % (self._reason) return ret + class SessionAlreadyExistsException(DaliugeException): """ An exception thrown when a session ID is pointing to an existing session @@ -115,14 +124,16 @@ def __str__(self): ret += ". Reason: %s" % (self._reason) return ret + class InvalidSessionState(DaliugeException): """ An exception thrown when an operation is requested on a session that is not in the expected state for that operation. """ + class SubManagerException(DaliugeException): """ An exception thrown by composite drop managers when there was an error invoking one of their underlying drop managers. - """ \ No newline at end of file + """ diff --git a/daliuge-common/dlg/restutils.py b/daliuge-common/dlg/restutils.py index cd82bcbb7..bf31fe3b4 100644 --- a/daliuge-common/dlg/restutils.py +++ b/daliuge-common/dlg/restutils.py @@ -33,7 +33,6 @@ from . import exceptions from .exceptions import DaliugeException, SubManagerException - logger = logging.getLogger(__name__) @@ -41,18 +40,20 @@ class ThreadingWSGIServer(SocketServer.ThreadingMixIn, wsgiref.simple_server.WSG daemon_threads = True allow_reuse_address = True + class LoggingWSGIRequestHandler(wsgiref.simple_server.WSGIRequestHandler): def log_message(self, fmt, *args): logger.debug(fmt, *args) + class RestServerWSGIServer: - def __init__(self, wsgi_app, listen = '127.0.0.1', port = 8080): + def __init__(self, wsgi_app, listen='127.0.0.1', port=8080): self.wsgi_app = wsgi_app self.listen = listen self.port = port self.server = wsgiref.simple_server.make_server(self.listen, - self.port, self.wsgi_app, server_class=ThreadingWSGIServer, - handler_class=LoggingWSGIRequestHandler) + self.port, self.wsgi_app, server_class=ThreadingWSGIServer, + handler_class=LoggingWSGIRequestHandler) def serve_forever(self): self.server.serve_forever() @@ -61,11 +62,13 @@ def server_close(self): self.server.shutdown() self.server.server_close() + class RestClientException(DaliugeException): """ Exception thrown by the RestClient """ + def hexdigits(n): digits = 0 while n: @@ -73,16 +76,20 @@ def hexdigits(n): n //= 16 return digits + def chunk(data): return ("%x" % len(data)).encode('ascii') + b'\r\n' + data + b'\r\n' + class chunked(object): """ A reader that returns chunked HTTP content """ + def __init__(self, content): self.content = content self.finished = False + def read(self, n): if self.finished: return b'' @@ -93,6 +100,7 @@ def read(self, n): return b"0\r\n\r\n" return chunk(data) + class RestClient(object): """ The base class for our REST clients @@ -112,14 +120,15 @@ def _close(self): self._conn.close() __del__ = _close + def __enter__(self): return self + def __exit__(self, typ, value, traceback): self._close() if typ: raise value - def _get_json(self, url): ret = self._GET(url) return json.load(ret) if ret else None @@ -183,7 +192,7 @@ def _request(self, url, method, content=None, headers={}): eargs = error['args'] if etype == SubManagerException: - for host,args in eargs.items(): + for host, args in eargs.items(): subetype = getattr(exceptions, args['type']) subargs = args['args'] eargs[host] = subetype(*subargs) @@ -199,4 +208,4 @@ def _request(self, url, method, content=None, headers={}): if not self._resp.length: return None - return codecs.getreader('utf-8')(self._resp) \ No newline at end of file + return codecs.getreader('utf-8')(self._resp) diff --git a/daliuge-common/dlg/version_helper.py b/daliuge-common/dlg/version_helper.py index 1ea42a457..82eb34dd3 100644 --- a/daliuge-common/dlg/version_helper.py +++ b/daliuge-common/dlg/version_helper.py @@ -22,6 +22,7 @@ import os import subprocess + def get_git_version(): out = subprocess.check_output(["git", "rev-parse", "HEAD"]) return out.strip().decode("ascii") @@ -40,6 +41,7 @@ def get_version_info(version, is_release): def version_as_string(version_tuple): return "%d.%d.%d" % version_tuple + def write_version_info(version_tuple, version_file, is_release): tpl = """ # THIS FILE IS GENERATED BY version_helper.py @@ -62,4 +64,4 @@ def write_version_info(version_tuple, version_file, is_release): "is_release": is_release, } f.write(info.strip()) - return full_version \ No newline at end of file + return full_version diff --git a/daliuge-common/setup.py b/daliuge-common/setup.py index 7d0bb6e2a..e4a71a149 100644 --- a/daliuge-common/setup.py +++ b/daliuge-common/setup.py @@ -37,6 +37,7 @@ VERSION_FILE = "dlg/common/version.py" RELEASE = True + def do_versioning(): # Avoid importing, the package doesn't exist as such yet with open(os.path.join('dlg', 'version_helper.py')) as f: @@ -45,6 +46,7 @@ def do_versioning(): exec(code, _globals) return _globals['write_version_info'](VERSION, VERSION_FILE, RELEASE) + install_requires = [ # 1.10 contains an important race-condition fix on lazy-loaded modules "six>=1.10", diff --git a/daliuge-runtime/dlg/__init__.py b/daliuge-runtime/dlg/__init__.py index cfb3574be..74d07706f 100644 --- a/daliuge-runtime/dlg/__init__.py +++ b/daliuge-runtime/dlg/__init__.py @@ -21,4 +21,4 @@ # # Declaring this as a namespace package -__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment \ No newline at end of file +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment diff --git a/daliuge-runtime/dlg/apps/__init__.py b/daliuge-runtime/dlg/apps/__init__.py index 469348ad8..2c065c3bf 100644 --- a/daliuge-runtime/dlg/apps/__init__.py +++ b/daliuge-runtime/dlg/apps/__init__.py @@ -25,7 +25,8 @@ are based on the :class:`BarrierAppDROP`. """ + def get_include_dir(): """The path that C/C++ applications need to add to use the dlg.h header""" import os - return os.path.dirname(__file__) \ No newline at end of file + return os.path.dirname(__file__) diff --git a/daliuge-runtime/dlg/apps/archiving.py b/daliuge-runtime/dlg/apps/archiving.py index c95a77964..6f1e67bb2 100644 --- a/daliuge-runtime/dlg/apps/archiving.py +++ b/daliuge-runtime/dlg/apps/archiving.py @@ -36,7 +36,8 @@ class ExternalStoreApp(BarrierAppDROP): shouldn't contain any output, making it a leaf node of the physical graph where it resides. """ - compontent_meta = dlg_component('ExternalStoreApp', 'An application that takes its input DROP (which must be one, and only one) ' + compontent_meta = dlg_component('ExternalStoreApp', + 'An application that takes its input DROP (which must be one, and only one) ' 'and creates a copy of it in a completely external store, from the point ' 'of view of the DALiuGE framework.', [dlg_batch_input('binary/*', [])], @@ -61,6 +62,7 @@ def store(self, inputDrop): `inputDrop` into an external store. """ + class NgasArchivingApp(ExternalStoreApp): ''' An ExternalStoreApp class that takes its input DROP and archives it in @@ -70,7 +72,8 @@ class NgasArchivingApp(ExternalStoreApp): new NGAS client process. This way we can read the different storage types supported by the framework, and not only filesystem objects. ''' - compontent_meta = dlg_component('NgasArchivingApp', 'An ExternalStoreApp class that takes its input DROP and archives it in ' + compontent_meta = dlg_component('NgasArchivingApp', + 'An ExternalStoreApp class that takes its input DROP and archives it in ' 'an NGAS server. It currently deals with non-container DROPs only.', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], @@ -92,7 +95,8 @@ def store(self, inDrop): try: ngasIO = NgasIO(self.ngasSrv, inDrop.uid, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, size) except ImportError: - ngasIO = NgasLiteIO(self.ngasSrv, inDrop.uid, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, size) + ngasIO = NgasLiteIO(self.ngasSrv, inDrop.uid, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, + size) ngasIO.open(OpenMode.OPEN_WRITE) @@ -103,4 +107,4 @@ def store(self, inDrop): ngasIO.write(buff) if len(buff) != 4096: break - ngasIO.close() \ No newline at end of file + ngasIO.close() diff --git a/daliuge-runtime/dlg/apps/bash_shell_app.py b/daliuge-runtime/dlg/apps/bash_shell_app.py index 8017e53e3..6f895ef05 100644 --- a/daliuge-runtime/dlg/apps/bash_shell_app.py +++ b/daliuge-runtime/dlg/apps/bash_shell_app.py @@ -38,6 +38,7 @@ import threading import time import types + import six from .. import droputils, utils @@ -47,9 +48,9 @@ from ..meta import dlg_string_param, dlg_component, dlg_batch_input, \ dlg_batch_output, dlg_streaming_input - logger = logging.getLogger(__name__) + def mesage_stdouts(prefix, stdout, stderr, enc='utf8'): msg = prefix if not stdout and not stderr: @@ -61,6 +62,7 @@ def mesage_stdouts(prefix, stdout, stderr, enc='utf8'): msg += "\n==STDERR==\n" + utils.b2s(stderr, enc) return msg + def close_and_remove(fo, fname): fo.close() try: @@ -69,6 +71,7 @@ def close_and_remove(fo, fname): except OSError: logger.exception("Error while removing %s", fname) + def prepare_output_channel(this_node, out_drop): """ Prepares an output channel that will serve as the stdout of a bash command. @@ -109,6 +112,7 @@ def prepare_output_channel(this_node, out_drop): logger.debug("Received connection from %r", csockaddr) return csock + def prepare_input_channel(data): """ Prepares an input channel that will serve as the stdin of a bash command. @@ -124,7 +128,7 @@ def prepare_input_channel(data): # Return an object that runs pipe.read on read() # and close_and_remove on close() - chan = lambda: None # a simple object where attributes can be set! + chan = lambda: None # a simple object where attributes can be set! chan.read = pipe.read chan.fileno = pipe.fileno chan.close = types.MethodType(lambda s: close_and_remove(pipe, pipe_name), chan) @@ -158,7 +162,7 @@ def initialize(self, **kwargs): raise InvalidDropException(self, 'No command specified, cannot create BashShellApp') def _run_bash(self, inputs, outputs, stdin=None, - stdout=subprocess.PIPE): + stdout=subprocess.PIPE): """ Runs the given `cmd`. If any `inputs` and/or `outputs` are given (dictionaries of uid:drop elements) they are used to replace any placeholder @@ -178,12 +182,12 @@ def _run_bash(self, inputs, outputs, stdin=None, # self.run_bash(self._command, self.uid, session_id, *args, **kwargs) # Replace inputs/outputs in command line with paths or data URLs - fsInputs = {uid: i for uid,i in inputs.items() if droputils.has_path(i)} - fsOutputs = {uid: o for uid,o in outputs.items() if droputils.has_path(o)} + fsInputs = {uid: i for uid, i in inputs.items() if droputils.has_path(i)} + fsOutputs = {uid: o for uid, o in outputs.items() if droputils.has_path(o)} cmd = droputils.replace_path_placeholders(cmd, fsInputs, fsOutputs) - dataURLInputs = {uid: i for uid,i in inputs.items() if not droputils.has_path(i)} - dataURLOutputs = {uid: o for uid,o in outputs.items() if not droputils.has_path(o)} + dataURLInputs = {uid: i for uid, i in inputs.items() if not droputils.has_path(i)} + dataURLOutputs = {uid: o for uid, o in outputs.items() if not droputils.has_path(o)} cmd = droputils.replace_dataurl_placeholders(cmd, dataURLInputs, dataURLOutputs) # Pass down daliuge-specific information to the subprocesses as environment variables @@ -215,7 +219,7 @@ def _run_bash(self, inputs, outputs, stdin=None, pcode = process.returncode end = time.time() - logger.info("Finished in %.3f [s] with exit code %d", (end-start), pcode) + logger.info("Finished in %.3f [s] with exit code %d", (end - start), pcode) if pcode == 0 and logger.isEnabledFor(logging.DEBUG): logger.debug(mesage_stdouts("Command finished successfully", pstdout, pstderr)) @@ -234,6 +238,7 @@ def cancel(self): except: logger.exception("Error while terminating process %r", self.proc) + class StreamingInputBashAppBase(BashShellBase, AppDROP): """ Base class for bash command applications that consume a stream of incoming @@ -275,6 +280,7 @@ def execute(self, data): self._this_finished = True self.notify_if_finished() + # # Now the actual 4 classes: # * batch @@ -296,21 +302,24 @@ class BashShellApp(BashShellBase, BarrierAppDROP): def run(self): self._run_bash(self._inputs, self._outputs) + class StreamingOutputBashApp(BashShellBase, BarrierAppDROP): """ Like BashShellApp, but its stdout is a stream of data that is fed into the next application. """ compontent_meta = dlg_component('StreamingOutputBashApp', 'Like BashShellApp, but its stdout is a stream ' - 'of data that is fed into the next application.', + 'of data that is fed into the next application.', [dlg_batch_input('text/*', [])], [dlg_batch_output('text/*', [])], [dlg_streaming_input('text/*')]) + def run(self): with contextlib.closing(prepare_output_channel(self.node, self.outputs[0])) as outchan: self._run_bash(self._inputs, {}, stdout=outchan) logger.debug("Closed output channel") + class StreamingInputBashApp(StreamingInputBashAppBase): """ An app that runs a bash command that consumes data from stdin. @@ -320,7 +329,8 @@ class StreamingInputBashApp(StreamingInputBashAppBase): to establish the streaming channel. This information is also used to kick this application off. """ - compontent_meta = dlg_component('StreamingInputBashApp', 'An app that runs a bash command that consumes data from stdin.', + compontent_meta = dlg_component('StreamingInputBashApp', + 'An app that runs a bash command that consumes data from stdin.', [dlg_batch_input('text/*', [])], [dlg_batch_output('text/*', [])], [dlg_streaming_input('text/*')]) @@ -330,19 +340,22 @@ def run(self, data): self._run_bash({}, self._outputs, stdin=inchan) logger.debug("Closed input channel") + class StreamingInputOutputBashApp(StreamingInputBashAppBase): """ Like StreamingInputBashApp, but its stdout is also a stream of data that is fed into the next application. """ - compontent_meta = dlg_component('StreamingInputOutputBashApp', 'Like StreamingInputBashApp, but its stdout is also a ' + compontent_meta = dlg_component('StreamingInputOutputBashApp', + 'Like StreamingInputBashApp, but its stdout is also a ' 'stream of data that is fed into the next application.', [dlg_batch_input('text/*', [])], [dlg_batch_output('text/*', [])], [dlg_streaming_input('text/*')]) + def run(self, data): with contextlib.closing(prepare_input_channel(data)) as inchan: with contextlib.closing(prepare_output_channel(self.node, self.outputs[0])) as outchan: self._run_bash({}, {}, stdout=outchan, stdin=inchan) logger.debug("Closed output channel") - logger.debug("Closed input channel") \ No newline at end of file + logger.debug("Closed input channel") diff --git a/daliuge-runtime/dlg/apps/crc.py b/daliuge-runtime/dlg/apps/crc.py index 98a017b78..586d95199 100644 --- a/daliuge-runtime/dlg/apps/crc.py +++ b/daliuge-runtime/dlg/apps/crc.py @@ -24,9 +24,9 @@ """ import six +from dlg.ddap_protocol import AppDROPStates from ..drop import BarrierAppDROP, AppDROP -from dlg.ddap_protocol import AppDROPStates from ..meta import dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input try: @@ -43,7 +43,7 @@ class CRCApp(BarrierAppDROP): not something really intended to be used in a production system ''' compontent_meta = dlg_component('CRCApp', 'A BarrierAppDROP that calculates the ' - 'CRC of the single DROP it consumes', + 'CRC of the single DROP it consumes', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) diff --git a/daliuge-runtime/dlg/apps/dockerapp.py b/daliuge-runtime/dlg/apps/dockerapp.py index 6f1a5f86a..b9530cb54 100644 --- a/daliuge-runtime/dlg/apps/dockerapp.py +++ b/daliuge-runtime/dlg/apps/dockerapp.py @@ -29,14 +29,13 @@ import threading import time -from configobj import ConfigObj import docker +from configobj import ConfigObj from .. import utils, droputils from ..drop import BarrierAppDROP from ..exceptions import InvalidDropException - logger = logging.getLogger(__name__) DLG_ROOT = '/dlg_root' @@ -64,6 +63,7 @@ def waitForIp(self, timeout=None): self._evt.wait(timeout) return self._uid, self._containerIp + class DockerApp(BarrierAppDROP): """ A BarrierAppDROP that represents a process running in a container @@ -225,7 +225,8 @@ def initialize(self, **kwargs): else: host_path, container_path = binding.split(':') if not os.path.exists(host_path): - raise InvalidDropException(self, "'Path %s doesn't exist, cannot use as additional volume binding" % (host_path,)) + raise InvalidDropException(self, "'Path %s doesn't exist, cannot use as additional volume binding" % ( + host_path,)) self._additionalBindings[host_path] = container_path logger.info("%r with image '%s' and command '%s' created", self, self._image, self._command) @@ -239,7 +240,7 @@ def initialize(self, **kwargs): start = time.time() c.images.pull(self._image) end = time.time() - logger.debug("Took %.2f [s] to pull image '%s'", (end-start), self._image) + logger.debug("Took %.2f [s] to pull image '%s'", (end - start), self._image) else: logger.debug("Image '%s' found, no need to pull it", self._image) c.api.close() @@ -279,12 +280,12 @@ def run(self): iitems = self._inputs.items() oitems = self._outputs.items() - fsInputs = {uid: i for uid,i in iitems if droputils.has_path(i)} - fsOutputs = {uid: o for uid,o in oitems if droputils.has_path(o)} - dockerInputs = {uid: DockerPath(DLG_ROOT + i.path) for uid,i in fsInputs.items()} - dockerOutputs = {uid: DockerPath(DLG_ROOT + o.path) for uid,o in fsOutputs.items()} - dataURLInputs = {uid: i for uid,i in iitems if not droputils.has_path(i)} - dataURLOutputs = {uid: o for uid,o in oitems if not droputils.has_path(o)} + fsInputs = {uid: i for uid, i in iitems if droputils.has_path(i)} + fsOutputs = {uid: o for uid, o in oitems if droputils.has_path(o)} + dockerInputs = {uid: DockerPath(DLG_ROOT + i.path) for uid, i in fsInputs.items()} + dockerOutputs = {uid: DockerPath(DLG_ROOT + o.path) for uid, o in fsOutputs.items()} + dataURLInputs = {uid: i for uid, i in iitems if not droputils.has_path(i)} + dataURLOutputs = {uid: o for uid, o in oitems if not droputils.has_path(o)} cmd = droputils.replace_path_placeholders(self._command, dockerInputs, dockerOutputs) cmd = droputils.replace_dataurl_placeholders(cmd, dataURLInputs, dataURLOutputs) @@ -293,9 +294,10 @@ def run(self): # directory, maintaining the rest of their original paths. # Outputs are bound only up to their dirname (see class doc for details) # Volume bindings are setup for FileDROPs and DirectoryContainers only - binds = [ i.path + ":" + dockerInputs[uid].path for uid,i in fsInputs.items()] - binds += [os.path.dirname(o.path) + ":" + os.path.dirname(dockerOutputs[uid].path) for uid,o in fsOutputs.items()] - binds += [host_path + ":" + container_path for host_path, container_path in self._additionalBindings.items()] + binds = [i.path + ":" + dockerInputs[uid].path for uid, i in fsInputs.items()] + binds += [os.path.dirname(o.path) + ":" + os.path.dirname(dockerOutputs[uid].path) for uid, o in + fsOutputs.items()] + binds += [host_path + ":" + container_path for host_path, container_path in self._additionalBindings.items()] logger.debug("Volume bindings: %r", binds) # Wait until the DockerApps this application runtime depends on have @@ -309,9 +311,9 @@ def run(self): # useful to make sure that the USER environment variable is set in those # cases (e.g., casapy requires this to correctly operate) user = self._user - env = {} + env = {} if user is not None: - env = {'USER':user} + env = {'USER': user} if self._ensureUserAndSwitch is True: # Append commands that will make sure a user is present with the @@ -322,7 +324,10 @@ def run(self): createUserAndGo = "id -u {0} &> /dev/null || adduser --uid {0} r; ".format(uid) for dirname in set([os.path.dirname(x.path) for x in dockerOutputs.values()]): createUserAndGo += 'chown -R {0}.{0} "{1}"; '.format(uid, dirname) - createUserAndGo += "cd; su -l $(getent passwd {0} | cut -f1 -d:) -c /bin/bash -c '{1}'".format(uid, utils.escapeQuotes(cmd, doubleQuotes=False)) + createUserAndGo += "cd; su -l $(getent passwd {0} | cut -f1 -d:) -c /bin/bash -c '{1}'".format(uid, + utils.escapeQuotes( + cmd, + doubleQuotes=False)) cmd = createUserAndGo @@ -341,11 +346,11 @@ def rm(container): # Create container container = c.containers.create( - self._image, - cmd, - volumes=binds, - user=user, - environment=env, + self._image, + cmd, + volumes=binds, + user=user, + environment=env, ) self._containerId = cId = container.id logger.info("Created container %s for %r", cId, self) @@ -372,12 +377,13 @@ def rm(container): self._exitCode = x end = time.time() - logger.info("Container %s finished in %.2f [s] with exit code %d", cId, (end-start), self._exitCode) + logger.info("Container %s finished in %.2f [s] with exit code %d", cId, (end - start), self._exitCode) if self._exitCode == 0 and logger.isEnabledFor(logging.DEBUG): stdout = container.logs(stream=False, stdout=True, stderr=False) stderr = container.logs(stream=False, stdout=False, stderr=True) - logger.debug("Container %s finished successfully, output follows.\n==STDOUT==\n%s==STDERR==\n%s", cId, stdout, stderr) + logger.debug("Container %s finished successfully, output follows.\n==STDOUT==\n%s==STDERR==\n%s", cId, + stdout, stderr) elif self._exitCode != 0: stdout = container.logs(stream=False, stdout=True, stderr=False) stderr = container.logs(stream=False, stdout=False, stderr=True) @@ -404,4 +410,4 @@ def _kwargs_from_env(cls, ssl_version=None, assert_hostname=False): config_file_name = os.path.join(utils.getDlgDir(), 'dlg.settings') if os.path.exists(config_file_name): return ConfigObj(config_file_name) - return {} \ No newline at end of file + return {} diff --git a/daliuge-runtime/dlg/apps/dynlib.py b/daliuge-runtime/dlg/apps/dynlib.py index c61cc3f4a..ead403e5d 100644 --- a/daliuge-runtime/dlg/apps/dynlib.py +++ b/daliuge-runtime/dlg/apps/dynlib.py @@ -34,7 +34,6 @@ from ..drop import AppDROP, BarrierAppDROP from ..exceptions import InvalidDropException - logger = logging.getLogger(__name__) _read_cb_type = ctypes.CFUNCTYPE( @@ -336,6 +335,7 @@ def addStreamingInput(self, streamingInputDrop, back=True): class DynlibApp(DynlibAppBase, BarrierAppDROP): """Loads a dynamic library into the current process and runs it""" + def initialize(self, **kwargs): super(DynlibApp, self).initialize(**kwargs) self.ranks = self._getArg(kwargs, 'rank', None) diff --git a/daliuge-runtime/dlg/apps/fileimport.py b/daliuge-runtime/dlg/apps/fileimport.py index 8fa51a313..65d4fe992 100644 --- a/daliuge-runtime/dlg/apps/fileimport.py +++ b/daliuge-runtime/dlg/apps/fileimport.py @@ -23,11 +23,12 @@ import os import uuid -from ..drop import ContainerDROP -from ..drop import FileDROP from dlg.meta import dlg_string_param, dlg_list_param, dlg_component, \ dlg_batch_input, dlg_batch_output, dlg_streaming_input +from ..drop import ContainerDROP +from ..drop import FileDROP + class FileImportApp(ContainerDROP): """ @@ -36,7 +37,8 @@ class FileImportApp(ContainerDROP): is created which contains the path to the file. The FileDROP is then added to the FileImportApp (ContainerDROP) """ - compontent_meta = dlg_component('FileImportApp', 'Recursively scans a directory (dirname) and checks for files with ' + compontent_meta = dlg_component('FileImportApp', + 'Recursively scans a directory (dirname) and checks for files with ' 'a particular extension (ext). If a match is made then a FileDROP ' 'is created which contains the path to the file. The FileDROP is then added ' 'to the FileImportApp (ContainerDROP)', @@ -69,7 +71,7 @@ def _scan_and_import_files(self): path = '{0}/{1}'.format(root, f) fd = FileDROP(str(uuid.uuid1()), str(uuid.uuid1()), - filepath = path, - check_filepath_exists = True) + filepath=path, + check_filepath_exists=True) self._children.append(fd) fd._parent = self diff --git a/daliuge-runtime/dlg/apps/mpi.py b/daliuge-runtime/dlg/apps/mpi.py index 84e31a373..b1e5f3046 100644 --- a/daliuge-runtime/dlg/apps/mpi.py +++ b/daliuge-runtime/dlg/apps/mpi.py @@ -29,9 +29,9 @@ from ..drop import BarrierAppDROP from ..exceptions import InvalidDropException - logger = logging.getLogger(__name__) + class MPIApp(BarrierAppDROP): """ An application drop representing an MPI job. @@ -78,13 +78,14 @@ def run(self): vendor, version = MPI.get_vendor() # @UndefinedVariable info = MPI.Info.Create() # @UndefinedVariable logger.debug("MPI vendor is %s, version %s", vendor, '.'.join([str(x) for x in version])) # @UndefinedVariable - comm_children = MPI.COMM_SELF.Spawn(cmd, args=args, maxprocs=self._maxprocs, errcodes=errcodes, info=info) # @UndefinedVariable + comm_children = MPI.COMM_SELF.Spawn(cmd, args=args, maxprocs=self._maxprocs, errcodes=errcodes, + info=info) # @UndefinedVariable n_children = comm_children.Get_remote_size() logger.info("%d MPI children apps spawned, gathering exit data", n_children) if self._use_wrapper: - children_data = comm_children.gather(('','', 0), root=MPI.ROOT) # @UndefinedVariable + children_data = comm_children.gather(('', '', 0), root=MPI.ROOT) # @UndefinedVariable exit_codes = [x[2] for x in children_data] logger.info("Exit codes gathered from children processes: %r", exit_codes) @@ -93,7 +94,8 @@ def run(self): if code == 0: continue any_failed = True - logger.error("stdout/stderr follow for rank %d:\nSTDOUT\n======\n%s\n\nSTDERR\n======\n%s", rank, stdout, stderr) + logger.error("stdout/stderr follow for rank %d:\nSTDOUT\n======\n%s\n\nSTDERR\n======\n%s", rank, + stdout, stderr) if any_failed: raise Exception("One or more MPI children didn't exit cleanly") @@ -103,7 +105,6 @@ def run(self): # When we are called by the MPIApp def module_as_main(): - # Get the parent communicator before anything else happens # This way we ensure the communicator is valid from mpi4py import MPI @@ -119,7 +120,8 @@ def handle(signNo, stack_frame): # argv[0] is the name of this module # argv[1:] is the actual command + args try: - proc = subprocess.Popen(sys.argv[1:], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, close_fds=False) + proc = subprocess.Popen(sys.argv[1:], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, + close_fds=False) stdout, stderr = proc.communicate() code = proc.returncode except Exception as e: @@ -128,5 +130,6 @@ def handle(signNo, stack_frame): # Gather the results in the spawner rank and good bye parent_comm.gather((stdout, stderr, code), root=0) + if __name__ == '__main__': - module_as_main() \ No newline at end of file + module_as_main() diff --git a/daliuge-runtime/dlg/apps/pyfunc.py b/daliuge-runtime/dlg/apps/pyfunc.py index f6638531c..d9ccb6f11 100644 --- a/daliuge-runtime/dlg/apps/pyfunc.py +++ b/daliuge-runtime/dlg/apps/pyfunc.py @@ -35,19 +35,20 @@ from ..drop import BarrierAppDROP from ..exceptions import InvalidDropException - _getargsspec = inspect.getargspec if six.PY2 else inspect.getfullargspec logger = logging.getLogger(__name__) + def serialize_data(d): return utils.b2s(base64.b64encode(pickle.dumps(d))) + def deserialize_data(d): return pickle.loads(base64.b64decode(six.b(d))) -def serialize_func(f): +def serialize_func(f): if isinstance(f, six.string_types): parts = f.split('.') f = getattr(importlib.import_module('.'.join(parts[:-1])), parts[-1]) @@ -77,9 +78,11 @@ def import_using_name(app, fname): except AttributeError: raise InvalidDropException(app, 'Module %s has no member %s' % (modname, fname)) + def import_using_code(code): return dill.loads(code) + class PyFuncApp(BarrierAppDROP): """ An application that wraps a simple python function. @@ -152,4 +155,4 @@ def run(self): if len(outputs) == 1: result = [result] for r, o in zip(result, outputs): - o.write(pickle.dumps(r)) # @UndefinedVariable \ No newline at end of file + o.write(pickle.dumps(r)) # @UndefinedVariable diff --git a/daliuge-runtime/dlg/apps/scp.py b/daliuge-runtime/dlg/apps/scp.py index 58789b6b5..e201c66a5 100644 --- a/daliuge-runtime/dlg/apps/scp.py +++ b/daliuge-runtime/dlg/apps/scp.py @@ -19,11 +19,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # -from ..remote import copyTo, copyFrom from ..drop import BarrierAppDROP, ShoreDROP, NgasDROP, InMemoryDROP, \ NullDROP, RDBMSDrop, ContainerDROP from ..meta import dlg_string_param, dlg_component, dlg_batch_input, \ dlg_batch_output, dlg_streaming_input +from ..remote import copyTo, copyFrom class ScpApp(BarrierAppDROP): @@ -41,7 +41,7 @@ class ScpApp(BarrierAppDROP): two I/O DROPs. """ compontent_meta = dlg_component('ScpApp', 'A BarrierAppDROP that copies the content of its single ' - 'input onto its single output via SSHs scp protocol.', + 'input onto its single output via SSHs scp protocol.', [dlg_batch_input('binary/*', [ShoreDROP, NgasDROP, InMemoryDROP, NullDROP, RDBMSDrop, ContainerDROP])], [dlg_batch_output('binary/*', [ShoreDROP, NgasDROP, InMemoryDROP, @@ -96,4 +96,4 @@ def run(self): username=self.remoteUser, pkeyPath=self.pkeyPath, timeout=self.timeout) else: copyFrom(inp.node, inp.path, localPath=out.path, recursive=recursive, - username=self.remoteUser, pkeyPath=self.pkeyPath, timeout=self.timeout) \ No newline at end of file + username=self.remoteUser, pkeyPath=self.pkeyPath, timeout=self.timeout) diff --git a/daliuge-runtime/dlg/apps/simple.py b/daliuge-runtime/dlg/apps/simple.py index 9e8c9c9b2..0f9849420 100644 --- a/daliuge-runtime/dlg/apps/simple.py +++ b/daliuge-runtime/dlg/apps/simple.py @@ -36,6 +36,7 @@ class NullBarrierApp(BarrierAppDROP): [dlg_streaming_input('binary/*')]) """A BarrierAppDrop that doesn't perform any work""" + def run(self): pass @@ -88,4 +89,4 @@ class SleepAndCopyApp(SleepApp, CopyApp): def run(self): SleepApp.run(self) - CopyApp.run(self) \ No newline at end of file + CopyApp.run(self) diff --git a/daliuge-runtime/dlg/apps/socket_listener.py b/daliuge-runtime/dlg/apps/socket_listener.py index 4a14ca508..079bf6b79 100644 --- a/daliuge-runtime/dlg/apps/socket_listener.py +++ b/daliuge-runtime/dlg/apps/socket_listener.py @@ -34,7 +34,6 @@ from ..meta import dlg_string_param, dlg_int_param, dlg_bool_param, \ dlg_component, dlg_batch_output, dlg_batch_input, dlg_streaming_input - logger = logging.getLogger(__name__) @@ -105,4 +104,4 @@ def addInput(self, inputDrop, back=True): def addStreamingInput(self, streamingInputDrop, back=True): raise InvalidRelationshipException(DROPRel(streamingInputDrop.uid, DROPLinkType.STREAMING_INPUT, self.uid), - "SocketListenerApp should have no inputs") \ No newline at end of file + "SocketListenerApp should have no inputs") diff --git a/daliuge-runtime/dlg/apps/spead_receiver.py b/daliuge-runtime/dlg/apps/spead_receiver.py index 96086c104..4dd4143b1 100644 --- a/daliuge-runtime/dlg/apps/spead_receiver.py +++ b/daliuge-runtime/dlg/apps/spead_receiver.py @@ -32,9 +32,9 @@ from ..drop import BarrierAppDROP - logger = logging.getLogger(__name__) + class SpeadReceiverApp(BarrierAppDROP): """ A BarrierAppDROP that listens for data using the SPEAD protocol. @@ -55,21 +55,21 @@ def initialize(self, **kwargs): super(SpeadReceiverApp, self).initialize(**kwargs) # Basic connectivity parameters - self._host = self._getArg(kwargs, 'host', 'localhost') - self._port = self._getArg(kwargs, 'port', 1111) - self._itemId = self._getArg(kwargs, 'itemId', 0x1000) + self._host = self._getArg(kwargs, 'host', 'localhost') + self._port = self._getArg(kwargs, 'port', 1111) + self._itemId = self._getArg(kwargs, 'itemId', 0x1000) # Performance tuning - self._maxPacketSize = self._getArg(kwargs, 'maxPacketSize', 9200) + self._maxPacketSize = self._getArg(kwargs, 'maxPacketSize', 9200) self._socketBufferSize = self._getArg(kwargs, 'socketBufferSize', 8388608) - self._maxHeaps = self._getArg(kwargs, 'maxHeaps', 4) + self._maxHeaps = self._getArg(kwargs, 'maxHeaps', 4) # Memory and thread pool tuning - self._mpLower = self._getArg(kwargs, 'mpLower', 4096) - self._mpUpper = self._getArg(kwargs, 'mpUpper', 4096*8) - self._mpMaxFree = self._getArg(kwargs, 'mpMaxFree', 10) - self._mpInitial = self._getArg(kwargs, 'mpInitial', 1) - self._tpThreads = self._getArg(kwargs, 'tpThreads', 1) + self._mpLower = self._getArg(kwargs, 'mpLower', 4096) + self._mpUpper = self._getArg(kwargs, 'mpUpper', 4096 * 8) + self._mpMaxFree = self._getArg(kwargs, 'mpMaxFree', 10) + self._mpInitial = self._getArg(kwargs, 'mpInitial', 1) + self._tpThreads = self._getArg(kwargs, 'tpThreads', 1) def run(self): diff --git a/daliuge-runtime/dlg/dask_emulation.py b/daliuge-runtime/dlg/dask_emulation.py index 97e3946da..e2ec53c63 100644 --- a/daliuge-runtime/dlg/dask_emulation.py +++ b/daliuge-runtime/dlg/dask_emulation.py @@ -37,9 +37,9 @@ from .drop import BarrierAppDROP from .exceptions import InvalidDropException - logger = logging.getLogger(__name__) + class ResultTransmitter(BarrierAppDROP): '''Collects data from all inputs and transmits it to whomever connects to the given host/port''' @@ -76,7 +76,6 @@ def read_result(x): def _get_client(**kwargs): - if 'client' in kwargs: return kwargs['client'] @@ -87,9 +86,11 @@ def _get_client(**kwargs): timeout = kwargs.get('timeout', None) return NodeManagerClient(host, port, timeout) + def _is_list_of_delayeds(x): return isinstance(x, (list, tuple)) and len(x) > 0 and isinstance(x[0], _DataDrop) + def compute(value, **kwargs): """Returns the result of the (possibly) delayed computation by sending the graph to a Drop Manager and waiting for the result to arrive back""" @@ -103,7 +104,9 @@ def compute(value, **kwargs): # Add one final application that will wait for all results # and transmit them back to us transmitter_oid = '-1' - transmitter = dropdict({'type': 'app', 'app': 'dlg.dask_emulation.ResultTransmitter', 'oid': transmitter_oid, 'port': port, 'nm': 'result transmitter'}) + transmitter = dropdict( + {'type': 'app', 'app': 'dlg.dask_emulation.ResultTransmitter', 'oid': transmitter_oid, 'port': port, + 'nm': 'result transmitter'}) for leaf_oid in droputils.get_leaves(graph.values()): graph[leaf_oid].addConsumer(transmitter) graph[transmitter_oid] = transmitter @@ -127,8 +130,8 @@ def compute(value, **kwargs): logger.info("Received %r from graph computation", ret) return ret -class _DelayedDrop(object): +class _DelayedDrop(object): _drop_count = 0 def __init__(self, producer=None): @@ -210,9 +213,11 @@ def _add_upstream(self, upstream): class _Listifier(BarrierAppDROP): """Returns a list with all objects as contents""" + def run(self): self.outputs[0].write(pickle.dumps([pickle.loads(droputils.allDropContents(x)) for x in self.inputs])) + class _DelayedDrops(_DelayedDrop): """One or more _DelayedDrops treated as a single item""" @@ -223,7 +228,6 @@ def __init__(self, *drops): logger.debug("Created %r", self) def _to_physical_graph(self, visited, graph): - output = _DataDrop(producer=self) output._append_to_graph(visited, graph) @@ -251,6 +255,7 @@ def make_dropdict(self): def __repr__(self): return "<_DelayedDrops n=%d>" % (len(self.drops),) + class _AppDrop(_DelayedDrop): """Defines a PyFuncApp drop for a given function `f`""" @@ -320,7 +325,10 @@ def __call__(self, *args, **kwargs): def __repr__(self): return "<_DelayedApp fname=%s, nout=%s>" % (self.fname, str(self.nout)) + _no_data = object() + + class _DataDrop(_DelayedDrop): """Defines an in-memory drop""" @@ -343,6 +351,7 @@ def __repr__(self): return "<_DataDrop, pydata=%r>" % (self.pydata,) return "<_DataDrop, producer=%r>" % self.producer + class _DataDropSequence(_DataDrop): """One or more _DataDrops that can be subscribed""" @@ -364,6 +373,7 @@ def __getitem__(self, i): def __repr__(self): return "<_DataDropSequence nout=%d, producer=%r>" % (self.nout, self.producer) + def delayed(x, *args, **kwargs): """Like dask.delayed, but quietly swallowing anything other than `nout`""" if 'nout' in kwargs: @@ -374,4 +384,4 @@ def delayed(x, *args, **kwargs): nout = None if callable(x): return _AppDrop(x, nout=nout) - return _DataDrop(pydata=x) \ No newline at end of file + return _DataDrop(pydata=x) diff --git a/daliuge-runtime/dlg/deploy/common.py b/daliuge-runtime/dlg/deploy/common.py index 7c38e20f3..7d9fcbe86 100644 --- a/daliuge-runtime/dlg/deploy/common.py +++ b/daliuge-runtime/dlg/deploy/common.py @@ -19,6 +19,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import itertools import json import logging import os @@ -28,11 +29,10 @@ from ..manager import constants from ..manager.client import BaseDROPManagerClient from ..manager.session import SessionStates -import itertools - logger = logging.getLogger(__name__) + class _StatusDumper(BaseDROPManagerClient): """A client that dumps the graph status each time a session is queried""" @@ -65,6 +65,7 @@ def session(self, session_id): def _is_end_state(session_status): return session_status in (SessionStates.FINISHED, SessionStates.CANCELLED) + def _get_client(host, port, timeout, status_dump_path=None): kwargs = {'host': host, 'port': port, 'timeout': timeout} clazz = BaseDROPManagerClient @@ -81,7 +82,8 @@ def _get(status): if isinstance(status[0], list): status = list(itertools.chain(*status)) return status - x = _get(session['status']) + + x = _get(session['status']) return x @@ -92,6 +94,7 @@ def _session_finished(session): return _is_end_state(session_status) return all(_is_end_state(s) for s in session_status) + def monitor_sessions(session_id=None, poll_interval=10, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60, status_dump_path=None): @@ -114,6 +117,7 @@ def monitor_sessions(session_id=None, poll_interval=10, host='127.0.0.1', return {s['sessionId']: _session_status(s) for s in sessions} time.sleep(poll_interval) + def submit(pg, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60, skip_deploy=False, session_id=None): """ @@ -131,4 +135,4 @@ def submit(pg, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, if not skip_deploy: client.deploy_session(session_id, completed_uids=completed_uids) logger.info("Session %s deployed", session_id) - return session_id \ No newline at end of file + return session_id diff --git a/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py b/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py index d29b38f5a..d32847e54 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py +++ b/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py @@ -53,7 +53,6 @@ from ...utils import b2s - BUFF_SIZE = 16384 outstanding_conn = 20 default_publication_port = 20000 @@ -65,6 +64,7 @@ delimit = b'@#%!$' dl = len(delimit) + def recvall(sock, count): buf = b'' while count: @@ -75,11 +75,13 @@ def recvall(sock, count): count -= len(newbuf) return buf + def send_to_proxy(sock, data): length = len(data) sock.sendall(struct.pack('!I', length)) sock.sendall(data) + def recv_from_proxy(sock): lengthbuf = recvall(sock, 4) if (lengthbuf is None): @@ -87,6 +89,7 @@ def recv_from_proxy(sock): length, = struct.unpack('!I', lengthbuf) return recvall(sock, length) + # HTTP support to get the list of available proxies class Handler(BaseHTTPServer.BaseHTTPRequestHandler): def setup(self): @@ -111,7 +114,8 @@ def do_GET(self): self.wfile.write(b"No proxies available yet") return - aEls = ['{1} @ {0}:{2}'.format(host,b2s(proxyId),client_port) for proxyId, client_port in self.monitor.proxy_ids.items()] + aEls = ['{1} @ {0}:{2}'.format(host, b2s(proxyId), client_port) for + proxyId, client_port in self.monitor.proxy_ids.items()] html = '
  • '.join(aEls) html = '
    • ' + html + '
    ' self.wfile.write(six.b(html)) @@ -122,16 +126,20 @@ def do_GET(self): self.end_headers() self.wfile.write(json.dumps(self.monitor.proxy_ids, indent=2)) + class Server(BaseHTTPServer.HTTPServer): def __init__(self, monitor): self.monitor = monitor BaseHTTPServer.HTTPServer.__init__(self, (monitor.host, monitor.publication_port), Handler) + sockandaddr = collections.namedtuple('sockandaddr', 'sock addr') + class Monitor: - def __init__(self, host='0.0.0.0', proxy_port=default_proxy_port, client_base_port=default_client_base_port, publication_port=default_publication_port): + def __init__(self, host='0.0.0.0', proxy_port=default_proxy_port, client_base_port=default_client_base_port, + publication_port=default_publication_port): """ host: listening host (string) proxy_port: port exposed to the DALiuGE proxy (int) @@ -155,7 +163,7 @@ def __init__(self, host='0.0.0.0', proxy_port=default_proxy_port, client_base_po self.client_port_to_proxy_port = {} # To save the tags we attach to each client socket - self.tag_dict = {} # k - socket hash, v - socket tag + self.tag_dict = {} # k - socket hash, v - socket tag # Proxy IDs to client ports. We publish that information in publication_port self.proxy_ids = {} @@ -285,7 +293,7 @@ def remove_client_socket(self, sock): def remove_proxy_socket(self, sock): - for proxyport,saa in self.proxy_sockets.items(): + for proxyport, saa in self.proxy_sockets.items(): if saa.sock == sock: break @@ -347,7 +355,7 @@ def on_proxy_connected(self, sock): proxy_id = proxy_id.strip() proxy_id_str = b2s(proxy_id) if proxy_id in self.proxy_ids or \ - proxy_id.startswith(b'GET ') or proxy_id.startswith(b'POST '): + proxy_id.startswith(b'GET ') or proxy_id.startswith(b'POST '): logger.info('Proxy identified as %s, rejecting', proxy_id_str) proxysock.sendall(b'0') self.close_socket(proxysock, True) @@ -447,7 +455,7 @@ def on_client_data(self, sock): logger.debug("Received data from client %s", tag_str) proxy_port = self.client_port_to_proxy_port[sock.getsockname()[1]] proxy_socket = None - for port,proxy_sock in self.proxy_sockets.items(): + for port, proxy_sock in self.proxy_sockets.items(): if port == proxy_port: proxy_socket = proxy_sock.sock break @@ -464,21 +472,21 @@ def on_client_data(self, sock): def run(parser, args): - parser.add_option("-H", "--host", action="store", type="string", - dest="host", help="The network interface the monitor is bind", - default='0.0.0.0') + dest="host", help="The network interface the monitor is bind", + default='0.0.0.0') parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="monitor_port", help = "The monitor port exposed to the DALiuGE proxy", - default=default_proxy_port) + dest="monitor_port", help="The monitor port exposed to the DALiuGE proxy", + default=default_proxy_port) parser.add_option("-c", "--client_port", action="store", type="int", - dest="client_port", help = "The proxy port exposed to the client", - default=default_client_base_port) + dest="client_port", help="The proxy port exposed to the client", + default=default_client_base_port) parser.add_option("-p", "--publication_port", action="store", type="int", - dest="publication_port", help="Port used to publish the list of proxies for clients to look at", default=default_publication_port) + dest="publication_port", help="Port used to publish the list of proxies for clients to look at", + default=default_publication_port) parser.add_option("-d", "--debug", - action="store_true", dest="debug", default=False, - help="Whether to log debug info") + action="store_true", dest="debug", default=False, + help="Whether to log debug info") (options, args) = parser.parse_args(args) if (options.debug): @@ -492,4 +500,4 @@ def run(parser, args): server.main_loop() except KeyboardInterrupt: logger.warning("Ctrl C - Stopping DALiuGE Monitor server") - sys.exit(1) \ No newline at end of file + sys.exit(1) diff --git a/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py b/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py index 18ac0bc41..30a128a06 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py +++ b/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py @@ -36,10 +36,11 @@ -------------------------------------------------------------------------------- """ +import logging import select import socket import struct -import sys, logging +import sys import time import six @@ -58,6 +59,7 @@ delimit = b'@#%!$' dl = len(delimit) + def recvall(sock, count): buf = b'' while count: @@ -68,11 +70,13 @@ def recvall(sock, count): count -= len(newbuf) return buf + def send_to_monitor(sock, data): length = len(data) sock.sendall(struct.pack('!I', length)) sock.sendall(data) + def recv_from_monitor(sock): lengthbuf = recvall(sock, 4) if (lengthbuf is None): @@ -80,8 +84,10 @@ def recv_from_monitor(sock): length, = struct.unpack('!I', lengthbuf) return recvall(sock, length) + class ProxyServer: - def __init__(self, proxy_id, dlg_host, monitor_host, dlg_port=default_dlg_port, monitor_port=default_dlg_monitor_port): + def __init__(self, proxy_id, dlg_host, monitor_host, dlg_port=default_dlg_port, + monitor_port=default_dlg_monitor_port): self._proxy_id = proxy_id if len(proxy_id) <= 80 else proxy_id[:80] self._dlg_host = dlg_host self._dlg_port = dlg_port @@ -95,7 +101,7 @@ def connect_to_host(self, server, port): while True: if retry_count >= conn_retry_count: logger.error("Retry connecting to DALiuGE monitor exhausted, quit") - #sys.exit(2) + # sys.exit(2) try: the_socket = socket.create_connection((server, port)) the_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) @@ -136,7 +142,7 @@ def loop(self): if (just_re_connected): just_re_connected = False inputready, _, _ = select.select( - inputlist + list(self._dlg_sock_dict.values()), [], [], delay) + inputlist + list(self._dlg_sock_dict.values()), [], [], delay) for the_socket in inputready: if (just_re_connected): continue @@ -191,23 +197,25 @@ def loop(self): if (len(data) == 0): self.close_dlg_socket(the_socket, tag) + def run(parser, args): ''' Entry point for the dlg proxy command ''' parser.add_option("-d", "--dlg_host", action="store", type="string", - dest="dlg_host", help="DALiuGE Node Manager host IP (required)") + dest="dlg_host", help="DALiuGE Node Manager host IP (required)") parser.add_option("-m", "--monitor_host", action="store", type="string", - dest="monitor_host", help="Monitor host IP (required)") + dest="monitor_host", help="Monitor host IP (required)") parser.add_option("-l", "--log_dir", action="store", type="string", - dest="log_dir", help="Log directory (optional)", default='.') + dest="log_dir", help="Log directory (optional)", default='.') parser.add_option("-f", "--dlg_port", action="store", type="int", - dest="dlg_port", help = "The port the DALiuGE Node Manager is running on", default=default_dlg_port) + dest="dlg_port", help="The port the DALiuGE Node Manager is running on", default=default_dlg_port) parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="monitor_port", help = "The port the DALiuGE monitor is running on", default=default_dlg_monitor_port) + dest="monitor_port", help="The port the DALiuGE monitor is running on", + default=default_dlg_monitor_port) parser.add_option("-b", "--debug", - action="store_true", dest="debug", default=False, - help="Whether to log debug info") + action="store_true", dest="debug", default=False, + help="Whether to log debug info") parser.add_option("-i", "--id", action="store", type="string", dest="id", help="The ID of this proxy for on the monitor side (required)", default=None) (options, args) = parser.parse_args(args) @@ -225,4 +233,4 @@ def run(parser, args): server.loop() except KeyboardInterrupt: logger.warning("Ctrl C - Stopping DALiuGE Proxy server") - sys.exit(1) \ No newline at end of file + sys.exit(1) diff --git a/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js b/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js index e089cc132..53874f518 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js +++ b/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js @@ -1,67 +1,77 @@ // Converts integer to roman numeral // Adapted from: https://kmahelona.github.io/ipython_notebook_goodies/ipython_notebook_toc.js function romanize(num) { - var lookup = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}, - roman = '', - i; - for ( i in lookup ) { - while ( num >= lookup[i] ) { - roman += i; - num -= lookup[i]; - } - } - return ''; - } + var lookup = {M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1}, + roman = '', + i; + for (i in lookup) { + while (num >= lookup[i]) { + roman += i; + num -= lookup[i]; + } + } + return ''; +} // Builds a
      Table of Contents from all in DOM -function createTOC(){ +function createTOC() { var toc = ""; var level = 0; var levels = {} $('#toc').html(''); - $(":header").each(function(i){ - if (this.id=='tocheading'){return;} - - titleText = this.innerHTML; - openLevel = this.tagName[1]; - - if (levels[openLevel]){ - levels[openLevel] += 1; - } else{ - levels[openLevel] = 1; - } - - if (openLevel > level) { - toc += (new Array(openLevel - level + 1)).join('
        '); - } else if (openLevel < level) { - toc += (new Array(level - openLevel + 1)).join("
      "); - for (i=level;i>openLevel;i--){levels[i]=0;} - } - - level = parseInt(openLevel); - - - if (this.id==''){this.id = this.innerHTML.replace(/ /g,"-")} - var anchor = this.id; - - toc += '
    • ' + romanize(levels[openLevel].toString()) + ' ' + titleText - + '
    • '; - - }); - - + $(":header").each(function (i) { + if (this.id == 'tocheading') { + return; + } + + titleText = this.innerHTML; + openLevel = this.tagName[1]; + + if (levels[openLevel]) { + levels[openLevel] += 1; + } else { + levels[openLevel] = 1; + } + + if (openLevel > level) { + toc += (new Array(openLevel - level + 1)).join('
        '); + } else if (openLevel < level) { + toc += (new Array(level - openLevel + 1)).join("
      "); + for (i = level; i > openLevel; i--) { + levels[i] = 0; + } + } + + level = parseInt(openLevel); + + + if (this.id == '') { + this.id = this.innerHTML.replace(/ /g, "-") + } + var anchor = this.id; + + toc += '
    • ' + romanize(levels[openLevel].toString()) + ' ' + titleText + + '
    • '; + + }); + + if (level) { - toc += (new Array(level + 1)).join("
    "); + toc += (new Array(level + 1)).join(""); } - + $('#toc').append(toc); -}; +} // Executes the createToc function -setTimeout(function(){createTOC();},100); +setTimeout(function () { + createTOC(); +}, 100); // Rebuild to TOC every minute -setInterval(function(){createTOC();},60000); +setInterval(function () { + createTOC(); +}, 60000); diff --git a/daliuge-runtime/dlg/deploy/pawsey/remotes.py b/daliuge-runtime/dlg/deploy/pawsey/remotes.py index 83ed8ac73..4539aa003 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/remotes.py +++ b/daliuge-runtime/dlg/deploy/pawsey/remotes.py @@ -27,9 +27,9 @@ from . import slurm_utils - logger = logging.getLogger(__name__) + class Remote(object): def __init__(self, options, my_ip): @@ -172,9 +172,9 @@ def __init__(self, options, my_ip): rank = ips.index(my_ip) self._set_world(rank, len(ips), ips) + class DALiuGEHybridRemote(DALiuGERemote): """Like DALiuGERemote, but initializes MPI as well""" def __init__(self, options, my_ip): - from mpi4py import MPI # @UnusedImport - super(DALiuGEHybridRemote, self).__init__(options, my_ip) \ No newline at end of file + super(DALiuGEHybridRemote, self).__init__(options, my_ip) diff --git a/daliuge-runtime/dlg/deploy/pawsey/scale_test.py b/daliuge-runtime/dlg/deploy/pawsey/scale_test.py index 48eeddd0d..ae473055c 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/scale_test.py +++ b/daliuge-runtime/dlg/deploy/pawsey/scale_test.py @@ -40,7 +40,6 @@ from ... import utils from ...runtime import __git_version__ as git_commit - sub_tpl_str = """#!/bin/bash --login #SBATCH --nodes=$NUM_NODES @@ -62,6 +61,7 @@ default_aws_mon_host = 'sdp-dfms.ddns.net' default_aws_mon_port = 8898 + class DefaultConfig(object): def __init__(self): self._dict = dict() @@ -78,6 +78,7 @@ def setpar(self, k, v): def getpar(self, k): return self._dict.get(k) + class GalaxyMWAConfig(DefaultConfig): def __init__(self): super(GalaxyMWAConfig, self).__init__() @@ -85,6 +86,7 @@ def __init__(self): def init_list(self): return ['mwaops', '/group/mwaops/cwu/dfms/logs'] + class GalaxyASKAPConfig(DefaultConfig): def __init__(self): super(GalaxyASKAPConfig, self).__init__() @@ -92,6 +94,7 @@ def __init__(self): def init_list(self): return ['astronomy856', '/group/astronomy856/cwu/dfms/logs'] + class MagnusConfig(DefaultConfig): def __init__(self): super(MagnusConfig, self).__init__() @@ -99,22 +102,25 @@ def __init__(self): def init_list(self): return ['pawsey0129', '/group/pawsey0129/daliuge_logs'] + class TianHe2Config(DefaultConfig): def __init__(self): super(TianHe2Config, self).__init__() - def init_list(self): #TODO please fill in + def init_list(self): # TODO please fill in return ['SHAO', '/group/shao/daliuge_logs'] + class ConfigFactory(): - mapping = {'galaxy_mwa':GalaxyMWAConfig, 'galaxy_askap':GalaxyASKAPConfig, - 'magnus':MagnusConfig, 'galaxy':GalaxyASKAPConfig} + mapping = {'galaxy_mwa': GalaxyMWAConfig, 'galaxy_askap': GalaxyASKAPConfig, + 'magnus': MagnusConfig, 'galaxy': GalaxyASKAPConfig} @staticmethod def create_config(facility=None): facility = facility.lower() if (facility is not None) else facility return ConfigFactory.mapping.get(facility)() + class PawseyClient(object): """ parameters we can control: @@ -168,9 +174,9 @@ def __init__(self, log_root=None, acc=None, @property def num_daliuge_nodes(self): if (self._run_proxy): - ret = self._num_nodes - 1 # exclude the proxy node + ret = self._num_nodes - 1 # exclude the proxy node else: - ret = self._num_nodes - 0 # exclude the data island node? + ret = self._num_nodes - 0 # exclude the data island node? if (ret <= 0): raise Exception("Not enough nodes {0} to run DALiuGE.".format(self._num_nodes)) return ret @@ -179,7 +185,7 @@ def get_log_dirname(self): """ (pipeline name_)[Nnum_of_daliuge_nodes]_[time_stamp] """ - dtstr = datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S") #.%f + dtstr = datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S") # .%f return "{0}_N{1}_{2}".format(self._pip_name, self.num_daliuge_nodes, dtstr) def label_job_dur(self): @@ -203,7 +209,8 @@ def submit_job(self): pardict['ACCOUNT'] = self._acc pardict['PY_BIN'] = sys.executable pardict['LOG_DIR'] = lgdir - pardict['GRAPH_PAR'] = '-L "{0}"'.format(self._lg) if self._lg else '-P "{0}"'.format(self._pg) if self._pg else '' + pardict['GRAPH_PAR'] = '-L "{0}"'.format(self._lg) if self._lg else '-P "{0}"'.format( + self._pg) if self._pg else '' pardict['PROXY_PAR'] = '-m %s -o %d' % (self._mon_host, self._mon_port) if self._run_proxy else '' pardict['GRAPH_VIS_PAR'] = '-d' if self._graph_vis else '' pardict['LOGV_PAR'] = '-v %d' % self._logv @@ -222,19 +229,21 @@ def submit_job(self): with open(os.path.join(lgdir, 'git_commit.txt'), 'w') as gf: gf.write(git_commit) - os.chdir(lgdir) # so that slurm logs will be dumped here + os.chdir(lgdir) # so that slurm logs will be dumped here print(subprocess.check_output(['sbatch', job_file])) + class LogEntryPair(object): """ """ + def __init__(self, name, gstart, gend): self._name = name - self._gstart = gstart + 2 # group 0 is the whole matching line, group 1 is the catchall + self._gstart = gstart + 2 # group 0 is the whole matching line, group 1 is the catchall self._gend = gend + 2 self._start_time = None self._end_time = None - self._other = dict() # hack + self._other = dict() # hack def get_timestamp(self, line): """ @@ -262,8 +271,8 @@ def check_end(self, match, line): def get_duration(self): if ((self._start_time is None) or (self._end_time is None)): - #print "Cannot calc duration for '{0}': start_time:{1}, end_time:{2}".format(self._name, - #self._start_time, self._end_time) + # print "Cannot calc duration for '{0}': start_time:{1}, end_time:{2}".format(self._name, + # self._start_time, self._end_time) return None return (self._end_time - self._start_time) @@ -302,29 +311,29 @@ class LogParser(object): """ dim_kl = ['Start to unroll', - 'Unroll completed for {0} with # of Drops', - 'Start to translate', - 'Translation completed for', - 'PG spec is calculated', - 'Creating Session {0} in all hosts', - 'Successfully created session {0} in all hosts', - 'Separating graph', - 'Removed (and sanitized) {0} inter-dm relationships', - 'Adding individual graphSpec of session {0} to each DM', - 'Successfully added individual graphSpec of session {0} to each DM', - 'Deploying Session {0} in all hosts', - 'Successfully deployed session {0} in all hosts', - 'Establishing {0} drop relationships', - 'Established all drop relationships {0} in', - 'Moving Drops to COMPLETED right away', - 'Successfully triggered drops', - 'Got a node list with {0} node managers'] + 'Unroll completed for {0} with # of Drops', + 'Start to translate', + 'Translation completed for', + 'PG spec is calculated', + 'Creating Session {0} in all hosts', + 'Successfully created session {0} in all hosts', + 'Separating graph', + 'Removed (and sanitized) {0} inter-dm relationships', + 'Adding individual graphSpec of session {0} to each DM', + 'Successfully added individual graphSpec of session {0} to each DM', + 'Deploying Session {0} in all hosts', + 'Successfully deployed session {0} in all hosts', + 'Establishing {0} drop relationships', + 'Established all drop relationships {0} in', + 'Moving Drops to COMPLETED right away', + 'Successfully triggered drops', + 'Got a node list with {0} node managers'] nm_kl = [ - 'Starting Pyro4 Daemon for session', # Logged by the old master branch - 'Creating DROPs for session', # Drops are being created - 'Session {0} is now RUNNING', # All drops created and ready - 'Session {0} finished' # All drops executed + 'Starting Pyro4 Daemon for session', # Logged by the old master branch + 'Creating DROPs for session', # Drops are being created + 'Session {0} is now RUNNING', # All drops created and ready + 'Session {0} finished' # All drops executed ] kwords = dict() @@ -355,7 +364,7 @@ def build_dim_log_entry_pairs(self): def build_nm_log_entry_pairs(self): return [LogEntryPair(name, g1, g2) for name, g1, g2 in ( - ('completion_time_old', 0, 3), # Old master branch + ('completion_time_old', 0, 3), # Old master branch ('completion_time', 2, 3), ('node_deploy_time', 1, 2), )] @@ -467,7 +476,7 @@ def parse(self, out_csv=None): actual_num_nm = num_node_mgrs or theory_num_nm if actual_num_nm != num_finished_sess: print("Pipeline %s is not complete: %d != %d." % (pip_name, actual_num_nm, num_finished_sess)) - #return + # return else: failed_nodes = theory_num_nm - actual_num_nm num_nodes -= failed_nodes @@ -484,9 +493,10 @@ def parse(self, out_csv=None): indexed_leps = {lep._name: lep for lep in log_entry_pairs} deploy_time = indexed_leps['node_deploy_time'].get_duration() - if (deploy_time is None): # since some node managers failed to start + if (deploy_time is None): # since some node managers failed to start continue - exec_time = indexed_leps['completion_time'].get_duration() or indexed_leps['completion_time_old'].get_duration() + exec_time = indexed_leps['completion_time'].get_duration() or indexed_leps[ + 'completion_time_old'].get_duration() if (exec_time is None): continue real_exec_time = exec_time - (max_node_deploy_time - deploy_time) @@ -496,9 +506,9 @@ def parse(self, out_csv=None): temp_nm = [str(max_exec_time)] ret = [user_name, socket.gethostname().split('-')[0], pip_name, do_date, - num_nodes, num_drops, git_commit] + num_nodes, num_drops, git_commit] ret = [str(x) for x in ret] - num_dims = num_dims if num_dims == 1 else num_dims - 1 #exclude master manager + num_dims = num_dims if num_dims == 1 else num_dims - 1 # exclude master manager add_line = ','.join(ret + temp_dim + temp_nm + [str(int(num_dims))]) if (out_csv is not None): with open(out_csv, 'a') as of: @@ -509,8 +519,8 @@ def parse(self, out_csv=None): def check_log_dir(self, log_dir): possible_logs = [ - os.path.join(log_dir, '0', 'dlgDIM.log'), - os.path.join(log_dir, '0', 'dlgMM.log') + os.path.join(log_dir, '0', 'dlgDIM.log'), + os.path.join(log_dir, '0', 'dlgMM.log') ] for dim_log_f in possible_logs: if (os.path.exists(dim_log_f)): @@ -522,6 +532,7 @@ def check_log_dir(self, log_dir): return True return False + if __name__ == '__main__': parser = optparse.OptionParser() @@ -534,22 +545,23 @@ def check_log_dir(self, log_dir): parser.add_option("-L", "--logical-graph", action="store", type="string", dest="logical_graph", help="The filename of the logical graph to deploy", default=None) parser.add_option("-P", "--physical-graph", action="store", type="string", - dest="physical_graph", help="The filename of the physical graph (template) to deploy", default=None) + dest="physical_graph", help="The filename of the physical graph (template) to deploy", + default=None) parser.add_option("-t", "--job-dur", action="store", type="int", dest="job_dur", help="job duration in minutes", default=30) parser.add_option("-n", "--num_nodes", action="store", type="int", dest="num_nodes", help="number of compute nodes requested", default=5) parser.add_option('-i', '--graph_vis', action='store_true', - dest='graph_vis', help='Whether to visualise graph (poll status)', default=False) + dest='graph_vis', help='Whether to visualise graph (poll status)', default=False) parser.add_option('-p', '--run_proxy', action='store_true', - dest='run_proxy', help='Whether to attach proxy server for real-time monitoring', default=False) + dest='run_proxy', help='Whether to attach proxy server for real-time monitoring', default=False) parser.add_option("-m", "--monitor_host", action="store", type="string", - dest="mon_host", help="Monitor host IP (optional)", default=default_aws_mon_host) + dest="mon_host", help="Monitor host IP (optional)", default=default_aws_mon_host) parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="mon_port", help="The port to bind DALiuGE monitor", default=default_aws_mon_port) + dest="mon_port", help="The port to bind DALiuGE monitor", default=default_aws_mon_port) parser.add_option("-v", "--verbose-level", action="store", type="int", - dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", - default=1) + dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", + default=1) parser.add_option("-c", "--csvoutput", action="store", dest="csv_output", help="CSV output file to keep the log analysis result") parser.add_option("-z", "--zerorun", action="store_true", @@ -557,13 +569,15 @@ def check_log_dir(self, log_dir): parser.add_option("-y", "--sleepncopy", action="store_true", dest="sleepncopy", help="Whether include COPY in the default Component drop", default=False) parser.add_option("-T", "--max-threads", action="store", type="int", - dest="max_threads", help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) + dest="max_threads", + help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) parser.add_option('-s', '--num_islands', action='store', type='int', - dest='num_islands', default=1, help='The number of Data Islands') + dest='num_islands', default=1, help='The number of Data Islands') parser.add_option("-u", "--all_nics", action="store_true", dest="all_nics", help="Listen on all NICs for a node manager", default=False) parser.add_option("-S", "--check_with_session", action="store_true", - dest="check_with_session", help="Check for node managers' availability by creating/destroy a session", default=False) + dest="check_with_session", + help="Check for node managers' availability by creating/destroy a session", default=False) (opts, args) = parser.parse_args(sys.argv) if (opts.action == 2): diff --git a/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py b/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py index c313acfc5..f84add407 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py +++ b/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py @@ -23,6 +23,7 @@ class ListTokens(object): STRING, COMMA, RANGE_SEP, MULTICASE_START, MULTICASE_END = range(5) + def _list_tokenizer(s): buff = [] for char in s: @@ -51,8 +52,8 @@ def _list_tokenizer(s): yield ListTokens.STRING, ''.join(buff) buff = [] -def _parse_list_tokens(token_iter): +def _parse_list_tokens(token_iter): def finish_element(sub_values, range_start): if sub_values: values.extend(sub_values) @@ -93,6 +94,7 @@ def finish_element(sub_values, range_start): else: values.append(value) + def list_as_string(s): """'a008,b[072-073,076]' --> ['a008', 'b072', 'b073', 'b076']""" - return _parse_list_tokens(iter(_list_tokenizer(s))) \ No newline at end of file + return _parse_list_tokens(iter(_list_tokenizer(s))) diff --git a/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py b/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py index 2a59bd3f9..9462f851d 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py +++ b/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py @@ -49,8 +49,7 @@ from ...manager import cmdline from ...manager.client import NodeManagerClient from ...manager.constants import NODE_DEFAULT_REST_PORT, \ -ISLAND_DEFAULT_REST_PORT, MASTER_DEFAULT_REST_PORT - + ISLAND_DEFAULT_REST_PORT, MASTER_DEFAULT_REST_PORT DIM_WAIT_TIME = 60 MM_WAIT_TIME = DIM_WAIT_TIME @@ -64,6 +63,7 @@ "test.graphsRepository.SleepAndCopyApp", ) + def check_host(host, port, timeout=5, check_with_session=False): """ Checks if a given host/port is up and running (i.e., it is open). @@ -83,6 +83,7 @@ def check_host(host, port, timeout=5, check_with_session=False): except: return False + def check_hosts(ips, port, timeout=None, check_with_session=False, retry=1): """ Check that the given list of IPs are all up in the given port within the @@ -107,6 +108,7 @@ def check_and_add(ip): return [ip for ip in up if ip] + def get_ip_via_ifconfig(iface_index): out = subprocess.check_output('ifconfig') ifaces_info = list(filter(None, out.split(b'\n\n'))) @@ -114,12 +116,14 @@ def get_ip_via_ifconfig(iface_index): for line in ifaces_info[iface_index].splitlines(): line = line.strip() if line.startswith(b'inet'): - return utils.b2s(line.split()[1]) + return utils.b2s(line.split()[1]) raise ValueError('Interace %d is not an IP interface' % iface_index) + def get_ip_via_netifaces(iface_index): return utils.get_local_ip_addr()[iface_index][0] + def start_node_mgr(log_dir, my_ip, logv=1, max_threads=0, host=None, event_listeners=''): """ Start node manager @@ -132,6 +136,7 @@ def start_node_mgr(log_dir, my_ip, logv=1, max_threads=0, host=None, event_liste '--event-listeners', event_listeners] return cmdline.dlgNM(optparse.OptionParser(), args) + def start_dim(node_list, log_dir, origin_ip, logv=1): """ Start data island manager @@ -144,6 +149,7 @@ def start_dim(node_list, log_dir, origin_ip, logv=1): logger.info('Island manager process started with pid %d', proc.pid) return proc + def start_mm(node_list, log_dir, logv=1): """ Start master manager @@ -160,20 +166,25 @@ def start_mm(node_list, log_dir, logv=1): def _stop(endpoints): def _the_stop(endpoint): common.BaseDROPManagerClient(endpoint[0], endpoint[1]).stop() + tp = multiprocessing.pool.ThreadPool(min(50, len(endpoints))) tp.map(_the_stop, endpoints) tp.close() tp.join() + def stop_nms(ips): _stop([(ip, NODE_DEFAULT_REST_PORT) for ip in ips]) + def stop_dims(ips): _stop([(ip, ISLAND_DEFAULT_REST_PORT) for ip in ips]) + def stop_mm(ip): _stop([(ip, MASTER_DEFAULT_REST_PORT)]) + def submit_and_monitor(pg, opts, port): def _task(): dump_path = None @@ -187,6 +198,7 @@ def _task(): break except: logger.exception('Monitoring failed, restarting it') + t = threading.Thread(target=_task) t.start() return t @@ -207,6 +219,7 @@ def start_proxy(dlg_host, dlg_port, monitor_host, monitor_port): logger.exception("DALiuGE proxy terminated unexpectedly") sys.exit(1) + def modify_pg(pgt, modifier): parts = modifier.split(',') func = utils.get_symbol(parts[0]) @@ -214,6 +227,7 @@ def modify_pg(pgt, modifier): kwargs = dict(map(lambda x: x.split('='), filter(lambda x: '=' in x, parts[1:]))) return func(pgt, *args, **kwargs) + def get_pg(opts, nms, dims): """Gets the Physical Graph that is eventually submitted to the cluster, if any""" @@ -229,7 +243,7 @@ def get_pg(opts, nms, dims): num_partitions=num_nms, num_islands=num_dims, **algo_params) - del unrolled # quickly dispose of potentially big object + del unrolled # quickly dispose of potentially big object else: with open(opts.physical_graph, 'rb') as f: pgt = json.load(f) @@ -247,10 +261,12 @@ def get_pg(opts, nms, dims): json.dump(pg, f) return pg + def get_ip(opts): find_ip = get_ip_via_ifconfig if opts.use_ifconfig else get_ip_via_netifaces return find_ip(opts.interface) + def get_remote(opts): my_ip = get_ip(opts) if opts.remote_mechanism == 'mpi': @@ -259,44 +275,47 @@ def get_remote(opts): return remotes.DALiuGERemote(opts, my_ip) elif opts.remote_mechanism == 'dlg-hybrid': return remotes.DALiuGEHybridRemote(opts, my_ip) - else: # == 'slurm' + else: # == 'slurm' return remotes.SlurmRemote(opts, my_ip) -def main(): +def main(): parser = optparse.OptionParser() parser.add_option("-l", "--log_dir", action="store", type="string", - dest="log_dir", help="Log directory (required)") + dest="log_dir", help="Log directory (required)") # if this parameter is present, it means we want to get monitored parser.add_option("-m", "--monitor_host", action="store", type="string", - dest="monitor_host", help="Monitor host IP (optional)") + dest="monitor_host", help="Monitor host IP (optional)") parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="monitor_port", help="Monitor port", - default=dfms_proxy.default_dlg_monitor_port) + dest="monitor_port", help="Monitor port", + default=dfms_proxy.default_dlg_monitor_port) parser.add_option("-v", "--verbose-level", action="store", type="int", - dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", - default=1) + dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", + default=1) parser.add_option("-z", "--zerorun", action="store_true", dest="zerorun", help="Generate a physical graph that takes no time to run", default=False) parser.add_option("--app", action="store", type="int", dest="app", help="The app to use in the PG. 1=SleepApp (default), 2=SleepAndCopy", default=0) parser.add_option("-t", "--max-threads", action="store", type="int", - dest="max_threads", help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) + dest="max_threads", + help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) parser.add_option("-L", "--logical-graph", action="store", type="string", dest="logical_graph", help="The filename of the logical graph to deploy", default=None) parser.add_option("-P", "--physical-graph", action="store", type="string", - dest="physical_graph", help="The filename of the physical graph (template) to deploy", default=None) + dest="physical_graph", help="The filename of the physical graph (template) to deploy", + default=None) parser.add_option('-s', '--num_islands', action='store', type='int', - dest='num_islands', default=1, help='The number of Data Islands') + dest='num_islands', default=1, help='The number of Data Islands') parser.add_option('-d', '--dump', action='store_true', - dest='dump', help = 'dump file base name?', default=False) + dest='dump', help='dump file base name?', default=False) parser.add_option("-i", "--interface", type="int", - help="Index of network interface to use as the external interface/address for each host", default=0) + help="Index of network interface to use as the external interface/address for each host", + default=0) parser.add_option('--part-algo', type="string", dest='part_algo', help='Partition algorithms', default='metis') @@ -310,26 +329,31 @@ def main(): dest="all_nics", help="Listen on all NICs for a node manager", default=False) parser.add_option('--check-interfaces', action='store_true', - dest='check_interfaces', help = 'Run a small network interfaces test and exit', default=False) + dest='check_interfaces', help='Run a small network interfaces test and exit', default=False) parser.add_option('--collect-interfaces', action='store_true', - dest='collect_interfaces', help = 'Collect all interfaces and exit', default=False) + dest='collect_interfaces', help='Collect all interfaces and exit', default=False) parser.add_option('--use-ifconfig', action='store_true', - dest='use_ifconfig', help='Use ifconfig to find a suitable external interface/address for each host', default=False) + dest='use_ifconfig', + help='Use ifconfig to find a suitable external interface/address for each host', default=False) parser.add_option("-S", "--check_with_session", action="store_true", - dest="check_with_session", help="Check for node managers' availability by creating/destroy a session", default=False) + dest="check_with_session", + help="Check for node managers' availability by creating/destroy a session", default=False) parser.add_option("--event-listeners", action="store", type="string", - dest="event_listeners", help="A colon-separated list of event listener classes to be used", default='') + dest="event_listeners", help="A colon-separated list of event listener classes to be used", + default='') parser.add_option("--sleep-after-execution", action="store", type="int", - dest="sleep_after_execution", help="Sleep time interval after graph execution finished", default=0) + dest="sleep_after_execution", help="Sleep time interval after graph execution finished", + default=0) parser.add_option('--pg-modifiers', help=('A colon-separated list of python functions that modify a PG before submission. ' 'Each specification is in the form of [,[arg1=]val1][,[arg2=]val2]...'), default='') - parser.add_option('-r', '--remote-mechanism', help='The mechanism used by this script to coordinate remote processes', + parser.add_option('-r', '--remote-mechanism', + help='The mechanism used by this script to coordinate remote processes', choices=['mpi', 'slurm', 'dlg', 'dlg-hybrid'], default='mpi') (options, _) = parser.parse_args() @@ -352,7 +376,6 @@ def main(): print(' '.join(ips)) sys.exit(0) - if bool(options.logical_graph) == bool(options.physical_graph): parser.error("Either a logical graph or physical graph filename must be specified") for p in (options.logical_graph, options.physical_graph): @@ -390,9 +413,9 @@ def main(): if remote.is_nm: start_node_mgr(log_dir, remote.my_ip, logv=logv, - max_threads=options.max_threads, - host=None if options.all_nics else remote.my_ip, - event_listeners=options.event_listeners) + max_threads=options.max_threads, + host=None if options.all_nics else remote.my_ip, + event_listeners=options.event_listeners) elif options.num_islands == 1: if remote.is_proxy: @@ -437,5 +460,6 @@ def main(): utils.wait_or_kill(proc, 1e8, period=5) stop_nms(remote.nm_ips) + if __name__ == '__main__': main() diff --git a/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py b/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py index 0703e4217..9291c547b 100644 --- a/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py +++ b/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py @@ -32,25 +32,32 @@ this module also depends on networkx (included in Daliuge), which produces the edge list that becomes input for gephi vis tool. """ -import pygraphviz as pgv -import networkx as nx -import json, os, logging, optparse, sys, commands, filecmp +import filecmp +import json +import logging +import optparse +import os +import sqlite3 as dbdrv +import sys from collections import defaultdict from datetime import datetime as dt from xml.etree.ElementTree import ElementTree -import sqlite3 as dbdrv + +import commands +import networkx as nx import numpy as np +import pygraphviz as pgv logger = logging.getLogger(__name__) ORIGINAL_COLOR = (87, 87, 87) YELLOW_COLOR = (255, 255, 0) -#GREEN_COLOR = (102, 255, 178) +# GREEN_COLOR = (102, 255, 178) GREEN_COLOR = (0, 255, 0) RED_COLOR = (255, 0, 0) BLUE_COLOR = (102, 178, 255) -#TODO place java class in the current dir, and include it in Git repo +# TODO place java class in the current dir, and include it in Git repo java_cmd = "java -classpath /tmp/classes:/Users/Chen/proj/gephi-toolkit/gephi-toolkit-0.9.1-all.jar dlg.deploy.utils.export_graph" sql_create_status = """\ @@ -66,6 +73,7 @@ GROUP BY oid """ + class GraphPlayer(object): def __init__(self, graph_path, status_path): for fp in [graph_path, status_path]: @@ -74,7 +82,8 @@ def __init__(self, graph_path, status_path): if (not os.path.exists(fp)): raise Exception("JSON file not found: {0}".format(fp)) self.oid_gnid_dict = dict() - self.node_graph_dict = defaultdict(list) # k - node-ip, v - a list of tuple of (graph node_id, downstream drop ids) + self.node_graph_dict = defaultdict( + list) # k - node-ip, v - a list of tuple of (graph node_id, downstream drop ids) self.gnid_ip_dict = dict() self.status_path = status_path with open(graph_path) as f: @@ -90,16 +99,16 @@ def __init__(self, graph_path, status_path): def status_to_colour(self, st): st = int(st) - if (st == 0): #INITIALIZED or NOT_RUN + if (st == 0): # INITIALIZED or NOT_RUN r, g, b = ORIGINAL_COLOR - elif (st == 1): # WRITING or RUNNING - #logger.debug("running") + elif (st == 1): # WRITING or RUNNING + # logger.debug("running") r, g, b = YELLOW_COLOR - elif (st == 2): # COMPLETED or FINISHED - #logger.debug("completed") + elif (st == 2): # COMPLETED or FINISHED + # logger.debug("completed") r, g, b = GREEN_COLOR - elif (st == 3): # ERROR - #logger.debug("error") + elif (st == 3): # ERROR + # logger.debug("error") r, g, b = RED_COLOR else: r, g, b = BLUE_COLOR @@ -134,7 +143,8 @@ def parse_status(self, gexf_file, out_dir=None, remove_gexf=False): with open(self.status_path) as f: for i, line in enumerate(f): colour_dict = dict() - colour_dict['{}'] = '\n' % (ORIGINAL_COLOR[0], ORIGINAL_COLOR[1], ORIGINAL_COLOR[2]) + colour_dict['{}'] = '\n' % ( + ORIGINAL_COLOR[0], ORIGINAL_COLOR[1], ORIGINAL_COLOR[2]) output_lines = [] pgs = json.loads(line) ts = pgs['ts'] @@ -150,22 +160,22 @@ def parse_status(self, gexf_file, out_dir=None, remove_gexf=False): output_lines.append(gexf_line) else: if (gexf_line.find(" -1): - #logger.debug("Starting with viz color") + # logger.debug("Starting with viz color") if (node_id is None): raise Exception("wrong order") output_lines.append(colour_dict[node_id]) else: if (gexf_line.find(" - #38345 + # + # 38345 node_id = gexf_line.split()[1].split('=')[1][1:-1] output_lines.append(gexf_line) # each line generate a new file new_gexf = '{0}/{1}.gexf'.format(out_dir, ts) with open(new_gexf, 'w') as fo: for new_line in output_lines: - #fo.write('{0}{1}'.format(new_line, os.linesep)) - #fo.write('{0}{1}'.format(new_line, '\n')) + # fo.write('{0}{1}'.format(new_line, os.linesep)) + # fo.write('{0}{1}'.format(new_line, '\n')) fo.write(new_line) logger.info("GEXF file '{0}' is generated".format(new_gexf)) new_png = new_gexf.split('.gexf')[0] + '.png' @@ -182,7 +192,7 @@ def parse_status(self, gexf_file, out_dir=None, remove_gexf=False): def get_downstream_drop_ids(self, dropspec): if (dropspec['type'] == 'app'): - ds_kw = 'outputs' #down stream key word + ds_kw = 'outputs' # down stream key word elif (dropspec['type'] == 'plain'): ds_kw = 'consumers' else: @@ -197,7 +207,7 @@ def build_node_graph(self): A graph contains all compute nodes and their relationships """ G = pgv.AGraph(strict=False, directed=True) - temp_dict = defaultdict(int) #key - from_to_ip, val - counter + temp_dict = defaultdict(int) # key - from_to_ip, val - counter for i, ip in enumerate(self.node_graph_dict.keys()): G.add_node(ip, shape='rect', label='%d' % i) @@ -224,8 +234,8 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): # convert grep_log_file to csv if (out_dir is None): out_dir = os.path.dirname(gexf_file) - #grep_log_file = '{0}/statelog.txt'.format(out_dir) - #cmd = "" + # grep_log_file = '{0}/statelog.txt'.format(out_dir) + # cmd = "" csv_file = '{0}/csv_file.csv'.format(out_dir) sqlite_file = '{0}/sqlite_file.sqlite'.format(out_dir) @@ -235,7 +245,7 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): with open(csv_file, "w") as fo: for line in alllines: ts = line.split('[DEBUG]')[0].split('dlgNM.log:')[1].strip() - ts = int(dt.strptime(ts,'%Y-%m-%d %H:%M:%S,%f').strftime('%s')) + ts = int(dt.strptime(ts, '%Y-%m-%d %H:%M:%S,%f').strftime('%s')) oid = line.split('oid=')[1].split()[0] state = line.split()[-1] fo.write('{0},{1},{2},{3}'.format(ts, oid, state, os.linesep)) @@ -293,8 +303,8 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): drops = cur.fetchall() cur.close() - #build a dictionary - drop_dict = dict() # key - gnid, value: drop status + # build a dictionary + drop_dict = dict() # key - gnid, value: drop status for drop in drops: gnid = self.oid_gnid_dict[drop[1]] drop_dict[gnid] = drop[2] @@ -325,7 +335,6 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): if (ret[0] != 0): logger.error("Fail to print png from %s to %s: %s" % (last_gexf, new_png, ret[1])) - def build_drop_subgraphs(self, node_range='[0:20]'): pass @@ -338,7 +347,7 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): else: G = nx.Graph() do_subgraph = False - subgraph_dict = defaultdict(list) # k - node-ip, v - a list of graph nodes + subgraph_dict = defaultdict(list) # k - node-ip, v - a list of graph nodes oid_gnid_dict = dict() for i, oid in enumerate(self.pg_spec.keys()): @@ -350,15 +359,15 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): ip = dropspec['node'] subgraph_dict[ip].append(gid) if (dropspec['type'] == 'app'): - G.add_node(gid, shape='rect', label='')#, fixedsize=True, hight=.05, width=.05) - elif (dropspec['type'] == 'plain'): #parallelogram - G.add_node(gid, shape='circle', label='')#, fixedsize=True, hight=.05, width=.05) + G.add_node(gid, shape='rect', label='') # , fixedsize=True, hight=.05, width=.05) + elif (dropspec['type'] == 'plain'): # parallelogram + G.add_node(gid, shape='circle', label='') # , fixedsize=True, hight=.05, width=.05) logger.info("Graph nodes added") for dropspec in self.pg_spec.itervalues(): gid = oid_gnid_dict[dropspec['oid']] if (dropspec['type'] == 'app'): - ds_kw = 'outputs' #down stream key word + ds_kw = 'outputs' # down stream key word elif (dropspec['type'] == 'plain'): ds_kw = 'consumers' else: @@ -372,11 +381,12 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): for i, subgraph_nodes in enumerate(subgraph_dict.values()): # we don't care about the subgraph label or rank subgraph = G.add_subgraph(subgraph_nodes, label='%d' % i, name="cluster_%d" % i, rank="same") - subgraph.graph_attr['rank']='same' + subgraph.graph_attr['rank'] = 'same' logger.info("Subgraph added") return G + if __name__ == '__main__': """ 1. create edge list from 'monitor_g.log' @@ -407,9 +417,9 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): parser.add_option("-d", "--dot_file", action="store", type="string", dest="dot_file", help="output do file", default=None) parser.add_option('-s', '--subgraph', action='store_true', - dest='subgraph', help = 'create subgraph per node', default=False) + dest='subgraph', help='create subgraph per node', default=False) parser.add_option('-e', '--edgelist', action='store_true', - dest='edgelist', help = 'store edge list instead of dot file', default=False) + dest='edgelist', help='store edge list instead of dot file', default=False) parser.add_option("-r", "--grep_log_file", action="store", type="string", dest="grep_log_file", help="grep log file", default=None) @@ -435,7 +445,7 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): sys.exit(1) gp = GraphPlayer(options.graph_path, options.status_path) - #gp.parse_status(options.gexf_file, out_dir=options.gexf_output_dir) + # gp.parse_status(options.gexf_file, out_dir=options.gexf_output_dir) gp.get_state_changes(options.gexf_file, options.grep_log_file, out_dir=options.gexf_output_dir) """ g = gp.build_node_graph() diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 55eb3d199..78de60684 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -23,22 +23,22 @@ Module containing the core DROP classes. """ -from abc import ABCMeta, abstractmethod import base64 import collections import contextlib import errno import heapq import importlib +import inspect import logging import math import os import random +import re import shutil import threading import time -import re -import inspect +from abc import ABCMeta, abstractmethod import six from six import BytesIO @@ -48,27 +48,30 @@ from .event import EventFirer from .exceptions import InvalidDropException, InvalidRelationshipException from .io import OpenMode, FileIO, MemoryIO, NgasIO, ErrorIO, NullIO, ShoreIO -from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking from .meta import dlg_float_param, dlg_int_param, dlg_list_param, \ dlg_string_param, dlg_bool_param, dlg_dict_param -from .reproducibility import constants +from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking # Opt into using per-drop checksum calculation checksum_disabled = 'DLG_DISABLE_CHECKSUM' in os.environ try: from crc32c import crc32 # @UnusedImport + _checksumType = ChecksumTypes.CRC_32C except: from binascii import crc32 # @Reimport - _checksumType = ChecksumTypes.CRC_32 + _checksumType = ChecksumTypes.CRC_32 logger = logging.getLogger(__name__) + class ListAsDict(list): """A list that adds drop UIDs to a set as they get appended to the list""" + def __init__(self, my_set): self.set = my_set + def append(self, drop): super(ListAsDict, self).append(drop) self.set.add(drop.uid) @@ -76,9 +79,10 @@ def append(self, drop): track_current_drop = object_tracking('drop') -#=============================================================================== + +# =============================================================================== # DROP classes follow -#=============================================================================== +# =============================================================================== class AbstractDROP(EventFirer): @@ -196,10 +200,10 @@ def __init__(self, oid, uid, **kwargs): self._streamingConsumers = ListAsDict(self._streamingConsumers_uids) self._refCount = 0 - self._refLock = threading.Lock() + self._refLock = threading.Lock() self._location = None - self._parent = None - self._status = None + self._parent = None + self._status = None self._statusLock = threading.RLock() # Current and target phases. @@ -219,9 +223,9 @@ def __init__(self, oid, uid, **kwargs): # this information. # Note also that the setters of these two properties also allow to set # a value on them, but only if they are None - self._checksum = None + self._checksum = None self._checksumType = None - self._size = None + self._size = None self._merkleRoot = None self._committed = False @@ -272,7 +276,7 @@ def __init__(self, oid, uid, **kwargs): # Expected lifespan for this object, used by to expire them if 'lifespan' in kwargs and 'expireAfterUse' in kwargs: raise InvalidDropException(self, "%r specifies both `lifespan` and `expireAfterUse`" \ - "but they are mutually exclusive" % (self,)) + "but they are mutually exclusive" % (self,)) self._expireAfterUse = self._getArg(kwargs, 'expireAfterUse', False) self._expirationDate = -1 @@ -292,7 +296,7 @@ def __init__(self, oid, uid, **kwargs): # Sub-class initialization; mark ourselves as INITIALIZED after that self.initialize(**kwargs) - self._status = DROPStates.INITIALIZED # no need to use synchronised self.status here + self._status = DROPStates.INITIALIZED # no need to use synchronised self.status here def _extract_attributes(self, **kwargs): @@ -303,7 +307,7 @@ def getmembers(object, predicate=None): yield k, v # Take a class dlg defined parameter class attribute and create an instanced attribute on object - for attr_name, obj in getmembers(self, lambda a: not(inspect.isfunction(a) or isinstance(a, property))): + for attr_name, obj in getmembers(self, lambda a: not (inspect.isfunction(a) or isinstance(a, property))): if isinstance(obj, dlg_float_param): value = kwargs.get(attr_name, obj.default_value) if value is not None: @@ -715,7 +719,7 @@ def status(self, value): return self._status = value - self._fire('status', status = value) + self._fire('status', status=value) @property def parent(self): @@ -733,7 +737,7 @@ def parent(self, parent): logger.warning("A parent is already set in %r, overwriting with new value" % (self,)) if parent: prevParent = self._parent - self._parent = parent # a parent is a container + self._parent = parent # a parent is a container if hasattr(parent, 'addChild') and self not in parent.children: try: parent.addChild(self) @@ -744,7 +748,7 @@ def get_consumers_nodes(self): """ Gets the physical node address(s) of the consumer of this drop. """ - return [cons.node for cons in self._consumers] +\ + return [cons.node for cons in self._consumers] + \ [cons.node for cons in self._streamingConsumers] @property @@ -862,7 +866,8 @@ def producerFinished(self, uid, drop_state): nProd = len(self._producers) if nFinished > nProd: - raise Exception("More producers finished that registered in DROP %r: %d > %d" % (self, nFinished, nProd)) + raise Exception( + "More producers finished that registered in DROP %r: %d > %d" % (self, nFinished, nProd)) elif nFinished == nProd: finished = True @@ -904,7 +909,7 @@ def addStreamingConsumer(self, streamingConsumer, back=True): # Add if not already present if scuid in self._streamingConsumers_uids: return - logger.debug('Adding new streaming streaming consumer for %r: %s' %(self, streamingConsumer)) + logger.debug('Adding new streaming streaming consumer for %r: %s' % (self, streamingConsumer)) self._streamingConsumers.append(streamingConsumer) # Automatic back-reference @@ -980,6 +985,7 @@ def node(self): def dataIsland(self): return self._dataIsland + class PathBasedDrop(object): """Base class for data drops that handle paths (i.e., file and directory drops)""" @@ -1013,6 +1019,7 @@ def get_dir(self, dirname): def path(self): return self._path + class FileDROP(AbstractDROP, PathBasedDrop): """ A DROP that points to data stored in a mounted filesystem. @@ -1124,7 +1131,7 @@ def delete(self): @property def dataURL(self): - hostname = os.uname()[1] # TODO: change when necessary + hostname = os.uname()[1] # TODO: change when necessary return "file://" + hostname + self._path @@ -1156,7 +1163,7 @@ class NgasDROP(AbstractDROP): ngasConnectTimeout = dlg_int_param('ngasConnectTimeout', 2) def initialize(self, **kwargs): - pass + pass def getIO(self): return NgasIO(self.ngasSrv, self.uid, port=self.ngasPort, @@ -1225,7 +1232,6 @@ def initialize(self, **kwargs): # The table this Drop points at self._db_table = kwargs.pop('dbtable') - def getIO(self): # This Drop cannot be accessed directly return ErrorIO() @@ -1243,10 +1249,10 @@ def insert(self, vals): """ with self._connection() as c: with self._cursor(c) as cur: - # vals is a dictionary, its keys are the column names and its # values are the values to insert - sql = "INSERT into %s (%s) VALUES (%s)" % (self._db_table, ','.join(vals.keys()), ','.join(['{}']*len(vals))) + sql = "INSERT into %s (%s) VALUES (%s)" % ( + self._db_table, ','.join(vals.keys()), ','.join(['{}'] * len(vals))) sql, vals = prepare_sql(sql, self._db_drv.paramstyle, list(vals.values())) logger.debug('Executing SQL with parameters: %s / %r', sql, vals) cur.execute(sql, vals) @@ -1298,9 +1304,9 @@ def initialize(self, **kwargs): super(ContainerDROP, self).initialize(**kwargs) self._children = [] - #=========================================================================== + # =========================================================================== # No data-related operations should actually be called in Container DROPs - #=========================================================================== + # =========================================================================== def getIO(self): return ErrorIO() @@ -1342,7 +1348,7 @@ def exists(self): if self._children: # TODO: Or should it be all()? Depends on what the exact contract of # "exists" is - return any([c.exists() for c in self._children]) + return any([c.exists() for c in self._children]) return True @@ -1385,13 +1391,13 @@ def delete(self): def exists(self): return os.path.isdir(self._path) -#=============================================================================== + +# =============================================================================== # AppDROP classes follow -#=============================================================================== +# =============================================================================== class AppDROP(ContainerDROP): - ''' An AppDROP is a DROP representing an application that reads data from one or more DROPs (its inputs), and writes data onto one or more @@ -1428,12 +1434,12 @@ def initialize(self, **kwargs): # Input and output objects are later referenced by their *index* # (relative to the order in which they were added to this object) # Therefore we use an ordered dict to keep the insertion order. - self._inputs = collections.OrderedDict() + self._inputs = collections.OrderedDict() self._outputs = collections.OrderedDict() # Same as above, only that these correspond to the 'streaming' version # of the consumers - self._streamingInputs = collections.OrderedDict() + self._streamingInputs = collections.OrderedDict() # An AppDROP has a second, separate state machine indicating its # execution status. @@ -1629,7 +1635,7 @@ def dropCompleted(self, uid, drop_state): if (error_len + ok_len) == n_eff_inputs: # calculate the number of errors that have already occurred - percent_failed = math.floor((error_len/float(n_eff_inputs)) * 100) + percent_failed = math.floor((error_len / float(n_eff_inputs)) * 100) logger.debug("Error on inputs for %r: %d/%d", self, percent_failed, self.input_error_threshold) @@ -1639,7 +1645,7 @@ def dropCompleted(self, uid, drop_state): self, percent_failed, self.input_error_threshold) self.execStatus = AppDROPStates.ERROR - self.status = DROPStates.ERROR + self.status = DROPStates.ERROR self._notifyAppIsFinished() else: self.async_execute() @@ -1702,11 +1708,13 @@ def run(self): def exists(self): return True + class BarrierAppDROP(InputFiredAppDROP): """ A BarrierAppDROP is an InputFireAppDROP that waits for all its inputs to complete, effectively blocking the flow of the graph execution. """ + def initialize(self, **kwargs): # Blindly override existing value if any kwargs['n_effective_inputs'] = -1 @@ -1718,13 +1726,13 @@ def initialize(self, **kwargs): # (e.g., one uses `addConsumer` to add a DROPLinkeType.CONSUMER DROP into # another) LINKTYPE_1TON_APPEND_METHOD = { - DROPLinkType.CONSUMER: 'addConsumer', + DROPLinkType.CONSUMER: 'addConsumer', DROPLinkType.STREAMING_CONSUMER: 'addStreamingConsumer', - DROPLinkType.INPUT: 'addInput', - DROPLinkType.STREAMING_INPUT: 'addStreamingInput', - DROPLinkType.OUTPUT: 'addOutput', - DROPLinkType.CHILD: 'addChild', - DROPLinkType.PRODUCER: 'addProducer' + DROPLinkType.INPUT: 'addInput', + DROPLinkType.STREAMING_INPUT: 'addStreamingInput', + DROPLinkType.OUTPUT: 'addOutput', + DROPLinkType.CHILD: 'addChild', + DROPLinkType.PRODUCER: 'addProducer' } # Same as above, but for N-to-1 relationships, in which case we indicate not a @@ -1734,13 +1742,13 @@ def initialize(self, **kwargs): } LINKTYPE_1TON_BACK_APPEND_METHOD = { - DROPLinkType.CONSUMER: 'addInput', + DROPLinkType.CONSUMER: 'addInput', DROPLinkType.STREAMING_CONSUMER: 'addStreamingInput', - DROPLinkType.INPUT: 'addConsumer', - DROPLinkType.STREAMING_INPUT: 'addStreamingConsumer', - DROPLinkType.OUTPUT: 'addProducer', - DROPLinkType.CHILD: 'setParent', - DROPLinkType.PRODUCER: 'addOutput' + DROPLinkType.INPUT: 'addConsumer', + DROPLinkType.STREAMING_INPUT: 'addStreamingConsumer', + DROPLinkType.OUTPUT: 'addProducer', + DROPLinkType.CHILD: 'setParent', + DROPLinkType.PRODUCER: 'addOutput' } LINKTYPE_NTO1_BACK_APPEND_METHOD = { diff --git a/daliuge-runtime/dlg/droputils.py b/daliuge-runtime/dlg/droputils.py index 45bef91d1..8865b2166 100644 --- a/daliuge-runtime/dlg/droputils.py +++ b/daliuge-runtime/dlg/droputils.py @@ -31,30 +31,32 @@ import six +from . import common from .ddap_protocol import DROPStates from .drop import AppDROP from .io import IOForURL, OpenMode -from . import common - logger = logging.getLogger(__name__) # Used to check whether a command specifies via UID reference the path or # data URL of an input or output -indexed_ipath_pattern = re.compile(r".*%i\[.+\].*") -indexed_opath_pattern = re.compile(r".*%o\[.+\].*") +indexed_ipath_pattern = re.compile(r".*%i\[.+\].*") +indexed_opath_pattern = re.compile(r".*%o\[.+\].*") indexed_idataurl_pattern = re.compile(r".*%iDataURL\[.+\].*") indexed_odataurl_pattern = re.compile(r".*%oDataURL\[.+\].*") + class EvtConsumer(object): ''' Small utility class that sets the internal flag of the given threading.Event object when consuming a DROP. Used throughout the tests as a barrier to wait until all DROPs of a given graph have executed. ''' + def __init__(self, evt, expected_states=[]): self._evt = evt self._expected_states = expected_states or (DROPStates.COMPLETED, DROPStates.ERROR) + def handleEvent(self, e): if e.status in self._expected_states: self._evt.set() @@ -81,12 +83,14 @@ def __init__(self, test, drops, timeout=1, expected_states=[]): self._test = test self._timeout = timeout self._evts = [] + def __enter__(self): for drop in self._drops: evt = threading.Event() drop.subscribe(EvtConsumer(evt, expected_states=self._expected_states), 'status') self._evts.append(evt) return self + def __exit__(self, typ, value, tb): if typ is not None: traceback.print_tb(tb) @@ -112,6 +116,7 @@ def allDropContents(drop, bufsize=4096): drop.close(desc) return buf.getvalue() + def copyDropContents(source, target, bufsize=4096): ''' Manually copies data from one DROP into another, in bufsize steps @@ -124,6 +129,7 @@ def copyDropContents(source, target, bufsize=4096): buf = read(desc, bufsize) source.close(desc) + def getUpstreamObjects(drop): """ Returns a list of all direct "upstream" DROPs for the given @@ -144,6 +150,7 @@ def getUpstreamObjects(drop): upObjs += drop.producers return upObjs + def getDownstreamObjects(drop): """ Returns a list of all direct "downstream" DROPs for the given @@ -163,15 +170,17 @@ def getDownstreamObjects(drop): downObjs += drop.streamingConsumers return downObjs + def getLeafNodes(nodes): """ Returns a list of all the "leaf nodes" of the graph pointed by `nodes`. `nodes` is either a single DROP, or a list of DROPs. """ nodes = listify(nodes) - return [drop for drop,_ in breadFirstTraverse(nodes) if not getDownstreamObjects(drop)] + return [drop for drop, _ in breadFirstTraverse(nodes) if not getDownstreamObjects(drop)] + -def depthFirstTraverse(node, visited = []): +def depthFirstTraverse(node, visited=[]): """ Depth-first iterator for a DROP graph. @@ -191,6 +200,7 @@ def depthFirstTraverse(node, visited = []): for x in depthFirstTraverse(drop, visited): yield x + def breadFirstTraverse(toVisit): """ Breadth-first iterator for a DROP graph. @@ -209,7 +219,6 @@ def breadFirstTraverse(toVisit): # See how many arguments we should used when calling func while toVisit: - # Pay the node a visit node = toVisit.popleft() dependencies = getDownstreamObjects(node) @@ -220,6 +229,7 @@ def breadFirstTraverse(toVisit): visited.update(next_visits) toVisit += next_visits + def listify(o): """ If `o` is already a list return it as is; if `o` is a tuple returns a list @@ -232,6 +242,7 @@ def listify(o): return list(o) return [o] + class DROPFile(object): """ A file-like object (currently only supporting the read() operation, more to @@ -249,6 +260,7 @@ class DROPFile(object): Objects of this class can also be used in a `with` context. """ + def __init__(self, drop): self._drop = drop self._io = IOForURL(drop.dataURL) @@ -296,6 +308,7 @@ def read(self, size=4096): def __enter__(self): self.open() return self + def __exit__(self, typ, value, traceback): self.close() @@ -303,6 +316,7 @@ def __del__(self): if not self._isClosed: self.close() + def has_path(x): """Returns `True` if `x` has a `path` attribute""" try: @@ -311,6 +325,7 @@ def has_path(x): except: return False + def replace_path_placeholders(cmd, inputs, outputs): """ Replaces any placeholder found in ``cmd`` with the path of the respective @@ -326,11 +341,11 @@ def replace_path_placeholders(cmd, inputs, outputs): logger.debug('Replacing cmd %s with placeholders with I/O uids: %r, %r', cmd, inputs.keys(), outputs.keys()) - for x,i in enumerate(inputs.values()): + for x, i in enumerate(inputs.values()): pathRef = "%%i%d" % (x,) if pathRef in cmd: cmd = cmd.replace(pathRef, i.path) - for x,o in enumerate(outputs.values()): + for x, o in enumerate(outputs.values()): pathRef = "%%o%d" % (x) if pathRef in cmd: cmd = cmd.replace(pathRef, o.path) @@ -348,6 +363,7 @@ def replace_path_placeholders(cmd, inputs, outputs): return cmd + def replace_dataurl_placeholders(cmd, inputs, outputs): """ Replaces any placeholder found in ``cmd`` with the dataURL property of the @@ -364,20 +380,20 @@ def replace_dataurl_placeholders(cmd, inputs, outputs): # bind their data via volumes into the docker container. Instead they # communicate their dataURL via command-line replacement - for x,i in enumerate(inputs.values()): + for x, i in enumerate(inputs.values()): dataUrlRef = "%%iDataURL%d" % (x,) if dataUrlRef in cmd: cmd = cmd.replace(dataUrlRef, i.dataURL) - for x,o in enumerate(outputs.values()): + for x, o in enumerate(outputs.values()): dataUrlRef = "%%oDataURL%d" % (x,) if dataUrlRef in cmd: cmd = cmd.replace(dataUrlRef, o.dataURL) - for uid,i in inputs.items(): + for uid, i in inputs.items(): dataURLRef = "%%iDataURL[%s]" % (uid,) if dataURLRef in cmd: cmd = cmd.replace(dataURLRef, i.dataURL) - for uid,o in outputs.items(): + for uid, o in outputs.items(): dataURLRef = "%%oDataURL[%s]" % (uid,) if dataURLRef in cmd: cmd = cmd.replace(dataUrlRef, o.dataURL) @@ -386,6 +402,7 @@ def replace_dataurl_placeholders(cmd, inputs, outputs): return cmd + # Easing the transition from single- to multi-package get_leaves = common.get_leaves -get_roots = common.get_roots \ No newline at end of file +get_roots = common.get_roots diff --git a/daliuge-runtime/dlg/event.py b/daliuge-runtime/dlg/event.py index 5c4b16e3c..afc70d4a8 100644 --- a/daliuge-runtime/dlg/event.py +++ b/daliuge-runtime/dlg/event.py @@ -23,9 +23,9 @@ import collections import logging - logger = logging.getLogger(__name__) + class Event(object): """ An event sent through the DALiuGE framework. @@ -42,6 +42,7 @@ def __init__(self): def __repr__(self, *args, **kwargs): return '' % (self.__dict__) + class EventFirer(object): """ An object that fires events. @@ -107,4 +108,4 @@ def _fireEvent(self, eventType, **attrs): setattr(e, k, v) for l in listeners: - l.handleEvent(e) \ No newline at end of file + l.handleEvent(e) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index 25e1690ec..ae511cf2a 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -37,17 +37,17 @@ from .exceptions import InvalidGraphException from .json_drop import JsonDROP - STORAGE_TYPES = { 'memory': InMemoryDROP, - 'file' : FileDROP, - 'ngas' : NgasDROP, - 'null' : NullDROP, - 'json' : JsonDROP, + 'file': FileDROP, + 'ngas': NgasDROP, + 'null': NullDROP, + 'json': JsonDROP, } try: from .s3_drop import S3DROP + STORAGE_TYPES['s3'] = S3DROP except ImportError: pass @@ -55,13 +55,13 @@ # Dictionary for the key used to store 1-to-N relationships between DROPs # in the the DROP specification format __TOMANY = { - DROPLinkType.CONSUMER: 'consumers', + DROPLinkType.CONSUMER: 'consumers', DROPLinkType.STREAMING_CONSUMER: 'streamingConsumers', - DROPLinkType.INPUT: 'inputs', - DROPLinkType.STREAMING_INPUT: 'streamingInputs', - DROPLinkType.OUTPUT: 'outputs', - DROPLinkType.CHILD: 'children', - DROPLinkType.PRODUCER: 'producers', + DROPLinkType.INPUT: 'inputs', + DROPLinkType.STREAMING_INPUT: 'streamingInputs', + DROPLinkType.OUTPUT: 'outputs', + DROPLinkType.CHILD: 'children', + DROPLinkType.PRODUCER: 'producers', } # Same for above, but for n-to-1 relationships @@ -70,11 +70,12 @@ } # Both also contain the reverse mapping -__TOMANY.update({v:k for k,v in __TOMANY.items()}) -__TOONE.update({v:k for k,v in __TOONE.items()}) +__TOMANY.update({v: k for k, v in __TOMANY.items()}) +__TOONE.update({v: k for k, v in __TOONE.items()}) logger = logging.getLogger(__name__) + def addLink(linkType, lhDropSpec, rhOID, force=False): """ Adds a link from `lhDropSpec` to point to `rhOID`. The link type (e.g., a @@ -159,12 +160,14 @@ def removeUnmetRelationships(dropSpecList): return unmetRelationships + def check_dropspec(n, dropSpec): if 'oid' not in dropSpec: raise InvalidGraphException("Drop #%d is missing its 'oid' argument: %r" % (n, dropSpec)) if 'type' not in dropSpec: raise InvalidGraphException("Drop %s is missing its 'type' argument" % (dropSpec['oid'])) + def loadDropSpecs(dropSpecList): """ Loads the DROP definitions from `dropSpectList`, checks that @@ -176,8 +179,7 @@ def loadDropSpecs(dropSpecList): # Step #1: Check the DROP specs and collect them dropSpecs = {} - for n,dropSpec in enumerate(dropSpecList): - + for n, dropSpec in enumerate(dropSpecList): # 'type' and 'oit' are mandatory check_dropspec(n, dropSpec) dropType = dropSpec['type'] @@ -199,7 +201,7 @@ def loadDropSpecs(dropSpecList): # relationship list but doesn't exist in the list of DROPs for oid in dropSpec[rel]: dropSpecs[oid] - # N-1 relationships + # N-1 relationships elif rel in __TOONE: # See comment above dropSpecs[dropSpec[rel]] @@ -207,15 +209,14 @@ def loadDropSpecs(dropSpecList): # Done! return dropSpecs -def createGraphFromDropSpecList(dropSpecList, session=None): +def createGraphFromDropSpecList(dropSpecList, session=None): logger.debug("Found %d DROP definitions", len(dropSpecList)) # Step #1: create the actual DROPs drops = collections.OrderedDict() logger.info("Creating %d drops", len(dropSpecList)) - for n,dropSpec in enumerate(dropSpecList): - + for n, dropSpec in enumerate(dropSpecList): check_dropspec(n, dropSpec) dropType = dropSpec.pop('type') @@ -262,9 +263,10 @@ def createGraphFromDropSpecList(dropSpecList, session=None): return roots + def _createPlain(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) # 'storage' is mandatory storageType = STORAGE_TYPES[dropSpec['storage']] @@ -272,9 +274,10 @@ def _createPlain(dropSpec, dryRun=False, session=None): return return storageType(oid, uid, dlg_session=session, **kwargs) + def _createContainer(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) # if no 'container' is specified, we default to ContainerDROP if 'container' in dropSpec: @@ -285,7 +288,7 @@ def _createContainer(dropSpec, dryRun=False, session=None): if parts[0] == 'dfms': parts[0] = 'dlg' - module = importlib.import_module('.'.join(parts[:-1])) + module = importlib.import_module('.'.join(parts[:-1])) containerType = getattr(module, parts[-1]) else: containerType = ContainerDROP @@ -295,28 +298,30 @@ def _createContainer(dropSpec, dryRun=False, session=None): return containerType(oid, uid, dlg_session=session, **kwargs) + def _createSocket(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) if dryRun: return return SocketListenerApp(oid, uid, dlg_session=session, **kwargs) + def _createApp(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) del kwargs['app'] appName = dropSpec['app'] - parts = appName.split('.') + parts = appName.split('.') # Support old "dfms..." package names (pre-Oct2017) if parts[0] == 'dfms': parts[0] = 'dlg' try: - module = importlib.import_module('.'.join(parts[:-1])) + module = importlib.import_module('.'.join(parts[:-1])) appType = getattr(module, parts[-1]) except (ImportError, AttributeError): raise InvalidGraphException("drop %s specifies non-existent application: %s" % (oid, appName,)) @@ -325,6 +330,7 @@ def _createApp(dropSpec, dryRun=False, session=None): return return appType(oid, uid, dlg_session=session, **kwargs) + def _getIds(dropSpec): # uid is copied from oid if not explicitly given oid = dropSpec['oid'] @@ -333,6 +339,7 @@ def _getIds(dropSpec): uid = dropSpec['uid'] return oid, uid + def _getKwargs(dropSpec): kwargs = dict(dropSpec) del kwargs['oid'] @@ -340,6 +347,7 @@ def _getKwargs(dropSpec): del kwargs['uid'] return kwargs + __CREATION_FUNCTIONS = { 'plain': _createPlain, 'container': _createContainer, diff --git a/daliuge-runtime/dlg/io.py b/daliuge-runtime/dlg/io.py index 2809717dc..5c225a259 100644 --- a/daliuge-runtime/dlg/io.py +++ b/daliuge-runtime/dlg/io.py @@ -19,22 +19,23 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # -from abc import abstractmethod, ABCMeta import logging import os +from abc import abstractmethod, ABCMeta -from six import BytesIO import six.moves.urllib.parse as urlparse # @UnresolvedImport +from six import BytesIO from . import ngaslite from . import shoreClient - logger = logging.getLogger(__name__) + class OpenMode: OPEN_WRITE, OPEN_READ = range(2) + class DataIO(object): """ A class used to read/write data stored in a particular kind of storage in an @@ -115,16 +116,21 @@ def delete(self): """ @abstractmethod - def _open(self, **kwargs): pass + def _open(self, **kwargs): + pass @abstractmethod - def _read(self, count, **kwargs): pass + def _read(self, count, **kwargs): + pass @abstractmethod - def _write(self, data, **kwargs): pass + def _write(self, data, **kwargs): + pass @abstractmethod - def _close(self, **kwargs): pass + def _close(self, **kwargs): + pass + class NullIO(DataIO): """ @@ -149,6 +155,7 @@ def exists(self): def delete(self): pass + class ErrorIO(DataIO): """ An DataIO method that throws exceptions if any of its methods is invoked @@ -172,6 +179,7 @@ def exists(self): def delete(self): raise NotImplementedError() + class MemoryIO(DataIO): """ A DataIO class that reads/write from/into the BytesIO object given at @@ -206,6 +214,7 @@ def exists(self): def delete(self): self._buf.close() + class FileIO(DataIO): def __init__(self, filename, **kwargs): @@ -236,9 +245,10 @@ def exists(self): def delete(self): os.unlink(self._fnm) + class ShoreIO(DataIO): - def __init__(self, doid, column, row, rows = 1, address = None, **kwargs): + def __init__(self, doid, column, row, rows=1, address=None, **kwargs): super(ShoreIO, self).__init__() self._doid = doid self._column = column @@ -276,8 +286,6 @@ def delete(self): pass - - class NgasIO(DataIO): ''' A DROP whose data is finally stored into NGAS. Since NGAS doesn't @@ -285,7 +293,7 @@ class NgasIO(DataIO): in a file on the local filesystem and then move it to the NGAS destination ''' - def __init__(self, hostname, fileId, port = 7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): + def __init__(self, hostname, fileId, port=7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): # Check that we actually have the NGAMS client libraries try: @@ -295,12 +303,12 @@ def __init__(self, hostname, fileId, port = 7777, ngasConnectTimeout=2, ngasTime raise super(NgasIO, self).__init__() - self._ngasSrv = hostname - self._ngasPort = port + self._ngasSrv = hostname + self._ngasPort = port self._ngasConnectTimeout = ngasConnectTimeout - self._ngasTimeout = ngasTimeout - self._fileId = fileId - self._length = length + self._ngasTimeout = ngasTimeout + self._fileId = fileId + self._length = length def _getClient(self): from ngamsPClient import ngamsPClient # @UnresolvedImport @@ -320,10 +328,10 @@ def _close(self, **kwargs): client = self._desc if self._mode == OpenMode.OPEN_WRITE: reply, msg, _, _ = client._httpPost( - client.getHost(), client.getPort(), 'QARCHIVE', - 'application/octet-stream', dataRef=self._buf, - pars=[['filename',self._fileId]], dataSource='BUFFER', - dataSize=self._writtenDataSize) + client.getHost(), client.getPort(), 'QARCHIVE', + 'application/octet-stream', dataRef=self._buf, + pars=[['filename', self._fileId]], dataSource='BUFFER', + dataSize=self._writtenDataSize) self._buf = None if reply != 200: # Probably msg is not enough, we need to unpack the status XML doc @@ -349,7 +357,8 @@ def exists(self): return status.getStatus() == ngamsLib.ngamsCore.NGAMS_SUCCESS def delete(self): - pass # We never delete stuff from NGAS + pass # We never delete stuff from NGAS + class NgasLiteIO(DataIO): ''' @@ -361,14 +370,14 @@ class NgasLiteIO(DataIO): that this class will throw an error if its `exists` method is invoked. ''' - def __init__(self, hostname, fileId, port = 7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): + def __init__(self, hostname, fileId, port=7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): super(NgasLiteIO, self).__init__() - self._ngasSrv = hostname - self._ngasPort = port + self._ngasSrv = hostname + self._ngasPort = port self._ngasConnectTimeout = ngasConnectTimeout - self._ngasTimeout = ngasTimeout - self._fileId = fileId - self._length = length + self._ngasTimeout = ngasTimeout + self._fileId = fileId + self._length = length def _getClient(self): from ngamsPClient import ngamsPClient # @UnresolvedImport @@ -376,7 +385,8 @@ def _getClient(self): def _open(self, **kwargs): if self._mode == OpenMode.OPEN_WRITE: - return ngaslite.beingArchive(self._ngasSrv, self._fileId, port=self._ngasPort, timeout=self._ngasTimeout, length=self._length) + return ngaslite.beingArchive(self._ngasSrv, self._fileId, port=self._ngasPort, timeout=self._ngasTimeout, + length=self._length) return ngaslite.retrieve(self._ngasSrv, self._fileId, port=self._ngasPort, timeout=self._ngasTimeout) def _close(self, **kwargs): @@ -399,7 +409,8 @@ def exists(self): raise NotImplementedError("This method is not supported by this class") def delete(self): - pass # We never delete stuff from NGAS + pass # We never delete stuff from NGAS + def IOForURL(url): """ @@ -412,7 +423,7 @@ def IOForURL(url): hostname = url.netloc filename = url.path if hostname == 'localhost' or hostname == '127.0.0.1' or \ - hostname == os.uname()[1]: + hostname == os.uname()[1]: io = FileIO(filename) elif url.scheme == 'null': io = NullIO() diff --git a/daliuge-runtime/dlg/lifecycle/__init__.py b/daliuge-runtime/dlg/lifecycle/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/dlg/lifecycle/__init__.py +++ b/daliuge-runtime/dlg/lifecycle/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/dlg/lifecycle/dlm.py b/daliuge-runtime/dlg/lifecycle/dlm.py index fa7ae3a60..65b9cd21a 100644 --- a/daliuge-runtime/dlg/lifecycle/dlm.py +++ b/daliuge-runtime/dlg/lifecycle/dlm.py @@ -130,14 +130,15 @@ from ..ddap_protocol import DROPStates, DROPPhases, AppDROPStates from ..drop import ContainerDROP - logger = logging.getLogger(__name__) + class DataLifecycleManagerBackgroundTask(threading.Thread): ''' A thread that periodically runs some of the methods on the given DLM until signaled to stop ''' + def __init__(self, dlm, period, finishedEvent): threading.Thread.__init__(self, name="DLMBackgroundTask") self._dlm = dlm @@ -153,6 +154,7 @@ def run(self): break self.doTask(dlm) + class DROPChecker(DataLifecycleManagerBackgroundTask): ''' A thread that performs several checks on existing DROPs @@ -166,6 +168,7 @@ def doTask(self, dlm): # if they are not found dlm.deleteLostDrops() + class DROPGarbageCollector(DataLifecycleManagerBackgroundTask): ''' A thread that performs "garbage collection" of DROPs; that is, it physically @@ -176,6 +179,7 @@ def doTask(self, dlm): # The names says it all dlm.deleteExpiredDrops() + class DROPMover(DataLifecycleManagerBackgroundTask): ''' A thread that automatically moves DROPs between layers of the HSM. @@ -187,6 +191,7 @@ class DROPMover(DataLifecycleManagerBackgroundTask): def doTask(self, dlm): dlm.moveDropsAround() + class DropEventListener(object): def __init__(self, dlm): @@ -199,6 +204,7 @@ def handleEvent(self, event): if event.status == DROPStates.COMPLETED: self._dlm.handleCompletedDrop(event.uid) + class DataLifecycleManager(object): def __init__(self, **kwargs): @@ -216,7 +222,7 @@ def __init__(self, **kwargs): if 'checkPeriod' in kwargs: self._checkPeriod = float(kwargs['checkPeriod']) - self._cleanupPeriod = 10*self._checkPeriod + self._cleanupPeriod = 10 * self._checkPeriod if 'cleanupPeriod' in kwargs: self._cleanupPeriod = float(kwargs['cleanupPeriod']) @@ -254,7 +260,6 @@ def __enter__(self): def __exit__(self, typ, value, traceback): self.cleanup() - def _deleteDrop(self, drop): logger.debug("Deleting DROP %r", drop) drop.delete() @@ -283,12 +288,12 @@ def expireCompletedDrops(self): # (if no lifespan was specified for the DROP, its expiration # date will be -1 and it will be skipped) elif drop.expirationDate == -1 or \ - now <= drop.expirationDate: + now <= drop.expirationDate: continue if drop.isBeingRead(): logger.info("%r has expired but is currently being read, " \ - "will skip expiration for the time being", drop) + "will skip expiration for the time being", drop) continue # Finally! @@ -338,7 +343,8 @@ def deleteLostDrops(self): definitelyLost = True if definitelyLost: - logger.error("No available replica found for DROP %s/%s, the data is DEFINITELY LOST", drop.oid, drop.uid) + logger.error("No available replica found for DROP %s/%s, the data is DEFINITELY LOST", drop.oid, + drop.uid) drop.phase = DROPPhases.LOST self._reg.setDropPhase(drop, drop.phase) @@ -491,7 +497,8 @@ def getDropUids(self, drop): def _replicate(self, drop, store): # Dummy, but safe, new UID - newUid = 'uid:' + ''.join([random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10)]) + newUid = 'uid:' + ''.join( + [random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10)]) logger.debug('Creating new DROP with uid %s from %r', newUid, drop) @@ -501,4 +508,4 @@ def _replicate(self, drop, store): logger.debug('%r successfully replicated to %r', drop, newDrop) - return newDrop, newUid \ No newline at end of file + return newDrop, newUid diff --git a/daliuge-runtime/dlg/lifecycle/hsm/__init__.py b/daliuge-runtime/dlg/lifecycle/hsm/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/dlg/lifecycle/hsm/__init__.py +++ b/daliuge-runtime/dlg/lifecycle/hsm/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/dlg/lifecycle/hsm/manager.py b/daliuge-runtime/dlg/lifecycle/hsm/manager.py index c82fde11e..31330e2e1 100644 --- a/daliuge-runtime/dlg/lifecycle/hsm/manager.py +++ b/daliuge-runtime/dlg/lifecycle/hsm/manager.py @@ -30,9 +30,9 @@ from ..hsm import store - logger = logging.getLogger(__name__) + class HierarchicalStorageManager(object): def __init__(self): @@ -51,4 +51,4 @@ def getSlowestStore(self): """ :return store.AbstractStore: """ - return self._stores[-1] \ No newline at end of file + return self._stores[-1] diff --git a/daliuge-runtime/dlg/lifecycle/hsm/store.py b/daliuge-runtime/dlg/lifecycle/hsm/store.py index b5892bdd2..7ab929004 100644 --- a/daliuge-runtime/dlg/lifecycle/hsm/store.py +++ b/daliuge-runtime/dlg/lifecycle/hsm/store.py @@ -27,18 +27,18 @@ @author: rtobar ''' -from abc import ABCMeta, abstractmethod import json import logging import os +from abc import ABCMeta, abstractmethod import psutil from ...drop import FileDROP, InMemoryDROP, NgasDROP - logger = logging.getLogger(__name__) + class AbstractStore(object): """ The abstract store implementation, see the subclasses for details @@ -58,7 +58,7 @@ def updateSpaces(self): if logger.isEnabledFor(logging.DEBUG): avail = self.getAvailableSpace() total = self.getTotalSpace() - perc = avail*100./total + perc = avail * 100. / total logger.debug("Available/Total space on %s: %d/%d (%.2f %%)" % (self, avail, total, perc)) pass @@ -88,6 +88,7 @@ def createDrop(self, oid, uid, **kwargs): def _updateSpaces(self): pass + class FileSystemStore(AbstractStore): """ A filesystem store implementation. It requires a mount point at construction @@ -95,6 +96,7 @@ class FileSystemStore(AbstractStore): device fully. It creates FileDROPs that live directly in the root of the filesystem, and monitors the usage of the filesystem. """ + def __init__(self, mountPoint, savingDir=None): super(FileSystemStore, self).__init__() @@ -121,7 +123,7 @@ def _updateSpaces(self): fragmentSize = stat.f_bsize totalSpace = blocks * fragmentSize - availableSpace=freeBlocks * blockSize + availableSpace = freeBlocks * blockSize self._setTotalSpace(totalSpace) self._setAvailableSpace(availableSpace) @@ -132,6 +134,7 @@ def createDrop(self, oid, uid, **kwargs): def __str__(self): return self._mountPoint + class MemoryStore(AbstractStore): """ A store that uses RAM memory as its storage mechanism. It creates @@ -153,11 +156,13 @@ def createDrop(self, oid, uid, **kwargs): def __str__(self): return 'Memory' + class NgasStore(AbstractStore): """ A store that a given NGAS server as its storage mechanism. It creates NgasDROPs and monitors the disks usage of the NGAS system. """ + def __init__(self, host=None, port=None, initialCheck=True): try: @@ -190,7 +195,7 @@ def _updateSpaces(self): # col14 = bytes_stored totalAvailable += float(disk['col13']) totalStored += int(disk['col14']) - totalAvailable *= 1024**2 # to bytes + totalAvailable *= 1024 ** 2 # to bytes # TODO: Check if these computations are correct, I'm not sure if the # quantities stored by NGAS should be interpreted like this, or @@ -199,7 +204,7 @@ def _updateSpaces(self): self._setAvailableSpace(totalAvailable) def createDrop(self, oid, uid, **kwargs): - kwargs['ngasSrv'] = self._host + kwargs['ngasSrv'] = self._host kwargs['ngasPort'] = self._port return NgasDROP(oid, uid, **kwargs) @@ -210,6 +215,7 @@ def _getClient(self): def __str__(self): return "NGAS@%s:%d" % (self._host, self._port) + class DirectoryStore(AbstractStore): """ A store similar to the FileSystemStore that doesn't actually act on @@ -234,10 +240,11 @@ def __init__(self, dirName, initialize=False): sizeFile = os.path.join(dirName, self.__SIZE_FILE) if not initialize and not os.path.isfile(sizeFile): - raise Exception("No %s file under %s, cannot determine available space for DirectoryStore" % (self.__SIZE_FILE, dirName)) + raise Exception("No %s file under %s, cannot determine available space for DirectoryStore" % ( + self.__SIZE_FILE, dirName)) else: # Should be used only for testing - size = 1024**3 + size = 1024 ** 3 logger.info('Initializing %s with size %d. THIS SHOULD ONLY BE USED DURING TESTING', sizeFile, size) self.prepareDirectory(dirName, size) @@ -280,4 +287,4 @@ def prepareDirectory(dirName, size): f.write(str(size)) def __str__(self): - return "dir:%s" % (self._dirName) \ No newline at end of file + return "dir:%s" % (self._dirName) diff --git a/daliuge-runtime/dlg/lifecycle/registry.py b/daliuge-runtime/dlg/lifecycle/registry.py index 477712430..524ae0c5d 100644 --- a/daliuge-runtime/dlg/lifecycle/registry.py +++ b/daliuge-runtime/dlg/lifecycle/registry.py @@ -31,26 +31,27 @@ @author: rtobar ''' -from abc import abstractmethod, ABCMeta import importlib import logging import time +from abc import abstractmethod, ABCMeta from ..ddap_protocol import DROPPhases from ..utils import prepare_sql - logger = logging.getLogger(__name__) + class DROP(object): - oid = None - phase = DROPPhases.GAS - instances = [] + oid = None + phase = DROPPhases.GAS + instances = [] accessTimes = [] + class DROPInstance(object): - oid = None - uid = None + oid = None + uid = None storage = None @@ -106,11 +107,12 @@ def _checkDropIsInRegistry(self, oid): if not oid in self._drops: raise Exception('DROP %s is not present in the registry' % (oid)) + class InMemoryRegistry(Registry): def __init__(self): super(InMemoryRegistry, self).__init__() - self._drops= {} + self._drops = {} def addDrop(self, drop): ''' @@ -118,8 +120,8 @@ def addDrop(self, drop): ''' # Check that the DROP is not in the registry dropRow = DROP() - dropRow.oid = drop.oid - dropRow.phase = drop.phase + dropRow.oid = drop.oid + dropRow.phase = drop.phase dropRow.instances = {drop.uid: drop} self._drops[dropRow.oid] = dropRow @@ -150,6 +152,7 @@ def getLastAccess(self, oid): else: return -1 + class RDBMSRegistry(Registry): def __init__(self, dbModuleName, *connArgs): @@ -219,7 +222,8 @@ def addDrop(self, drop, conn=None): def addDropInstance(self, drop, conn=None): with self.transactional(self, conn) as conn: cur = conn.cursor() - self.execute(cur, 'INSERT INTO dlg_dropinstance (oid, uid, dataRef) VALUES ({0},{1},{2})', (drop.oid, drop.uid, drop.dataURL)) + self.execute(cur, 'INSERT INTO dlg_dropinstance (oid, uid, dataRef) VALUES ({0},{1},{2})', + (drop.oid, drop.uid, drop.dataURL)) cur.close() def getDropUids(self, drop, conn=None): @@ -239,15 +243,18 @@ def setDropPhase(self, drop, phase, conn=None): def recordNewAccess(self, oid, conn=None): with self.transactional(self, conn) as conn: cur = conn.cursor() - self.execute(cur, 'INSERT INTO dlg_dropaccesstime (oid, accessTime) VALUES ({0},{1})', (oid, self._dbmod.TimestampFromTicks(time.time()))) + self.execute(cur, 'INSERT INTO dlg_dropaccesstime (oid, accessTime) VALUES ({0},{1})', + (oid, self._dbmod.TimestampFromTicks(time.time()))) cur.close() def getLastAccess(self, oid, conn=None): with self.transactional(self, conn) as conn: cur = conn.cursor() - self.execute(cur, 'SELECT accessTime FROM dlg_dropaccesstime WHERE oid = {0} ORDER BY accessTime DESC LIMIT 1', (oid,)) + self.execute(cur, + 'SELECT accessTime FROM dlg_dropaccesstime WHERE oid = {0} ORDER BY accessTime DESC LIMIT 1', + (oid,)) row = cur.fetchone() cur.close() if row is None: return -1 - return row[0] \ No newline at end of file + return row[0] diff --git a/daliuge-runtime/dlg/manager/client.py b/daliuge-runtime/dlg/manager/client.py index 0a0c16dab..0a7be9a78 100644 --- a/daliuge-runtime/dlg/manager/client.py +++ b/daliuge-runtime/dlg/manager/client.py @@ -22,9 +22,8 @@ """Backwards compatibility for client""" from .. import clients - BaseDROPManagerClient = clients.BaseDROPManagerClient NodeManagerClient = clients.NodeManagerClient CompositeManagerClient = clients.CompositeManagerClient DataIslandManagerClient = clients.DataIslandManagerClient -MasterManagerClient = clients.MasterManagerClient \ No newline at end of file +MasterManagerClient = clients.MasterManagerClient diff --git a/daliuge-runtime/dlg/manager/cmdline.py b/daliuge-runtime/dlg/manager/cmdline.py index d8b23263d..3f5a79b16 100644 --- a/daliuge-runtime/dlg/manager/cmdline.py +++ b/daliuge-runtime/dlg/manager/cmdline.py @@ -44,10 +44,10 @@ from .. import utils from ..runtime import version - _terminating = False -def launchServer(opts): + +def launchServer(opts): # we might be called via __main__, but we want a nice logger name logger = logging.getLogger(__name__) dmName = opts.dmType.__name__ @@ -80,29 +80,32 @@ def handle_signal(signNo, stack_frame): def addCommonOptions(parser, defaultPort): parser.add_option("-H", "--host", action="store", type="string", - dest="host", help = "The host to bind this instance on", default='localhost') + dest="host", help="The host to bind this instance on", default='localhost') parser.add_option("-P", "--port", action="store", type="int", - dest="port", help = "The port to bind this instance on", default=defaultPort) + dest="port", help="The port to bind this instance on", default=defaultPort) parser.add_option("-m", "--max-request-size", action="store", type="int", dest="maxreqsize", help="The maximum allowed HTTP request size, in MB", default=10) parser.add_option("-d", "--daemon", action="store_true", dest="daemon", help="Run as daemon", default=False) - parser.add_option( "--cwd", action="store_true", + parser.add_option("--cwd", action="store_true", dest="cwd", help="Short for '-w .'", default=False) parser.add_option("-w", "--work-dir", help="Working directory, defaults to '/' in daemon mode, '.' in interactive mode", default=None) parser.add_option("-s", "--stop", action="store_true", dest="stop", help="Stop an instance running as daemon", default=False) - parser.add_option( "--status", action="store_true", + parser.add_option("--status", action="store_true", dest="status", help="Checks if there is daemon process actively running", default=False) parser.add_option("-T", "--timeout", action="store", - dest="timeout", type="float", help="Timeout used when checking for the daemon process", default=10) + dest="timeout", type="float", help="Timeout used when checking for the daemon process", + default=10) parser.add_option("-v", "--verbose", action="count", dest="verbose", help="Become more verbose. The more flags, the more verbose") parser.add_option("-q", "--quiet", action="count", dest="quiet", help="Be less verbose. The more flags, the quieter") parser.add_option("-l", "--log-dir", action="store", type="string", - dest="logdir", help="The directory where the logging files will be stored", default=utils.getDlgLogsDir()) + dest="logdir", help="The directory where the logging files will be stored", + default=utils.getDlgLogsDir()) + def commonOptionsCheck(options, parser): # These are all exclusive @@ -118,8 +121,8 @@ def commonOptionsCheck(options, parser): if options.cwd and options.work_dir: parser.error("--cwd and -w/--work-dir cannot be specified together. Prefer -w") -def start(options, parser): +def start(options, parser): # Perform common option checks commonOptionsCheck(options, parser) @@ -130,9 +133,9 @@ def start(options, parser): if options.daemon: # Make sure the PID file will be created without problems - pidDir = utils.getDlgPidDir() + pidDir = utils.getDlgPidDir() utils.createDirIfMissing(pidDir) - pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) + pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) working_dir = options.work_dir if not working_dir: @@ -148,7 +151,7 @@ def start(options, parser): # Stop daemon? elif options.stop: pidDir = utils.getDlgPidDir() - pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) + pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) pid = PIDLockFile(pidfile).read_pid() if pid is None: sys.stderr.write('Cannot read PID file, is there an instance running?\n') @@ -173,6 +176,7 @@ def start(options, parser): os.chdir(working_dir) launchServer(options) + def setupLogging(opts): if logging.root.handlers: # Mmmm, somebody already did some logging, it shouldn't have been us @@ -240,17 +244,21 @@ def dlgNM(parser, args): # Parse command-line and check options addCommonOptions(parser, NODE_DEFAULT_REST_PORT) parser.add_option("-I", "--no-log-ids", action="store_true", - dest="no_log_ids", help="Do not add associated session IDs and Drop UIDs to log statements", default=False) + dest="no_log_ids", help="Do not add associated session IDs and Drop UIDs to log statements", + default=False) parser.add_option("--no-dlm", action="store_true", dest="noDLM", help="Don't start the Data Lifecycle Manager on this NodeManager", default=False) parser.add_option("--dlg-path", action="store", type="string", - dest="dlgPath", help="Path where more DALiuGE-related libraries can be found", default="~/.dlg/lib") + dest="dlgPath", help="Path where more DALiuGE-related libraries can be found", + default="~/.dlg/lib") parser.add_option("--error-listener", action="store", type="string", dest="errorListener", help="The error listener class to be used", default=None) parser.add_option("--event-listeners", action="store", type="string", - dest="event_listeners", help="A colon-separated list of event listener classes to be used", default='') + dest="event_listeners", help="A colon-separated list of event listener classes to be used", + default='') parser.add_option("-t", "--max-threads", action="store", type="int", - dest="max_threads", help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) + dest="max_threads", + help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) (options, args) = parser.parse_args(args) # Add DM-specific options @@ -269,6 +277,7 @@ def dlgNM(parser, args): start(options, parser) + def dlgCompositeManager(parser, args, dmType, acronym, dmPort, dmRestServer): """ Common entry point for the dlgDIM and dlgMM command-line scripts. It @@ -279,11 +288,14 @@ def dlgCompositeManager(parser, args, dmType, acronym, dmPort, dmRestServer): # Parse command-line and check options addCommonOptions(parser, dmPort) parser.add_option("-N", "--nodes", action="store", type="string", - dest="nodes", help = "Comma-separated list of node names managed by this %s" % (acronym), default="") + dest="nodes", help="Comma-separated list of node names managed by this %s" % (acronym), + default="") parser.add_option("-k", "--ssh-pkey-path", action="store", type="string", - dest="pkeyPath", help = "Path to the private SSH key to use when connecting to the nodes", default=None) + dest="pkeyPath", help="Path to the private SSH key to use when connecting to the nodes", + default=None) parser.add_option("--dmCheckTimeout", action="store", type="int", - dest="dmCheckTimeout", help="Maximum timeout used when automatically checking for DM presence", default=10) + dest="dmCheckTimeout", help="Maximum timeout used when automatically checking for DM presence", + default=10) (options, args) = parser.parse_args(args) # Add DIM-specific options @@ -295,18 +307,21 @@ def dlgCompositeManager(parser, args, dmType, acronym, dmPort, dmRestServer): start(options, parser) + def dlgDIM(parser, args): """ Entry point for the dlg dim command """ dlgCompositeManager(parser, args, DataIslandManager, 'DIM', ISLAND_DEFAULT_REST_PORT, CompositeManagerRestServer) + def dlgMM(parser, args): """ Entry point for the dlg mm command """ dlgCompositeManager(parser, args, MasterManager, 'MM', MASTER_DEFAULT_REST_PORT, MasterManagerRestServer) + def dlgReplay(parser, args): """ Entry point for the dlg replay command @@ -332,4 +347,4 @@ def dlgReplay(parser, args): options.dmAcronym = 'RP' options.restType = ReplayManagerServer - start(options, parser) \ No newline at end of file + start(options, parser) diff --git a/daliuge-runtime/dlg/manager/composite_manager.py b/daliuge-runtime/dlg/manager/composite_manager.py index 383b6e3d2..2f03d3a25 100644 --- a/daliuge-runtime/dlg/manager/composite_manager.py +++ b/daliuge-runtime/dlg/manager/composite_manager.py @@ -30,22 +30,22 @@ from .client import NodeManagerClient from .constants import ISLAND_DEFAULT_REST_PORT, NODE_DEFAULT_REST_PORT from .drop_manager import DROPManager -from .. import remote, graph_loader +from .. import graph_loader from ..ddap_protocol import DROPRel from ..exceptions import InvalidGraphException, DaliugeException, \ SubManagerException from ..utils import portIsOpen - logger = logging.getLogger(__name__) + def uid_for_drop(dropSpec): if 'uid' in dropSpec: return dropSpec['uid'] return dropSpec['oid'] -def sanitize_relations(interDMRelations, graph): +def sanitize_relations(interDMRelations, graph): # TODO: Big change required to remove this hack here # # Values in the interDMRelations array use OIDs to identify drops. @@ -72,12 +72,14 @@ def sanitize_relations(interDMRelations, graph): newDMRelations.append(new_rel) interDMRelations[:] = newDMRelations + def group_by_node(uids, graph): uids_by_node = collections.defaultdict(list) for uid in uids: uids_by_node[graph[uid]['node']].append(uid) return uids_by_node + class CompositeManager(DROPManager): """ A DROPManager that in turn manages DROPManagers (sigh...). @@ -123,10 +125,10 @@ def __init__(self, dmPort, partitionAttr, subDmId, dmHosts=[], pkeyPath=None, dm self._dmHosts = dmHosts self._graph = {} self._drop_rels = {} - self._sessionIds = [] # TODO: it's still unclear how sessions are managed at the composite-manager level + self._sessionIds = [] # TODO: it's still unclear how sessions are managed at the composite-manager level self._pkeyPath = pkeyPath self._dmCheckTimeout = dmCheckTimeout - n_threads = max(1,min(len(dmHosts),20)) + n_threads = max(1, min(len(dmHosts), 20)) self._tp = multiprocessing.pool.ThreadPool(n_threads) # The list of bottom-level nodes that are covered by this manager @@ -333,7 +335,8 @@ def addGraphSpec(self, sessionId, graphSpec): # Create the individual graphs on each DM now that they are correctly # separated. logger.info('Adding individual graphSpec of session %s to each DM', sessionId) - self.replicate(sessionId, self._addGraphSpec, "appending graphSpec to individual DMs", iterable=perPartition.items()) + self.replicate(sessionId, self._addGraphSpec, "appending graphSpec to individual DMs", + iterable=perPartition.items()) logger.info('Successfully added individual graphSpec of session %s to each DM', sessionId) def _deploySession(self, dm, host, sessionId): @@ -413,6 +416,7 @@ def getGraphSize(self, sessionId): self.replicate(sessionId, self._getGraphSize, "getting the graph size", collect=allCounts) return sum(allCounts) + class DataIslandManager(CompositeManager): """ The DataIslandManager, which manages a number of NodeManagers. @@ -434,6 +438,7 @@ def add_node(self, node): CompositeManager.add_node(self, node) self._dmHosts.append(node) + class MasterManager(CompositeManager): """ The MasterManager, which manages a number of DataIslandManagers. diff --git a/daliuge-runtime/dlg/manager/constants.py b/daliuge-runtime/dlg/manager/constants.py index 67698ffe6..ed6500138 100644 --- a/daliuge-runtime/dlg/manager/constants.py +++ b/daliuge-runtime/dlg/manager/constants.py @@ -22,7 +22,6 @@ """Backwards compatibility for constants""" from .. import constants - DEFAULT_PORTS = constants.DEFAULT_PORTS NODE_DEFAULT_REST_PORT = constants.NODE_DEFAULT_REST_PORT ISLAND_DEFAULT_REST_PORT = constants.ISLAND_DEFAULT_REST_PORT @@ -30,4 +29,4 @@ REPLAY_DEFAULT_REST_PORT = constants.REPLAY_DEFAULT_REST_PORT DAEMON_DEFAULT_REST_PORT = constants.DAEMON_DEFAULT_REST_PORT NODE_DEFAULT_EVENTS_PORT = constants.NODE_DEFAULT_EVENTS_PORT -NODE_DEFAULT_RPC_PORT = constants.NODE_DEFAULT_RPC_PORT \ No newline at end of file +NODE_DEFAULT_RPC_PORT = constants.NODE_DEFAULT_RPC_PORT diff --git a/daliuge-runtime/dlg/manager/drop_manager.py b/daliuge-runtime/dlg/manager/drop_manager.py index e09a710b9..d3148c164 100644 --- a/daliuge-runtime/dlg/manager/drop_manager.py +++ b/daliuge-runtime/dlg/manager/drop_manager.py @@ -120,4 +120,4 @@ def getGraphSize(self, sessionId): """ Returns the number of drops contained in the physical graph attached to ``sessionId``. - """ \ No newline at end of file + """ diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index c5656abf5..542589b3f 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -42,13 +42,13 @@ from .. import rpc, utils from ..ddap_protocol import DROPStates from ..drop import AppDROP -from ..exceptions import NoSessionException, SessionAlreadyExistsException,\ +from ..exceptions import NoSessionException, SessionAlreadyExistsException, \ DaliugeException from ..lifecycle.dlm import DataLifecycleManager - logger = logging.getLogger(__name__) + class NMDropEventListener(object): def __init__(self, nm, session_id): @@ -59,6 +59,7 @@ def handleEvent(self, event): event.session_id = self._session_id self._nm.publish_event(event) + class LogEvtListener(object): def handleEvent(self, event): if event.type == 'status': @@ -66,6 +67,7 @@ def handleEvent(self, event): elif event.type == 'execStatus': logger.debug('AppDrop uid=%s, oid=%s changed to execState %s', event.uid, event.oid, event.execStatus) + class ErrorStatusListener(object): """An event listener that passes down the erroneous drop to an error handler""" @@ -111,7 +113,7 @@ def __init__(self, dlgPath=None, error_listener=None, event_listeners=[], - max_threads = 0): + max_threads=0): self._dlm = DataLifecycleManager() if useDLM else None self._sessions = {} @@ -303,7 +305,6 @@ def call_drop(self, sessionId, uid, method, *args): class ZMQPubSubMixIn(object): - subscription = collections.namedtuple('subscription', 'endpoint finished_evt') def __init__(self, host, events_port): @@ -332,17 +333,17 @@ def start(self): pubsock_created = threading.Event() subsock_created = threading.Event() - self._zmqpubthread = threading.Thread(target = self._zmq_pub_thread, name="ZMQ evtpub", args=(pubsock_created,)) + self._zmqpubthread = threading.Thread(target=self._zmq_pub_thread, name="ZMQ evtpub", args=(pubsock_created,)) self._zmqpubthread.start() if not pubsock_created.wait(timeout): raise Exception("Failed to create PUB ZMQ socket in %d seconds" % (timeout,)) - self._zmqsubthread = threading.Thread(target = self._zmq_sub_thread, name="ZMQ evtsub", args=(subsock_created,)) + self._zmqsubthread = threading.Thread(target=self._zmq_sub_thread, name="ZMQ evtsub", args=(subsock_created,)) self._zmqsubthread.start() if not subsock_created.wait(timeout): raise Exception("Failed to create PUB ZMQ socket in %d seconds" % (timeout,)) - self._zmqsubqthread = threading.Thread(target = self._zmq_sub_queue_thread, name="ZMQ evtsubq") + self._zmqsubqthread = threading.Thread(target=self._zmq_sub_queue_thread, name="ZMQ evtsubq") self._zmqsubqthread.start() def shutdown(self): @@ -370,7 +371,7 @@ def _zmq_pub_thread(self, sock_created): import zmq pub = self._zmqctx.socket(zmq.PUB) # @UndefinedVariable - pub.set_hwm(0) # Never drop messages that should be sent + pub.set_hwm(0) # Never drop messages that should be sent endpoint = "tcp://%s:%d" % (utils.zmq_safe(self._events_host), self._events_port) pub.bind(endpoint) logger.info("Listening for events via ZeroMQ on %s", endpoint) @@ -386,7 +387,7 @@ def _zmq_pub_thread(self, sock_created): while self._pubsub_running: try: - pub.send_pyobj(obj, flags = zmq.NOBLOCK) # @UndefinedVariable + pub.send_pyobj(obj, flags=zmq.NOBLOCK) # @UndefinedVariable break except zmq.error.Again: logger.debug("Got an 'Again' when publishing event") @@ -419,7 +420,7 @@ def _zmq_sub_thread(self, sock_created): pass try: - evt = sub.recv_pyobj(flags = zmq.NOBLOCK) # @UndefinedVariable + evt = sub.recv_pyobj(flags=zmq.NOBLOCK) # @UndefinedVariable self._recvevts.put(evt) except zmq.error.Again: time.sleep(0.01) @@ -431,9 +432,12 @@ def _zmq_sub_thread(self, sock_created): # So far we currently support ZMQ only for event publishing EventMixIn = ZMQPubSubMixIn + + # Load the corresponding RPC classes and finish the construciton of NodeManager class RpcMixIn(rpc.RPCClient, rpc.RPCServer): pass + # Final NodeManager class class NodeManager(EventMixIn, RpcMixIn, NodeManagerBase): @@ -443,4 +447,4 @@ def __init__(self, useDLM=True, dlgPath=None, error_listener=None, event_listene host = host or '127.0.0.1' EventMixIn.__init__(self, host, events_port) RpcMixIn.__init__(self, host, rpc_port) - NodeManagerBase.__init__(self, useDLM, dlgPath, error_listener, event_listeners, max_threads) \ No newline at end of file + NodeManagerBase.__init__(self, useDLM, dlgPath, error_listener, event_listeners, max_threads) diff --git a/daliuge-runtime/dlg/manager/proc_daemon.py b/daliuge-runtime/dlg/manager/proc_daemon.py index 94a713365..efb6f2e58 100644 --- a/daliuge-runtime/dlg/manager/proc_daemon.py +++ b/daliuge-runtime/dlg/manager/proc_daemon.py @@ -38,9 +38,9 @@ from .. import utils from ..restserver import RestServer - logger = logging.getLogger(__name__) + def get_tool(): # This import is performed at runtime to avoid a circular dependency # at import time with the tool module, which imports this module @@ -48,11 +48,13 @@ def get_tool(): from ..common import tool return tool + def _get_address(zeroconf_service_info): if tuple(map(int, zc.__version__.split('.')))[:2] >= (0, 23): return zeroconf_service_info.addresses[0] return zeroconf_service_info.address + class DlgDaemon(RestServer): """ The DALiuGE Daemon @@ -84,14 +86,14 @@ def __init__(self, master=False, noNM=False, disable_zeroconf=False, verbosity=0 # Starting managers app = self.app - app.post('/managers/node', callback=self.rest_startNM) + app.post('/managers/node', callback=self.rest_startNM) app.post('/managers/dataisland', callback=self.rest_startDIM) - app.post('/managers/master', callback=self.rest_startMM) + app.post('/managers/master', callback=self.rest_startMM) # Querying about managers - app.get('/managers/node', callback=self.rest_getNMInfo) + app.get('/managers/node', callback=self.rest_getNMInfo) app.get('/managers/dataisland', callback=self.rest_getDIMInfo) - app.get('/managers/master', callback=self.rest_getMMInfo) + app.get('/managers/master', callback=self.rest_getMMInfo) # Automatically start those that we need if master: @@ -134,6 +136,7 @@ def _stop_rest_server(self, timeout): # done with it logger.debug("Stopping the web server") ioloop_stopped = threading.Event() + def stop_ioloop(): self._ioloop.stop() ioloop_stopped.set() @@ -173,11 +176,12 @@ def startNM(self): # by the Master Manager if self._zeroconf: addrs = utils.get_local_ip_addr() - self._nm_info = utils.register_service(self._zeroconf, 'NodeManager', socket.gethostname(), addrs[0][0], constants.NODE_DEFAULT_REST_PORT) + self._nm_info = utils.register_service(self._zeroconf, 'NodeManager', socket.gethostname(), addrs[0][0], + constants.NODE_DEFAULT_REST_PORT) def startDIM(self, nodes): tool = get_tool() - args = ['--host', '0.0.0.0'] + args = ['--host', '0.0.0.0'] args += self._verbosity_as_cmdline() if nodes: args += ['--nodes', ",".join(nodes)] @@ -187,7 +191,7 @@ def startDIM(self, nodes): def startMM(self): tool = get_tool() - args = ['--host', '0.0.0.0'] + args = ['--host', '0.0.0.0'] args += self._verbosity_as_cmdline() logger.info("Starting Master Drop Manager with args: %s" % (" ".join(args))) self._mm_proc = tool.start_process('mm', args) @@ -198,6 +202,7 @@ def startMM(self): if self._zeroconf: mm_client = client.MasterManagerClient() node_managers = {} + def nm_callback(zeroconf, service_type, name, state_change): info = zeroconf.get_service_info(service_type, name) if state_change is zc.ServiceStateChange.Added: @@ -207,7 +212,7 @@ def nm_callback(zeroconf, service_type, name, state_change): logger.info("Found a new Node Manager on %s:%d, will add it to the MM" % (server, port)) mm_client.add_node(server) elif state_change is zc.ServiceStateChange.Removed: - server,port = node_managers[name] + server, port = node_managers[name] logger.info("Node Manager on %s:%d disappeared, removing it from the MM" % (server, port)) # Don't bother to remove it if we're shutting down. This way @@ -223,15 +228,15 @@ def nm_callback(zeroconf, service_type, name, state_change): def _verbosity_as_cmdline(self): if self._verbosity > 0: - return ["-" + "v"*self._verbosity] + return ["-" + "v" * self._verbosity] elif self._verbosity < 0: - return ["-" + "q"*(-self._verbosity)] + return ["-" + "q" * (-self._verbosity)] return () # Rest interface def _rest_start_manager(self, proc, start_method): if proc is not None: - bottle.abort(409, 'The Drop Manager is already running') # Conflict + bottle.abort(409, 'The Drop Manager is already running') # Conflict start_method() def _rest_get_manager_info(self, proc): @@ -266,13 +271,15 @@ def rest_getMMInfo(self): terminating = False + + def run_with_cmdline(parser, args): parser.add_option('-m', '--master', action='store_true', dest="master", help="Start this DALiuGE daemon as the master daemon", default=False) parser.add_option("--no-nm", action="store_true", - dest="noNM", help = "Don't start a NodeDropManager by default", default=False) + dest="noNM", help="Don't start a NodeDropManager by default", default=False) parser.add_option("--no-zeroconf", action="store_true", - dest="noZC", help = "Don't enable zeroconf on this DALiuGE daemon", default=False) + dest="noZC", help="Don't enable zeroconf on this DALiuGE daemon", default=False) parser.add_option("-v", "--verbose", action="count", dest="verbose", help="Become more verbose. The more flags, the more verbose", default=0) parser.add_option("-q", "--quiet", action="count", @@ -296,10 +303,11 @@ def handle_signal(signalNo, stack_frame): logger.info("Received signal %d, will stop the daemon now" % (signalNo,)) terminating = True daemon.stop(10) - signal.signal(signal.SIGINT, handle_signal) + + signal.signal(signal.SIGINT, handle_signal) signal.signal(signal.SIGTERM, handle_signal) # Go, go, go! t = threading.Thread(target=daemon.start, args=('0.0.0.0', constants.DAEMON_DEFAULT_REST_PORT)) t.start() - signal.pause() \ No newline at end of file + signal.pause() diff --git a/daliuge-runtime/dlg/manager/replay.py b/daliuge-runtime/dlg/manager/replay.py index c96c45ba6..d08c79920 100644 --- a/daliuge-runtime/dlg/manager/replay.py +++ b/daliuge-runtime/dlg/manager/replay.py @@ -30,13 +30,13 @@ from .session import SessionStates from ..exceptions import NoSessionException, InvalidSessionState - logger = logging.getLogger(__name__) build_step = 3 deploy_step = 6 run_step = 7 + class ReplayManager(DROPManager): def __init__(self, graph_file, status_file): @@ -67,10 +67,13 @@ def __del__(self): # Only queries are supported by the replay manager def createSession(self, sessionId): raise NotImplementedError() + def addGraphSpec(self, sessionId, graphSpec): raise NotImplementedError() + def deploySession(self, sessionId, completedDrops=[]): raise NotImplementedError() + def destroySession(self, sessionId): raise NotImplementedError() @@ -134,6 +137,7 @@ def getGraphSize(self, session_id): def getSessionIds(self): return [self._session_id] + class ReplayManagerServer(ManagerRestServer): def initializeSpecifics(self, app): @@ -148,4 +152,4 @@ def visualizeDM(self): return bottle.template(tpl, serverUrl=serverUrl, dmType=self.dm.__class__.__name__, - reset='true') \ No newline at end of file + reset='true') diff --git a/daliuge-runtime/dlg/manager/rest.py b/daliuge-runtime/dlg/manager/rest.py index 5ae6f62cf..0ad5fbbeb 100644 --- a/daliuge-runtime/dlg/manager/rest.py +++ b/daliuge-runtime/dlg/manager/rest.py @@ -41,15 +41,15 @@ from ..restserver import RestServer from ..restutils import RestClient, RestClientException - logger = logging.getLogger(__name__) + def file_as_string(fname, enc='utf8'): - b = pkg_resources.resource_string(__name__, fname) # @UndefinedVariable + b = pkg_resources.resource_string(__name__, fname) # @UndefinedVariable return utils.b2s(b, enc) -def daliuge_aware(func): +def daliuge_aware(func): @functools.wraps(func) def fwrapper(*args, **kwargs): try: @@ -81,7 +81,7 @@ def fwrapper(*args, **kwargs): status = 555 eargs = {} # args[1] is a dictionary of host:exception - for host,subex in e.args[1].items(): + for host, subex in e.args[1].items(): eargs[host] = {'type': subex.__class__.__name__, 'args': subex.args} elif isinstance(e, DaliugeException): status, eargs = 555, e.args @@ -94,6 +94,7 @@ def fwrapper(*args, **kwargs): return fwrapper + class ManagerRestServer(RestServer): """ An object that wraps a DataManager and exposes its methods via a REST @@ -115,22 +116,22 @@ def __init__(self, dm, maxreqsize=10): # Mappings app = self.app - app.post( '/api/stop', callback=self.stop_manager) - app.post( '/api/sessions', callback=self.createSession) - app.get( '/api/sessions', callback=self.getSessions) - app.get( '/api/sessions/', callback=self.getSessionInformation) - app.delete('/api/sessions/', callback=self.destroySession) - app.get( '/api/sessions//status', callback=self.getSessionStatus) - app.post( '/api/sessions//deploy', callback=self.deploySession) - app.post( '/api/sessions//cancel', callback=self.cancelSession) - app.get( '/api/sessions//graph', callback=self.getGraph) - app.get( '/api/sessions//graph/size', callback=self.getGraphSize) - app.get( '/api/sessions//graph/status', callback=self.getGraphStatus) - app.post( '/api/sessions//graph/append', callback=self.addGraphParts) + app.post('/api/stop', callback=self.stop_manager) + app.post('/api/sessions', callback=self.createSession) + app.get('/api/sessions', callback=self.getSessions) + app.get('/api/sessions/', callback=self.getSessionInformation) + app.delete('/api/sessions/', callback=self.destroySession) + app.get('/api/sessions//status', callback=self.getSessionStatus) + app.post('/api/sessions//deploy', callback=self.deploySession) + app.post('/api/sessions//cancel', callback=self.cancelSession) + app.get('/api/sessions//graph', callback=self.getGraph) + app.get('/api/sessions//graph/size', callback=self.getGraphSize) + app.get('/api/sessions//graph/status', callback=self.getGraphStatus) + app.post('/api/sessions//graph/append', callback=self.addGraphParts) # The non-REST mappings that serve HTML-related content app.route('/static/', callback=self.server_static) - app.get( '/session', callback=self.visualizeSession) + app.get('/session', callback=self.visualizeSession) # sub-class specifics self.initializeSpecifics(app) @@ -146,7 +147,7 @@ def _stop_manager(self): self.dm.shutdown() self.stop() logger.info("Thanks for using our %s, come back again :-)" % - (self.dm.__class__.__name__)) + (self.dm.__class__.__name__)) @daliuge_aware def stop_manager(self): @@ -161,7 +162,8 @@ def createSession(self): def sessions(self): sessions = [] for sessionId in self.dm.getSessionIds(): - sessions.append({'sessionId':sessionId, 'status':self.dm.getSessionStatus(sessionId), 'size': self.dm.getGraphSize(sessionId)}) + sessions.append({'sessionId': sessionId, 'status': self.dm.getSessionStatus(sessionId), + 'size': self.dm.getGraphSize(sessionId)}) return sessions @daliuge_aware @@ -187,7 +189,7 @@ def deploySession(self, sessionId): completedDrops = [] if 'completed' in bottle.request.forms: completedDrops = bottle.request.forms['completed'].split(',') - self.dm.deploySession(sessionId,completedDrops=completedDrops) + self.dm.deploySession(sessionId, completedDrops=completedDrops) @daliuge_aware def cancelSession(self, sessionId): @@ -222,9 +224,9 @@ def addGraphParts(self, sessionId): graph_parts = bottle.json_loads(json_content.read()) self.dm.addGraphSpec(sessionId, graph_parts) - #=========================================================================== + # =========================================================================== # non-REST methods - #=========================================================================== + # =========================================================================== def server_static(self, filepath): staticRoot = pkg_resources.resource_filename(__name__, '/web/static') # @UndefinedVariable return bottle.static_file(filepath, root=staticRoot) @@ -244,6 +246,7 @@ def visualizeSession(self): serverUrl=serverUrl, dmType=self.dm.__class__.__name__) + class NMRestServer(ManagerRestServer): """ A REST server for NodeManagers. It includes mappings for NM-specific @@ -251,13 +254,13 @@ class NMRestServer(ManagerRestServer): """ def initializeSpecifics(self, app): - app.get( '/api', callback=self.getNMStatus) - app.post( '/api/sessions//graph/link', callback=self.linkGraphParts) - app.post( '/api/sessions//subscriptions', callback=self.add_node_subscriptions) - app.post( '/api/sessions//trigger', callback=self.trigger_drops) + app.get('/api', callback=self.getNMStatus) + app.post('/api/sessions//graph/link', callback=self.linkGraphParts) + app.post('/api/sessions//subscriptions', callback=self.add_node_subscriptions) + app.post('/api/sessions//trigger', callback=self.trigger_drops) # The non-REST mappings that serve HTML-related content - app.get( '/', callback=self.visualizeDM) - app.get( '/api/shutdown', callback=self.shutdown_node_manager) + app.get('/', callback=self.visualizeDM) + app.get('/api/shutdown', callback=self.shutdown_node_manager) @daliuge_aware def shutdown_node_manager(self): @@ -291,9 +294,9 @@ def trigger_drops(self, sessionId): return self.dm.trigger_drops(sessionId, bottle.request.json) - #=========================================================================== + # =========================================================================== # non-REST methods - #=========================================================================== + # =========================================================================== def visualizeDM(self): tpl = file_as_string('web/dm.html') urlparts = bottle.request.urlparts @@ -303,6 +306,7 @@ def visualizeDM(self): dmType=self.dm.__class__.__name__, reset='false') + class CompositeManagerRestServer(ManagerRestServer): """ A REST server for DataIslandManagers. It includes mappings for DIM-specific @@ -310,20 +314,20 @@ class CompositeManagerRestServer(ManagerRestServer): """ def initializeSpecifics(self, app): - app.get( '/api', callback=self.getCMStatus) - app.get( '/api/nodes', callback=self.getCMNodes) - app.post( '/api/nodes/', callback=self.addCMNode) - app.delete('/api/nodes/', callback=self.removeCMNode) + app.get('/api', callback=self.getCMStatus) + app.get('/api/nodes', callback=self.getCMNodes) + app.post('/api/nodes/', callback=self.addCMNode) + app.delete('/api/nodes/', callback=self.removeCMNode) # Query forwarding to sub-nodes - app.get( '/api/nodes//sessions', callback=self.getNodeSessions) - app.get( '/api/nodes//sessions/', callback=self.getNodeSessionInformation) - app.get( '/api/nodes//sessions//status', callback=self.getNodeSessionStatus) - app.get( '/api/nodes//sessions//graph', callback=self.getNodeGraph) - app.get( '/api/nodes//sessions//graph/status', callback=self.getNodeGraphStatus) + app.get('/api/nodes//sessions', callback=self.getNodeSessions) + app.get('/api/nodes//sessions/', callback=self.getNodeSessionInformation) + app.get('/api/nodes//sessions//status', callback=self.getNodeSessionStatus) + app.get('/api/nodes//sessions//graph', callback=self.getNodeGraph) + app.get('/api/nodes//sessions//graph/status', callback=self.getNodeGraphStatus) # The non-REST mappings that serve HTML-related content - app.get( '/', callback=self.visualizeDIM) + app.get('/', callback=self.visualizeDIM) @daliuge_aware def getCMStatus(self): @@ -376,21 +380,22 @@ def getNodeGraphStatus(self, node, sessionId): with NodeManagerClient(host=node) as dm: return dm.graph_status(sessionId) - #=========================================================================== + # =========================================================================== # non-REST methods - #=========================================================================== + # =========================================================================== def visualizeDIM(self): tpl = file_as_string('web/dim.html') urlparts = bottle.request.urlparts selectedNode = bottle.request.params['node'] if 'node' in bottle.request.params else '' serverUrl = urlparts.scheme + '://' + urlparts.netloc return bottle.template(tpl, - dmType=self.dm.__class__.__name__, - dmPort=self.dm.dmPort, - serverUrl=serverUrl, - dmHosts=json.dumps(self.dm.dmHosts), - nodes=json.dumps(self.dm.nodes), - selectedNode=selectedNode) + dmType=self.dm.__class__.__name__, + dmPort=self.dm.dmPort, + serverUrl=serverUrl, + dmHosts=json.dumps(self.dm.dmHosts), + nodes=json.dumps(self.dm.nodes), + selectedNode=selectedNode) + class MasterManagerRestServer(CompositeManagerRestServer): @@ -404,4 +409,4 @@ def initializeSpecifics(self, app): def createDataIsland(self, host): with RestClient(host=host, port=constants.DAEMON_DEFAULT_REST_PORT, timeout=10) as c: c._post_json('/managers/dataisland', bottle.request.body.read()) - self.dm.addDmHost(host) \ No newline at end of file + self.dm.addDmHost(host) diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index 99904f1b2..bd381aa8c 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -39,9 +39,9 @@ from ..exceptions import InvalidSessionState, InvalidGraphException, \ NoDropException, DaliugeException - logger = logging.getLogger(__name__) + class SessionStates: """ An enumeration of the different states in which a Session can be found at @@ -49,6 +49,7 @@ class SessionStates: """ PRISTINE, BUILDING, DEPLOYING, RUNNING, FINISHED, CANCELLED = range(6) + class LeavesCompletionListener(object): def __init__(self, leaves, session): @@ -59,13 +60,15 @@ def __init__(self, leaves, session): def handleEvent(self, evt): # TODO: be thread-safe self._completed += 1 - logger.debug("%d/%d leaf drops completed on session %s", self._completed, self._nexpected, self._session.sessionId) + logger.debug("%d/%d leaf drops completed on session %s", self._completed, self._nexpected, + self._session.sessionId) if self._completed == self._nexpected: self._session.finish() track_current_session = utils.object_tracking('session') + class Session(object): """ A DROP graph execution. @@ -86,8 +89,8 @@ class Session(object): def __init__(self, sessionId, nm=None): self._sessionId = sessionId - self._graph = {} # key: oid, value: dropSpec dictionary - self._drops = {} # key: oid, value: actual drop object + self._graph = {} # key: oid, value: dropSpec dictionary + self._drops = {} # key: oid, value: actual drop object self._statusLock = threading.Lock() self._roots = [] self._proxyinfo = [] @@ -141,7 +144,8 @@ def addGraphSpec(self, graphSpec): status = self.status if status not in (SessionStates.PRISTINE, SessionStates.BUILDING): - raise InvalidSessionState("Can't add graphs to this session since it isn't in the PRISTINE or BUILDING status: %d" % (status)) + raise InvalidSessionState( + "Can't add graphs to this session since it isn't in the PRISTINE or BUILDING status: %d" % (status)) self.status = SessionStates.BUILDING @@ -199,7 +203,7 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): # in reality this particular session is managing nothing status = self.status if (self._graph and status != SessionStates.BUILDING) or \ - (not self._graph and status != SessionStates.PRISTINE): + (not self._graph and status != SessionStates.PRISTINE): raise InvalidSessionState("Can't deploy this session in its current status: %d" % (status)) if not self._graph and completedDrops: @@ -218,7 +222,7 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): self._roots = graph_loader.createGraphFromDropSpecList(self._graph.values(), session=self) logger.info("%d drops successfully created", len(self._graph)) - for drop,_ in droputils.breadFirstTraverse(self._roots): + for drop, _ in droputils.breadFirstTraverse(self._roots): # Register them self._drops[drop.uid] = drop @@ -249,7 +253,7 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): # Foreach if foreach: logger.info("Invoking 'foreach' on each drop") - for drop,_ in droputils.breadFirstTraverse(self._roots): + for drop, _ in droputils.breadFirstTraverse(self._roots): foreach(drop) logger.info("'foreach' invoked for each drop") @@ -279,7 +283,7 @@ def _run(self, worker): self.finish() def trigger_drops(self, uids): - for drop,downStreamDrops in droputils.breadFirstTraverse(self._roots): + for drop, downStreamDrops in droputils.breadFirstTraverse(self._roots): downStreamDrops[:] = [dsDrop for dsDrop in downStreamDrops if isinstance(dsDrop, AbstractDROP)] if drop.uid in uids: if isinstance(drop, InputFiredAppDROP): @@ -304,7 +308,7 @@ def deliver_event(self, evt): def add_node_subscriptions(self, relationships): evt_consumer = (DROPLinkType.CONSUMER, DROPLinkType.STREAMING_CONSUMER, DROPLinkType.OUTPUT) - evt_producer = (DROPLinkType.INPUT, DROPLinkType.STREAMING_INPUT, DROPLinkType.PRODUCER) + evt_producer = (DROPLinkType.INPUT, DROPLinkType.STREAMING_INPUT, DROPLinkType.PRODUCER) for host, droprels in relationships.items(): @@ -332,7 +336,7 @@ def add_node_subscriptions(self, relationships): # We are in the event receiver side if (rel.rel in evt_consumer and rel.lhs is local_uid) or \ - (rel.rel in evt_producer and rel.rhs is local_uid): + (rel.rel in evt_producer and rel.rhs is local_uid): dropsubs[remote_uid].add(local_uid) self._dropsubs.update(dropsubs) diff --git a/daliuge-runtime/dlg/manager/web/dim.html b/daliuge-runtime/dlg/manager/web/dim.html index 4ec4fe8b3..f1058c8e8 100644 --- a/daliuge-runtime/dlg/manager/web/dim.html +++ b/daliuge-runtime/dlg/manager/web/dim.html @@ -1,113 +1,134 @@ - - {{dmType}} - - - - - - - + + {{dmType}} + + + + + + +
    - - -
    -

    Sessions

    - - - - - - - - - - - -
    Session IDState# DropsDetails
    - - -
    + -
    -

    Nodes

    - - - - - - - - -
    NodeDetails
    - -
    +
    +

    Sessions

    + + + + + + + + + + + +
    Session IDState# DropsDetails
    + + +
    + +
    +

    Nodes

    + + + + + + + + +
    NodeDetails
    + +
    \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/dm.html b/daliuge-runtime/dlg/manager/web/dm.html index 035a098a7..12819398b 100644 --- a/daliuge-runtime/dlg/manager/web/dm.html +++ b/daliuge-runtime/dlg/manager/web/dm.html @@ -1,75 +1,88 @@ - - {{dmType}} - - - - - - - + + {{dmType}} + + + + + + +
    -

    {{dmType}}

    +

    {{dmType}}

    -

    Sessions

    - - - - - - - - - - - - -
    Session IDState# DropsDetailsActions
    - - - +

    Sessions

    + + + + + + + + + + + + +
    Session IDState# DropsDetailsActions
    + + +
    \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/session.html b/daliuge-runtime/dlg/manager/web/session.html index 42a31a28e..c31a69b9d 100644 --- a/daliuge-runtime/dlg/manager/web/session.html +++ b/daliuge-runtime/dlg/manager/web/session.html @@ -2,279 +2,304 @@ - - Session '{{sessionId}}' - - - - - - - - - + + Session '{{sessionId}}' + + + + + + + + +
    - - -

    Status:

    - - - - -
    - - - - - - - - -
    OIDStatus
    -
    + + +

    Status:

    + + + + +
    + + + + + + + + +
    OIDStatus
    +
    - + + +
    - +
    \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/static/css/session.css b/daliuge-runtime/dlg/manager/web/static/css/session.css index 1ff920ddd..8eb7bc705 100644 --- a/daliuge-runtime/dlg/manager/web/static/css/session.css +++ b/daliuge-runtime/dlg/manager/web/static/css/session.css @@ -1,139 +1,139 @@ body { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: 0; - padding: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serf; - background: #fff; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: 0; + padding: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serf; + background: #fff; } @-webkit-keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } + 0%, 50%, 100% { + opacity: 1; + } - 25%, 75% { - opacity: 0.2; - } + 25%, 75% { + opacity: 0.2; + } } @keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } + 0%, 50%, 100% { + opacity: 1; + } - 25%, 75% { - opacity: 0.2; - } + 25%, 75% { + opacity: 0.2; + } } .warn { - -webkit-animation-duration: 5s; - -webkit-animation-fill-mode: both; - -webkit-animation-iteration-count: 1; - -webkit-animation-name: flash; - animation-duration: 5s; - animation-fill-mode: both; - animation-iteration-count: 1; - animation-name: flash; + -webkit-animation-duration: 5s; + -webkit-animation-fill-mode: both; + -webkit-animation-iteration-count: 1; + -webkit-animation-name: flash; + animation-duration: 5s; + animation-fill-mode: both; + animation-iteration-count: 1; + animation-name: flash; } div.graph, div.progress { - width: 100%; - height: 100%; + width: 100%; + height: 100%; } svg { - width: 100%; - height: 100%; - overflow: hidden; + width: 100%; + height: 100%; + overflow: hidden; } .node rect, .node polygon { - stroke-width: 2.0px; - stroke: #bbb; + stroke-width: 2.0px; + stroke: #bbb; } /* DROP states */ .node.initialized :first-child, rect.initialized { - fill: #ffe; + fill: #ffe; } .node.writing :first-child, rect.writing { - fill: #ecde7b; + fill: #ecde7b; } .node.completed :first-child, rect.completed { - fill: #7bdc7b; + fill: #7bdc7b; } .node.expired :first-child, rect.expired { - fill: #700000; + fill: #700000; } .node.cancelled :first-child, rect.cancelled { - fill: #cccccc; + fill: #cccccc; } .node.deleted :first-child, rect.deleted { - color: #700000; + color: #700000; } /* AppDROP states */ .node.not_run :first-child, rect.not_run { - fill: #ffe; + fill: #ffe; } .node.running :first-child, rect.running { - fill: #ecde7b; + fill: #ecde7b; } .node.finished :first-child, rect.finished { - fill: #7bdc7b; + fill: #7bdc7b; } .node.error :first-child, rect.error { - fill: #e44f33; + fill: #e44f33; } .node.container polygon { - stroke-dasharray: 5; + stroke-dasharray: 5; } .node g div { - width: 180px; - height: 60px; - color: #000; - overflow: hidden; + width: 180px; + height: 60px; + color: #000; + overflow: hidden; } -.node polygon+g div div { - padding-left: 20% +.node polygon + g div div { + padding-left: 20% } -.node rect+g div div { - padding-left: 2% +.node rect + g div div { + padding-left: 2% } .edgeLabel text { - width: 50px; - fill: #fff; + width: 50px; + fill: #fff; } .edgePath path { - stroke: #999; - stroke-width: 1.5px; - fill: #999; + stroke: #999; + stroke-width: 1.5px; + fill: #999; } .notes { - font-size: 90%; + font-size: 90%; } .drop-label span { - display: block; + display: block; } \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg b/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg index 94fb5490a..2ba280f41 100644 --- a/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg +++ b/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg @@ -1,288 +1,543 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/static/js/dm.js b/daliuge-runtime/dlg/manager/web/static/js/dm.js index 2a4f5dc9d..f8fc917bd 100644 --- a/daliuge-runtime/dlg/manager/web/static/js/dm.js +++ b/daliuge-runtime/dlg/manager/web/static/js/dm.js @@ -20,266 +20,294 @@ // MA 02111-1307 USA // -var SESSION_STATUS = ['Pristine', 'Building', 'Deploying', 'Running', 'Finished', 'Cancelled'] -var STATUS_CLASSES = ['initialized', 'writing', 'completed', 'error', 'expired', 'deleted', 'cancelled'] +var SESSION_STATUS = ['Pristine', 'Building', 'Deploying', 'Running', 'Finished', 'Cancelled'] +var STATUS_CLASSES = ['initialized', 'writing', 'completed', 'error', 'expired', 'deleted', 'cancelled'] var EXECSTATUS_CLASSES = ['not_run', 'running', 'finished', 'error', 'cancelled'] -var TYPE_CLASSES = ['app', 'container', 'socket', 'plain'] -var TYPE_SHAPES = {app:'rect', container:'parallelogram', socket:'parallelogram', plain:'parallelogram'} +var TYPE_CLASSES = ['app', 'container', 'socket', 'plain'] +var TYPE_SHAPES = {app: 'rect', container: 'parallelogram', socket: 'parallelogram', plain: 'parallelogram'} var TO_MANY_LTR_RELS = ['consumers', 'streamingConsumers', 'outputs'] var TO_MANY_RTL_RELS = ['inputs', 'streamingInputs', 'producers'] -function get_status_name(s) -{ - if (typeof s.execStatus != 'undefined') { - return EXECSTATUS_CLASSES[s.execStatus]; - } - else { - return STATUS_CLASSES[s.status]; - } +function get_status_name(s) { + if (typeof s.execStatus != 'undefined') { + return EXECSTATUS_CLASSES[s.execStatus]; + } else { + return STATUS_CLASSES[s.status]; + } } function uniqueSessionStatus(status) { - // If we are querying one of the Composite Managers (like the DIM or the MM) - // we need to reduce the individual session status to a single one for display - if( status != null && typeof status === 'object' ) { - - // Reduce, reduce, reduce - while( true ) { - - // Get the values from the status object - status = Object.keys(status).map(function(k){return status[k]}); - - // If the values in the resulting array are not objects then - // we already hit the bottom level and we have simply numbers - // in the array - if ( typeof status[0] !== 'object' ) { - break; - } - - // Otherwise, we create an object which consists on the merged - // objects contained in the array - // e.g., [{a:'b'}, {b:'c'}] -> {a:'b', b:'c'} - // After that we're OK for the next iteration - status = status.reduce( - function(prev, v, idx, array) { - if( idx == 0 ) { return v; } - for (var attrname in prev) { - v[attrname] = prev[attrname]; - } - return v; - } - ) - } - - // Reduce to single common value if possible - // "Finished" and "Running" reduce to "Running" - // Otherwise we reduce to -1, which we interpret as "Indeterminate" - return status.reduce( - function(prev, v, idx, array) { - if( prev == -1 ) { return -1; } - else if( prev == 3 && v == 4 || prev == 4 && v == 3 ) { return 3; } - return (prev == v) ? v : -1; - } - ); - } - - // otherwise we simply return the status, which should be an integer - return status; + // If we are querying one of the Composite Managers (like the DIM or the MM) + // we need to reduce the individual session status to a single one for display + if (status != null && typeof status === 'object') { + + // Reduce, reduce, reduce + while (true) { + + // Get the values from the status object + status = Object.keys(status).map(function (k) { + return status[k] + }); + + // If the values in the resulting array are not objects then + // we already hit the bottom level and we have simply numbers + // in the array + if (typeof status[0] !== 'object') { + break; + } + + // Otherwise, we create an object which consists on the merged + // objects contained in the array + // e.g., [{a:'b'}, {b:'c'}] -> {a:'b', b:'c'} + // After that we're OK for the next iteration + status = status.reduce( + function (prev, v, idx, array) { + if (idx == 0) { + return v; + } + for (var attrname in prev) { + v[attrname] = prev[attrname]; + } + return v; + } + ) + } + + // Reduce to single common value if possible + // "Finished" and "Running" reduce to "Running" + // Otherwise we reduce to -1, which we interpret as "Indeterminate" + return status.reduce( + function (prev, v, idx, array) { + if (prev == -1) { + return -1; + } else if (prev == 3 && v == 4 || prev == 4 && v == 3) { + return 3; + } + return (prev == v) ? v : -1; + } + ); + } + + // otherwise we simply return the status, which should be an integer + return status; } function sessionStatusToString(status) { - return (status == -1) ? 'Indeterminate' : SESSION_STATUS[status]; + return (status == -1) ? 'Indeterminate' : SESSION_STATUS[status]; } function getRender() { - var render = new dagreD3.render(); - - // Add our custom shape (parallelogram, similar to the PIP PDR document) - render.shapes().parallelogram = function(parent, bbox, node) { - var w = bbox.width, - h = bbox.height, - points = [ - { x: 0, y: 0}, - { x: w*0.8, y: 0}, - { x: w, y: -h}, - { x: w*0.2, y: -h}, - ]; - var shapeSvg = parent.insert("polygon", ":first-child") - .attr("points", points.map(function(d) { return d.x + "," + d.y; }).join(" ")) - .attr("transform", "translate(" + (-w/2) + "," + (h/2) + ")"); - - node.intersect = function(point) { - return dagreD3.intersect.polygon(node, points, point); - }; - - return shapeSvg; - }; - - return render; + var render = new dagreD3.render(); + + // Add our custom shape (parallelogram, similar to the PIP PDR document) + render.shapes().parallelogram = function (parent, bbox, node) { + var w = bbox.width, + h = bbox.height, + points = [ + {x: 0, y: 0}, + {x: w * 0.8, y: 0}, + {x: w, y: -h}, + {x: w * 0.2, y: -h}, + ]; + var shapeSvg = parent.insert("polygon", ":first-child") + .attr("points", points.map(function (d) { + return d.x + "," + d.y; + }).join(" ")) + .attr("transform", "translate(" + (-w / 2) + "," + (h / 2) + ")"); + + node.intersect = function (point) { + return dagreD3.intersect.polygon(node, points, point); + }; + + return shapeSvg; + }; + + return render; } function loadSessions(serverUrl, tbodyEl, refreshBtn, selectedNode, delay) { - refreshBtn.attr('disabled'); - - // Support for node query forwarding - var url = serverUrl + '/api'; - if( selectedNode ) { - url += '/nodes/' + selectedNode; - } - url += '/sessions'; - - var sessionLink = function(s) { - var url = 'session?sessionId=' + s; - if( selectedNode ) { url += '&node=' + selectedNode; } - return url; - }; - - var cancelBtnSessionId = function(s) { - console.log(hashCode(s)) - return "cancelBtn" + hashCode(s); - }; - - var hashCode = function(s){ - return s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0); - } - - d3.json(url, function (error, response){ - if( error ) { - console.error(error) - refreshBtn.attr('disabled', null); - return - } - - var sessions = response; - sessions.sort(function comp(a,b) { - return (a.sessionId < b.sessionId) ? -1 : (a.sessionId > b.sessionId); - }); - console.log(sessions[0]); - var rows = tbodyEl.selectAll('tr').data(sessions); - rows.exit().transition().delay(0).duration(500).style('opacity',0.0).remove(); - rows.enter().append('tr').style('opacity', 0.0).transition().delay(0).duration(500).style('opacity',1.0); - - var idCells = rows.selectAll('td.id').data(function values(s) { return [s.sessionId]; }); - idCells.enter().append('td').classed('id', true).text(String) - idCells.text(String) - idCells.exit().remove() - - var statusCells = rows.selectAll('td.status').data(function values(s) { return [uniqueSessionStatus(s.status)]; }); - statusCells.enter().append('td').classed('status', true).text(function(s) { return sessionStatusToString(s); }) - statusCells.text(function(s) {return sessionStatusToString(s)}) - statusCells.exit().remove() - - var sizeCells = rows.selectAll('td.size').data(function values(s) { return [s.size]; }); - sizeCells.enter().append('td').classed('size', true).text(String) - sizeCells.text(String) - sizeCells.exit().remove() - - statusCells = rows.selectAll('td.details').data(function values(s) { return [s.sessionId]; }); - statusCells.enter().append('td').classed('details', true) - .append('a').attr('href', sessionLink) - .append('span').classed('glyphicon glyphicon-share-alt', true) - statusCells.select('a').attr('href', sessionLink) - statusCells.exit().remove() - - var actionCells = rows.selectAll('td.actions').data(function values(s) { return [s.sessionId]; }); - actionCells.enter().append('td').classed('actions', true) + refreshBtn.attr('disabled'); + + // Support for node query forwarding + var url = serverUrl + '/api'; + if (selectedNode) { + url += '/nodes/' + selectedNode; + } + url += '/sessions'; + + var sessionLink = function (s) { + var url = 'session?sessionId=' + s; + if (selectedNode) { + url += '&node=' + selectedNode; + } + return url; + }; + + var cancelBtnSessionId = function (s) { + console.log(hashCode(s)) + return "cancelBtn" + hashCode(s); + }; + + var hashCode = function (s) { + return s.split("").reduce(function (a, b) { + a = ((a << 5) - a) + b.charCodeAt(0); + return a & a + }, 0); + } + + d3.json(url, function (error, response) { + if (error) { + console.error(error) + refreshBtn.attr('disabled', null); + return + } + + var sessions = response; + sessions.sort(function comp(a, b) { + return (a.sessionId < b.sessionId) ? -1 : (a.sessionId > b.sessionId); + }); + console.log(sessions[0]); + var rows = tbodyEl.selectAll('tr').data(sessions); + rows.exit().transition().delay(0).duration(500).style('opacity', 0.0).remove(); + rows.enter().append('tr').style('opacity', 0.0).transition().delay(0).duration(500).style('opacity', 1.0); + + var idCells = rows.selectAll('td.id').data(function values(s) { + return [s.sessionId]; + }); + idCells.enter().append('td').classed('id', true).text(String) + idCells.text(String) + idCells.exit().remove() + + var statusCells = rows.selectAll('td.status').data(function values(s) { + return [uniqueSessionStatus(s.status)]; + }); + statusCells.enter().append('td').classed('status', true).text(function (s) { + return sessionStatusToString(s); + }) + statusCells.text(function (s) { + return sessionStatusToString(s) + }) + statusCells.exit().remove() + + var sizeCells = rows.selectAll('td.size').data(function values(s) { + return [s.size]; + }); + sizeCells.enter().append('td').classed('size', true).text(String) + sizeCells.text(String) + sizeCells.exit().remove() + + statusCells = rows.selectAll('td.details').data(function values(s) { + return [s.sessionId]; + }); + statusCells.enter().append('td').classed('details', true) + .append('a').attr('href', sessionLink) + .append('span').classed('glyphicon glyphicon-share-alt', true) + statusCells.select('a').attr('href', sessionLink) + statusCells.exit().remove() + + var actionCells = rows.selectAll('td.actions').data(function values(s) { + return [s.sessionId]; + }); + actionCells.enter().append('td').classed('actions', true) .append("button").attr('id', cancelBtnSessionId) .attr('type', 'button').attr('class', 'btn btn-default').text('Cancel') - actionCells.select('button') - actionCells.exit().remove() - - sessions.forEach(function(session) { - console.log(session) - var cancelSessionBtn = d3.select("#cancelBtn" + hashCode(session.sessionId)); - // Listeners for the cancelSession button - cancelSessionBtn.on('click', function() { cancel_session(serverUrl, session.sessionId, cancelSessionBtn); } ); - }) - - refreshBtn.attr('disabled', null); - - if( !(typeof delay === 'undefined') ) { - d3.timer(function(){ - loadSessions(serverUrl, tbodyEl, refreshBtn, selectedNode, delay); - return true; - }, delay); - } - }); + actionCells.select('button') + actionCells.exit().remove() + + sessions.forEach(function (session) { + console.log(session) + var cancelSessionBtn = d3.select("#cancelBtn" + hashCode(session.sessionId)); + // Listeners for the cancelSession button + cancelSessionBtn.on('click', function () { + cancel_session(serverUrl, session.sessionId, cancelSessionBtn); + }); + }) + + refreshBtn.attr('disabled', null); + + if (!(typeof delay === 'undefined')) { + d3.timer(function () { + loadSessions(serverUrl, tbodyEl, refreshBtn, selectedNode, delay); + return true; + }, delay); + } + }); } function promptNewSession(serverUrl, tbodyEl, refreshBtn) { - bootbox.prompt("Session ID", function(sessionId) { - if( sessionId == null ) { - return; - } - var xhr = d3.xhr(serverUrl + '/api/sessions'); - xhr.header("Content-Type", "application/json"); - xhr.post(JSON.stringify({sessionId: sessionId}), function(error, data) { - if( error != null ) { - console.error(error) - bootbox.alert('An error occurred while creating session ' + sessionId + ': ' + error.responseText) - return - } - loadSessions(serverUrl, tbodyEl, refreshBtn, null) - }); - }); + bootbox.prompt("Session ID", function (sessionId) { + if (sessionId == null) { + return; + } + var xhr = d3.xhr(serverUrl + '/api/sessions'); + xhr.header("Content-Type", "application/json"); + xhr.post(JSON.stringify({sessionId: sessionId}), function (error, data) { + if (error != null) { + console.error(error) + bootbox.alert('An error occurred while creating session ' + sessionId + ': ' + error.responseText) + return + } + loadSessions(serverUrl, tbodyEl, refreshBtn, null) + }); + }); } function drawGraphForDrops(g, drawGraph, oids, doSpecs) { - // Keep track of modifications to see if we need to re-draw - var modified = false; - - // #1: create missing nodes in the graph - // Because oids is sorted, they will be created in oid order - var time0 = new Date().getTime(); - for(var idx in oids) { - var doSpec = doSpecs[oids[idx]]; - modified |= _addNode(g, doSpec); - } - - var time1 = new Date().getTime(); - console.log('Took %d [ms] to create the nodes', (time1 - time0)) - - // #2: establish missing relationships - for(var idx in oids) { - var doSpec = doSpecs[oids[idx]]; - var lhOid = doSpec.oid; - - // x-to-many relationships producing lh->rh edges - for(var relIdx in TO_MANY_LTR_RELS) { - var rel = TO_MANY_LTR_RELS[relIdx]; - if( rel in doSpec ) { - for(var rhOid in doSpec[rel]) { - modified |= _addEdge(g, lhOid, doSpec[rel][rhOid]); - } - } - } - // x-to-many relationships producing rh->lh edges - for(var relIdx in TO_MANY_RTL_RELS) { - var rel = TO_MANY_RTL_RELS[relIdx]; - if( rel in doSpec ) { - for(var rhOid in doSpec[rel]) { - modified |= _addEdge(g, doSpec[rel][rhOid], lhOid); - } - } - } - // there currently are no x-to-one relationships producing rh->lh edges - // there currently are no x-to-one relationships producing lh->rh edges - } - - var time2 = new Date().getTime(); - console.log('Took %d [ms] to create the edges', (time2 - time1)) - - if( modified ) { - drawGraph(); - } - - var time3 = new Date().getTime(); - console.log('Took %d [ms] to draw the hole thing', (time3 - time2)) + // Keep track of modifications to see if we need to re-draw + var modified = false; + + // #1: create missing nodes in the graph + // Because oids is sorted, they will be created in oid order + var time0 = new Date().getTime(); + for (var idx in oids) { + var doSpec = doSpecs[oids[idx]]; + modified |= _addNode(g, doSpec); + } + + var time1 = new Date().getTime(); + console.log('Took %d [ms] to create the nodes', (time1 - time0)) + + // #2: establish missing relationships + for (var idx in oids) { + var doSpec = doSpecs[oids[idx]]; + var lhOid = doSpec.oid; + + // x-to-many relationships producing lh->rh edges + for (var relIdx in TO_MANY_LTR_RELS) { + var rel = TO_MANY_LTR_RELS[relIdx]; + if (rel in doSpec) { + for (var rhOid in doSpec[rel]) { + modified |= _addEdge(g, lhOid, doSpec[rel][rhOid]); + } + } + } + // x-to-many relationships producing rh->lh edges + for (var relIdx in TO_MANY_RTL_RELS) { + var rel = TO_MANY_RTL_RELS[relIdx]; + if (rel in doSpec) { + for (var rhOid in doSpec[rel]) { + modified |= _addEdge(g, doSpec[rel][rhOid], lhOid); + } + } + } + // there currently are no x-to-one relationships producing rh->lh edges + // there currently are no x-to-one relationships producing lh->rh edges + } + + var time2 = new Date().getTime(); + console.log('Took %d [ms] to create the edges', (time2 - time1)) + + if (modified) { + drawGraph(); + } + + var time3 = new Date().getTime(); + console.log('Took %d [ms] to draw the hole thing', (time3 - time2)) } @@ -299,108 +327,106 @@ function drawGraphForDrops(g, drawGraph, oids, doSpecs) { function startStatusQuery(serverUrl, sessionId, selectedNode, graph_update_handler, status_update_handler, delay) { - // Support for node query forwarding - var url = serverUrl + '/api'; - if( selectedNode ) { - url += '/nodes/' + selectedNode; - } - url += '/sessions/' + sessionId; - - function updateGraph() { - - d3.json(url, function(error, sessionInfo) { - - if (error) { - console.error(error); - return; - } - - var doSpecs = sessionInfo['graph']; - var status = uniqueSessionStatus(sessionInfo['status']); - d3.select('#session-status').text(sessionStatusToString(status)); - - var oids = Object.keys(doSpecs); - if( oids.length > 0 ) { - // Get sorted oids - oids.sort(); - graph_update_handler(oids, doSpecs); - } - - // During PRISITINE and BUILDING we need to update the graph structure - // During DEPLOYING we call ourselves again anyway, because we need - // to know when we go to RUNNING. - // During RUNNING (or potentially FINISHED/CANCELLED, if the execution is - // extremely fast) we need to start updating the status of the graph - if (status == 3 || status == 4 || status == 5) { - startGraphStatusUpdates(serverUrl, sessionId, selectedNode, delay, - status_update_handler); - } - else if( status == 0 || status == 1 || status == 2 || status == -1 ){ - // schedule a new JSON request - d3.timer(updateGraph, delay); - } - - }) - // This makes d3.timer invoke us only once - return true; - } - d3.timer(updateGraph); + // Support for node query forwarding + var url = serverUrl + '/api'; + if (selectedNode) { + url += '/nodes/' + selectedNode; + } + url += '/sessions/' + sessionId; + + function updateGraph() { + + d3.json(url, function (error, sessionInfo) { + + if (error) { + console.error(error); + return; + } + + var doSpecs = sessionInfo['graph']; + var status = uniqueSessionStatus(sessionInfo['status']); + d3.select('#session-status').text(sessionStatusToString(status)); + + var oids = Object.keys(doSpecs); + if (oids.length > 0) { + // Get sorted oids + oids.sort(); + graph_update_handler(oids, doSpecs); + } + + // During PRISITINE and BUILDING we need to update the graph structure + // During DEPLOYING we call ourselves again anyway, because we need + // to know when we go to RUNNING. + // During RUNNING (or potentially FINISHED/CANCELLED, if the execution is + // extremely fast) we need to start updating the status of the graph + if (status == 3 || status == 4 || status == 5) { + startGraphStatusUpdates(serverUrl, sessionId, selectedNode, delay, + status_update_handler); + } else if (status == 0 || status == 1 || status == 2 || status == -1) { + // schedule a new JSON request + d3.timer(updateGraph, delay); + } + + }) + // This makes d3.timer invoke us only once + return true; + } + + d3.timer(updateGraph); } function _addNode(g, doSpec) { - if( g.hasNode(g) ) { - return false; - } - - var typeClass = doSpec.type; - var typeShape = TYPE_SHAPES[doSpec.type]; - var notes = ''; - if( doSpec.type == 'app' ) { - var nameParts = doSpec.app.split('.'); - notes = nameParts[nameParts.length - 1]; - } - else if( doSpec.type == 'plain' ) { - notes = 'storage: ' + doSpec.storage; - } - else if( doSpec.type == 'socket' ) { - notes = 'port: ' + doSpec.port; - } - if( doSpec.nm ) { - notes += '
    ' + doSpec.nm - } - - var oid = doSpec.oid; - var html = '
    '; - html += '' + oid + ''; - html += '' + notes + ''; - html += "
    "; - g.setNode(oid, { - labelType: "html", - label: html, - rx: 5, - ry: 5, - padding: 0, - class: typeClass, - shape: typeShape - }); - return true; + if (g.hasNode(g)) { + return false; + } + + var typeClass = doSpec.type; + var typeShape = TYPE_SHAPES[doSpec.type]; + var notes = ''; + if (doSpec.type == 'app') { + var nameParts = doSpec.app.split('.'); + notes = nameParts[nameParts.length - 1]; + } else if (doSpec.type == 'plain') { + notes = 'storage: ' + doSpec.storage; + } else if (doSpec.type == 'socket') { + notes = 'port: ' + doSpec.port; + } + if (doSpec.nm) { + notes += '
    ' + doSpec.nm + } + + var oid = doSpec.oid; + var html = '
    '; + html += '' + oid + ''; + html += '' + notes + ''; + html += "
    "; + g.setNode(oid, { + labelType: "html", + label: html, + rx: 5, + ry: 5, + padding: 0, + class: typeClass, + shape: typeShape + }); + return true; } function _addEdge(g, fromOid, toOid) { - if( g.hasEdge(fromOid, toOid) ) { - return false; - } - if( !g.hasNode(fromOid) ) { - console.error('No DROP found with oid ' + fromOid); - return false; - } - if( !g.hasNode(toOid) ) { - console.error('No DROP found with oid ' + toOid); - return false; - } - g.setEdge(fromOid, toOid, {width: 40}); - return true; + if (g.hasEdge(fromOid, toOid)) { + return false; + } + if (!g.hasNode(fromOid)) { + console.error('No DROP found with oid ' + fromOid); + return false; + } + if (!g.hasNode(toOid)) { + console.error('No DROP found with oid ' + toOid); + return false; + } + g.setEdge(fromOid, toOid, {width: 40}); + return true; } @@ -412,53 +438,55 @@ function _addEdge(g, fromOid, toOid) { function startGraphStatusUpdates(serverUrl, sessionId, selectedNode, delay, status_update_handler) { - // Support for node query forwarding - var url = serverUrl + '/api'; - if( selectedNode ) { - url += '/nodes/' + selectedNode; - } - url += '/sessions/' + sessionId + '/graph/status'; - - function updateStates() { - d3.json(url, function(error, response) { - if (error) { - console.error(error); - return; - } - - // Change from {B:{status:2,execStatus:0}, A:{status:1}, ...} - // to [{status:1},{status:2,execStatus:0}...] - // (i.e., sort by key and get values only) - var keys = Object.keys(response); - keys.sort(); - var statuses = keys.map(function(k) {return response[k]}); - - // This works assuming that the status list comes in the same order - // that the graph was created, which is true - // Anyway, we could double-check in the future - status_update_handler(statuses); - - var allCompleted = statuses.reduce(function(prevVal, curVal, idx, arr) { - var cur_status = get_status_name(curVal); - return prevVal && (cur_status == 'completed' || cur_status == 'error' || cur_status == 'cancelled'); - }, true); - if (!allCompleted) { - d3.timer(updateStates, delay); - } - else { - // A final update on the session's status - d3.json(serverUrl + '/api/sessions/' + sessionId + '/status', function(error, status) { - if (error) { - console.error(error); - return; - } - d3.select('#session-status').text(sessionStatusToString(uniqueSessionStatus(status))); - }); - } - }) - return true; - } - d3.timer(updateStates); + // Support for node query forwarding + var url = serverUrl + '/api'; + if (selectedNode) { + url += '/nodes/' + selectedNode; + } + url += '/sessions/' + sessionId + '/graph/status'; + + function updateStates() { + d3.json(url, function (error, response) { + if (error) { + console.error(error); + return; + } + + // Change from {B:{status:2,execStatus:0}, A:{status:1}, ...} + // to [{status:1},{status:2,execStatus:0}...] + // (i.e., sort by key and get values only) + var keys = Object.keys(response); + keys.sort(); + var statuses = keys.map(function (k) { + return response[k] + }); + + // This works assuming that the status list comes in the same order + // that the graph was created, which is true + // Anyway, we could double-check in the future + status_update_handler(statuses); + + var allCompleted = statuses.reduce(function (prevVal, curVal, idx, arr) { + var cur_status = get_status_name(curVal); + return prevVal && (cur_status == 'completed' || cur_status == 'error' || cur_status == 'cancelled'); + }, true); + if (!allCompleted) { + d3.timer(updateStates, delay); + } else { + // A final update on the session's status + d3.json(serverUrl + '/api/sessions/' + sessionId + '/status', function (error, status) { + if (error) { + console.error(error); + return; + } + d3.select('#session-status').text(sessionStatusToString(uniqueSessionStatus(status))); + }); + } + }) + return true; + } + + d3.timer(updateStates); } /** @@ -488,7 +516,7 @@ function cancel_session(serverUrl, sessionId, cancelSessionBtn) { var url = serverUrl + '/api'; url += '/sessions/' + sessionId; - d3.json(url, function(error, sessionInfo) { + d3.json(url, function (error, sessionInfo) { if (error) { //bootbox.alert(error); @@ -504,7 +532,7 @@ function cancel_session(serverUrl, sessionId, cancelSessionBtn) { d3.json(url).post(function (error, response) { // We don't expect a response so ignoring it. - if( error ) { + if (error) { console.error(error) return } diff --git a/daliuge-runtime/dlg/ngaslite.py b/daliuge-runtime/dlg/ngaslite.py index f127e35b2..eb677489c 100644 --- a/daliuge-runtime/dlg/ngaslite.py +++ b/daliuge-runtime/dlg/ngaslite.py @@ -42,9 +42,11 @@ def retrieve(host, fileId, port=7777, timeout=None): conn.request('GET', '/RETRIEVE?file_id=' + fileId) response = conn.getresponse() if response.status != httplib.OK: - raise Exception("Error while RETRIEVE-ing %s from %s:%d: %d %s" % (fileId, host, port, response.status, response.msg)) + raise Exception( + "Error while RETRIEVE-ing %s from %s:%d: %d %s" % (fileId, host, port, response.status, response.msg)) return response + def beingArchive(host, fileId, port=7777, timeout=0, length=-1): """ Opens a connecting to the NGAS server located at `host`:`port` and sends out @@ -63,10 +65,12 @@ def beingArchive(host, fileId, port=7777, timeout=0, length=-1): conn.endheaders() return conn + def finishArchive(conn, fileId): """ Checks that an archiving started by `beginArchive` went on successfully. """ response = conn.getresponse() if response.status != httplib.OK: - raise Exception("Error while QARCHIVE-ing %s to %s:%d: %d %s" % (fileId, conn.host, conn.port, response.status, response.msg)) \ No newline at end of file + raise Exception("Error while QARCHIVE-ing %s to %s:%d: %d %s" % ( + fileId, conn.host, conn.port, response.status, response.msg)) diff --git a/daliuge-runtime/dlg/remote.py b/daliuge-runtime/dlg/remote.py index 50f46fbe2..c3e15a926 100644 --- a/daliuge-runtime/dlg/remote.py +++ b/daliuge-runtime/dlg/remote.py @@ -27,24 +27,24 @@ import os import time +import scp from paramiko.client import SSHClient, AutoAddPolicy from paramiko.rsakey import RSAKey -import scp - logger = logging.getLogger(__name__) + def execRemoteWithClient(client, command, timeout=None, bufsize=-1): """ Executes `command` using the given SSH `client`. """ chan = client.get_transport().open_session() chan.settimeout(timeout) - chan.exec_command('/bin/bash -l -c "%s"' % (command.replace('"','\"'))) + chan.exec_command('/bin/bash -l -c "%s"' % (command.replace('"', '\"'))) # Otherwise do something like this: - #chan.get_pty(width=80, height=24) - #chan.invoke_shell() - #chan.sendall(command + "\n") + # chan.get_pty(width=80, height=24) + # chan.invoke_shell() + # chan.sendall(command + "\n") # Wait until the command has finished execution and return the full contents # of the stdout and stderr @@ -63,6 +63,7 @@ def execRemoteWithClient(client, command, timeout=None, bufsize=-1): stderr = f.read() return stdout, stderr, exitStatus + def execRemote(host, command, username=None, timeout=None, bufsize=-1): """ Executes `command` on `host`. If `username` is provided, the command will @@ -72,6 +73,7 @@ def execRemote(host, command, username=None, timeout=None, bufsize=-1): with createClient(host, username) as client: return execRemoteWithClient(client, command, timeout, bufsize) + def createClient(host, username=None, pkeyPath=None): """ Creates an SSH client object that can be used to perform SSH-related @@ -84,10 +86,12 @@ def createClient(host, username=None, pkeyPath=None): client.connect(host, username=username, pkey=pkey) return client + def __scpProgress(filename, size, sent): if size == sent: logger.debug("Finished scp-ing %s (%d bytes)", filename, sent) + def copyFrom(host, remotePath, localPath='.', recursive=False, username=None, pkeyPath=None, timeout=None): """ Copies the files located at `host`:`remotePath` to `localPath` connecting @@ -101,6 +105,7 @@ def copyFrom(host, remotePath, localPath='.', recursive=False, username=None, pk scpClient.get(remote_path=remotePath, local_path=localPath, recursive=recursive) client.close() + def copyTo(host, localFiles, remotePath='.', recursive=False, username=None, pkeyPath=None, timeout=None): """ Copies the files located at `localPath` to `host`:`remotePath` connecting @@ -112,4 +117,4 @@ def copyTo(host, localFiles, remotePath='.', recursive=False, username=None, pke client = createClient(host, username=username, pkeyPath=pkeyPath) with scp.SCPClient(client.get_transport(), progress=__scpProgress, socket_timeout=timeout) as scpClient: scpClient.put(localFiles, remote_path=remotePath, recursive=recursive) - client.close() \ No newline at end of file + client.close() diff --git a/daliuge-runtime/dlg/reproducibility/__jnit__.py b/daliuge-runtime/dlg/reproducibility/__jnit__.py index 23a4d8be3..f56e77e7d 100644 --- a/daliuge-runtime/dlg/reproducibility/__jnit__.py +++ b/daliuge-runtime/dlg/reproducibility/__jnit__.py @@ -21,4 +21,4 @@ # """ This package contains code resources required to integrate reproduciblity measure into DALiuGE. -""" \ No newline at end of file +""" diff --git a/daliuge-runtime/dlg/restserver.py b/daliuge-runtime/dlg/restserver.py index e08bc2cbc..e1dc5d188 100644 --- a/daliuge-runtime/dlg/restserver.py +++ b/daliuge-runtime/dlg/restserver.py @@ -23,11 +23,11 @@ import bottle - from .restutils import RestServerWSGIServer logger = logging.getLogger(__name__) + class RestServer(object): """ The base class for our REST servers @@ -52,4 +52,4 @@ def stop(self, timeout=None): logger.info("Stopping REST server") self._server.server_close() self.app.close() - self._server = None \ No newline at end of file + self._server = None diff --git a/daliuge-runtime/dlg/rpc.py b/daliuge-runtime/dlg/rpc.py index a6cc040ec..bc26253b4 100644 --- a/daliuge-runtime/dlg/rpc.py +++ b/daliuge-runtime/dlg/rpc.py @@ -31,23 +31,25 @@ import logging import os import threading -import time from six.moves import queue as Queue # @UnresolvedImport from . import utils from .exceptions import DaliugeException - logger = logging.getLogger(__name__) + class RPCObject(object): """Base class for all RCP clients and server""" + def start(self): self.rpc_running = True + def shutdown(self): self.rpc_running = False + class RPCClientBase(RPCObject): """Base class for all RPC clients""" @@ -62,12 +64,13 @@ def get_drop_attribute(self, hostname, port, session_id, uid, name): class remote_method(object): def __del__(self): closer() + def __call__(self, *args): return client.call_drop(session_id, uid, name, *args) # Shortcut to avoid extra calls known_methods = () - #known_methods = ('open', 'read', 'write', 'close') + # known_methods = ('open', 'read', 'write', 'close') closeit = False try: if name in known_methods or client.has_method(session_id, uid, name): @@ -78,8 +81,10 @@ def __call__(self, *args): if closeit: closer() + class RPCServerBase(RPCObject): """Base class for all RPC server""" + def __init__(self, host, port): self._rpc_host = host self._rpc_port = port @@ -130,10 +135,13 @@ def __make_call(self, method, *args): if x.is_exception: raise x.value return x.value + def call_drop(self, session_id, uid, name, *args): return self.__make_call('call_drop', session_id, uid, name, *args) + def get_drop_property(self, session_id, uid, name): return self.__make_call('get_drop_property', session_id, uid, name) + def has_method(self, session_id, uid, name): return self.__make_call('has_method', session_id, uid, name) @@ -150,7 +158,7 @@ def run_zrpcclient(self, host, port, req_queue): # and generates the same channel IDs, confusing the server import zerorpc ctx = zerorpc.Context() - client = zerorpc.Client("tcp://%s:%d" % (host,port), context=ctx) + client = zerorpc.Client("tcp://%s:%d" % (host, port), context=ctx) forwarder = gevent.spawn(self.forward_requests, req_queue, client) gevent.joinall([forwarder]) @@ -188,6 +196,7 @@ def get_rpc_client(self, hostname, port): # No closing function since clients are long-lived return client, lambda: None + class ZeroRPCServer(RPCServerBase): """ZeroRPC server support""" @@ -202,7 +211,8 @@ def start(self): # Starts the single-threaded ZeroRPC server for RPC requests timeout = 30 server_started = threading.Event() - self._zrpcserverthread = threading.Thread(target=self.run_zrpcserver, name="ZeroRPC server", args=(self._rpc_host, self._rpc_port, server_started)) + self._zrpcserverthread = threading.Thread(target=self.run_zrpcserver, name="ZeroRPC server", + args=(self._rpc_host, self._rpc_port, server_started)) self._zrpcserverthread.start() if not server_started.wait(timeout): raise Exception("ZeroRPC server didn't start within %d seconds" % (timeout,)) @@ -240,7 +250,7 @@ def shutdown(self): self._zrpcserverthread.join() -class RPyCClient(RPCClientBase): # pragma: no cover +class RPyCClient(RPCClientBase): # pragma: no cover """RPyC client support""" def get_rpc_client(self, hostname, port): @@ -248,7 +258,8 @@ def get_rpc_client(self, hostname, port): client = rpyc.connect(hostname, port) return client.root, client.close -class RPyCServer(RPCServerBase): # pragma: no cover + +class RPyCServer(RPCServerBase): # pragma: no cover """RPyC server support""" def start(self): @@ -258,15 +269,18 @@ def start(self): from rpyc.utils.server import ThreadedServer nm = self + class NMService(rpyc.Service): def exposed_call_drop(self, session_id, uid, name, *args): return nm.call_drop(session_id, uid, name, *args) + def exposed_get_drop_property(self, session_id, uid, name): return nm.get_drop_attribute(session_id, uid, name) + def exposed_has_method(self, session_id, uid, name): return nm.has_method(session_id, uid, name) - self._rpycserver = ThreadedServer(NMService, hostname=self._rpc_host, port=self._rpc_port) # ThreadPoolServer + self._rpycserver = ThreadedServer(NMService, hostname=self._rpc_host, port=self._rpc_port) # ThreadPoolServer # Starts the single-threaded RPyC server for RPC requests self._rpycserverthread = threading.Thread(target=self._rpycserver.start, name="RPyC server") @@ -278,7 +292,8 @@ def shutdown(self): self._rpycserver.close() self._rpycserverthread.join() -class PyroRPCClient(RPCClientBase): # pragma: no cover + +class PyroRPCClient(RPCClientBase): # pragma: no cover """Pyro client support""" def get_rpc_client(self, hostname, port): @@ -287,7 +302,8 @@ def get_rpc_client(self, hostname, port): proxy = Pyro4.Proxy(uri) return proxy, proxy._pyroRelease -class PyroRPCServer(RPCServerBase): # pragma: no cover + +class PyroRPCServer(RPCServerBase): # pragma: no cover """Base Pyro server support. Subclasses support different server types""" def start(self): @@ -346,7 +362,7 @@ def setup_serpent(): from .event import Event def __pyro4_class_to_dict(o): - d = {'__class__' : o.__class__.__name__, '__module__': o.__class__.__module__} + d = {'__class__': o.__class__.__name__, '__module__': o.__class__.__module__} d.update(o.__dict__) return d @@ -368,7 +384,7 @@ def setup_pickle(): Pyro4.config.SERIALIZERS_ACCEPTED = ['pickle'] # We could also do one or the other depending on the major version of python - #setup_serpent() + # setup_serpent() setup_pickle() # In Pyro4 >= 4.46 the default for this option changed to True, which would @@ -381,7 +397,8 @@ def setup_pickle(): # than enough Pyro4.config.COMMTIMEOUT = 60 -class MultiplexPyroRPCServer(PyroRPCServer): # pragma: no cover + +class MultiplexPyroRPCServer(PyroRPCServer): # pragma: no cover """Pyro server support with mutliplex server type""" def setup_pyro(self): @@ -389,7 +406,8 @@ def setup_pyro(self): import Pyro4 Pyro4.config.SERVERTYPE = 'multiplex' -class ThreadedPyroRPCServer(PyroRPCServer): # pragma: no cover + +class ThreadedPyroRPCServer(PyroRPCServer): # pragma: no cover """Pyro server support with multithreaded server type""" def setup_pyro(self): @@ -400,18 +418,21 @@ def setup_pyro(self): if hasattr(Pyro4.config, 'THREADPOOL_ALLOW_QUEUE'): Pyro4.config.THREADPOOL_ALLOW_QUEUE = False + # Check which rpc backend should be exposed rpc_lib = os.environ.get('DALIUGE_RPC', 'zerorpc') -if rpc_lib in ('pyro', 'pyro-multiplex'): # pragma: no cover +if rpc_lib in ('pyro', 'pyro-multiplex'): # pragma: no cover RPCServer, RPCClient = MultiplexPyroRPCServer, PyroRPCClient -elif rpc_lib == 'pyro-threaded': # pragma: no cover +elif rpc_lib == 'pyro-threaded': # pragma: no cover RPCServer, RPCClient = ThreadedPyroRPCServer, PyroRPCClient elif rpc_lib == 'zerorpc': RPCServer, RPCClient = ZeroRPCServer, ZeroRPCClient -elif rpc_lib == 'rpyc': # pragma: no cover +elif rpc_lib == 'rpyc': # pragma: no cover RPCServer, RPCClient = RPyCServer, RPyCClient -else: # pragma: no cover - raise DaliugeException("Unknown RPC lib %s, use one of pyro, pyro-multiplex, pyro-threaded, zerorpc, rpyc" % (rpc_lib,)) +else: # pragma: no cover + raise DaliugeException( + "Unknown RPC lib %s, use one of pyro, pyro-multiplex, pyro-threaded, zerorpc, rpyc" % (rpc_lib,)) + class DropProxy(object): """ @@ -439,4 +460,4 @@ def __getattr__(self, name): return self.rpc_client.get_drop_attribute(self.hostname, self.port, self.session_id, self.uid, name) def __repr__(self): - return '' % (self.uid, self.session_id, self.hostname, self.port) \ No newline at end of file + return '' % (self.uid, self.session_id, self.hostname, self.port) diff --git a/daliuge-runtime/dlg/runtime/__init__.py b/daliuge-runtime/dlg/runtime/__init__.py index a1f21c8b0..aae38834d 100644 --- a/daliuge-runtime/dlg/runtime/__init__.py +++ b/daliuge-runtime/dlg/runtime/__init__.py @@ -24,11 +24,11 @@ the system. """ + # It is of utmost importance that this is the *first* thing we do any time # we load daliuge up. Most modules in daliuge that have a logger create it at # import time, so we need to perform this setup before doing any other imports def setup_logger_class(): - # Doc building is failing due with "ValueError: Empty module name" in # "from . import drop" further below, which I can't easily explain. # Just skip this setup in RTD for the time being @@ -75,10 +75,10 @@ def makeRecord(self, *args, **kwargs): return record logging.setLoggerClass(_DlgLogger) + + setup_logger_class() del setup_logger_class from .version import git_version as __git_version__ from .version import version as __version__ -from ..apps import get_include_dir -from ..dask_emulation import delayed diff --git a/daliuge-runtime/dlg/runtime/tool_commands.py b/daliuge-runtime/dlg/runtime/tool_commands.py index 844b2b34d..fe859e073 100644 --- a/daliuge-runtime/dlg/runtime/tool_commands.py +++ b/daliuge-runtime/dlg/runtime/tool_commands.py @@ -22,16 +22,20 @@ from ..common import tool + def include_dir(_parser, _args): from . import get_include_dir print(get_include_dir()) + def register_commands(): tool.cmdwrap('nm', 'Starts a Node Manager', 'dlg.manager.cmdline:dlgNM') tool.cmdwrap('dim', 'Starts a Drop Island Manager', 'dlg.manager.cmdline:dlgDIM') tool.cmdwrap('mm', 'Starts a Master Manager', 'dlg.manager.cmdline:dlgMM') tool.cmdwrap('replay', 'Starts a Replay Manager', 'dlg.manager.cmdline:dlgReplay') tool.cmdwrap('daemon', 'Starts a DALiuGE Daemon process', 'dlg.manager.proc_daemon:run_with_cmdline') - tool.cmdwrap('proxy', 'A reverse proxy to be used in restricted environments to contact the Drop Managers', 'dlg.deploy.pawsey.dfms_proxy:run') - tool.cmdwrap('monitor', 'A proxy to be used in conjunction with the dlg proxy in restricted environments', 'dlg.deploy.pawsey.dfms_monitor:run') - tool.cmdwrap('include_dir', 'Print the directory where C header files can be found', include_dir) \ No newline at end of file + tool.cmdwrap('proxy', 'A reverse proxy to be used in restricted environments to contact the Drop Managers', + 'dlg.deploy.pawsey.dfms_proxy:run') + tool.cmdwrap('monitor', 'A proxy to be used in conjunction with the dlg proxy in restricted environments', + 'dlg.deploy.pawsey.dfms_monitor:run') + tool.cmdwrap('include_dir', 'Print the directory where C header files can be found', include_dir) diff --git a/daliuge-runtime/dlg/shoreClient.py b/daliuge-runtime/dlg/shoreClient.py index 5a8438940..3c4f98c2c 100644 --- a/daliuge-runtime/dlg/shoreClient.py +++ b/daliuge-runtime/dlg/shoreClient.py @@ -26,12 +26,14 @@ # jason.wang@icrar.org or jason.ruonan.wang@gmail.com import os + import six.moves.cPickle as pickle # @UnresolvedImport message_socket = None transport_socket = None isInited = False + def securityCheck(doid, column, row, rows): if type(row) is not int: print('ShoreClient Error: Please give a valid start row number') @@ -41,7 +43,8 @@ def securityCheck(doid, column, row, rows): return False return True -def shoreZmqInit(address = None): + +def shoreZmqInit(address=None): import zmq global message_socket global transport_socket @@ -50,7 +53,8 @@ def shoreZmqInit(address = None): message_address = address else: message_address = os.environ['SHORE_DAEMON_ADDRESS'] - transport_address = message_address.split(':')[0] + ':' + message_address.split(':')[1] + ':' + str(int(message_address.split(':')[2]) + 1) + transport_address = message_address.split(':')[0] + ':' + message_address.split(':')[1] + ':' + str( + int(message_address.split(':')[2]) + 1) context = zmq.Context() message_socket = context.socket(zmq.REQ) message_socket.connect(message_address) @@ -58,25 +62,27 @@ def shoreZmqInit(address = None): transport_socket.connect(transport_address) isInited = True + def shoreDelete(doid, column=None): if not isInited: shoreZmqInit() msg_send = { - 'operation' : 'delete', - 'doid' : doid, - 'column' : column, + 'operation': 'delete', + 'doid': doid, + 'column': column, } message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) return ret + def shoreQuery(doid, column=None): if not isInited: shoreZmqInit() msg_send = { - 'operation' : 'query', - 'doid' : doid, - 'column' : column, + 'operation': 'query', + 'doid': doid, + 'column': column, } message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) @@ -97,18 +103,19 @@ def shoreQuery(doid, column=None): return None return ret -def shoreGet(doid, column, row, rows = 1, slicer = None): - if not securityCheck(doid,column,row,rows): + +def shoreGet(doid, column, row, rows=1, slicer=None): + if not securityCheck(doid, column, row, rows): return None if not isInited: shoreZmqInit() msg_send = { - 'operation' : 'get', - 'doid' : doid, - 'column' : column, - 'row' : row, - 'rows' : rows + 'operation': 'get', + 'doid': doid, + 'column': column, + 'row': row, + 'rows': rows } message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) @@ -128,19 +135,18 @@ def shoreGet(doid, column, row, rows = 1, slicer = None): # transport if 'event_id' in ret: - pkg_dict = {'event_id':ret['event_id'],'operation':'get'} + pkg_dict = {'event_id': ret['event_id'], 'operation': 'get'} pkg_pickled = pickle.dumps(pkg_dict) transport_socket.send(pkg_pickled) ret = transport_socket.recv() ret = pickle.loads(ret) return ret -def shorePut(doid, column, row, data, rows = 1, slicer = None): - if not securityCheck(doid,column,row,rows): +def shorePut(doid, column, row, data, rows=1, slicer=None): + if not securityCheck(doid, column, row, rows): return None - if not isInited: shoreZmqInit() @@ -148,24 +154,22 @@ def shorePut(doid, column, row, data, rows = 1, slicer = None): dtype = data.dtype # message msg_send = { - 'operation' : 'put', - 'doid' : doid, - 'column' : column, - 'row' : row, + 'operation': 'put', + 'doid': doid, + 'column': column, + 'row': row, 'rows': rows, - 'shape' : shape, - 'datatype' : dtype, + 'shape': shape, + 'datatype': dtype, } if slicer: - msg_send['slicer']=slicer + msg_send['slicer'] = slicer message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) # transport if 'event_id' in ret: - msg_send = {'event_id':ret['event_id'], 'data':data, 'operation':'put'} + msg_send = {'event_id': ret['event_id'], 'data': data, 'operation': 'put'} transport_socket.send(pickle.dumps(msg_send)) ret = transport_socket.recv() ret = pickle.loads(ret) - - diff --git a/daliuge-runtime/dlg/testutils.py b/daliuge-runtime/dlg/testutils.py index 6c1c9308b..8a857385e 100644 --- a/daliuge-runtime/dlg/testutils.py +++ b/daliuge-runtime/dlg/testutils.py @@ -22,10 +22,10 @@ import threading from dlg.manager import constants +from dlg.manager.composite_manager import DataIslandManager, MasterManager from dlg.manager.node_manager import NodeManager from dlg.manager.rest import NMRestServer, CompositeManagerRestServer from dlg.utils import portIsOpen -from dlg.manager.composite_manager import DataIslandManager, MasterManager class ManagerInfo(object): @@ -48,6 +48,7 @@ def stop(self): self.manager.shutdown() self.test.assertFalse(self.thread.is_alive()) + class ManagerStarter(object): def _start_manager_in_thread(self, port, manager_class, rest_class, @@ -69,6 +70,6 @@ def start_dim_in_thread(self, nm_hosts=['127.0.0.1'], port, DataIslandManager, CompositeManagerRestServer, nm_hosts) def start_mm_in_thread(self, nm_hosts=['127.0.0.1'], - port=constants.MASTER_DEFAULT_REST_PORT): + port=constants.MASTER_DEFAULT_REST_PORT): return self._start_manager_in_thread( - port, MasterManager, CompositeManagerRestServer, nm_hosts) \ No newline at end of file + port, MasterManager, CompositeManagerRestServer, nm_hosts) diff --git a/daliuge-runtime/dlg/utils.py b/daliuge-runtime/dlg/utils.py index 15bc43b68..19ee5e57e 100644 --- a/daliuge-runtime/dlg/utils.py +++ b/daliuge-runtime/dlg/utils.py @@ -38,9 +38,9 @@ from . import common - logger = logging.getLogger(__name__) + def timed_import(module_name): """Imports `module_name` and log how long it took to import it""" start = time.time() @@ -58,17 +58,19 @@ def get_local_ip_addr(): if_addrs = [(netifaces.ifaddresses(iface), iface) for iface in ifaces] if_inet_addrs = [(tup[0][PROTO], tup[1]) for tup in if_addrs if PROTO in tup[0]] iface_addrs = [(s['addr'], tup[1]) for tup in if_inet_addrs for s in tup[0] \ - if 'addr' in s and not s['addr'].startswith('127.')] + if 'addr' in s and not s['addr'].startswith('127.')] return iface_addrs + def get_all_ipv4_addresses(): """Get a list of all IPv4 interfaces found in this computer""" proto = netifaces.AF_INET return [addr['addr'] - for iface in netifaces.interfaces() - for iface_proto, addrs in netifaces.ifaddresses(iface).items() if proto == iface_proto - for addr in addrs if 'addr' in addr - ] + for iface in netifaces.interfaces() + for iface_proto, addrs in netifaces.ifaddresses(iface).items() if proto == iface_proto + for addr in addrs if 'addr' in addr + ] + def register_service(zc, service_type_name, service_name, ipaddr, port, protocol='tcp'): """ @@ -92,12 +94,14 @@ def register_service(zc, service_type_name, service_name, ipaddr, port, protocol zc.register_service(info) return info + def deregister_service(zc, info): """ ZeroConf: Deregister service """ zc.unregister_service(info) + def browse_service(zc, service_type_name, protocol, callback): """ ZeroConf: Browse for services based on service type and protocol @@ -115,6 +119,7 @@ def browse_service(zc, service_type_name, protocol, callback): browser = ServiceBrowser(zc, stn, handlers=[callback]) return browser + def zmq_safe(host_or_addr): """Converts `host_or_addr` to a format that is safe for ZMQ to use""" @@ -125,6 +130,7 @@ def zmq_safe(host_or_addr): # Return otherwise always an IP address return socket.gethostbyname(host_or_addr) + def to_externally_contactable_host(host, prefer_local=False): """ Turns `host`, which is an address used to bind a local service, @@ -153,6 +159,7 @@ def to_externally_contactable_host(host, prefer_local=False): # All addresses were loopbacks! let's return the last one raise a + def getDlgDir(): """ Returns the root of the directory structure used by the DALiuGE framework at @@ -162,6 +169,7 @@ def getDlgDir(): return os.environ['DLG_ROOT'] return os.path.join(os.path.expanduser("~"), ".dlg") + def getDlgPidDir(): """ Returns the location of the directory used by the DALiuGE framework to store @@ -170,6 +178,7 @@ def getDlgPidDir(): """ return os.path.join(getDlgDir(), 'pid') + def getDlgLogsDir(): """ Returns the location of the directory used by the DALiuGE framework to store @@ -178,6 +187,7 @@ def getDlgLogsDir(): """ return os.path.join(getDlgDir(), 'logs') + def createDirIfMissing(path): """ Creates the given directory if it doesn't exist @@ -188,10 +198,12 @@ def createDirIfMissing(path): if e.errno != errno.EEXIST: raise + def isabs(path): """Like os.path.isabs, but handles None""" return path and os.path.isabs(path) + def fname_to_pipname(fname): """ Converts a graph filename (assuming it's a .json file) to its "pipeline" @@ -202,17 +214,19 @@ def fname_to_pipname(fname): fname = fname[:-5] return fname + def escapeQuotes(s, singleQuotes=True, doubleQuotes=True): """ Escapes single and double quotes in a string. Useful to include commands in a shell invocation or similar. """ if singleQuotes: - s = s.replace("'","'\\''") + s = s.replace("'", "'\\''") if doubleQuotes: - s = s.replace('"','\\"') + s = s.replace('"', '\\"') return s + def prepare_sql(sql, paramstyle, data=()): """ Prepares the given SQL statement for proper execution depending on the @@ -241,17 +255,23 @@ def prepare_sql(sql, paramstyle, data=()): logger.debug('Generating %d markers with paramstyle = %s', n, paramstyle) - if paramstyle == 'qmark': markers = ['?' for i in range(n)] - elif paramstyle == 'numeric': markers = [':%d'%(i) for i in range(n)] - elif paramstyle == 'named': markers = [':n%d'%(i) for i in range(n)] - elif paramstyle == 'format': markers = [':%s' for i in range(n)] - elif paramstyle == 'pyformat': markers = [':%%(n%d)s'%(i) for i in range(n)] - else: raise Exception('Unknown paramstyle: %s' % (paramstyle)) + if paramstyle == 'qmark': + markers = ['?' for i in range(n)] + elif paramstyle == 'numeric': + markers = [':%d' % (i) for i in range(n)] + elif paramstyle == 'named': + markers = [':n%d' % (i) for i in range(n)] + elif paramstyle == 'format': + markers = [':%s' for i in range(n)] + elif paramstyle == 'pyformat': + markers = [':%%(n%d)s' % (i) for i in range(n)] + else: + raise Exception('Unknown paramstyle: %s' % (paramstyle)) sql = sql.format(*markers) if paramstyle in ['format', 'pyformat']: - data = {'n%d'%(i): d for i,d in enumerate(data)} + data = {'n%d' % (i): d for i, d in enumerate(data)} return (sql, data) @@ -264,6 +284,7 @@ def object_tracking(name): """ current_object = threading.local() + def track_current_drop(f): @functools.wraps(f) @@ -278,11 +299,13 @@ def _wrapper(*args, **kwargs): return f(*args, **kwargs) finally: setattr(current_object, name, previous) + return _wrapper track_current_drop.tlocal = current_object return track_current_drop + def get_symbol(name): """Gets the global symbol ``name``, which is an "absolute path" to a python name in the form of ``pkg.subpkg.subpkg.module.name``""" @@ -290,6 +313,7 @@ def get_symbol(name): module = importlib.import_module('.'.join(parts[:-1])) return getattr(module, parts[-1]) + class ZlibUncompressedStream(object): """ A class that reads gzip-compressed content and returns uncompressed content @@ -387,6 +411,7 @@ def read(self, n=-1): return b''.join(response) + # Backwards compatibility terminate_or_kill = common.terminate_or_kill wait_or_kill = common.wait_or_kill @@ -399,4 +424,4 @@ def read(self, n=-1): write_to = common.write_to JSONStream = common.JSONStream -ZlibCompressedStream = common.ZlibCompressedStream \ No newline at end of file +ZlibCompressedStream = common.ZlibCompressedStream diff --git a/daliuge-runtime/fabfile/APPspecific.py b/daliuge-runtime/fabfile/APPspecific.py index bad1af3f3..38e5397e5 100644 --- a/daliuge-runtime/fabfile/APPspecific.py +++ b/daliuge-runtime/fabfile/APPspecific.py @@ -26,16 +26,14 @@ NOTE: This requires modifications for the specific application where this fabfile is used. Please make sure not to use it without those modifications. """ -import os, sys -from fabric.state import env -from fabric.colors import red -from fabric.operations import local +import os + +from fabric.context_managers import cd from fabric.decorators import task, parallel -from fabric.context_managers import settings, cd -from fabric.contrib.files import exists, sed +from fabric.state import env from fabric.utils import abort -from fabric.contrib.console import confirm -#import urllib2 + +# import urllib2 # >>> All the settings below are kept in the special fabric environment # >>> dictionary called env. Don't change the names, only adjust the @@ -86,39 +84,39 @@ env.AWS_INSTANCES = 1 env.AWS_INSTANCE_TYPE = 't2.micro' env.AWS_KEY_NAME = 'icrar_{0}'.format(env.APP_USER) -env.AWS_SEC_GROUP = 'DALIUGE' # Security group -env.AWS_SEC_GROUP_PORTS = [22, 80, 8000, 8001] # ports to open -env.AWS_SUDO_USER = 'ec2-user' # required to install init scripts. +env.AWS_SEC_GROUP = 'DALIUGE' # Security group +env.AWS_SEC_GROUP_PORTS = [22, 80, 8000, 8001] # ports to open +env.AWS_SUDO_USER = 'ec2-user' # required to install init scripts. # Alpha-sorted packages per package manager env.pkgs = { - 'YUM_PACKAGES': [ - 'wget', - 'tar', - 'git', - 'gcc', - 'python36-devel', #this is the latest available with AWS Linux - ], - 'APT_PACKAGES': [ - 'tar', - 'wget', - 'gcc', - ], - 'SLES_PACKAGES': [ - 'wget', - 'gcc', - ], - 'BREW_PACKAGES': [ - 'wget', - 'gcc', - ], - 'PORT_PACKAGES': [ - 'wget', - 'gcc', - ], - 'APP_EXTRA_PYTHON_PACKAGES': [ - ], - } + 'YUM_PACKAGES': [ + 'wget', + 'tar', + 'git', + 'gcc', + 'python36-devel', # this is the latest available with AWS Linux + ], + 'APT_PACKAGES': [ + 'tar', + 'wget', + 'gcc', + ], + 'SLES_PACKAGES': [ + 'wget', + 'gcc', + ], + 'BREW_PACKAGES': [ + 'wget', + 'gcc', + ], + 'PORT_PACKAGES': [ + 'wget', + 'gcc', + ], + 'APP_EXTRA_PYTHON_PACKAGES': [ + ], +} # Don't re-export the tasks imported from other modules, only the ones defined # here @@ -130,16 +128,16 @@ env.APP_repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # >>> The following lines need to be after the definitions above!!! -from fabfileTemplate.utils import sudo, info, success, default_if_empty, home, run -from fabfileTemplate.utils import overwrite_defaults, failure -from fabfileTemplate.system import check_command, get_linux_flavor, MACPORT_DIR -from fabfileTemplate.APPcommon import virtualenv, APP_doc_dependencies, APP_source_dir -from fabfileTemplate.APPcommon import APP_root_dir, extra_python_packages, APP_user, build -from fabfileTemplate.pkgmgr import check_brew_port, check_brew_cellar +from fabfileTemplate.utils import sudo, info, success, run +from fabfileTemplate.utils import overwrite_defaults +from fabfileTemplate.system import check_command, get_linux_flavor +from fabfileTemplate.APPcommon import virtualenv, APP_source_dir +from fabfileTemplate.APPcommon import APP_root_dir # get the settings from the fab environment if set on command line settings = overwrite_defaults(defaults) + def start_APP_and_check_status(): """ Starts the APP daemon process and checks that the server is up and running @@ -148,6 +146,7 @@ def start_APP_and_check_status(): virtualenv('dlg --help') success('dlg help is working...') + def sysinitstart_APP_and_check_status(): """ Starts the APP daemon process and checks that the server is up and running @@ -158,7 +157,6 @@ def sysinitstart_APP_and_check_status(): def APP_build_cmd(): - # The installation of the bsddb package (needed by ngamsCore) is in # particular difficult because it requires some flags to be passed on # (particularly if using MacOSX's port @@ -171,6 +169,7 @@ def APP_build_cmd(): return ' '.join(build_cmd) + def prepare_APP_data_dir(): """Creates a new APP root directory""" @@ -191,11 +190,12 @@ def prepare_APP_data_dir(): nrd) if res.return_code == 2: error = (nrd + " already exists. Specify APP_OVERWRITE_ROOT to " - "overwrite, or a different APP_ROOT_DIR location") + "overwrite, or a different APP_ROOT_DIR location") else: error = res abort(error) + def install_sysv_init_script(nsd, nuser, cfgfile): """ Install the APP init script for an operational deployment. @@ -229,6 +229,7 @@ def install_sysv_init_script(nsd, nuser, cfgfile): success("{0} init script installed".format(env.APP_NAME)) + @task @parallel def cleanup(): @@ -236,13 +237,14 @@ def cleanup(): run('rm -rf DALIUGE') run('if [ -f .bash_profile.orig ]; then mv .bash_profile.orig .bash_profile; fi') + def install_docker_compose(): pass + env.build_cmd = APP_build_cmd env.APP_init_install_function = install_sysv_init_script env.APP_start_check_function = start_APP_and_check_status env.sysinitAPP_start_check_function = sysinitstart_APP_and_check_status env.prepare_APP_data_dir = prepare_APP_data_dir env.APP_extra_sudo_function = install_docker_compose - diff --git a/daliuge-runtime/fabfile/__init__.py b/daliuge-runtime/fabfile/__init__.py index 598f76c63..06dc49df2 100644 --- a/daliuge-runtime/fabfile/__init__.py +++ b/daliuge-runtime/fabfile/__init__.py @@ -28,10 +28,3 @@ Other tasks, including lower-level tasks, can also be invoked. """ from . import APPspecific -from fabfileTemplate import APPcommon -from fabfileTemplate import aws -from fabfileTemplate import hl -from fabfileTemplate import pkgmgr -from fabfileTemplate import system -from fabfileTemplate import utils - diff --git a/daliuge-runtime/setup.py b/daliuge-runtime/setup.py index e11a3726d..1a0e2a7ad 100644 --- a/daliuge-runtime/setup.py +++ b/daliuge-runtime/setup.py @@ -112,6 +112,7 @@ def run(self): f.write("{0}/dist-packages".format(lp)) install.copy_file(self, PTH_FILE, os.path.join(self.install_lib, PTH_FILE)) + # Core requirements of DALiuGE # Keep alpha-sorted PLEASE! install_requires = [ @@ -165,7 +166,6 @@ def run(self): "aws": ["boto3"], } - setup( name="daliuge-runtime", version=get_version_info()[0], @@ -199,7 +199,7 @@ def run(self): "test.dropmake": ["logical_graphs/*.json"], "test.apps": ["dynlib_example.c", "dynlib_example2.c"], }, - entry_points = { + entry_points={ 'dlg.tool_commands': ['runtime=dlg.runtime.tool_commands'] }, install_requires=install_requires, diff --git a/daliuge-runtime/test/__init__.py b/daliuge-runtime/test/__init__.py index c5c2f0ace..6a270caa5 100644 --- a/daliuge-runtime/test/__init__.py +++ b/daliuge-runtime/test/__init__.py @@ -21,7 +21,6 @@ # def __setupTestLogging(): - import os import logging @@ -34,5 +33,6 @@ def __setupTestLogging(): else: logging.root.addHandler(logging.NullHandler()) + __setupTestLogging() -del __setupTestLogging \ No newline at end of file +del __setupTestLogging diff --git a/daliuge-runtime/test/apps/__init__.py b/daliuge-runtime/test/apps/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/apps/__init__.py +++ b/daliuge-runtime/test/apps/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/apps/test_bash.py b/daliuge-runtime/test/apps/test_bash.py index 1e2b2175d..dd7d07f7c 100644 --- a/daliuge-runtime/test/apps/test_bash.py +++ b/daliuge-runtime/test/apps/test_bash.py @@ -29,9 +29,8 @@ import unittest import six - from dlg import droputils -from dlg.apps.bash_shell_app import BashShellApp, StreamingInputBashApp,\ +from dlg.apps.bash_shell_app import BashShellApp, StreamingInputBashApp, \ StreamingOutputBashApp, StreamingInputOutputBashApp from dlg.ddap_protocol import DROPStates from dlg.drop import FileDROP, InMemoryDROP @@ -91,6 +90,7 @@ def test_envvars(self): # a fake session that has an ID class dummy(object): pass + session = dummy() session.sessionId = session_id @@ -106,6 +106,7 @@ def assert_envvar_is_there(varname, value): assert_envvar_is_there('DLG_UID', app_uid) assert_envvar_is_there('DLG_SESSION_ID', session_id) + class StreamingBashAppTests(unittest.TestCase): def test_single_pipe(self): @@ -142,9 +143,9 @@ def test_single_pipe(self): a.async_execute() # The application executed, finished, and its output was recorded - for drop in (a,b,c,d): + for drop in (a, b, c, d): self.assertEqual(DROPStates.COMPLETED, drop.status, "Drop %r not COMPLETED: %d" % (drop, drop.status)) - self.assertEqual([5,4,3,2,1], [int(x) for x in droputils.allDropContents(d).split(six.b('\n'))]) + self.assertEqual([5, 4, 3, 2, 1], [int(x) for x in droputils.allDropContents(d).split(six.b('\n'))]) # Clean up and go os.remove(output_fname) @@ -188,9 +189,9 @@ def test_two_simultaneous_pipes(self): a.async_execute() # The application executed, finished, and its output was recorded - for drop in (a,b,c,d,e,f): + for drop in (a, b, c, d, e, f): self.assertEqual(DROPStates.COMPLETED, drop.status) - self.assertEqual([1,2,3,4,5], [int(x) for x in droputils.allDropContents(f).strip().split(six.b('\n'))]) + self.assertEqual([1, 2, 3, 4, 5], [int(x) for x in droputils.allDropContents(f).strip().split(six.b('\n'))]) # Clean up and go - os.remove(output_fname) \ No newline at end of file + os.remove(output_fname) diff --git a/daliuge-runtime/test/apps/test_crc.py b/daliuge-runtime/test/apps/test_crc.py index 49a4da8df..8e85f1f43 100644 --- a/daliuge-runtime/test/apps/test_crc.py +++ b/daliuge-runtime/test/apps/test_crc.py @@ -27,7 +27,6 @@ import unittest import six - from dlg import droputils from dlg.apps.crc import CRCApp, crc32 from dlg.apps.dynlib import DynlibApp @@ -84,4 +83,4 @@ def test_with_dynlib(self): # Data and CRCs are the expected ones for what, who in (data, (a, c, f)), (crc, (e, h, j)): for drop in who: - self.assertEqual(what, droputils.allDropContents(drop)) \ No newline at end of file + self.assertEqual(what, droputils.allDropContents(drop)) diff --git a/daliuge-runtime/test/apps/test_docker.py b/daliuge-runtime/test/apps/test_docker.py index 514195a56..fcb433ff4 100644 --- a/daliuge-runtime/test/apps/test_docker.py +++ b/daliuge-runtime/test/apps/test_docker.py @@ -28,7 +28,6 @@ import configobj import docker import six - from dlg import droputils, utils from dlg.apps.dockerapp import DockerApp from dlg.drop import FileDROP, NgasDROP @@ -41,9 +40,9 @@ except: pass + @unittest.skipIf(docker_unavailable, "Docker daemon not available") class DockerTests(unittest.TestCase): - _temp = None _docker_available = False @@ -135,7 +134,7 @@ def test_quotedCommands(self): def assertMsgIsCorrect(msg, command): a = DockerApp('a', 'a', image='ubuntu:14.04', command=command) - b = FileDROP('b','b') + b = FileDROP('b', 'b') a.addOutput(b) with DROPWaiterCtx(self, b, 100): a.execute() @@ -162,7 +161,7 @@ def test_refer_to_io_by_uid(self): self._ngas_and_fs_io("echo -n '%iDataURL[a]' > %o[c]") def _ngas_and_fs_io(self, command): - a = NgasDROP('a', 'a') # not a filesystem-related DROP, we can reference its URL in the command-line + a = NgasDROP('a', 'a') # not a filesystem-related DROP, we can reference its URL in the command-line b = DockerApp('b', 'b', image="ubuntu:14.04", command=command) c = FileDROP('c', 'c') b.addInput(a) @@ -171,11 +170,10 @@ def _ngas_and_fs_io(self, command): a.setCompleted() self.assertEqual(six.b(a.dataURL), droputils.allDropContents(c)) - def test_additional_bindings(self): # Some additional stuff to bind into docker - tempDir = tempfile.mkdtemp() + tempDir = tempfile.mkdtemp() tempFile = tempfile.mktemp() with open(tempFile, 'w') as f: f.write('data') @@ -183,11 +181,11 @@ def test_additional_bindings(self): # One binding specifies the target path in the container, the other doesn't # so it defaults to the same path a = DockerApp( - 'a', - 'a', - image='ubuntu:14.04', - command="cp /opt/file %s" % (tempDir,), - additionalBindings=[tempDir, "%s:/opt/file" % (tempFile,)] + 'a', + 'a', + image='ubuntu:14.04', + command="cp /opt/file %s" % (tempDir,), + additionalBindings=[tempDir, "%s:/opt/file" % (tempFile,)] ) a.execute() diff --git a/daliuge-runtime/test/apps/test_dynlib.py b/daliuge-runtime/test/apps/test_dynlib.py index b350e397f..a042d85d3 100644 --- a/daliuge-runtime/test/apps/test_dynlib.py +++ b/daliuge-runtime/test/apps/test_dynlib.py @@ -25,14 +25,14 @@ import unittest import six - -from .setp_up import build_shared_library -from ..manager import test_dm from dlg import droputils from dlg.apps.dynlib import DynlibApp, DynlibStreamApp, DynlibProcApp from dlg.ddap_protocol import DROPRel, DROPLinkType, DROPStates from dlg.drop import InMemoryDROP, NullDROP +from .setp_up import build_shared_library +from ..manager import test_dm + _libname = "dynlib_example" _libfname = "libdynlib_example.so" _libpath = os.path.join(os.path.dirname(__file__), _libfname) @@ -115,7 +115,6 @@ def test_cancel_dynlibprocapp(self): class IntraNMMixIng(test_dm.NMTestsMixIn): - # Indicate which particular application should the test use app = None diff --git a/daliuge-runtime/test/apps/test_dynlib2.py b/daliuge-runtime/test/apps/test_dynlib2.py index 3780201bf..bab04300c 100644 --- a/daliuge-runtime/test/apps/test_dynlib2.py +++ b/daliuge-runtime/test/apps/test_dynlib2.py @@ -25,14 +25,14 @@ import unittest import six - -from .setp_up import build_shared_library -from ..manager import test_dm from dlg import droputils from dlg.apps.dynlib import DynlibApp, DynlibStreamApp, DynlibProcApp from dlg.ddap_protocol import DROPRel, DROPLinkType, DROPStates from dlg.drop import InMemoryDROP, NullDROP +from .setp_up import build_shared_library +from ..manager import test_dm + _libname = "dynlib_example2" _libfname = "libdynlib_example2.so" _libpath = os.path.join(os.path.dirname(__file__), _libfname) @@ -117,7 +117,6 @@ def test_cancel_dynlibprocapp(self): class IntraNMMixIng(test_dm.NMTestsMixIn): - # Indicate which particular application should the test use app = None diff --git a/daliuge-runtime/test/apps/test_fileimport.py b/daliuge-runtime/test/apps/test_fileimport.py index 68bfdc344..530637cbb 100644 --- a/daliuge-runtime/test/apps/test_fileimport.py +++ b/daliuge-runtime/test/apps/test_fileimport.py @@ -30,15 +30,14 @@ class FileImportAppTests(unittest.TestCase): - root = '/tmp/test_file_import' dirs = ['%s/files/' % root, '%s/empty/' % root] - files = ['%s%s' % (dirs[0],'test.fits'), - '%s%s' % (dirs[0],'test1.fits'), - '%s%s' % (dirs[0],'test2.txt')] + files = ['%s%s' % (dirs[0], 'test.fits'), + '%s%s' % (dirs[0], 'test1.fits'), + '%s%s' % (dirs[0], 'test2.txt')] def setUp(self): for d in self.dirs: @@ -51,21 +50,21 @@ def tearDown(self): shutil.rmtree(self.root) def test_import(self): - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = self.files[0], ext = ['.fits'])) - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = self.root, ext = [])) - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = self.root)) - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = '', ext = [])) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname=self.files[0], ext=['.fits'])) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname=self.root, ext=[])) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname=self.root)) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname='', ext=[])) - a = FileImportApp('a', 'b', dirname = self.root, ext = ['.fits']) + a = FileImportApp('a', 'b', dirname=self.root, ext=['.fits']) self.assertEqual(len(a.children), 2) self.assertEqual(a.children[0].path in self.files, True) self.assertEqual(a.children[1].path in self.files, True) - a = FileImportApp('a', 'b', dirname = self.dirs[1], ext = ['.fits']) + a = FileImportApp('a', 'b', dirname=self.dirs[1], ext=['.fits']) self.assertEqual(len(a.children), 0) - a = FileImportApp('a', 'b', dirname = self.root, ext = ['.txt']) + a = FileImportApp('a', 'b', dirname=self.root, ext=['.txt']) self.assertEqual(len(a.children), 1) - a = FileImportApp('a', 'b', dirname = self.root, ext = ['.hdf5']) + a = FileImportApp('a', 'b', dirname=self.root, ext=['.hdf5']) self.assertEqual(len(a.children), 0) diff --git a/daliuge-runtime/test/apps/test_pyfunc.py b/daliuge-runtime/test/apps/test_pyfunc.py index 8d7c222bb..ec67efd8e 100644 --- a/daliuge-runtime/test/apps/test_pyfunc.py +++ b/daliuge-runtime/test/apps/test_pyfunc.py @@ -27,8 +27,6 @@ import six import six.moves.cPickle as pickle # @UnresolvedImport - -from ..manager import test_dm from dlg import droputils from dlg.apps import pyfunc from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType @@ -36,26 +34,31 @@ from dlg.droputils import DROPWaiterCtx from dlg.exceptions import InvalidDropException +from ..manager import test_dm logger = logging.getLogger(__name__) + def func1(arg1): return arg1 + def func2(arg1): return arg1 * 2; + def func3(): return ['b', 'c', 'd'] + def func_with_defaults(a, b=10, c=20, x=30, y=40, z=50): """Returns a - b * c + (y - x) * z. Default is a + 300""" res = a - b * c + (y - x) * z logger.info("%r - %r * %r + (%r - %r) * %r = %r", a, b, c, y, x, z, res) return res -def _PyFuncApp(oid, uid, f, **kwargs): +def _PyFuncApp(oid, uid, f, **kwargs): fname = None if isinstance(f, six.string_types): fname = f = "test.apps.test_pyfunc." + f @@ -67,6 +70,7 @@ def _PyFuncApp(oid, uid, f, **kwargs): func_defaults=fdefaults, **kwargs) + class TestPyFuncApp(unittest.TestCase): def test_missing_function_param(self): @@ -82,7 +86,8 @@ def test_function_invalid_module(self): def test_function_invalid_fname(self): # The function lives in an unknown module/package - self.assertRaises(InvalidDropException, pyfunc.PyFuncApp, 'a', 'a', func_name='test.apps.test_pyfunc.doesnt_exist') + self.assertRaises(InvalidDropException, pyfunc.PyFuncApp, 'a', 'a', + func_name='test.apps.test_pyfunc.doesnt_exist') def test_valid_creation(self): _PyFuncApp('a', 'a', 'func1') @@ -121,8 +126,10 @@ def test_func2(self): def test_inner_func(self): n = random.randint(0, 1e6) + def f(x): return x + 2 + self._test_simple_functions(f, n, n + 2) def test_lambda(self): @@ -131,8 +138,10 @@ def test_lambda(self): def test_inner_func_with_closure(self): n = random.randint(0, 1e6) + def f(x): return x + n + self._test_simple_functions(f, n, n + n) def test_lambda_with_closure(self): @@ -235,6 +244,7 @@ def test_defaults_args_and_kwargs(self): self._test_defaults(0, 1, 1, x=40) self._test_defaults(249, 1, 2, x=35) + class PyFuncAppIntraNMTest(test_dm.NMTestsMixIn, unittest.TestCase): def test_input_in_remote_nm(self): @@ -248,9 +258,9 @@ def test_input_in_remote_nm(self): | A --|----|-> B --> C | ======= ============= """ - g1 = [{"oid":"A", "type":"plain", "storage": "memory"}] - g2 = [{"oid":"B", "type":"app", "app":"dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}, - {"oid":"C", "type":"plain", "storage": "memory", "producers":["B"]}] + g1 = [{"oid": "A", "type": "plain", "storage": "memory"}] + g2 = [{"oid": "B", "type": "app", "app": "dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}, + {"oid": "C", "type": "plain", "storage": "memory", "producers": ["B"]}] rels = [DROPRel('A', DROPLinkType.INPUT, 'B')] a_data = os.urandom(32) c_data = self._test_runGraphInTwoNMs(g1, g2, rels, pickle.dumps(a_data), None) @@ -266,10 +276,10 @@ def test_output_in_remote_nm(self): | A --> B --|----|-> C | ============= ======= """ - g1 = [{"oid":"A", "type":"plain", "storage": "memory", "consumers": ['B']}, - {"oid":"B", "type":"app", "app":"dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}] - g2 = [{"oid":"C", "type":"plain", "storage": "memory"}] + g1 = [{"oid": "A", "type": "plain", "storage": "memory", "consumers": ['B']}, + {"oid": "B", "type": "app", "app": "dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}] + g2 = [{"oid": "C", "type": "plain", "storage": "memory"}] rels = [DROPRel('B', DROPLinkType.PRODUCER, 'C')] a_data = os.urandom(32) c_data = self._test_runGraphInTwoNMs(g1, g2, rels, pickle.dumps(a_data), None) - self.assertEqual(a_data, pickle.loads(c_data)) \ No newline at end of file + self.assertEqual(a_data, pickle.loads(c_data)) diff --git a/daliuge-runtime/test/apps/test_simple.py b/daliuge-runtime/test/apps/test_simple.py index 6d39892c4..bbd6e9b98 100644 --- a/daliuge-runtime/test/apps/test_simple.py +++ b/daliuge-runtime/test/apps/test_simple.py @@ -89,4 +89,4 @@ def test_copyapp(self): self._test_copyapp(CopyApp) def test_sleepandcopyapp(self): - self._test_copyapp(SleepAndCopyApp) \ No newline at end of file + self._test_copyapp(SleepAndCopyApp) diff --git a/daliuge-runtime/test/apps/test_socket.py b/daliuge-runtime/test/apps/test_socket.py index eda24e405..72e65004a 100644 --- a/daliuge-runtime/test/apps/test_socket.py +++ b/daliuge-runtime/test/apps/test_socket.py @@ -19,17 +19,16 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import os import unittest -from dlg import utils from dlg import droputils +from dlg import utils from dlg.apps.socket_listener import SocketListenerApp -from dlg.drop import InMemoryDROP from dlg.ddap_protocol import DROPStates +from dlg.drop import InMemoryDROP from dlg.droputils import DROPWaiterCtx from test.test_drop import SumupContainerChecksum -import os - try: from crc32c import crc32 # @UnusedImport @@ -64,11 +63,11 @@ def _test_socket_listener(self, **kwargs): # Create the socket, write, and close the connection, allowing # A to move to COMPLETED - with DROPWaiterCtx(self, d, 3): # That's plenty of time + with DROPWaiterCtx(self, d, 3): # That's plenty of time a.async_execute() utils.write_to(host, port, data, 1) - for drop in [a,b,c,d]: + for drop in [a, b, c, d]: self.assertEqual(DROPStates.COMPLETED, drop.status) # Our expectations are fulfilled! diff --git a/daliuge-runtime/test/apps/test_spead.py b/daliuge-runtime/test/apps/test_spead.py index 657ea42e4..3488e49a5 100644 --- a/daliuge-runtime/test/apps/test_spead.py +++ b/daliuge-runtime/test/apps/test_spead.py @@ -41,15 +41,14 @@ class TestSpeadReceiverApp(unittest.TestCase): @unittest.skipIf(USE_SPEAD is False, "skipping test") def test_speadApp(self): - port = 1111 itemId = 0x2000 thread_pool = spead2.ThreadPool() self._stream = spead2.send.UdpStream(thread_pool, "localhost", port, spead2.send.StreamConfig(rate=1e7)) - a = SpeadReceiverApp('a','a',port=port, itemId=itemId) - b = InMemoryDROP('b','b') + a = SpeadReceiverApp('a', 'a', port=port, itemId=itemId) + b = InMemoryDROP('b', 'b') a.addOutput(b) size = 1024 @@ -58,12 +57,12 @@ def test_speadApp(self): msg = os.urandom(size) with DROPWaiterCtx(self, b, timeout=1): ig = spead2.send.ItemGroup(flavour=spead2.Flavour(4, 64, 48)) - item = ig.add_item(itemId, 'main_data', 'a char array', shape=(size,), format=[('c',8)]) + item = ig.add_item(itemId, 'main_data', 'a char array', shape=(size,), format=[('c', 8)]) item.value = msg self._stream.send_heap(ig.get_heap()) self._stream.send_heap(ig.get_end()) - for drop in a,b: + for drop in a, b: self.assertEqual(DROPStates.COMPLETED, drop.status) self.assertEqual(size, b.size) diff --git a/daliuge-runtime/test/deploy/test_common.py b/daliuge-runtime/test/deploy/test_common.py index 39483505d..f01f446af 100644 --- a/daliuge-runtime/test/deploy/test_common.py +++ b/daliuge-runtime/test/deploy/test_common.py @@ -32,9 +32,9 @@ class CommonTestsBase(ManagerStarter): def _submit(self): - pg = [{"oid":"A", "type":"plain", "storage": "memory"}, - {"oid":"B", "type":"app", "app": "dlg.apps.simple.SleepApp", "inputs": ["A"], "outputs":["C"]}, - {"oid":"C", "type":"plain", "storage": "memory"}] + pg = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "inputs": ["A"], "outputs": ["C"]}, + {"oid": "C", "type": "plain", "storage": "memory"}] for drop in pg: drop['node'] = '127.0.0.1' drop['island'] = '127.0.0.1' @@ -62,13 +62,13 @@ def test_monitor_with_dumping(self): dump_path = tempfile.mktemp() session_id = self._submit() status = common.monitor_sessions(session_id=session_id, poll_interval=0.1, - port=self.port, status_dump_path=dump_path) + port=self.port, status_dump_path=dump_path) self.assert_session_finished(status) self.assertTrue(os.path.exists(dump_path)) os.remove(dump_path) -class TestDeployCommonNM(CommonTestsBase, unittest.TestCase): +class TestDeployCommonNM(CommonTestsBase, unittest.TestCase): port = constants.NODE_DEFAULT_REST_PORT def assert_session_finished(self, status): @@ -82,8 +82,8 @@ def tearDown(self): self.nm_info.stop() super(TestDeployCommonNM, self).tearDown() -class TestDeployCommonDIM(TestDeployCommonNM, unittest.TestCase): +class TestDeployCommonDIM(TestDeployCommonNM, unittest.TestCase): port = constants.ISLAND_DEFAULT_REST_PORT def assert_session_finished(self, status): @@ -97,8 +97,8 @@ def tearDown(self): self.dim_info.stop() super(TestDeployCommonDIM, self).tearDown() -class TestDeployCommonMM(TestDeployCommonDIM, unittest.TestCase): +class TestDeployCommonMM(TestDeployCommonDIM, unittest.TestCase): port = constants.MASTER_DEFAULT_REST_PORT def setUp(self): @@ -107,4 +107,4 @@ def setUp(self): def tearDown(self): self.mm_info.stop() - super(TestDeployCommonMM, self).tearDown() \ No newline at end of file + super(TestDeployCommonMM, self).tearDown() diff --git a/daliuge-runtime/test/deploy/test_slurm_utils.py b/daliuge-runtime/test/deploy/test_slurm_utils.py index 940e3ce30..bdeb6c3b9 100644 --- a/daliuge-runtime/test/deploy/test_slurm_utils.py +++ b/daliuge-runtime/test/deploy/test_slurm_utils.py @@ -24,6 +24,7 @@ from dlg.deploy.pawsey import slurm_utils + class TestSlurmUtils(unittest.TestCase): def assert_list_as_string(self, s, expected_list): diff --git a/daliuge-runtime/test/graphs/complex.js b/daliuge-runtime/test/graphs/complex.js index e8ca7d024..61373c45e 100644 --- a/daliuge-runtime/test/graphs/complex.js +++ b/daliuge-runtime/test/graphs/complex.js @@ -1,155 +1,155 @@ [ - { - "oid": "SL_A", - "type": "socket", - "port": 1111, - "reuse_addr": true, - "outputs": ["A"] - }, - { - "oid": "SL_B", - "type": "socket", - "port": 1112, - "reuse_addr": true, - "outputs": ["B"] - }, - { - "oid": "SL_C", - "type": "socket", - "port": 1113, - "reuse_addr": true, - "outputs": ["C"] - }, - { - "oid": "SL_D", - "type": "socket", - "port": 1114, - "reuse_addr": true, - "outputs": ["D"] - }, - { - "oid": "A", - "type": "plain", - "storage": "memory", - "consumers": ["E"] - }, - { - "oid": "B", - "type": "plain", - "storage": "memory", - "consumers": ["I"] - }, - { - "oid": "C", - "type": "plain", - "storage": "memory", - "consumers": ["F"] - }, - { - "oid": "D", - "type": "plain", - "storage": "memory", - "consumers": ["F"] - }, - { - "oid": "E", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["G"] - }, - { - "oid": "F", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["H"] - }, - { - "oid": "G", - "type": "plain", - "storage": "memory", - "consumers": ["I"] - }, - { - "oid": "H", - "type": "plain", - "storage": "memory", - "consumers": ["I"] - }, - { - "oid": "I", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["J"] - }, - { - "oid": "J", - "type": "plain", - "storage": "memory", - "consumers": ["L", "M"] - }, - { - "oid": "SL_K", - "type": "socket", - "port": 1115, - "reuse_addr": true, - "outputs": ["K"] - }, - { - "oid": "K", - "type": "plain", - "storage": "memory", - "consumers": ["M"] - }, - { - "oid": "L", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["N", "O"] - }, - { - "oid": "M", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["P"] - }, - { - "oid": "N", - "type": "plain", - "storage": "memory", - "consumers": ["Q"] - }, - { - "oid": "O", - "type": "plain", - "storage": "memory", - "consumers": ["R"] - }, - { - "oid": "P", - "type": "plain", - "storage": "memory", - "consumers": ["R"] - }, - { - "oid": "Q", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["S"] - }, - { - "oid": "R", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["T"] - }, - { - "oid": "S", - "type": "plain", - "storage": "memory" - }, - { - "oid": "T", - "type": "plain", - "storage": "memory" - } + { + "oid": "SL_A", + "type": "socket", + "port": 1111, + "reuse_addr": true, + "outputs": ["A"] + }, + { + "oid": "SL_B", + "type": "socket", + "port": 1112, + "reuse_addr": true, + "outputs": ["B"] + }, + { + "oid": "SL_C", + "type": "socket", + "port": 1113, + "reuse_addr": true, + "outputs": ["C"] + }, + { + "oid": "SL_D", + "type": "socket", + "port": 1114, + "reuse_addr": true, + "outputs": ["D"] + }, + { + "oid": "A", + "type": "plain", + "storage": "memory", + "consumers": ["E"] + }, + { + "oid": "B", + "type": "plain", + "storage": "memory", + "consumers": ["I"] + }, + { + "oid": "C", + "type": "plain", + "storage": "memory", + "consumers": ["F"] + }, + { + "oid": "D", + "type": "plain", + "storage": "memory", + "consumers": ["F"] + }, + { + "oid": "E", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["G"] + }, + { + "oid": "F", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["H"] + }, + { + "oid": "G", + "type": "plain", + "storage": "memory", + "consumers": ["I"] + }, + { + "oid": "H", + "type": "plain", + "storage": "memory", + "consumers": ["I"] + }, + { + "oid": "I", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["J"] + }, + { + "oid": "J", + "type": "plain", + "storage": "memory", + "consumers": ["L", "M"] + }, + { + "oid": "SL_K", + "type": "socket", + "port": 1115, + "reuse_addr": true, + "outputs": ["K"] + }, + { + "oid": "K", + "type": "plain", + "storage": "memory", + "consumers": ["M"] + }, + { + "oid": "L", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["N", "O"] + }, + { + "oid": "M", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["P"] + }, + { + "oid": "N", + "type": "plain", + "storage": "memory", + "consumers": ["Q"] + }, + { + "oid": "O", + "type": "plain", + "storage": "memory", + "consumers": ["R"] + }, + { + "oid": "P", + "type": "plain", + "storage": "memory", + "consumers": ["R"] + }, + { + "oid": "Q", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["S"] + }, + { + "oid": "R", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["T"] + }, + { + "oid": "S", + "type": "plain", + "storage": "memory" + }, + { + "oid": "T", + "type": "plain", + "storage": "memory" + } ] \ No newline at end of file diff --git a/daliuge-runtime/test/integrate/__init__.py b/daliuge-runtime/test/integrate/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/integrate/__init__.py +++ b/daliuge-runtime/test/integrate/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/integrate/chiles/__init__.py b/daliuge-runtime/test/integrate/chiles/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/integrate/chiles/__init__.py +++ b/daliuge-runtime/test/integrate/chiles/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/integrate/chiles/chilesdo.py b/daliuge-runtime/test/integrate/chiles/chilesdo.py index 802c57faa..54b8faaae 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdo.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdo.py @@ -22,22 +22,20 @@ import logging import threading -from six.moves import queue as Queue # @UnresolvedImport - from dlg.drop import BarrierAppDROP - +from six.moves import queue as Queue # @UnresolvedImport logger = logging.getLogger(__name__) + class SourceFlux(BarrierAppDROP): def initialize(self, **kwargs): - + super(SourceFlux, self).initialize(**kwargs) self.casapy_path = self._getArg(kwargs, 'casapy_path', None) self.timeout = self._getArg(kwargs, 'timeout', 180) - def run(self): inp = self.inputs[0] @@ -47,7 +45,7 @@ def run(self): logger.info('Calculating source flux on %s.image' % (inp.path)) import drivecasa - casa = drivecasa.Casapy(casa_dir = self.casapy_path, timeout = self.timeout) + casa = drivecasa.Casapy(casa_dir=self.casapy_path, timeout=self.timeout) casa.run_script(['ia.open("'"%s"'")' % (inp.path + '.image')]) casa.run_script(['flux = ia.pixelvalue([128,128,0,179])["'"value"'"]["'"value"'"]']) casaout, _ = casa.run_script(['print flux']) @@ -65,37 +63,36 @@ def initialize(self, **kwargs): super(Clean, self).initialize(**kwargs) self.timeout = self._getArg(kwargs, 'timeout', 3600) - self.casapy_path = self._getArg(kwargs, 'casapy_path', None) + self.casapy_path = self._getArg(kwargs, 'casapy_path', None) self.clean_args = { - 'field': str(self._getArg(kwargs, 'field', None)), - 'mode': str(self._getArg(kwargs, 'mode', None)), - 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), - 'nchan': self._getArg(kwargs, 'nchan', None), - 'start': str(self._getArg(kwargs, 'start', None)), - 'width': str(self._getArg(kwargs, 'width', None)), - 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), - 'gain': self._getArg(kwargs, 'gain', None), - 'imsize': self._getArg(kwargs, 'imsize', None), - 'cell': [str(x) for x in self._getArg(kwargs, 'cell', [])], - 'phasecenter': str(self._getArg(kwargs, 'phasecenter', None)), - 'weighting': str(self._getArg(kwargs, 'weighting', None)), - 'usescratch': False } - + 'field': str(self._getArg(kwargs, 'field', None)), + 'mode': str(self._getArg(kwargs, 'mode', None)), + 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), + 'nchan': self._getArg(kwargs, 'nchan', None), + 'start': str(self._getArg(kwargs, 'start', None)), + 'width': str(self._getArg(kwargs, 'width', None)), + 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), + 'gain': self._getArg(kwargs, 'gain', None), + 'imsize': self._getArg(kwargs, 'imsize', None), + 'cell': [str(x) for x in self._getArg(kwargs, 'cell', [])], + 'phasecenter': str(self._getArg(kwargs, 'phasecenter', None)), + 'weighting': str(self._getArg(kwargs, 'weighting', None)), + 'usescratch': False} def invoke_clean(self, q, vis, outcube): import drivecasa try: script = [] - casa = drivecasa.Casapy(casa_dir = self.casapy_path, timeout = self.timeout) + casa = drivecasa.Casapy(casa_dir=self.casapy_path, timeout=self.timeout) drivecasa.commands.clean(script, - vis_paths = vis, - out_path = outcube, - niter = 0, - threshold_in_jy = 0, - other_clean_args = self.clean_args, - overwrite = True) + vis_paths=vis, + out_path=outcube, + niter=0, + threshold_in_jy=0, + other_clean_args=self.clean_args, + overwrite=True) casa.run_script(script) q.put(0) @@ -103,7 +100,6 @@ def invoke_clean(self, q, vis, outcube): q.put(-1) raise - def run(self): inp = self.inputs @@ -115,7 +111,7 @@ def run(self): logger.info("Cleaning %r" % (vis)) q = Queue.Queue() - t = threading.Thread(target = self.invoke_clean, args = (q, vis, out.path)) + t = threading.Thread(target=self.invoke_clean, args=(q, vis, out.path)) t.start() t.join() @@ -134,29 +130,28 @@ def initialize(self, **kwargs): self.casapy_path = self._getArg(kwargs, 'casapy_path', False) self.transform_args = { - 'regridms': self._getArg(kwargs, 'regridms', None), - 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), - 'mode': str(self._getArg(kwargs, 'mode', None)), - 'nchan': self._getArg(kwargs, 'nchan', None), - 'outframe': str(self._getArg(kwargs, 'outframe', None)), - 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), - 'veltype': 'radio', - 'start': str(self._getArg(kwargs, 'start', None)), - 'width': str(self._getArg(kwargs, 'width', None)), - 'spw': '', - 'combinespws': True, - 'nspw': 1, - 'createmms': False, - 'datacolumn': 'data' } - + 'regridms': self._getArg(kwargs, 'regridms', None), + 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), + 'mode': str(self._getArg(kwargs, 'mode', None)), + 'nchan': self._getArg(kwargs, 'nchan', None), + 'outframe': str(self._getArg(kwargs, 'outframe', None)), + 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), + 'veltype': 'radio', + 'start': str(self._getArg(kwargs, 'start', None)), + 'width': str(self._getArg(kwargs, 'width', None)), + 'spw': '', + 'combinespws': True, + 'nspw': 1, + 'createmms': False, + 'datacolumn': 'data'} def invoke_split(self, q, infile, outdir): import drivecasa try: script = [] - casa = drivecasa.Casapy(casa_dir = self.casapy_path, timeout = self.timeout) - drivecasa.commands.mstransform(script, infile, outdir, self.transform_args, overwrite = True) + casa = drivecasa.Casapy(casa_dir=self.casapy_path, timeout=self.timeout) + drivecasa.commands.mstransform(script, infile, outdir, self.transform_args, overwrite=True) casa.run_script(script) q.put(0) @@ -164,7 +159,6 @@ def invoke_split(self, q, infile, outdir): q.put(-1) raise - def run(self): inp = self.inputs[0] out = self.outputs[0] @@ -173,10 +167,10 @@ def run(self): logger.info('Splitting %s' % (inp.path)) q = Queue.Queue() - t = threading.Thread(target = self.invoke_split, args = (q, inp.path, out.path)) + t = threading.Thread(target=self.invoke_split, args=(q, inp.path, out.path)) t.start() t.join() - + result = q.get() if result != 0: raise Exception('Error splitting') diff --git a/daliuge-runtime/test/integrate/chiles/chilesdoapp.py b/daliuge-runtime/test/integrate/chiles/chilesdoapp.py index 510f2bd3f..e19762428 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdoapp.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdoapp.py @@ -21,8 +21,8 @@ # import os import sys -import uuid import threading +import uuid from dlg.drop import DirectoryContainer, InMemoryDROP @@ -36,11 +36,11 @@ CUBE_NAME = 'cube1408~1412' VIS = [ - (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', VIS_OUT + '20131025_951_4/'), - (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', VIS_OUT + '20131031_951_4/'), - (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', VIS_OUT + '20131121_946_6/'), - (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', VIS_OUT + '20140105_946_6/') - ] + (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', VIS_OUT + '20131025_951_4/'), + (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', VIS_OUT + '20131031_951_4/'), + (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', VIS_OUT + '20131121_946_6/'), + (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', VIS_OUT + '20140105_946_6/') +] class Barrier(object): @@ -51,7 +51,7 @@ def __init__(self, drop): def dropCompleted(self, drop, state): self._evt.set() - def wait(self, timeout = None): + def wait(self, timeout=None): return self._evt.wait(timeout) @@ -62,47 +62,47 @@ def wait(self, timeout = None): flux_out = InMemoryDROP(uuid.uuid1(), uuid.uuid1()) - flux = SourceFlux(uuid.uuid1(), uuid.uuid1(), casapy_path = CASAPY) + flux = SourceFlux(uuid.uuid1(), uuid.uuid1(), casapy_path=CASAPY) cl = Clean(uuid.uuid1(), - uuid.uuid1(), - field = 'deepfield', - mode = 'frequency', - restfreq = '1420.405752MHz', - nchan = -1, - start = '', - width = '', - interpolation = 'nearest', - gain = 0.1, - imsize = [256], - cell = ['1.0arcsec'], - phasecenter = '10h01m53.9,+02d24m52s', - weighting = 'natural', - casapy_path = CASAPY) - - image_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname = CUBE_OUT + CUBE_NAME, check_exists = False) + uuid.uuid1(), + field='deepfield', + mode='frequency', + restfreq='1420.405752MHz', + nchan=-1, + start='', + width='', + interpolation='nearest', + gain=0.1, + imsize=[256], + cell=['1.0arcsec'], + phasecenter='10h01m53.9,+02d24m52s', + weighting='natural', + casapy_path=CASAPY) + + image_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname=CUBE_OUT + CUBE_NAME, check_exists=False) cl.addOutput(image_out) flux.addInput(image_out) flux.addOutput(flux_out) for v in VIS: - vis_in = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname = v[0]) - split_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname = v[1], check_exists = False) + vis_in = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname=v[0]) + split_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname=v[1], check_exists=False) vis_in_a.append(vis_in) sp = Split(uuid.uuid1(), - uuid.uuid1(), - regridms = True, - restfreq = '1420.405752MHz', - mode = 'frequency', - nchan = 256, - outframe = 'lsrk', - interpolation = 'linear', - start = '1408 MHz', - width = '1412 kHz', - copy = False, - casapy_path = CASAPY) + uuid.uuid1(), + regridms=True, + restfreq='1420.405752MHz', + mode='frequency', + nchan=256, + outframe='lsrk', + interpolation='linear', + start='1408 MHz', + width='1412 kHz', + copy=False, + casapy_path=CASAPY) sp.addInput(vis_in) sp.addOutput(split_out) @@ -121,6 +121,7 @@ def wait(self, timeout = None): except Exception as e: import traceback + traceback.print_exc() sys.exit(-1) diff --git a/daliuge-runtime/test/integrate/chiles/chilesdospec.py b/daliuge-runtime/test/integrate/chiles/chilesdospec.py index fe5707201..c2ac53898 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdospec.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdospec.py @@ -24,12 +24,11 @@ from dlg.drop import dropdict - # Directories and paths -CASAPY = '/home/ec2-user/casa-release-4.4.0-el6/' -INPUTS_DIR = '/home/ec2-user/data/input' +CASAPY = '/home/ec2-user/casa-release-4.4.0-el6/' +INPUTS_DIR = '/home/ec2-user/data/input' OUTPUTS_DIR = '/home/ec2-user/data/output' -KEY_PATH = '/home/ec2-user/.ssh/aws-sdp-sydney.pem' +KEY_PATH = '/home/ec2-user/.ssh/aws-sdp-sydney.pem' # Internal AWS IP addresses. ch05 does the Clean-ing ch01 = '172.31.4.12' @@ -40,45 +39,46 @@ # Per-visibility parameters and resulting cube name VIS = [ - ('20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', '20131025_951_4', ch01), - ('20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', '20140105_946_6', ch02), - ('20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', '20131031_951_4', ch03), - ('20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', '20131121_946_6', ch04) - ] + ('20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', '20131025_951_4', ch01), + ('20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', '20140105_946_6', ch02), + ('20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', '20131031_951_4', ch03), + ('20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', '20131121_946_6', ch04) +] CUBE_NAME = 'cube1408~1412' def fileSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'plain', 'storage':'file'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'plain', 'storage': 'file'}) dropSpec.update(kwargs) - return dropSpec + return dropSpec def directorySpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'container', 'container':'dlg.drop.DirectoryContainer'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'container', 'container': 'dlg.drop.DirectoryContainer'}) dropSpec.update(kwargs) - return dropSpec + return dropSpec def fluxSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'test.integrate.chiles.chilesdo.SourceFlux'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'test.integrate.chiles.chilesdo.SourceFlux'}) dropSpec.update(kwargs) - return dropSpec + return dropSpec def splitSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'test.integrate.chiles.chilesdo.Split'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'test.integrate.chiles.chilesdo.Split'}) dropSpec.update(kwargs) return dropSpec def scpSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'dlg.apps.scp.ScpApp'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'dlg.apps.scp.ScpApp'}) dropSpec.update(kwargs) return dropSpec + def cleanSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'test.integrate.chiles.chilesdo.Clean'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'test.integrate.chiles.chilesdo.Clean'}) dropSpec.update(kwargs) return dropSpec @@ -87,58 +87,58 @@ def cleanSpec(uid, **kwargs): droplist = [] - flux_out = fileSpec('Flux', node = ch05, dirname = os.path.join(OUTPUTS_DIR)) + flux_out = fileSpec('Flux', node=ch05, dirname=os.path.join(OUTPUTS_DIR)) droplist.append(flux_out) - flux = fluxSpec('FluxExtractor', casapy_path = CASAPY, node = ch05) + flux = fluxSpec('FluxExtractor', casapy_path=CASAPY, node=ch05) droplist.append(flux) cl = cleanSpec('Cleaning', - field = 'deepfield', - mode = 'frequency', - restfreq = '1420.405752MHz', - nchan = -1, - start = '', - width = '', - interpolation = 'nearest', - gain = 0.1, - imsize = [256], - cell = ['1.0arcsec'], - phasecenter = '10h01m53.9,+02d24m52s', - weighting = 'natural', - casapy_path = CASAPY, - node = ch05) + field='deepfield', + mode='frequency', + restfreq='1420.405752MHz', + nchan=-1, + start='', + width='', + interpolation='nearest', + gain=0.1, + imsize=[256], + cell=['1.0arcsec'], + phasecenter='10h01m53.9,+02d24m52s', + weighting='natural', + casapy_path=CASAPY, + node=ch05) droplist.append(cl) - image_out = directorySpec('CleanedImage', dirname = os.path.join(OUTPUTS_DIR, CUBE_NAME), check_exists = False, node = ch05) + image_out = directorySpec('CleanedImage', dirname=os.path.join(OUTPUTS_DIR, CUBE_NAME), check_exists=False, + node=ch05) droplist.append(image_out) cl.addOutput(image_out) flux.addInput(image_out) flux.addOutput(flux_out) for i, v in enumerate(VIS): - - visDir = os.path.join(INPUTS_DIR, v[0]) - splitOutDir = os.path.join(OUTPUTS_DIR, v[1]) + visDir = os.path.join(INPUTS_DIR, v[0]) + splitOutDir = os.path.join(OUTPUTS_DIR, v[1]) splitCopyDir = os.path.join(INPUTS_DIR, v[1]) - node = v[2] + node = v[2] # vis -> SPLIT -> out -> scp -> out - vis_in = directorySpec('vis%d' % (i), dirname = visDir, node = node) + vis_in = directorySpec('vis%d' % (i), dirname=visDir, node=node) sp = splitSpec('Splitting_%d' % (i), - regridms = True, - restfreq = '1420.405752MHz', - mode = 'frequency', - nchan = 256, - outframe = 'lsrk', - interpolation = 'linear', - start = '1408MHz', - width = '1412kHz', - casapy_path = CASAPY, - node = node) - split_out = directorySpec('SplitOutput_%d' %(i), dirname = splitOutDir, check_exists = False, node = node) - scp = scpSpec('Scp_%d' % (i), node = node, pkeyPath = KEY_PATH, timeout=3600) - scpOut = directorySpec('SplitOutput_%d_Copy' % (i), dirname = splitCopyDir, check_exists = False, node = ch05) + regridms=True, + restfreq='1420.405752MHz', + mode='frequency', + nchan=256, + outframe='lsrk', + interpolation='linear', + start='1408MHz', + width='1412kHz', + casapy_path=CASAPY, + node=node) + split_out = directorySpec('SplitOutput_%d' % (i), dirname=splitOutDir, check_exists=False, node=node) + scp = scpSpec('Scp_%d' % (i), node=node, pkeyPath=KEY_PATH, timeout=3600) + scpOut = directorySpec('SplitOutput_%d_Copy' % (i), dirname=splitCopyDir, check_exists=False, node=ch05) # Establish relationships sp.addInput(vis_in) @@ -154,4 +154,4 @@ def cleanSpec(uid, **kwargs): droplist.append(scp) droplist.append(scpOut) - print(json.dumps(droplist, indent=2)) \ No newline at end of file + print(json.dumps(droplist, indent=2)) diff --git a/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py b/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py index 39dbbbbb0..61908c10a 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py @@ -1,4 +1,4 @@ - # +# # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) @@ -31,7 +31,6 @@ from dlg.drop import dropdict from dlg.manager.client import DataIslandManagerClient - LOCAL_FILES = os.path.dirname(os.path.realpath(__file__)) CASAPY = '/opt/casa-release-4.4.0-el6/' VIS_ROOT = '/opt/data/chiles/input/' @@ -41,45 +40,54 @@ # Internal AWS IP addresses. ch05 does the Clean-ing VIS = [ - (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS', VIS_OUT + '20131025_951_4/'), - (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS', VIS_OUT + '20131031_951_4/'), - (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS', VIS_OUT + '20131121_946_6/'), - (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS', VIS_OUT + '20140105_946_6/') - ] + (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS', VIS_OUT + '20131025_951_4/'), + (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS', VIS_OUT + '20131031_951_4/'), + (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS', VIS_OUT + '20131121_946_6/'), + (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS', VIS_OUT + '20140105_946_6/') +] + def fileDropSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'plain', 'storage':'file', 'node': 'localhost', 'island': 'localhost'}) + dropSpec = dropdict( + {'oid': str(uid), 'type': 'plain', 'storage': 'file', 'node': 'localhost', 'island': 'localhost'}) dropSpec.update(kwargs) return dropSpec + def directorySpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'container', 'container':'dlg.drop.DirectoryContainer', 'node': 'localhost', 'island': 'localhost'}) + dropSpec = dropdict( + {'oid': str(uid), 'type': 'container', 'container': 'dlg.drop.DirectoryContainer', 'node': 'localhost', + 'island': 'localhost'}) dropSpec.update(kwargs) return dropSpec + def casapyDockerAppSpec(uid, script): cmd = 'cd; ' + os.path.join(CASAPY, 'casapy') + ' --colors=NoColor --nologger --nogui -c "%s"' % (script) - return dropdict({'oid':str(uid), 'type':'app', 'app':'dlg.apps.dockerapp.DockerApp', - 'image':'dfms/casapy_centos7_dfms:0.1', - 'command':cmd, 'user': 'dfms', - 'node': 'localhost', 'island': 'localhost'}) + return dropdict({'oid': str(uid), 'type': 'app', 'app': 'dlg.apps.dockerapp.DockerApp', + 'image': 'dfms/casapy_centos7_dfms:0.1', + 'command': cmd, 'user': 'dfms', + 'node': 'localhost', 'island': 'localhost'}) + def fluxSpec(uid, **kwargs): - script = "ia.open('%i0.image');" + script = "ia.open('%i0.image');" script += "flux = ia.pixelvalue([128,128,0,179])['value']['value'];" script += "f = open('%o0','w'); f.write(str(flux)); f.close()" return casapyDockerAppSpec(uid, script) + def splitSpec(uid, **kwargs): transform_args = kwargs.copy() transform_args.update({ 'vis': "%i0", 'outputvis': "%o0" }) - script = "import shutil; shutil.rmtree('%o0', True); " + script = "import shutil; shutil.rmtree('%o0', True); " script += "mstransform(**{})".format(repr(transform_args)) return casapyDockerAppSpec(uid, script) + def cleanSpec(uid, **kwargs): clean_args = kwargs.copy() clean_args.update({ @@ -87,10 +95,10 @@ def cleanSpec(uid, **kwargs): 'mask': '', 'modelimage': '', 'imagename': '%o0', - 'vis': ['%i0','%i1','%i2','%i3'], + 'vis': ['%i0', '%i1', '%i2', '%i3'], 'threshold': '0Jy', }) - script = "import shutil; shutil.rmtree('%o0', True); " + script = "import shutil; shutil.rmtree('%o0', True); " script += "clean(**{})".format(repr(clean_args)) return casapyDockerAppSpec(uid, script) @@ -101,52 +109,52 @@ def cleanSpec(uid, **kwargs): sessionId = 'Chiles-Docker-%s' % (time.time(),) droplist = [] - flux_out = fileDropSpec('Flux', dirname = VIS_OUT) + flux_out = fileDropSpec('Flux', dirname=VIS_OUT) droplist.append(flux_out) flux = fluxSpec('FluxExtractor') droplist.append(flux) cl = cleanSpec('Cleaning', - field = 'deepfield', - mode = 'frequency', - restfreq = '1420.405752MHz', - nchan = -1, - start = '', - width = '', - interpolation = 'nearest', - gain = 0.1, - imsize = [256], - cell = ['1.0arcsec'], - phasecenter = '10h01m53.9,+02d24m52s', - weighting = 'natural', - usescratch = False) + field='deepfield', + mode='frequency', + restfreq='1420.405752MHz', + nchan=-1, + start='', + width='', + interpolation='nearest', + gain=0.1, + imsize=[256], + cell=['1.0arcsec'], + phasecenter='10h01m53.9,+02d24m52s', + weighting='natural', + usescratch=False) droplist.append(cl) - image_out = directorySpec('CleanedImage', dirname = CUBE_OUT + CUBE_NAME, check_exists = False) + image_out = directorySpec('CleanedImage', dirname=CUBE_OUT + CUBE_NAME, check_exists=False) droplist.append(image_out) cl.addOutput(image_out) flux.addInput(image_out) flux.addOutput(flux_out) for i, v in enumerate(VIS): - vis_in = directorySpec('vis%d' % (i), dirname = v[0], check_exists = False) - split_out = directorySpec('SplitOutput_%d' %(i), dirname = v[1], check_exists = False) + vis_in = directorySpec('vis%d' % (i), dirname=v[0], check_exists=False) + split_out = directorySpec('SplitOutput_%d' % (i), dirname=v[1], check_exists=False) sp = splitSpec('Splitting_%d' % (i), - regridms = True, - restfreq = '1420.405752MHz', - mode = 'frequency', - nchan = 256, - outframe = 'lsrk', - interpolation = 'linear', - start = '1408MHz', - width = '1412kHz', - veltype = 'radio', - spw = '', - combinespws = True, - nspw = 1, - createmms = False, - datacolumn = 'data' - ) + regridms=True, + restfreq='1420.405752MHz', + mode='frequency', + nchan=256, + outframe='lsrk', + interpolation='linear', + start='1408MHz', + width='1412kHz', + veltype='radio', + spw='', + combinespws=True, + nspw=1, + createmms=False, + datacolumn='data' + ) sp.addInput(vis_in) sp.addOutput(split_out) cl.addInput(split_out) @@ -162,6 +170,7 @@ def cleanSpec(uid, **kwargs): except Exception as e: import traceback + traceback.print_exc() sys.exit(-1) diff --git a/daliuge-runtime/test/integrate/example_split.py b/daliuge-runtime/test/integrate/example_split.py index b7bca136e..ed43883a6 100644 --- a/daliuge-runtime/test/integrate/example_split.py +++ b/daliuge-runtime/test/integrate/example_split.py @@ -5,25 +5,26 @@ To run it standalone, change the directories, which are now hardcoded """ -from sys import argv -import sys, os, datetime, time +import datetime +import os +import time if __name__ == '__main__': - + dt = datetime.datetime.now() timestr = dt.strftime('%Y-%m-%dT%H-%M-%S') - + ms_dir = '/scratch/partner1024/chiles/final_products/20131122_941_6_FINAL_PRODUCTS/13B-266.sb27261805.eb28549602.56618.334173599535_calibrated_deepfield.ms' - #ms_dir = '/scratch/jason/13B-266.sb28624226.eb28625769.56669.43262586805_calibrated_deepfield_adios.ms' + # ms_dir = '/scratch/jason/13B-266.sb28624226.eb28625769.56669.43262586805_calibrated_deepfield_adios.ms' log_dir = '/home/cwu/chiles/processing' - #log_dir = '/scratch/jason/tmp' + # log_dir = '/scratch/jason/tmp' output_vis = '/scratch/partner1024/chiles/split_vis/{0}'.format(timestr) - #output_vis = '/scratch/jason/tmp/split_vis/{0}'.format(timestr) + # output_vis = '/scratch/jason/tmp/split_vis/{0}'.format(timestr) log_file = '{0}/{1}_split_time.log'.format(log_dir, timestr) - + os.mkdir(output_vis) gap = 4 - + st = time.time() for i in range(1): mstransform(vis=ms_dir, @@ -42,12 +43,12 @@ nspw=1, createmms=False, datacolumn="data") - + tt = time.time() - st - f = open(log_file,'w') + f = open(log_file, 'w') f.write('total split time = {0} seconds'.format(tt)) f.close() - + """ mstransform(vis=/scratch/partner1024/chiles/final_products//20131025_951_4_FINAL_PRODUCTS/13B-266.sb27248272.eb28094627.56590.41308579861_calibrated_deepfield.ms, outputvis=/scratch/partner1024/chiles/split_vis/12345/20131025_951_4/vis_1024~1028, diff --git a/daliuge-runtime/test/integrate/freq_split.py b/daliuge-runtime/test/integrate/freq_split.py index 89c1b1d07..3f035bda9 100644 --- a/daliuge-runtime/test/integrate/freq_split.py +++ b/daliuge-runtime/test/integrate/freq_split.py @@ -5,10 +5,14 @@ chen.wu@icrar.org """ -import sys, os, datetime, subprocess, re, logging -from string import Template +import datetime +import logging +import os +import re +import subprocess +import sys from optparse import OptionParser - +from string import Template logger = logging.getLogger(__name__) @@ -31,6 +35,7 @@ datacolumn="data") """ + def freq_map(low_req, hi_req, *args): """ Ported from Chiles AWS code by R.Dodson (richard.dodson@icrar.org) @@ -88,7 +93,6 @@ def freq_map(low_req, hi_req, *args): '14~14' """ - # SpwID Name #Chans Frame Ch0(MHz) Ch0(MHz) Ch0(MHz)ChanWid(kHz) TotBW(kHz) BBC Num Corrs # 0 EVLA_L#A0C0#0 2048 TOPO 941.000 946.000 951.000 15.625 32000.0 12 RR LL # 1 EVLA_L#A0C0#1 2048 TOPO 973.000 978.000 983.000 15.625 32000.0 12 RR LL @@ -106,22 +110,22 @@ def freq_map(low_req, hi_req, *args): # 13 EVLA_L#A0C0#13 2048 TOPO 1357.000 1362.000 1367.000 15.625 32000.0 12 RR LL # 14 EVLA_L#A0C0#14 2048 TOPO 1389.000 1394.000 1399.000 15.625 32000.0 12 RR LL - f_tab = [[941.00, 946.00, 951.00], - [973.00, 978.00, 983.00], - [1005.00, 1010.00, 1015.00], - [1037.00, 1042.00, 1047.00], - [1069.00, 1074.00, 1079.00], - [1101.00, 1106.00, 1111.00], - [1133.00, 1138.00, 1143.00], - [1165.00, 1170.00, 1175.00], - [1197.00, 1202.00, 1207.00], - [1229.00, 1234.00, 1239.00], - [1261.00, 1266.00, 1271.00], - [1293.00, 1298.00, 1303.00], - [1325.00, 1330.00, 1335.00], - [1357.00, 1362.00, 1367.00], - [1389.00, 1394.00, 1399.00], - [1421.00, 1426.00, 1431.00]] + f_tab = [[941.00, 946.00, 951.00], + [973.00, 978.00, 983.00], + [1005.00, 1010.00, 1015.00], + [1037.00, 1042.00, 1047.00], + [1069.00, 1074.00, 1079.00], + [1101.00, 1106.00, 1111.00], + [1133.00, 1138.00, 1143.00], + [1165.00, 1170.00, 1175.00], + [1197.00, 1202.00, 1207.00], + [1229.00, 1234.00, 1239.00], + [1261.00, 1266.00, 1271.00], + [1293.00, 1298.00, 1303.00], + [1325.00, 1330.00, 1335.00], + [1357.00, 1362.00, 1367.00], + [1389.00, 1394.00, 1399.00], + [1421.00, 1426.00, 1431.00]] if_low = 0 if_hi = 14 @@ -129,31 +133,31 @@ def freq_map(low_req, hi_req, *args): ifn_hi = 2 if (args): - if (args[0] == 941): - ifn_low = 0 - ifn_hi = 0 - elif (args[0] == 946): - ifn_low = 1 - ifn_hi = 1 - elif (args[0] == 951): - ifn_low = 2 - ifn_hi = 2 + if (args[0] == 941): + ifn_low = 0 + ifn_hi = 0 + elif (args[0] == 946): + ifn_low = 1 + ifn_hi = 1 + elif (args[0] == 951): + ifn_low = 2 + ifn_hi = 2 for nif_low in range(0, 16): f = f_tab[nif_low] - #print nif_low,f + # print nif_low,f if ((f[ifn_low]) > ((low_req) - 2)): if_low = nif_low - 1 - #print 'Using '+str(if_low)+' for lower SPW edge' + # print 'Using '+str(if_low)+' for lower SPW edge' nif_low = 14 break for nif_hi in range(0, 16): f = f_tab[nif_hi] - #print nif_hi,f + # print nif_hi,f if (f[ifn_hi] > (hi_req + 2)): if_hi = nif_hi - 1 - #print 'Using '+str(if_hi)+' for upper SPW edge' + # print 'Using '+str(if_hi)+' for upper SPW edge' nif_hi = 14 break @@ -166,6 +170,7 @@ def freq_map(low_req, hi_req, *args): spw = "{0}~{1}".format(if_low, if_hi) return spw + def launch_mstransform(infile, outfile, no_chan, freq1, width_freq, spw_range, gen_script_dir, casa_bin_dir): @@ -198,6 +203,7 @@ def launch_mstransform(infile, outfile, no_chan, casa_process = subprocess.Popen(casapy_cmd.split()) return casa_process + def do_split(infile, outdir, min_freq, max_freq, step_freq, width_freq, work_dir, casa_bin_dir): """ @@ -222,7 +228,7 @@ def do_split(infile, outdir, min_freq, max_freq, freq2 = min_freq + step_freq bottom_edge = re.search('_[0-9]{3}_', infile) if (bottom_edge): - #e.g. 20131122_941_6_FINAL_PRODUCTS --> 941 + # e.g. 20131122_941_6_FINAL_PRODUCTS --> 941 bedge = bottom_edge.group(0) bedge = int(bedge[1:4]) else: @@ -231,7 +237,7 @@ def do_split(infile, outdir, min_freq, max_freq, casa_proc_list = [] gen_script_dir = "{0}/{1}".format(work_dir, timestr) - for i in range(steps): # potentially parallel + for i in range(steps): # potentially parallel spw_range = freq_map(freq1, freq2, bedge) if (rem and (i == steps - 1)): freq_range = "{0}~{1}".format(min_freq + i * step_freq, max_freq) @@ -251,7 +257,8 @@ def do_split(infile, outdir, min_freq, max_freq, freq2 += step_freq for csp in casa_proc_list: - csp.wait() # join all sub-processes before exiting + csp.wait() # join all sub-processes before exiting + if __name__ == "__main__": """ @@ -280,9 +287,9 @@ def do_split(infile, outdir, min_freq, max_freq, (options, args) = parser.parse_args() if (None == options.infile or - None == options.outdir or - None == options.work_dir or - None == options.casa_bin_dir): + None == options.outdir or + None == options.work_dir or + None == options.casa_bin_dir): parser.print_help() sys.exit(1) diff --git a/daliuge-runtime/test/integrate/msconverter/ms_converter.py b/daliuge-runtime/test/integrate/msconverter/ms_converter.py index f7682a616..c5d8c9547 100644 --- a/daliuge-runtime/test/integrate/msconverter/ms_converter.py +++ b/daliuge-runtime/test/integrate/msconverter/ms_converter.py @@ -1,19 +1,25 @@ import pyrap.tables as pt -oldtable='/scratch/jason/chiles_original.ms' -newtable='/scratch/jason/chiles_adios.ms' +oldtable = '/scratch/jason/chiles_original.ms' +newtable = '/scratch/jason/chiles_adios.ms' t = pt.table(oldtable) dmdef = t.getdminfo() -print 'Original Table: **************************' +print +'Original Table: **************************' for i in dmdef: - print i - print dmdef[i] + print + i + print + dmdef[i] dmdef['*17']['TYPE'] = 'AdiosStMan' -print 'New Table: ***********************' +print +'New Table: ***********************' for i in dmdef: - print i - print dmdef[i] + print + i + print + dmdef[i] -t.copy (newtable, True, True, dminfo=dmdef) +t.copy(newtable, True, True, dminfo=dmdef) diff --git a/daliuge-runtime/test/lifecycle/__init__.py b/daliuge-runtime/test/lifecycle/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/lifecycle/__init__.py +++ b/daliuge-runtime/test/lifecycle/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/lifecycle/test_dlm.py b/daliuge-runtime/test/lifecycle/test_dlm.py index 624cbf8e4..47bad1f9a 100644 --- a/daliuge-runtime/test/lifecycle/test_dlm.py +++ b/daliuge-runtime/test/lifecycle/test_dlm.py @@ -77,7 +77,6 @@ def test_dropCompleteTriggersReplication(self): self.assertEqual(1, len(manager.getDropUids(drop))) def test_expiringNormalDrop(self): - with dlm.DataLifecycleManager(checkPeriod=0.5) as manager: drop = FileDROP('oid:A', 'uid:A1', expectedSize=1, lifespan=0.5) manager.addDrop(drop) @@ -90,7 +89,6 @@ def test_expiringNormalDrop(self): self.assertEqual(DROPStates.EXPIRED, drop.status) - def test_lostDrop(self): with dlm.DataLifecycleManager(checkPeriod=0.5) as manager: drop = FileDROP('oid:A', 'uid:A1', expectedSize=1, lifespan=10, precious=False) @@ -150,7 +148,7 @@ def test_expireAfterUse(self): manager.addDrop(c) # Make sure all consumers are done - with DROPWaiterCtx(self, [c,d], 1): + with DROPWaiterCtx(self, [c, d], 1): a.setCompleted() b.setCompleted() @@ -163,5 +161,6 @@ def test_expireAfterUse(self): self.assertTrue(b.exists()) b.delete() + if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/daliuge-runtime/test/lifecycle/test_registry.py b/daliuge-runtime/test/lifecycle/test_registry.py index 62fe849c2..35d3f193f 100644 --- a/daliuge-runtime/test/lifecycle/test_registry.py +++ b/daliuge-runtime/test/lifecycle/test_registry.py @@ -26,9 +26,9 @@ from dlg.drop import InMemoryDROP from dlg.lifecycle.registry import RDBMSRegistry - DBFILE = 'testing_dlm.db' + class TestRDBMSRegistry(unittest.TestCase): def setUp(self): @@ -36,8 +36,10 @@ def setUp(self): conn = sqlite3.connect(DBFILE) # @UndefinedVariable cur = conn.cursor() cur.execute('CREATE TABLE dlg_drop(oid varchar(64) PRIMARY KEY, phase integer)'); - cur.execute('CREATE TABLE dlg_dropinstance(uid varchar(64) PRIMARY KEY, oid varchar(64), dataRef varchar(128))'); - cur.execute('CREATE TABLE dlg_dropaccesstime(oid varchar(64), accessTime TIMESTAMP, PRIMARY KEY (oid, accessTime))'); + cur.execute( + 'CREATE TABLE dlg_dropinstance(uid varchar(64) PRIMARY KEY, oid varchar(64), dataRef varchar(128))'); + cur.execute( + 'CREATE TABLE dlg_dropaccesstime(oid varchar(64), accessTime TIMESTAMP, PRIMARY KEY (oid, accessTime))'); conn.close() def tearDown(self): @@ -58,7 +60,6 @@ def test_addDrop(self): conn.close() def test_addDropInstances(self): - a1 = InMemoryDROP('a', 'a1') a2 = InMemoryDROP('a', 'a2') registry = RDBMSRegistry('sqlite3', DBFILE) @@ -90,7 +91,6 @@ def test_addDropInstances(self): conn.close() def test_dropAccess(self): - a1 = InMemoryDROP('a', 'a1') registry = RDBMSRegistry('sqlite3', DBFILE) registry.addDrop(a1) @@ -98,4 +98,4 @@ def test_dropAccess(self): self.assertEqual(-1, registry.getLastAccess('a')) registry.recordNewAccess('a') - self.assertNotEqual(-1, registry.getLastAccess('a')) \ No newline at end of file + self.assertNotEqual(-1, registry.getLastAccess('a')) diff --git a/daliuge-runtime/test/manager/__init__.py b/daliuge-runtime/test/manager/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/manager/__init__.py +++ b/daliuge-runtime/test/manager/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/manager/test_daemon.py b/daliuge-runtime/test/manager/test_daemon.py index 1c2280463..7deea912d 100644 --- a/daliuge-runtime/test/manager/test_daemon.py +++ b/daliuge-runtime/test/manager/test_daemon.py @@ -24,13 +24,11 @@ import time import unittest -from six.moves import http_client as httplib # @UnresolvedImport - from dlg import utils, restutils from dlg.manager import constants from dlg.manager.client import MasterManagerClient from dlg.manager.proc_daemon import DlgDaemon - +from six.moves import http_client as httplib # @UnresolvedImport _TIMEOUT = 10 @@ -42,9 +40,11 @@ def create_daemon(self, *args, **kwargs): self._daemon = DlgDaemon(*args, **kwargs) if 'noNM' not in kwargs or not kwargs['noNM']: - self.assertTrue(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, _TIMEOUT), 'The NM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, _TIMEOUT), + 'The NM did not start successfully') if 'master' in kwargs and kwargs['master']: - self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), 'The MM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), + 'The MM did not start successfully') self._daemon_t = threading.Thread(target=lambda: self._daemon.start('localhost', 9000)) self._daemon_t.start() @@ -62,7 +62,7 @@ def create_daemon(self, *args, **kwargs): # To actually avoid this we need to do some actual HTTP talk, which will # ensure the server is actually serving requests, and therefore already # in the daemon's hand - #self.assertTrue(utils.portIsOpen('localhost', 9000, _TIMEOUT)) + # self.assertTrue(utils.portIsOpen('localhost', 9000, _TIMEOUT)) try: restutils.RestClient('localhost', 9000, 10)._GET('/anything') except restutils.RestClientException: @@ -74,7 +74,8 @@ def tearDown(self): self._daemon.stop(_TIMEOUT) self._daemon_t.join(_TIMEOUT) self.assertFalse(self._daemon_t.is_alive(), "Daemon running thread should have finished by now") - self.assertTrue(utils.portIsClosed('localhost', 9000, _TIMEOUT), 'DALiuGE Daemon REST interface should be off') + self.assertTrue(utils.portIsClosed('localhost', 9000, _TIMEOUT), + 'DALiuGE Daemon REST interface should be off') unittest.TestCase.tearDown(self) def test_nm_starts(self): @@ -88,8 +89,10 @@ def test_mm_starts(self): def test_nothing_starts(self): # Nothing should start now self.create_daemon(master=False, noNM=True, disable_zeroconf=True) - self.assertFalse(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, 0), 'NM started but it should not have') - self.assertFalse(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, 0), 'NM started but it should not have') + self.assertFalse(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, 0), + 'NM started but it should not have') + self.assertFalse(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, 0), + 'NM started but it should not have') def test_start_master_via_rest(self): @@ -97,7 +100,8 @@ def test_start_master_via_rest(self): # Check that the master starts self._start('master', httplib.OK) - self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), 'The MM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), + 'The MM did not start successfully') def test_zeroconf_discovery(self): @@ -123,7 +127,8 @@ def test_start_dataisland_via_rest(self): # Check that the DataIsland starts with the given nodes self._start('dataisland', httplib.OK, {'nodes': nodes}) - self.assertTrue(utils.portIsOpen('localhost', constants.ISLAND_DEFAULT_REST_PORT, _TIMEOUT), 'The DIM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.ISLAND_DEFAULT_REST_PORT, _TIMEOUT), + 'The DIM did not start successfully') def _start(self, manager_name, expected_code, payload=None): conn = httplib.HTTPConnection('localhost', 9000) @@ -144,4 +149,4 @@ def _get_nodes_from_master(self, timeout): nodes = mc.nodes() if nodes: return nodes - time.sleep(0.1) \ No newline at end of file + time.sleep(0.1) diff --git a/daliuge-runtime/test/manager/test_dim.py b/daliuge-runtime/test/manager/test_dim.py index 1195de9bb..1c4531657 100644 --- a/daliuge-runtime/test/manager/test_dim.py +++ b/daliuge-runtime/test/manager/test_dim.py @@ -26,7 +26,6 @@ import unittest import pkg_resources - from dlg import droputils from dlg import utils from dlg.common import tool @@ -36,9 +35,9 @@ from dlg.testutils import ManagerStarter from test.manager import testutils - hostname = 'localhost' + class LocalDimStarter(ManagerStarter): def setUp(self): @@ -52,12 +51,14 @@ def tearDown(self): self.dim.shutdown() super(LocalDimStarter, self).tearDown() + class TestDIM(LocalDimStarter, unittest.TestCase): def createSessionAndAddTypicalGraph(self, sessionId, sleepTime=0): - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname, 'consumers':['B']}, - {'oid':'B', 'type':'app', 'app':'dlg.apps.simple.SleepAndCopyApp', 'sleepTime':sleepTime, 'outputs':['C'], 'node':hostname}, - {'oid':'C', 'type':'plain', 'storage':'memory', 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname, 'consumers': ['B']}, + {'oid': 'B', 'type': 'app', 'app': 'dlg.apps.simple.SleepAndCopyApp', 'sleepTime': sleepTime, + 'outputs': ['C'], 'node': hostname}, + {'oid': 'C', 'type': 'plain', 'storage': 'memory', 'node': hostname}] self.dim.createSession(sessionId) self.assertEqual(0, self.dim.getGraphSize(sessionId)) self.dim.addGraphSpec(sessionId, graphSpec) @@ -74,15 +75,15 @@ def test_addGraphSpec(self): sessionId = 'lalo' # No node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory'}] self.assertRaises(Exception, self.dim.addGraphSpec, sessionId, graphSpec) # Wrong node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':'unknown_host'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': 'unknown_host'}] self.assertRaises(Exception, self.dim.addGraphSpec, sessionId, graphSpec) # OK - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname}] self.dim.createSession(sessionId) self.assertEqual(0, self.dim.getGraphSize(sessionId)) self.dim.addGraphSpec(sessionId, graphSpec) @@ -165,7 +166,7 @@ def test_getGraph(self): graphSpecFromDim = self.dim.getGraph(sessionId) self.assertEqual(3, len(graphSpecFromDim)) - for oid in ('A','B','C'): + for oid in ('A', 'B', 'C'): self.assertIn(oid, graphSpecFromDim) graphSepcFromDM = self.dm.getGraph(sessionId) self.assertDictEqual(graphSepcFromDM, graphSpecFromDim) @@ -207,9 +208,9 @@ def assertGraphStatus(sessionId, expectedStatus): self.dim.cancelSession(sessionId) - #a, c = [self.dm._sessions[sessionId].drops[x] for x in ('A', 'C')] - #data = os.urandom(10) - #with droputils.DROPWaiterCtx(self, c, 3): + # a, c = [self.dm._sessions[sessionId].drops[x] for x in ('A', 'C')] + # data = os.urandom(10) + # with droputils.DROPWaiterCtx(self, c, 3): # a.write(data) # a.setCompleted() assertGraphStatus(sessionId, DROPStates.CANCELLED) @@ -224,8 +225,8 @@ def test_fullRound(self): """ sessionId = 'lala' - restPort = 8888 - args = ['--port', str(restPort), '-N',hostname, '-qqq'] + restPort = 8888 + args = ['--port', str(restPort), '-N', hostname, '-qqq'] dimProcess = tool.start_process('dim', args) with testutils.terminating(dimProcess, 10): @@ -253,29 +254,33 @@ def test_fullRound(self): # Since the original complexGraph doesn't have node information # we need to add it manually before submitting -- otherwise it will # get rejected by the DIM. - with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable + with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable complexGraphSpec = json.load(codecs.getreader('utf-8')(f)) for dropSpec in complexGraphSpec: dropSpec['node'] = hostname testutils.post(self, '/sessions/%s/graph/append' % (sessionId), restPort, json.dumps(complexGraphSpec)) - self.assertEqual({hostname: SessionStates.BUILDING}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: SessionStates.BUILDING}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # Now we deploy the graph... - testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", mimeType='application/x-www-form-urlencoded') - self.assertEqual({hostname: SessionStates.RUNNING}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", + mimeType='application/x-www-form-urlencoded') + self.assertEqual({hostname: SessionStates.RUNNING}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # ...and write to all 5 root nodes that are listening in ports # starting at 1111 msg = os.urandom(10) for i in range(5): - utils.write_to('localhost', 1111+i, msg, 2), "Couldn't write data to localhost:%d" % (1111+i) + utils.write_to('localhost', 1111 + i, msg, 2), "Couldn't write data to localhost:%d" % (1111 + i) # Wait until the graph has finished its execution. We'll know # it finished by polling the status of the session while SessionStates.RUNNING in testutils.get(self, '/sessions/%s/status' % (sessionId), restPort).values(): time.sleep(0.2) - self.assertEqual({hostname: SessionStates.FINISHED}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: SessionStates.FINISHED}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) testutils.delete(self, '/sessions/%s' % (sessionId), restPort) sessions = testutils.get(self, '/sessions', restPort) - self.assertEqual(0, len(sessions)) \ No newline at end of file + self.assertEqual(0, len(sessions)) diff --git a/daliuge-runtime/test/manager/test_dm.py b/daliuge-runtime/test/manager/test_dm.py index 040d0cd9a..2737616b0 100644 --- a/daliuge-runtime/test/manager/test_dm.py +++ b/daliuge-runtime/test/manager/test_dm.py @@ -24,10 +24,9 @@ import unittest import six - from dlg import droputils -from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType from dlg.common import dropdict +from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType from dlg.drop import BarrierAppDROP from dlg.manager.node_manager import NodeManager @@ -36,7 +35,6 @@ except: from binascii import crc32 # @Reimport - hostname = "localhost" @@ -93,15 +91,15 @@ def tearDown(self): nm.shutdown() def _test_runGraphInTwoNMs( - self, - g1, - g2, - rels, - root_data, - leaf_data, - root_oids=("A",), - leaf_oid="C", - expected_failures=[], + self, + g1, + g2, + rels, + root_data, + leaf_data, + root_oids=("A",), + leaf_oid="C", + expected_failures=[], ): """Utility to run a graph in two Node Managers""" diff --git a/daliuge-runtime/test/manager/test_mm.py b/daliuge-runtime/test/manager/test_mm.py index 3d87c5f3d..dd1da491b 100644 --- a/daliuge-runtime/test/manager/test_mm.py +++ b/daliuge-runtime/test/manager/test_mm.py @@ -26,7 +26,6 @@ import unittest import pkg_resources - from dlg import droputils from dlg import utils from dlg.common import tool @@ -36,9 +35,9 @@ from dlg.testutils import ManagerStarter from test.manager import testutils - hostname = '127.0.0.1' + class DimAndNMStarter(ManagerStarter): def setUp(self): @@ -54,12 +53,15 @@ def tearDown(self): self.dim_info.stop() self.nm_info.stop() + class TestMM(DimAndNMStarter, unittest.TestCase): def createSessionAndAddTypicalGraph(self, sessionId, sleepTime=0): - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'island':hostname, 'node':hostname, 'consumers':['B']}, - {'oid':'B', 'type':'app', 'app':'dlg.apps.simple.SleepAndCopyApp', 'sleepTime':sleepTime, 'outputs':['C'], 'node':hostname, 'island':hostname}, - {'oid':'C', 'type':'plain', 'storage':'memory', 'island':hostname, 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'island': hostname, 'node': hostname, + 'consumers': ['B']}, + {'oid': 'B', 'type': 'app', 'app': 'dlg.apps.simple.SleepAndCopyApp', 'sleepTime': sleepTime, + 'outputs': ['C'], 'node': hostname, 'island': hostname}, + {'oid': 'C', 'type': 'plain', 'storage': 'memory', 'island': hostname, 'node': hostname}] self.mm.createSession(sessionId) self.mm.addGraphSpec(sessionId, graphSpec) @@ -74,23 +76,23 @@ def test_addGraphSpec(self): sessionId = 'lalo' # No node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory'}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # Wrong node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':'unknown_host'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': 'unknown_host'}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # No island specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # Wrong island specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname, 'island':'unknown_host'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname, 'island': 'unknown_host'}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # OK - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname, 'island':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname, 'island': hostname}] self.mm.createSession(sessionId) self.mm.addGraphSpec(sessionId, graphSpec) @@ -140,9 +142,9 @@ def test_deployGraphWithCompletedDOs(self): def test_sessionStatus(self): def assertSessionStatus(sessionId, status): - sessionStatusMM = self.mm.getSessionStatus(sessionId) + sessionStatusMM = self.mm.getSessionStatus(sessionId) sessionStatusDIM = self.dim.getSessionStatus(sessionId) - sessionStatusNM = self.nm.getSessionStatus(sessionId) + sessionStatusNM = self.nm.getSessionStatus(sessionId) self.assertEqual(1, len(sessionStatusMM)) self.assertIn(hostname, sessionStatusMM) self.assertDictEqual(sessionStatusDIM, sessionStatusMM[hostname]) @@ -175,7 +177,7 @@ def test_getGraph(self): graphSpecFromMM = self.mm.getGraph(sessionId) self.assertEqual(3, len(graphSpecFromMM)) - for oid in ('A','B','C'): + for oid in ('A', 'B', 'C'): self.assertIn(oid, graphSpecFromMM) graphSepcFromNM = self.nm.getGraph(sessionId) graphSepcFromDIM = self.dim.getGraph(sessionId) @@ -215,9 +217,9 @@ def test_fullRound(self): """ sessionId = 'lala' - restPort = 8888 + restPort = 8888 - args = ['--port', str(restPort), '-N',hostname, '-qqq'] + args = ['--port', str(restPort), '-N', hostname, '-qqq'] mmProcess = tool.start_process('mm', args) with testutils.terminating(mmProcess, 10): @@ -245,30 +247,35 @@ def test_fullRound(self): # Since the original complexGraph doesn't have node information # we need to add it manually before submitting -- otherwise it will # get rejected by the DIM. - with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable + with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable complexGraphSpec = json.load(codecs.getreader('utf-8')(f)) for dropSpec in complexGraphSpec: dropSpec['node'] = hostname dropSpec['island'] = hostname testutils.post(self, '/sessions/%s/graph/append' % (sessionId), restPort, json.dumps(complexGraphSpec)) - self.assertEqual({hostname: {hostname: SessionStates.BUILDING}}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: {hostname: SessionStates.BUILDING}}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # Now we deploy the graph... - testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", mimeType='application/x-www-form-urlencoded') - self.assertEqual({hostname: {hostname: SessionStates.RUNNING}}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", + mimeType='application/x-www-form-urlencoded') + self.assertEqual({hostname: {hostname: SessionStates.RUNNING}}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # ...and write to all 5 root nodes that are listening in ports # starting at 1111 msg = os.urandom(10) for i in range(5): - utils.write_to('localhost', 1111+i, msg, 2), "Couldn't write data to localhost:%d" % (1111+i) + utils.write_to('localhost', 1111 + i, msg, 2), "Couldn't write data to localhost:%d" % (1111 + i) # Wait until the graph has finished its execution. We'll know # it finished by polling the status of the session - while SessionStates.RUNNING in testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)[hostname].values(): + while SessionStates.RUNNING in testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)[ + hostname].values(): time.sleep(0.2) - self.assertEqual({hostname: {hostname: SessionStates.FINISHED}}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: {hostname: SessionStates.FINISHED}}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) testutils.delete(self, '/sessions/%s' % (sessionId), restPort) sessions = testutils.get(self, '/sessions', restPort) - self.assertEqual(0, len(sessions)) \ No newline at end of file + self.assertEqual(0, len(sessions)) diff --git a/daliuge-runtime/test/manager/test_rest.py b/daliuge-runtime/test/manager/test_rest.py index 5f7db1e99..edd0e8ca5 100644 --- a/daliuge-runtime/test/manager/test_rest.py +++ b/daliuge-runtime/test/manager/test_rest.py @@ -24,17 +24,17 @@ import unittest from dlg import exceptions +from dlg.exceptions import InvalidGraphException from dlg.manager import constants from dlg.manager.client import NodeManagerClient, DataIslandManagerClient +from dlg.manager.composite_manager import DataIslandManager from dlg.manager.node_manager import NodeManager from dlg.manager.rest import NMRestServer, CompositeManagerRestServer from dlg.restutils import RestClient -from dlg.manager.composite_manager import DataIslandManager -from dlg.exceptions import InvalidGraphException - hostname = 'localhost' + class TestRest(unittest.TestCase): def setUp(self): @@ -46,7 +46,8 @@ def setUp(self): self.dim = DataIslandManager(dmHosts=[hostname]) self._dim_server = CompositeManagerRestServer(self.dim) - self._dim_t = threading.Thread(target=self._dim_server.start, args=(hostname, constants.ISLAND_DEFAULT_REST_PORT)) + self._dim_t = threading.Thread(target=self._dim_server.start, + args=(hostname, constants.ISLAND_DEFAULT_REST_PORT)) self._dim_t.start() def tearDown(self): @@ -68,7 +69,6 @@ def test_index(self): c._GET('/session') def test_errtype(self): - sid = 'lala' c = NodeManagerClient(hostname) c.createSession(sid) @@ -83,24 +83,26 @@ def test_errtype(self): self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, [{}]) # invalid dropspec, app doesn't exist - self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist'}]) + self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, + [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist'}]) # invalid state, the graph status is only queried when the session is running self.assertRaises(exceptions.InvalidSessionState, c.getGraphStatus, sid) # valid dropspec, but the socket listener app doesn't allow inputs - c.addGraphSpec(sid, [{'type': 'socket', 'oid': 'a', 'inputs': ['b']}, {'oid': 'b', 'type': 'plain', 'storage': 'memory'}]) + c.addGraphSpec(sid, [{'type': 'socket', 'oid': 'a', 'inputs': ['b']}, + {'oid': 'b', 'type': 'plain', 'storage': 'memory'}]) self.assertRaises(exceptions.InvalidRelationshipException, c.deploySession, sid) # And here we point to an unexisting file, making an invalid drop c.destroySession(sid) c.createSession(sid) fname = tempfile.mktemp() - c.addGraphSpec(sid, [{'type': 'plain', 'storage': 'file', 'oid': 'a', 'filepath': fname, 'check_filepath_exists': True}]) + c.addGraphSpec(sid, [ + {'type': 'plain', 'storage': 'file', 'oid': 'a', 'filepath': fname, 'check_filepath_exists': True}]) self.assertRaises(exceptions.InvalidDropException, c.deploySession, sid) def test_recursive(self): - sid = 'lala' c = DataIslandManagerClient(hostname) c.createSession(sid) @@ -112,4 +114,4 @@ def test_recursive(self): c.addGraphSpec(sid, [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist', 'node': hostname}]) ex = cm.exception self.assertTrue(hostname in ex.args[0]) - self.assertTrue(isinstance(ex.args[0][hostname], InvalidGraphException)) \ No newline at end of file + self.assertTrue(isinstance(ex.args[0][hostname], InvalidGraphException)) diff --git a/daliuge-runtime/test/manager/test_scalability.py b/daliuge-runtime/test/manager/test_scalability.py index 743312117..9e1576bb9 100644 --- a/daliuge-runtime/test/manager/test_scalability.py +++ b/daliuge-runtime/test/manager/test_scalability.py @@ -28,12 +28,13 @@ from dlg.utils import terminate_or_kill from test.manager import testutils - logger = logging.getLogger(__name__) hostname = 'localhost' + def memory_drop(uid): - return dropdict({'node':hostname, 'oid':uid, 'uid':uid, 'type':'plain', 'storage':'memory'}) + return dropdict({'node': hostname, 'oid': uid, 'uid': uid, 'type': 'plain', 'storage': 'memory'}) + def create_graph(branches, drops_per_branch): graph = [] @@ -44,7 +45,8 @@ def create_graph(branches, drops_per_branch): data_uid = 'data_%d_branch_%d' % (i, branch) app_uid = 'app_%d_branch_%d' % (i, branch) data_drop = memory_drop(data_uid) - app_drop = dropdict({'node':hostname, 'oid':app_uid, 'uid':app_uid, 'type':'app', 'app':'dlg.apps.simple.SleepAndCopyApp', 'sleepTime':0}) + app_drop = dropdict({'node': hostname, 'oid': app_uid, 'uid': app_uid, 'type': 'app', + 'app': 'dlg.apps.simple.SleepAndCopyApp', 'sleepTime': 0}) data_drop.addConsumer(app_drop) graph.append(data_drop) graph.append(app_drop) @@ -63,6 +65,7 @@ def create_graph(branches, drops_per_branch): graph.append(final_drop) return graph, completed_uids + class TestBigGraph(unittest.TestCase): """ A small class that simply checks that the deployment of a considerable-sized @@ -80,10 +83,9 @@ def tearDown(self): unittest.TestCase.tearDown(self) def test_submit_hugegraph(self): - # Each branch contains a data drop and an app drop # All branches connect to a final data drop - drops_per_branch=5000 + drops_per_branch = 5000 branches = 5 n_drops = drops_per_branch * branches * 2 + 1 graph, completed_uids = create_graph(branches=branches, drops_per_branch=drops_per_branch) @@ -91,9 +93,8 @@ def test_submit_hugegraph(self): self._run_graph(graph, completed_uids, 5) def _run_graph(self, graph, completed_uids, timeout): - sessionId = 'lala' - restPort = 8888 + restPort = 8888 args = ['--port', str(restPort), '-N', hostname, '-qq'] c = client.NodeManagerClient(port=restPort) @@ -111,4 +112,4 @@ def _run_graph(self, graph, completed_uids, timeout): # A minute is more than enough, in my PC it takes around 4 or 5 [s] # A minute is also way less than the ~2 [h] we observed in AWS - self.assertLessEqual(delta, 60, "It took way too much time to create all drops") \ No newline at end of file + self.assertLessEqual(delta, 60, "It took way too much time to create all drops") diff --git a/daliuge-runtime/test/manager/testutils.py b/daliuge-runtime/test/manager/testutils.py index eef8ca2f5..40b8551fd 100644 --- a/daliuge-runtime/test/manager/testutils.py +++ b/daliuge-runtime/test/manager/testutils.py @@ -19,12 +19,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import codecs import json import six.moves.http_client as httplib # @UnresolvedImport - from dlg import utils -import codecs def get(test, url, port): @@ -37,6 +36,7 @@ def get(test, url, port): conn.close() return jsonRes + def post(test, url, port, content=None, mimeType=None): conn = httplib.HTTPConnection('localhost', port, timeout=3) headers = {mimeType or 'Content-Type': 'application/json'} if content else {} @@ -45,6 +45,7 @@ def post(test, url, port, content=None, mimeType=None): test.assertEqual(httplib.OK, res.status) conn.close() + def delete(test, url, port): conn = httplib.HTTPConnection('localhost', port, timeout=3) conn.request('DELETE', '/api' + url) @@ -52,6 +53,7 @@ def delete(test, url, port): test.assertEqual(httplib.OK, res.status) conn.close() + class terminating(object): """ A context manager that makes sure a process always exits. @@ -66,4 +68,4 @@ def __enter__(self): def __exit__(self, typ, val, traceback): utils.terminate_or_kill(self.proc, self.timeout) - return False \ No newline at end of file + return False diff --git a/daliuge-runtime/test/memoryUsage.py b/daliuge-runtime/test/memoryUsage.py index 446a1775b..44d462222 100644 --- a/daliuge-runtime/test/memoryUsage.py +++ b/daliuge-runtime/test/memoryUsage.py @@ -25,8 +25,8 @@ """ import importlib -from optparse import OptionParser import sys +from optparse import OptionParser import psutil @@ -50,14 +50,15 @@ def measure(n, droptype): return mem2 - mem1, uTime2 - uTime1, sTime2 - sTime1 + if __name__ == '__main__': parser = OptionParser() - parser.add_option("--csv", action="store_true", dest="csv", help = "Output results in CSV format", default=False) + parser.add_option("--csv", action="store_true", dest="csv", help="Output results in CSV format", default=False) parser.add_option("-i", "--instances", action="store", type="int", - dest="instances", help = "Number of DROP instances to create and measure") + dest="instances", help="Number of DROP instances to create and measure") parser.add_option("-t", "--type", action="store", type="string", - dest="type", help = "DROP type to instantiate") + dest="type", help="DROP type to instantiate") (options, args) = parser.parse_args(sys.argv) if options.type is None: @@ -72,12 +73,14 @@ def measure(n, droptype): droptype = getattr(importlib.import_module(modname), classname) mem, uTime, sTime = measure(n, droptype) tTime = uTime + sTime - memAvg, uTimeAvg, sTimeAvg, tTimeAvg = [x/float(n) for x in (mem, uTime, sTime, tTime)] + memAvg, uTimeAvg, sTimeAvg, tTimeAvg = [x / float(n) for x in (mem, uTime, sTime, tTime)] if options.csv: - print("%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % (options.type, n, mem, uTime*1e3, sTime*1e3, tTime*1e3, memAvg, uTimeAvg*1e6, sTimeAvg*1e6, tTimeAvg*1e6)) + print("%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % ( + options.type, n, mem, uTime * 1e3, sTime * 1e3, tTime * 1e3, memAvg, uTimeAvg * 1e6, sTimeAvg * 1e6, + tTimeAvg * 1e6)) else: print("%d bytes used by %d %ss (%.2f bytes per DROP)" % (mem, n, droptype.__name__, memAvg)) print("Total time: %.2f msec (%.2f msec per DROP)" % (tTime, tTimeAvg)) print("User time: %.2f msec (%.2f msec per DROP)" % (uTime, uTimeAvg)) - print("System time: %.2f msec (%.2f msec per DROP)" % (sTime, sTimeAvg)) \ No newline at end of file + print("System time: %.2f msec (%.2f msec per DROP)" % (sTime, sTimeAvg)) diff --git a/daliuge-runtime/test/test_JsonDrop.py b/daliuge-runtime/test/test_JsonDrop.py index d1ece8672..4b9c5d51f 100644 --- a/daliuge-runtime/test/test_JsonDrop.py +++ b/daliuge-runtime/test/test_JsonDrop.py @@ -83,7 +83,7 @@ def setUpClass(cls): if not os.path.exists(DIR): os.makedirs(DIR) - #with open(os.path.join(DIR, 'oid___uid'), mode='w') as write_file: + # with open(os.path.join(DIR, 'oid___uid'), mode='w') as write_file: with open(os.path.join(DIR, 'uid'), mode='w') as write_file: write_file.write(FILE_TEXT) diff --git a/daliuge-runtime/test/test_S3Drop.py b/daliuge-runtime/test/test_S3Drop.py index f35205eb2..74be1dd38 100644 --- a/daliuge-runtime/test/test_S3Drop.py +++ b/daliuge-runtime/test/test_S3Drop.py @@ -20,6 +20,7 @@ # MA 02111-1307 USA # from unittest.case import skipIf + """ Test the S3 Drop """ @@ -62,4 +63,4 @@ def test_size(self): self.assertEqual(drop.size(), -1) # drop = S3DROP('oid:A', 'uid:A', profile_name=PROFILE, bucket='13b-266', key='13B-266.sb25386827.eb28551343.56619.33367407408_calibrated_deepfield.ms.tar') - # self.assertEqual(drop.size(), 734067056640) \ No newline at end of file + # self.assertEqual(drop.size(), 734067056640) diff --git a/daliuge-runtime/test/test_dask_emulation.py b/daliuge-runtime/test/test_dask_emulation.py index 7c2b05d29..328219b2f 100644 --- a/daliuge-runtime/test/test_dask_emulation.py +++ b/daliuge-runtime/test/test_dask_emulation.py @@ -24,12 +24,11 @@ import unittest import numpy as np -from six.moves import reduce # @UnresolvedImport - -from dlg.dask_emulation import delayed as dlg_delayed -from dlg.dask_emulation import compute as dlg_compute from dlg.common import tool +from dlg.dask_emulation import compute as dlg_compute +from dlg.dask_emulation import delayed as dlg_delayed from dlg.utils import terminate_or_kill +from six.moves import reduce # @UnresolvedImport try: from dask import delayed as dask_delayed @@ -41,52 +40,67 @@ def add(x, y): return x + y + def add_list(numbers): return reduce(add, numbers) + def subtract(x, y): return x - y + def subtract_list(numbers): return reduce(subtract, numbers) + def multiply(x, y): return x * y + def divide(x, y): return x / y + def partition(x): return x / 2, x - x / 2 + def sum_with_args(a, *args): """Returns a + kwargs['b'], or only a if no 'b' is found in kwargs""" return a + sum(args) + def sum_with_kwargs(a, **kwargs): """Returns a + kwargs['b'], or only a if no 'b' is found in kwargs""" b = kwargs.pop('b', 0) return a + b + def sum_with_args_and_kwarg(a, *args, **kwargs): """Returns a + kwargs['b'], or only a if no 'b' is found in kwargs""" b = kwargs.pop('b', 0) return a + sum(args) + b + class MyType(object): """A type that is serializable but not convertible to JSON""" + def __init__(self, x): self.x = x self.array = np.zeros(1) + + try: json.dumps(MyType(1)) assert False, "Should fail to serialize to JSON" except: pass + def sum_with_user_defined_default(a, b=MyType(10)): return a + b.x + class _TestDelayed(object): """Test definitions run under non-delayed, dlg_delayed and possibly dask_delayed contexts""" @@ -204,30 +218,40 @@ def test_with_iterable_nout_1(self): class TestNoDelayed(unittest.TestCase, _TestDelayed): """Non-delayed tests""" + def delayed(self, f, *_, **__): return f + def compute(self, val): return val + class TestDlgDelayed(_TestDelayed, unittest.TestCase): """dlg-base tests, they start/stop the node manager and use dlg_delayed""" + def delayed(self, f, *args, **kwargs): return dlg_delayed(f, *args, **kwargs) + def setUp(self): unittest.TestCase.setUp(self) env = os.environ.copy() env['PYTHONPATH'] = env.get('PYTHONPATH', '') + ":" + os.getcwd() self.dmProcess = tool.start_process('nm', env=env) + def compute(self, val): return dlg_compute(val) + def tearDown(self): terminate_or_kill(self.dmProcess, 5) unittest.TestCase.tearDown(self) + @unittest.skipIf(dask_delayed is None, 'dask is not available') class TestDaskDelayed(_TestDelayed, unittest.TestCase): """dask-base tests, they use dask_delayed""" + def delayed(self, f, *args, **kwargs): return dask_delayed(f, *args, **kwargs) + def compute(self, val): return dask_compute(val)[0] diff --git a/daliuge-runtime/test/test_drop.py b/daliuge-runtime/test/test_drop.py index 685de2891..2da883ed8 100644 --- a/daliuge-runtime/test/test_drop.py +++ b/daliuge-runtime/test/test_drop.py @@ -21,15 +21,14 @@ # import contextlib -import os, unittest +import os import random import shutil import sqlite3 import tempfile +import unittest import six -from six import BytesIO - from dlg import droputils from dlg.ddap_protocol import DROPStates, ExecutionMode, AppDROPStates from dlg.drop import FileDROP, AppDROP, InMemoryDROP, \ @@ -37,7 +36,7 @@ DirectoryContainer, ContainerDROP, InputFiredAppDROP, RDBMSDrop from dlg.droputils import DROPWaiterCtx from dlg.exceptions import InvalidDropException - +from six import BytesIO try: from crc32c import crc32 @@ -46,9 +45,11 @@ ONE_MB = 1024 ** 2 + def _start_ns_thread(ns_daemon): ns_daemon.requestLoop() + def isContainer(drop): # return isinstance(drop, ContainerDROP) # A Pyro-friendly way to check for a ContainerDROP is to see if @@ -59,12 +60,14 @@ def isContainer(drop): except AttributeError: return False + class SumupContainerChecksum(BarrierAppDROP): """ A dummy BarrierAppDROP that recursively sums up the checksums of all the individual DROPs it consumes, and then stores the final result in its output DROP """ + def run(self): crcSum = 0 for inputDrop in self.inputs: @@ -73,14 +76,15 @@ def run(self): outputDrop = self.outputs[0] outputDrop.write(six.b(str(crcSum))) + class TestDROP(unittest.TestCase): def setUp(self): """ library-specific setup """ - self._test_drop_sz = 16 # MB - self._test_block_sz = 2 # MB + self._test_drop_sz = 16 # MB + self._test_block_sz = 2 # MB self._test_num_blocks = self._test_drop_sz // self._test_block_sz self._test_block = os.urandom(self._test_block_sz * ONE_MB) @@ -113,7 +117,7 @@ def _test_write_withDropType(self, dropType): """ Test an AbstractDROP and a simple AppDROP (for checksum calculation) """ - a = dropType('oid:A', 'uid:A', expectedSize = self._test_drop_sz * ONE_MB) + a = dropType('oid:A', 'uid:A', expectedSize=self._test_drop_sz * ONE_MB) b = SumupContainerChecksum('oid:B', 'uid:B') c = InMemoryDROP('oid:C', 'uid:C') b.addInput(a) @@ -203,7 +207,7 @@ def run(self): a.setCompleted() # Get intermediate and final results and compare - actualRes = [] + actualRes = [] for i in [c, e, g]: actualRes.append(droputils.allDropContents(i)) map(lambda x, y: self.assertEqual(x, y), [cResExpected, eResExpected, gResExpected], actualRes) @@ -245,7 +249,7 @@ def branch_failure(self, tooManyFailures): hold the sum of B1, B2 and B3's checksums """ - #create file data objects + # create file data objects a1 = InMemoryDROP('oid:A1', 'uid:A1') a2 = InMemoryDROP('oid:A2', 'uid:A2') a3 = InMemoryDROP('oid:A3', 'uid:A3') @@ -259,16 +263,16 @@ def branch_failure(self, tooManyFailures): c3 = InMemoryDROP('oid:C3', 'uid:C3') # The final DROP that sums up the CRCs from the container DROP - d = SumupContainerChecksum('oid:D', 'uid:D', input_error_threshold = 33) + d = SumupContainerChecksum('oid:D', 'uid:D', input_error_threshold=33) e = InMemoryDROP('oid:E', 'uid:E') # Wire together - dropAList = [a1,a2,a3] - dropBList = [b1,b2,b3] - dropCList = [c1,c2,c3] - for dropA,dropB in zip(dropAList, dropBList): + dropAList = [a1, a2, a3] + dropBList = [b1, b2, b3] + dropCList = [c1, c2, c3] + for dropA, dropB in zip(dropAList, dropBList): dropA.addConsumer(dropB) - for dropB,dropC in zip(dropBList, dropCList): + for dropB, dropC in zip(dropBList, dropCList): dropB.addOutput(dropC) for dropC in dropCList: dropC.addConsumer(d) @@ -277,12 +281,14 @@ def branch_failure(self, tooManyFailures): # Write data into the initial "A" DROPs, which should trigger # the whole chain explained above with DROPWaiterCtx(self, e): - #for dropA in dropAList: # this should be parallel for - a1.write(b' '); a1.setCompleted() + # for dropA in dropAList: # this should be parallel for + a1.write(b' '); + a1.setCompleted() if tooManyFailures: a2.setError() else: - a2.write(b' '); a2.setCompleted() + a2.write(b' '); + a2.setCompleted() a3.setError() if tooManyFailures: @@ -327,7 +333,7 @@ def test_join(self): """ filelen = self._test_drop_sz * ONE_MB - #create file data objects + # create file data objects a1 = FileDROP('oid:A1', 'uid:A1', expectedSize=filelen) a2 = FileDROP('oid:A2', 'uid:A2', expectedSize=filelen) a3 = FileDROP('oid:A3', 'uid:A3', expectedSize=filelen) @@ -345,12 +351,12 @@ def test_join(self): e = InMemoryDROP('oid:E', 'uid:E') # Wire together - dropAList = [a1,a2,a3] - dropBList = [b1,b2,b3] - dropCList = [c1,c2,c3] - for dropA,dropB in map(lambda a,b: (a,b), dropAList, dropBList): + dropAList = [a1, a2, a3] + dropBList = [b1, b2, b3] + dropCList = [c1, c2, c3] + for dropA, dropB in map(lambda a, b: (a, b), dropAList, dropBList): dropA.addConsumer(dropB) - for dropB,dropC in map(lambda b,c: (b,c), dropBList, dropCList): + for dropB, dropC in map(lambda b, c: (b, c), dropBList, dropCList): dropB.addOutput(dropC) for dropC in dropCList: dropC.addConsumer(d) @@ -359,7 +365,7 @@ def test_join(self): # Write data into the initial "A" DROPs, which should trigger # the whole chain explained above with DROPWaiterCtx(self, e): - for dropA in dropAList: # this should be parallel for + for dropA in dropAList: # this should be parallel for for _ in range(self._test_num_blocks): dropA.write(self._test_block) @@ -410,12 +416,12 @@ def run(self): outputs[int(n) % 2].write(n + b" ") # Create DROPs - a = InMemoryDROP('oid:A', 'uid:A') - b = NumberWriterApp('oid:B', 'uid:B') - c = InMemoryDROP('oid:A', 'uid:A') + a = InMemoryDROP('oid:A', 'uid:A') + b = NumberWriterApp('oid:B', 'uid:B') + c = InMemoryDROP('oid:A', 'uid:A') d = OddAndEvenContainerApp('oid:D', 'uid:D') - e = InMemoryDROP('oid:E', 'uid:E') - f = InMemoryDROP('oid:F', 'uid:F') + e = InMemoryDROP('oid:E', 'uid:E') + f = InMemoryDROP('oid:F', 'uid:F') # Wire them together a.addConsumer(b) @@ -425,17 +431,16 @@ def run(self): d.addOutput(f) # Start the execution - with DROPWaiterCtx(self, [e,f]): + with DROPWaiterCtx(self, [e, f]): a.write(b'20') a.setCompleted() # Check the final results are correct - for drop in [a,b,c,d,e]: + for drop in [a, b, c, d, e]: self.assertEqual(drop.status, DROPStates.COMPLETED, "%r is not yet COMPLETED" % (drop)) self.assertEqual(b"0 2 4 6 8 10 12 14 16 18", droputils.allDropContents(e).strip()) self.assertEqual(b"1 3 5 7 9 11 13 15 17 19", droputils.allDropContents(f).strip()) - def test_dropWroteFromOutside(self): """ A different scenario to those tested above, in which the data @@ -555,11 +560,13 @@ class LastCharWriterApp(AppDROP): def initialize(self, **kwargs): super(LastCharWriterApp, self).initialize(**kwargs) self._lastByte = None + def dataWritten(self, uid, data): self.execStatus = AppDROPStates.RUNNING outputDrop = self.outputs[0] self._lastByte = data[-1:] outputDrop.write(self._lastByte) + def dropCompleted(self, uid, status): self.execStatus = AppDROPStates.FINISHED self._notifyAppIsFinished() @@ -586,13 +593,13 @@ def checkDropStates(aStatus, dStatus, eStatus, lastByte): if lastByte is not None: self.assertEqual(lastByte, b._lastByte) - checkDropStates(DROPStates.INITIALIZED , DROPStates.INITIALIZED, DROPStates.INITIALIZED, None) + checkDropStates(DROPStates.INITIALIZED, DROPStates.INITIALIZED, DROPStates.INITIALIZED, None) a.write(b'abcde') checkDropStates(DROPStates.WRITING, DROPStates.WRITING, DROPStates.INITIALIZED, b'e') a.write(b'fghij') checkDropStates(DROPStates.WRITING, DROPStates.WRITING, DROPStates.INITIALIZED, b'j') a.write(b'k') - with DROPWaiterCtx(self, [d,e]): + with DROPWaiterCtx(self, [d, e]): a.setCompleted() checkDropStates(DROPStates.COMPLETED, DROPStates.COMPLETED, DROPStates.COMPLETED, b'k') @@ -636,7 +643,7 @@ def test_directoryContainer(self): # Prepare our playground cwd = os.getcwd() os.chdir('/tmp') - dirname = "/tmp/.hidden" + dirname = "/tmp/.hidden" dirname2 = "/tmp/.hidden/inside" if not os.path.exists(dirname2): os.makedirs(dirname2) @@ -677,29 +684,31 @@ def test_multipleProducers(self): A test that checks that multiple-producers correctly drive the state of their shared output """ - class App(BarrierAppDROP): pass - a,b,c,d,e = [App(chr(ord('A') + i), chr(ord('A') + i)) for i in range(5)] + class App(BarrierAppDROP): + pass + + a, b, c, d, e = [App(chr(ord('A') + i), chr(ord('A') + i)) for i in range(5)] f = InMemoryDROP('F', 'F') - for drop in a,b,c,d,e: + for drop in a, b, c, d, e: drop.addOutput(f) self.assertEqual(DROPStates.INITIALIZED, f.status) - for drop in a,b,c,d,e: + for drop in a, b, c, d, e: self.assertEqual(AppDROPStates.NOT_RUN, drop.execStatus) # Run the first 4 ones, F should still be in INITIALIZED - for drop in a,b,c,d: + for drop in a, b, c, d: drop.execute() self.assertEqual(DROPStates.INITIALIZED, f.status) self.assertEqual(AppDROPStates.NOT_RUN, e.execStatus) - for drop in a,b,c,d: + for drop in a, b, c, d: self.assertEqual(AppDROPStates.FINISHED, drop.execStatus) # Run the final one, now F should be COMPLETED e.execute() self.assertEqual(DROPStates.COMPLETED, f.status) - for drop in a,b,c,d,e: + for drop in a, b, c, d, e: self.assertEqual(AppDROPStates.FINISHED, drop.execStatus) def test_eager_inputFired_app(self): @@ -721,9 +730,9 @@ def test_eager_inputFired_app(self): # 2 effective inputs, 4 outputs. Trigger 2 inputs and make sure the # app has run - a,b,c,d = [InMemoryDROP(str(i), str(i)) for i in range(4)] + a, b, c, d = [InMemoryDROP(str(i), str(i)) for i in range(4)] e = InputFiredAppDROP('e', 'e', n_effective_inputs=2) - for x in a,b,c,d: + for x in a, b, c, d: e.addInput(x) with DROPWaiterCtx(self, e, 5): @@ -742,6 +751,7 @@ class FailOnlyTheFirstTimeApp(BarrierAppDROP): def initialize(self, **kwargs): BarrierAppDROP.initialize(self, **kwargs) self.i = 0 + def run(self): if self.i == 0: self.i = 1 @@ -783,5 +793,6 @@ def test_rdbms_drop(self): finally: os.unlink(dbfile) + if __name__ == '__main__': unittest.main() diff --git a/daliuge-runtime/test/test_droputils.py b/daliuge-runtime/test/test_droputils.py index 9cbde346a..9dfc0ea7f 100644 --- a/daliuge-runtime/test/test_droputils.py +++ b/daliuge-runtime/test/test_droputils.py @@ -27,8 +27,6 @@ import unittest -import six - from dlg import droputils from dlg.common import dropdict from dlg.drop import InMemoryDROP, FileDROP, BarrierAppDROP @@ -48,16 +46,16 @@ def _createGraph(self): B, C, G and H are AppDOs. The names have been given in breadth-first order (although H has a dependency on I) """ - a = InMemoryDROP('a', 'a') - b = BarrierAppDROP('b', 'b') - c = BarrierAppDROP('c', 'c') - d = InMemoryDROP('d', 'd') - e = InMemoryDROP('e', 'e') - f = InMemoryDROP('f', 'f') - g = BarrierAppDROP('g', 'g') - h = BarrierAppDROP('h', 'h') - i = InMemoryDROP('i', 'i') - j = InMemoryDROP('j', 'j') + a = InMemoryDROP('a', 'a') + b = BarrierAppDROP('b', 'b') + c = BarrierAppDROP('c', 'c') + d = InMemoryDROP('d', 'd') + e = InMemoryDROP('e', 'e') + f = InMemoryDROP('f', 'f') + g = BarrierAppDROP('g', 'g') + h = BarrierAppDROP('h', 'h') + i = InMemoryDROP('i', 'i') + j = InMemoryDROP('j', 'j') a.addConsumer(b) a.addConsumer(c) @@ -123,7 +121,7 @@ def testDepthFirstSearch(self): Checks that our DFS method is correct """ a, b, c, d, e, f, g, h, i, j = self._createGraph() - nodesList = [drop for drop,_ in droputils.depthFirstTraverse(a)] + nodesList = [drop for drop, _ in droputils.depthFirstTraverse(a)] self.assertListEqual([a, b, d, g, i, h, j, c, e, f], nodesList) def testBreadthFirstSearch(self): @@ -131,7 +129,7 @@ def testBreadthFirstSearch(self): Checks that our BFS method is correct """ a, b, c, d, e, f, g, h, i, j = self._createGraph() - nodesList = [drop for drop,_ in droputils.breadFirstTraverse(a)] + nodesList = [drop for drop, _ in droputils.breadFirstTraverse(a)] self.assertListEqual([a, b, c, d, e, f, g, h, i, j], nodesList) def testGetEndNodes(self): @@ -165,11 +163,11 @@ def test_BFSWithFiltering(self): visitedNodes = [] for drop, downStreamDrops in droputils.breadFirstTraverse(a): - downStreamDrops[:] = [x for x in downStreamDrops if x.uid not in ('b','f')] + downStreamDrops[:] = [x for x in downStreamDrops if x.uid not in ('b', 'f')] visitedNodes.append(drop) self.assertEqual(5, len(visitedNodes)) - self.assertListEqual(visitedNodes, [a,c,e,h,j]) + self.assertListEqual(visitedNodes, [a, c, e, h, j]) def test_get_roots(self): """ @@ -179,8 +177,8 @@ def test_get_roots(self): """ A --> B """ - pg_spec = [{"oid":"A", "type":"plain", "storage":"memory", "consumers":["B"]}, - {"oid":"B", "type":"app", "app":"test.test_graph_loader.DummyApp"}] + pg_spec = [{"oid": "A", "type": "plain", "storage": "memory", "consumers": ["B"]}, + {"oid": "B", "type": "app", "app": "test.test_graph_loader.DummyApp"}] roots = droputils.get_roots(pg_spec) self.assertEqual(1, len(roots)) self.assertEqual('A', next(iter(roots))) @@ -189,8 +187,8 @@ def test_get_roots(self): A --> B The same, but now B references A """ - pg_spec = [{"oid":"A", "type":"plain", "storage":"memory"}, - {"oid":"B", "type":"app", "app":"test.test_graph_loader.DummyApp", "inputs": ["A"]}] + pg_spec = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "app", "app": "test.test_graph_loader.DummyApp", "inputs": ["A"]}] roots = droputils.get_roots(pg_spec) self.assertEqual(1, len(roots)) self.assertEqual('A', next(iter(roots))) @@ -200,12 +198,12 @@ def test_get_roots(self): |--> E --> F B --------------| """ - pg_spec = [{"oid":"A", "type":"plain", "storage": "memory"}, - {"oid":"B", "type":"plain", "storage": "memory"}, - {"oid":"C", "type":"app", "app":"dlg.apps.crc.CRCApp", "inputs": ['A']}, - {"oid":"D", "type":"plain", "storage": "memory", "producers": ["C"]}, - {"oid":"E", "type":"app", "app":"test.test_drop.SumupContainerChecksum", "inputs": ["D"]}, - {"oid":"F", "type":"plain", "storage": "memory", "producers":["E"]}] + pg_spec = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "plain", "storage": "memory"}, + {"oid": "C", "type": "app", "app": "dlg.apps.crc.CRCApp", "inputs": ['A']}, + {"oid": "D", "type": "plain", "storage": "memory", "producers": ["C"]}, + {"oid": "E", "type": "app", "app": "test.test_drop.SumupContainerChecksum", "inputs": ["D"]}, + {"oid": "F", "type": "plain", "storage": "memory", "producers": ["E"]}] roots = droputils.get_roots(pg_spec) self.assertEqual(2, len(roots)) self.assertListEqual(['A', 'B'], sorted(roots)) @@ -214,4 +212,4 @@ def test_get_roots(self): pg_spec_dropdicts = [dropdict(dropspec) for dropspec in pg_spec] roots = droputils.get_roots(pg_spec_dropdicts) self.assertEqual(2, len(roots)) - self.assertListEqual(['A', 'B'], sorted(roots)) \ No newline at end of file + self.assertListEqual(['A', 'B'], sorted(roots)) diff --git a/daliuge-runtime/test/test_graph_loader.py b/daliuge-runtime/test/test_graph_loader.py index 290ce4feb..4a1715446 100644 --- a/daliuge-runtime/test/test_graph_loader.py +++ b/daliuge-runtime/test/test_graph_loader.py @@ -30,18 +30,19 @@ # Used in the textual representation of the graphs in these tests class DummyApp(AppDROP): pass + class TestGraphLoader(unittest.TestCase): def test_singleMemoryDrop(self): - dropSpecList = [{"oid":"A", "type":"plain", "storage":"memory"}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "memory"}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] self.assertIsInstance(a, InMemoryDROP) self.assertEqual("A", a.oid) self.assertEqual("A", a.uid) def test_containerDrop(self): - dropSpecList = [{"oid":"A", "type":"plain", "storage":"memory"}, - {"oid":"B", "type":"container", "children":["A"]}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "container", "children": ["A"]}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] self.assertIsInstance(a, InMemoryDROP) self.assertEqual("A", a.oid) @@ -53,15 +54,16 @@ def test_containerDrop(self): self.assertEqual("B", b.uid) # A directory container - dropSpecList = [{"oid":"A", "type":"plain", "storage":"file", "dirname":"."}, - {"oid":"B", "type":"container", "container":"dlg.drop.DirectoryContainer", "children":["A"], "dirname":"."}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "file", "dirname": "."}, + {"oid": "B", "type": "container", "container": "dlg.drop.DirectoryContainer", "children": ["A"], + "dirname": "."}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] b = a.parent self.assertIsInstance(b, DirectoryContainer) def test_consumer(self): - dropSpecList = [{"oid":"A", "type":"plain", "storage":"memory", "consumers":["B"]}, - {"oid":"B", "type":"app", "app":"test.test_graph_loader.DummyApp"}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "memory", "consumers": ["B"]}, + {"oid": "B", "type": "app", "app": "test.test_graph_loader.DummyApp"}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] self.assertIsInstance(a, InMemoryDROP) self.assertEqual("A", a.oid) @@ -74,15 +76,14 @@ def test_consumer(self): self.assertEqual(a, b.inputs[0]) def test_removeUnmetRelationships(self): - # Unmet relationsips are # DROPRel(D, CONSUMER, A) # DROPRel(D, STREAMING_CONSUMER, C) # DROPRel(Z, PRODUCER, A) # DROPRel(X, PRODUCER, A) - graphDesc = [{'oid':'A', 'consumers':['B', 'D'], 'producers':['Z','X']}, - {'oid':'B', 'outputs':['C']}, - {'oid':'C', 'streamingConsumers':['D']}] + graphDesc = [{'oid': 'A', 'consumers': ['B', 'D'], 'producers': ['Z', 'X']}, + {'oid': 'B', 'outputs': ['C']}, + {'oid': 'C', 'streamingConsumers': ['D']}] unmetRelationships = graph_loader.removeUnmetRelationships(graphDesc) self.assertEqual(4, len(unmetRelationships)) @@ -98,4 +99,4 @@ def test_removeUnmetRelationships(self): self.assertEqual(1, len(a['consumers'])) self.assertEqual('B', a['consumers'][0]) self.assertFalse('producers' in a) - self.assertFalse('streamingConsumers' in c) \ No newline at end of file + self.assertFalse('streamingConsumers' in c) diff --git a/daliuge-runtime/test/test_io.py b/daliuge-runtime/test/test_io.py index 36dd35cb5..a42db9c97 100644 --- a/daliuge-runtime/test/test_io.py +++ b/daliuge-runtime/test/test_io.py @@ -20,8 +20,10 @@ # MA 02111-1307 USA # import unittest + from dlg.io import NullIO, OpenMode + class TestIO(unittest.TestCase): def test_invalidUseCases(self): @@ -42,4 +44,4 @@ def test_invalidUseCases(self): io.close() # It's OK to close it again - io.close() \ No newline at end of file + io.close() diff --git a/daliuge-runtime/test/test_session.py b/daliuge-runtime/test/test_session.py index 40435162e..88a88a624 100644 --- a/daliuge-runtime/test/test_session.py +++ b/daliuge-runtime/test/test_session.py @@ -22,9 +22,9 @@ import unittest from dlg.ddap_protocol import DROPLinkType, DROPStates, AppDROPStates -from dlg.manager.session import Session, SessionStates -from dlg.exceptions import InvalidGraphException from dlg.droputils import DROPWaiterCtx +from dlg.exceptions import InvalidGraphException +from dlg.manager.session import Session, SessionStates class TestSession(unittest.TestCase): @@ -34,7 +34,7 @@ def test_sessionStates(self): self.assertEqual(SessionStates.PRISTINE, s.status) self.assertRaises(Exception, s.linkGraphParts, '', '', 0) - s.addGraphSpec([{"oid":"A", "type":"container"}]) + s.addGraphSpec([{"oid": "A", "type": "container"}]) self.assertEqual(SessionStates.BUILDING, s.status) s.deploy() @@ -57,24 +57,26 @@ def test_sessionStates_noDrops(self): def test_addGraphSpec(self): with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"container"}]) - s.addGraphSpec([{"oid":"B", "type":"container"}]) - s.addGraphSpec([{"oid":"C", "type":"container"}]) + s.addGraphSpec([{"oid": "A", "type": "container"}]) + s.addGraphSpec([{"oid": "B", "type": "container"}]) + s.addGraphSpec([{"oid": "C", "type": "container"}]) # Adding an existing DROP - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"A", "type":"container"}]) + self.assertRaises(Exception, s.addGraphSpec, [{"oid": "A", "type": "container"}]) # Adding invalid specs - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"app"}]) # missing "storage" - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"plain", "storage":"invalid"}]) # invalid "storage" - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"invalid"}]) # invalid "type" - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"app", "storage":"null", "outputs":["X"]}]) # missing X DROP + self.assertRaises(Exception, s.addGraphSpec, [{"oid": "D", "type": "app"}]) # missing "storage" + self.assertRaises(Exception, s.addGraphSpec, + [{"oid": "D", "type": "plain", "storage": "invalid"}]) # invalid "storage" + self.assertRaises(Exception, s.addGraphSpec, [{"oid": "D", "type": "invalid"}]) # invalid "type" + self.assertRaises(Exception, s.addGraphSpec, + [{"oid": "D", "type": "app", "storage": "null", "outputs": ["X"]}]) # missing X DROP def test_linking(self): with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"container"}]) - s.addGraphSpec([{"oid":"B", "type":"app", "storage":"null", "app":"dlg.apps.crc.CRCApp"}]) - s.addGraphSpec([{"oid":"C", "type":"container"}]) + s.addGraphSpec([{"oid": "A", "type": "container"}]) + s.addGraphSpec([{"oid": "B", "type": "app", "storage": "null", "app": "dlg.apps.crc.CRCApp"}]) + s.addGraphSpec([{"oid": "C", "type": "container"}]) # Link them now s.linkGraphParts('A', 'B', DROPLinkType.CONSUMER) @@ -96,9 +98,9 @@ def test_linking(self): def test_cancel(self): '''Cancels a whole graph execution''' with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"plain", "storage":"memory", 'consumers': ['B']}, - {"oid":"B", "type":"app", "app":"dlg.apps.simple.SleepApp", "sleepTime": 2}, - {"oid":"C", "type":"plain", "storage":"memory", 'producers': ['B']}]) + s.addGraphSpec([{"oid": "A", "type": "plain", "storage": "memory", 'consumers': ['B']}, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 2}, + {"oid": "C", "type": "plain", "storage": "memory", 'producers': ['B']}]) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) s.cancel() @@ -110,11 +112,11 @@ def test_cancel(self): def test_partial_cancel(self): '''Like test_cancel, but only part of the graph should be cancelled''' with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"plain", "storage":"memory", 'consumers': ['B']}, - {"oid":"B", "type":"app", "app":"dlg.apps.simple.SleepApp", "sleepTime": 0}, - {"oid":"C", "type":"plain", "storage":"memory", 'producers': ['B'], 'consumers': ['D']}, - {"oid":"D", "type":"app", "app":"dlg.apps.simple.SleepApp", "sleepTime": 10}, - {"oid":"E", "type":"plain", "storage":"memory", 'producers': ['D']}]) + s.addGraphSpec([{"oid": "A", "type": "plain", "storage": "memory", 'consumers': ['B']}, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 0}, + {"oid": "C", "type": "plain", "storage": "memory", 'producers': ['B'], 'consumers': ['D']}, + {"oid": "D", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 10}, + {"oid": "E", "type": "plain", "storage": "memory", 'producers': ['D']}]) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) @@ -128,4 +130,4 @@ def test_partial_cancel(self): for uid in 'ABC': self.assertEqual(DROPStates.COMPLETED, s.drops[uid].status) for uid in 'DE': - self.assertEqual(DROPStates.CANCELLED, s.drops[uid].status) \ No newline at end of file + self.assertEqual(DROPStates.CANCELLED, s.drops[uid].status) diff --git a/daliuge-runtime/test/test_tool.py b/daliuge-runtime/test/test_tool.py index c61f41068..9eb2d1de2 100644 --- a/daliuge-runtime/test/test_tool.py +++ b/daliuge-runtime/test/test_tool.py @@ -33,7 +33,7 @@ def test_cmdhelp(self): """Checks that all dlg commands have a help""" for cmd in tool.commands: p = tool.start_process(cmd, ['-h'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() common.wait_or_kill(p, timeout=10) self.assertEqual(0, p.returncode, 'cmd: %s, out: %s' % ( diff --git a/daliuge-runtime/test/test_utils.py b/daliuge-runtime/test/test_utils.py index 397ffdd7f..10e862931 100644 --- a/daliuge-runtime/test/test_utils.py +++ b/daliuge-runtime/test/test_utils.py @@ -27,7 +27,6 @@ import zlib import six - from dlg import utils @@ -40,7 +39,7 @@ def test_zlib_uncompressed_stream(self): f.write(zlib.compress(b'abc')) # Read parts from the beginning - for b,n in ((b'abc', 3), (b'ab', 2), (b'a', 1)): + for b, n in ((b'abc', 3), (b'ab', 2), (b'a', 1)): with open(fname, 'rb') as f: s = utils.ZlibUncompressedStream(f) self.assertEqual(b, s.read(n)) @@ -56,7 +55,7 @@ def test_zlib_uncompressed_stream(self): os.remove(fname) # Try now with bigger data sizes - for size in [2**x+y for x in range(3,18) for y in (-1,0,1)]: + for size in [2 ** x + y for x in range(3, 18) for y in (-1, 0, 1)]: original_bytes = os.urandom(size) compressed_bytes = zlib.compress(original_bytes) @@ -69,7 +68,7 @@ def test_zlib_uncompressed_stream(self): self.assertEqual(original_bytes, b) # Now read little by little - read_size = min(size//4, 1024); + read_size = min(size // 4, 1024); b = b'' compressed_stream = six.BytesIO(compressed_bytes) uncompressed_stream = utils.ZlibUncompressedStream(compressed_stream) @@ -78,7 +77,6 @@ def test_zlib_uncompressed_stream(self): self.assertEqual(size, len(b)) self.assertEqual(original_bytes, b) - def test_zlib_compressed_stream_writer(self): compressed_ref = zlib.compress(b'abcd') @@ -92,7 +90,7 @@ def test_zlib_compressed_stream_writer(self): self.assertEqual(compressed_ref[0:x], compressed[0:x]) # Try now with bigger data sizes - for size in [2**x+y for x in range(3,18) for y in (-1,0,1)]: + for size in [2 ** x + y for x in range(3, 18) for y in (-1, 0, 1)]: original_bytes = os.urandom(size) compressed_bytes = zlib.compress(original_bytes) @@ -105,7 +103,7 @@ def test_zlib_compressed_stream_writer(self): self.assertEqual(compressed_bytes, b) # Now read little by little - read_size = min(size//4, 1024) + read_size = min(size // 4, 1024) uncompressed_stream = six.BytesIO(original_bytes) compressed_stream = utils.ZlibCompressedStream(uncompressed_stream) b = b'' @@ -122,7 +120,7 @@ def test_zlib_streams_combined_zerobytes(self): def _test_zlib_streams_combined(self, gen_bytes): - sizes = [2**x+y for x in range(1,18) for y in (-1,0,1)] + sizes = [2 ** x + y for x in range(1, 18) for y in (-1, 0, 1)] for size in sizes: original_bytes = gen_bytes(size) @@ -140,7 +138,7 @@ def _test_zlib_streams_combined(self, gen_bytes): self.assertEqual(0, len(uncompressed_stream.read(100))) # Read with given number of bytes - for n in (1, len(original_bytes)//2, len(original_bytes)): + for n in (1, len(original_bytes) // 2, len(original_bytes)): these_bytes = original_bytes[0:n] @@ -157,17 +155,20 @@ def _test_zlib_streams_combined(self, gen_bytes): self.assertEqual(0, len(uncompressed_stream.read(100))) def test_json_stream_simple_sequence(self): - for s in ([0], [{}], ['a'], [{'oid':'A', 'type': 'plain'}]): + for s in ([0], [{}], ['a'], [{'oid': 'A', 'type': 'plain'}]): stream = utils.JSONStream(s) self.assertEqual(s, json.loads(stream.read(100).decode('utf8'))); def test_json_stream_sequences(self): - ref = [1,2,3] - objects_list = [1,2,3] - objects_tuple = (1,2,3) + ref = [1, 2, 3] + objects_list = [1, 2, 3] + objects_tuple = (1, 2, 3) + def objects_gen(): - yield 1; yield 2; yield 3 + yield 1; + yield 2; + yield 3 for objects in (objects_list, objects_tuple, objects_gen()): stream = utils.JSONStream(objects) @@ -192,4 +193,4 @@ def test_get_dlg_root(self): if old: os.environ['DLG_ROOT'] = old else: - del os.environ['DLG_ROOT'] \ No newline at end of file + del os.environ['DLG_ROOT'] diff --git a/daliuge-translator/dlg/__init__.py b/daliuge-translator/dlg/__init__.py index cfb3574be..74d07706f 100644 --- a/daliuge-translator/dlg/__init__.py +++ b/daliuge-translator/dlg/__init__.py @@ -21,4 +21,4 @@ # # Declaring this as a namespace package -__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment \ No newline at end of file +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment diff --git a/daliuge-translator/dlg/dropmake/dm_utils.py b/daliuge-translator/dlg/dropmake/dm_utils.py index 8b9b2ce52..936385caa 100644 --- a/daliuge-translator/dlg/dropmake/dm_utils.py +++ b/daliuge-translator/dlg/dropmake/dm_utils.py @@ -24,10 +24,10 @@ Dropmake utils """ +import copy import json import os import os.path as osp -import copy LG_VER_OLD = 1 LG_VER_EAGLE_CONVERTED = 2 @@ -502,9 +502,9 @@ def convert_construct(lgo): if "group" not in to_node and "group" not in gather_construct: cond1 = True elif ( - "group" in to_node - and "group" in gather_construct - and to_node["group"] == gather_construct["group"] + "group" in to_node + and "group" in gather_construct + and to_node["group"] == gather_construct["group"] ): cond1 = True else: diff --git a/daliuge-translator/dlg/dropmake/dropmake_api.py b/daliuge-translator/dlg/dropmake/dropmake_api.py index 99e2e004c..f5998d853 100644 --- a/daliuge-translator/dlg/dropmake/dropmake_api.py +++ b/daliuge-translator/dlg/dropmake/dropmake_api.py @@ -28,7 +28,6 @@ import os import sys import time - from optparse import OptionParser from .pg_generator import LG, MySarkarPGTP @@ -56,7 +55,7 @@ def gen_mysarkar_pgtp(lgfname, pgt_dir, num_islands=2, if (mpp): pgt.to_gojs_json(string_rep=False, visual=False) pgt.merge_partitions(num_islands, form_island=True, - island_type=1, visual=False) + island_type=1, visual=False) schedule_ett = time.time() re_dict = pgt.result() re_dict['unroll_time'] = '%.3f' % (unroll_ett - stt) @@ -67,6 +66,7 @@ def gen_mysarkar_pgtp(lgfname, pgt_dir, num_islands=2, print(part_info) return re_dict + if __name__ == '__main__': """ example usage: @@ -79,19 +79,19 @@ def gen_mysarkar_pgtp(lgfname, pgt_dir, num_islands=2, """ parser = OptionParser() parser.add_option("-l", "--lgfname", action="store", type="string", - dest="lgfname", help="logical graph full name") + dest="lgfname", help="logical graph full name") parser.add_option("-p", "--pgtdir", action="store", type="string", - dest="pgt_dir", help="Directory to dump pgt") + dest="pgt_dir", help="Directory to dump pgt") parser.add_option("-i", "--islands", action="store", type="int", - dest="num_islands", help="number of compute islands", - default=2) + dest="num_islands", help="number of compute islands", + default=2) parser.add_option("-c", "--cores", action="store", type="int", - dest="cores_per_node", default=2, - help="number of cores per compute node") + dest="cores_per_node", default=2, + help="number of cores per compute node") parser.add_option("-r", "--print", action="store_true", dest="print_result", - default=False, help="Print result on screen") + default=False, help="Print result on screen") parser.add_option("-d", "--dump_progress", action="store_true", dest="dump_progress", - default=False, help="Dump progress during scheduling") + default=False, help="Dump progress during scheduling") (options, args) = parser.parse_args() if (None == options.lgfname or None == options.pgt_dir): diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 03a24191e..e42a334ca 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -48,7 +48,6 @@ """ -from collections import defaultdict import collections import datetime import json @@ -58,25 +57,25 @@ import random import string import time +from collections import defaultdict from itertools import product import networkx as nx import numpy as np import six -from .scheduler import MySarkarScheduler, DAGUtil, MinNumPartsScheduler, PSOScheduler -from .utils.bash_parameter import BashCommand -from ..common import dropdict -from ..common import STORAGE_TYPES from .dm_utils import ( get_lg_ver_type, convert_construct, convert_fields, convert_mkn, LG_VER_EAGLE, - LG_VER_OLD, LG_VER_EAGLE_CONVERTED, ) +from .scheduler import MySarkarScheduler, DAGUtil, MinNumPartsScheduler, PSOScheduler +from .utils.bash_parameter import BashCommand +from ..common import STORAGE_TYPES +from ..common import dropdict logger = logging.getLogger(__name__) @@ -197,10 +196,10 @@ def add_child(self, lg_node): Add a group member """ if ( - lg_node.is_group() - and not (lg_node.is_scatter()) - and not (lg_node.is_loop()) - and not (lg_node.is_groupby()) + lg_node.is_group() + and not (lg_node.is_scatter()) + and not (lg_node.is_loop()) + and not (lg_node.is_groupby()) ): raise GInvalidNode( "Only Scatters or Loops can be nested, but {0} is neither".format( @@ -323,23 +322,23 @@ def is_dag_root(self): def is_start_listener(self): return ( - len(self.inputs) == 1 - and self.inputs[0].jd["category"] == "Start" - and self.jd["category"] in STORAGE_TYPES + len(self.inputs) == 1 + and self.inputs[0].jd["category"] == "Start" + and self.jd["category"] in STORAGE_TYPES ) def is_group_start(self): return ( - self.has_group() - and "group_start" in self.jd - and 1 == int(self.jd["group_start"]) + self.has_group() + and "group_start" in self.jd + and 1 == int(self.jd["group_start"]) ) def is_group_end(self): return ( - self.has_group() - and "group_end" in self.jd - and 1 == int(self.jd["group_end"]) + self.has_group() + and "group_end" in self.jd + and 1 == int(self.jd["group_end"]) ) def is_group(self): @@ -611,7 +610,7 @@ def _create_test_drop_spec(self, oid, rank, kwargs): if fp: kwargs["filepath"] = fp elif ( - drop_type == "Component" + drop_type == "Component" ): # default generic component becomes "sleep and copy" if "appclass" not in self.jd or len(self.jd["appclass"]) == 0: app_class = "dlg.apps.simple.SleepApp" @@ -989,7 +988,7 @@ def json(self): # return self.to_gojs_json() def merge_partitions( - self, new_num_parts, form_island=False, island_type=0, visual=False + self, new_num_parts, form_island=False, island_type=0, visual=False ): raise Exception("Not implemented. Call sub-class") @@ -1220,14 +1219,14 @@ class MetisPGTP(PGT): """ def __init__( - self, - drop_list, - num_partitions=1, - min_goal=0, - par_label="Partition", - ptype=0, - ufactor=10, - merge_parts=False, + self, + drop_list, + num_partitions=1, + min_goal=0, + par_label="Partition", + ptype=0, + ufactor=10, + merge_parts=False, ): """ num_partitions: number of partitions supplied by users (int) @@ -1455,7 +1454,7 @@ def to_gojs_json(self, string_rep=True, outdict=None, visual=False): return jsobj def merge_partitions( - self, new_num_parts, form_island=False, island_type=0, visual=False + self, new_num_parts, form_island=False, island_type=0, visual=False ): """ This is called during resource mapping - deploying partitioned PGT to @@ -1523,9 +1522,9 @@ def merge_partitions( self._num_parts_done = new_num_parts else: if ( - island_type == 1 - and (self.dag is not None) - and (self._metis_out is not None) + island_type == 1 + and (self.dag is not None) + and (self._metis_out is not None) ): # update intra-comp_island edge weight given it has a different # bandwith compared to inter-comp_island @@ -1564,12 +1563,12 @@ class MySarkarPGTP(PGT): """ def __init__( - self, - drop_list, - num_partitions=0, - par_label="Partition", - max_dop=8, - merge_parts=False, + self, + drop_list, + num_partitions=0, + par_label="Partition", + max_dop=8, + merge_parts=False, ): """ num_partitions: 0 - only do the initial logical partition @@ -1611,7 +1610,7 @@ def _extra_result(self, ret): ret["num_parts"] = self._num_parts_done def merge_partitions( - self, new_num_parts, form_island=False, island_type=0, visual=False + self, new_num_parts, form_island=False, island_type=0, visual=False ): """ This is called during resource mapping - deploying partitioned PGT to @@ -1678,7 +1677,7 @@ def merge_partitions( for e in self.dag.edges(data=True): # update edege weights within the same compute island if in_out_part_map.get( - key_dict[e[0]] - start_k, -0.1 + key_dict[e[0]] - start_k, -0.1 ) == in_out_part_map.get(key_dict[e[1]] - start_k, -0.2): # print("e[2]['weight'] =", e[2]['weight']) e[2]["weight"] /= self._bw_ratio @@ -1786,14 +1785,14 @@ def to_gojs_json(self, string_rep=True, outdict=None, visual=False): class MinNumPartsPGTP(MySarkarPGTP): def __init__( - self, - drop_list, - deadline, - num_partitions=0, - par_label="Partition", - max_dop=8, - merge_parts=False, - optimistic_factor=0.5, + self, + drop_list, + deadline, + num_partitions=0, + par_label="Partition", + max_dop=8, + merge_parts=False, + optimistic_factor=0.5, ): """ num_partitions: 0 - only do the initial logical partition @@ -1824,14 +1823,14 @@ def init_scheduler(self): class PSOPGTP(MySarkarPGTP): def __init__( - self, - drop_list, - par_label="Partition", - max_dop=8, - deadline=None, - topk=30, - swarm_size=40, - merge_parts=False, + self, + drop_list, + par_label="Partition", + max_dop=8, + deadline=None, + topk=30, + swarm_size=40, + merge_parts=False, ): """ PSO-based PGTP @@ -1913,9 +1912,9 @@ def __init__(self, f, ssid=None): for lgn in all_list: if ( - lgn.is_start() - and lgn.jd["category"] != "Comment" - and lgn.jd["category"] != "Description" + lgn.is_start() + and lgn.jd["category"] != "Comment" + and lgn.jd["category"] != "Description" ): if lgn.jd["category"] == "Variables": self._g_var.append(lgn) @@ -1960,9 +1959,9 @@ def validate_link(self, src, tgt): if src.is_gather(): if not ( - tgt.jd["category"] in APP_DROP_TYPES - and tgt.is_group_start() - and src.inputs[0].h_level == tgt.h_level + tgt.jd["category"] in APP_DROP_TYPES + and tgt.is_group_start() + and src.inputs[0].h_level == tgt.h_level ): raise GInvalidLink( "Gather {0}'s output {1} must be a Group-Start Component inside a Group with the same H level as Gather's input".format( @@ -2101,9 +2100,9 @@ def lgn_to_pgn(self, lgn, iid="0", lpcxt=None): self._lg_links.append(lk) else: for ( - gs + gs ) in ( - gs_list + gs_list ): # add artificial logical links to the "first" children lgn.add_input(gs) gs.add_output(lgn) @@ -2144,7 +2143,7 @@ def get_child_lp_ctx(idx): miid += "${0}".format("-".join(grp_h)) if ( - extra_links_drops and not lgn.is_loop() + extra_links_drops and not lgn.is_loop() ): # make GroupBy and Gather drops src_gdrop = lgn.make_single_drop(miid) self._drop_dict[lgn.id].append(src_gdrop) @@ -2175,7 +2174,7 @@ def _split_list(l, n): Yield successive n-sized chunks from l. """ for i in range(0, len(l), n): - yield l[i : i + n] + yield l[i: i + n] def _unroll_gather_as_output(self, slgn, tlgn, sdrops, tdrops, chunk_size, llink): if slgn.h_level < tlgn.h_level: @@ -2322,7 +2321,7 @@ def unroll_to_tpl(self): # 1. GroupBy's "natual" output must be a Scatter (i.e. group) # 2. Scatter "naturally" does not have output if ( - slgn.is_gather() and tlgn.gid != sid + slgn.is_gather() and tlgn.gid != sid ): # not the artifical link between gather and its own start child # gather iteration case, tgt must be a Group-Start Component # this is a way to manually sequentialise a Scatter that has a high DoP @@ -2337,7 +2336,7 @@ def unroll_to_tpl(self): if j >= tlgn.group.dop and j % tlgn.group.dop == 0: continue while j < (i + 2) * slgn.gather_width and j < tlgn.group.dop * ( - i + 1 + i + 1 ): gather_input_list = self._gather_cache[ga_drop["oid"]][1] # TODO merge this code into the function @@ -2369,11 +2368,11 @@ def unroll_to_tpl(self): if slgn.is_start_node() or tlgn.is_end_node(): continue elif ( - (slgn.group is not None) - and slgn.group.is_loop() - and slgn.gid == tlgn.gid - and slgn.is_group_end() - and tlgn.is_group_start() + (slgn.group is not None) + and slgn.group.is_loop() + and slgn.gid == tlgn.gid + and slgn.is_group_end() + and tlgn.is_group_start() ): # Re-link to the next iteration's start lsd = len(sdrops) @@ -2389,7 +2388,7 @@ def unroll_to_tpl(self): # pass loop_chunk_size = slgn.group.dop for i, chunk in enumerate( - self._split_list(sdrops, loop_chunk_size) + self._split_list(sdrops, loop_chunk_size) ): # logger.debug("{0} ** {1}".format(i, loop_chunk_size)) for j, sdrop in enumerate(chunk): @@ -2408,11 +2407,11 @@ def unroll_to_tpl(self): # if (i < lsd - 1): # self._link_drops(slgn, tlgn, sdrop, tdrops[i + 1]) elif ( - slgn.group is not None - and slgn.group.is_loop() - and tlgn.group is not None - and tlgn.group.is_loop() - and (not slgn.h_related(tlgn)) + slgn.group is not None + and slgn.group.is_loop() + and tlgn.group is not None + and tlgn.group.is_loop() + and (not slgn.h_related(tlgn)) ): # stepwise locking for links between two Loops for sdrop, tdrop in product(sdrops, tdrops): @@ -2421,10 +2420,10 @@ def unroll_to_tpl(self): else: lpaw = ("%s-%s" % (sid, tid)) in self_loop_aware_set if ( - slgn.group is not None - and slgn.group.is_loop() - and lpaw - and slgn.h_level > tlgn.h_level + slgn.group is not None + and slgn.group.is_loop() + and lpaw + and slgn.h_level > tlgn.h_level ): loop_iter = slgn.group.dop for i, chunk in enumerate(self._split_list(sdrops, chunk_size)): @@ -2433,10 +2432,10 @@ def unroll_to_tpl(self): if j % loop_iter == loop_iter - 1: self._link_drops(slgn, tlgn, sdrop, tdrops[i], lk) elif ( - tlgn.group is not None - and tlgn.group.is_loop() - and lpaw - and slgn.h_level < tlgn.h_level + tlgn.group is not None + and tlgn.group.is_loop() + and lpaw + and slgn.h_level < tlgn.h_level ): loop_iter = tlgn.group.dop for i, chunk in enumerate(self._split_list(tdrops, chunk_size)): @@ -2465,7 +2464,7 @@ def unroll_to_tpl(self): # the last bit of iid (current h id) is the local GrougBy key, i.e. inner most loop context id gby = src_ctx[-1] if ( - slgn.h_level - 2 == tlgn.h_level and tlgn.h_level > 0 + slgn.h_level - 2 == tlgn.h_level and tlgn.h_level > 0 ): # groupby itself is nested inside a scatter # group key consists of group context id + inner most loop context id gctx = "/".join(src_ctx[0:-2]) @@ -2656,13 +2655,13 @@ def known_algorithms(): def partition( - pgt, - algo, - num_partitions=1, - num_islands=1, - partition_label="partition", - show_gojs=False, - **algo_params + pgt, + algo, + num_partitions=1, + num_islands=1, + partition_label="partition", + show_gojs=False, + **algo_params ): """Partitions a Physical Graph Template""" diff --git a/daliuge-translator/dlg/dropmake/pg_manager.py b/daliuge-translator/dlg/dropmake/pg_manager.py index 96c226cbc..6dadea129 100644 --- a/daliuge-translator/dlg/dropmake/pg_manager.py +++ b/daliuge-translator/dlg/dropmake/pg_manager.py @@ -22,15 +22,15 @@ Refer to https://confluence.ska-sdp.org/display/PRODUCTTREE/C.1.2.4.4.4+DFM+Physical+Graph+Manager """ +import json import os -import threading, json +import threading import numpy as np from .pg_generator import GraphException from .scheduler import DAGUtil, SchedulerException - MAX_PGT_FN_CNT = 300 diff --git a/daliuge-translator/dlg/dropmake/pg_mapper.py b/daliuge-translator/dlg/dropmake/pg_mapper.py index 478b84d89..3158af4b3 100644 --- a/daliuge-translator/dlg/dropmake/pg_mapper.py +++ b/daliuge-translator/dlg/dropmake/pg_mapper.py @@ -61,23 +61,25 @@ """ from .pg_generator import GraphException + class ResourceCapability(object): """ Currently assume compute nodes are all homogeneous as defined in SDP Compute Island """ + def __init__(self, num_island, num_nodes_per_island, - num_cores_per_node, intra_inter_ratio): + num_cores_per_node, intra_inter_ratio): """ intra_inter_ratio: ratio between intra-island bandwith and inter-island bandwidth (integer and should be >= 1) """ if (intra_inter_ratio < 1): - raise GraphException('Invalid intra_inter_ratio {0}'\ - .format(intra_inter_ratio)) + raise GraphException('Invalid intra_inter_ratio {0}' \ + .format(intra_inter_ratio)) self._num_island = num_island self._num_nodes_pi = num_nodes_per_island - self._num_cores_pn = num_cores_per_node # per compute node + self._num_cores_pn = num_cores_per_node # per compute node self._island_ratio = float(intra_inter_ratio) self._ttnodes = num_island * num_nodes_per_island @@ -88,7 +90,7 @@ def bandwidth(self, nodeA, nodeB): if (nodeA >= self._ttnodes or nodeB >= self._ttnodes): raise GraphException('Invalid node id') gap = nodeA // self._num_nodes_pi - nodeB // self._num_nodes_pi - return self._island_ratio if gap == 0 else 1.0 + return self._island_ratio if gap == 0 else 1.0 def avg_comp_cost(self, drop, comp_node): """ @@ -106,5 +108,6 @@ def avg_comm_cost(self, drop_edge_weight): return (drop_edge_weight / 1.0 + drop_edge_weight / self._island_ratio) / 2 + class ResourceAvailability(ResourceCapability): pass diff --git a/daliuge-translator/dlg/dropmake/plot_lpl_parts.py b/daliuge-translator/dlg/dropmake/plot_lpl_parts.py index f05c7fe92..9fe16eb34 100644 --- a/daliuge-translator/dlg/dropmake/plot_lpl_parts.py +++ b/daliuge-translator/dlg/dropmake/plot_lpl_parts.py @@ -1,7 +1,11 @@ -import os, csv, itertools, sys -import pandas as pd -import numpy as np +import itertools +import os +import sys + import matplotlib.pyplot as plt +import numpy as np +import pandas as pd + def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): min_y = 1e6 @@ -12,7 +16,7 @@ def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): max_z = -1 fig = plt.figure() ax = fig.add_subplot(111) - #ax.set_title('Disk cache hits ratio as a function of disk capacity and replacement policy', fontsize=17) + # ax.set_title('Disk cache hits ratio as a function of disk capacity and replacement policy', fontsize=17) ax.set_xlabel('# of partitions', fontsize=16) ax.set_ylabel("PGT completion time (relative)", fontsize=16) ax.grid(True) @@ -34,17 +38,18 @@ def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): max_x = max(max_x, np.max(x)) min_z = min(min_z, np.min(z)) max_z = max(max_z, np.max(z)) - lbl = fn.split(prefix)[1].split(suffix)[0].replace('_', '')\ - .replace('img', '_img') + lbl = fn.split(prefix)[1].split(suffix)[0].replace('_', '') \ + .replace('img', '_img') print(lbl) lsn = linestyle.next() - lineobj = ax.plot(x, y, label=lbl, linestyle=lsn, linewidth=3)#, marker=marker.next(), markerfacecolor='white') + lineobj = ax.plot(x, y, label=lbl, linestyle=lsn, + linewidth=3) # , marker=marker.next(), markerfacecolor='white') ax2.plot(x, z, label='%s Median DoP' % (lbl), linestyle='', linewidth=3, - marker=marker.next(), markerfacecolor='None', markersize=7, - markeredgecolor=lineobj[0].get_color()) - #fig.gca().invert_xaxis() - legend = ax.legend(loc="upper left", shadow=False, prop={'size':15}) - legend = ax2.legend(loc="center left", shadow=False, prop={'size':15}) + marker=marker.next(), markerfacecolor='None', markersize=7, + markeredgecolor=lineobj[0].get_color()) + # fig.gca().invert_xaxis() + legend = ax.legend(loc="upper left", shadow=False, prop={'size': 15}) + legend = ax2.legend(loc="center left", shadow=False, prop={'size': 15}) ax.set_xlim([max_x + 10, min_x - 10]) ax.set_ylim([min_y - 10, max_y + 10]) ax2.set_ylim([min_z - 1, max_z + 1]) @@ -57,11 +62,12 @@ def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): plt.show() -if __name__=="__main__": + +if __name__ == "__main__": if (len(sys.argv) == 2): fd = sys.argv[1] else: - fd = '/Users/Chen/Documents/logical_physical_mapping/Daliuge_paper'\ - '/DropMake_Paper' + fd = '/Users/Chen/Documents/logical_physical_mapping/Daliuge_paper' \ + '/DropMake_Paper' print(fd) plot_lpl_parts(fd) diff --git a/daliuge-translator/dlg/dropmake/scheduler.py b/daliuge-translator/dlg/dropmake/scheduler.py index 23b62338b..90eea891e 100644 --- a/daliuge-translator/dlg/dropmake/scheduler.py +++ b/daliuge-translator/dlg/dropmake/scheduler.py @@ -1,4 +1,3 @@ - # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) @@ -20,37 +19,38 @@ # MA 02111-1307 USA # +import copy import logging import os import platform import random import time -import copy -import pkg_resources +from collections import defaultdict import networkx as nx import numpy as np +import pkg_resources from pyswarm import pso -from collections import defaultdict from .utils.anneal import Annealer -from .utils.mcts import DAGTree, MCTS from .utils.antichains import get_max_weighted_antichain - +from .utils.mcts import DAGTree, MCTS from ..common import dropdict, get_roots - logger = logging.getLogger(__name__) DEBUG = 0 + class SchedulerException(Exception): pass + class Schedule(object): """ The scheduling solution with schedule-related properties """ + def __init__(self, dag, max_dop): self._dag = dag self._max_dop = max_dop if type(max_dop) == int else max_dop.get('num_cpus', 1) @@ -62,7 +62,7 @@ def __init__(self, dag, max_dop): @property def makespan(self): return self._lpl[1] - + @property def longest_path(self): return self._lpl[0] @@ -85,9 +85,9 @@ def schedule_matrix(self): lpl_c += ww logger.debug("lpl: %s", " -> ".join(lpl_str)) logger.debug("lplt = %d", int(lpl_c)) - + M = self._max_dop - #print("N (makespan) is ", N, "M is ", M) + # print("N (makespan) is ", N, "M is ", M) ma = np.zeros((M, N), dtype=int) pr = np.zeros((M), dtype=int) last_pid = -1 @@ -112,16 +112,19 @@ def schedule_matrix(self): found = i break if (found is None): - raise SchedulerException("Cannot find a idle PID, max_dop provided: {0}, actual max_dop: {1}\n Graph: {2}".format(M, - 'DAGUtil.get_max_dop(G)', G.nodes(data=True))) - #DAGUtil.get_max_dop(G), G.nodes(data=True))) + raise SchedulerException( + "Cannot find a idle PID, max_dop provided: {0}, actual max_dop: {1}\n Graph: {2}".format(M, + 'DAGUtil.get_max_dop(G)', + G.nodes( + data=True))) + # DAGUtil.get_max_dop(G), G.nodes(data=True))) curr_pid = found ma[curr_pid, stt:edt] = n pr[curr_pid] = edt last_pid = curr_pid prev_n = n self._sma = ma - #print(ma) + # print(ma) return self._sma @property @@ -134,8 +137,8 @@ def workload(self): ma = self.schedule_matrix c = [] for i in range(ma.shape[1]): - c.append(np.count_nonzero(ma[:,i])) - self._wkl = int(np.mean(np.array(c))) # since METIS only accepts integer + c.append(np.count_nonzero(ma[:, i])) + self._wkl = int(np.mean(np.array(c))) # since METIS only accepts integer return self._wkl @property @@ -145,6 +148,7 @@ def efficiency(self): """ return int(float(self.workload) / self._max_dop * 100) + class Partition(object): """ Logical partition, multiple (1 ~ N) of these can be placed onto a single @@ -152,6 +156,7 @@ class Partition(object): Logical partition can be nested, and it somewhat resembles the `dlg.manager.drop_manager` """ + def __init__(self, gid, max_dop): """ gid: cluster/partition id (string) @@ -160,7 +165,7 @@ def __init__(self, gid, max_dop): self._gid = gid self._dag = nx.DiGraph() self._ask_max_dop = max_dop - self._max_antichains = None # a list of max (width) antichains + self._max_antichains = None # a list of max (width) antichains self._lpl = None self._schedule = None self._max_dop = None @@ -201,9 +206,9 @@ def can_merge(self, that): else: return False - #TODO re-implement this performance hog! - #self._tmp_merge_dag = nx.compose(self._dag, that._dag) - #return DAGUtil.get_max_dop(self._tmp_merge_dag) <= self._ask_max_dop + # TODO re-implement this performance hog! + # self._tmp_merge_dag = nx.compose(self._dag, that._dag) + # return DAGUtil.get_max_dop(self._tmp_merge_dag) <= self._ask_max_dop def merge(self, that): if (self._tmp_merge_dag is not None): @@ -212,11 +217,10 @@ def merge(self, that): else: self._dag = nx.compose(self._dag, that._dag) - #self._max_dop - - #TODO add this performance hog! - #self._max_antichains = None + # self._max_dop + # TODO add this performance hog! + # self._max_antichains = None def can_add(self, u, v, gu, gv): """ @@ -235,8 +239,9 @@ def can_add(self, u, v, gu, gv): if (DEBUG): slow_max = DAGUtil.get_max_antichains(self._dag) fast_max = self._max_antichains - info = "Before: {0} - slow max: {1}, fast max: {2}, u: {3}, v: {4}, unew:{5}, vnew:{6}".format(self._dag.edges(), - slow_max, fast_max, u, v, unew, vnew) + info = "Before: {0} - slow max: {1}, fast max: {2}, u: {3}, v: {4}, unew:{5}, vnew:{6}".format( + self._dag.edges(), + slow_max, fast_max, u, v, unew, vnew) logger.debug(info) if (len(slow_max) != len(fast_max)): raise SchedulerException("ERROR - {0}".format(info)) @@ -249,9 +254,9 @@ def can_add(self, u, v, gu, gv): mydop = DAGUtil.get_max_dop(self._dag) else: mydop = self.probe_max_dop(u, v, unew, vnew) - #TODO - put the following code in a unit test! + # TODO - put the following code in a unit test! if (DEBUG): - mydop_slow = DAGUtil.get_max_dop(self._dag)# + mydop_slow = DAGUtil.get_max_dop(self._dag) # if (mydop_slow != mydop): err_msg = "u = {0}, v = {1}, unew = {2}, vnew = {3}".format(u, v, unew, vnew) raise SchedulerException("{2}: mydop = {0}, mydop_slow = {1}".format(mydop, mydop_slow, err_msg)) @@ -277,7 +282,7 @@ def add(self, u, v, gu, gv, sequential=False, global_dag=None): self._dag.add_node(v, weight=vw, num_cpus=gv['num_cpus']) self._dag.add_edge(u, v) - if (unew and vnew): # we know this is fast + if (unew and vnew): # we know this is fast self._max_antichains = DAGUtil.get_max_antichains(self._dag) self._max_dop = 1 else: @@ -309,7 +314,7 @@ def add(self, u, v, gu, gv, sequential=False, global_dag=None): global_dag.remove_edge(udo, v) self._max_dop = self.probe_max_dop(u, v, unew, vnew, update=True) - #self._max_dop = DAGUtil.get_max_dop(self._dag)# this is too slow! + # self._max_dop = DAGUtil.get_max_dop(self._dag)# this is too slow! def remove(self, n): """ @@ -355,8 +360,8 @@ def probe_max_dop(self, u, v, unew, vnew, update=False): raise SchedulerException("u v are both new/old") new_ac = [] md = 1 - for ma in self._max_antichains: # missing elements in the current max_antichains! - #incremental updates + for ma in self._max_antichains: # missing elements in the current max_antichains! + # incremental updates found = False for n in ma: if (n in ups): @@ -370,7 +375,7 @@ def probe_max_dop(self, u, v, unew, vnew, update=False): md = len(mma) elif (len(ma) > md): md = len(ma) - new_ac.append(ma) # carry over, then prune it + new_ac.append(ma) # carry over, then prune it if (len(new_ac) > 0): self._tmp_new_ac = (new_ac, md) if (update): @@ -378,10 +383,12 @@ def probe_max_dop(self, u, v, unew, vnew, update=False): return md else: raise SchedulerException("No antichains") + @property def cardinality(self): return len(self._dag.nodes()) + class DilworthPartition(Partition): """ Use Dilworth theorem to determine DoP @@ -405,6 +412,7 @@ class DilworthPartition(Partition): from growing dag """ + def __init__(self, gid, max_dop): super(DilworthPartition, self).__init__(gid, max_dop) self._bpg = nx.Graph() @@ -509,6 +517,7 @@ def merge(self, that): # we could recalcuate it again, but we are lazy! raise SchedulerException("can_merge was not probed before add()") + class WeightedDilworthPartition(DilworthPartition): """ The extensions on DilworthPartition @@ -539,6 +548,7 @@ class WeightedDilworthPartition(DilworthPartition): in the case of the CHILES2 pipeline. Some techniques may be applicable e.g. http://www.sciencedirect.com/science/article/pii/S0196677483710175 """ + def __init__(self, gid, max_dop, global_dag=None): super(WeightedDilworthPartition, self).__init__(gid, max_dop) self._global_dag = global_dag @@ -570,40 +580,40 @@ def get_nb_cpus(node_id): tmp_added = [] for el, elnew, elcpu in [(u, unew, ucpus), (v, vnew, vcpus)]: if (elnew): - el_des = nx.descendants(dag, el) # already a set + el_des = nx.descendants(dag, el) # already a set el_pred = set(dag.predecessors(el)) if (self._check_global_dag): - part_node_set = set(dag.node) # node set + part_node_set = set(dag.node) # node set self_set = set([el]) rem = part_node_set - el_des - self_set for rel in rem: - #check path on the global dag + # check path on the global dag if (nx.has_path(global_dag, el, rel)): el_des.add(rel) - #print("caught missing global edge 0") + # print("caught missing global edge 0") rem = part_node_set - el_pred - self_set for rel in rem: - #check path on the global dag + # check path on the global dag if (nx.has_path(global_dag, rel, el)): el_pred.add(rel) - #print("caught missing global edge 1") + # print("caught missing global edge 1") for i in range(elcpu): child_r = '{0}{1}_r'.format(el, i) self_bpg.add_node(child_r, bipartite=1) tmp_added.append(child_r) for uup in el_pred: for j in range(get_nb_cpus(uup)): - self_bpg.add_edge('{0}{1}_l'.\ - format(uup, j), child_r) + self_bpg.add_edge('{0}{1}_l'. \ + format(uup, j), child_r) child_l = '{0}{1}_l'.format(el, i) self_bpg.add_node(child_l, bipartite=0) tmp_added.append(child_l) for udown in el_des: for k in range(get_nb_cpus(udown)): - self_bpg.add_edge(child_l, '{0}{1}_r'.\ - format(udown, k)) + self_bpg.add_edge(child_l, '{0}{1}_r'. \ + format(udown, k)) mat = nx.bipartite.hopcroft_karp_matching(self_bpg) mydop = len(self_bpg.node) / 2 - len(mat) / 2 @@ -639,7 +649,7 @@ def get_nb_cpus(mdag, node_id): that = set(that_dag.nodes()) this_dag = self._dag this = set(this_dag.nodes()) - part_node_set = set(this_dag.node) # node set + part_node_set = set(this_dag.node) # node set def cross_over(one, one_dag, two, two_dag): for el in one: @@ -648,17 +658,17 @@ def cross_over(one, one_dag, two, two_dag): if (self._check_global_dag): rem = part_node_set - el_des - self_set for rel in rem: - #check path on the global dag + # check path on the global dag if (nx.has_path(global_dag, el, rel)): el_des.add(rel) - #print("caught missing global edge 2") + # print("caught missing global edge 2") for udown in el_des: if udown in two: # M x N cartesian product for i in range(get_nb_cpus(one_dag, el)): for j in range(get_nb_cpus(two_dag, udown)): self_bpg_tmp.add_edge('{0}{1}_l'.format(el, i), - '{0}{1}_r'.format(udown, j)) + '{0}{1}_r'.format(udown, j)) # match this_left with that_right cross_over(this, this_dag, that, that_dag) @@ -677,9 +687,11 @@ def cross_over(one, one_dag, two, two_dag): self._tmp_max_dop = mydop return canmerge + class MultiWeightPartition(Partition): """ """ + def __init__(self, gid, max_dops, w_attrs=['num_cpus'], global_dag=None): if (type(max_dops) == int): @@ -691,7 +703,7 @@ def __init__(self, gid, max_dops, w_attrs=['num_cpus'], self._tmp_max_dops = None self._global_dag = global_dag self._check_global_dag = global_dag is not None - self._tc = defaultdict(set) #transitive closure + self._tc = defaultdict(set) # transitive closure self._w_attrs = w_attrs self._tc_time = 0.0 self._ac_sort_time = 0.0 @@ -706,17 +718,16 @@ def _add_to_tc(self, tc, el, dag, tmp_dag_list): the dag after the topological sort is done """ stt = time.time() - el_des = nx.descendants(dag, el) # already a set + el_des = nx.descendants(dag, el) # already a set el_pred = set(dag.predecessors(el)) if (self._check_global_dag): - part_node_set = set(dag.node) - set([el]) # node set + part_node_set = set(dag.node) - set([el]) # node set rem = part_node_set - el_des global_dag = self._global_dag for rel in rem: if ((not rel in tc[el]) and - nx.has_path(global_dag, el, rel)): - + nx.has_path(global_dag, el, rel)): el_des.add(rel) tmp_dag_list.append((el, rel)) dag.add_edge(el, rel) @@ -724,8 +735,7 @@ def _add_to_tc(self, tc, el, dag, tmp_dag_list): rem = part_node_set - el_pred for rel in rem: if ((not el in tc[rel]) and - nx.has_path(global_dag, rel, el)): - + nx.has_path(global_dag, rel, el)): el_pred.add(rel) tmp_dag_list.append((rel, el)) dag.add_edge(rel, el) @@ -748,8 +758,8 @@ def _get_w_antichain_len(self, tc, dag): stt = time.time() dag_node = dag.node N = list(dag) - num_nodes = len(N) # nodes - I = {u: i for i, u in enumerate(N)} # node indices + num_nodes = len(N) # nodes + I = {u: i for i, u in enumerate(N)} # node indices def antichains(): """ @@ -770,10 +780,10 @@ def antichains(): while stack: x = stack.pop() new_antichain = antichain + [x] - #stt = time.time() + # stt = time.time() new_stack = [ t for t in stack if not ((t in tc[x]) or (x in tc[t]))] - #self._ac_mem_time += time.time() - stt + # self._ac_mem_time += time.time() - stt antichains_stacks.append((new_antichain, new_stack)) stt = time.time() @@ -908,12 +918,14 @@ def merge(self, that): # we could recalcuate it again, but we are lazy! raise SchedulerException("can_merge was not probed before add()") + class KFamilyPartition(Partition): """ A special case (K = 1) of the Maximum Weighted K-families based on the Theorem 3.1 in http://fmdb.cs.ucla.edu/Treports/930014.pdf """ + def __init__(self, gid, max_dop, global_dag=None): """ max_dop: dict with key: resource_attributes (string) @@ -927,7 +939,7 @@ def __init__(self, gid, max_dop, global_dag=None): pass else: raise SchedulerException('Invalid max_dop type: %r' % mtype) - + super(KFamilyPartition, self).__init__(gid, max_dop) self._bpg = nx.DiGraph() self._global_dag = global_dag @@ -951,20 +963,20 @@ def add_node(self, u): self._dag.add_node(u, **kwargs) for k in self._w_attr: self._tmp_max_dop[k] = get_max_weighted_antichain(self._dag, w_attr=k)[0] - self._max_dop = self._tmp_max_dop + self._max_dop = self._tmp_max_dop def can_merge(self, that, u, v): """ """ dag = nx.compose(self._dag, that._dag) - if (u is not None ): + if (u is not None): dag.add_edge(u, v) tmp_max_dop = copy.deepcopy(self._tmp_max_dop) for _w_attr in self._w_attr: mydop = get_max_weighted_antichain(dag, w_attr=_w_attr)[0] curr_max = max(self._max_dop[_w_attr], that._max_dop[_w_attr]) - + if (mydop <= curr_max): # if you don't increase DoP, we accept that immediately tmp_max_dop[_w_attr] = curr_max @@ -972,8 +984,8 @@ def can_merge(self, that, u, v): return False else: tmp_max_dop[_w_attr] = mydop - - self._tmp_max_dop = tmp_max_dop # only change it when returning True + + self._tmp_max_dop = tmp_max_dop # only change it when returning True return True def merge(self, that, u, v): @@ -982,12 +994,13 @@ def merge(self, that, u, v): self._dag.add_edge(u, v) if (self._tmp_max_dop is not None): self._max_dop = self._tmp_max_dop - #print("Gid %d just merged with DoP %d" % (self._gid, self._tmp_max_dop)) + # print("Gid %d just merged with DoP %d" % (self._gid, self._tmp_max_dop)) else: # we could recalcuate it again, but we are lazy! raise SchedulerException("can_merge was not probed before add()") -class Scheduler(object): + +class Scheduler(object): """ Static Scheduling consists of three steps: 1. partition the DAG into an optimal number (M) of partitions @@ -1008,9 +1021,9 @@ def __init__(self, drop_list, max_dop=8, dag=None): else: self._dag = dag self._max_dop = max_dop - self._parts = None # partitions - self._part_dict = dict() #{gid : part} - self._part_edges = [] # edges amongst all partitions + self._parts = None # partitions + self._part_dict = dict() # {gid : part} + self._part_edges = [] # edges amongst all partitions def partition_dag(self): raise SchedulerException("Not implemented. Try subclass instead") @@ -1036,9 +1049,9 @@ def merge_partitions(self, num_partitions, bal_cond=1): else: G.graph['node_weight_attr'] = 'cc' for part in self._parts: - #sc = part.schedule + # sc = part.schedule pdop = part._max_dop - #TODO add memory as one of the LB condition too + # TODO add memory as one of the LB condition too cc_eval = pdop if type(pdop) == int else pdop.get('num_cpus', 1) G.add_node(part.partition_id, cc=cc_eval) @@ -1047,30 +1060,30 @@ def merge_partitions(self, num_partitions, bal_cond=1): v = e[1] ugid = self._dag.node[u].get('gid', None) vgid = self._dag.node[v].get('gid', None) - G.add_edge(ugid, vgid) # repeating is fine + G.add_edge(ugid, vgid) # repeating is fine ew = self._dag.adj[u][v]['weight'] try: G[ugid][vgid]['weight'] += ew except KeyError: G[ugid][vgid]['weight'] = ew - #DAGUtil.metis_part(G, 15) + # DAGUtil.metis_part(G, 15) # since METIS does not allow zero edge weight, reset them to one for e in G.edges(data=True): if (e[2]['weight'] == 0): e[2]['weight'] = 1 - #logger.debug(G.nodes(data=True)) + # logger.debug(G.nodes(data=True)) (edgecuts, metis_parts) = metis.part_graph(G, nparts=num_partitions, ufactor=1) - for node, pt in zip(G.nodes(), metis_parts): # note min(pt) == 0 + for node, pt in zip(G.nodes(), metis_parts): # note min(pt) == 0 parent_id = pt + st_gid child_part = self._part_dict[node] child_part.parent_id = parent_id - #logger.debug("Part {0} --> Cluster {1}".format(child_part.partition_id, parent_id)) - #parent_part = Partition(parent_id, None) - #self._parts.append(parent_part) - #logger.debug("Edgecuts of merged partitions: ", edgecuts) + # logger.debug("Part {0} --> Cluster {1}".format(child_part.partition_id, parent_id)) + # parent_part = Partition(parent_id, None) + # self._parts.append(parent_part) + # logger.debug("Edgecuts of merged partitions: ", edgecuts) return edgecuts def map_partitions(self): @@ -1079,6 +1092,7 @@ def map_partitions(self): """ pass + class MySarkarScheduler(Scheduler): """ Based on "V. Sarkar, Partitioning and Scheduling Parallel Programs for Execution on @@ -1096,9 +1110,10 @@ class MySarkarScheduler(Scheduler): Similar ideas: http://stackoverflow.com/questions/3974731 """ + def __init__(self, drop_list, max_dop=8, dag=None, dump_progress=False): super(MySarkarScheduler, self).__init__(drop_list, max_dop=max_dop, dag=dag) - self._sspace = [3] * len(self._dag.edges()) # all edges are not zeroed + self._sspace = [3] * len(self._dag.edges()) # all edges are not zeroed self._dump_progress = dump_progress def override_cannot_add(self): @@ -1134,7 +1149,7 @@ def _merge_two_parts(self, ugid, vgid, """ # get the new part should we go ahead # the new part should be one of partu or partv - #print("\nMerging ugid %d and vgid %d, u %d and v %d" % (ugid, vgid, u, v)) + # print("\nMerging ugid %d and vgid %d, u %d and v %d" % (ugid, vgid, u, v)) l_gid = min(ugid, vgid) r_gid = max(ugid, vgid) part_new = g_dict[l_gid] @@ -1159,7 +1174,7 @@ def _merge_two_parts(self, ugid, vgid, for n in part._dag.nodes(): G.node[n]['gid'] = part._gid elif (p_gid == r_gid): - #index = len(parts) - i - 1 + # index = len(parts) - i - 1 index = i del g_dict[p_gid] @@ -1181,17 +1196,17 @@ def reduce_partitions(self, parts, g_dict, G): """ done_reduction = False num_reductions = 0 - #TODO consider other w_attrs other than CPUs! + # TODO consider other w_attrs other than CPUs! parts.sort(key=lambda x: x._max_dop['num_cpus']) while (not done_reduction): for i, partA in enumerate(parts): if (i < len(parts) - 1): partB = parts[i + 1] new_part = self._merge_two_parts(partA._gid, partB._gid, None, None, - None, None, g_dict, parts, G) + None, None, g_dict, parts, G) if (new_part is not None): num_reductions += 1 - break # force re-sorting + break # force re-sorting else: done_reduction = True logger.info('Performed reductions %d times', num_reductions) @@ -1210,7 +1225,7 @@ def partition_dag(self): el = sorted(G.edges(data=True), key=lambda ed: ed[2]['weight'] * -1) stt = time.time() topo_sorted = nx.topological_sort(G) - g_dict = self._part_dict#dict() #{gid : Partition} + g_dict = self._part_dict # dict() #{gid : Partition} curr_lpl = None parts = [] plots_data = [] @@ -1218,14 +1233,14 @@ def partition_dag(self): for n in G.nodes(data=True): n[1]['gid'] = st_gid - #part = DilworthPartition(st_gid, self._max_dop) - #part = WeightedDilworthPartition(st_gid, self._max_dop) - #part = WeightedDilworthPartition(st_gid, self._max_dop, G) - #part = MultiWeightPartition(st_gid, self._max_dop, global_dag=G) + # part = DilworthPartition(st_gid, self._max_dop) + # part = WeightedDilworthPartition(st_gid, self._max_dop) + # part = WeightedDilworthPartition(st_gid, self._max_dop, G) + # part = MultiWeightPartition(st_gid, self._max_dop, global_dag=G) part = KFamilyPartition(st_gid, self._max_dop, global_dag=G) part.add_node(n[0]) g_dict[st_gid] = part - parts.append(part) # will it get rejected? + parts.append(part) # will it get rejected? st_gid += 1 for i, e in enumerate(el): @@ -1234,10 +1249,10 @@ def partition_dag(self): v = e[1] gv = G.node[v] ow = G.adj[u][v]['weight'] - G.adj[u][v]['weight'] = 0 #edge zeroing + G.adj[u][v]['weight'] = 0 # edge zeroing ugid = gu.get('gid', None) vgid = gv.get('gid', None) - if (ugid != vgid): # merge existing parts + if (ugid != vgid): # merge existing parts part = self._merge_two_parts(ugid, vgid, u, v, gu, gv, g_dict, parts, G) if (part is not None): @@ -1249,7 +1264,7 @@ def partition_dag(self): if (dump_progress): bb = np.median([pp._tmp_max_dop for pp in parts]) curr_lpl = DAGUtil.get_longest_path(G, show_path=False, - topo_sort=topo_sorted)[1] + topo_sort=topo_sorted)[1] plots_data.append('%d,%d,%d' % (curr_lpl, len(parts), bb)) self.reduce_partitions(parts, g_dict, G) edt = time.time() - stt @@ -1259,15 +1274,17 @@ def partition_dag(self): of.writelines(os.linesep.join(plots_data)) if (curr_lpl is None): curr_lpl = DAGUtil.get_longest_path(G, show_path=False, - topo_sort=topo_sorted)[1] + topo_sort=topo_sorted)[1] return ((st_gid - init_c), curr_lpl, edt, parts) + class MinNumPartsScheduler(MySarkarScheduler): """ A special type of partition that aims to schedule the DAG on time but at minimum cost. In this particular case, the cost is the number of partitions that will be generated. The assumption is # of partitions (with certain DoP) more or less represents resource footprint. """ + def __init__(self, drop_list, deadline, max_dop=8, dag=None, optimistic_factor=0.5): super(MinNumPartsScheduler, self).__init__(drop_list, max_dop=max_dop, dag=dag) self._deadline = deadline @@ -1309,7 +1326,7 @@ def is_time_critical(self, u, uw, unew, v, vw, vnew, curr_lpl, ow, rem_el): # probability that remaining edges will be zeroed in order to meet the deadline prob = (c + 1) / ttlen time_critical = True if (prob > self._optimistic_factor) else False - #print "time criticality is {0}, prob is {1}".format(time_critical, prob) + # print "time criticality is {0}, prob is {1}".format(time_critical, prob) return time_critical # if (time_critical): # # enforce sequentialisation @@ -1323,6 +1340,7 @@ def is_time_critical(self, u, uw, unew, v, vw, vnew, curr_lpl, ow, rem_el): # else: # join the partition to minimise num_part # return True + class PSOScheduler(Scheduler): """ Use the Particle Swarm Optimisation to guide the Sarkar algorithm @@ -1350,10 +1368,11 @@ class PSOScheduler(Scheduler): based on X[i] value, reject or linearisation (2) returns makespan """ + def __init__(self, drop_list, max_dop=8, dag=None, deadline=None, topk=30, swarm_size=40): super(PSOScheduler, self).__init__(drop_list, max_dop=max_dop, dag=dag) self._deadline = deadline - #search space: key - combination of X[i] (string), + # search space: key - combination of X[i] (string), # val - a tuple of (critical_path (int), num_parts (int)) self._sspace_dict = dict() self._topk = topk @@ -1383,10 +1402,10 @@ def partition_dag(self): xopt, fopt = pso(self.objective_func, lb, ub, ieqcons=[self.constrain_func], swarmsize=self._swarm_size) curr_lpl, num_parts, parts, g_dict = self._partition_G(G, xopt) - #curr_lpl, num_parts, parts, g_dict = self.objective_func(xopt) + # curr_lpl, num_parts, parts, g_dict = self.objective_func(xopt) self._part_dict = g_dict edt = time.time() - #print "PSO scheduler took {0} seconds".format(edt - stt) + # print "PSO scheduler took {0} seconds".format(edt - stt) st_gid = len(self._drop_list) + 1 + num_parts for n in G.nodes(data=True): if not 'gid' in n[1]: @@ -1394,10 +1413,10 @@ def partition_dag(self): part = Partition(st_gid, self._max_dop) part.add_node(n[0], n[1].get('weight', 1)) g_dict[st_gid] = part - parts.append(part) # will it get rejected? + parts.append(part) # will it get rejected? num_parts += 1 self._parts = parts - #print "call counts ", self._call_counts + # print "call counts ", self._call_counts return (num_parts, curr_lpl, edt - stt, parts) def _partition_G(self, G, x): @@ -1405,21 +1424,21 @@ def _partition_G(self, G, x): A helper function to partition G based on a given scheme x subject to constraints imposed by each partition's DoP """ - #print x + # print x st_gid = len(self._drop_list) + 1 init_c = st_gid el = sorted(G.edges(data=True), key=lambda ed: ed[2]['weight'] * -1) - #topo_sorted = nx.topological_sort(G) - #g_dict = self._part_dict#dict() #{gid : Partition} + # topo_sorted = nx.topological_sort(G) + # g_dict = self._part_dict#dict() #{gid : Partition} g_dict = dict() parts = [] for i, e in enumerate(el): pos = int(round(x[i])) - if (pos == 3): #10 non_zero + 1 + if (pos == 3): # 10 non_zero + 1 continue - elif (pos == 2):#01 zero with linearisation + 1 + elif (pos == 2): # 01 zero with linearisation + 1 linear = True - elif (pos == 1): #00 zero without linearisation + 1 + elif (pos == 1): # 00 zero without linearisation + 1 linear = False else: raise SchedulerException("PSO position out of bound: {0}".format(pos)) @@ -1429,7 +1448,7 @@ def _partition_G(self, G, x): v = e[1] gv = G.node[v] ow = G.adj[u][v]['weight'] - G.adj[u][v]['weight'] = 0 #edge zeroing + G.adj[u][v]['weight'] = 0 # edge zeroing recover_edge = False ugid = gu.get('gid', None) @@ -1441,13 +1460,13 @@ def _partition_G(self, G, x): elif (not ugid and (not vgid)): part = Partition(st_gid, self._max_dop) g_dict[st_gid] = part - parts.append(part) # will it get rejected? + parts.append(part) # will it get rejected? st_gid += 1 - else: #elif (ugid and vgid): + else: # elif (ugid and vgid): # cannot change Partition once is in! part = None - #uw = gu['weight'] - #vw = gv['weight'] + # uw = gu['weight'] + # vw = gv['weight'] if (part is None): recover_edge = True @@ -1464,12 +1483,12 @@ def _partition_G(self, G, x): gu['gid'] = part._gid gv['gid'] = part._gid else: - recover_edge = True #outright rejection + recover_edge = True # outright rejection if (recover_edge): G.adj[u][v]['weight'] = ow self._part_edges.append(e) self._call_counts += 1 - #print "called {0} times, len parts = {1}".format(self._call_counts, len(parts)) + # print "called {0} times, len parts = {1}".format(self._call_counts, len(parts)) return (DAGUtil.get_longest_path(G, show_path=False)[1], len(parts), parts, g_dict) def constrain_func(self, x): @@ -1495,7 +1514,7 @@ def objective_func(self, x): """ # first check if the solution is already available in the search space sk = ''.join([str(int(round(xi))) for xi in x[0:self._topk]]) - stuff = self._sspace_dict.get(sk, None) #TODO is this atomic operation? + stuff = self._sspace_dict.get(sk, None) # TODO is this atomic operation? if (stuff is None): # make a deep copy to avoid mix up multiple particles, # each of which has multiple iterations @@ -1508,6 +1527,7 @@ def objective_func(self, x): else: return stuff[1] + class GraphAnnealer(Annealer): """ Use simulated annealing for a DAG/Graph scheduling problem. @@ -1554,7 +1574,7 @@ def energy(self): stuff = self._scheduler._partition_G(G, self.state) self._lgl = stuff[0] num_parts = stuff[1] - #print "num_parts = {0}, lgl = {1}".format(num_parts, self._lgl) + # print "num_parts = {0}, lgl = {1}".format(num_parts, self._lgl) return num_parts def meet_constraint(self): @@ -1567,12 +1587,14 @@ def meet_constraint(self): else: return (self._lgl <= self._deadline) + class MCTSScheduler(PSOScheduler): """ Use Monte Carlo Tree Search to guide the Sarkar algorithm https://en.wikipedia.org/wiki/Monte_Carlo_tree_search Use basic functions in PSOScheduler by inheriting it for convinence """ + def __init__(self, drop_list, max_dop=8, dag=None, deadline=None, max_moves=1000, max_calc_time=10): super(MCTSScheduler, self).__init__(drop_list, max_dop, dag, deadline, None, 40) self._max_moves = max_moves @@ -1599,10 +1621,11 @@ def partition_dag(self): if logger.isEnabledFor(logging.DEBUG): leng = len(G.edges()) logger.debug("Each MCTS move on average took %.2f seconds", (time.time() - stt) / leng) - #calculate the solution under the state found by MCTS + # calculate the solution under the state found by MCTS curr_lpl, num_parts, parts, g_dict = self._partition_G(G, state) edt = time.time() - logger.debug("Monte Carlo Tree Search scheduler took %f secs, lpl = %d, num_parts = %d", edt - stt, curr_lpl, num_parts) + logger.debug("Monte Carlo Tree Search scheduler took %f secs, lpl = %d, num_parts = %d", edt - stt, curr_lpl, + num_parts) st_gid = len(self._drop_list) + 1 + num_parts for n in G.nodes(data=True): @@ -1616,6 +1639,7 @@ def partition_dag(self): self._parts = parts return (num_parts, curr_lpl, edt - stt, parts) + class SAScheduler(PSOScheduler): """ Use Simulated Annealing to guide the Sarkar algorithm @@ -1623,6 +1647,7 @@ class SAScheduler(PSOScheduler): http://apmonitor.com/me575/index.php/Main/SimulatedAnnealing Use basic functions in PSOScheduler by inheriting it for convinence """ + def __init__(self, drop_list, max_dop=8, dag=None, deadline=None, topk=None, max_iter=6000): """ A smaller topk corresponds to a smaller range of perturbation during neighbour search, @@ -1649,8 +1674,8 @@ def partition_dag(self): stt = time.time() ga = GraphAnnealer(mys._sspace, self, deadline=self._deadline, topk=self._topk) # 3. start the annealing process - #auto_schedule = ga.auto(minutes=self._max_wait) - #ga.set_schedule(auto_schedule) + # auto_schedule = ga.auto(minutes=self._max_wait) + # ga.set_schedule(auto_schedule) ga.steps = self._max_iter if (DEBUG): ga.updates = 100 @@ -1674,6 +1699,7 @@ def partition_dag(self): self._parts = parts return (num_parts, curr_lpl, edt - stt, parts) + class DSCScheduler(Schedule): """ Based on @@ -1681,16 +1707,19 @@ class DSCScheduler(Schedule): unbounded number of processors," in IEEE Transactions on Parallel and Distributed Systems, vol.5, no.9, pp.951-967, Sep 1994 """ + def __init__(self, drop_list): super(DSCScheduler, self).__init__(drop_list) def partition_dag(self): pass + class DAGUtil(object): """ Helper functions dealing with DAG """ + @staticmethod def get_longest_path(G, weight='weight', default_weight=1, show_path=True, topo_sort=None): """ @@ -1716,16 +1745,16 @@ def get_longest_path(G, weight='weight', default_weight=1, show_path=True, topo_ The length of the longest path """ - dist = {} # stores {v : (length, u)} + dist = {} # stores {v : (length, u)} if (topo_sort is None): topo_sort = nx.topological_sort(G) for v in topo_sort: us = [ - (dist[u][0] + #accumulate - data.get(weight, default_weight) + #edge weight - G.node[u].get(weight, 0) + # u node weight - (G.node[v].get(weight, 0) if len(list(G.successors(v))) == 0 else 0), # v node weight if no successor - u) + (dist[u][0] + # accumulate + data.get(weight, default_weight) + # edge weight + G.node[u].get(weight, 0) + # u node weight + (G.node[v].get(weight, 0) if len(list(G.successors(v))) == 0 else 0), # v node weight if no successor + u) for u, data in G.pred[v].items()] # Use the best predecessor if there is one and its distance is non-negative, otherwise terminate. maxu = max(us) if us else (0, v) @@ -1792,7 +1821,7 @@ def prune_antichains(antichains): todo = [] for antichain in antichains: todo.append(antichain) - todo.sort(key=lambda x : len(x), reverse=True) + todo.sort(key=lambda x: len(x), reverse=True) return todo @staticmethod @@ -1823,7 +1852,7 @@ def ganttchart_matrix(G, topo_sort=None): Return a M (# of DROPs) by N (longest path length) matrix """ lpl = DAGUtil.get_longest_path(G, show_path=True) - #N = lpl[1] - (len(lpl[0]) - 1) + # N = lpl[1] - (len(lpl[0]) - 1) N = lpl[1] M = G.number_of_nodes() ma = np.zeros((M, N), dtype=np.int) @@ -1835,9 +1864,9 @@ def ganttchart_matrix(G, topo_sort=None): stt = node['stt'] edt = node['edt'] except KeyError as ke: - raise SchedulerException("No schedule labels found: {0}".\ - format(str(ke))) - #print i, n, stt, edt + raise SchedulerException("No schedule labels found: {0}". \ + format(str(ke))) + # print i, n, stt, edt leng = edt - stt if (edt == stt): continue @@ -1847,7 +1876,7 @@ def ganttchart_matrix(G, topo_sort=None): logger.error("i, stt, edt, leng = %d, %d, %d, %d", i, stt, edt, leng) logger.error("N, M = %d, %d", M, N) raise - #print ma[i, :] + # print ma[i, :] return ma @staticmethod @@ -1856,20 +1885,23 @@ def import_metis(): import metis as mt except: pl = platform.platform() - if (pl.startswith('Darwin')): # a clumsy way + if (pl.startswith('Darwin')): # a clumsy way ext = 'dylib' else: - ext = 'so' # what about Microsoft??!! - os.environ["METIS_DLL"] = pkg_resources.resource_filename('dlg.dropmake', 'lib/libmetis.{0}'.format(ext)) # @UndefinedVariable + ext = 'so' # what about Microsoft??!! + os.environ["METIS_DLL"] = pkg_resources.resource_filename('dlg.dropmake', 'lib/libmetis.{0}'.format( + ext)) # @UndefinedVariable import metis as mt if not hasattr(mt, '_dlg_patched'): mt._part_graph = mt.part_graph + def logged_part_graph(*args, **kwargs): logger.info('Starting metis partitioning') start = time.time() ret = mt._part_graph(*args, **kwargs) # @UndefinedVariable logger.info('Finished metis partitioning in %.3f [s]', time.time() - start) return ret + mt.part_graph = logged_part_graph mt._dlg_patched = True return mt @@ -1885,12 +1917,12 @@ def build_dag_from_drops(drop_list, embed_drop=True, fake_super_root=False): tw - task weight dw - data weight / volume """ - key_dict = dict() # {oid : node_id} - drop_dict = dict() # {oid : drop} + key_dict = dict() # {oid : node_id} + drop_dict = dict() # {oid : drop} out_bound_keys = ['streamingConsumers', 'consumers', 'outputs'] for i, drop in enumerate(drop_list): oid = drop['oid'] - key_dict[oid] = i + 1 # starting from 1 + key_dict[oid] = i + 1 # starting from 1 drop_dict[oid] = drop G = nx.DiGraph() for i, drop in enumerate(drop_list): @@ -1905,19 +1937,19 @@ def build_dag_from_drops(drop_list, embed_drop=True, fake_super_root=False): tw = 0 dtp = 0 elif ('app' == tt): - #obk = 'outputs' + # obk = 'outputs' tw = int(drop['tw']) dtp = 1 else: - raise SchedulerException("Drop Type '{0}' not supported".\ - format(tt)) + raise SchedulerException("Drop Type '{0}' not supported". \ + format(tt)) num_cpus = drop.get('num_cpus', 1) if (embed_drop): G.add_node(myk, weight=tw, text=drop['nm'], dt=dtp, - drop_spec=drop, num_cpus=num_cpus) + drop_spec=drop, num_cpus=num_cpus) else: G.add_node(myk, weight=tw, text=drop['nm'], dt=dtp, - num_cpus=num_cpus) + num_cpus=num_cpus) for obk in out_bound_keys: if obk in drop: for oup in drop[obk]: @@ -1927,7 +1959,7 @@ def build_dag_from_drops(drop_list, embed_drop=True, fake_super_root=False): G.add_weighted_edges_from([(myk, key_dict[oup], int(drop_dict[oup].get('dw', 5)))]) if (fake_super_root): - super_root = dropdict({'oid':'-92', 'type':'plain', 'storage':'null'}) + super_root = dropdict({'oid': '-92', 'type': 'plain', 'storage': 'null'}) super_k = len(drop_list) + 1 G.add_node(super_k, weight=0, dtp=0, drop_spec=super_root, num_cpus=0, text='fake_super_root') @@ -1945,7 +1977,7 @@ def metis_part(G, num_partitions): """ outf = '/tmp/mm' lines = [] - part_id_line_dict = dict() # {part_id: line_num} + part_id_line_dict = dict() # {part_id: line_num} line_part_id_dict = dict() for i, n in enumerate(G.nodes()): part_id_line_dict[n] = i + 1 @@ -1969,11 +2001,12 @@ def metis_part(G, num_partitions): with open(outf, "w") as f: f.write("\n".join(lines)) + if __name__ == "__main__": G = nx.DiGraph() - G.add_weighted_edges_from([(4,3,1), (3,2,4), (2,1,2), (5,3,1)]) - G.add_weighted_edges_from([(3,6,5), (6,7,2)]) - G.add_weighted_edges_from([(9,12,2)]) # testing independent nodes + G.add_weighted_edges_from([(4, 3, 1), (3, 2, 4), (2, 1, 2), (5, 3, 1)]) + G.add_weighted_edges_from([(3, 6, 5), (6, 7, 2)]) + G.add_weighted_edges_from([(9, 12, 2)]) # testing independent nodes G.node[3]['weight'] = 65 print(G.pred[12].items()) print(G.node[G.predecessors(12)[0]]) @@ -2007,4 +2040,4 @@ def metis_part(G, num_partitions): # print sch_mat # print sch_mat.shape - #print DAGUtil.prune_antichains([[], [64], [62], [62, 64], [61], [61, 64], [61, 62], [61, 62, 64], [5], [1]]) + # print DAGUtil.prune_antichains([[], [64], [62], [62, 64], [61], [61, 64], [61, 62], [61, 62, 64], [5], [1]]) diff --git a/daliuge-translator/dlg/dropmake/stage_scheduler.py b/daliuge-translator/dlg/dropmake/stage_scheduler.py index e05f293be..b5fa2fb5e 100644 --- a/daliuge-translator/dlg/dropmake/stage_scheduler.py +++ b/daliuge-translator/dlg/dropmake/stage_scheduler.py @@ -32,9 +32,10 @@ /spark/scheduler/DAGScheduler.scala """ + class Stage(object): def __init__(self, id): - self._id = id #normally this is the group construct key + self._id = id # normally this is the group construct key self._lg_nodes = [] def __hash__(self): @@ -43,6 +44,7 @@ def __hash__(self): def add_node(lgnode): self._lg_nodes.append(lgnode) + def parse_node(curr_node, done_dict, stg_set): node_list = curr_node.outputs for n in node_list: @@ -60,6 +62,7 @@ def parse_node(curr_node, done_dict, stg_set): done_dict[n.id] = done_dict[curr_node.id] parse_node(n, done_dict, stg_set) + def produce_stages(lg): """ output a list of stages sorted by the scheduling order @@ -68,4 +71,4 @@ def produce_stages(lg): lgn_list = lg._lgn_list dag_roots = [x for x in lgn_list if x.is_dag_root()] done_dict = dict() - #for n in dag_roots: + # for n in dag_roots: diff --git a/daliuge-translator/dlg/dropmake/utils/__init__.py b/daliuge-translator/dlg/dropmake/utils/__init__.py index 3c21c477b..99f4c9943 100644 --- a/daliuge-translator/dlg/dropmake/utils/__init__.py +++ b/daliuge-translator/dlg/dropmake/utils/__init__.py @@ -1,4 +1,3 @@ - # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) diff --git a/daliuge-translator/dlg/dropmake/utils/anneal.py b/daliuge-translator/dlg/dropmake/utils/anneal.py index 016813b5a..c973b2cf4 100644 --- a/daliuge-translator/dlg/dropmake/utils/anneal.py +++ b/daliuge-translator/dlg/dropmake/utils/anneal.py @@ -19,19 +19,20 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +from __future__ import absolute_import from __future__ import division from __future__ import print_function -from __future__ import absolute_import from __future__ import unicode_literals + +import abc import copy +import datetime import math -import sys -import time +import pickle import random import signal -import pickle -import datetime -import abc +import sys +import time def round_figures(x, n): @@ -42,13 +43,12 @@ def round_figures(x, n): def time_string(seconds): """Returns time in seconds as a string formatted HHHH:MM:SS.""" s = int(round(seconds)) # round to nearest second - h, s = divmod(s, 3600) # get hours and remainder - m, s = divmod(s, 60) # split remainder into minutes and seconds + h, s = divmod(s, 3600) # get hours and remainder + m, s = divmod(s, 60) # split remainder into minutes and seconds return '%4i:%02i:%02i' % (h, m, s) class Annealer(object): - """Performs simulated annealing by calling functions to calculate energy and make moves on a state. The temperature schedule for annealing may be provided manually or estimated automatically. @@ -151,13 +151,13 @@ def update(self, step, T, E, acceptance, improvement): if step == 0: print(' Temperature Energy Accept Improve Elapsed Remaining') sys.stdout.write('\r%12.2f %12.2f %s ' % \ - (T, E, time_string(elapsed))) + (T, E, time_string(elapsed))) sys.stdout.flush() else: remain = (self.steps - step) * (elapsed / step) sys.stdout.write('\r%12.2f %12.2f %7.2f%% %7.2f%% %s %s' % \ - (T, E, 100.0 * acceptance, 100.0 * improvement,\ - time_string(elapsed), time_string(remain))), + (T, E, 100.0 * acceptance, 100.0 * improvement, \ + time_string(elapsed), time_string(remain))), sys.stdout.flush() def anneal(self): @@ -199,7 +199,7 @@ def anneal(self): dE = E - prevEnergy trials += 1 if ((not self.meet_constraint()) or - (dE > 0.0 and math.exp(-dE / T) < random.random())): + (dE > 0.0 and math.exp(-dE / T) < random.random())): # Restore previous state self.state = self.copy_state(prevState) E = prevEnergy @@ -251,7 +251,7 @@ def run(T, steps): E = self.energy() dE = E - prevEnergy if ((not self.meet_constraint()) or - (dE > 0.0 and math.exp(-dE / T) < random.random())): + (dE > 0.0 and math.exp(-dE / T) < random.random())): self.state = self.copy_state(prevState) E = prevEnergy else: @@ -303,6 +303,6 @@ def run(T, steps): elapsed = time.time() - self.start duration = round_figures(int(60.0 * minutes * step / elapsed), 2) - print('') # New line after auto() output + print('') # New line after auto() output # Don't perform anneal, just return params return {'tmax': Tmax, 'tmin': Tmin, 'steps': duration} diff --git a/daliuge-translator/dlg/dropmake/utils/antichains.py b/daliuge-translator/dlg/dropmake/utils/antichains.py index 051da5bfa..dbccfb654 100644 --- a/daliuge-translator/dlg/dropmake/utils/antichains.py +++ b/daliuge-translator/dlg/dropmake/utils/antichains.py @@ -34,6 +34,7 @@ import networkx as nx + def _create_split_graph(dag, w_attr='weight'): """ Given a normal DiGraph, create its equivalent split graph @@ -42,7 +43,7 @@ def _create_split_graph(dag, w_attr='weight'): for el in dag.nodes(data=True): xi = '{0}_x'.format(el[0]) yi = '{0}_y'.format(el[0]) - #print(el) + # print(el) bpg.add_edge('s', xi, capacity=el[1].get(w_attr, 1), weight=0) bpg.add_edge(xi, yi, capacity=sys.maxsize, weight=1) bpg.add_edge(yi, 't', capacity=el[1].get(w_attr, 1), weight=0) @@ -52,58 +53,60 @@ def _create_split_graph(dag, w_attr='weight'): for udown in el_des: bpg.add_edge(xi, '{0}_y'.format(udown), - capacity=sys.maxsize, weight=0) + capacity=sys.maxsize, weight=0) for uup in el_pred: bpg.add_edge('{0}_x'.format(uup), yi, - capacity=sys.maxsize, weight=0) + capacity=sys.maxsize, weight=0) return bpg + def _get_pi_solution(split_graph): - """ - 1. create H (admissable graph) based on Section 3 - http://fmdb.cs.ucla.edu/Treports/930014.pdf - - 2. calculate the max flow f' on H using networkx - - 3. construct Residual graph from f' on H based on - https://www.topcoder.com/community/data-science/\ - data-science-tutorials/minimum-cost-flow-part-two-algorithms/ - - 4. calculate Pi based on Section 3 again - """ - # Step 1 - H = nx.DiGraph() - H.add_nodes_from(split_graph) - for ed in split_graph.edges(data=True): - Cxy = ed[2].get('capacity', sys.maxsize) - Axy = ed[2]['weight'] - if (Axy == 0 and Cxy > 0): - H.add_edge(ed[0], ed[1], capacity=Cxy, weight=Axy) - - # Step 2 - flow_value, flow_dict = nx.maximum_flow(H, 's', 't') - - # Step 3 - R = nx.DiGraph() - R.add_nodes_from(H) - for ed in H.edges(data=True): - Xij = flow_dict[ed[0]][ed[1]] - Uij = ed[2].get('capacity', sys.maxsize) - Cij = ed[2]['weight'] - if (Uij - Xij) > 0: - R.add_edge(ed[0], ed[1], weight=Cij) - if (Xij > 0): - R.add_edge(ed[1], ed[0], weight=-1 * Cij) - - # Step 4 - pai = dict() - for n in R.nodes(): - if (nx.has_path(R, 's', n)): - pai[n] = 0 - else: - pai[n] = 1 - return pai + """ + 1. create H (admissable graph) based on Section 3 + http://fmdb.cs.ucla.edu/Treports/930014.pdf + + 2. calculate the max flow f' on H using networkx + + 3. construct Residual graph from f' on H based on + https://www.topcoder.com/community/data-science/\ + data-science-tutorials/minimum-cost-flow-part-two-algorithms/ + + 4. calculate Pi based on Section 3 again + """ + # Step 1 + H = nx.DiGraph() + H.add_nodes_from(split_graph) + for ed in split_graph.edges(data=True): + Cxy = ed[2].get('capacity', sys.maxsize) + Axy = ed[2]['weight'] + if (Axy == 0 and Cxy > 0): + H.add_edge(ed[0], ed[1], capacity=Cxy, weight=Axy) + + # Step 2 + flow_value, flow_dict = nx.maximum_flow(H, 's', 't') + + # Step 3 + R = nx.DiGraph() + R.add_nodes_from(H) + for ed in H.edges(data=True): + Xij = flow_dict[ed[0]][ed[1]] + Uij = ed[2].get('capacity', sys.maxsize) + Cij = ed[2]['weight'] + if (Uij - Xij) > 0: + R.add_edge(ed[0], ed[1], weight=Cij) + if (Xij > 0): + R.add_edge(ed[1], ed[0], weight=-1 * Cij) + + # Step 4 + pai = dict() + for n in R.nodes(): + if (nx.has_path(R, 's', n)): + pai[n] = 0 + else: + pai[n] = 1 + return pai + def get_max_weighted_antichain(dag, w_attr='weight'): """ @@ -118,20 +121,21 @@ def get_max_weighted_antichain(dag, w_attr='weight'): bpg = _create_split_graph(dag, w_attr=w_attr) pai = _get_pi_solution(bpg) - w_antichain_len = 0 #weighted antichain length + w_antichain_len = 0 # weighted antichain length antichain_names = [] for h in range(2): for nd in bpg.nodes(): if (nd.endswith('_x')): y_nd = nd.split('_x')[0] + '_y' if ((1 - pai[nd] + pai['s'] == h) and - (pai[y_nd] - pai[nd] == 1)): + (pai[y_nd] - pai[nd] == 1)): w_antichain_len += bpg.adj['s'][nd]['capacity'] - #print(' *** %d' % bpg.edge['s'][nd]['capacity']) + # print(' *** %d' % bpg.edge['s'][nd]['capacity']) antichain_names.append(nd) return w_antichain_len, antichain_names + def create_small_seq_graph(): G = nx.DiGraph() G.add_edge(1, 2) @@ -139,9 +143,10 @@ def create_small_seq_graph(): G.node[1]['weight'] = 5 G.node[2]['weight'] = 4 G.node[3]['weight'] = 7 - #print("") + # print("") return G, 7 + def create_medium_seq_graph(): G = create_small_seq_graph()[0] G.add_edge(3, 4) @@ -155,6 +160,7 @@ def create_medium_seq_graph(): G.node[7]['weight'] = 1 return G, 7 + def create_small_parral_graph(): G = nx.DiGraph() G.add_edge(1, 2) @@ -165,6 +171,7 @@ def create_small_parral_graph(): G.node[3]['weight'] = 7 return G, 13 + def create_medium_parral_graph(): G = create_small_parral_graph()[0] G.add_edge(2, 4) @@ -173,6 +180,7 @@ def create_medium_parral_graph(): G.node[5]['weight'] = 4 return G, 14 + if __name__ == "__main__": gs = [create_small_seq_graph(), create_medium_seq_graph(), diff --git a/daliuge-translator/dlg/dropmake/utils/bash_parameter.py b/daliuge-translator/dlg/dropmake/utils/bash_parameter.py index 452d6ac57..5a86f5a6b 100644 --- a/daliuge-translator/dlg/dropmake/utils/bash_parameter.py +++ b/daliuge-translator/dlg/dropmake/utils/bash_parameter.py @@ -23,10 +23,12 @@ inp_regex = re.compile(r'%i\[(-[0-9]+)\]') out_regex = re.compile(r'%o\[(-[0-9]+)\]') + class BashCommand(object): """ An efficient implementation of the bash command with parameters """ + def __init__(self, cmds): """ create the logical form of the bash command line @@ -34,14 +36,14 @@ def __init__(self, cmds): cmds: a list such that ' '.join(cmds) looks something like: 'python /home/dfms/myclean.py -d %i[-21] -f %i[-3] %o[-2] -v' """ - self._input_map = dict() # key: logical drop id, value: a list of physical oids + self._input_map = dict() # key: logical drop id, value: a list of physical oids self._output_map = dict() cmd = ' '.join(cmds) - self._cmds = cmd.replace(';', ' ; ').split() # re-split just in case hidden spaces - #self._cmds = re.split(';| *', cmd) # resplit for * as well as spaces + self._cmds = cmd.replace(';', ' ; ').split() # re-split just in case hidden spaces + # self._cmds = re.split(';| *', cmd) # resplit for * as well as spaces for m in inp_regex.finditer(cmd): - self._input_map[int(m.group(1))] = set() #TODO - check if sequence needs to be reserved! + self._input_map[int(m.group(1))] = set() # TODO - check if sequence needs to be reserved! for m in out_regex.finditer(cmd): self._output_map[int(m.group(1))] = set() @@ -68,12 +70,12 @@ def _get_delimit(matchobj): if (imatch is not None): lgn_id = int(imatch.group(1)) cmds[k] = d.replace(imatch.group(0), - _get_delimit(imatch).\ - join(['%i[{0}]'.format(x) for x in self._input_map[lgn_id]])) + _get_delimit(imatch). \ + join(['%i[{0}]'.format(x) for x in self._input_map[lgn_id]])) elif (omatch is not None): lgn_id = int(omatch.group(1)) cmds[k] = d.replace(omatch.group(0), - _get_delimit(omatch).\ - join(['%o[{0}]'.format(x) for x in self._output_map[lgn_id]])) + _get_delimit(omatch). \ + join(['%o[{0}]'.format(x) for x in self._output_map[lgn_id]])) return ' '.join(cmds) diff --git a/daliuge-translator/dlg/dropmake/utils/heft/base.py b/daliuge-translator/dlg/dropmake/utils/heft/base.py index 0cc3366d2..d80d80787 100644 --- a/daliuge-translator/dlg/dropmake/utils/heft/base.py +++ b/daliuge-translator/dlg/dropmake/utils/heft/base.py @@ -43,14 +43,14 @@ consumes exactly one processor at a time """ -from functools import partial +import itertools as it from collections import namedtuple +from functools import partial from itertools import chain -import itertools as it -import networkx as nx Event = namedtuple('Event', 'task start end') + def reverse_dict(d): """ Reverses direction of dependence dict @@ -61,9 +61,10 @@ def reverse_dict(d): result = {} for key in d: for val in d[key]: - result[val] = result.get(val, tuple()) + (key, ) + result[val] = result.get(val, tuple()) + (key,) return result + def find_task_event(task_name, orders_dict): for event in it.chain.from_iterable(orders_dict.values()): if event.task == task_name: @@ -85,7 +86,7 @@ def cbar(ni, nj, agents, commcost): if a1 != a2) / npairs -def ranku(ni, agents, succ, compcost, commcost): +def ranku(ni, agents, succ, compcost, commcost): """ Rank of task This code is designed to mirror the wikipedia entry. @@ -130,8 +131,8 @@ def find_first_gap(agent_orders, desired_start_time, duration): The gap must be after `desired_start_time` and of length at least `duration`. """ - #TODO change to a "DAG preserved" first gap - #TODO return an infinite large value if the DoP constraint is not met + # TODO change to a "DAG preserved" first gap + # TODO return an infinite large value if the DoP constraint is not met # No tasks: can fit it in whenever the task is ready to run if (agent_orders is None) or (len(agent_orders)) == 0: @@ -175,15 +176,15 @@ def ft(machine): return st(machine) + compcost(task, machine) # 'min()' represents 'earliest' finished time (ft) # this is exactly why the allocation policy is considered greedy! - #TODO the new greediness should be based on "DoP" since all start time will be + # TODO the new greediness should be based on "DoP" since all start time will be # the same (the desired_start_time). Smaller DoP (or bigger leftover) is better agent = min(orders.keys(), key=ft) start = st(agent) end = ft(agent) - #assert(end == start + compcost(task, agent)) + # assert(end == start + compcost(task, agent)) orders[agent].append(Event(task, start, end)) - #orders[agent] = sorted(orders[agent], key=lambda e: e.start) + # orders[agent] = sorted(orders[agent], key=lambda e: e.start) orders[agent].sort(key=lambda e: e.start) # Might be better to use a different data structure to keep each # agent's orders sorted at a lower cost. diff --git a/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py b/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py index 02c364278..45b7da922 100644 --- a/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py +++ b/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py @@ -31,27 +31,30 @@ of one task needed by another between two agents """ -from functools import partial -from collections import namedtuple -from itertools import chain import itertools as it -#import networkx as nx -import numpy as np import sys +from collections import namedtuple +from functools import partial + +# import networkx as nx +import numpy as np Event = namedtuple('Event', 'task start end') -LATEST_STT = sys.maxsize # this should be python2/3 compatible +LATEST_STT = sys.maxsize # this should be python2/3 compatible RES_TYPE_CPU = 1 RES_TYPE_MEM = 2 -#RES_TYPE_IO = 3 +# RES_TYPE_IO = 3 RES_TYPES = [RES_TYPE_CPU, RES_TYPE_MEM] -#RES_TYPES = [RES_TYPE_CPU] + + +# RES_TYPES = [RES_TYPE_CPU] class res_usage(object): """ Resource usage of a particular machine/agent """ + def __init__(self, agent, supply): self.res_types = supply.keys() self.arr = dict() @@ -72,9 +75,9 @@ def can_alloc_task(self, desired_st_time, duration, demand): return True dedt = min(desired_st_time + duration, self.edt) # each timestep should not exceed supply - for k, v in demand.items(): # for each resource type + for k, v in demand.items(): # for each resource type res_arr = self.arr[k] - #TODO use a threshold instead of an outright '0' + # TODO use a threshold instead of an outright '0' if sum(res_arr[desired_st_time:dedt] + v > self.supply[k]) > 0: return False return True @@ -90,10 +93,11 @@ def add_task(self, event, demand): delt = self.edt - res_arr.size res_arr = np.hstack([res_arr, np.zeros(delt)]) res_arr[event.start:event.end] += demand[k] - + for k, v in to_be_updated: self.arr[k] = v + def reverse_dict(d): """ Reverses direction of dependence dict @@ -104,9 +108,10 @@ def reverse_dict(d): result = {} for key in d: for val in d[key]: - result[val] = result.get(val, tuple()) + (key, ) + result[val] = result.get(val, tuple()) + (key,) return result + def find_task_event(task_name, orders_dict): for event in it.chain.from_iterable(orders_dict.values()): if event.task == task_name: @@ -128,7 +133,7 @@ def cbar(ni, nj, agents, commcost): if a1 != a2) / npairs -def ranku(ni, agents, succ, compcost, commcost): +def ranku(ni, agents, succ, compcost, commcost): """ Rank of task This code is designed to mirror the wikipedia entry. @@ -174,8 +179,8 @@ def find_first_gap(agent_orders, desired_start_time, duration, The gap must be after `desired_start_time` and of length at least `duration`. """ - #TODO change to a "DAG preserved" first gap - #TODO return an infinite large value if the DoP constraint is not met + # TODO change to a "DAG preserved" first gap + # TODO return an infinite large value if the DoP constraint is not met # No tasks: can fit it in whenever the task is ready to run if (agent_orders is None) or (len(agent_orders)) == 0: @@ -230,18 +235,18 @@ def ft(machine): return st(machine) + compcost(task, machine) # 'min()' represents 'earliest' finished time (ft) # this is exactly why the allocation policy is considered greedy! - #TODO the new greediness should be based on "DoP" since all start time will be + # TODO the new greediness should be based on "DoP" since all start time will be # the same (the desired_start_time). Smaller DoP (or bigger leftover) is better agent = min(orders.keys(), key=ft) start = st(agent) if (start == LATEST_STT): raise Exception('No sufficient resources to run task {0}'.format(task)) end = ft(agent) - #assert(end == start + compcost(task, agent)) + # assert(end == start + compcost(task, agent)) new_event = Event(task, start, end) orders[agent].append(new_event) - #orders[agent] = sorted(orders[agent], key=lambda e: e.start) + # orders[agent] = sorted(orders[agent], key=lambda e: e.start) orders[agent].sort(key=lambda e: e.start) # Might be better to use a different data structure to keep each # agent's orders sorted at a lower cost. diff --git a/daliuge-translator/dlg/dropmake/utils/heft/test.py b/daliuge-translator/dlg/dropmake/utils/heft/test.py index faca960a9..e1dafbd23 100644 --- a/daliuge-translator/dlg/dropmake/utils/heft/test.py +++ b/daliuge-translator/dlg/dropmake/utils/heft/test.py @@ -1,5 +1,5 @@ -from dlg_heft import Event, cbar, ranku, schedule, \ -start_time, wbar, makespan, RES_TYPES +from dlg_heft import schedule, \ + makespan, RES_TYPES """ This is a simple script to use the HEFT function provided based on the example given in the original HEFT paper. @@ -16,7 +16,6 @@ {1: 'c', 4: 'b', 3: 'c', 2: 'c', 5: 'c', 6: 'a', 9: 'b', 7: 'c', 8: 'a', 10: 'b'} """ - dag = {1: (2, 3, 4, 5, 6), 2: (8, 9), 3: (7,), @@ -28,139 +27,142 @@ 9: (10,), 10: ()} + def setup_capacity(agents): ac = dict() for i, a in enumerate(agents): supply = {} for j, res in enumerate(RES_TYPES): supply[res] = (8 + j) * (i + 1) - #print(supply) + # print(supply) ac[a] = supply - #print('all capacity', ac) + # print('all capacity', ac) return ac + def setup_workload(tasks): wl = dict() for i, t in enumerate(tasks): demand = {} for j, res in enumerate(RES_TYPES): demand[res] = (1 + j) * (i + 1) - #print(demand) + # print(demand) wl[t] = demand return wl + def compcost(task, agent): if (task == 1): - if(agent == 'a'): + if (agent == 'a'): return 14 - elif(agent == 'b'): + elif (agent == 'b'): return 16 else: return 9 if (task == 2): - if(agent == 'a'): + if (agent == 'a'): return 13 - elif(agent == 'b'): + elif (agent == 'b'): return 19 else: return 18 if (task == 3): - if(agent == 'a'): + if (agent == 'a'): return 11 - elif(agent == 'b'): + elif (agent == 'b'): return 13 else: return 19 if (task == 4): - if(agent == 'a'): + if (agent == 'a'): return 13 - elif(agent == 'b'): + elif (agent == 'b'): return 8 else: return 17 if (task == 5): - if(agent == 'a'): + if (agent == 'a'): return 12 - elif(agent == 'b'): + elif (agent == 'b'): return 13 else: return 10 if (task == 6): - if(agent == 'a'): + if (agent == 'a'): return 13 - elif(agent == 'b'): + elif (agent == 'b'): return 16 else: return 9 if (task == 7): - if(agent == 'a'): + if (agent == 'a'): return 7 - elif(agent == 'b'): + elif (agent == 'b'): return 15 else: return 11 if (task == 8): - if(agent == 'a'): + if (agent == 'a'): return 5 - elif(agent == 'b'): + elif (agent == 'b'): return 11 else: return 14 if (task == 9): - if(agent == 'a'): + if (agent == 'a'): return 18 - elif(agent == 'b'): + elif (agent == 'b'): return 12 else: return 20 if (task == 10): - if(agent == 'a'): + if (agent == 'a'): return 21 - elif(agent == 'b'): + elif (agent == 'b'): return 7 else: return 16 def commcost(ni, nj, A, B): - - if(A == B): + if (A == B): return 0 else: - if(ni == 1 and nj == 2): + if (ni == 1 and nj == 2): return 18 - if(ni == 1 and nj == 3): + if (ni == 1 and nj == 3): return 12 - if(ni == 1 and nj == 4): + if (ni == 1 and nj == 4): return 9 - if(ni == 1 and nj == 5): + if (ni == 1 and nj == 5): return 11 - if(ni == 1 and nj == 6): + if (ni == 1 and nj == 6): return 14 - if(ni == 2 and nj == 8): + if (ni == 2 and nj == 8): return 19 - if(ni == 2 and nj == 9): + if (ni == 2 and nj == 9): return 16 - if(ni == 3 and nj == 7): + if (ni == 3 and nj == 7): return 23 - if(ni == 4 and nj == 8): + if (ni == 4 and nj == 8): return 27 - if(ni == 4 and nj == 9): + if (ni == 4 and nj == 9): return 23 - if(ni == 5 and nj == 9): + if (ni == 5 and nj == 9): return 13 - if(ni == 6 and nj == 8): + if (ni == 6 and nj == 8): return 15 - if(ni == 7 and nj == 10): + if (ni == 7 and nj == 10): return 17 - if(ni == 8 and nj == 10): + if (ni == 8 and nj == 10): return 11 - if(ni == 9 and nj == 10): + if (ni == 9 and nj == 10): return 13 else: return 0 + agents = 'abc' cpct = setup_capacity(agents) wkld = setup_workload(dag.keys()) diff --git a/daliuge-translator/dlg/dropmake/utils/mcts.py b/daliuge-translator/dlg/dropmake/utils/mcts.py index 75cffc517..16dc2b320 100644 --- a/daliuge-translator/dlg/dropmake/utils/mcts.py +++ b/daliuge-translator/dlg/dropmake/utils/mcts.py @@ -35,9 +35,10 @@ """ import time -from random import choice -from math import log, sqrt from collections import defaultdict +from math import log, sqrt +from random import choice + class DAGTree(object): """ @@ -85,7 +86,7 @@ def payout(self, state_history): # convert '98760' to [9, 8, 7, 6, 0] x = [int(ii) for ii in list(state_history[-1][:])] # print x - if (len(x) < leng): #padding + if (len(x) < leng): # padding x += [3] * (leng - len(x)) stuff = self._scheduler._partition_G(G, x) @@ -115,15 +116,16 @@ def latest_state(self, state_history): else: return None + class MCTS(object): def __init__(self, dag_tree, calculation_time=30, max_moves=1000, factor=1.4): self._dag_tree = dag_tree self._calc_time = calculation_time self._max_moves = max_moves self._states = [] - #self._dag_tree.append_state(self._states, init_state) - self.scores = defaultdict(int)#{} # key: state, value: score - self.plays = defaultdict(int)#{} # key: state, value: count + # self._dag_tree.append_state(self._states, init_state) + self.scores = defaultdict(int) # {} # key: state, value: score + self.plays = defaultdict(int) # {} # key: state, value: count self.max_depth = 0 # Exploration constant, increase for more exploratory moves, # decrease to prefer moves with known higher win rates. @@ -137,8 +139,8 @@ def run(self): leng = self._dag_tree._leng while (len(state) < leng): m, state = self.next_move() - #print "max_depth = {0}, state: {1}".format(self.max_depth, state) - #print "max_depth = {0}".format(self.max_depth) + # print "max_depth = {0}, state: {1}".format(self.max_depth, state) + # print "max_depth = {0}".format(self.max_depth) return [int(ii) for ii in list(state)] def next_move(self): @@ -166,7 +168,7 @@ def next_move(self): num_moves = nm move = p new_state = S - #print overall_payout, num_moves, move, new_state + # print overall_payout, num_moves, move, new_state self.update(new_state) return (move, new_state) @@ -219,7 +221,7 @@ def simulate_moves(self): scores[state] += payout ps = self._dag_tree.parent_state(state) while (ps is not None): - #print plays + # print plays plays[ps] += 1 scores[ps] += payout ps = self._dag_tree.parent_state(ps) diff --git a/daliuge-translator/dlg/dropmake/web/Inspector_test.css b/daliuge-translator/dlg/dropmake/web/Inspector_test.css index bc1c80c58..cbb08cba8 100644 --- a/daliuge-translator/dlg/dropmake/web/Inspector_test.css +++ b/daliuge-translator/dlg/dropmake/web/Inspector_test.css @@ -3,23 +3,23 @@ see also: inspector.js, inspector.html */ - .inspector-container { +.inspector-container { color: #FDFDFD; background-color: #272625; /*width: 200px;*/ /* chen.wu */ padding: 2px; height: 480px; - } +} - .make-inline { +.make-inline { display: inline; - } +} - * { +* { font-family: helvetica; - } +} - .inspector { +.inspector { margin: 2px; font: 12px helvetica, sans-serif; @@ -33,124 +33,126 @@ -khtml-user-select: none; -ms-user-select: none; cursor: default; - } +} - .inspector-container select { +.inspector-container select { border: 0px; width: 100%; - } +} - .inspector input { +.inspector input { background-color: #202020; color: #F5F5F5; border: 0px; - } - .inspector input:focus { +} + +.inspector input:focus { color: #FDFDFD; - } +} - .inspector input:disabled { - color: #7B7B7B;; /* gray-blue */ - } +.inspector input:disabled { + color: #7B7B7B;; /* gray-blue */ +} - .inspector select { +.inspector select { background-color: #202020; color: #F5F5F5; border: 0px; - } - .inspector select:focus { +} + +.inspector select:focus { color: #FDFDFD; - } +} - .row { +.row { margin-bottom: 2px; - } +} - .cell { +.cell { display: inline-block; width: 50%; text-align: right; - } +} - .right-align { +.right-align { text-align: right; - } +} - .input-short { +.input-short { width: 40px; text-indent: 1px; text-align: center; - } +} - .input-long { +.input-long { width: 82%; text-indent: 1px; text-align: left; /* chen.wu */ - } +} - .inspector-nullable input[type=text]{ +.inspector-nullable input[type=text] { width: 165px; - } +} - .inspector-n-field-label { +.inspector-n-field-label { margin-right: 5px; margin-bottom: 5px; - } +} - .inspector-button-container { +.inspector-button-container { margin: 6px; text-align: center; - } +} - .inspector-button-container input { +.inspector-button-container input { margin: 2px; font-size: 100%; - } +} - .inspector-group { +.inspector-group { padding: 1px 3px 1px 3px; /*border: 1px solid red; /* DEBUG */ border-top: 2px solid #272625; /* dark gray */ - } +} - .inspector-group select { +.inspector-group select { width: 50%; - } +} - .inspector-group label { +.inspector-group label { - } +} - .inspector-section { +.inspector-section { background-color: #333; - } +} - .inspector-container h3, .inspector-container h2 { +.inspector-container h3, .inspector-container h2 { background-color: #272625; padding: 1px; margin: 0; - } +} - .inspector-container h3 { +.inspector-container h3 { font-size: 14px; margin-top: 2px; - } +} - .inspector-container h2 { +.inspector-container h2 { font-size: 18px; - } +} - label.property-name { +label.property-name { width: 60px; margin-right: 5px; font-weight: bold; /*display: inline-block;*/ text-align: left; /* chen.wu */ - } +} - .spectrum-control { +.spectrum-control { border: 0px; background: none; - } +} diff --git a/daliuge-translator/dlg/dropmake/web/Inspector_test.js b/daliuge-translator/dlg/dropmake/web/Inspector_test.js index d47e93429..6eb2508fb 100644 --- a/daliuge-translator/dlg/dropmake/web/Inspector_test.js +++ b/daliuge-translator/dlg/dropmake/web/Inspector_test.js @@ -27,833 +27,837 @@ */ function Inspector(divid, diagram, options) { - this.inspectedProps = {}; - // assume coll is a single object for now TODO fix this, - // which means looking at every use of this.collection - this.collection = null; - this.tracked = null; // map of all tracked properties, set in showObjectProperties and used in rebuildViews - this.diagram = diagram; - - this.acceptButton = !!options['acceptButton']; - this.resetButton = !!options['resetButton']; - this.acceptFocus = !!options['acceptFocus']; - this.inspectPredicate = options['inspectPredicate'] || null; - this.propertyNames = options['propertyNames'] || null; - - /* -
    - -
    -
    -
    - */ - var div = document.getElementById(divid); - div.className = "inspector-container"; - var chooser = document.createElement("select"); - div.appendChild(chooser); - var mainDiv = document.createElement("div"); - mainDiv.className = "inspector"; - div.appendChild(mainDiv); - var acceptResetDiv = document.createElement("div"); - acceptResetDiv.className = "inspector-button-container"; - div.appendChild(acceptResetDiv); - - this.div = mainDiv; - this.acceptResetDiv = acceptResetDiv; - this.chooser = chooser; - this.lastIndex = 0; - - var self = this; - var pred = this.inspectPredicate; - - diagram.addDiagramListener('ChangedSelection', function(e) { - var graphObjects = []; - var selection = myDiagram.selection.first(); - if (selection === null) { - self.toggleVisibility(false); - return; - } - self.toggleVisibility(true); + this.inspectedProps = {}; + // assume coll is a single object for now TODO fix this, + // which means looking at every use of this.collection + this.collection = null; + this.tracked = null; // map of all tracked properties, set in showObjectProperties and used in rebuildViews + this.diagram = diagram; + + this.acceptButton = !!options['acceptButton']; + this.resetButton = !!options['resetButton']; + this.acceptFocus = !!options['acceptFocus']; + this.inspectPredicate = options['inspectPredicate'] || null; + this.propertyNames = options['propertyNames'] || null; + + /* +
    + +
    +
    +
    + */ + var div = document.getElementById(divid); + div.className = "inspector-container"; + var chooser = document.createElement("select"); + div.appendChild(chooser); + var mainDiv = document.createElement("div"); + mainDiv.className = "inspector"; + div.appendChild(mainDiv); + var acceptResetDiv = document.createElement("div"); + acceptResetDiv.className = "inspector-button-container"; + div.appendChild(acceptResetDiv); + + this.div = mainDiv; + this.acceptResetDiv = acceptResetDiv; + this.chooser = chooser; + this.lastIndex = 0; + + var self = this; + var pred = this.inspectPredicate; + + diagram.addDiagramListener('ChangedSelection', function (e) { + var graphObjects = []; + var selection = myDiagram.selection.first(); + if (selection === null) { + self.toggleVisibility(false); + return; + } + self.toggleVisibility(true); - if (self.propertyNames !== null) { - self.populatePropertyNames(graphObjects, pred, selection); // NYI - } else { - self.populateDefault(graphObjects, pred, selection); - } + if (self.propertyNames !== null) { + self.populatePropertyNames(graphObjects, pred, selection); // NYI + } else { + self.populateDefault(graphObjects, pred, selection); + } - chooser.innerHTML = ''; - for (var i = 0; i < graphObjects.length; i++) { - var option = document.createElement('option'); - option.value = i; - option.text = graphObjects[i] instanceof go.GraphObject ? graphObjects[i].toString() : 'Drop'; - chooser.appendChild(option); - } + chooser.innerHTML = ''; + for (var i = 0; i < graphObjects.length; i++) { + var option = document.createElement('option'); + option.value = i; + option.text = graphObjects[i] instanceof go.GraphObject ? graphObjects[i].toString() : 'Drop'; + chooser.appendChild(option); + } - chooser.onchange = function() { - var index = this.selectedIndex; - if (self.propertyNames !== null) { - self.change(selection); - } else { - self.change(graphObjects[index]); - } - self.lastIndex = index; - } + chooser.onchange = function () { + var index = this.selectedIndex; + if (self.propertyNames !== null) { + self.change(selection); + } else { + self.change(graphObjects[index]); + } + self.lastIndex = index; + } - var useLastIndex = self.lastIndex <= (graphObjects.length -1); - if (self.propertyNames !== null) { - self.change(selection); - } else { - self.change(graphObjects[useLastIndex ? self.lastIndex : 0]); - } - if (useLastIndex) chooser.value = self.lastIndex; - // if the index was from the lastIndex than we need to update the chooser - }); - - // accept focus option = commit when clicking away from the div: - if (this.acceptFocus) { - div.tabIndex = 3; // div must be allowed focus - // must use focusout instead of blur - blur does not bubble, - // so clicking on an inside the div and then clicking away - // will not fire an event with blur, and it will will focusout - div.addEventListener('focusout', function(e) { - self.setAllProperties(); + var useLastIndex = self.lastIndex <= (graphObjects.length - 1); + if (self.propertyNames !== null) { + self.change(selection); + } else { + self.change(graphObjects[useLastIndex ? self.lastIndex : 0]); + } + if (useLastIndex) chooser.value = self.lastIndex; + // if the index was from the lastIndex than we need to update the chooser }); - } - this.toggleVisibility(false); + // accept focus option = commit when clicking away from the div: + if (this.acceptFocus) { + div.tabIndex = 3; // div must be allowed focus + // must use focusout instead of blur - blur does not bubble, + // so clicking on an inside the div and then clicking away + // will not fire an event with blur, and it will will focusout + div.addEventListener('focusout', function (e) { + self.setAllProperties(); + }); + } + + this.toggleVisibility(false); } // end Inspector constructor // Populate the selection box with all GraphObjects inside a node, plus its part.data -Inspector.prototype.populateDefault = function(graphObjects, pred, selection) { - if (pred === null || pred(selection)) { - graphObjects.push(selection); - } - var recurseDownPanels = function(element) { - if (element instanceof go.Panel) { - var elements = element.elements; - while(elements.next()) { - var val = elements.value; - if (pred === null || pred(val)) { - graphObjects.push(val); +Inspector.prototype.populateDefault = function (graphObjects, pred, selection) { + if (pred === null || pred(selection)) { + graphObjects.push(selection); + } + var recurseDownPanels = function (element) { + if (element instanceof go.Panel) { + var elements = element.elements; + while (elements.next()) { + var val = elements.value; + if (pred === null || pred(val)) { + graphObjects.push(val); + } + recurseDownPanels(val); + } } - recurseDownPanels(val); - } } - } - recurseDownPanels(selection); - if (pred === null || pred(selection.data)) { - graphObjects.push(selection.data); - } + recurseDownPanels(selection); + if (pred === null || pred(selection.data)) { + graphObjects.push(selection.data); + } } // populate based on this.propertyNames -Inspector.prototype.populatePropertyNames = function(graphObjects, pred, selection) { - graphObjects.push(this.propertyNames); +Inspector.prototype.populatePropertyNames = function (graphObjects, pred, selection) { + graphObjects.push(this.propertyNames); } -Inspector.prototype.change = function(graphObject) { - this.inspectedProps = {}; - this.setCollection(graphObject); - this.showObjectProperties(graphObject); +Inspector.prototype.change = function (graphObject) { + this.inspectedProps = {}; + this.setCollection(graphObject); + this.showObjectProperties(graphObject); } -Inspector.prototype.toggleVisibility = function(visible) { - this.div.style.display = visible ? "block" : "none"; - this.acceptResetDiv.style.display = visible ? "block" : "none"; - this.chooser.style.display = visible ? "block" : "none"; +Inspector.prototype.toggleVisibility = function (visible) { + this.div.style.display = visible ? "block" : "none"; + this.acceptResetDiv.style.display = visible ? "block" : "none"; + this.chooser.style.display = visible ? "block" : "none"; } // coll = collection of objects (JavaScript Objects, GraphObjects, Parts, etc) // assumes coll is a single object for now -Inspector.prototype.setCollection = function(coll) { - this.collection = coll; +Inspector.prototype.setCollection = function (coll) { + this.collection = coll; } -Inspector.prototype.rebuildViews = function() { - // clear any old spectrum controls that were bound to old inputs - var spectrums = document.getElementsByClassName("sp-container"); - while (spectrums.length !== 0) document.body.removeChild(spectrums[0]); - var div = this.div; - div.innerHTML = ''; - this.acceptResetDiv.innerHTML = ''; - var trackedList = Object.keys(this.tracked); - for (var i = 0; i < trackedList.length; i++ ) { - var section = Inspector.createSection(trackedList[i]); - var inspectedProps = this.tracked[trackedList[i]]; - for (var j = 0; j < inspectedProps.length; j++) { - var propname = inspectedProps[j]; - var view = this.inspectedProps[propname]; - if (view.visible !== true) continue; - - section.appendChild(view.getDOM()); - var coll = this.collection; - var group = view.dom; - var label = group.label || group.children[0]; - // optionally, sanitize property name into something human readable - var camelCaseConverter = function(str) { - var words = str.match(/[A-Za-z0-9][a-z]*/g); - words = words.filter(function(str) { // the checkbox is clear enough the property is a bool - return str !== "is"; - }); - return words.map(function(str) { - if (str.length === 0) return str; - else if (str.length === 1) return str.toUpperCase(); - else return str.substring(0,1).toUpperCase() + str.substring(1); - }).join(" "); - } - label.textContent = propname; //camelCaseConverter(propname); - - var input = group.children[1]; - if (view.options.readOnly) { - for (var k = 0; k < group.children.length; k++) { - group.children[k].disabled = true; +Inspector.prototype.rebuildViews = function () { + // clear any old spectrum controls that were bound to old inputs + var spectrums = document.getElementsByClassName("sp-container"); + while (spectrums.length !== 0) document.body.removeChild(spectrums[0]); + var div = this.div; + div.innerHTML = ''; + this.acceptResetDiv.innerHTML = ''; + var trackedList = Object.keys(this.tracked); + for (var i = 0; i < trackedList.length; i++) { + var section = Inspector.createSection(trackedList[i]); + var inspectedProps = this.tracked[trackedList[i]]; + for (var j = 0; j < inspectedProps.length; j++) { + var propname = inspectedProps[j]; + var view = this.inspectedProps[propname]; + if (view.visible !== true) continue; + + section.appendChild(view.getDOM()); + var coll = this.collection; + var group = view.dom; + var label = group.label || group.children[0]; + // optionally, sanitize property name into something human readable + var camelCaseConverter = function (str) { + var words = str.match(/[A-Za-z0-9][a-z]*/g); + words = words.filter(function (str) { // the checkbox is clear enough the property is a bool + return str !== "is"; + }); + return words.map(function (str) { + if (str.length === 0) return str; + else if (str.length === 1) return str.toUpperCase(); + else return str.substring(0, 1).toUpperCase() + str.substring(1); + }).join(" "); + } + label.textContent = propname; //camelCaseConverter(propname); + + var input = group.children[1]; + if (view.options.readOnly) { + for (var k = 0; k < group.children.length; k++) { + group.children[k].disabled = true; + } + } + + var type = view.getType(); + if (type === "Point" || type === "Size" || type === "Margin" || type === "Rect" || type == "Spot") { + view.originalValue = view.getter(propname).copy(); + } else { + var input; + if (type === "Brush" || type === "boolean") input = group; + else input = group.children[1]; + view.originalValue = input.value; + } + + var val = ""; + if (coll !== null) val = view.getter(propname); + view.inferredType = (typeof val); // number, boolean, function, object + if (val === undefined) val = ""; + else if (val === "(null)") { + view.nullCheckBox.checked = true; + } else { + if (view.nullCheckBox) view.nullCheckBox.checked = false; + } + view.populate(val); + } - } - - var type = view.getType(); - if (type === "Point" || type === "Size" || type === "Margin" || type === "Rect" || type == "Spot") { - view.originalValue = view.getter(propname).copy(); - } else { - var input; - if (type === "Brush" || type === "boolean") input = group; - else input = group.children[1]; - view.originalValue = input.value; - } - - var val = ""; - if (coll !== null) val = view.getter(propname); - view.inferredType = (typeof val); // number, boolean, function, object - if (val === undefined) val = ""; - else if (val === "(null)") { - view.nullCheckBox.checked = true; - } else { - if (view.nullCheckBox) view.nullCheckBox.checked = false; - } - view.populate(val); + div.appendChild(section); + } + var self = this; + if (this.acceptButton) { + this.buildButton("Accept", function () { + self.setAllProperties(); + self.rebuildViews(); + }); } - div.appendChild(section); - } - - var self = this; - if (this.acceptButton) { - this.buildButton("Accept", function() { - self.setAllProperties(); - self.rebuildViews(); - }); - } - if (this.resetButton) { - this.buildButton("Reset", function(){ - self.rebuildViews(); - }); - } + if (this.resetButton) { + this.buildButton("Reset", function () { + self.rebuildViews(); + }); + } } -Inspector.prototype.buildButton = function(text, clickFunction) { - var viewName = text + "View"; - if (this[viewName] === undefined) { - var button = document.createElement("input"); - button.type = "button"; - button.value = text; - button.addEventListener("click", clickFunction); - this.viewName = button; - } - this.acceptResetDiv.appendChild(this.viewName); +Inspector.prototype.buildButton = function (text, clickFunction) { + var viewName = text + "View"; + if (this[viewName] === undefined) { + var button = document.createElement("input"); + button.type = "button"; + button.value = text; + button.addEventListener("click", clickFunction); + this.viewName = button; + } + this.acceptResetDiv.appendChild(this.viewName); } -Inspector.prototype.setAllProperties = function() { - var coll = this.collection; - if (coll === null) return; - var diagram = this.diagram; - if (diagram === null) return; - var inspectedProps = this.inspectedProps; - var transactionName = 'set all properties'; - diagram.startTransaction(transactionName); - for (var k in inspectedProps) { - var view = inspectedProps[k]; - if (view.setter === null || view.options.readOnly) continue; - // don't set values that have not changed - var val = view.isNull() ? null : view.use(this); - if (view.originalValue === val) continue; - if (val instanceof go.Point || val instanceof go.Size || val instanceof go.Spot || - val instanceof go.Rect || val instanceof go.Margin) { - if (view.originalValue.equals(val)) continue; +Inspector.prototype.setAllProperties = function () { + var coll = this.collection; + if (coll === null) return; + var diagram = this.diagram; + if (diagram === null) return; + var inspectedProps = this.inspectedProps; + var transactionName = 'set all properties'; + diagram.startTransaction(transactionName); + for (var k in inspectedProps) { + var view = inspectedProps[k]; + if (view.setter === null || view.options.readOnly) continue; + // don't set values that have not changed + var val = view.isNull() ? null : view.use(this); + if (view.originalValue === val) continue; + if (val instanceof go.Point || val instanceof go.Size || val instanceof go.Spot || + val instanceof go.Rect || val instanceof go.Margin) { + if (view.originalValue.equals(val)) continue; + } + view.setter(diagram, view, k, val); } - view.setter(diagram, view, k, val); - } - diagram.commitTransaction(transactionName); - //alert(diagram.model.toJson()); + diagram.commitTransaction(transactionName); + //alert(diagram.model.toJson()); } -Inspector.prototype.createProperty = function(propname, options, object) { - // assume propname to be unique, create it if it does not exist - // right now this clobbers the old View if it existed before - var inspectedProps = this.inspectedProps; - var view = new View(object, options); - inspectedProps[propname] = view; - view.name = propname; +Inspector.prototype.createProperty = function (propname, options, object) { + // assume propname to be unique, create it if it does not exist + // right now this clobbers the old View if it existed before + var inspectedProps = this.inspectedProps; + var view = new View(object, options); + inspectedProps[propname] = view; + view.name = propname; } // create it if it doesn't exist, then append -Inspector.prototype.appendProperty = function(propname, options, object) { - var inspectedProps = this.inspectedProps; - this.createProperty(propname, options, object); - inspectedProps[propname].visible = true; +Inspector.prototype.appendProperty = function (propname, options, object) { + var inspectedProps = this.inspectedProps; + this.createProperty(propname, options, object); + inspectedProps[propname].visible = true; } -Inspector.prototype.hideAllProperties = function() { - var inspectedProps = this.inspectedProps; - for (var propname in inspectedProps) { - inspectedProps[propname].visible = false; - } +Inspector.prototype.hideAllProperties = function () { + var inspectedProps = this.inspectedProps; + for (var propname in inspectedProps) { + inspectedProps[propname].visible = false; + } } // Show all the relevant properties for a given object // If the object is a GoJS object it will look at the Type._inspectedProperties and show those -Inspector.prototype.showObjectProperties = function(obj) { - this.hideAllProperties(); - if (obj === null) return; // no object to show - this.tracked = {}; - // TODO: Allow arbitrary objects later, or objects where _inspectedProperties is not defined - // this will go through them, ie Node Part Panel GraphObject (in that order) - var proto = Object.getPrototypeOf(obj); - //alert(proto.constructor === Object); - - - if(this.propertyNames !== null) { // given list of property names - var propertyNames = this.propertyNames; - var node = this.collection; - for (var k in propertyNames) { - if (go[k] !== undefined && go[k]['_inspectedProperties'] !== undefined) { - // it's Node/Panel/GraphObject/etc, populate the names in the list - var name = k; - var section = Inspector.createSection(name); - this.tracked[name] = []; - var props = propertyNames[k]; - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - - // Find property options - var options = null; - while (options === null && proto && proto.constructor !== Object) { - if (proto.constructor._inspectedProperties[prop]) options = proto.constructor._inspectedProperties[prop]; - proto = Object.getPrototypeOf(proto); - } - this.tracked[name].push(prop); - this.appendProperty(prop, options, obj); +Inspector.prototype.showObjectProperties = function (obj) { + this.hideAllProperties(); + if (obj === null) return; // no object to show + this.tracked = {}; + // TODO: Allow arbitrary objects later, or objects where _inspectedProperties is not defined + // this will go through them, ie Node Part Panel GraphObject (in that order) + var proto = Object.getPrototypeOf(obj); + //alert(proto.constructor === Object); + + + if (this.propertyNames !== null) { // given list of property names + var propertyNames = this.propertyNames; + var node = this.collection; + for (var k in propertyNames) { + if (go[k] !== undefined && go[k]['_inspectedProperties'] !== undefined) { + // it's Node/Panel/GraphObject/etc, populate the names in the list + var name = k; + var section = Inspector.createSection(name); + this.tracked[name] = []; + var props = propertyNames[k]; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + + // Find property options + var options = null; + while (options === null && proto && proto.constructor !== Object) { + if (proto.constructor._inspectedProperties[prop]) options = proto.constructor._inspectedProperties[prop]; + proto = Object.getPrototypeOf(proto); + } + this.tracked[name].push(prop); + this.appendProperty(prop, options, obj); + } + } else { + // Is it a findObject "#name"? Test each and populate + var name = k.substr(1); // remove the # + var obj = node.findObject(name); + if (obj === null) continue; + var section = Inspector.createSection(name); + this.tracked[name] = []; + var props = propertyNames[k]; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + this.tracked[name].push(prop); + this.appendProperty(prop, { /* empty options */}, obj); + } + } } - } else { - // Is it a findObject "#name"? Test each and populate - var name = k.substr(1); // remove the # - var obj = node.findObject(name); - if (obj === null) continue; + + } else if (proto.constructor === Object) { // arbitrary JS Object (for the Part.data) + var name = 'data'; + var gok = { + '__gohashid': 1, 'loc': 1, 'isGroup': 1, 'group': 1, + 'fromPort': 1, 'toPort': 1, 'points': 1, 'visible': 1, + 'columnDefinitions': 1, 'var_list': 1 + }; + //gok[] = 1; + var go_readonly = {'key': 1, 'category': 1, 'from': 1, 'to': 1}; + var section = Inspector.createSection(name); this.tracked[name] = []; - var props = propertyNames[k]; - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - this.tracked[name].push(prop); - this.appendProperty(prop, { /* empty options */ }, obj); + for (var prop in obj) { + if (prop in gok) { + continue; + } + //alert(prop); + var options = {setter: View.defaultDataSetter}; + /* + if (prop === 'category') { + options['type'] = "String"; + options['readOnly'] = true; + } + */ + if (prop in go_readonly) { + options['readOnly'] = true; + } + this.tracked[name].push(prop); + //alert(obj[prop]); + //alert(this.collection); + this.appendProperty(prop, options, this.collection); + //this.appendProperty(prop, options, obj[prop]); + } + } else { // GoJS object + while (proto && proto.constructor !== Object) { + var props = proto.constructor._inspectedProperties; + // toString often produces strings such as: Class("someInfo")#ID + // We want the name to be just the Class. + var name = (new proto.constructor().toString()).split('#')[0].split('(')[0]; + var section = Inspector.createSection(name); + this.tracked[name] = []; + for (var x in props) { + this.tracked[name].push(x); + this.appendProperty(x, props[x], this.collection); + } + proto = Object.getPrototypeOf(proto); } - } - } - - } else if (proto.constructor === Object) { // arbitrary JS Object (for the Part.data) - var name = 'data'; - var gok = {'__gohashid':1, 'loc':1, 'isGroup':1, 'group':1, - 'fromPort':1, 'toPort':1, 'points':1, 'visible':1, - 'columnDefinitions':1, 'var_list':1}; - //gok[] = 1; - var go_readonly = {'key':1, 'category':1, 'from':1, 'to':1}; - - var section = Inspector.createSection(name); - this.tracked[name] = []; - for (var prop in obj) { - if (prop in gok) { - continue; - } - //alert(prop); - var options = { setter: View.defaultDataSetter }; - /* - if (prop === 'category') { - options['type'] = "String"; - options['readOnly'] = true; - } - */ - if (prop in go_readonly) { - options['readOnly'] = true; - } - this.tracked[name].push(prop); - //alert(obj[prop]); - //alert(this.collection); - this.appendProperty(prop, options, this.collection); - //this.appendProperty(prop, options, obj[prop]); - } - } else { // GoJS object - while (proto && proto.constructor !== Object) { - var props = proto.constructor._inspectedProperties; - // toString often produces strings such as: Class("someInfo")#ID - // We want the name to be just the Class. - var name = (new proto.constructor().toString()).split('#')[0].split('(')[0]; - var section = Inspector.createSection(name); - this.tracked[name] = []; - for (var x in props) { - this.tracked[name].push(x); - this.appendProperty(x, props[x], this.collection); - } - proto = Object.getPrototypeOf(proto); } - } - this.rebuildViews(); + this.rebuildViews(); } // node, part, panel, graphobject properties -Inspector.createSection = function(name) { - var div = document.createElement("div"); - div.className = "inspector-section"; - var h3 = document.createElement("h3"); - //h3.innerHTML = name + " Properties"; chen.wu - h3.innerHTML = "DROP Parameters"; - div.appendChild(h3); - return div; +Inspector.createSection = function (name) { + var div = document.createElement("div"); + div.className = "inspector-section"; + var h3 = document.createElement("h3"); + //h3.innerHTML = name + " Properties"; chen.wu + h3.innerHTML = "DROP Parameters"; + div.appendChild(h3); + return div; } /** -* View -* object: usually the this.collection/Node -*/ + * View + * object: usually the this.collection/Node + */ function View(object, options) { - options = options || {}; - - this.options = options; - this.getter = options.getter || View.defaultGetter; - this.setter = options.setter || View.defaultSetter; - this.inialized = false; - this.visible = true; - this.dom = null; - this.originalValue = null; - this.object = object; + options = options || {}; + + this.options = options; + this.getter = options.getter || View.defaultGetter; + this.setter = options.setter || View.defaultSetter; + this.inialized = false; + this.visible = true; + this.dom = null; + this.originalValue = null; + this.object = object; } -View.prototype.getDOM = function() { - if (!this.inialized) { - this.dom = this.initialize(); - this.inialized = true; - } - return this.dom; +View.prototype.getDOM = function () { + if (!this.inialized) { + this.dom = this.initialize(); + this.inialized = true; + } + return this.dom; } -View.prototype.getType = function() { - return this.options.type || this.inferredType; +View.prototype.getType = function () { + return this.options.type || this.inferredType; } -View.prototype.isNullable = function() { - // check to see if the object was specifically set to nullable in the metadata - if (this.options.nullable) return true; - var type = this.getType(); - if (go[type] !== undefined) { - return !!go[type].nullable; - } - return false; // not nullable by default +View.prototype.isNullable = function () { + // check to see if the object was specifically set to nullable in the metadata + if (this.options.nullable) return true; + var type = this.getType(); + if (go[type] !== undefined) { + return !!go[type].nullable; + } + return false; // not nullable by default } -View.prototype.isNull = function() { - return this.isNullable() && (this.nullCheckBox && this.nullCheckBox.checked); +View.prototype.isNull = function () { + return this.isNullable() && (this.nullCheckBox && this.nullCheckBox.checked); } // Returns a div with a label or null checkbox -View.prototype.makeInspectorGroup = function() { - var div = document.createElement("div"); - div.className = "inspector-group"; - var label = document.createElement("label"); - label.textContent = "LABEL"; - label.className = "property-name"; - - var appendElement = label; - if (this.isNullable()) { - div.className += " inspector-nullable"; - var span = document.createElement("span"); - span.appendChild(label); - var nullLabel = document.createElement("label"); - var nullText = document.createElement("span"); - nullText.textContent = "Null?"; - var nullCheckBox = document.createElement("input"); - nullCheckBox.type = "checkbox"; - nullLabel.appendChild(nullCheckBox); - nullLabel.appendChild(nullText); - span.appendChild(nullLabel); - appendElement = span; - this.nullCheckBox = nullCheckBox; - } - div.appendChild(appendElement); - div.label = label; - return div; +View.prototype.makeInspectorGroup = function () { + var div = document.createElement("div"); + div.className = "inspector-group"; + var label = document.createElement("label"); + label.textContent = "LABEL"; + label.className = "property-name"; + + var appendElement = label; + if (this.isNullable()) { + div.className += " inspector-nullable"; + var span = document.createElement("span"); + span.appendChild(label); + var nullLabel = document.createElement("label"); + var nullText = document.createElement("span"); + nullText.textContent = "Null?"; + var nullCheckBox = document.createElement("input"); + nullCheckBox.type = "checkbox"; + nullLabel.appendChild(nullCheckBox); + nullLabel.appendChild(nullText); + span.appendChild(nullLabel); + appendElement = span; + this.nullCheckBox = nullCheckBox; + } + div.appendChild(appendElement); + div.label = label; + return div; } -View.prototype.nFieldHTMLInit = function(fields) { - var div = this.makeInspectorGroup(); - var colsPerRow = 2; - var inputs = []; - var row = []; +View.prototype.nFieldHTMLInit = function (fields) { + var div = this.makeInspectorGroup(); + var colsPerRow = 2; + var inputs = []; + var row = []; - var populateRow = function() { - var rowDiv = document.createElement("div"); - for (var i = 0; i < row.length; i++) { - rowDiv.appendChild(row[i]); + var populateRow = function () { + var rowDiv = document.createElement("div"); + for (var i = 0; i < row.length; i++) { + rowDiv.appendChild(row[i]); + } + rowDiv.className = "row"; + div.appendChild(rowDiv); + row = []; } - rowDiv.className = "row"; - div.appendChild(rowDiv); - row = []; - } - for (var i = 0; i < fields.length; i++) { - var label = document.createElement("label"); - label.textContent = fields[i]; - label.className = "inspector-n-field-label"; - - var input = document.createElement("input"); - input.className = "input-short"; - inputs.push(input); - - var cell = document.createElement("div"); - cell.className = "cell"; - cell.appendChild(label); - cell.appendChild(input); - row.push(cell); - if (row.length % colsPerRow === 0) populateRow(); - } + for (var i = 0; i < fields.length; i++) { + var label = document.createElement("label"); + label.textContent = fields[i]; + label.className = "inspector-n-field-label"; + + var input = document.createElement("input"); + input.className = "input-short"; + inputs.push(input); + + var cell = document.createElement("div"); + cell.className = "cell"; + cell.appendChild(label); + cell.appendChild(input); + row.push(cell); + if (row.length % colsPerRow === 0) populateRow(); + } - if (row.length !== 0) populateRow(); + if (row.length !== 0) populateRow(); - this.inputs = inputs; - return div; + this.inputs = inputs; + return div; } -View.prototype.initialize = function() { - var dom = this.dom; - var type = this.getType(); - var div = null; - switch (type) { - case "Enum": - div = this.makeInspectorGroup(); - var select = document.createElement("select"); - div.appendChild(select); - break; - case "Margin": - div = this.nFieldHTMLInit(["Top", "Right", "Bottom", "Left"]); - break; - case "Point": - div = this.nFieldHTMLInit(["X", "Y"]); - break; - case "Rect": - div = this.nFieldHTMLInit(["X", "Y", "Width", "Height"]); - break; - case "Size": - div = this.nFieldHTMLInit(["Width", "Height"]); - break; - case "Spot": - div = this.nFieldHTMLInit(["X", "Y", "Offset X", "Offset Y"]); - var inputs = this.inputs; - var select = document.createElement("select"); - - var spots = []; - var i = 0; - var custom = document.createElement("option"); - custom.value = -1; - custom.text = "Custom Spot"; - select.appendChild(custom); - for (var k in go.Spot) { - if (go.Spot[k] instanceof go.Spot) { - var option = document.createElement("option"); - option.value = i; - option.text = k; - i++; - select.appendChild(option); - } - } - select.value = -1; - select.div = div; - div.dropdown = select; - var view = this; - select.onchange = function() { - var selected = select[select.selectedIndex].text; - if (selected === "Custom Spot") return; - var spot = go.Spot.parse(selected); - view.inputs[0].value = spot.x; - view.inputs[1].value = spot.y; - view.inputs[2].value = spot.offsetX; - view.inputs[3].value = spot.offsetY; - } - div.selectIndex = div.children.length; - div.appendChild(select); - break; - case "Brush": - div = this.makeInspectorGroup(); - var brushTextField = document.createElement("input"); - brushTextField.type = "text"; - div.appendChild(brushTextField); - break; - case "boolean": - div = this.makeInspectorGroup(); - var input = document.createElement("input"); - input.type = "checkbox"; - input.className = "inspector-boolean-control"; - var label = div.children[0]; - label.className = "make-inline"; - div.insertBefore(input, label); - div.input = input; - break; - case "number": - default: - div = this.makeInspectorGroup(); - var input = document.createElement("input"); - input.type = "text"; - if (this.getType() === "number") input.className += " right-align"; - input.className += " input-long"; - div.appendChild(input); - div.input = input; - break; - } - return div; +View.prototype.initialize = function () { + var dom = this.dom; + var type = this.getType(); + var div = null; + switch (type) { + case "Enum": + div = this.makeInspectorGroup(); + var select = document.createElement("select"); + div.appendChild(select); + break; + case "Margin": + div = this.nFieldHTMLInit(["Top", "Right", "Bottom", "Left"]); + break; + case "Point": + div = this.nFieldHTMLInit(["X", "Y"]); + break; + case "Rect": + div = this.nFieldHTMLInit(["X", "Y", "Width", "Height"]); + break; + case "Size": + div = this.nFieldHTMLInit(["Width", "Height"]); + break; + case "Spot": + div = this.nFieldHTMLInit(["X", "Y", "Offset X", "Offset Y"]); + var inputs = this.inputs; + var select = document.createElement("select"); + + var spots = []; + var i = 0; + var custom = document.createElement("option"); + custom.value = -1; + custom.text = "Custom Spot"; + select.appendChild(custom); + for (var k in go.Spot) { + if (go.Spot[k] instanceof go.Spot) { + var option = document.createElement("option"); + option.value = i; + option.text = k; + i++; + select.appendChild(option); + } + } + select.value = -1; + select.div = div; + div.dropdown = select; + var view = this; + select.onchange = function () { + var selected = select[select.selectedIndex].text; + if (selected === "Custom Spot") return; + var spot = go.Spot.parse(selected); + view.inputs[0].value = spot.x; + view.inputs[1].value = spot.y; + view.inputs[2].value = spot.offsetX; + view.inputs[3].value = spot.offsetY; + } + div.selectIndex = div.children.length; + div.appendChild(select); + break; + case "Brush": + div = this.makeInspectorGroup(); + var brushTextField = document.createElement("input"); + brushTextField.type = "text"; + div.appendChild(brushTextField); + break; + case "boolean": + div = this.makeInspectorGroup(); + var input = document.createElement("input"); + input.type = "checkbox"; + input.className = "inspector-boolean-control"; + var label = div.children[0]; + label.className = "make-inline"; + div.insertBefore(input, label); + div.input = input; + break; + case "number": + default: + div = this.makeInspectorGroup(); + var input = document.createElement("input"); + input.type = "text"; + if (this.getType() === "number") input.className += " right-align"; + input.className += " input-long"; + div.appendChild(input); + div.input = input; + break; + } + return div; } // end view init -View.prototype.populate = function(val) { - var dom = this.dom; - var type = this.getType(); - switch (type) { - case "Enum": - var vals = this.options.enumValues; - var select = this.dom.children[1]; - select.innerHTML = ""; - if (select.length === 0) { - for (var i = 0; i < vals.length; i++) { - var option = document.createElement("option"); - option.value = i; - // just show the second half ("Position" instead of "Panel.Position") - option.innerHTML = vals[i].toString().split('.')[1]; - select.appendChild(option); - } - } - var index = -1; - for (var i = 0; i < select.length; i++) { - if (select[i].text === val.toString().split('.')[1]) { - index = i; - break; - } - } - select.value = index; - break; - case "Margin": - this.nFieldHTMLPopulate([val.top, val.left, val.bottom, val.right]); - break; - case "Point": - this.nFieldHTMLPopulate([val.x, val.y]); - break; - case "Rect": - this.nFieldHTMLPopulate([val.x, val.y, val.width, val.height]); - break; - case "Size": - this.nFieldHTMLPopulate([val.width, val.height]); - break; - case "Spot": - if (val instanceof go.Spot) { - // check to see if spot we have is equal to a predefined Spot - var predefined = null; - for (var k in go.Spot) { - if (go.Spot[k] instanceof go.Spot && go.Spot[k].equals(val)) { - predefined = k; +View.prototype.populate = function (val) { + var dom = this.dom; + var type = this.getType(); + switch (type) { + case "Enum": + var vals = this.options.enumValues; + var select = this.dom.children[1]; + select.innerHTML = ""; + if (select.length === 0) { + for (var i = 0; i < vals.length; i++) { + var option = document.createElement("option"); + option.value = i; + // just show the second half ("Position" instead of "Panel.Position") + option.innerHTML = vals[i].toString().split('.')[1]; + select.appendChild(option); + } + } + var index = -1; + for (var i = 0; i < select.length; i++) { + if (select[i].text === val.toString().split('.')[1]) { + index = i; + break; + } + } + select.value = index; break; - } - } - var select = dom.dropdown; - if (predefined !== null) { - var index = -1; - for (var i = 0; i < select.children.length; i++) { - var child = select.children[i]; - if (child.text === predefined) { - index = parseInt(child.value); - break; + case "Margin": + this.nFieldHTMLPopulate([val.top, val.left, val.bottom, val.right]); + break; + case "Point": + this.nFieldHTMLPopulate([val.x, val.y]); + break; + case "Rect": + this.nFieldHTMLPopulate([val.x, val.y, val.width, val.height]); + break; + case "Size": + this.nFieldHTMLPopulate([val.width, val.height]); + break; + case "Spot": + if (val instanceof go.Spot) { + // check to see if spot we have is equal to a predefined Spot + var predefined = null; + for (var k in go.Spot) { + if (go.Spot[k] instanceof go.Spot && go.Spot[k].equals(val)) { + predefined = k; + break; + } + } + var select = dom.dropdown; + if (predefined !== null) { + var index = -1; + for (var i = 0; i < select.children.length; i++) { + var child = select.children[i]; + if (child.text === predefined) { + index = parseInt(child.value); + break; + } + } + select.value = index; + } } - } - select.value = index; - } - } - if (typeof val === "String") val = go.Spot.parse(val); - this.nFieldHTMLPopulate([val.x, val.y, val.offsetX, val.offsetY]); - break; - case "Brush": - var checkbox = this.nullCheckBox; - var brushTextField = dom.children[1]; - if (val === "(null)") val = "black"; // - // val is either a String or a Brush. If it's a Brush, make it a String - var selected = $(brushTextField); - if (typeof val === "string" || val.type === go.Brush.Solid) { - var colorString = val; - if (val instanceof go.Brush) colorString = val.color; - var options = { - replacerClassName: 'spectrum-control', - color: colorString, - showAlpha: true, - showInput: true, - clickoutFiresChange: true, - showButtons: false, - preferredFormat: "hex" - }; - selected.spectrum(options); - } else { - selected.spectrum("destroy"); - } - if (val instanceof go.Brush) { - val = ExtendedBrush.stringify(val); - } - brushTextField.value = val; // val is now a String - break; - case "boolean": - var input = dom.children[0]; - input.checked = val; - break; - case "number": - dom.children[1].value = val; - break; - default: - dom.children[1].value = val; - break; - } + if (typeof val === "String") val = go.Spot.parse(val); + this.nFieldHTMLPopulate([val.x, val.y, val.offsetX, val.offsetY]); + break; + case "Brush": + var checkbox = this.nullCheckBox; + var brushTextField = dom.children[1]; + if (val === "(null)") val = "black"; // + // val is either a String or a Brush. If it's a Brush, make it a String + var selected = $(brushTextField); + if (typeof val === "string" || val.type === go.Brush.Solid) { + var colorString = val; + if (val instanceof go.Brush) colorString = val.color; + var options = { + replacerClassName: 'spectrum-control', + color: colorString, + showAlpha: true, + showInput: true, + clickoutFiresChange: true, + showButtons: false, + preferredFormat: "hex" + }; + selected.spectrum(options); + } else { + selected.spectrum("destroy"); + } + if (val instanceof go.Brush) { + val = ExtendedBrush.stringify(val); + } + brushTextField.value = val; // val is now a String + break; + case "boolean": + var input = dom.children[0]; + input.checked = val; + break; + case "number": + dom.children[1].value = val; + break; + default: + dom.children[1].value = val; + break; + } } // end view populate -View.prototype.nFieldHTMLPopulate = function(arr) { - var children = this.inputs; - for (var i = 0; i < arr.length; i++) { - children[i].value = arr[i]; - } +View.prototype.nFieldHTMLPopulate = function (arr) { + var children = this.inputs; + for (var i = 0; i < arr.length; i++) { + children[i].value = arr[i]; + } } -View.prototype.use = function(inspector) { - var group = this.dom; - var type = this.getType(); - var val = null; - switch (type) { - case "Enum": - val = this.options.enumValues[group.children[1].selectedIndex]; - break; - case "Margin": - var obj = this.nFieldHTMLUse(4); - val = new go.Margin(obj[0], obj[1], obj[2], obj[3]); - break; - case "Point": - var obj = this.nFieldHTMLUse(2); - val = new go.Point(obj[0], obj[1]); - break; - case "Rect": - var obj = this.nFieldHTMLUse(4); - val = new go.Rect(obj[0], obj[1], obj[2], obj[3]); - break; - case "Size": - var obj = this.nFieldHTMLUse(2); - val = new go.Size(obj[0], obj[1]); - break; - case "Spot": - var obj = this.nFieldHTMLUse(4); - var select = this.dom.children[this.dom.selectIndex]; - if (select.selectedIndex !== 0) { - var spot = go.Spot.parse(select[select.selectedIndex].text); - var equals = function(a,b) { return a === b || (isNaN(a) && isNaN(b)); } - // prefedined spots have NaN in their fields. You can't pass NaN into the normal spot constructor. - // instead of constructing a Spot, try to see if it equals the selected item and returned the prefedined spot - if (equals(obj[0], spot.x) && equals(obj[1], spot.y) && equals(obj[2], spot.offsetX) && equals(obj[3], spot.offsetY)) - val = spot; - // otherwise, build a new Spot and just return that - } - if (val === null) val = new go.Spot(obj[0], obj[1], obj[2], obj[3]); - break; - case "Brush": - if (this.nullCheckBox.checked) { - val = null; - } else { - var brushTextField = group.children[1].value; - var part = inspector.collection; - part = part.part; - var brush = ExtendedBrush.parse(brushTextField, part.measuredBounds.width, part.measuredBounds.height); - val = brush; - } - break; - case "boolean": - val = group.children[0].checked; - break; - case "number": - val = parseFloat(group.input.value); - break; - default: - val = group.input.value; - break; - } - return val; +View.prototype.use = function (inspector) { + var group = this.dom; + var type = this.getType(); + var val = null; + switch (type) { + case "Enum": + val = this.options.enumValues[group.children[1].selectedIndex]; + break; + case "Margin": + var obj = this.nFieldHTMLUse(4); + val = new go.Margin(obj[0], obj[1], obj[2], obj[3]); + break; + case "Point": + var obj = this.nFieldHTMLUse(2); + val = new go.Point(obj[0], obj[1]); + break; + case "Rect": + var obj = this.nFieldHTMLUse(4); + val = new go.Rect(obj[0], obj[1], obj[2], obj[3]); + break; + case "Size": + var obj = this.nFieldHTMLUse(2); + val = new go.Size(obj[0], obj[1]); + break; + case "Spot": + var obj = this.nFieldHTMLUse(4); + var select = this.dom.children[this.dom.selectIndex]; + if (select.selectedIndex !== 0) { + var spot = go.Spot.parse(select[select.selectedIndex].text); + var equals = function (a, b) { + return a === b || (isNaN(a) && isNaN(b)); + } + // prefedined spots have NaN in their fields. You can't pass NaN into the normal spot constructor. + // instead of constructing a Spot, try to see if it equals the selected item and returned the prefedined spot + if (equals(obj[0], spot.x) && equals(obj[1], spot.y) && equals(obj[2], spot.offsetX) && equals(obj[3], spot.offsetY)) + val = spot; + // otherwise, build a new Spot and just return that + } + if (val === null) val = new go.Spot(obj[0], obj[1], obj[2], obj[3]); + break; + case "Brush": + if (this.nullCheckBox.checked) { + val = null; + } else { + var brushTextField = group.children[1].value; + var part = inspector.collection; + part = part.part; + var brush = ExtendedBrush.parse(brushTextField, part.measuredBounds.width, part.measuredBounds.height); + val = brush; + } + break; + case "boolean": + val = group.children[0].checked; + break; + case "number": + val = parseFloat(group.input.value); + break; + default: + val = group.input.value; + break; + } + return val; } // end view use -View.prototype.nFieldHTMLUse = function(count) { - var obj = []; - var children = this.inputs; - for (var i = 0; i < children.length; i++) { - obj[i] = parseFloat(children[i].value); - } - return obj; +View.prototype.nFieldHTMLUse = function (count) { + var obj = []; + var children = this.inputs; + for (var i = 0; i < children.length; i++) { + obj[i] = parseFloat(children[i].value); + } + return obj; } -View.defaultGetter = function(propname) { - var val = this.object[propname]; - if (val === null) return "(null)"; - return val; +View.defaultGetter = function (propname) { + var val = this.object[propname]; + if (val === null) return "(null)"; + return val; } -View.defaultDataGetter = function(propname) { - return this.object[propname]; +View.defaultDataGetter = function (propname) { + return this.object[propname]; } /** -* @param {Diagram} diagram -* @param {View} view -* @param {GraphObject} obj -* @param {string} propname -* @param {string} value -*/ -View.defaultSetter = function(diagram, view, propname, value) { - - //var mytype = view.getType(); - //if (mytype === "number") value = parseFloat(value); - - this.object[propname] = value; // save in the inspector only - /* - if (propname == 'clean') { - propname = 'clean_para'; - } - */ - - //alert(this.object.toString() + "**" + propname.toString() + "-" + value.toString()); - diagram.model.setDataProperty(this.object, propname.toString(), value); - //alert(diagram.model.nodeDataArray[0]["clean_para"]); - //diagram.model. + * @param {Diagram} diagram + * @param {View} view + * @param {GraphObject} obj + * @param {string} propname + * @param {string} value + */ +View.defaultSetter = function (diagram, view, propname, value) { + + //var mytype = view.getType(); + //if (mytype === "number") value = parseFloat(value); + + this.object[propname] = value; // save in the inspector only + /* + if (propname == 'clean') { + propname = 'clean_para'; + } + */ + + //alert(this.object.toString() + "**" + propname.toString() + "-" + value.toString()); + diagram.model.setDataProperty(this.object, propname.toString(), value); + //alert(diagram.model.nodeDataArray[0]["clean_para"]); + //diagram.model. } /** -* @param {Diagram} diagram -* @param {View} view -* @param {Object} data -* @param {string} propname -* @param {string} value -*/ -View.defaultDataSetter = function(diagram, view, propname, value) { - - // save in the inspector only - /* - if (propname == 'clean') { - propname = 'clean_para'; - } - */ - //this.object[propname] = value; - //alert(propname.toString() + ":" + value.toString()); - diagram.model.setDataProperty(this.object, propname, value); + * @param {Diagram} diagram + * @param {View} view + * @param {Object} data + * @param {string} propname + * @param {string} value + */ +View.defaultDataSetter = function (diagram, view, propname, value) { + + // save in the inspector only + /* + if (propname == 'clean') { + propname = 'clean_para'; + } + */ + //this.object[propname] = value; + //alert(propname.toString() + ":" + value.toString()); + diagram.model.setDataProperty(this.object, propname, value); } @@ -864,319 +868,319 @@ View.defaultDataSetter = function(diagram, view, propname, value) { // readOnly: boolean (false by default, if omitted) // nullable: a property with nullable set to true means that it can be null. If omitted, objects are assumed to not be nullable unless a specific type (ie, Brush/Margin/etc) permits it go.GraphObject._inspectedProperties = { - "stretch": { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], - defaultValue: go.GraphObject.Default - }, - "name": { - type: "String", - readOnly: true - }, - "opacity": { - type: "number", - defaultValue: 1 - }, - "visible": { - type: "boolean", - defaultValue: true - }, - "areaBackground": { - type: "Brush", - defaultValue: null - }, - "background": { - type: "Brush", - defaultValue: null - }, - "position": { type: "Point" }, - "scale": { - type: "number", - defaultValue: 1 - }, - "angle": { - type: "number", - defaultValue: 0 - }, - "desiredSize": { type: "Size" }, - "measuredBounds": { - type: "Rect", - readOnly: true - }, - "naturalBounds": { - type: "Rect", - readOnly: true - }, - "portId" : { - type: "string", - nullable: true, - defaultValue: null - }, - "minSize" : { - type: "Size", - defaultValue: new go.Size(0, 0) - }, - "maxSize" : { - type: "Size", - defaultValue: new go.Size(Infinity, Infinity) - } + "stretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], + defaultValue: go.GraphObject.Default + }, + "name": { + type: "String", + readOnly: true + }, + "opacity": { + type: "number", + defaultValue: 1 + }, + "visible": { + type: "boolean", + defaultValue: true + }, + "areaBackground": { + type: "Brush", + defaultValue: null + }, + "background": { + type: "Brush", + defaultValue: null + }, + "position": {type: "Point"}, + "scale": { + type: "number", + defaultValue: 1 + }, + "angle": { + type: "number", + defaultValue: 0 + }, + "desiredSize": {type: "Size"}, + "measuredBounds": { + type: "Rect", + readOnly: true + }, + "naturalBounds": { + type: "Rect", + readOnly: true + }, + "portId": { + type: "string", + nullable: true, + defaultValue: null + }, + "minSize": { + type: "Size", + defaultValue: new go.Size(0, 0) + }, + "maxSize": { + type: "Size", + defaultValue: new go.Size(Infinity, Infinity) + } } go.Shape._inspectedProperties = { - "fill": { - type: "Brush", - defaultValue: "black" - }, - "stroke": { - type: "Brush", - defaultValue: "black" - }, - "strokeWidth": { - type: "number", - defaultValue: 1.0 - }, - "strokeCap": { - type: "String", - defaultValue: "butt" - }, - "strokeJoin": { - type: "String", - defaultValue: "miter" - }, - "strokeMiterLimit": { - type: "number", - defaultValue: 10 - }, - - /* - TODO - "strokeDashArray": { - type: "Array", - defaultValue: null - }, - "strokeDashOffset": { - type: "number", - defaultValue: 0 - }, - */ - "figure": { - type: "String", - defaultValue: "None" - }, - "toArrow": { - type: "String", - defaultValue: "None" - }, - "fromArrow": { - type: "String", - defaultValue: "None" - }, - "geometryStretch": { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.Default], - defaultValue: go.GraphObject.Default - } + "fill": { + type: "Brush", + defaultValue: "black" + }, + "stroke": { + type: "Brush", + defaultValue: "black" + }, + "strokeWidth": { + type: "number", + defaultValue: 1.0 + }, + "strokeCap": { + type: "String", + defaultValue: "butt" + }, + "strokeJoin": { + type: "String", + defaultValue: "miter" + }, + "strokeMiterLimit": { + type: "number", + defaultValue: 10 + }, + + /* + TODO + "strokeDashArray": { + type: "Array", + defaultValue: null + }, + "strokeDashOffset": { + type: "number", + defaultValue: 0 + }, + */ + "figure": { + type: "String", + defaultValue: "None" + }, + "toArrow": { + type: "String", + defaultValue: "None" + }, + "fromArrow": { + type: "String", + defaultValue: "None" + }, + "geometryStretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.Default], + defaultValue: go.GraphObject.Default + } } go.TextBlock._inspectedProperties = { - "font": { - type: "String", - defaultValue: "10px sans-serif" - }, - "text": {type: "String"}, - "textAlign": { - type: "String", - defaultValue: "start" - }, - "isMultiline": { - type: "boolean", - defaultValue: true - }, - "isUnderline": { - type: "boolean", - defaultValue: false - }, - "isStrikethrough": { - type: "boolean", - defaultValue: false - }, - "wrap": { - type: "Enum", - enumValues: [go.TextBlock.WrapDesiredSize, go.TextBlock.WrapFit, go.TextBlock.None], - defaultValue: go.TextBlock.WrapDesiredSize - }, - "overflow": { - type: "Enum", - enumValues: [go.TextBlock.OverflowClip, go.TextBlock.OverflowEllipsis], - defaultValue: go.TextBlock.OverflowClip - }, - "stroke": { - type: "Brush", - defaultValue: "black" - }, - "lineCount": { - type: "number", - readOnly: true - }, - "editable": {type: "boolean"} + "font": { + type: "String", + defaultValue: "10px sans-serif" + }, + "text": {type: "String"}, + "textAlign": { + type: "String", + defaultValue: "start" + }, + "isMultiline": { + type: "boolean", + defaultValue: true + }, + "isUnderline": { + type: "boolean", + defaultValue: false + }, + "isStrikethrough": { + type: "boolean", + defaultValue: false + }, + "wrap": { + type: "Enum", + enumValues: [go.TextBlock.WrapDesiredSize, go.TextBlock.WrapFit, go.TextBlock.None], + defaultValue: go.TextBlock.WrapDesiredSize + }, + "overflow": { + type: "Enum", + enumValues: [go.TextBlock.OverflowClip, go.TextBlock.OverflowEllipsis], + defaultValue: go.TextBlock.OverflowClip + }, + "stroke": { + type: "Brush", + defaultValue: "black" + }, + "lineCount": { + type: "number", + readOnly: true + }, + "editable": {type: "boolean"} } go.Panel._inspectedProperties = { - "type": { - type: "Enum", - enumValues: [go.Panel.Position, go.Panel.Vertical, go.Panel.Horizontal, go.Panel.Auto, go.Panel.Spot, go.Panel.Table, go.Panel.Viewbox, - go.Panel.Link, go.Panel.TableRow, go.Panel.TableColumn, go.Panel.Grid], - defaultValue: go.Panel.Position - }, - "padding": { - type: "Margin", - defaultValue: new go.Margin() - }, - "defaultAlignment": { - type: "Spot", - defaultValue: go.Spot.Default - }, - "defaultStretch": { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], - defaultValue : go.GraphObject.Default - }, - "gridCellSize": { - type: "Size", - defaultValue: new go.Size(10, 10) - }, - "gridOrigin": { - type: "Point", - defaultValue: new go.Point() - } + "type": { + type: "Enum", + enumValues: [go.Panel.Position, go.Panel.Vertical, go.Panel.Horizontal, go.Panel.Auto, go.Panel.Spot, go.Panel.Table, go.Panel.Viewbox, + go.Panel.Link, go.Panel.TableRow, go.Panel.TableColumn, go.Panel.Grid], + defaultValue: go.Panel.Position + }, + "padding": { + type: "Margin", + defaultValue: new go.Margin() + }, + "defaultAlignment": { + type: "Spot", + defaultValue: go.Spot.Default + }, + "defaultStretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], + defaultValue: go.GraphObject.Default + }, + "gridCellSize": { + type: "Size", + defaultValue: new go.Size(10, 10) + }, + "gridOrigin": { + type: "Point", + defaultValue: new go.Point() + } } go.Part._inspectedProperties = { - "location": { - type: "Point" - }, - "locationSpot": {type: "Spot"}, - "resizable": { - type: "boolean", - defaultValue: false - }, - "rotatable": { - type: "boolean", - defaultValue: false - }, - "isShadowed": { - type: "boolean", - defaultValue: false - } - /* , - "locationObjectName": null, - "selectionObjectName": null, - "layerName": null, - "category": null, - "resizeObjectName": null, - "rotateObjectName": null, - "text": null, - "shadowOffset": null, - "shadowColor": null, - "shadowBlur": null*/ + "location": { + type: "Point" + }, + "locationSpot": {type: "Spot"}, + "resizable": { + type: "boolean", + defaultValue: false + }, + "rotatable": { + type: "boolean", + defaultValue: false + }, + "isShadowed": { + type: "boolean", + defaultValue: false + } + /* , + "locationObjectName": null, + "selectionObjectName": null, + "layerName": null, + "category": null, + "resizeObjectName": null, + "rotateObjectName": null, + "text": null, + "shadowOffset": null, + "shadowColor": null, + "shadowBlur": null*/ } go.Node._inspectedProperties = { - "isTreeExpanded": { - type: "boolean", - defaultValue: true - } - /*, - "avoidable": null, - "avoidableMargin": null*/ + "isTreeExpanded": { + type: "boolean", + defaultValue: true + } + /*, + "avoidable": null, + "avoidableMargin": null*/ } go.Link._inspectedProperties = { - "fromSpot": {type: "Spot"}, - "toSpot": {type: "Spot"}, - "relinkableFrom": { - type: "boolean", - defaultValue: false - }, - "relinkableTo": { - type: "boolean", - defaultValue: false - }, - "resegmentable": { - type: "boolean", - defaultValue: false - }, - // technically a property of Part, only used on Links - "reshapable": { - type: "boolean", - defaultValue: false - }, - "midPoint": { - type: "Point", - readOnly: true - }, - "midAngle": { - type: "number", - readOnly: true - }, - "isOrthogonal": { - type: "boolean", - readOnly: true - }, - "isAvoiding": { - type: "boolean", - readOnly: true - }, - "corner": { - type: "number", - defaultValue: 0 - }, - "curve": { - type: "Enum", - enumValues: [go.Link.None, go.Link.Bezier, go.Link.JumpGap, go.Link.JumpOver], - defaultValue: go.Link.None - }, - "curviness": { - type: "number", - defaultValue: NaN - }, - "routing": { - type: "Enum", - enumValues: [go.Link.Normal, go.Link.Orthogonal, go.Link.AvoidsNodes], - defaultValue: go.Link.Normal - }, - "smoothness": { - type: "number", - defaultValue: 0.5 - } + "fromSpot": {type: "Spot"}, + "toSpot": {type: "Spot"}, + "relinkableFrom": { + type: "boolean", + defaultValue: false + }, + "relinkableTo": { + type: "boolean", + defaultValue: false + }, + "resegmentable": { + type: "boolean", + defaultValue: false + }, + // technically a property of Part, only used on Links + "reshapable": { + type: "boolean", + defaultValue: false + }, + "midPoint": { + type: "Point", + readOnly: true + }, + "midAngle": { + type: "number", + readOnly: true + }, + "isOrthogonal": { + type: "boolean", + readOnly: true + }, + "isAvoiding": { + type: "boolean", + readOnly: true + }, + "corner": { + type: "number", + defaultValue: 0 + }, + "curve": { + type: "Enum", + enumValues: [go.Link.None, go.Link.Bezier, go.Link.JumpGap, go.Link.JumpOver], + defaultValue: go.Link.None + }, + "curviness": { + type: "number", + defaultValue: NaN + }, + "routing": { + type: "Enum", + enumValues: [go.Link.Normal, go.Link.Orthogonal, go.Link.AvoidsNodes], + defaultValue: go.Link.Normal + }, + "smoothness": { + type: "number", + defaultValue: 0.5 + } } go.Group._inspectedProperties = { - "ungroupable": { - type: "boolean", - defaultValue: false - }, - "isSubGraphExpanded": { - type: "boolean", - defaultValue: true - } + "ungroupable": { + type: "boolean", + defaultValue: false + }, + "isSubGraphExpanded": { + type: "boolean", + defaultValue: true + } } go.Picture._inspectedProperties = { - "source" : {type: "string"}, - "imageStretch" : { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.UniformToFill], - defaultValue: go.GraphObject.None - }, - "naturalBounds" : { - type: "Rect", - readOnly: true - }, - "sourceRect" : { - type : "Rect", - defaultValue: new go.Rect(NaN, NaN, NaN, NaN) - } + "source": {type: "string"}, + "imageStretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.UniformToFill], + defaultValue: go.GraphObject.None + }, + "naturalBounds": { + type: "Rect", + readOnly: true + }, + "sourceRect": { + type: "Rect", + defaultValue: new go.Rect(NaN, NaN, NaN, NaN) + } } go.Brush.nullable = true; diff --git a/daliuge-translator/dlg/dropmake/web/__init__.py b/daliuge-translator/dlg/dropmake/web/__init__.py index 3c21c477b..99f4c9943 100644 --- a/daliuge-translator/dlg/dropmake/web/__init__.py +++ b/daliuge-translator/dlg/dropmake/web/__init__.py @@ -1,4 +1,3 @@ - # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) diff --git a/daliuge-translator/dlg/dropmake/web/go.js b/daliuge-translator/dlg/dropmake/web/go.js index 6651687f6..9d5a3d012 100644 --- a/daliuge-translator/dlg/dropmake/web/go.js +++ b/daliuge-translator/dlg/dropmake/web/go.js @@ -5,1911 +5,33829 @@ * Copyright (C) 1998-2015 by Northwoods Software Corporation. All Rights Reserved. * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: http://www.gojs.net/1.5.9/doc/license.html. */ -(function(window) { var g,da={};if(!window.document||void 0===window.document.createElement("canvas").getContext)throw window.console&&window.console.log("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode."),Error("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode.");if(!Object.defineProperty)throw Error("GoJS requires a newer version of JavaScript"); -(function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c=a.length?a.push(c):a.splice(b,0,c):u.k("Cannot insert an object into an HTMLCollection or NodeList: "+c+" at "+b)},zi:function(a,b){Array.isArray(a)?b>=a.length?a.pop():a.splice(b,1):u.k("Cannot remove an object from an HTMLCollection or NodeList at "+b)},Ww:[],K:function(){var a=u.Ww.pop();return void 0===a?new w:a},fc:function(a,b){var c=u.Ww.pop();if(void 0===c)return new w(a,b);c.x=a;c.y=b;return c},v:function(a){u.Ww.push(a)},xA:[],ul:function(){var a=u.xA.pop();return void 0=== -a?new ia:a},Oj:function(a){u.xA.push(a)},Xw:[],Sf:function(){var a=u.Xw.pop();return void 0===a?new z:a},Vj:function(a,b,c,d){var e=u.Xw.pop();if(void 0===e)return new z(a,b,c,d);e.x=a;e.y=b;e.width=c;e.height=d;return e},ic:function(a){u.Xw.push(a)},yA:[],jh:function(){var a=u.yA.pop();return void 0===a?new ja:a},Ye:function(a){u.yA.push(a)},Yw:null,p:function(){var a=u.Yw;return null!==a?(u.Yw=null,a):new ka},q:function(a){a.reset();u.Yw=a},wA:[],eb:function(){var a=u.wA.pop();return void 0===a? -[]:a},ra:function(a){a.length=0;u.wA.push(a)},mh:Object.freeze([]),zA:1,gc:function(a){a.__gohashid=u.zA++},Is:function(a){var b=a.__gohashid;void 0===b&&(b=u.zA++,a.__gohashid=b);return b},Uc:function(a){return a.__gohashid},fa:function(a,b){b.hx=a;da[a]=b},Ga:function(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a},Lh:function(a){a.AF=!0},defineProperty:function(a,b,c,d,e){u.j(a,"function","Util.defineProperty:classfunc");u.j(b,"object","Util.defineProperty:propobj"); -u.j(c,"function","Util.defineProperty:getter");u.j(d,"function","Util.defineProperty:setter");for(var f in b){b=b[f];c={get:c,set:d};if(void 0!==e)for(var h in e)c[h]=e[h];Object.defineProperty(a.prototype,f,c);e=Object.getOwnPropertyDescriptor(a.prototype,f);b&&e&&Object.defineProperty(a.prototype,b,e);break}},u:function(a,b,c,d){u.j(a,"function","Util.defineReadOnlyProperty:classfunc");u.j(b,"object","Util.defineReadOnlyProperty:propobj");u.j(c,"function","Util.defineReadOnlyProperty:getter");for(var e in b){var f= -b[e];b={get:c,set:function(a){u.k('The property "'+f+'" is read-only and cannot be set to '+a)}};if(void 0!==d)for(var h in d)b[h]=d[h];Object.defineProperty(a.prototype,e,b);d=Object.getOwnPropertyDescriptor(a.prototype,e);f&&d&&Object.defineProperty(a.prototype,f,d);break}},Xd:function(a,b){for(var c in b)b[c]=!0;a.prototype.UB=b},getTypeName:function(a){return void 0===a?"":"string"===typeof a?a:"function"===typeof a?u.rg(a):null===a?"*":""},rg:function(a){if("function"===typeof a){if(a.hx)return a.hx; -if(a.name)return a.name;var b=a.toString(),c=b.indexOf("("),b=b.substring(9,c).trim();if(""!==b)return a.hx=b}else if("object"===typeof a&&a.constructor)return u.rg(a.constructor);return typeof a},s:function(a,b,c){u.j(a,"function","Util.defineEnumValue:classfunc");u.j(b,"string","Util.defineEnumValue:name");u.j(c,"number","Util.defineEnumValue:num");c=new ea(a,b,c);Object.freeze(c);a[b]=c;var d=a.Dt;d instanceof la||(d=new la("string",ea),a.Dt=d);d.add(b,c);return c},sb:function(a,b){if(!a||!b)return null; -var c=void 0;try{"function"===typeof b?c=b(a):"function"===typeof a.getAttribute?(c=a.getAttribute(b),null===c&&(c=void 0)):c=a[b]}catch(d){}return c},Oa:function(a,b,c){if(a&&b)try{"function"===typeof b?b(a,c):"function"===typeof a.setAttribute?a.setAttribute(b,c):a[b]=c}catch(d){}},ot:function(a,b){u.j(a,"object","Setting properties requires Objects as arguments");u.j(b,"object","Setting properties requires Objects as arguments");var c=a instanceof A,d=a instanceof D,e;for(e in b){""===e&&u.k("Setting properties requires non-empty property names"); -var f=a,h=e;if(c||d){var k=e.indexOf(".");if(0=d.length)){var e=u.sb(b,d);null===e||"function"=== -typeof e||u.jz(b,d)||(""===c&&(c=b+"\n"),c+=' unknown property "'+d+'" has value: '+e+" at "+a+"\n")}return c},Kv:function(a,b){if(null!==b&&"number"!==typeof b&&"string"!==typeof b&&"boolean"!==typeof b&&"function"!==typeof b)if(void 0!==u.Uc(b)){if(!u.bv.contains(b))if(u.bv.add(b),u.Ju.add(u.VC(a,b)),b instanceof E||b instanceof F||b instanceof la)for(var c=b.i;c.next();)u.Kv(a+"["+c.key+"]",c.value);else for(c in b){var d=u.sb(b,c);if(void 0!==d&&null!==d&&u.Sa(d)&&d!==b.UB){if(b instanceof qa){if(d=== -b.ej)continue}else if(b instanceof A){if("data"===c||d===b.qh)continue;if("itemArray"===c||d===b.gi)continue;if(b instanceof G&&d===b.Bk)continue}else if(!(b instanceof D))if(b instanceof sa){if("archetypeGroupData"===c||d===b.ax)continue}else if(b instanceof ta){if("archetypeLinkData"===c||d===b.ex)continue;if("archetypeLabelNodeData"===c||d===b.bx)continue}else if(b instanceof va){if("archetypeNodeData"===c||d===b.ik)continue}else if(b instanceof J){if("nodeDataArray"===c||d===b.mf)continue;if("linkDataArray"=== -c||d===b.Bh||d===b.Rl)continue;if(d===b.tc)continue;if(d===b.uh)continue}else if(b instanceof xa||b instanceof ya||b instanceof Aa)continue;u.Kv(a+"."+c,d)}}}else if(Array.isArray(b))for(c=0;cc;c++)b[c]=c;for(var d=0,e=0,c=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e; -for(var d=c=0,f="",h=0;hc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);for(var d=[],e=0,c=0;cd;d++)b[u.Da("7ca11abfd7330390")](u.Da(c[d-1]),10,15*d+0);b[u.Da("7ca11abfd022028846")]=u.Da("39f046ebb36e4b");for(d=1;5>d;d++)b[u.Da("7ca11abfd7330390")](u.Da(c[d- -1]),10,15*d+0);if(4!==c.length||"5"!==c[0][0]||"7"!==c[3][0])u.s=function(a,b){var c=new ea(a,b,2);Object.freeze(c);a[b]=c;var d=a.Dt;d instanceof la||(d=new la("string",ea),a.Dt=d);d.add(b,c);return c};return a}();function ea(a,b,c){u.gc(this);this.HA=a;this.Ub=b;this.FF=c}ea.prototype.toString=function(){return u.rg(this.HA)+"."+this.Ub};u.u(ea,{Ae:"classType"},function(){return this.HA});u.u(ea,{name:"name"},function(){return this.Ub});u.u(ea,{value:"value"},function(){return this.FF});var Da; -ea.findName=Da=function(a,b){if(null===b||""===b)return null;u.j(a,"function","findName:classfunc");u.j(b,"string","EnumValue.findName:name");var c=a.Dt;return c instanceof la?c.ta(b):null};function Ba(){this.FA=[]}Ba.prototype.toString=function(){return this.FA.join("")};Ba.prototype.add=function(a){""!==a&&this.FA.push(a)};function pa(){} -function Ga(a){void 0===a&&(a=42);this.seed=a;this.Pw=48271;this.Ct=2147483647;this.uA=this.Ct/this.Pw;this.hF=this.Ct%this.Pw;this.dF=1/this.Ct;this.random()}Ga.prototype.random=function(){var a=this.seed%this.uA*this.Pw-this.seed/this.uA*this.hF;this.seed=0this.key)return!1;u.Mb(a)}var a=a.n,b=a.length,c=++this.ud,d=this.sj;if(null!==d)for(;cthis.key)return!1;u.Mb(a)}var b=--this.ud;if(0<=b)return this.key=b,this.value=a.n[b],!0;this.Vf();return!1};La.prototype.first=La.prototype.first=function(){var a=this.xd;this.Xa=a.U;var b=a.n;this.ud=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null}; -La.prototype.any=function(a){var b=this.xd;b.In=null;var c=b.U,d=b.n,e=d.length;this.ud=e;for(e-=1;0<=e;e++){if(a(d[e]))return!0;b.U!==c&&u.Mb(b)}return!1};La.prototype.all=function(a){var b=this.xd;b.In=null;var c=b.U,d=b.n,e=d.length;this.ud=e;for(e-=1;0<=e;e++){if(!a(d[e]))return!1;b.U!==c&&u.Mb(b)}return!0};La.prototype.each=function(a){var b=this.xd;b.In=null;var c=b.U,d=b.n,e=d.length;this.ud=e;for(e-=1;0<=e;e++)a(d[e]),b.U!==c&&u.Mb(b)};u.u(La,{count:"count"},function(){return this.xd.n.length}); -La.prototype.Vf=function(){this.key=-1;this.value=null;this.Xa=-1;this.xd.In=this};La.prototype.toString=function(){return"ListIteratorBackwards("+this.ud+"/"+this.xd.count+")"}; -function E(a){u.gc(this);this.Ca=!1;this.n=[];this.U=0;this.In=this.wd=null;void 0===a||null===a?this.oa=null:"string"===typeof a?"object"===a||"string"===a||"number"===a||"boolean"===a||"function"===a?this.oa=a:u.wa(a,"the string 'object', 'number', 'string', 'boolean', or 'function'","List constructor: type"):"function"===typeof a?this.oa=a===Object?"object":a===String?"string":a===Number?"number":a===Boolean?"boolean":a===Function?"function":a:u.wa(a,"null, a primitive type name, or a class type", -"List constructor: type")}u.fa("List",E);E.prototype.Pd=function(){var a=this.U;a++;999999999a||a>=b.length)&&u.wa(a,"0 <= i < length",E,"elt:i");return b[a]};E.prototype.setElt=E.prototype.set=E.prototype.Bg=function(a,b){var c=this.n;(0>a||a>=c.length)&&u.wa(a,"0 <= i < length",E,"setElt:i");u.I(this,a);c[a]=b};E.prototype.first=E.prototype.first=function(){var a=this.n;return 0===a.length?null:a[0]}; -E.prototype.last=E.prototype.Gd=function(){var a=this.n,b=a.length;return 0a&&u.wa(a,">= 0",E,"insertAt:i");u.I(this,a);var c=this.n;a>=c.length?c.push(b):c.splice(a,0,b);this.Pd();return!0};E.prototype.remove=E.prototype["delete"]=E.prototype.remove=function(a){if(null===a)return!1;u.I(this,a);var b=this.n;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.Pd();return!0}; -E.prototype.removeAt=E.prototype.hd=function(a){var b=this.n;(0>a||a>=b.length)&&u.wa(a,"0 <= i < length",E,"removeAt:i");u.I(this,a);a===b.length-1?b.pop():b.splice(a,1);this.Pd()};E.prototype.removeRange=E.prototype.removeRange=function(a,b){var c=this.n;(0>a||a>=c.length)&&u.wa(a,"0 <= from < length",E,"elt:from");(0>b||b>=c.length)&&u.wa(b,"0 <= to < length",E,"elt:to");u.I(this,a);var d=c.slice((b||a)+1||c.length);c.length=0>a?c.length+a:a;c.push.apply(c,d);this.Pd()}; -E.prototype.copy=function(){for(var a=new E(this.oa),b=this.n,c=this.count,d=0;d=f)return this;(0>b||b>=e-1)&&u.wa(b,"0 <= from < length",E,"sortRange:from");if(2===f)return c=d[b],e=d[b+1],0=e)d.sort(a);else for(f=d.slice(0,c),f.sort(a),a=0;a=e)for(f=d.slice(b),f.sort(a),a=b;a=this.n.length)return Ia;var a=this.wd;return null!==a?(a.reset(),a):new Ka(this)}); -u.u(E,{Fm:"iteratorBackwards"},function(){if(0>=this.n.length)return Ia;var a=this.In;return null!==a?(a.reset(),a):new La(this)});function Ma(a){this.Gk=a;this.reset()}u.Xd(Ma,{key:!0,value:!0});u.u(Ma,{i:"iterator"},function(){return this});Ma.prototype.reset=Ma.prototype.reset=function(){var a=this.Gk;a.wd=null;this.Xa=a.U;this.Cb=null}; -Ma.prototype.next=Ma.prototype.hasNext=Ma.prototype.next=function(){var a=this.Gk;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.value=b.value,this.key=b.key,!0;this.Vf();return!1};Ma.prototype.first=Ma.prototype.first=function(){var a=this.Gk;this.Xa=a.U;a=a.bb;if(null!==a){this.Cb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; -Ma.prototype.any=function(a){var b=this.Gk;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d.value))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Ma.prototype.all=function(a){var b=this.Gk;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d.value))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0};Ma.prototype.each=function(a){var b=this.Gk;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d.value),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Ma,{count:"count"},function(){return this.Gk.Zc}); -Ma.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1;this.Gk.wd=this};Ma.prototype.toString=function(){return null!==this.Cb?"SetIterator@"+this.Cb.value:"SetIterator"}; -function F(a){u.gc(this);this.Ca=!1;void 0===a||null===a?this.oa=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.oa=a:u.wa(a,"the string 'object', 'number' or 'string'","Set constructor: type"):"function"===typeof a?this.oa=a===Object?"object":a===String?"string":a===Number?"number":a:u.wa(a,"null, a primitive type name, or a class type","Set constructor: type");this.$c={};this.Zc=0;this.wd=null;this.U=0;this.Ah=this.bb=null}u.fa("Set",F); -F.prototype.Pd=function(){var a=this.U;a++;999999999=this.Zc)return Ia;var a=this.wd;return null!==a?(a.reset(),a):new Ma(this)});function Qa(a){this.Wa=a;this.reset()}u.Xd(Qa,{key:!0,value:!0});u.u(Qa,{i:"iterator"},function(){return this});Qa.prototype.reset=Qa.prototype.reset=function(){this.Xa=this.Wa.U;this.Cb=null}; -Qa.prototype.next=Qa.prototype.hasNext=Qa.prototype.next=function(){var a=this.Wa;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.value=this.key=a=b.key,!0;this.Vf();return!1};Qa.prototype.first=Qa.prototype.first=function(){var a=this.Wa;this.Xa=a.U;a=a.bb;return null!==a?(this.Cb=a,this.value=this.key=a=a.key):null}; -Qa.prototype.any=function(a){var b=this.Wa,c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d.key))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Qa.prototype.all=function(a){var b=this.Wa,c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d.key))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0};Qa.prototype.each=function(a){var b=this.Wa,c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d.key),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Qa,{count:"count"},function(){return this.Wa.Zc}); -Qa.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1};Qa.prototype.toString=function(){return null!==this.Cb?"MapKeySetIterator@"+this.Cb.value:"MapKeySetIterator"};function Ra(a){u.gc(this);this.Ca=!0;this.Wa=a}u.Ga(Ra,F);Ra.prototype.freeze=function(){return this};Ra.prototype.La=function(){return this};Ra.prototype.toString=function(){return"MapKeySet("+this.Wa.toString()+")"}; -Ra.prototype.add=Ra.prototype.set=Ra.prototype.add=function(){u.k("This Set is read-only: "+this.toString());return!1};Ra.prototype.contains=Ra.prototype.has=Ra.prototype.contains=function(a){return this.Wa.contains(a)};Ra.prototype.remove=Ra.prototype["delete"]=Ra.prototype.remove=function(){u.k("This Set is read-only: "+this.toString());return!1};Ra.prototype.clear=Ra.prototype.clear=function(){u.k("This Set is read-only: "+this.toString())}; -Ra.prototype.first=Ra.prototype.first=function(){var a=this.Wa.bb;return null!==a?a.key:null};Ra.prototype.any=function(a){for(var b=this.Wa.bb;null!==b;){if(a(b.key))return!0;b=b.Sb}return!1};Ra.prototype.all=function(a){for(var b=this.Wa.bb;null!==b;){if(!a(b.key))return!1;b=b.Sb}return!0};Ra.prototype.each=function(a){for(var b=this.Wa.bb;null!==b;)a(b.key),b=b.Sb};Ra.prototype.copy=function(){return new Ra(this.Wa)}; -Ra.prototype.toSet=function(){var a=new F(this.Wa.wq),b=this.Wa.$c,c;for(c in b)a.add(b[c].key);return a};Ra.prototype.toArray=Ra.prototype.Ke=function(){var a=this.Wa.$c,b=Array(this.Wa.Zc),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};Ra.prototype.toList=function(){var a=new E(this.oa),b=this.Wa.$c,c;for(c in b)a.add(b[c].key);return a};u.u(Ra,{count:"count"},function(){return this.Wa.Zc});u.u(Ra,{size:"size"},function(){return this.Wa.Zc}); -u.u(Ra,{i:"iterator"},function(){return 0>=this.Wa.Zc?Ia:new Qa(this.Wa)});function Sa(a){this.Wa=a;this.reset()}u.Xd(Sa,{key:!0,value:!0});u.u(Sa,{i:"iterator"},function(){return this});Sa.prototype.reset=Sa.prototype.reset=function(){var a=this.Wa;a.Jn=null;this.Xa=a.U;this.Cb=null}; -Sa.prototype.next=Sa.prototype.hasNext=Sa.prototype.next=function(){var a=this.Wa;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.value=b.value,this.key=b.key,!0;this.Vf();return!1};Sa.prototype.first=Sa.prototype.first=function(){var a=this.Wa;this.Xa=a.U;a=a.bb;if(null!==a){this.Cb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; -Sa.prototype.any=function(a){var b=this.Wa;b.Jn=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d.value))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Sa.prototype.all=function(a){var b=this.Wa;b.Jn=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d.value))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0};Sa.prototype.each=function(a){var b=this.Wa;b.Jn=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d.value),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Sa,{count:"count"},function(){return this.Wa.Zc}); -Sa.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1;this.Wa.Jn=this};Sa.prototype.toString=function(){return null!==this.Cb?"MapValueSetIterator@"+this.Cb.value:"MapValueSetIterator"};function Pa(a,b){this.key=a;this.value=b;this.Un=this.Sb=null}u.Xd(Pa,{key:!0,value:!0});Pa.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};function Ua(a){this.Wa=a;this.reset()}u.Xd(Ua,{key:!0,value:!0});u.u(Ua,{i:"iterator"},function(){return this}); -Ua.prototype.reset=Ua.prototype.reset=function(){var a=this.Wa;a.wd=null;this.Xa=a.U;this.Cb=null};Ua.prototype.next=Ua.prototype.hasNext=Ua.prototype.next=function(){var a=this.Wa;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.key=b.key,this.value=b.value,!0;this.Vf();return!1}; -Ua.prototype.first=Ua.prototype.first=function(){var a=this.Wa;this.Xa=a.U;a=a.bb;return null!==a?(this.Cb=a,this.key=a.key,this.value=a.value,a):null};Ua.prototype.any=function(a){var b=this.Wa;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Ua.prototype.all=function(a){var b=this.Wa;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0}; -Ua.prototype.each=function(a){var b=this.Wa;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Ua,{count:"count"},function(){return this.Wa.Zc});Ua.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1;this.Wa.wd=this};Ua.prototype.toString=function(){return null!==this.Cb?"MapIterator@"+this.Cb:"MapIterator"}; -function la(a,b){u.gc(this);this.Ca=!1;void 0===a||null===a?this.wq=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.wq=a:u.wa(a,"the string 'object', 'number' or 'string'","Map constructor: keytype"):"function"===typeof a?this.wq=a===Object?"object":a===String?"string":a===Number?"number":a:u.wa(a,"null, a primitive type name, or a class type","Map constructor: keytype");void 0===b||null===b?this.tv=null:"string"===typeof b?"object"===b||"string"===b||"boolean"===b||"number"=== -b||"function"===b?this.tv=b:u.wa(b,"the string 'object', 'number', 'string', 'boolean', or 'function'","Map constructor: valtype"):"function"===typeof b?this.tv=b===Object?"object":b===String?"string":b===Number?"number":b===Boolean?"boolean":b===Function?"function":b:u.wa(b,"null, a primitive type name, or a class type","Map constructor: valtype");this.$c={};this.Zc=0;this.Jn=this.wd=null;this.U=0;this.Ah=this.bb=null}u.fa("Map",la); -la.prototype.Pd=function(){var a=this.U;a++;999999999=this.count)return Ia;var a=this.wd;return null!==a?(a.reset(),a):new Ua(this)});u.u(la,{NJ:"iteratorKeys"},function(){return 0>=this.count?Ia:new Qa(this)});u.u(la,{RD:"iteratorValues"},function(){if(0>=this.count)return Ia;var a=this.Jn;return null!==a?(a.reset(),a):new Sa(this)});function w(a,b){void 0===a?this.y=this.x=0:(this.x=a,this.y=b);this.Ca=!1}u.fa("Point",w);u.Lh(w);u.Xd(w,{x:!0,y:!0});w.prototype.assign=function(a){this.x=a.x;this.y=a.y}; -w.prototype.setTo=w.prototype.m=function(a,b){this.x=a;this.y=b;return this};w.prototype.set=w.prototype.set=function(a){this.I();this.x=a.x;this.y=a.y;return this};w.prototype.copy=function(){var a=new w;a.x=this.x;a.y=this.y;return a};g=w.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this}; -g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this};g.I=function(a){if(this.Ca){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};w.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new w(c,e)}return new w}; -w.stringify=function(a){return a instanceof w?a.x.toString()+" "+a.y.toString():a.toString()};w.prototype.toString=function(){return"Point("+this.x+","+this.y+")"};w.prototype.equals=w.prototype.L=function(a){return a instanceof w?this.x===a.x&&this.y===a.y:!1};w.prototype.equalTo=w.prototype.Tv=function(a,b){return this.x===a&&this.y===b};w.prototype.equalsApprox=w.prototype.De=function(a){return K.D(this.x,a.x)&&K.D(this.y,a.y)}; -w.prototype.add=w.prototype.add=function(a){this.I();this.x+=a.x;this.y+=a.y;return this};w.prototype.subtract=w.prototype.vt=function(a){this.I();this.x-=a.x;this.y-=a.y;return this};w.prototype.offset=w.prototype.offset=function(a,b){this.I();this.x+=a;this.y+=b;return this}; -w.prototype.rotate=w.prototype.rotate=function(a){this.I();if(0===a)return this;var b=this.x,c=this.y;if(0===b&&0===c)return this;var d=0,e=0;360<=a?a-=360:0>a&&(a+=360);90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(a=a*Math.PI/180,d=Math.cos(a),e=Math.sin(a));this.x=d*b-e*c;this.y=e*b+d*c;return this};w.prototype.scale=w.prototype.scale=function(a,b){this.x*=a;this.y*=b;return this};w.prototype.distanceSquaredPoint=w.prototype.Lj=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a}; -w.prototype.distanceSquared=w.prototype.ss=function(a,b){var c=a-this.x,d=b-this.y;return c*c+d*d};w.prototype.normalize=w.prototype.normalize=function(){this.I();var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}w.prototype.projectOntoLineSegment=function(a,b,c,d){K.Hm(a,b,c,d,this.x,this.y,this);return this};w.prototype.projectOntoLineSegmentPoint=function(a,b){K.Hm(a.x,a.y,b.x,b.y,this.x,this.y,this);return this};w.prototype.snapToGrid=function(a,b,c,d){K.xs(this.x,this.y,a,b,c,d,this);return this}; -w.prototype.snapToGridPoint=function(a,b){K.xs(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};w.prototype.setRectSpot=w.prototype.pt=function(a,b){this.I();this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};w.prototype.setSpot=w.prototype.rt=function(a,b,c,d,e){this.I();this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this};w.prototype.transform=function(a){a.ab(this);return this};function Wa(a,b){b.Oh(a);return a}var Xa; -w.distanceLineSegmentSquared=Xa=function(a,b,c,d,e,f){var h=e-c,k=f-d,l=h*h+k*k;c-=a;d-=b;var m=-c*h-d*k;if(0>=m||m>=l)return h=e-a,k=f-b,Math.min(c*c+d*d,h*h+k*k);a=h*d-k*c;return a*a/l};var Ya;w.distanceSquared=Ya=function(a,b,c,d){a=c-a;b=d-b;return a*a+b*b};var Za;w.direction=Za=function(a,b,c,d){a=c-a;b=d-b;if(0===a)return 0b?270:0;if(0===b)return 0a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d}; -w.prototype.isReal=w.prototype.J=function(){return isFinite(this.x)&&isFinite(this.y)};function ia(a,b){void 0===a?this.height=this.width=0:(this.width=a,this.height=b);this.Ca=!1}u.fa("Size",ia);u.Lh(ia);u.Xd(ia,{width:!0,height:!0});ia.prototype.assign=function(a){this.width=a.width;this.height=a.height};ia.prototype.setTo=ia.prototype.m=function(a,b){this.width=a;this.height=b;return this};ia.prototype.set=ia.prototype.set=function(a){this.I();this.width=a.width;this.height=a.height;return this}; -ia.prototype.copy=function(){var a=new ia;a.width=this.width;a.height=this.height;return a};g=ia.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this};g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this}; -g.I=function(a){if(this.Ca){var b="The Size is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};ia.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new ia(c,e)}return new ia};ia.stringify=function(a){return a instanceof ia?a.width.toString()+" "+a.height.toString():a.toString()}; -ia.prototype.toString=function(){return"Size("+this.width+","+this.height+")"};ia.prototype.equals=ia.prototype.L=function(a){return a instanceof ia?this.width===a.width&&this.height===a.height:!1};ia.prototype.equalTo=ia.prototype.Tv=function(a,b){return this.width===a&&this.height===b};ia.prototype.equalsApprox=ia.prototype.De=function(a){return K.D(this.width,a.width)&&K.D(this.height,a.height)};ia.prototype.isReal=ia.prototype.J=function(){return isFinite(this.width)&&isFinite(this.height)}; -function z(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:a instanceof w?b instanceof w?(this.x=Math.min(a.x,b.x),this.y=Math.min(a.y,b.y),this.width=Math.abs(a.x-b.x),this.height=Math.abs(a.y-b.y)):b instanceof ia?(this.x=a.x,this.y=a.y,this.width=b.width,this.height=b.height):u.k("Incorrect arguments supplied to Rect constructor"):(this.x=a,this.y=b,this.width=c,this.height=d);this.Ca=!1}u.fa("Rect",z);u.Lh(z);u.Xd(z,{x:!0,y:!0,width:!0,height:!0}); -z.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height};function bb(a,b,c){a.width=b;a.height=c}z.prototype.setTo=z.prototype.m=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};z.prototype.set=z.prototype.set=function(a){this.I();this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};z.prototype.setPoint=z.prototype.yf=function(a){this.I();this.x=a.x;this.y=a.y;return this}; -z.prototype.setSize=function(a){this.I();this.width=a.width;this.height=a.height;return this};z.prototype.copy=function(){var a=new z;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};g=z.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this};g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this}; -g.I=function(a){if(this.Ca){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};z.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var h=0;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return new z(c,e,f,h)}return new z}; -z.stringify=function(a){return a instanceof z?a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString():a.toString()};z.prototype.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};z.prototype.equals=z.prototype.L=function(a){return a instanceof z?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};z.prototype.equalTo=z.prototype.Tv=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d}; -z.prototype.equalsApprox=z.prototype.De=function(a){return K.D(this.x,a.x)&&K.D(this.y,a.y)&&K.D(this.width,a.width)&&K.D(this.height,a.height)};z.prototype.containsPoint=z.prototype.Aa=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};z.prototype.containsRect=z.prototype.Kj=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height}; -z.prototype.contains=z.prototype.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height};z.prototype.reset=function(){this.I();this.height=this.width=this.y=this.x=0};z.prototype.offset=z.prototype.offset=function(a,b){this.I();this.x+=a;this.y+=b;return this};z.prototype.inflate=z.prototype.Jf=function(a,b){return hb(this,b,a,b,a)}; -z.prototype.addMargin=z.prototype.yv=function(a){return hb(this,a.top,a.right,a.bottom,a.left)};z.prototype.subtractMargin=z.prototype.tI=function(a){return hb(this,-a.top,-a.right,-a.bottom,-a.left)};z.prototype.grow=function(a,b,c,d){return hb(this,a,b,c,d)};function hb(a,b,c,d,e){a.I();var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}z.prototype.intersectRect=function(a){return ib(this,a.x,a.y,a.width,a.height)}; -z.prototype.intersect=function(a,b,c,d){return ib(this,a,b,c,d)};function ib(a,b,c,d,e){a.I();var f=Math.max(a.x,b),h=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=h;a.width=Math.max(0,b-f);a.height=Math.max(0,c-h);return a}z.prototype.intersectsRect=z.prototype.sg=function(a){return this.HD(a.x,a.y,a.width,a.height)}; -z.prototype.intersects=z.prototype.HD=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function jb(a,b){var c=a.width,d=b.width+10+10,e=a.x,f=b.x-10;if(e>d+f||f>c+e)return!1;c=a.height;d=b.height+10+10;e=a.y;f=b.y-10;return e>d+f||f>c+e?!1:!0}z.prototype.unionPoint=z.prototype.Oi=function(a){return kb(this,a.x,a.y,0,0)}; -z.prototype.unionRect=z.prototype.Sh=function(a){return kb(this,a.x,a.y,a.width,a.height)};z.prototype.union=z.prototype.YE=function(a,b,c,d){this.I();void 0===c&&(c=0);void 0===d&&(d=0);return kb(this,a,b,c,d)};function kb(a,b,c,d,e){var f=Math.min(a.x,b),h=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=h;a.width=b-f;a.height=c-h;return a} -z.prototype.setSpot=z.prototype.rt=function(a,b,c){this.I();this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};var qb;z.contains=qb=function(a,b,c,d,e,f,h,k){void 0===h&&(h=0);void 0===k&&(k=0);return a<=e&&e+h<=a+c&&b<=f&&f+k<=b+d};z.intersects=function(a,b,c,d,e,f,h,k){c+=a;h+=e;if(a>h||e>c)return!1;a=d+b;k+=f;return b>k||f>a?!1:!0};u.defineProperty(z,{left:"left"},function(){return this.x},function(a){this.I(a);this.x=a}); -u.defineProperty(z,{top:"top"},function(){return this.y},function(a){this.I(a);this.y=a});u.defineProperty(z,{right:"right"},function(){return this.x+this.width},function(a){this.I(a);this.x+=a-(this.x+this.width)});u.defineProperty(z,{bottom:"bottom"},function(){return this.y+this.height},function(a){this.I(a);this.y+=a-(this.y+this.height)});u.defineProperty(z,{position:"position"},function(){return new w(this.x,this.y)},function(a){this.I(a);this.x=a.x;this.y=a.y}); -u.defineProperty(z,{size:"size"},function(){return new ia(this.width,this.height)},function(a){this.I(a);this.width=a.width;this.height=a.height});u.defineProperty(z,{Ok:"center"},function(){return new w(this.x+this.width/2,this.y+this.height/2)},function(a){this.I(a);this.x=a.x-this.width/2;this.y=a.y-this.height/2});u.defineProperty(z,{Ja:"centerX"},function(){return this.x+this.width/2},function(a){this.I(a);this.x=a-this.width/2}); -u.defineProperty(z,{Ua:"centerY"},function(){return this.y+this.height/2},function(a){this.I(a);this.y=a-this.height/2});z.prototype.isReal=z.prototype.J=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};z.prototype.isEmpty=function(){return 0===this.width&&0===this.height}; -function rb(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(d=b,this.top=a,this.right=b,this.bottom=a,this.left=d):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):u.k("Invalid arguments to Margin constructor");this.Ca=!1}u.fa("Margin",rb);u.Lh(rb);u.Xd(rb,{top:!0,right:!0,bottom:!0,left:!0});rb.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left}; -rb.prototype.setTo=rb.prototype.m=function(a,b,c,d){this.I();this.top=a;this.right=b;this.bottom=c;this.left=d;return this};rb.prototype.set=rb.prototype.set=function(a){this.I();this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};rb.prototype.copy=function(){var a=new rb;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};g=rb.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this}; -g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this};g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this};g.I=function(a){if(this.Ca){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}}; -rb.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=NaN;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));if(isNaN(c))return new rb;for(var e=NaN;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));if(isNaN(e))return new rb(c);for(var f=NaN;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));if(isNaN(f))return new rb(c,e);for(var h=NaN;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return isNaN(h)?new rb(c,e):new rb(c,e,f,h)}return new rb}; -rb.stringify=function(a){return a instanceof rb?a.top.toString()+" "+a.right.toString()+" "+a.bottom.toString()+" "+a.left.toString():a.toString()};rb.prototype.toString=function(){return"Margin("+this.top+","+this.right+","+this.bottom+","+this.left+")"};rb.prototype.equals=rb.prototype.L=function(a){return a instanceof rb?this.top===a.top&&this.right===a.right&&this.bottom===a.bottom&&this.left===a.left:!1}; -rb.prototype.equalTo=rb.prototype.Tv=function(a,b,c,d){return this.top===a&&this.right===b&&this.bottom===c&&this.left===d};rb.prototype.equalsApprox=rb.prototype.De=function(a){return K.D(this.top,a.top)&&K.D(this.right,a.right)&&K.D(this.bottom,a.bottom)&&K.D(this.left,a.left)};rb.prototype.isReal=rb.prototype.J=function(){return isFinite(this.top)&&isFinite(this.right)&&isFinite(this.bottom)&&isFinite(this.left)};function ja(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0}u.Lh(ja); -u.Xd(ja,{m11:!0,m12:!0,m21:!0,m22:!0,dx:!0,dy:!0});ja.prototype.set=ja.prototype.set=function(a){this.m11=a.m11;this.m12=a.m12;this.m21=a.m21;this.m22=a.m22;this.dx=a.dx;this.dy=a.dy;return this};ja.prototype.copy=function(){var a=new ja;a.m11=this.m11;a.m12=this.m12;a.m21=this.m21;a.m22=this.m22;a.dx=this.dx;a.dy=this.dy;return a};ja.prototype.toString=function(){return"Transform("+this.m11+","+this.m12+","+this.m21+","+this.m22+","+this.dx+","+this.dy+")"}; -ja.prototype.equals=ja.prototype.L=function(a){return a instanceof ja?this.m11===a.m11&&this.m12===a.m12&&this.m21===a.m21&&this.m22===a.m22&&this.dx===a.dx&&this.dy===a.dy:!1};ja.prototype.isIdentity=ja.prototype.Os=function(){return 1===this.m11&&0===this.m12&&0===this.m21&&1===this.m22&&0===this.dx&&0===this.dy};ja.prototype.reset=ja.prototype.reset=function(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0;return this}; -ja.prototype.multiply=ja.prototype.multiply=function(a){var b=this.m12*a.m11+this.m22*a.m12,c=this.m11*a.m21+this.m21*a.m22,d=this.m12*a.m21+this.m22*a.m22,e=this.m11*a.dx+this.m21*a.dy+this.dx,f=this.m12*a.dx+this.m22*a.dy+this.dy;this.m11=this.m11*a.m11+this.m21*a.m12;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this}; -ja.prototype.multiplyInverted=ja.prototype.aE=function(a){var b=1/(a.m11*a.m22-a.m12*a.m21),c=a.m22*b,d=-a.m12*b,e=-a.m21*b,f=a.m11*b,h=b*(a.m21*a.dy-a.m22*a.dx),k=b*(a.m12*a.dx-a.m11*a.dy);a=this.m12*c+this.m22*d;b=this.m11*e+this.m21*f;e=this.m12*e+this.m22*f;f=this.m11*h+this.m21*k+this.dx;h=this.m12*h+this.m22*k+this.dy;this.m11=this.m11*c+this.m21*d;this.m12=a;this.m21=b;this.m22=e;this.dx=f;this.dy=h;return this}; -ja.prototype.invert=ja.prototype.oz=function(){var a=1/(this.m11*this.m22-this.m12*this.m21),b=-this.m12*a,c=-this.m21*a,d=this.m11*a,e=a*(this.m21*this.dy-this.m22*this.dx),f=a*(this.m12*this.dx-this.m11*this.dy);this.m11=this.m22*a;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this}; -ja.prototype.rotate=ja.prototype.rotate=function(a,b,c){360<=a?a-=360:0>a&&(a+=360);if(0===a)return this;this.translate(b,c);var d=0,e=0;90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(e=a*Math.PI/180,d=Math.cos(e),e=Math.sin(e));a=this.m12*d+this.m22*e;var f=this.m11*-e+this.m21*d,h=this.m12*-e+this.m22*d;this.m11=this.m11*d+this.m21*e;this.m12=a;this.m21=f;this.m22=h;this.translate(-b,-c);return this}; -ja.prototype.translate=ja.prototype.translate=function(a,b){this.dx+=this.m11*a+this.m21*b;this.dy+=this.m12*a+this.m22*b;return this};ja.prototype.scale=ja.prototype.scale=function(a,b){void 0===b&&(b=a);this.m11*=a;this.m12*=a;this.m21*=b;this.m22*=b;return this};ja.prototype.transformPoint=ja.prototype.ab=function(a){var b=a.x,c=a.y;a.x=b*this.m11+c*this.m21+this.dx;a.y=b*this.m12+c*this.m22+this.dy;return a}; -ja.prototype.invertedTransformPoint=ja.prototype.Oh=function(a){var b=1/(this.m11*this.m22-this.m12*this.m21),c=-this.m12*b,d=this.m11*b,e=b*(this.m12*this.dx-this.m11*this.dy),f=a.x,h=a.y;a.x=f*this.m22*b+h*-this.m21*b+b*(this.m21*this.dy-this.m22*this.dx);a.y=f*c+h*d+e;return a}; -ja.prototype.transformRect=ja.prototype.WE=function(a){var b=a.x,c=a.y,d=b+a.width,e=c+a.height,f=this.m11,h=this.m12,k=this.m21,l=this.m22,m=this.dx,n=this.dy,p=b*f+c*k+m,q=b*h+c*l+n,r=d*f+c*k+m,c=d*h+c*l+n,s=b*f+e*k+m,b=b*h+e*l+n,f=d*f+e*k+m,d=d*h+e*l+n,e=p,h=q,p=Math.min(p,r),e=Math.max(e,r),h=Math.min(h,c),q=Math.max(q,c),p=Math.min(p,s),e=Math.max(e,s),h=Math.min(h,b),q=Math.max(q,b),p=Math.min(p,f),e=Math.max(e,f),h=Math.min(h,d),q=Math.max(q,d);a.x=p;a.y=h;a.width=e-p;a.height=q-h;return a}; -function L(a,b,c,d){void 0===a?this.offsetY=this.offsetX=this.y=this.x=0:(void 0===b&&(b=0),void 0===c&&(c=0),void 0===d&&(d=0),this.x=a,this.y=b,this.offsetX=c,this.offsetY=d);this.Ca=!1}u.fa("Spot",L);u.Lh(L);u.Xd(L,{x:!0,y:!0,offsetX:!0,offsetY:!0});L.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY};L.prototype.setTo=L.prototype.m=function(a,b,c,d){this.I();this.x=a;this.y=b;this.offsetX=c;this.offsetY=d;return this}; -L.prototype.set=L.prototype.set=function(a){this.I();this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY;return this};L.prototype.copy=function(){var a=new L;a.x=this.x;a.y=this.y;a.offsetX=this.offsetX;a.offsetY=this.offsetY;return a};g=L.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this}; -g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this};g.I=function(a){if(this.Ca){var b="The Spot is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};function sb(a,b){a.x=NaN;a.y=NaN;a.offsetX=b;return a}var tb; -L.parse=tb=function(a){if("string"===typeof a){a=a.trim();if("None"===a)return vb;if("TopLeft"===a)return xb;if("Top"===a||"TopCenter"===a||"MiddleTop"===a)return Db;if("TopRight"===a)return Gb;if("Left"===a||"LeftCenter"===a||"MiddleLeft"===a)return Hb;if("Center"===a)return Ib;if("Right"===a||"RightCenter"===a||"MiddleRight"===a)return Jb;if("BottomLeft"===a)return Kb;if("Bottom"===a||"BottomCenter"===a||"MiddleBottom"===a)return Ub;if("BottomRight"===a)return Vb;if("TopSide"===a)return Wb;if("LeftSide"=== -a)return Xb;if("RightSide"===a)return Yb;if("BottomSide"===a)return Zb;if("TopBottomSides"===a)return $b;if("LeftRightSides"===a)return ac;if("TopLeftSides"===a)return bc;if("TopRightSides"===a)return cc;if("BottomLeftSides"===a)return hc;if("BottomRightSides"===a)return ic;if("NotTopSide"===a)return lc;if("NotLeftSide"===a)return mc;if("NotRightSide"===a)return rc;if("NotBottomSide"===a)return sc;if("AllSides"===a)return tc;if("Default"===a)return uc;a=a.split(" ");for(var b=0,c=0;""===a[b];)b++; -var d=a[b++];void 0!==d&&0b.offset?1:-1});for(k=0;k=2*Math.PI?(Vc(a,b,c,d,e,e+Math.PI,h),Vc(a,b,c,d,e+Math.PI,e+2*Math.PI,h),a.path.push(["M",l,f])):(b+=d*Math.cos(e),c+=d*Math.sin(e),k=180*k/Math.PI,e=h?0:1,h=180<=k==!!h?0:1,0!==a.path.length?a.path.push(["L",b,c]):a.path.push(["M",b,c]),a.path.push(["A",d,d,k,h,e,l,f]))}}function Uc(a,b,c,d,e,f,h){var k=new Lc;k.$e=[b,c,d,e,f,h];b={};Xc(a,"g",b,k);k=a.addElement("g",b);a.rf.push(k)} -g.$a=function(){if(0!==this.shadowOffsetX||0!==this.shadowOffsetY||0!==this.shadowBlur){var a="SHADOW"+this.HE;this.HE++;var b=this.addElement("filter",{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},null),c,d,e,f,h;c=Oc(this,"feGaussianBlur",{"in":"SourceAlpha",result:"blur",vK:this.shadowBlur/2});d=Oc(this,"feFlood",{"in":"blur",result:"flood","flood-color":this.shadowColor});e=Oc(this,"feComposite",{"in":"flood",in2:"blur",operator:"in",result:"comp"});f=Oc(this,"feOffset",{"in":"comp",result:"offsetBlur", -dx:this.shadowOffsetX,dy:this.shadowOffsetY});h=Oc(this,"feMerge",{});h.appendChild(Oc(this,"feMergeNode",{"in":"offsetBlur"}));h.appendChild(Oc(this,"feMergeNode",{"in":"SourceGraphic"}));b.appendChild(c);b.appendChild(d);b.appendChild(e);b.appendChild(f);b.appendChild(h);0=a)return 0;var b=K.vA;if(null===b){for(var b=[],c=0;2E3>=c;c++)b[c]=Math.sqrt(c);K.vA=b}return 1>a? -(c=1/a,2E3>=c?1/b[c|0]:Math.sqrt(a)):2E3>=a?b[a|0]:Math.sqrt(a)},D:function(a,b){var c=a-b;return.5>c&&-.5c&&-5E-8=e&&(e=1E-6);var k=0,l=0,m=0,n=0;am-n)if(a-c>e||c-a>e){if(f=(d-b)/(c-a)*(f-a)+b,f-e<=h&&h<=f+e)return!0}else return!0;else if(b- -d>e||d-b>e){if(h=(c-a)/(d-b)*(h-b)+a,h-e<=f&&f<=h+e)return!0}else return!0;return!1},Iv:function(a,b,c,d,e,f,h,k,l,m,n,p){if(K.Hd(a,b,h,k,p,c,d)&&K.Hd(a,b,h,k,p,e,f))return K.Hd(a,b,h,k,p,m,n);var q=(a+c)/2,r=(b+d)/2,s=(c+e)/2,t=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(q+s)/2;c=(r+t)/2;var s=(s+e)/2,t=(t+f)/2,v=(d+s)/2,x=(c+t)/2;return K.Iv(a,b,q,r,d,c,v,x,l,m,n,p)||K.Iv(v,x,s,t,e,f,h,k,l,m,n,p)},UF:function(a,b,c,d,e,f,h,k,l){var m=(c+e)/2,n=(d+f)/2;l.x=(((a+c)/2+m)/2+(m+(e+h)/2)/2)/2;l.y=(((b+d)/2+n)/2+(n+ -(f+k)/2)/2)/2;return l},TF:function(a,b,c,d,e,f,h,k){var l=(c+e)/2,m=(d+f)/2;return Za(((a+c)/2+l)/2,((b+d)/2+m)/2,(l+(e+h)/2)/2,(m+(f+k)/2)/2)},oo:function(a,b,c,d,e,f,h,k,l,m){if(K.Hd(a,b,h,k,l,c,d)&&K.Hd(a,b,h,k,l,e,f))kb(m,a,b,0,0),kb(m,h,k,0,0);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;K.oo(a,b,n,p,d,c,s,t,l,m);K.oo(s,t,q,r,e,f,h,k,l,m)}return m},ye:function(a,b,c,d,e,f,h,k,l,m){if(K.Hd(a,b,h,k,l,c,d)&& -K.Hd(a,b,h,k,l,e,f))0===m.length&&(m.push(a),m.push(b)),m.push(h),m.push(k);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;K.ye(a,b,n,p,d,c,s,t,l,m);K.ye(s,t,q,r,e,f,h,k,l,m)}return m},Oz:function(a,b,c,d,e,f,h,k,l,m){if(K.Hd(a,b,e,f,m,c,d))return K.Hd(a,b,e,f,m,k,l);var n=(a+c)/2,p=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var q=(n+c)/2,r=(p+d)/2;return K.Oz(a,b,n,p,q,r,h,k,l,m)||K.Oz(q,r,c,d,e,f,h,k,l,m)},nK:function(a,b,c, -d,e,f,h){h.x=((a+c)/2+(c+e)/2)/2;h.y=((b+d)/2+(d+f)/2)/2;return h},Nz:function(a,b,c,d,e,f,h,k){if(K.Hd(a,b,e,f,h,c,d))kb(k,a,b,0,0),kb(k,e,f,0,0);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;K.Nz(a,b,l,m,n,p,h,k);K.Nz(n,p,c,d,e,f,h,k)}return k},Xo:function(a,b,c,d,e,f,h,k){if(K.Hd(a,b,e,f,h,c,d))0===k.length&&(k.push(a),k.push(b)),k.push(e),k.push(f);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;K.Xo(a,b,l,m,n,p,h,k);K.Xo(n,p,c,d,e,f,h,k)}return k}, -js:function(a,b,c,d,e,f,h,k,l,m,n,p,q,r){0>=q&&(q=1E-6);if(K.Hd(a,b,h,k,q,c,d)&&K.Hd(a,b,h,k,q,e,f)){var s=(a-h)*(m-p)-(b-k)*(l-n);if(0===s)return!1;q=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/s;s=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/s;if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(h=l=0,bh)return!1}else if(ah)return!1;r.x=q;r.y=s;return!0}var s=(a+c)/2,t=(b+d)/2;c=(c+e)/2;d=(d+f)/2;e=(e+h)/2;f=(f+k)/2;var v=(s+c)/2,x=(t+d)/2;c=(c+e)/2;d=(d+f)/2;var B=(v+c)/2,y=(x+d)/ -2,C=(n-l)*(n-l)+(p-m)*(p-m),I=!1;K.js(a,b,s,t,v,x,B,y,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b=q&&(q=1E-6);if(K.Hd(a,b,h,k,q,c,d)&&K.Hd(a,b,h,k,q,e,f)){q=(a-h)*(m-p)-(b-k)*(l-n);if(0===q)return r;var s=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/q,t=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/q;if(s>=n)return r;if((l>n?l-n:n-l)< -(m>p?m-p:p-m)){if(a=l=0,ba)return r}else if(aa)return r;0q&&r--}else{var s=(a+c)/2,t=(b+d)/2,v=(c+e)/2,x=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(s+v)/2;c=(t+x)/2;var v=(v+e)/2,x=(x+f)/2,B=(d+v)/2,y=(c+x)/2,r=r+K.ks(a,b,s,t,d,c,B,y,l,m,n,p,q),r=r+K.ks(B,y,v,x,e,f,h,k,l,m,n,p,q)}return r},Hm:function(a,b,c,d,e,f,h){if(K.mb(a,c)){var k=0;c=0;bc)return h.x=a,h.y=c,!1;h.x=a;h.y=d;return!0}if(K.mb(b, -d)){ac)return h.x=c,h.y=b,!1;h.x=d;h.y=b;return!0}k=((a-e)*(a-c)+(b-f)*(b-d))/((c-a)*(c-a)+(d-b)*(d-b));if(-5E-6>k)return h.x=a,h.y=b,!1;if(1.000005c)return l.x=a,l.y=c,!1;l.x=a;l.y=f;return!0}h=(d-b)/(c-a);if(K.mb(k,h))return K.Hm(a,b,c,d,e,f,l),!1;e=(h*a-k*e+f-b)/(h-k);if(K.mb(h,0)){ac)return l.x=c,l.y=b,!1;l.x=e;l.y=b;return!0}f=h*(e-a)+b;return K.Hm(a,b,c,d,e,f,l)},PJ:function(a,b,c,d,e){return K.$g(c.x,c.y,d.x,d.y,a.x,a.y,b.x,b.y,e)},xJ:function(a,b,c,d,e,f,h,k,l,m){function n(c,d){var e=(c-a)*(c-a)+(d-b)*(d-b);e(c>a?c-a:a-c)){q=1-(c-e)*(c-e)/(q*q);if(0>q)return l;q=Math.sqrt(q);d=-m*q+f;n(c,m*q+f);n(c,d)}else{c=(d-b)/(c-a);d=1/(q*q)+c*c/(m*m);k=2*c*(b-c*a)/(m*m)-2*c*f/(m*m)-2*e/(q*q);q=k*k-4*d*(2*c*a*f/(m*m)-2*b*f/(m*m)+f*f/(m*m)+e*e/(q*q)-1+(b-c*a)*(b-c*a)/(m*m));if(0>q)return l;q=Math.sqrt(q);m=(-k+q)/(2*d);n(m,c*m-c*a+b);q=(-k-q)/(2*d);n(q, -c*q-c*a+b)}return l},bl:function(a,b,c,d,e,f,h,k,l){var m=1E21,n=a,p=b;if(K.$g(a,b,a,d,e,f,h,k,l)){var q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f);qm},dw:function(a,b,c){var d=b.x,e=b.y,f=c.x,h=c.y,k=a.left,l=a.right, -m=a.top,n=a.bottom;return d===f?(f=a=0,e=m):e===h?(d=k):a.Aa(b)||a.Aa(c)||K.cw(k,m,l,m,d,e,f,h)||K.cw(l,m,l,n,d,e,f,h)||K.cw(l,n,k,n,d,e,f,h)||K.cw(k,n,k,m,d,e,f,h)?!0:!1},cw:function(a,b,c,d,e,f,h,k){return 0>=K.Nv(a,b,c,d,e,f)*K.Nv(a,b,c,d,h,k)&&0>=K.Nv(e,f,h,k,a,b)*K.Nv(e,f,h,k,c,d)},Nv:function(a,b,c,d,e,f){c-=a;d-=b;a=e-a;b=f-b;f=a*d-b*c;0===f&&(f=a*c+b*d,0f&&(f=0)));return 0>f?-1:0a&&(a+=360);360<=a&&(a-=360);return a},fD:function(a,b,c,d,e,f){void 0===f&&(f=!1);var h=Math.PI;f||(d*=h/180,e*=h/180);f=dc,f=0>d,h=0,k=h=0;am;++m){b=.5*(k+l);if(b===k||b===l)break;var n=a/(b+f),p=h/(b+e),n=n*n+p*p-1;if(0n)l=b;else break}c=f*c/(b+f)-c;d=e*d/(b+e)-d;e=Math.sqrt(c*c+d*d)}else e=Math.abs(d-b);else d=a*a-b*b,e=a*c,ea?"M"+this.ua.toString()+" "+this.va.toString()+"L"+this.F.toString()+" "+this.G.toString():"M"+this.ua.toFixed(a)+" "+this.va.toFixed(a)+"L"+this.F.toFixed(a)+" "+this.G.toFixed(a);case md:var b=new z(this.ua,this.va,0,0);b.YE(this.F,this.G,0,0);return 0>a?"M"+b.x.toString()+" "+b.y.toString()+"H"+b.right.toString()+"V"+b.bottom.toString()+"H"+b.left.toString()+"z":"M"+b.x.toFixed(a)+" "+b.y.toFixed(a)+"H"+b.right.toFixed(a)+ -"V"+b.bottom.toFixed(a)+"H"+b.left.toFixed(a)+"z";case nd:b=new z(this.ua,this.va,0,0);b.YE(this.F,this.G,0,0);if(0>a){var c=b.left.toString()+" "+(b.y+b.height/2).toString(),d=b.right.toString()+" "+(b.y+b.height/2).toString();return"M"+c+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+d+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+c}c=b.left.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);d=b.right.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);return"M"+c+"A"+(b.width/ -2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+d+"A"+(b.width/2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+c;case ad:for(var b="",c=this.ub.n,d=c.length,e=0;e=t-1?!0:null!==l[m+1].match(/[A-Za-z]/)}function d(){m++;return l[m]}function e(){var a=new w(parseFloat(d()),parseFloat(d()));n===n.toLowerCase()&&(a.x=s.x+a.x,a.y=s.y+a.y);return a}function f(){return s=e()}function h(){return r=e()}function k(){return"c"!==p.toLowerCase()&&"s"!==p.toLowerCase()?s:new w(2*s.x-r.x,2*s.y-r.y)}void 0===b&&(b=!1);"string"!==typeof a&&u.Kd(a,"string",$c,"parse:str");a=a.replace(/,/gm," ");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, -"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([^\s])/gm,"$1 $2");a=a.replace(/([^\s])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([0-9])([+\-])/gm,"$1 $2");a=a.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");a=a.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");a=a.replace(/[\s\r\t\n]+/gm," ");a=a.replace(/^\s+|\s+$/g,"");for(var l=a.split(" "),m=-1,n="",p="",q=new w(0,0),r=new w(0,0),s=new w(0, -0),t=l.length,v=u.p(),x=!1,B=!1,y=!0;!(m>=t-1);)if(p=n,n=d(),""!==n)switch(n.toUpperCase()){case "X":y=!0;B=x=!1;break;case "M":var C=f();null===v.Tb||!0===y?(M(v,C.x,C.y,x,!1,!B),y=!1):v.moveTo(C.x,C.y);for(q=s;!c();)C=f(),v.lineTo(C.x,C.y);break;case "L":for(;!c();)C=f(),v.lineTo(C.x,C.y);break;case "H":for(;!c();)s=C=new w((n===n.toLowerCase()?s.x:0)+parseFloat(d()),s.y),v.lineTo(s.x,s.y);break;case "V":for(;!c();)s=C=new w(s.x,(n===n.toLowerCase()?s.y:0)+parseFloat(d())),v.lineTo(s.x,s.y);break; -case "C":for(;!c();){var I=e(),H=h(),C=f();O(v,I.x,I.y,H.x,H.y,C.x,C.y)}break;case "S":for(;!c();)I=k(),H=h(),C=f(),O(v,I.x,I.y,H.x,H.y,C.x,C.y);break;case "Q":for(;!c();)H=h(),C=f(),td(v,H.x,H.y,C.x,C.y);break;case "T":for(;!c();)r=H=k(),C=f(),td(v,H.x,H.y,C.x,C.y);break;case "B":for(;!c();){var C=parseFloat(d()),I=parseFloat(d()),H=parseFloat(d()),T=parseFloat(d()),aa=parseFloat(d()),R=aa,N=!1;c()||(R=parseFloat(d()),c()||(N=0!==parseFloat(d())));n===n.toLowerCase()&&(H+=s.x,T+=s.y);v.arcTo(C,I, -H,T,aa,R,N)}break;case "A":for(;!c();)I=Math.abs(parseFloat(d())),H=Math.abs(parseFloat(d())),T=parseFloat(d()),aa=!!parseFloat(d()),R=!!parseFloat(d()),C=f(),ud(v,I,H,T,aa,R,C.x,C.y);break;case "Z":C=v.o.ub.n[v.o.ub.length-1];P(v);s=q;break;case "F":C="";for(I=1;l[m+I];)if(null!==l[m+I].match(/[Uu]/))I++;else if(null===l[m+I].match(/[A-Za-z]/))I++;else{C=l[m+I];break}C.match(/[Mm]/)?x=!0:vd(v);break;case "U":C="";for(I=1;l[m+I];)if(null!==l[m+I].match(/[Ff]/))I++;else if(null===l[m+I].match(/[A-Za-z]/))I++; -else{C=l[m+I];break}C.match(/[Mm]/)?B=!0:v.$a(!1)}q=v.o;u.q(v);if(b)for(v=q.ub.i;v.next();)C=v.value,C.Ns=!0;return q};function wd(a,b){for(var c=a.length,d=u.K(),e=0;eh&&(h+=360),s.Je+=h);0>a&&(s.Je=180-s.Je,s.Qf=-s.Qf);0>d&&(s.Je=-s.Je,s.Qf=-s.Qf);s.radiusX*=Math.sqrt(a*a+c*c);void 0!==s.radiusY&&(s.radiusY*=Math.sqrt(b*b+d*d));break;case Gd:h=s.F;k=s.G;s.F=h* -a+k*c+e;s.G=h*b+k*d+f;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.Pi+=h);0>a&&(s.Pi=180-s.Pi,s.fl=!s.fl);0>d&&(s.Pi=-s.Pi,s.fl=!s.fl);s.radiusX*=Math.sqrt(a*a+c*c);s.radiusY*=Math.sqrt(b*b+d*d);break;default:u.k("Unknown Segment type: "+s.type)}}}}this.Ta=!0;return this}; -$c.prototype.Xr=function(a,b){var c=this.nc,d=this.uc,e=this.pb,f=this.Bb,h=Math.min(c,e),k=Math.min(d,f),c=Math.abs(e-c),d=Math.abs(f-d),f=u.K();f.x=h;f.y=k;b.ab(f);e=new bd(f.x,f.y);f.x=h+c;f.y=k;b.ab(f);e.Fa.add(new Jd(pd,f.x,f.y));f.x=h+c;f.y=k+d;b.ab(f);e.Fa.add(new Jd(pd,f.x,f.y));f.x=h;f.y=k+d;b.ab(f);e.Fa.add((new Jd(pd,f.x,f.y)).close());u.v(f);a.type=ad;a.ub.add(e);return a}; -$c.prototype.Aa=function(a,b,c,d){var e=a.x,f=a.y,h=this.kb.x-20;a=a.y;for(var k=0,l=0,m=0,n=0,p=0,q=0,r=this.ub.n,s=r.length,t=0;t=a)return 0;if((e>h?e-h:h-e)<(f>k?f-k:k-f)){if(e=a=0,fe)return 0}else if(ee)return 0;return 0a||1a)return n=(a-q)/p,u.ra(c),new w(b+(e-b)*n,d+(f-d)*n);q+=p}b=e;d=f}u.ra(c);return null};u.defineProperty($c,{type:"type"},function(){return this.oa},function(a){this.oa!==a&&(u.I(this,a),this.oa=a,this.Ta=!0)});u.defineProperty($c,{ua:"startX"},function(){return this.nc},function(a){this.nc!==a&&(u.I(this,a),this.nc=a,this.Ta=!0)}); -u.defineProperty($c,{va:"startY"},function(){return this.uc},function(a){this.uc!==a&&(u.I(this,a),this.uc=a,this.Ta=!0)});u.defineProperty($c,{F:"endX"},function(){return this.pb},function(a){this.pb!==a&&(u.I(this,a),this.pb=a,this.Ta=!0)});u.defineProperty($c,{G:"endY"},function(){return this.Bb},function(a){this.Bb!==a&&(u.I(this,a),this.Bb=a,this.Ta=!0)});u.defineProperty($c,{ub:"figures"},function(){return this.Zi},function(a){this.Zi!==a&&(u.I(this,a),this.Zi=a,this.Ta=!0)}); -$c.prototype.add=$c.prototype.add=function(a){this.Zi.add(a);return this};u.defineProperty($c,{A:"spot1"},function(){return this.ri},function(a){u.I(this,a);this.ri=a.Z()});u.defineProperty($c,{B:"spot2"},function(){return this.si},function(a){u.I(this,a);this.si=a.Z()});u.defineProperty($c,{Bd:"defaultStretch"},function(){return this.bi},function(a){u.I(this,a);this.bi=a});u.u($c,{kb:"bounds"},function(){this.vz()&&(this.nA(),this.kg());return this.Ut}); -function bd(a,b,c,d){u.gc(this);this.Ca=!1;void 0===c&&(c=!0);this.Il=c;void 0===d&&(d=!0);this.En=d;this.nc=void 0!==a?a:0;this.uc=void 0!==b?b:0;this.Yn=new E(Jd);this.cv=this.Yn.U;this.Ta=!0}u.fa("PathFigure",bd);u.Lh(bd);bd.prototype.copy=function(){var a=new bd;a.Il=this.Il;a.En=this.En;a.nc=this.nc;a.uc=this.uc;for(var b=this.Yn.n,c=b.length,d=a.Yn,e=0;ea?"M"+this.ua.toString()+" "+this.va.toString():"M"+this.ua.toFixed(a)+" "+this.va.toFixed(a),c=this.Fa.n,d=c.length,e=0;ea&&(a+=360),this.bd=a),void 0!==d&&(this.dg=Math.max(d,0)),void 0!==e&&(this.eg=Math.max(e,0)),this.Ln=!!h,this.bn=!!k):(void 0!==d&&(this.bd=d),void 0!==e&&(this.xe=e),void 0!==f&&(a===Bd&&(f=Math.max(f,0)),this.dg=f),void 0!==h&&"number"===typeof h&&(a===Bd&&(h=Math.max(h,0)),this.eg=h));this.zh=!1;this.Ta=!0;this.Ri=null} -u.fa("PathSegment",Jd);u.Lh(Jd);Jd.prototype.copy=function(){var a=new Jd;a.oa=this.oa;a.pb=this.pb;a.Bb=this.Bb;void 0!==this.bd&&(a.bd=this.bd);void 0!==this.xe&&(a.xe=this.xe);void 0!==this.dg&&(a.dg=this.dg);void 0!==this.eg&&(a.eg=this.eg);void 0!==this.Ln&&(a.Ln=this.Ln);void 0!==this.bn&&(a.bn=this.bn);a.zh=this.zh;a.Ta=this.Ta;return a}; -Jd.prototype.equalsApprox=Jd.prototype.De=function(a){if(!(a instanceof Jd)||this.type!==a.type||this.ew!==a.ew)return!1;switch(this.type){case yd:case pd:return K.D(this.F,a.F)&&K.D(this.G,a.G);case zd:return K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.Rb,a.Rb)&&K.D(this.jc,a.jc)&&K.D(this.df,a.df)&&K.D(this.ef,a.ef);case Ad:return K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.Rb,a.Rb)&&K.D(this.jc,a.jc);case Bd:return K.D(this.Je,a.Je)&&K.D(this.Qf,a.Qf)&&K.D(this.Ja,a.Ja)&&K.D(this.Ua,a.Ua)&&K.D(this.radiusX, -a.radiusX)&&K.D(this.radiusY,a.radiusY);case Gd:return this.fl===a.fl&&this.hw===a.hw&&K.D(this.Pi,a.Pi)&&K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.radiusX,a.radiusX)&&K.D(this.radiusY,a.radiusY);default:return!1}}; -Jd.prototype.toString=function(a){void 0===a&&(a=-1);var b="";switch(this.type){case yd:b=0>a?"M"+this.F.toString()+" "+this.G.toString():"M"+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case pd:b=0>a?"L"+this.F.toString()+" "+this.G.toString():"L"+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case zd:b=0>a?"C"+this.Rb.toString()+" "+this.jc.toString()+" "+this.df.toString()+" "+this.ef.toString()+" "+this.F.toString()+" "+this.G.toString():"C"+this.Rb.toFixed(a)+" "+this.jc.toFixed(a)+" "+this.df.toFixed(a)+ -" "+this.ef.toFixed(a)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case Ad:b=0>a?"Q"+this.Rb.toString()+" "+this.jc.toString()+" "+this.F.toString()+" "+this.G.toString():"Q"+this.Rb.toFixed(a)+" "+this.jc.toFixed(a)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case Bd:b=0>a?"B"+this.Je.toString()+" "+this.Qf.toString()+" "+this.Ja.toString()+" "+this.Ua.toString()+" "+this.radiusX:"B"+this.Je.toFixed(a)+" "+this.Qf.toFixed(a)+" "+this.Ja.toFixed(a)+" "+this.Ua.toFixed(a)+" "+this.radiusX; -break;case Gd:b=0>a?"A"+this.radiusX.toString()+" "+this.radiusY.toString()+" "+this.Pi.toString()+" "+(this.hw?1:0)+" "+(this.fl?1:0)+" "+this.F.toString()+" "+this.G.toString():"A"+this.radiusX.toFixed(a)+" "+this.radiusY.toFixed(a)+" "+this.Pi.toFixed(a)+" "+(this.hw?1:0)+" "+(this.fl?1:0)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;default:b=this.type.toString()}return b+(this.zh?"z":"")};var yd;Jd.Move=yd=u.s(Jd,"Move",0);var pd;Jd.Line=pd=u.s(Jd,"Line",1);var zd; -Jd.Bezier=zd=u.s(Jd,"Bezier",2);var Ad;Jd.QuadraticBezier=Ad=u.s(Jd,"QuadraticBezier",3);var Bd;Jd.Arc=Bd=u.s(Jd,"Arc",4);var Gd;Jd.SvgArc=Gd=u.s(Jd,"SvgArc",4);Jd.prototype.freeze=function(){this.Ca=!0;return this};Jd.prototype.La=function(){this.Ca=!1;return this};Jd.prototype.close=Jd.prototype.close=function(){this.zh=!0;return this}; -function Hd(a,b){if(null!==a.Ri&&!1===b.Ta)return a.Ri;var c=a.radiusX,d=a.radiusY;void 0===d&&(d=c);var e=a.bd,f=a.xe,h=K.fD(0,0,c=s?k=Math.PI:1<=s&&(k=0);!m&&0k&&(k+=2*Math.PI);m=b>h?1:b/h;s=b>h?h/b:1;b=K.fD(0,0,b>h?b:h,p,p+k,!0);h=u.jh();h.reset();h.translate(c,d);h.rotate(a.bd,0,0);h.scale(m,s);wd(b,h);u.Ye(h);a.Ri=b;return a.Ri} -u.defineProperty(Jd,{ew:"isClosed"},function(){return this.zh},function(a){this.zh!==a&&(this.zh=a,this.Ta=!0)});u.defineProperty(Jd,{type:"type"},function(){return this.oa},function(a){u.I(this,a);this.oa=a;this.Ta=!0});u.defineProperty(Jd,{F:"endX"},function(){return this.pb},function(a){u.I(this,a);this.pb=a;this.Ta=!0});u.defineProperty(Jd,{G:"endY"},function(){return this.Bb},function(a){u.I(this,a);this.Bb=a;this.Ta=!0}); -u.defineProperty(Jd,{Rb:"point1X"},function(){return this.bd},function(a){u.I(this,a);this.bd=a;this.Ta=!0});u.defineProperty(Jd,{jc:"point1Y"},function(){return this.xe},function(a){u.I(this,a);this.xe=a;this.Ta=!0});u.defineProperty(Jd,{df:"point2X"},function(){return this.dg},function(a){u.I(this,a);this.dg=a;this.Ta=!0});u.defineProperty(Jd,{ef:"point2Y"},function(){return this.eg},function(a){u.I(this,a);this.eg=a;this.Ta=!0}); -u.defineProperty(Jd,{Ja:"centerX"},function(){return this.bd},function(a){u.I(this,a);this.bd=a;this.Ta=!0});u.defineProperty(Jd,{Ua:"centerY"},function(){return this.xe},function(a){u.I(this,a);this.xe=a;this.Ta=!0});u.defineProperty(Jd,{radiusX:"radiusX"},function(){return this.dg},function(a){0>a&&u.wa(a,">= zero",Jd,"radiusX");u.I(this,a);this.dg=a;this.Ta=!0}); -u.defineProperty(Jd,{radiusY:"radiusY"},function(){return this.eg},function(a){0>a&&u.wa(a,">= zero",Jd,"radiusY");u.I(this,a);this.eg=a;this.Ta=!0});u.defineProperty(Jd,{Je:"startAngle"},function(){return this.pb},function(a){this.pb!==a&&(u.I(this,a),a%=360,0>a&&(a+=360),this.pb=a,this.Ta=!0)});u.defineProperty(Jd,{Qf:"sweepAngle"},function(){return this.Bb},function(a){u.I(this,a);360a&&(a=-360);this.Bb=a;this.Ta=!0}); -u.defineProperty(Jd,{fl:"isClockwiseArc"},function(){return this.bn},function(a){u.I(this,a);this.bn=a;this.Ta=!0});u.defineProperty(Jd,{hw:"isLargeArc"},function(){return this.Ln},function(a){u.I(this,a);this.Ln=a;this.Ta=!0});u.defineProperty(Jd,{Pi:"xAxisRotation"},function(){return this.bd},function(a){a%=360;0>a&&(a+=360);u.I(this,a);this.bd=a;this.Ta=!0}); -function Md(){this.Y=null;this.Hy=(new w(0,0)).freeze();this.Cx=(new w(0,0)).freeze();this.Rt=this.Mu=0;this.Au="";this.rv=this.gu=!1;this.cu=this.Tt=0;this.Si=this.nu=this.wu=!1;this.Vp=null;this.qv=0;this.fg=this.nv=null}u.fa("InputEvent",Md); -Md.prototype.copy=function(){var a=new Md;a.Y=this.Y;a.Hy.assign(this.ff);a.Cx.assign(this.da);a.Mu=this.Mu;a.Rt=this.Rt;a.Au=this.Au;a.gu=this.gu;a.rv=this.rv;a.Tt=this.Tt;a.cu=this.cu;a.wu=this.wu;a.nu=this.nu;a.Si=this.Si;a.Vp=this.Vp;a.qv=this.qv;a.nv=this.nv;a.fg=this.fg;return a}; -Md.prototype.toString=function(){var a="^";0!==this.gd&&(a+="M:"+this.gd);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.Te&&(a+="C:"+this.Te);0!==this.Uk&&(a+="D:"+this.Uk);this.Tc&&(a+="h");this.bubbles&&(a+="b");null!==this.da&&(a+="@"+this.da.toString());return a};u.defineProperty(Md,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Md,{ff:"viewPoint"},function(){return this.Hy},function(a){u.C(a,w,Md,"viewPoint");this.Hy.assign(a)}); -u.defineProperty(Md,{da:"documentPoint"},function(){return this.Cx},function(a){u.C(a,w,Md,"documentPoint");this.Cx.assign(a)});u.defineProperty(Md,{gd:"modifiers"},function(){return this.Mu},function(a){this.Mu=a});u.defineProperty(Md,{button:"button"},function(){return this.Rt},function(a){this.Rt=a});u.defineProperty(Md,{key:"key"},function(){return this.Au},function(a){this.Au=a});u.defineProperty(Md,{Wk:"down"},function(){return this.gu},function(a){this.gu=a}); -u.defineProperty(Md,{up:"up"},function(){return this.rv},function(a){this.rv=a});u.defineProperty(Md,{Te:"clickCount"},function(){return this.Tt},function(a){this.Tt=a});u.defineProperty(Md,{Uk:"delta"},function(){return this.cu},function(a){this.cu=a});u.defineProperty(Md,{Ps:"isMultiTouch"},function(){return this.wu},function(a){this.wu=a});u.defineProperty(Md,{Tc:"handled"},function(){return this.nu},function(a){this.nu=a}); -u.defineProperty(Md,{bubbles:"bubbles"},function(){return this.Si},function(a){this.Si=a});u.defineProperty(Md,{event:"event"},function(){return this.Vp},function(a){this.Vp=a});u.u(Md,{jl:"isTouchEvent"},function(){var a=window.TouchEvent;return a&&this.event instanceof a?!0:(a=window.PointerEvent)&&this.event instanceof a&&"touch"===this.event.pointerType});u.defineProperty(Md,{timestamp:"timestamp"},function(){return this.qv},function(a){this.qv=a}); -u.defineProperty(Md,{Cg:"targetDiagram"},function(){return this.nv},function(a){this.nv=a});u.defineProperty(Md,{pe:"targetObject"},function(){return this.fg},function(a){this.fg=a});u.defineProperty(Md,{control:"control"},function(){return 0!==(this.gd&1)},function(a){this.gd=a?this.gd|1:this.gd&-2});u.defineProperty(Md,{shift:"shift"},function(){return 0!==(this.gd&4)},function(a){this.gd=a?this.gd|4:this.gd&-5}); -u.defineProperty(Md,{alt:"alt"},function(){return 0!==(this.gd&2)},function(a){this.gd=a?this.gd|2:this.gd&-3});u.defineProperty(Md,{Ys:"meta"},function(){return 0!==(this.gd&8)},function(a){this.gd=a?this.gd|8:this.gd&-9});u.defineProperty(Md,{left:"left"},function(){return 0===this.button},function(a){this.button=a?0:2});u.defineProperty(Md,{YJ:"middle"},function(){return 1===this.button},function(a){this.button=a?1:0}); -u.defineProperty(Md,{right:"right"},function(){return 2===this.button},function(a){this.button=a?2:0});function Nd(){this.Y=null;this.Ub="";this.Vu=this.iv=null;this.St=!1}u.fa("DiagramEvent",Nd);Nd.prototype.copy=function(){var a=new Nd;a.Y=this.Y;a.Ub=this.Ub;a.iv=this.iv;a.Vu=this.Vu;a.St=this.St;return a};Nd.prototype.toString=function(){var a="*"+this.name;this.cancel&&(a+="x");null!==this.hA&&(a+=":"+this.hA.toString());null!==this.Mz&&(a+="("+this.Mz.toString()+")");return a}; -u.defineProperty(Nd,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Nd,{name:"name"},function(){return this.Ub},function(a){this.Ub=a});u.defineProperty(Nd,{hA:"subject"},function(){return this.iv},function(a){this.iv=a});u.defineProperty(Nd,{Mz:"parameter"},function(){return this.Vu},function(a){this.Vu=a});u.defineProperty(Nd,{cancel:"cancel"},function(){return this.St},function(a){this.St=a}); -function Zd(){this.Bp=$d;this.Xl=this.Lu="";this.Wq=this.Xq=this.ar=this.br=this.$q=this.Y=this.Od=null}u.fa("ChangedEvent",Zd);var ae;Zd.Transaction=ae=u.s(Zd,"Transaction",-1);var $d;Zd.Property=$d=u.s(Zd,"Property",0);var be;Zd.Insert=be=u.s(Zd,"Insert",1);var ce;Zd.Remove=ce=u.s(Zd,"Remove",2);Zd.prototype.clear=Zd.prototype.clear=function(){this.Wq=this.Xq=this.ar=this.br=this.$q=this.Y=this.Od=null}; -Zd.prototype.copy=function(){var a=new Zd;a.Od=this.Od;a.Y=this.Y;a.Bp=this.Bp;a.Lu=this.Lu;a.Xl=this.Xl;a.$q=this.$q;var b=this.br;a.br=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;b=this.ar;a.ar=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;b=this.Xq;a.Xq=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;b=this.Wq;a.Wq=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;return a}; -Zd.prototype.toString=function(){var a="",a=this.Ad===ae?a+"* ":this.Ad===$d?a+(null!==this.ga?"!m":"!d"):a+((null!==this.ga?"!m":"!d")+this.Ad);this.propertyName&&"string"===typeof this.propertyName&&(a+=" "+this.propertyName);this.Lf&&this.Lf!==this.propertyName&&(a+=" "+this.Lf);a+=": ";this.Ad===ae?null!==this.oldValue&&(a+=" "+this.oldValue):(null!==this.object&&(a+=de(this.object)),null!==this.oldValue&&(a+=" old: "+de(this.oldValue)),null!==this.zg&&(a+=" "+this.zg),null!==this.newValue&& -(a+=" new: "+de(this.newValue)),null!==this.xg&&(a+=" "+this.xg));return a};Zd.prototype.getValue=Zd.prototype.ta=function(a){return a?this.oldValue:this.newValue};Zd.prototype.getParam=function(a){return a?this.zg:this.xg};Zd.prototype.canUndo=Zd.prototype.canUndo=function(){return null!==this.ga||null!==this.g?!0:!1};Zd.prototype.undo=Zd.prototype.undo=function(){this.canUndo()&&(null!==this.ga?this.ga.pm(this,!0):null!==this.g&&this.g.pm(this,!0))}; -Zd.prototype.canRedo=Zd.prototype.canRedo=function(){return null!==this.ga||null!==this.g?!0:!1};Zd.prototype.redo=Zd.prototype.redo=function(){this.canRedo()&&(null!==this.ga?this.ga.pm(this,!1):null!==this.g&&this.g.pm(this,!1))};u.defineProperty(Zd,{ga:"model"},function(){return this.Od},function(a){this.Od=a});u.defineProperty(Zd,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Zd,{Ad:"change"},function(){return this.Bp},function(a){this.Bp=a}); -u.defineProperty(Zd,{Lf:"modelChange"},function(){return this.Lu},function(a){this.Lu=a});u.defineProperty(Zd,{propertyName:"propertyName"},function(){return this.Xl},function(a){this.Xl=a});u.u(Zd,{IJ:"isTransactionFinished"},function(){return this.Bp===ae&&("CommittedTransaction"===this.Xl||"FinishedUndo"===this.Xl||"FinishedRedo"===this.Xl)});u.defineProperty(Zd,{object:"object"},function(){return this.$q},function(a){this.$q=a}); -u.defineProperty(Zd,{oldValue:"oldValue"},function(){return this.br},function(a){this.br=a});u.defineProperty(Zd,{zg:"oldParam"},function(){return this.ar},function(a){this.ar=a});u.defineProperty(Zd,{newValue:"newValue"},function(){return this.Xq},function(a){this.Xq=a});u.defineProperty(Zd,{xg:"newParam"},function(){return this.Wq},function(a){this.Wq=a}); -function J(a){1=d)return"[]";var e=new Ba;e.add("[ ");c&&1b||(u.zi(this.mf,b),Le(this,"nodeDataArray",ce,"nodeDataArray",this,a,null,b,null),this.zt(a)))}}; -J.prototype.removeNodeDataCollection=function(a){if(u.isArray(a))for(var b=u.qb(a),c=0;cb&&(b=u.qb(a));u.yi(a,b,c);Le(this,"",be,"",a,null,c,null,b)};J.prototype.removeArrayItem=function(a,b){void 0===b&&(b=-1);a===this.mf&&u.k("Model.removeArrayItem should not be called on the Model.nodeDataArray");-1===b&&(b=u.qb(a)-1);var c=u.fb(a,b);u.zi(a,b);Le(this,"",ce,"",a,c,null,b,null)}; -u.defineProperty(J,{Im:"nodeCategoryProperty"},function(){return this.Yq},function(a){var b=this.Yq;b!==a&&(Me(a,J,"nodeCategoryProperty"),this.Yq=a,this.h("nodeCategoryProperty",b,a))});J.prototype.getCategoryForNodeData=J.prototype.fz=function(a){if(null===a)return"";var b=this.Yq;if(""===b)return"";b=u.sb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;u.k("getCategoryForNodeData found a non-string category for "+a+": "+b);return""}; -J.prototype.setCategoryForNodeData=J.prototype.Dw=function(a,b){u.j(b,"string",J,"setCategoryForNodeData:cat");if(null!==a){var c=this.Yq;if(""!==c)if(this.Ue(a)){var d=u.sb(a,c);void 0===d&&(d="");d!==b&&(u.Oa(a,c,b),Le(this,"nodeCategory",$d,c,a,d,b))}else u.Oa(a,c,b)}}; -function Q(a,b){2e||(u.zi(d,e),this.Ci(a)&&(Qe(this,b,a),Le(this,"linkLabelKeys",ce,c,a,b,null)))}else void 0!==d&&u.k(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}}; -u.defineProperty(Q,{Qj:"linkDataArray"},function(){return this.Bh},function(a){var b=this.Bh;if(b!==a){u.Qy(a,Q,"linkDataArray");for(var c=u.qb(a),d=0;db)){u.zi(this.Bh,b);Le(this,"linkDataArray",ce,"linkDataArray",this,a,null,b,null);b=this.$k(a);Qe(this,b,a);b=this.cl(a);Qe(this,b,a);var c=this.Pj(a);if(u.isArray(c))for(var d=u.qb(c),e=0;ea.Le&&u.trace("Ending transaction without having started a transaction: "+c);var d=1===a.Le;d&&b&&a.isEnabled&&a.Rc("CommittingTransaction",c,a.Di);var e=0;if(0a.Ii;e--)f=d.ja(e),null!== -f&&f.clear(),d.hd(e),a.Yx=!0;e=a.VD;0===e&&(e=1);0=e&&(f=d.ja(0),null!==f&&f.clear(),d.hd(0),a.Ig--);d.add(b);a.Ig++;d.freeze();f=b}a.Rc("CommittedTransaction",c,f)}else{a.fi=!0;try{a.isEnabled&&null!==f&&(f.Ms=!0,f.undo())}finally{a.Rc("RolledBackTransaction",c,f),a.fi=!1}null!==f&&f.clear()}a.bu=null;return!0}if(a.isEnabled&&!b&&null!==f){a=e;c=f.Ug;for(b=c.count-1;b>=a;b--)d=c.ja(b),null!==d&&d.undo(),c.La(),c.hd(b);c.freeze()}return!1} -ee.prototype.canUndo=ee.prototype.canUndo=function(){if(!this.isEnabled||0=this.Le&&!this.Kx&&(a=a.g,null!==a&&!1===a.lf||u.trace("Change not within a transaction: "+c.toString()))}}; -ee.prototype.skipsEvent=function(a){if(null===a||0>a.Ad.value)return!0;a=a.object;if(a instanceof S){if(a=a.layer,null!==a&&a.Ac)return!0}else if(a instanceof we&&a.Ac)return!0;return!1};u.u(ee,{BH:"models"},function(){return this.hy.i});u.defineProperty(ee,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){this.Ne=a});u.u(ee,{UE:"transactionToUndo"},function(){return 0<=this.Ii&&this.Ii<=this.history.count-1?this.history.ja(this.Ii):null}); -u.u(ee,{TE:"transactionToRedo"},function(){return this.Iib.Xg||(b.scale=a))};sa.prototype.canDecreaseZoom=function(a){void 0===a&&(a=1/this.Ow);u.ze(a,sa,"canDecreaseZoom:factor");var b=this.g;if(null===b||b.no!==vf)return!1;a*=b.scale;return ab.Xg?!1:b.Gv}; -sa.prototype.increaseZoom=function(a){void 0===a&&(a=this.Ow);u.ze(a,sa,"increaseZoom:factor");var b=this.g;null!==b&&b.no===vf&&(a*=b.scale,ab.Xg||(b.scale=a))};sa.prototype.canIncreaseZoom=function(a){void 0===a&&(a=this.Ow);u.ze(a,sa,"canIncreaseZoom:factor");var b=this.g;if(null===b||b.no!==vf)return!1;a*=b.scale;return ab.Xg?!1:b.Gv};sa.prototype.resetZoom=function(a){void 0===a&&(a=this.Pv);u.ze(a,sa,"resetZoom:newscale");var b=this.g;null===b||ab.Xg||(b.scale=a)}; -sa.prototype.canResetZoom=function(a){void 0===a&&(a=this.Pv);u.ze(a,sa,"canResetZoom:newscale");var b=this.g;return null===b||ab.Xg?!1:b.Gv};sa.prototype.zoomToFit=function(){var a=this.g;if(null!==a){var b=a.scale,c=a.position;b!==this.FC||isNaN(this.Zx)?(this.Zx=b,this.zB=c.copy(),a.zoomToFit(),a.bf(),this.FC=a.scale):(a.scale=this.Zx,a.position=this.zB)}};sa.prototype.canZoomToFit=function(){var a=this.g;return null===a?!1:a.Gv}; -sa.prototype.collapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b)return!1;try{b.Wb("Collapse Tree");var c=new E(U);if(null!==a&&a.Vc)a.collapseTree(),c.add(a);else for(var d=b.selection.i;d.next();){var e=d.value;e instanceof U&&(a=e,a.Vc&&(a.collapseTree(),c.add(a)))}b.za("TreeCollapsed",c)}finally{b.Wd("Collapse Tree")}}; -sa.prototype.canCollapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.nb)return!1;if(null!==a){if(!a.Vc)return!1;if(0b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Df[0])c=a.Df[0],d=a.Df[1];else return;this.doCancel();if(a.yn){a.Lx=!0;a.MB=a.scale;var e=a.Ab,f=a.zb,h=a.ib.getBoundingClientRect(),k=c.clientX-e/h.width*h.left,l=c.clientY-f/h.height*h.top,c=d,d=c.clientX-e/h.width*h.left-k,f=c.clientY-f/h.height*h.top-l,f=Math.sqrt(d*d+f* -f);a.iC=f;b.preventDefault();b.cancelBubble=!0}else yf(a)}}; -xe.prototype.standardPinchZoomMove=function(){var a=this.g;if(null!==a){var b=a.N.event;this.doCancel();yf(a);var c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Df[0])c=a.Df[0],d=a.Df[1];else return;if(a.yn&&a.Lx){var e=a.Ab,f=a.zb,h=a.ib.getBoundingClientRect(),k=c,c=k.clientX-e/h.width*h.left,l=k.clientY-f/h.height*h.top,k=d,d=k.clientX-e/h.width*h.left,f=k.clientY-f/h.height*h.top,h=d-c,e=f-l,h=Math.sqrt(h* -h+e*e)/a.iC,c=new w((Math.min(d,c)+Math.max(d,c))/2,(Math.min(f,l)+Math.max(f,l))/2),l=a.MB*h,d=a.Eb;l!==a.scale&&d.canResetZoom(l)&&(f=a.Rm,a.Rm=c,d.resetZoom(l),a.Rm=f);b.preventDefault();b.cancelBubble=!0}}};xe.prototype.doKeyDown=function(){var a=this.g;null!==a&&"Esc"===a.N.key&&this.doCancel()};xe.prototype.doKeyUp=function(){};xe.prototype.startTransaction=xe.prototype.Wb=function(a){void 0===a&&(a=this.name);this.zf=null;var b=this.g;return null===b?!1:b.Wb(a)}; -xe.prototype.stopTransaction=xe.prototype.Uj=function(){var a=this.g;return null===a?!1:null===this.zf?a.ap():a.Wd(this.zf)}; -xe.prototype.standardMouseSelect=function(){var a=this.g;if(null!==a&&a.of){var b=a.N,c=a.zs(b.da,!1);if(null!==c)if(u.Em?b.Ys:b.control){a.za("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Ra;null!==b&&(b.Za=!b.Za);a.za("ChangedSelection")}else if(b.shift){if(!c.Za){a.za("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Ra;null!==b&&(b.Za=!0);a.za("ChangedSelection")}}else{if(!c.Za){for(b=c;null!==b&&!b.canSelect();)b=b.Ra;null!==b&&a.select(b)}}else!b.left||(u.Em?b.Ys:b.control)|| -b.shift||a.Lv()}};xe.prototype.standardMouseClick=function(a,b){void 0===a&&(a=null);void 0===b&&(b=function(a){return!a.layer.Ac});var c=this.g;if(null!==c){var d=c.N,e=c.ke(d.da,a,b);d.pe=e;zf(e,d,c)}}; -function zf(a,b,c){var d=0;b.left?d=1===b.Te?1:2===b.Te?2:1:b.right&&1===b.Te&&(d=3);var e="";if(null!==a){switch(d){case 1:e="ObjectSingleClicked";break;case 2:e="ObjectDoubleClicked";break;case 3:e="ObjectContextClicked"}0!==d&&c.za(e,a)}else{switch(d){case 1:e="BackgroundSingleClicked";break;case 2:e="BackgroundDoubleClicked";break;case 3:e="BackgroundContextClicked"}0!==d&&c.za(e)}if(null!==a)for(b.Tc=!1;null!==a;){c=null;switch(d){case 1:c=a.click;break;case 2:c=a.ts?a.ts:a.click;break;case 3:c= -a.Uy}if(null!==c&&(c(b,a),b.Tc))break;a=a.S}else{a=null;switch(d){case 1:a=c.click;break;case 2:a=c.ts?c.ts:c.click;break;case 3:a=c.Uy}null!==a&&a(b)}} -xe.prototype.standardMouseOver=function(){var a=this.g;if(null!==a){var b=a.N;if(null!==b.g&&!0!==a.Lb.ld){var c=a.cb;a.cb=!0;var d=a.ke(b.da,null,null);b.pe=d;var e=!1;if(d!==a.en){var f=a.en,h=f;a.en=d;this.doCurrentObjectChanged(f,d);for(b.Tc=!1;null!==f;){var k=f.$D;if(null!==k){if(d===f)break;if(null!==d&&d.gl(f))break;k(b,f,d);e=!0;if(b.Tc)break}f=f.S}f=h;for(b.Tc=!1;null!==d;){k=d.ZD;if(null!==k){if(f===d)break;if(null!==f&&f.gl(d))break;k(b,d,f);e=!0;if(b.Tc)break}d=d.S}d=a.en}if(null!==d){f= -d;for(k="";null!==f;){k=f.cursor;if(""!==k)break;f=f.S}a.ac=k;b.Tc=!1;for(f=d;null!==f;){k=f.Fz;if(null!==k&&(k(b,f),e=!0,b.Tc))break;f=f.S}}else a.ac="",k=a.Fz,null!==k&&(k(b),e=!0);e&&a.de();a.cb=c}}};xe.prototype.doCurrentObjectChanged=function(){}; -xe.prototype.standardMouseWheel=function(){var a=this.g;if(null!==a){var b=a.N,c=b.Uk;if(0!==c&&a.Cd.J()){var d=a.Eb,e=a.tb.$s;if((e===Af&&!b.shift||e===Bf&&b.control)&&(0e||Math.abs(b.y-a.y)>d};u.u(xe,{g:"diagram"},function(){return this.Y}); -u.defineProperty(xe,{name:"name"},function(){return this.Ub},function(a){u.j(a,"string",xe,"name");this.Ub=a});u.defineProperty(xe,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){u.j(a,"boolean",xe,"isEnabled");this.Ne=a});u.defineProperty(xe,{na:"isActive"},function(){return this.lB},function(a){u.j(a,"boolean",xe,"isActive");this.lB=a});u.defineProperty(xe,{zf:"transactionResult"},function(){return this.AC},function(a){null!==a&&u.j(a,"string",xe,"transactionResult");this.AC=a}); -function uf(){0e&&(e=k),l>f&&(f=l))}}Infinity===c?b.m(0,0,0,0):b.m(c,d,e-c,f-d)} -function ig(a,b){if(null===a.oc){var c=a.g;if(!(null===c||b&&(c.nb||c.uf))&&null!==a.cc){var d=c.ha;d.isEnabled&&d.ND?null!==d.Di&&0c.ka)){var d=a.g;if(null!==d&&!d.nb&&(d=a.pi,null!==d)){var e=null,f=null;null===c.W&&(e=zg(a,c.l(0),!1),null!==e&&(f=e.T));var h=null,k=null;null===c.ca&&(h=zg(a,c.l(c.ka-1),!0),null!==h&&(k=h.T));d.isValidLink(f,e,k,h)?b?(c.jn=c.l(0).copy(),c.nn=c.l(c.ka-1).copy(),c.ip=!1,c.W=f,null!==e&&(c.pg=e.Jd),c.ca=k,null!==h&&(c.lh=h.Jd)):Ag(d,f,e,k,h):Ag(d,null,null,null,null)}}}uf.prototype.doDragOver=function(){}; -function Bg(a,b){var c=a.g;if(null!==c){a.Gi&&vg(a,!0);Zf(a);var d=wg(c,b,null,function(b){return!mg(a,b)}),e=c.N;e.pe=d;if(null!==d){e.Tc=!1;for(var f=d;null!==f;){var h=f.Cz;if(null!==h&&(h(e,f),e.Tc))break;f=yg(f)}}else h=c.Cz,null!==h&&h(e);if(a.na||null!==Ef)if(a.doDropOnto(b,d),a.na||null!==Ef)for(d=c.selection.i;d.next();)e=d.value,e instanceof U&&Cg(c,e.ba)}}uf.prototype.doDropOnto=function(){}; -uf.prototype.doMouseMove=function(){if(this.na){var a=this.g;if(null!==a&&null!==this.rs&&null!==this.cc){var b=!1,c=!1;this.mayCopy()?(b=!0,a.ac="copy",ig(this,!1),Df(this,this.oc),jg(this,this.oc,!1),$f(this,this.oc)):this.mayMove()?(c=!0,a.ac="default",cg(this),jg(this,this.cc,!0)):this.mayDragOut()?(a.ac="no-drop",ig(this,!1),jg(this,this.oc,!1)):cg(this);ng(this,a.N.da,c,b)}}}; -uf.prototype.doMouseUp=function(){if(this.na){var a=this.g;if(null!==a){var b=!1,c=this.mayCopy();c&&null!==this.oc?(cg(this),ig(this,!0),Df(this,this.oc),jg(this,this.oc,!1),$f(this,this.oc),null!==this.oc&&a.CE(this.oc.Ni())):(b=!0,cg(this),this.mayMove()&&(jg(this,this.cc,!0),this.ev=!1,ng(this,a.N.da,!0,!1),this.ev=!0));this.Rp=!0;Bg(this,a.N.da);if(this.na){this.oc=null;if(b&&null!==this.cc)for(b=this.cc.i;b.next();){var d=b.key;d instanceof U&&(d=d.Ra,null===d||null===d.placeholder||this.cc.contains(d)|| -d.aD&&d.R())}a.pc();$f(this,this.cc);this.zf=c?"Copy":"Move";a.za(c?"SelectionCopied":"SelectionMoved",a.selection)}this.stopTool()}}};uf.prototype.mayCopy=function(){if(!this.MD)return!1;var a=this.g;if(null===a||a.nb||a.uf||!a.lo||!a.Ij||(u.Em?!a.N.alt:!a.N.control))return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Fd()&&b.canCopy())return!0}return null!==this.Sc&&this.Gi&&this.Sc.canCopy()?!0:!1}; -uf.prototype.mayDragOut=function(){if(!this.MD)return!1;var a=this.g;if(null===a||!a.Av||!a.Ij||a.Nk)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Fd()&&b.canCopy())return!0}return null!==this.Sc&&this.Gi&&this.Sc.canCopy()?!0:!1};uf.prototype.mayMove=function(){var a=this.g;if(null===a||a.nb||!a.Nk)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Fd()&&b.canMove())return!0}return null!==this.Sc&&this.Gi&&this.Sc.canMove()?!0:!1};var ag=new E(uf),Ef=null,Ff=null; -uf.prototype.mayDragIn=function(){var a=this.g;if(null===a||!a.MC||a.nb||a.uf||!a.lo)return!1;var b=Ef;return null===b||b.g.ga.Sk!==a.ga.Sk?!1:!0};uf.prototype.doSimulatedDragEnter=function(){if(this.mayDragIn()){var a=this.g;a.Lb.Mi();Dg(a);a=Ef;null!==a&&(a.g.ac="copy")}};uf.prototype.doSimulatedDragLeave=function(){var a=Ef;null!==a&&a.doSimulatedDragOut();this.doCancel()}; -uf.prototype.doSimulatedDragOver=function(){var a=this.g;if(null!==a){var b=Ef;null!==b&&null!==b.cc&&this.mayDragIn()&&(a.ac="copy",Eg(this,b.cc.Ni(),!1),jg(this,this.oc,!1),ng(this,a.N.da,!1,!0))}}; -uf.prototype.doSimulatedDrop=function(){var a=this.g;if(null!==a){var b=Ef;null!==b&&(b.Rp=!0,cg(this),this.mayDragIn()&&(this.Wb("Drop"),Eg(this,b.cc.Ni(),!0),jg(this,this.oc,!1),null!==this.oc&&a.CE(this.oc.Ni()),this.zf="ExternalCopy",Bg(this,a.N.da),a.pc(),this.oc=null,a.focus(),a.za("ExternalObjectsDropped",a.selection),this.Uj()))}}; -function Eg(a,b,c){if(null===a.oc){var d=a.g;if(null!==d&&!d.nb&&!d.uf){d.cb=!c;d.Vm=!c;a.Tj=d.N.da;d=d.to(b,d,!0);c=u.Sf();hg(b,c);var e=c.x+c.width/2,f=c.y+c.height/2;u.ic(c);var h=a.gv;c=new la(G);var k=u.K();for(b=b.i;b.next();){var l=b.value;if(l.Fd()&&l.canCopy()){var m=l.location,l=d.ta(l);k.m(h.x-(e-m.x),h.y-(f-m.y));l.location=k;l.pf();c.add(l,If(k))}}u.v(k);for(d=d.i;d.next();)e=d.value,e instanceof W&&e.canCopy()&&c.add(e,If());a.oc=c;Cf(a,c.Ni());null!==a.Sc&&(c=a.Sc,d=c.Mm,c.ll(a.Tj.x- -(d.x+d.width/2),a.Tj.y-(d.y+d.height/2)))}}}uf.prototype.doSimulatedDragOut=function(){var a=this.g;null!==a&&(this.mayCopy()||this.mayMove()?a.ac="":a.ac="no-drop")};function Jf(a){this.point=a;this.IE=K.Wj}u.fa("DraggingInfo",Jf);function kg(a,b,c){this.Cc=a;this.info=b;this.LG=c} -function Fg(){0=d&&(d=.1);for(var e=this,f=b.ym(c,d,function(b){return e.findValidLinkablePort(b,a)},null,!0),d=Infinity,b=null,f=f.i;f.next();){var h=f.value,k=h.T;if(k instanceof U){var l=h.lb(Ib,u.K()),m=c.x-l.x,n=c.y-l.y;u.v(l);l=m*m+n*n;lc){if(null!==this.qc&&a===this.bh&&b===this.dh)return!0;var d=b.Jd;null===d&&(d="");if(a.Wv(d).count>=c)return!1}return!0}; -Fg.prototype.isValidTo=function(a,b){if(null===a||null===b)return this.Io;if(this.g.Va===this&&(null!==a.layer&&!a.layer.gs||!0!==b.OE))return!1;var c=b.yI;if(Infinity>c){if(null!==this.qc&&a===this.eh&&b===this.fh)return!0;var d=b.Jd;null===d&&(d="");if(a.og(d).count>=c)return!1}return!0};Fg.prototype.isInSameNode=function(a,b){if(null===a||null===b)return!1;if(a===b)return!0;var c=a.T,d=b.T;return null!==c&&c===d}; -Fg.prototype.isLinked=function(a,b){if(null===a||null===b)return!1;var c=a.T;if(!(c instanceof U))return!1;var d=a.Jd;null===d&&(d="");var e=b.T;if(!(e instanceof U))return!1;var f=b.Jd;null===f&&(f="");for(e=e.og(f);e.next();)if(f=e.value,f.W===c&&f.pg===d)return!0;return!1}; -Fg.prototype.isValidLink=function(a,b,c,d){if(!this.isValidFrom(a,b)||!this.isValidTo(c,d)||!(null===b||null===d||(b.CG&&d.xI||!this.isInSameNode(b,d))&&(b.BG&&d.wI||!this.isLinked(b,d)))||null!==this.qc&&(null!==a&&this.isLabelDependentOnLink(a,this.qc)||null!==c&&this.isLabelDependentOnLink(c,this.qc))||null!==a&&null!==c&&(null===a.data&&null!==c.data||null!==a.data&&null===c.data)||!this.isValidCycle(a,c,this.qc))return!1;if(null!==a){var e=a.pw;if(null!==e&&!e(a,b,c,d,this.qc))return!1}if(null!== -c&&(e=c.pw,null!==e&&!e(a,b,c,d,this.qc)))return!1;e=this.pw;return null!==e?e(a,b,c,d,this.qc):!0};Fg.prototype.isLabelDependentOnLink=function(a,b){if(null===a)return!1;var c=a.ce;if(null===c)return!1;if(c===b)return!0;var d=new F(U);d.add(a);return Gg(this,c,b,d)};function Gg(a,b,c,d){if(b===c)return!0;var e=b.W;if(null!==e&&e.tf&&(d.add(e),Gg(a,e.ce,c,d)))return!0;b=b.ca;return null!==b&&b.tf&&(d.add(b),Gg(a,b.ce,c,d))?!0:!1} -Fg.prototype.isValidCycle=function(a,b,c){void 0===c&&(c=null);if(null===a||null===b)return this.Io;var d=this.g.DI;if(d!==Hg){if(d===Ig){if(null!==c&&!c.Bc)return!0;for(d=b.oe;d.next();){var e=d.value;if(e!==c&&e.Bc&&e.ca===b)return!1}return!Jg(this,a,b,c,!0)}if(d===Kg){if(null!==c&&!c.Bc)return!0;for(d=a.oe;d.next();)if(e=d.value,e!==c&&e.Bc&&e.W===a)return!1;return!Jg(this,a,b,c,!0)}if(d===Lg)return a===b?a=!0:(d=new F(U),d.add(b),a=Ug(this,d,a,b,c)),!a;if(d===Vg)return!Jg(this,a,b,c,!1);if(d=== -Wg)return a===b?a=!0:(d=new F(U),d.add(b),a=Xg(this,d,a,b,c)),!a}return!0};function Jg(a,b,c,d,e){if(b===c)return!0;if(null===b||null===c)return!1;for(var f=b.oe;f.next();){var h=f.value;if(h!==d&&(!e||h.Bc)&&h.ca===b&&(h=h.W,h!==b&&Jg(a,h,c,d,e)))return!0}return!1}function Ug(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.oe;f.next();){var h=f.value;if(h!==e&&h.ca===c&&(h=h.W,h!==c&&Ug(a,b,h,d,e)))return!0}return!1} -function Xg(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.oe;f.next();){var h=f.value;if(h!==e){var k=h.W,h=h.ca,k=k===c?h:k;if(k!==c&&Xg(a,b,k,d,e))return!0}}return!1}u.defineProperty(Fg,{pw:"linkValidation"},function(){return this.xk},function(a){null!==a&&u.j(a,"function",Fg,"linkValidation");this.xk=a});u.defineProperty(Fg,{ww:"portTargeted"},function(){return this.YB},function(a){null!==a&&u.j(a,"function",Fg,"portTargeted");this.YB=a}); -function ta(){0b.Bs+1&&c=a.x)c=0>=a.y?c+225:1<=a.y?c+135:c+180;else if(1<=a.x)0>=a.y?c+=315:1<=a.y&&(c+=45);else if(0>=a.y)c+=270;else if(1<=a.y)c+=90;else break a;0>c?c+=360:360<=c&&(c-=360);b.cursor=22.5>c?"e-resize":67.5>c?"se-resize":112.5>c?"s-resize":157.5>c?"sw-resize":202.5>c?"w-resize":247.5>c?"nw-resize":292.5>c?"n-resize":337.5>c?"ne-resize":"e-resize"}else if(b instanceof A)for(b=b.elements;b.next();)nh(a, -b.value,c)}u.defineProperty(mh,{Hs:"handleArchetype"},function(){return this.pk},function(a){null!==a&&u.C(a,S,mh,"handleArchetype");this.pk=a});u.u(mh,{handle:"handle"},function(){return this.Yb});u.defineProperty(mh,{vc:"adornedObject"},function(){return this.Gb},function(a){null!==a&&u.C(a,S,mh,"adornedObject");this.Gb=a});mh.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;return null!==a&&!a.nb&&a.hs&&a.N.left?null!==this.findToolHandleAt(a.wc.da,this.name)?!0:!1:!1}; -mh.prototype.doActivate=function(){var a=this.g;null!==a&&(this.Yb=this.findToolHandleAt(a.wc.da,this.name),null!==this.Yb&&(this.Gb=this.Yb.T.vc,this.ly.set(this.Gb.T.location),this.Tu.set(this.Gb.xa),this.Hx=this.computeCellSize(),this.Jx=this.computeMinSize(),this.Ix=this.computeMaxSize(),a.Ge=!0,this.KB=a.Lb.isEnabled,a.Lb.isEnabled=!1,this.Wb(this.name),this.na=!0))};mh.prototype.doDeactivate=function(){var a=this.g;null!==a&&(this.Uj(),this.Gb=this.Yb=null,this.na=a.Ge=!1,a.Lb.isEnabled=this.KB)}; -mh.prototype.doCancel=function(){this.Gb.xa=this.Tu;this.Gb.T.location=this.ly;this.stopTool()};mh.prototype.doMouseMove=function(){var a=this.g;if(this.na&&null!==a){var b=this.Jx,c=this.Ix,d=this.Hx,e=this.Gb.zD(a.N.da,u.K()),f=qh;this.Gb instanceof X&&(f=rh(this.Gb));b=this.computeResize(e,this.Yb.alignment,b,c,d,!(f===sh||f===th||a.N.shift));this.resize(b);a.bf();u.v(e)}}; -mh.prototype.doMouseUp=function(){var a=this.g;if(this.na&&null!==a){var b=this.Jx,c=this.Ix,d=this.Hx,e=this.Gb.zD(a.N.da,u.K()),f=qh;this.Gb instanceof X&&(f=rh(this.Gb));b=this.computeResize(e,this.Yb.alignment,b,c,d,!(f===sh||f===th||a.N.shift));this.resize(b);u.v(e);a.pc();this.zf=this.name;a.za("PartResized",this.Gb,this.Tu)}this.stopTool()}; -mh.prototype.resize=function(a){if(null!==this.g){var b=this.vc,c=b.T,d=b.Zk(),e=b.Hi(),f=Math.PI*d/180,h=Math.cos(f),f=Math.sin(f),k=0d?1:0,l=90d?1:0,d=180d?1:0,m=b.Ha.width,n=b.Ha.height;b.xa=a.size;var p=c.position.copy();c.pf();m=b.Ha.width-m;n=b.Ha.height-n;if(0!==m||0!==n)0!==m&&(p.x+=e*((a.x+m*l)*h-(a.y+n*k)*f)),0!==n&&(p.y+=e*((a.x+m*d)*f+(a.y+n*l)*h)),c.move(p)}}; -mh.prototype.computeResize=function(a,b,c,d,e,f){b.ne()&&(b=Ib);var h=this.vc.Ha,k=h.x,l=h.y,m=h.x+h.width,n=h.y+h.height,p=1;if(!f){var p=h.width,q=h.height;0>=p&&(p=1);0>=q&&(q=1);p=q/p}q=u.K();K.xs(a.x,a.y,k,l,e.width,e.height,q);a=h.copy();0>=b.x?0>=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n- -c.height),a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p=b.y?(a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=n-a.y,f||(a.width=a.height/ -p,a.x=k+.5*(m-k-a.width))):1<=b.y&&(a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(a.width=a.height/p,a.x=k+.5*(m-k-a.width)));u.v(q);return a};mh.prototype.computeMinSize=function(){var a=this.vc.vg.copy(),b=this.vg;!isNaN(b.width)&&b.width>a.width&&(a.width=b.width);!isNaN(b.height)&&b.height>a.height&&(a.height=b.height);return a}; -mh.prototype.computeMaxSize=function(){var a=this.vc.af.copy(),b=this.af;!isNaN(b.width)&&b.widtha&&(a+=360));var b=Math.min(Math.abs(this.mI),180),c=Math.min(Math.abs(this.lI),b/2);!this.g.N.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a};u.defineProperty(uh,{mI:"snapAngleMultiple"},function(){return this.gC},function(a){u.j(a,"number",uh,"snapAngleMultiple");this.gC=a}); -u.defineProperty(uh,{lI:"snapAngleEpsilon"},function(){return this.fC},function(a){u.j(a,"number",uh,"snapAngleEpsilon");this.fC=a});u.u(uh,{eK:"originalAngle"},function(){return this.Su});function wh(){0e.right&&(c.x-=d.width+5);c.xe.bottom&&(c.y-=d.height+5);c.ye.right&&(c.x-=d.width+5);c.xe.bottom?c.y-(d.height+5):c.y+20;c.ya?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b} -Te.prototype.prepareAnimation=Te.prototype.ml=function(){this.Ne&&(this.dj&&this.Mi(),this.ld=!0,this.CA=!1)};function fi(a){a.Ne&&requestAnimationFrame(function(){!1===a.ld||a.dj||(a.Y.im=1,gi(a.Y),a.ld=!1,a.Y.za("AnimationStarting"),hi(a))})}function ii(a,b,c,d,e){if(a.ld&&(!(b instanceof G)||b.JD)){var f=a.Sn;if(f.contains(b)){b=f.ta(b);a=b.start;var h=b.end;void 0===a[c]&&(a[c]=ji(d));h[c]=ji(e)}else a=new pa,h=new pa,a[c]=ji(d),h[c]=ji(e),f.add(b,new ei(a,h))}} -function ji(a){return a instanceof w?a.copy():a instanceof ia?a.copy():a} -function hi(a){var b;void 0===b&&(b=new pa);var c=a.Y;if(null!==c)if(0===a.Sn.count)a.dj=!1,ki(c,!1),c.bf();else{a.dj=!0;var d=b.wJ||a.pF,e=b.cK||null,f=b.dK||null,h=b.duration||a.Ex;b=a.yF;for(var k=a.Sn.i;k.next();){var l=k.value.start.position;l instanceof w&&(l.J()||l.assign(b))}a.PA=d;a.Zt=e;a.$t=f;a.tx=h;var m=a.oF=a.Sn;li(a);mi(a,c,m,d,0,h,null!==a.Gl&&null!==a.Fl);Dg(a.Y);ni(a);requestAnimationFrame(function(b){var e=b||+new Date,f=e+h;(function s(b){if(!1!==a.dj){b=b||+new Date;var k=b>f? -h:b-e;li(a);mi(a,c,m,d,k,h,null!==a.Gl&&null!==a.Fl);a.Zt&&a.Zt();Dg(c);ni(a);b>f?oi(a):requestAnimationFrame(s)}})(e)})}}var pi={opacity:function(a,b,c,d,e,f){a.opacity=d(e,b,c-b,f)},position:function(a,b,c,d,e,f){e!==f?a.GE(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f)):a.position=new w(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f))},scale:function(a,b,c,d,e,f){a.scale=d(e,b,c-b,f)},visible:function(a,b,c,d,e,f){a.visible=e!==f?b:c}}; -function li(a){if(!a.Fn){var b=a.Y;a.BC=b.cb;a.DA=b.Iw;a.EA=b.tt;b.cb=!0;b.Iw=!0;b.tt=!0;a.Fn=!0}}function ni(a){var b=a.Y;b.cb=a.BC;b.Iw=a.DA;b.tt=a.EA;a.Fn=!1}function mi(a,b,c,d,e,f,h){for(c=c.i;c.next();){var k=c.key,l=c.value,m=l.start,l=l.end,n;for(n in l)if(void 0!==pi[n])pi[n](k,m[n],l[n],d,e,f)}h&&(h=a.Gl,a=a.Fl,n=a.y-h.y,a=d(e,h.x,a.x-h.x,f),d=d(e,h.y,n,f),e=b.qz,b.qz=!0,b.position=new w(a,d),b.qz=e)} -Te.prototype.stopAnimation=Te.prototype.Mi=function(){!0===this.ld&&(this.ld=!1,this.CA&&this.Y.de());this.dj&&this.Ne&&(li(this),mi(this,this.Y,this.oF,this.PA,this.tx,this.tx,null!==this.Gl&&null!==this.Fl),ni(this),oi(this))};function oi(a){a.dj=!1;a.Gl=null;a.Fl=null;a.Sn=new la(S,ei);li(a);for(var b=a.Y.links;b.next();){var c=b.value;null!==c.Xn&&(c.points=c.Xn,c.Xn=null)}b=a.Y;ki(b,!1);b.pc();b.bf();qi(b);ni(a);a.$t&&a.$t();a.$t=null;a.Zt=null;b.za("AnimationFinished");b.de()} -function ri(a,b,c){var d=b.ba,e=c.ba,f=null;c instanceof V&&(f=c.placeholder);null!==f?(c=f.lb(xb),c.x+=f.padding.left,c.y+=f.padding.top,ii(a,b,"position",c,b.position)):ii(a,b,"position",new w(e.x+e.width/2-d.width/2,e.y+e.height/2-d.height/2),b.position);ii(a,b,"opacity",.01,b.opacity)}function si(a,b,c){a.ld&&(null===a.Gl&&b.J()&&null===a.Fl&&(a.Gl=b.copy()),a.Fl=c.copy())} -u.defineProperty(Te,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){u.j(a,"boolean",Te,"isEnabled");this.Ne=a});u.defineProperty(Te,{duration:"duration"},function(){return this.Ex},function(a){u.j(a,"number",Te,"duration");1>a&&u.wa(a,">= 1",Te,"duration");this.Ex=a});u.u(Te,{Vg:"isAnimating"},function(){return this.dj});u.u(Te,{HJ:"isTicking"},function(){return this.Fn});function ei(a,b){this.start=a;this.end=b} -function we(){0=a)return b;for(var c=0,d=0,e=0,f=0,h=0,k=this.Db.i;k.next();){var l=k.value;l instanceof V?e++:l instanceof U?d++:l instanceof W?f++:l instanceof lf?h++:c++}k="";0=d.count)a=d.count;else if(d.ja(a)===b)return-1;d.Yd(a,b);b.Js(c);d=this.g;null!==d&&(c?d.ma():d.Eo(b));b instanceof V&&this.Jw(b);return a}; -g.Fe=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.Fe(a,b,c);var d=this.Db;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.ja(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.Ks(c);d.hd(a);d=this.g;null!==d&&(c?d.ma():d.Fe(b));b.Bu=null;return a}; -g.Jw=function(a){for(;null!==a;){if(a.layer===this){var b=a;if(0!==b.Mc.count){for(var c=-1,d=-1,e=this.Db.n,f=e.length,h=0;hd&&k.Ra===b&&(d=h,0<=c))break}!(0>d)&&da||1=a)return b;for(var c=this.Zb.i;c.next();)b+="\n "+c.value.toString(a-1);return b};D.prototype.checkProperties=function(){return u.check(this)};D.fromDiv=function(a){var b=a;"string"===typeof a&&(b=window.document.getElementById(a));return b instanceof HTMLDivElement&&b.Y instanceof D?b.Y:null}; -u.defineProperty(D,{Vk:"div"},function(){return this.Jb},function(a){null!==a&&u.C(a,HTMLDivElement,D,"div");if(this.Jb!==a){Mi=[];var b=this.Jb;null!==b?(b.Y=void 0,b.innerHTML="",null!==this.ib&&(this.ib.removeEventListener("touchstart",this.SE,!1),this.ib.removeEventListener("touchmove",this.RE,!1),this.ib.removeEventListener("touchend",this.QE,!1),this.ib.Dd.Y=null),b=this.tb,null!==b&&(b.cf.each(function(a){a.cancelWaitAfter()}),b.Mf.each(function(a){a.cancelWaitAfter()}),b.Nf.each(function(a){a.cancelWaitAfter()})), -b.cancelWaitAfter(),this.Va.doCancel(),this.Gg=this.ib=null,window.removeEventListener("resize",this.aF,!1),window.removeEventListener("mousemove",this.Qo,!0),window.removeEventListener("mousedown",this.Po,!0),window.removeEventListener("mouseup",this.So,!0),window.removeEventListener("mousewheel",this.Zg,!0),window.removeEventListener("DOMMouseScroll",this.Zg,!0),window.removeEventListener("mouseout",this.Ro,!0)):this.lf=!1;this.Jb=null;if(null!==a){if(b=a.Y)b.Vk=null;Wi(this,a);this.Sz()}}}); -function Zi(a){var b=a.ib;b.addEventListener("touchstart",a.SE,!1);b.addEventListener("touchmove",a.RE,!1);b.addEventListener("touchend",a.QE,!1);b.addEventListener("mousemove",a.Qo,!1);b.addEventListener("mousedown",a.Po,!1);b.addEventListener("mouseup",a.So,!1);b.addEventListener("mousewheel",a.Zg,!1);b.addEventListener("DOMMouseScroll",a.Zg,!1);b.addEventListener("mouseout",a.Ro,!1);b.addEventListener("keydown",a.kH,!1);b.addEventListener("keyup",a.lH,!1);b.addEventListener("selectstart",function(a){a.preventDefault(); -return!1},!1);b.addEventListener("contextmenu",function(a){a.preventDefault();return!1},!1);b.addEventListener("gesturechange",function(b){a.tb.Bo===ai&&b.preventDefault()},!1);b.addEventListener("pointerdown",a.KH,!1);b.addEventListener("pointermove",a.MH,!1);b.addEventListener("pointerleave",a.LH,!1);window.addEventListener("resize",a.aF,!1)}function ki(a,b){a.im=null;b&&a.hE()} -D.prototype.computePixelRatio=function(){if(null!==this.im)return this.im;var a=this.Gg;return(window.devicePixelRatio||1)/(a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||a.backingStorePixelRatio||1)};D.prototype.doMouseMove=function(){this.Va.doMouseMove()};D.prototype.doMouseDown=function(){this.Va.doMouseDown()};D.prototype.doMouseUp=function(){this.Va.doMouseUp()};D.prototype.doMouseWheel=function(){this.Va.doMouseWheel()}; -D.prototype.doKeyDown=function(){this.Va.doKeyDown()};D.prototype.doKeyUp=function(){this.Va.doKeyUp()};function gi(a){if(null!==a.ib){var b=a.Jb;if(0!==b.clientWidth&&0!==b.clientHeight){var c=a.rk?a.zd:0,d=a.qk?a.zd:0,e=a.nf;a.nf=a.computePixelRatio();a.nf!==e&&(a.fq=!0,a.de());if(b.clientWidth!==a.Ab+c||b.clientHeight!==a.zb+d)a.Hl=!0,a.Md=!0,b=a.Qb,null!==b&&b.jw&&b.H(),a.vd||a.de()}}}D.prototype.focus=D.prototype.focus=function(){this.ib&&this.ib.focus()}; -function $i(a,b,c){void 0===b&&(b=a.Gg);void 0===c&&(c=!0);c&&(b.Et="");b.Tm="";b.Sm=""}function Ti(a){var b=new we;b.name="Background";a.cs(b);b=new we;b.name="";a.cs(b);b=new we;b.name="Foreground";a.cs(b);b=new we;b.name="Adornment";b.Ac=!0;a.cs(b);b=new we;b.name="Tool";b.Ac=!0;b.KD=!0;a.cs(b);b=new we;b.name="Grid";b.of=!1;b.Ag=!1;b.Ac=!0;a.LF(b,a.ws("Background"))} -function aj(a){a.ad=new A(bj);a.ad.name="GRID";var b=new X;b.Fb="LineH";b.stroke="lightgray";b.hb=.5;b.interval=1;a.ad.add(b);b=new X;b.Fb="LineH";b.stroke="gray";b.hb=.5;b.interval=5;a.ad.add(b);b=new X;b.Fb="LineH";b.stroke="gray";b.hb=1;b.interval=10;a.ad.add(b);b=new X;b.Fb="LineV";b.stroke="lightgray";b.hb=.5;b.interval=1;a.ad.add(b);b=new X;b.Fb="LineV";b.stroke="gray";b.hb=.5;b.interval=5;a.ad.add(b);b=new X;b.Fb="LineV";b.stroke="gray";b.hb=1;b.interval=10;a.ad.add(b);b=new G;b.add(a.ad); -b.wf="Grid";b.uz=!1;b.JD=!1;b.Ag=!1;b.zz="GRID";a.add(b);a.Db.remove(b);a.ad.visible=!1} -D.prototype.LB=function(){if(this.Y.isEnabled){var a=this.Y;if(a.sy&&null!==a.ib){a.Zu=!0;var b=a.Cd,c=a.ob,d=b.width,e=c.width,f=b.height,h=c.height,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,r=a.scale;if(el&&(a.position= -new w(-(a.uj.scrollWidth-a.Ab)+this.scrollLeft-a.Ab/r+a.Cd.right,a.position.y))),this.cC&&a.Se&&(bn&&(a.position=new w(a.position.x,-(a.vj.scrollHeight-a.zb)+this.scrollTop-a.zb/r+a.Cd.bottom))),u.v(s),cj(a),a.Zu=!1,a.Hl=!1,b=a.Cd,c=a.ob,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,e>=d&&p>=q&&k<=l&&(a.ty.style.width="1px"),h>=f&&b>=c&&m<=n&&(a.uy.style.height="1px")}}else dj(this.Y)}; -D.prototype.Ru=function(){this.Y.isEnabled?this.Y.sy=!0:dj(this.Y)};D.prototype.computeBounds=D.prototype.kg=function(){0c&&(e=c),ea.Xg&&(e=a.Xg),e):b===lj?(e=l>k?(h-a.zd)/d:(f-a.zd)/e,e>c&&(e=c),ea.Xg&&(e=a.Xg),e):a.scale}D.prototype.zoomToFit=D.prototype.zoomToFit=function(){this.scale=hj(this,kj)}; -D.prototype.zoomToRect=function(a,b){void 0===b&&(b=kj);var c=a.width,d=a.height;if(!(0===c||0===d||isNaN(c)&&isNaN(d))){var e=1;if(b===kj||b===lj)if(isNaN(c))e=this.ob.height*this.scale/d;else if(isNaN(d))e=this.ob.width*this.scale/c;else var e=this.Ab,f=this.zb,e=b===lj?f/d>e/c?(f-(this.qk?this.zd:0))/d:(e-(this.rk?this.zd:0))/c:Math.min(f/d,e/c);this.scale=e;this.position=new w(a.x,a.y)}};u.defineProperty(D,{qz:null},function(){return this.sc},function(a){this.sc=a}); -D.prototype.alignDocument=function(a,b){this.ei&&jj(this,this.kg());var c=this.Cd,d=this.ob,e=this.sc;this.sc=!0;this.position=new w(c.x+(a.x*c.width+a.offsetX)-(b.x*d.width-b.offsetX),c.y+(a.y*c.height+a.offsetY)-(b.y*d.height-b.offsetY));this.sc=e;this.ma()}; -function ij(a,b,c,d,e,f,h){var k=b.x,l=b.y;if(h||a.yE===Ni)f.pd()&&(d>c.width&&(k=c.x+(f.x*c.width+f.offsetX)-(f.x*d-f.offsetX)),e>c.height&&(l=c.y+(f.y*c.height+f.offsetY)-(f.y*e-f.offsetY))),f=a.xE,h=d-c.width,dc.left?k=c.left:kc.top?l=c.top:lb.touches.length)&&b.preventDefault();b.cancelBubble=!0;return!1} -D.prototype.kH=function(a){if(!this.Y.isEnabled)return!1;var b=this.Y.Ob;nj(this.Y,this.Y,a,b,!1);b.key=String.fromCharCode(a.which);b.Wk=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 48:b.key="0";break;case 187:case 61:case 107:b.key= -"Add";break;case 189:case 173:case 109:b.key="Subtract";break;case 27:b.key="Esc"}this.Y.doKeyDown();return 187!==a.which&&189!==a.which&&48!==a.which&&107!==a.which&&109!==a.which&&61!==a.which&&173!==a.which||!0!==a.ctrlKey?rj(b,a):(a.cancelBubble=!0,a.preventDefault(),a.stopPropagation(),!1)}; -D.prototype.lH=function(a){if(!this.Y.isEnabled)return!1;var b=this.Y.Ob;nj(this.Y,this.Y,a,b,!1);b.key=String.fromCharCode(a.which);b.up=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 93:a.preventDefault()}this.Y.doKeyUp(); -return rj(b,a)};D.prototype.$p=function(a){var b=this.ib;if(null===b)return new w(0,0);var c=this.Ab,d=this.zb,b=b.getBoundingClientRect(),c=a.clientX-c/b.width*b.left;a=a.clientY-d/b.height*b.top;return null!==this.Sd?(a=new w(c,a),Wa(a,this.Sd),a):new w(c,a)};function oj(a,b,c){var d=a.ib,e=a.Ab,f=a.zb,h=0,k=0;null!==d&&(d=d.getBoundingClientRect(),h=b.clientX-e/d.width*d.left,k=b.clientY-f/d.height*d.top);c.ff.m(h,k);null!==a.Sd?(b=u.fc(h,k),a.Sd.Oh(b),c.da.assign(b),u.v(b)):c.da.m(h,k)} -D.prototype.invalidateDocumentBounds=D.prototype.pc=function(){this.ei||(this.ei=!0,this.de(!0))};function qi(a){a.vd||ej(a);a.ei&&jj(a,a.kg());for(a=a.Ul.i;a.next();)qi(a.value)}D.prototype.redraw=D.prototype.Sz=function(){this.sc||this.vd||(this.ma(),sj(this),cj(this),this.pc(),this.bf())};D.prototype.isUpdateRequested=function(){return this.Ef}; -D.prototype.delayInitialization=D.prototype.oG=function(a){void 0===a&&(a=null);var b=this.Lb,c=b.isEnabled;b.Mi();b.isEnabled=!1;Dg(this);this.lf=!1;b.isEnabled=c;null!==a&&u.setTimeout(a,1)};D.prototype.requestUpdate=D.prototype.de=function(a){void 0===a&&(a=!1);if(!0!==this.Ef&&!(this.sc||!1===a&&this.vd)){this.Ef=!0;var b=this;requestAnimationFrame(function(){b.Ef&&b.bf()})}};D.prototype.maybeUpdate=D.prototype.bf=function(){if(!this.un||this.Ef)this.un&&(this.un=!1),Dg(this)}; -function tj(a,b){a.sc||!a.Hl||dj(a)||(b&&ej(a),gj(a,!1))} -function Dg(a){if(!a.vd&&(a.Ef=!1,null!==a.Jb)){a.vd=!0;var b=a.Uh,c=a.VB;if(!b.Fn&&0!==c.length){for(var d=c.n,e=d.length,f=0;fb;b++){var c=a.Xf.i;if(null===c||0===a.Xf.count)break;a.Xf=new F(S);var d=a,e=a.Xf;for(c.reset();c.next();){var f=c.value;!f.Fd()||f instanceof V||!f.Ea()||(f.hl()?(Ph(f,Infinity,Infinity),f.zc()):e.add(f))}for(c.reset();c.next();)f=c.value,f instanceof V&&f.Ea()&&zj(d,f);for(c.reset();c.next();)f=c.value,f instanceof W&&(d=f,d.Ea()&&(d.hl()?(Ph(d,Infinity,Infinity),d.zc(),d.Xs()):e.add(d)));for(c.reset();c.next();)d=c.value,d instanceof -lf&&d.Ea()&&(d.hl()?(Ph(d,Infinity,Infinity),d.zc()):e.add(d))}}function zj(a,b){for(var c=u.eb(),d=u.eb(),e=b.Mc;e.next();){var f=e.value;f.Ea()&&(f instanceof V?(Aj(f)||Bj(f)||Cj(f))&&zj(a,f):f instanceof W?f.W==b||f.ca==b?d.push(f):c.push(f):(Ph(f,Infinity,Infinity),f.zc()))}for(var e=c.length,h=0;hk+1&&(n=Math.max((v- -k)*C+a.Ab,n)),q+1l+1&&(y=Math.max((p-l)*C+a.zb,y)),r+1k+1&&(n=Math.max((v-k)*C+a.Ab,n)),q+1l+1&&(y=Math.max((p-l)*C+a.zb,y)),r+1k+1&&(a.uj.scrollLeft=a.position.x*C));a.lz&&a.Se&&(r+1l+1&&(a.vj.scrollTop=a.position.y*C));h&&(a.fq=!0);m=a.Ab;c=a.zb;a.vj.style.height=c+"px";a.vj.style.width=m+(a.rk?a.zd:0)+"px";a.uj.style.width=m+"px";a.uj.style.height=c+(a.qk?a.zd:0)+"px";a.sy=!1;return d!==m||e!==c||a.Lb.ld?(n=a.ob,a.dt(f,n,h),!1):!0} -D.prototype.add=D.prototype.add=function(a){u.C(a,G,D,"add:part");var b=a.g;if(b!==this){null!==b&&u.k("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString());this.Vm&&(a.wk="Tool");var c=a.wf,b=this.ws(c);null===b&&(b=this.ws(""));null===b&&u.k('Cannot add a Part when unable find a Layer named "'+c+'" and there is no default Layer');a.layer!==b&&(c=b.Eo(99999999,a,a.g===this),0<=c&&this.Dc(be,"parts",b,null,a,null,c),b.Ac||this.pc(),a.H(Jj),c=a.Rs,null!== -c&&c(a,null,b))}}; -D.prototype.Eo=function(a){if(a instanceof U){if(this.Rn.add(a),a instanceof V){var b=a.Ra;null===b?this.Ik.add(a):b.Pn.add(a);b=a.Qb;null!==b&&(b.g=this)}}else a instanceof W?this.Nn.add(a):a instanceof lf||this.Db.add(a);var c=this;Kj(a,function(a){Lj(c,a)});a.Pb&&a.R();b=a.data;null!==b&&(a instanceof lf||(a instanceof W?this.lk.add(b,a):this.$h.add(b,a)),Kj(a,function(a){Mj(c,a)}));!0!==Bj(a)&&!0!==Cj(a)||this.Xf.add(a);Nj(a,!0,this);Oj(a)?(a.ba.J()&&this.ma(yi(a,a.ba)),this.pc()):a.Ea()&&a.ba.J()&& -this.ma(yi(a,a.ba));this.de()}; -D.prototype.Fe=function(a){a.ls();if(a instanceof U){if(this.Rn.remove(a),a instanceof V){var b=a.Ra;null===b?this.Ik.remove(a):b.Pn.remove(a);b=a.Qb;null!==b&&(b.g=null)}}else a instanceof W?this.Nn.remove(a):a instanceof lf||this.Db.remove(a);var c=this;Kj(a,function(a){Pj(c,a)});b=a.data;null!==b&&(a instanceof lf||(a instanceof W?this.lk.remove(b):this.$h.remove(b)),Kj(a,function(a){Qj(c,a)}));this.Xf.remove(a);Oj(a)?(a.ba.J()&&this.ma(yi(a,a.ba)),this.pc()):a.Ea()&&a.ba.J()&&this.ma(yi(a,a.ba)); -this.de()};D.prototype.remove=D.prototype.remove=function(a){u.C(a,G,D,"remove:part");a.Za=!1;a.Wg=!1;var b=a.layer;if(null!==b&&b.g===this){a.H(Rj);a.xm();var c=b.Fe(-1,a,!1);0<=c&&this.Dc(ce,"parts",b,a,null,c,null);c=a.Rs;null!==c&&c(a,b,null)}};D.prototype.removeParts=D.prototype.Wz=function(a,b){if(u.isArray(a))for(var c=u.qb(a),d=0;dd&&this.pc()}; -D.prototype.addLayerAfter=function(a,b){Sj(this,a,b);a.Ec(this);var c=this.Zb,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Od&&this.Dc(ce,"layers",this,a,null,d,null));for(var e=c.count,f=0;fd&&this.pc()}; -D.prototype.removeLayer=function(a){u.C(a,we,D,"removeLayer:layer");a.g!==this&&u.k("Cannot remove a Layer from another Diagram: "+a+" of "+a.g);if(""!==a.name){var b=this.Zb,c=b.indexOf(a);if(b.remove(a)){for(b=a.Db.copy().i;b.next();){var d=b.value,e=d.wf;d.wf=e!==a.name?e:""}null!==this.Od&&this.Dc(ce,"layers",this,a,null,c,null);this.ma();this.pc()}}};D.prototype.findLayer=D.prototype.ws=function(a){for(var b=this.mw;b.next();){var c=b.value;if(c.name===a)return c}return null}; -D.prototype.addChangedListener=D.prototype.Jy=function(a){u.j(a,"function",D,"addChangedListener:listener");null===this.Ui&&(this.Ui=new E("function"));this.Ui.add(a)};D.prototype.removeChangedListener=D.prototype.Tz=function(a){u.j(a,"function",D,"removeChangedListener:listener");null!==this.Ui&&(this.Ui.remove(a),0===this.Ui.count&&(this.Ui=null))}; -D.prototype.Jv=function(a){this.cb||this.ha.ED(a);a.Ad!==ae&&(this.Qh=!0);if(null!==this.Ui){var b=this.Ui,c=b.length;if(1===c)b=b.ja(0),b(a);else if(0!==c)for(var d=b.Ke(),e=0;ea.Xg&&(c=a.Xg);a.position=new w(a.Ma.x+h.x/b-h.x/c,a.Ma.y+h.y/b- -h.y/c);a.sc=!1;a.$b=c;a.dt(d,a.ob);gj(a,!1);a.ma();sj(a)}}D.prototype.dt=function(a,b,c){void 0===c&&(c=!1);c||sj(this);cj(this);var d=this.Qb;null===d||!d.jw||c||a.width===b.width&&a.height===b.height||d.H();d=this.Va;!0===this.Jl&&d instanceof jf&&(this.N.da=this.XE(this.N.ff),d.doMouseMove());this.nz(a,b);vj(this);this.za("ViewportBoundsChanged",c?u.mh:null,a)}; -function vj(a,b){void 0===b&&(b=null);var c=a.ad;if(null!==c&&c.visible){for(var d=u.ul(),e=1,f=1,h=c.ya.n,k=h.length,l=0;ln||(hk(m.Fb)?f=f*n/K.xD(f,n):e=e*n/K.xD(e,n))}h=c.aw;d.m(f*h.width,e*h.height);h=f=l=k=0;if(null!==b)k=b.width,l=b.height,f=b.x,h=b.y;else{e=u.Sf();f=a.ob;e.m(f.x,f.y,f.width,f.height);for(h=a.Ul.i;h.next();)f=h.value.ob,f.J()&&kb(e,f.x,f.y,f.width,f.height);k=e.width;l=e.height;f=e.x;h=e.y;if(!e.J())return}c.width=k+2*d.width;c.height=l+2*d.height; -e=u.K();K.xs(f,h,0,0,d.width,d.height,e);e.offset(-d.width,-d.height);u.Oj(d);c.T.location=e;u.v(e)}}D.prototype.clearSelection=D.prototype.Lv=function(){var a=0a&&u.wa(a,">= zero",D,"linkSpacing"),this.gj=a,this.h("linkSpacing",b,a))});u.u(D,{mw:"layers"},function(){return this.Zb.i}); -u.defineProperty(D,{uf:"isModelReadOnly"},function(){var a=this.Od;return null===a?!1:a.nb},function(a){var b=this.Od;null!==b&&(b.nb=a)});u.defineProperty(D,{nb:"isReadOnly"},function(){return this.vk},function(a){var b=this.vk;b!==a&&(u.j(a,"boolean",D,"isReadOnly"),this.vk=a,this.h("isReadOnly",b,a))});u.defineProperty(D,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){var b=this.Ne;b!==a&&(u.j(a,"boolean",D,"isEnabled"),this.Ne=a,this.h("isEnabled",b,a))}); -u.defineProperty(D,{My:"allowClipboard"},function(){return this.Gt},function(a){var b=this.Gt;b!==a&&(u.j(a,"boolean",D,"allowClipboard"),this.Gt=a,this.h("allowClipboard",b,a))});u.defineProperty(D,{Ij:"allowCopy"},function(){return this.Xj},function(a){var b=this.Xj;b!==a&&(u.j(a,"boolean",D,"allowCopy"),this.Xj=a,this.h("allowCopy",b,a))}); -u.defineProperty(D,{lm:"allowDelete"},function(){return this.Yj},function(a){var b=this.Yj;b!==a&&(u.j(a,"boolean",D,"allowDelete"),this.Yj=a,this.h("allowDelete",b,a))});u.defineProperty(D,{Av:"allowDragOut"},function(){return this.Ht},function(a){var b=this.Ht;b!==a&&(u.j(a,"boolean",D,"allowDragOut"),this.Ht=a,this.h("allowDragOut",b,a))}); -u.defineProperty(D,{MC:"allowDrop"},function(){return this.It},function(a){var b=this.It;b!==a&&(u.j(a,"boolean",D,"allowDrop"),this.It=a,this.h("allowDrop",b,a))});u.defineProperty(D,{Ev:"allowTextEdit"},function(){return this.gk},function(a){var b=this.gk;b!==a&&(u.j(a,"boolean",D,"allowTextEdit"),this.gk=a,this.h("allowTextEdit",b,a))}); -u.defineProperty(D,{Bv:"allowGroup"},function(){return this.Zj},function(a){var b=this.Zj;b!==a&&(u.j(a,"boolean",D,"allowGroup"),this.Zj=a,this.h("allowGroup",b,a))});u.defineProperty(D,{Fv:"allowUngroup"},function(){return this.hk},function(a){var b=this.hk;b!==a&&(u.j(a,"boolean",D,"allowUngroup"),this.hk=a,this.h("allowUngroup",b,a))}); -u.defineProperty(D,{lo:"allowInsert"},function(){return this.Kt},function(a){var b=this.Kt;b!==a&&(u.j(a,"boolean",D,"allowInsert"),this.Kt=a,this.h("allowInsert",b,a))});u.defineProperty(D,{gs:"allowLink"},function(){return this.$j},function(a){var b=this.$j;b!==a&&(u.j(a,"boolean",D,"allowLink"),this.$j=a,this.h("allowLink",b,a))}); -u.defineProperty(D,{mm:"allowRelink"},function(){return this.bk},function(a){var b=this.bk;b!==a&&(u.j(a,"boolean",D,"allowRelink"),this.bk=a,this.h("allowRelink",b,a))});u.defineProperty(D,{Nk:"allowMove"},function(){return this.ak},function(a){var b=this.ak;b!==a&&(u.j(a,"boolean",D,"allowMove"),this.ak=a,this.h("allowMove",b,a))}); -u.defineProperty(D,{Cv:"allowReshape"},function(){return this.ck},function(a){var b=this.ck;b!==a&&(u.j(a,"boolean",D,"allowReshape"),this.ck=a,this.h("allowReshape",b,a))});u.defineProperty(D,{hs:"allowResize"},function(){return this.dk},function(a){var b=this.dk;b!==a&&(u.j(a,"boolean",D,"allowResize"),this.dk=a,this.h("allowResize",b,a))}); -u.defineProperty(D,{Dv:"allowRotate"},function(){return this.ek},function(a){var b=this.ek;b!==a&&(u.j(a,"boolean",D,"allowRotate"),this.ek=a,this.h("allowRotate",b,a))});u.defineProperty(D,{of:"allowSelect"},function(){return this.fk},function(a){var b=this.fk;b!==a&&(u.j(a,"boolean",D,"allowSelect"),this.fk=a,this.h("allowSelect",b,a))}); -u.defineProperty(D,{NC:"allowUndo"},function(){return this.Lt},function(a){var b=this.Lt;b!==a&&(u.j(a,"boolean",D,"allowUndo"),this.Lt=a,this.h("allowUndo",b,a))});u.defineProperty(D,{Gv:"allowZoom"},function(){return this.Nt},function(a){var b=this.Nt;b!==a&&(u.j(a,"boolean",D,"allowZoom"),this.Nt=a,this.h("allowZoom",b,a))}); -u.defineProperty(D,{lz:"hasVerticalScrollbar"},function(){return this.qu},function(a){var b=this.qu;b!==a&&(u.j(a,"boolean",D,"hasVerticalScrollbar"),this.qu=a,sj(this),this.ma(),this.h("hasVerticalScrollbar",b,a),gj(this,!1))});u.defineProperty(D,{kz:"hasHorizontalScrollbar"},function(){return this.pu},function(a){var b=this.pu;b!==a&&(u.j(a,"boolean",D,"hasHorizontalScrollbar"),this.pu=a,sj(this),this.ma(),this.h("hasHorizontalScrollbar",b,a),gj(this,!1))}); -u.defineProperty(D,{Re:"allowHorizontalScroll"},function(){return this.Jt},function(a){var b=this.Jt;b!==a&&(u.j(a,"boolean",D,"allowHorizontalScroll"),this.Jt=a,this.h("allowHorizontalScroll",b,a),gj(this,!1))});u.defineProperty(D,{Se:"allowVerticalScroll"},function(){return this.Mt},function(a){var b=this.Mt;b!==a&&(u.j(a,"boolean",D,"allowVerticalScroll"),this.Mt=a,this.h("allowVerticalScroll",b,a),gj(this,!1))}); -u.defineProperty(D,{lt:"scrollHorizontalLineChange"},function(){return this.$u},function(a){var b=this.$u;b!==a&&(u.j(a,"number",D,"scrollHorizontalLineChange"),0>a&&u.wa(a,">= 0",D,"scrollHorizontalLineChange"),this.$u=a,this.h("scrollHorizontalLineChange",b,a))}); -u.defineProperty(D,{mt:"scrollVerticalLineChange"},function(){return this.av},function(a){var b=this.av;b!==a&&(u.j(a,"number",D,"scrollVerticalLineChange"),0>a&&u.wa(a,">= 0",D,"scrollVerticalLineChange"),this.av=a,this.h("scrollVerticalLineChange",b,a))});u.defineProperty(D,{N:"lastInput"},function(){return this.Ob},function(a){this.Ob=a});u.defineProperty(D,{wc:"firstInput"},function(){return this.nk},function(a){this.nk=a}); -u.defineProperty(D,{ac:"currentCursor"},function(){return this.sx},function(a){""===a&&(a=this.Pp);this.sx!==a&&(u.j(a,"string",D,"currentCursor"),null!==this.ib&&(this.sx=a,this.ib.style.cursor=a,this.Jb.style.cursor=a))});u.defineProperty(D,{lJ:"defaultCursor"},function(){return this.Pp},function(a){""===a&&(a="auto");var b=this.Pp;b!==a&&(u.j(a,"string",D,"defaultCursor"),this.Pp=a,this.h("defaultCursor",b,a))}); -u.defineProperty(D,{zJ:"hasGestureZoom"},function(){return this.yn},function(a){var b=this.yn;b!==a&&(u.j(a,"boolean",D,"hasGestureZoom"),this.yn=a,this.h("hasGestureZoom",b,a))});u.defineProperty(D,{click:"click"},function(){return this.Wh},function(a){var b=this.Wh;b!==a&&(null!==a&&u.j(a,"function",D,"click"),this.Wh=a,this.h("click",b,a))}); -u.defineProperty(D,{ts:"doubleClick"},function(){return this.ci},function(a){var b=this.ci;b!==a&&(null!==a&&u.j(a,"function",D,"doubleClick"),this.ci=a,this.h("doubleClick",b,a))});u.defineProperty(D,{Uy:"contextClick"},function(){return this.Yh},function(a){var b=this.Yh;b!==a&&(null!==a&&u.j(a,"function",D,"contextClick"),this.Yh=a,this.h("contextClick",b,a))}); -u.defineProperty(D,{Fz:"mouseOver"},function(){return this.mi},function(a){var b=this.mi;b!==a&&(null!==a&&u.j(a,"function",D,"mouseOver"),this.mi=a,this.h("mouseOver",b,a))});u.defineProperty(D,{Ez:"mouseHover"},function(){return this.li},function(a){var b=this.li;b!==a&&(null!==a&&u.j(a,"function",D,"mouseHover"),this.li=a,this.h("mouseHover",b,a))}); -u.defineProperty(D,{Dz:"mouseHold"},function(){return this.ki},function(a){var b=this.ki;b!==a&&(null!==a&&u.j(a,"function",D,"mouseHold"),this.ki=a,this.h("mouseHold",b,a))});u.defineProperty(D,{EH:"mouseDragOver"},function(){return this.Nu},function(a){var b=this.Nu;b!==a&&(null!==a&&u.j(a,"function",D,"mouseDragOver"),this.Nu=a,this.h("mouseDragOver",b,a))}); -u.defineProperty(D,{Cz:"mouseDrop"},function(){return this.ji},function(a){var b=this.ji;b!==a&&(null!==a&&u.j(a,"function",D,"mouseDrop"),this.ji=a,this.h("mouseDrop",b,a))});u.defineProperty(D,{lA:"toolTip"},function(){return this.ti},function(a){var b=this.ti;b!==a&&(null!==a&&u.C(a,lf,D,"toolTip"),this.ti=a,this.h("toolTip",b,a))}); -u.defineProperty(D,{contextMenu:"contextMenu"},function(){return this.Zh},function(a){var b=this.Zh;b!==a&&(null!==a&&u.C(a,lf,D,"contextMenu"),this.Zh=a,this.h("contextMenu",b,a))});u.defineProperty(D,{Eb:"commandHandler"},function(){return this.ix},function(a){var b=this.ix;b!==a&&(u.C(a,sa,D,"commandHandler"),null!==a.g&&u.k("Cannot share CommandHandlers between Diagrams: "+a.toString()),null!==b&&b.Ec(null),this.ix=a,a.Ec(this))}); -u.defineProperty(D,{tb:"toolManager"},function(){return this.Fy},function(a){var b=this.Fy;b!==a&&(u.C(a,jf,D,"toolManager"),null!==a.g&&u.k("Cannot share ToolManagers between Diagrams: "+a.toString()),null!==b&&b.Ec(null),this.Fy=a,a.Ec(this))});u.defineProperty(D,{$y:"defaultTool"},function(){return this.yx},function(a){var b=this.yx;b!==a&&(u.C(a,xe,D,"defaultTool"),this.yx=a,this.Va===b&&(this.Va=a))}); -u.defineProperty(D,{Va:"currentTool"},function(){return this.ux},function(a){var b=this.ux;if(null!==b)for(b.na&&b.doDeactivate(),b.cancelWaitAfter(),b.doStop(),b=this.Ul.i;b.next();)b.value.ma();null===a&&(a=this.$y);null!==a&&(u.C(a,xe,D,"currentTool"),this.ux=a,a.Ec(this),a.doStart())});u.u(D,{selection:"selection"},function(){return this.dv}); -u.defineProperty(D,{wH:"maxSelectionCount"},function(){return this.Iu},function(a){var b=this.Iu;if(b!==a)if(u.j(a,"number",D,"maxSelectionCount"),0<=a&&!isNaN(a)){if(this.Iu=a,this.h("maxSelectionCount",b,a),!this.ha.gb&&(a=this.selection.count-a,0= 0",D,"maxSelectionCount")}); -u.defineProperty(D,{HH:"nodeSelectionAdornmentTemplate"},function(){return this.Pu},function(a){var b=this.Pu;b!==a&&(u.C(a,lf,D,"nodeSelectionAdornmentTemplate"),this.Pu=a,this.h("nodeSelectionAdornmentTemplate",b,a))});u.defineProperty(D,{MG:"groupSelectionAdornmentTemplate"},function(){return this.mu},function(a){var b=this.mu;b!==a&&(u.C(a,lf,D,"groupSelectionAdornmentTemplate"),this.mu=a,this.h("groupSelectionAdornmentTemplate",b,a))}); -u.defineProperty(D,{sH:"linkSelectionAdornmentTemplate"},function(){return this.Du},function(a){var b=this.Du;b!==a&&(u.C(a,lf,D,"linkSelectionAdornmentTemplate"),this.Du=a,this.h("linkSelectionAdornmentTemplate",b,a))});u.u(D,{bw:"highlighteds"},function(){return this.ru}); -u.defineProperty(D,{Qh:"isModified"},function(){var a=this.ha;return a.isEnabled?null!==a.Di?!0:this.Vx&&this.Ig!==a.Ii:this.Vx},function(a){if(this.Vx!==a){u.j(a,"boolean",D,"isModified");this.Vx=a;var b=this.ha;!a&&b.isEnabled&&(this.Ig=b.Ii);a||ik(this)}});function ik(a){var b=a.Qh;a.DC!==b&&(a.DC=b,a.za("Modified"))} -u.defineProperty(D,{ga:"model"},function(){return this.Od},function(a){var b=this.Od;if(b!==a){u.C(a,J,D,"model");this.Va.doCancel();null!==b&&b.ha!==a.ha&&b.ha.ND&&u.k("Do not replace a Diagram.model while a transaction is in progress.");this.Lb.Mi();this.Lv();this.lf=!1;this.un=!0;this.Ig=-2;this.Ef=!1;var c=this.vd;this.vd=!0;this.Lb.ml();null!==b&&(b.Tz(this.GB),b instanceof Q&&jk(this,b.Qj),jk(this,b.ah));this.Od=a;a.Jy(this.FB);kk(this,a.ah);a instanceof Q&&lk(this,a.Qj);a.Tz(this.FB);a.Jy(this.GB); -this.vd=c;this.sc||this.ma();null!==b&&(a.ha.isEnabled=b.ha.isEnabled)}});u.defineProperty(D,{Na:null},function(){return this.yB},function(a){this.yB=a}); -function Qi(a,b){if(b.ga===a.ga){var c=b.Ad,d=b.propertyName;if(c===ae&&"S"===d[0])if("StartingFirstTransaction"===d)c=a.tb,c.cf.each(function(b){b.Ec(a)}),c.Mf.each(function(b){b.Ec(a)}),c.Nf.each(function(b){b.Ec(a)}),a.vd||a.lf||(a.du=!0,a.un&&(a.Ef=!0),a.Uh.ml());else if("StartingUndo"===d||"StartingRedo"===d){var e=a.Lb;e.Vg&&!a.cb&&e.Mi();a.za("ChangingSelection")}else"StartedTransaction"===d&&(e=a.Lb,e.Vg&&!a.cb&&e.Mi(),a.zu&&e.ml());else if(a.Na){a.Na=!1;try{var f=b.Lf;if(""!==f)if(c===$d){if("linkFromKey"=== -f){var h=b.object,k=a.ng(h);if(null!==k){var l=b.newValue,m=a.Xe(l);k.W=m}}else if("linkToKey"===f)h=b.object,k=a.ng(h),null!==k&&(l=b.newValue,m=a.Xe(l),k.ca=m);else if("linkFromPortId"===f){if(h=b.object,k=a.ng(h),null!==k){var n=b.newValue;"string"===typeof n&&(k.pg=n)}}else if("linkToPortId"===f)h=b.object,k=a.ng(h),null!==k&&(n=b.newValue,"string"===typeof n&&(k.lh=n));else if("nodeGroupKey"===f){var h=b.object,p=a.Nh(h);if(null!==p){var q=b.newValue;if(void 0!==q){var r=a.Xe(q);p.Ra=r instanceof -V?r:null}else p.Ra=null}}else if("linkLabelKeys"===f){if(h=b.object,k=a.ng(h),null!==k){var s=b.oldValue,t=b.newValue;if(u.isArray(s))for(var v=u.qb(s),x=0;xl)){var m=l;sk(k)&&m++;k.Fe(m);tk(k,m,l)}}}}function Mj(a,b){var c=b.gi;if(u.isArray(c)){var d=a.Ml.ta(c);if(null===d)d=[],d.push(b),a.Ml.add(c,d);else{for(c=0;c=f.length)return!1;for(var h=0;hthis.scale&&(this.scale=a)):u.wa(a,"> 0",D,"minScale"))}); -u.defineProperty(D,{Xg:"maxScale"},function(){return this.Hu},function(a){u.ze(a,D,"maxScale");var b=this.Hu;b!==a&&(0 0",D,"maxScale"))});u.defineProperty(D,{Rm:"zoomPoint"},function(){return this.wv},function(a){this.wv.L(a)||(u.C(a,w,D,"zoomPoint"),this.wv=a=a.Z())}); -u.defineProperty(D,{Ty:"contentAlignment"},function(){return this.dn},function(a){var b=this.dn;b.L(a)||(u.C(a,L,D,"contentAlignment"),this.dn=a=a.Z(),this.h("contentAlignment",b,a),gj(this,!1))});u.defineProperty(D,{CJ:"initialContentAlignment"},function(){return this.An},function(a){var b=this.An;b.L(a)||(u.C(a,L,D,"initialContentAlignment"),this.An=a=a.Z(),this.h("initialContentAlignment",b,a))}); -u.defineProperty(D,{padding:"padding"},function(){return this.Pe},function(a){"number"===typeof a?a=new rb(a):u.C(a,rb,D,"padding");var b=this.Pe;b.L(a)||(this.Pe=a=a.Z(),this.pc(),this.h("padding",b,a))});u.u(D,{yg:"nodes"},function(){return this.Rn.i});u.u(D,{links:"links"},function(){return this.Nn.i});u.u(D,{Sj:"parts"},function(){return this.Db.i}); -D.prototype.findTopLevelNodesAndLinks=function(){for(var a=new F(G),b=this.Rn.i;b.next();){var c=b.value;c.Ho&&a.add(c)}for(b=this.Nn.i;b.next();)c=b.value,c.Ho&&a.add(c);return a.i};D.prototype.findTopLevelGroups=function(){return this.Ik.i};u.defineProperty(D,{Qb:"layout"},function(){return this.Nd},function(a){var b=this.Nd;b!==a&&(u.C(a,Je,D,"layout"),null!==b&&(b.g=null,b.group=null),this.Nd=a,a.g=this,a.group=null,this.Ot=!0,this.h("layout",b,a),this.de())}); -D.prototype.layoutDiagram=function(a){ej(this);a&&yk(this,!0);xj(this,!1)};function yk(a,b){for(var c=a.Ik.i;c.next();)Gk(a,c.value,b);null!==a.Qb&&(b?a.Qb.vf=!1:a.Qb.H())}function Gk(a,b,c){if(null!==b){for(var d=b.Pn.i;d.next();)Gk(a,d.value,c);null!==b.Qb&&(c?b.Qb.vf=!1:b.Qb.H())}} -function xj(a,b){if(!a.zx){var c=a.Qb,d=a.zu;a.zu=!0;var e=a.Na;a.Na=!0;try{a.Wb("Layout");for(var f=a.Ik.i;f.next();)Hk(a,f.value,b);c.vf||b&&!c.PD||(c.doLayout(a),ej(a),c.vf=!0)}finally{a.Wd("Layout"),a.Ot=!c.vf,a.zu=d,a.Na=e}}}function Hk(a,b,c){if(null!==b){for(var d=b.Pn.i;d.next();)Hk(a,d.value,c);d=b.Qb;null===d||d.vf||c&&!d.PD||(b.jy=!b.location.J(),d.doLayout(b),b.H(Ik),d.vf=!0,zj(a,b))}} -u.defineProperty(D,{qd:"isTreePathToChildren"},function(){return this.yu},function(a){var b=this.yu;if(b!==a&&(u.j(a,"boolean",D,"isTreePathToChildren"),this.yu=a,this.h("isTreePathToChildren",b,a),!this.ha.gb))for(a=this.yg;a.next();)Jk(a.value)});D.prototype.findTreeRoots=function(){for(var a=new E(U),b=this.yg;b.next();){var c=b.value;c.Ho&&null===c.As()&&a.add(c)}return a.i};u.defineProperty(D,{me:null},function(){return this.mB},function(a){this.mB=a}); -function Oi(a){function b(a){var b=a.toLowerCase(),h=new E("function");c.add(a,h);c.add(b,h);d.add(a,a);d.add(b,a)}var c=new la("string",E),d=new la("string","string");b("AnimationStarting");b("AnimationFinished");b("BackgroundSingleClicked");b("BackgroundDoubleClicked");b("BackgroundContextClicked");b("ClipboardChanged");b("ClipboardPasted");b("DocumentBoundsChanged");b("ExternalObjectsDropped");b("InitialLayoutCompleted");b("LayoutCompleted");b("LinkDrawn");b("LinkRelinked");b("LinkReshaped");b("Modified"); -b("ObjectSingleClicked");b("ObjectDoubleClicked");b("ObjectContextClicked");b("PartCreated");b("PartResized");b("PartRotated");b("SelectionMoved");b("SelectionCopied");b("SelectionDeleting");b("SelectionDeleted");b("SelectionGrouped");b("SelectionUngrouped");b("ChangingSelection");b("ChangedSelection");b("SubGraphCollapsed");b("SubGraphExpanded");b("TextEdited");b("TreeCollapsed");b("TreeExpanded");b("ViewportBoundsChanged");a.Bx=c;a.Ax=d} -function ma(a,b){var c=a.Ax.ta(b);return null!==c?c:a.Ax.ta(b.toLowerCase())}function Kk(a,b){var c=a.Bx.ta(b);if(null!==c)return c;c=a.Bx.ta(b.toLowerCase());if(null!==c)return c;u.k("Unknown DiagramEvent name: "+b);return null}D.prototype.addDiagramListener=D.prototype.Ky=function(a,b){u.j(a,"string",D,"addDiagramListener:name");u.j(b,"function",D,"addDiagramListener:listener");var c=Kk(this,a);null!==c&&c.add(b)}; -D.prototype.removeDiagramListener=D.prototype.lE=function(a,b){u.j(a,"string",D,"removeDiagramListener:name");u.j(b,"function",D,"addDiagramListener:listener");var c=Kk(this,a);null!==c&&c.remove(b)};D.prototype.raiseDiagramEvent=D.prototype.za=function(a,b,c){var d=Kk(this,a),e=new Nd;e.g=this;e.name=ma(this,a);void 0!==b&&(e.hA=b);void 0!==c&&(e.Mz=c);a=d.length;if(1===a)d=d.ja(0),d(e);else if(0!==a)for(b=d.Ke(),c=0;c=d.top&&0>=d.left&&0>=d.right&&0>=d.bottom)return c;var e=a.ob,f=a.scale,e=u.Vj(0,0,e.width*f,e.height*f),h=u.fc(0,0);if(b.x>=e.x&&b.xe.x+e.width-d.right&&(k=Math.max(a.lt,1),k|=0,h.x+=k,b.x>e.x+e.width-d.right/2&&(h.x+=k),b.x>e.x+e.width-d.right/4&&(h.x+=4*k));b.y>=e.y&&b.ye.y+e.height-d.bottom&&(k=Math.max(a.mt,1),k|=0,h.y+=k,b.y>e.y+e.height-d.bottom/2&&(h.y+=k),b.y>e.y+e.height-d.bottom/4&&(h.y+=4*k));h.De(K.Wj)||(c=new w(c.x+h.x/f,c.y+h.y/f));u.ic(e);u.v(h);return c}D.prototype.makeSVG=D.prototype.makeSvg=function(a){void 0===a&&(a=new pa);a.context="svg";a=Tk(this,a);return null!==a?a.sl:null}; -D.prototype.makeImage=function(a){void 0===a&&(a=new pa);var b=(a.document||document).createElement("img");b.src=this.tH(a);return b};D.prototype.makeImageData=D.prototype.tH=function(a){void 0===a&&(a=new pa);var b=Tk(this,a);return null!==b?b.toDataURL(a.type,a.details):""};var Uk=!1; -function Tk(a,b){a.Lb.Mi();a.bf();if(null===a.ib)return null;"object"!==typeof b&&u.k("properties argument must be an Object.");var c=!1,d=b.size||null,e=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(e="NaN");var f=b.maxSize;void 0===b.maxSize&&(c=!0,f="svg"===b.context?new ia(Infinity,Infinity):new ia(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,q=b.elementFinished||null,r= -b.showTemporary;void 0===r&&(r=!n);n=b.showGrid;void 0===n&&(n=r);null!==d&&isNaN(d.width)&&isNaN(d.height)&&(d=null);"number"===typeof l?l=new rb(l):l instanceof rb||(l=new rb(0));l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.qn=!1;$i(a);var s=new oa(null,p),t=s.getContext("2d"),v=s;if(!(d||e||k||h))return s.width=a.Ab+Math.ceil(l.left+l.right),s.height=a.zb+Math.ceil(l.top+l.bottom),"svg"===b.context&&(t=v=new Nc(s.Dd,p,q),t instanceof -Nc&&(a.qn=!0)),Gj(a,t,l,new ia(s.width,s.height),a.$b,a.Ma,k,m,r,n),a.qn=!0,v;var x=a.Eb.Pv,B=new w(0,0),y=a.Cd.copy();y.tI(a.padding);if(r)for(var C=!0,C=a.Zb.n,I=C.length,H=0;Hx?(e=x,h=y.width,Z=y.height):(h=f.width,Z=f.height)):(h=y.width*e,Z=y.height*e):(e=x,h=y.width,Z=y.height);null!==l?(h+=aa,Z+=C):l=new rb(0);null!==f&&(d=f.width,f=f.height,"svg"!==b.context&&c&&!Uk&&(h>d||Z>f)&&(u.trace("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(h)+"x"+Math.ceil(Z)+" vs 2000x2000) Consider increasing the max size."),Uk=!0), -isNaN(d)&&(d=2E3),isNaN(f)&&(f=2E3),isFinite(d)&&(h=Math.min(h,d)),isFinite(f)&&(Z=Math.min(Z,f)));s.width=Math.ceil(h);s.height=Math.ceil(Z);"svg"===b.context&&(t=v=new Nc(s.Dd,p,q),t instanceof Nc&&(a.qn=!0));Gj(a,t,l,new ia(Math.ceil(h),Math.ceil(Z)),e,B,k,m,r,n);a.qn=!0;return v}D.inherit=function(a,b){u.j(a,"function",D,"inherit");u.j(b,"function",D,"inherit");b.AF&&u.k("Cannot inherit from "+u.rg(b));u.Ga(a,b)}; -function Vi(){this.DF="63ad05bbe23a1786468a4c741b6d2";this.DF===this._tk?this.vh=!0:Vk(this,!1)} -function Vk(a,b){var c="p",d=window[u.Da("76a715b2f73f148a")][u.Da("72ba13b5")];if(u.Da("77bb5bb2f32603de")===window[u.Da("76a715b2f73f148a")][u.Da("6aba19a7ec351488")])try{a.vh=!window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b")])([u.Da("7bb8069ae7")]===u.Da(u.adym));if(!1===a.vh)return;a.vh=!window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b6c7a197c31bb4cfd3e")])([u.Da("7bb8069ae7")]===u.Da(u.adym)); -if(!1===a.vh)return}catch(e){}for(var f=d[u.Da("76ad18b4f73e")],h=d[u.Da("73a612b6fb191d")](u.Da("35e7"))+2;h=d&&u.Da(u.adym)!==u.Da("7da71ca0ad381e90")&&(d=c[u.Da("73a612b6fb191d")](u.Da("76a715b2ef3e149757")));a.vh=!(0b.timeStamp-a.Pl)b.preventDefault();else if(a.Jc=a.Ob,a.Ob=c,nj(a,a,b,c,!0),c.Wk=!0,c.Te=b.detail,a.nk=c.copy(),!0===c.Vp.simulated)b.preventDefault(),b.simulated=!0;else if(Ef=null,a.doMouseDown(),1===b.button)return b.preventDefault(),!1}};a.So=function(b){if(a.isEnabled){a.Jl=!0;var c=a.Jc;if(u.Dm){if(400>b.timeStamp-a.Pl){b.preventDefault();return}a.Pl=b.timeStamp}if(u.Dm&&null!==a.Ir)a.Ir=null,b.preventDefault();else{a.Jc=a.Ob;a.Ob=c;nj(a,a,b,c,!0);c.up=!0;c.Te=b.detail;if(u.aH||u.bH)b.timeStamp- -a.Plb.touches.length&&mj(a,c);rj(c,b)}};a.RE=function(b){if(a.isEnabled){var c=a.Jc;a.Jc=a.Ob;a.Ob=c;var d=null;0a.hr&& -mj(a,c),rj(c,b))}};a.MH=function(b){if("touch"===b.pointerType&&!(2>a.hr)){var c=a.Df;c[0].pointerId===b.pointerId&&(c[0]=b);c[1].pointerId===b.pointerId&&(c[1]=b);a.isEnabled&&(c=a.Jc,a.Jc=a.Ob,a.Ob=c,qj(a,b,b,c,!0),yf(a),a.Hw(b,null,c.Cg)||(a.doMouseMove(),rj(c,b)))}};a.LH=function(b){if("touch"===b.pointerType){var c=a.WB;void 0!==c[b.pointerId]&&(a.hr--,delete c[b.pointerId],c=a.Df,null!==c[0]&&c[0].pointerId===b.pointerId&&(c[0]=null),null!==c[1]&&c[1].pointerId===b.pointerId&&(c[1]=null))}}; -$i(a);Zi(a)}function Wk(a){1a)&&u.wa(a,"0 <= loc <= 1",ga,"addColorStop:loc");u.j(b,"string",ga,"addColorStop:color");null===this.Eg&&(this.Eg=new la("number","string"));this.Eg.add(a,b);this.oa===te&&(this.type=ue);this.Fg=null}; -u.defineProperty(ga,{type:"type"},function(){return this.oa},function(a){u.I(this,a);u.rb(a,ga,ga,"type");this.oa=a;this.start.ne()&&(a===ue?this.start=Db:a===ve&&(this.start=Ib));this.end.ne()&&(a===ue?this.end=Ub:a===ve&&(this.end=Ib));this.Fg=null});u.defineProperty(ga,{color:"color"},function(){return this.cn},function(a){u.I(this,a);this.cn=a;this.Fg=null});u.defineProperty(ga,{start:"start"},function(){return this.ao},function(a){u.I(this,a);u.C(a,L,ga,"start");this.ao=a.Z();this.Fg=null}); -u.defineProperty(ga,{end:"end"},function(){return this.sn},function(a){u.I(this,a);u.C(a,L,ga,"end");this.sn=a.Z();this.Fg=null});u.defineProperty(ga,{ut:"startRadius"},function(){return this.hv},function(a){u.I(this,a);u.ze(a,ga,"startRadius");0>a&&u.wa(a,">= zero",ga,"startRadius");this.hv=a;this.Fg=null});u.defineProperty(ga,{us:"endRadius"},function(){return this.iu},function(a){u.I(this,a);u.ze(a,ga,"endRadius");0>a&&u.wa(a,">= zero",ga,"endRadius");this.iu=a;this.Fg=null}); -u.defineProperty(ga,{os:"colorStops"},function(){return this.Eg},function(a){u.I(this,a);this.Eg=a;this.Fg=null});u.defineProperty(ga,{pattern:"pattern"},function(){return this.Wu},function(a){u.I(this,a);this.Wu=a;this.Fg=null}); -ga.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a),d=Math.floor(a+Math.random()*c).toString(16),e=Math.floor(a+Math.random()*c).toString(16),c=Math.floor(a+Math.random()*c).toString(16);2>d.length&&(d="0"+d);2>e.length&&(e="0"+e);2>c.length&&(c="0"+c);return"#"+d+e+c};var cl=u.createElement("canvas").getContext("2d"),fa; -ga.isValidColor=fa=function(a){if("black"===a)return!0;if(""===a)return!1;cl.fillStyle="#000000";var b=cl.fillStyle;cl.fillStyle=a;if(cl.fillStyle!==b)return!0;cl.fillStyle="#FFFFFF";b=cl.fillStyle;cl.fillStyle=a;return cl.fillStyle!==b}; -function S(){u.gc(this);this.ea=30723;this.Ic=1;this.Pg=null;this.Ub="";this.lc=this.Ib=null;this.Ma=(new w(NaN,NaN)).freeze();this.jf=(new ia(NaN,NaN)).freeze();this.nj=K.op;this.lj=K.jF;this.Sd=new ja;this.Xm=new ja;this.yk=new ja;this.$b=this.fu=1;this.Ym=0;this.Hh=dl;this.Gq=K.np;this.Pc=(new z(NaN,NaN,NaN,NaN)).freeze();this.Xb=(new z(NaN,NaN,NaN,NaN)).freeze();this.Hc=(new z(0,0,NaN,NaN)).freeze();this.Sr=this.Wp=this.Q=this.ir=this.jr=null;this.Tr=this.Xp=Infinity;this.vp=this.se=uc;this.wr= -0;this.tj=1;this.Cp=0;this.Wi=1;this.Ar=-Infinity;this.zr=0;this.Br=K.Wj;this.Cr=dh;this.Jp="";this.Gc=this.P=null;this.$m=-1;this.Wl=this.Xh=this.Bl=this.$n=null}u.Lh(S);u.fa("GraphObject",S); -S.prototype.cloneProtected=function(a){a.ea=this.ea|6144;a.Ic=this.Ic;a.Ub=this.Ub;a.Ib=this.Ib;a.lc=this.lc;a.Ma.assign(this.Ma);a.jf.assign(this.jf);a.nj=this.nj.Z();a.lj=this.lj.Z();a.yk=this.yk.copy();a.$b=this.$b;a.Ym=this.Ym;a.Hh=this.Hh;a.Gq=this.Gq.Z();a.Pc.assign(this.Pc);a.Xb.assign(this.Xb);a.Hc.assign(this.Hc);a.ir=this.ir;a.Q=null!==this.Q?this.Q.copy():null;a.Wp=this.Wp;a.Xp=this.Xp;a.Sr=this.Sr;a.Tr=this.Tr;a.se=this.se.Z();a.vp=this.vp.Z();a.wr=this.wr;a.tj=this.tj;a.Cp=this.Cp;a.Wi= -this.Wi;a.Ar=this.Ar;a.zr=this.zr;a.Br=this.Br.Z();a.Cr=this.Cr;a.Jp=this.Jp;a.P=null!==this.P?this.P.copy():null;a.Gc=this.Gc;a.$m=this.$m;if(null!==this.Bl){a.Bl=u.Pk(this.Bl);for(var b=0;bk;)k+=f[n++%l],p=!p;q=!1}else k=f[n++%l];k>m&&(k=m);var r=Math.sqrt(k*k/(1+e*e));0>d&&(r=-r);b+=r;c+=e*r;p?a.lineTo(b,c):a.moveTo(b,c);m-=k;p=!p}} -S.prototype.raiseChangedEvent=S.prototype.Dc=function(a,b,c,d,e,f,h){var k=this.T;null!==k&&(k.Lm(a,b,c,d,e,f,h),0!==(this.ea&1024)&&c===this&&a===$d&&ll(this,k,b))}; -function ll(a,b,c){var d=a.zo();if(null!==d)for(var e=a.Gc.i;e.next();){var f=e.value,h=null;if(null!==f.Nm){h=ef(f,d,a);if(null===h)continue;f.Mw(a,h,c,null)}else if(f.xt){var k=b.g;null!==k&&f.Mw(a,k.ga.Zs,c,k)}else{var l=d.data;if(null===l)continue;k=b.g;null!==k&&k.Iw||f.Mw(a,l,c,k)}null!==h&&(k=d.Vv(f.tl),null!==k&&f.ZE(k,h,c))}}S.prototype.Vv=function(a){return this.$m===a?this:null};S.prototype.raiseChanged=S.prototype.h=function(a,b,c){this.Dc($d,a,this,b,c)}; -function ml(a,b,c,d,e){var f=a.Pc,h=a.yk;h.reset();nl(a,h,b,c,d,e);a.yk=h;f.x=b;f.y=c;f.width=d;f.height=e;h.Os()||h.WE(f)}function ol(a,b,c,d){if(!1===a.Ag)return!1;d.multiply(a.transform);return c?a.sg(b,d):a.sm(b,d)} -S.prototype.sD=function(a,b,c){if(!1===this.Ag)return!1;var d=this.Ha;b=a.Lj(b);var e=!1;c&&(e=Xa(a.x,a.y,0,0,0,d.height)a&&(a+=360));return a}; -S.prototype.getDocumentScale=S.prototype.Hi=function(){if(0!==(this.ea&4096)===!1)return this.fu;var a=this.$b;return null!==this.S?a*this.S.Hi():a};S.prototype.getLocalPoint=S.prototype.zD=function(a,b){void 0===b&&(b=new w);b.assign(a);this.Ff.Oh(b);return b};S.prototype.getNearestIntersectionPoint=S.prototype.bl=function(a,b,c){return this.Co(a.x,a.y,b.x,b.y,c)};g=S.prototype; -g.Co=function(a,b,c,d,e){var f=this.transform,h=1/(f.m11*f.m22-f.m12*f.m21),k=f.m22*h,l=-f.m12*h,m=-f.m21*h,n=f.m11*h,p=h*(f.m21*f.dy-f.m22*f.dx),q=h*(f.m12*f.dx-f.m11*f.dy);if(null!==this.nm)return f=this.ba,K.bl(f.left,f.top,f.right,f.bottom,a,b,c,d,e);h=a*k+b*m+p;a=a*l+b*n+q;b=c*k+d*m+p;c=c*l+d*n+q;e.m(0,0);d=this.Ha;c=K.bl(0,0,d.width,d.height,h,a,b,c,e);e.transform(f);return c}; -function Ph(a,b,c,d,e){if(!1!==Aj(a)){var f=a.margin,h=f.right+f.left,f=f.top+f.bottom;b=Math.max(b-h,0);c=Math.max(c-f,0);e=e||0;d=Math.max((d||0)-h,0);e=Math.max(e-f,0);var h=a.angle,f=0,f=a.xa,k=0;a.hb&&(k=a.hb);90===h||270===h?(b=isFinite(f.height)?f.height+k:b,c=isFinite(f.width)?f.width+k:c):(b=isFinite(f.width)?f.width+k:b,c=isFinite(f.height)?f.height+k:c);var f=d||0,k=e||0,l=a instanceof A;switch(pl(a,!0)){case qh:k=f=0;l&&(c=b=Infinity);break;case cd:isFinite(b)&&b>d&&(f=b);isFinite(c)&& -c>e&&(k=c);break;case fl:isFinite(b)&&b>d&&(f=b);k=0;l&&(c=Infinity);break;case el:isFinite(c)&&c>e&&(k=c),f=0,l&&(b=Infinity)}var l=a.af,m=a.vg;f>l.width&&m.widthl.height&&m.heighta.height||this.ej.Oe>a.width))&&(c=!0);this.ea=c?this.ea|256:this.ea&-257;this.Xb.J()|| -u.k("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.Xb.toString());this.sw(f,this.Xb);u.ic(f)};g.xi=function(){}; -function ql(a,b,c,d,e){var f=a.ba;f.x=b;f.y=c;f.width=d;f.height=e;if(!a.xa.J()){f=a.Pc;c=a.margin;b=c.right+c.left;var h=c.top+c.bottom;c=f.width+b;f=f.height+h;d+=b;e+=h;b=pl(a,!0);c===d&&f===e&&(b=qh);switch(b){case qh:if(c>d||f>e)uj(a,!0),Ph(a,c>d?d:c,f>e?e:f);break;case cd:uj(a,!0);Ph(a,d,e,0,0);break;case fl:uj(a,!0);Ph(a,d,f,0,0);break;case el:uj(a,!0),Ph(a,c,e,0,0)}}} -g.sw=function(){rl(this,!1);var a=this.T;null!==a&&null!==a.g&&(a.dl(),this.Qu(a),this.ma(),a=this.T,null!==a&&(a.nt!==this&&a.sE!==this&&a.vE!==this||sl(a,!0)))};g.Qu=function(a){null!==this.Jd&&sl(a,!0)}; -g.We=function(a,b){if(this.visible){var c=this.opacity,d=1;if(1!==c){if(0===c)return;d=a.globalAlpha;a.globalAlpha=d*c}if(a instanceof Nc)a:{if(this.visible){var e=null,f=a.kw;if(this instanceof A&&(this.type===tl||this.type===ul))vl(this,a,b);else{var h=this.Xb;if(0!==h.width&&0!==h.height&&!isNaN(h.x)&&!isNaN(h.y)){var k=this.transform,l=this.S;0!==(this.ea&4096)===!0&&wl(this);var m=0!==(this.ea&256),n=!1;this instanceof qa&&xl(this,a);if(m){n=l.Tf()?l.Ha:l.ba;if(this.Xh)var p=this.Xh,q=p.x,r= -p.y,s=p.width,p=p.height;else q=Math.max(h.x,n.x),r=Math.max(h.y,n.y),s=Math.min(h.right,n.right)-q,p=Math.min(h.bottom,n.bottom)-r;if(q>h.width+h.x||h.x>n.width+n.x||r>h.height+h.y||h.y>n.height+n.y)break a;n=!0;Uc(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(q,r,s,p);a.clip()}q=!1;if(this instanceof G&&(q=!0,!this.Ea()))break a;r=!1;s=b.Qg;this.T&&s.drawShadows&&(r=this.T.il);a.Ei.$e=[1,0,0,1,0,0];null!==this.lc&&(yl(this,a,this.lc,!0,!0),this.lc instanceof ga&&this.lc.type===ve?(a.beginPath(), -a.rect(h.x,h.y,h.width,h.height),zl(a,this.lc)):a.fillRect(h.x,h.y,h.width,h.height));q&&this.il&&s.drawShadows&&(Uc(a,1,0,0,1,0,0),h=this.em,a.shadowOffsetX=h.x,a.shadowOffsetY=h.y,a.shadowColor=this.dm,a.shadowBlur=this.cm/b.scale,a.$a());this instanceof A?Uc(a,k.m11,k.m12,k.m21,k.m22,k.dx,k.dy):a.Ei.$e=[k.m11,k.m12,k.m21,k.m22,k.dx,k.dy];if(null!==this.Ib){var p=this.Ha,h=k=0,s=p.width,p=p.height,t=0;this instanceof X&&(p=this.Pa.kb,k=p.x,h=p.y,s=p.width,p=p.height,t=this.Sg);yl(this,a,this.Ib, -!0,!1);this.Ib instanceof ga&&this.Ib.type===ve?(a.beginPath(),a.rect(k-t/2,h-t/2,s+t,p+t),zl(a,this.Ib)):a.fillRect(k-t/2,h-t/2,s+t,p+t)}s=h=k=0;r&&(null!==this.Ib||null!==this.lc||null!==l&&0!==(l.ea&512)||null!==l&&l.type===Yi&&l.If()!==this)?(Al(this,!0),k=a.shadowOffsetX,h=a.shadowOffsetY,s=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0):Al(this,!1);this.Mj(a,b);r&&0!==(this.ea&512)===!0&&(a.shadowOffsetX=k,a.shadowOffsetY=h,a.shadowBlur=s);q&&r&&(a.shadowOffsetX=0,a.shadowOffsetY= -0,a.shadowBlur=0);m&&(a.restore(),n&&a.rf.pop(),$i(b,a));this instanceof A&&(e=a.rf.pop());q&&r&&a.rf.pop();null!==a.nD&&(null===e&&(f===a.kw?(Uc(a,1,0,0,1,0,0),e=a.rf.pop()):e=a.kw),a.nD(this,e))}}}}else{if(this instanceof A&&(this.type===tl||this.type===ul)){vl(this,a,b);1!==c&&(a.globalAlpha=d);return}q=this.Xb;if(0!==q.width&&0!==q.height&&!isNaN(q.x)&&!isNaN(q.y)){e=this.transform;f=this.S;0!==(this.ea&4096)===!0&&wl(this);l=0!==(this.ea&256);this instanceof qa&&xl(this,a);if(l){m=f.Tf()?f.Ha: -f.ba;this.Xh?(h=this.Xh,n=h.x,r=h.y,k=h.width,h=h.height):(n=Math.max(q.x,m.x),r=Math.max(q.y,m.y),k=Math.min(q.right,m.right)-n,h=Math.min(q.bottom,m.bottom)-r);if(n>q.width+q.x||q.x>m.width+m.x||r>q.height+q.y||q.y>m.height+m.y){1!==c&&(a.globalAlpha=d);return}a.save();a.beginPath();a.rect(n,r,k,h);a.clip()}r=b.Qg;m=!1;if(this instanceof G){m=!0;if(!this.Ea()){1!==c&&(a.globalAlpha=d);return}this.il&&r.drawShadows&&(n=this.em,a.shadowOffsetX=n.x*b.scale*b.nf,a.shadowOffsetY=n.y*b.scale*b.nf,a.shadowColor= -this.dm,a.shadowBlur=this.cm)}n=!1;this.T&&r.drawShadows&&(n=this.T.il);null!==this.lc&&(yl(this,a,this.lc,!0,!0),this.lc instanceof ga&&this.lc.type===ve?(a.beginPath(),a.rect(q.x,q.y,q.width,q.height),zl(a,this.lc)):a.fillRect(q.x,q.y,q.width,q.height));e.Os()||a.transform(e.m11,e.m12,e.m21,e.m22,e.dx,e.dy);null!==this.Ib&&(h=this.Ha,r=q=0,k=h.width,h=h.height,s=0,this instanceof X&&(h=this.Pa.kb,q=h.x,r=h.y,k=h.width,h=h.height,s=this.Sg),yl(this,a,this.Ib,!0,!1),this.Ib instanceof ga&&this.Ib.type=== -ve?(a.beginPath(),a.rect(q-s/2,r-s/2,k+s,h+s),zl(a,this.Ib)):a.fillRect(q-s/2,r-s/2,k+s,h+s));k=r=q=0;n&&(null!==this.Ib||null!==this.lc||null!==f&&0!==(f.ea&512)||null!==f&&(f.type===Yi||f.type===oh)&&f.If()!==this)?(Al(this,!0),q=a.shadowOffsetX,r=a.shadowOffsetY,k=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0):Al(this,!1);this.Mj(a,b);n&&0!==(this.ea&512)===!0&&(a.shadowOffsetX=q,a.shadowOffsetY=r,a.shadowBlur=k);m&&n&&(a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0);l?(a.restore(), -this instanceof A?$i(b,a,!0):$i(b,a,!1)):e.Os()||(f=1/(e.m11*e.m22-e.m12*e.m21),a.transform(e.m22*f,-e.m12*f,-e.m21*f,e.m11*f,f*(e.m21*e.dy-e.m22*e.dx),f*(e.m12*e.dx-e.m11*e.dy)))}}1!==c&&(a.globalAlpha=d)}}; -function vl(a,b,c){var d=a.Xb;0===d.width||0===d.height||isNaN(d.x)||isNaN(d.y)||(null!==a.lc&&(yl(a,b,a.lc,!0,!0),a.lc instanceof ga&&a.lc.type===ve?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),zl(b,a.lc)):b.fillRect(d.x,d.y,d.width,d.height)),null!==a.Ib&&(yl(a,b,a.Ib,!0,!1),a.Ib instanceof ga&&a.Ib.type===ve?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),zl(b,a.Ib)):b.fillRect(d.x,d.y,d.width,d.height)),a.Mj(b,c))}g.Mj=function(){}; -function zl(a,b){if(b instanceof ga&&b.type===ve&&!(a instanceof Nc)){var c=b.lx,d=b.kx;d>c?(a.scale(c/d,1),a.translate((d-c)/2,0)):c>d&&(a.scale(1,d/c),a.translate(0,(c-d)/2));a.Ft?a.clip():a.fill();d>c?(a.translate(-(d-c)/2,0),a.scale(1/(c/d),1)):c>d&&(a.translate(0,-(c-d)/2),a.scale(1,1/(d/c)))}else a.Ft?a.clip():a.fill()}function Bl(a){a.Ft||a.stroke()} -function yl(a,b,c,d,e){if(null!==c){var f=1,h=1;if("string"===typeof c)d?b.Sm!==c&&(b.fillStyle=c,b.Sm=c):b.Tm!==c&&(b.strokeStyle=c,b.Tm=c);else if(c.type===te)c=c.color,d?b.Sm!==c&&(b.fillStyle=c,b.Sm=c):b.Tm!==c&&(b.strokeStyle=c,b.Tm=c);else{var k,h=a.Ha,f=h.width,h=h.height;if(e)var l=a.ba,f=l.width,h=l.height;var m=b instanceof CanvasRenderingContext2D;if(m&&(c.Fg&&c.type===bl||c.lx===f&&c.kx===h))k=c.Fg;else{var n=l=0,p=0,q=0,r=0,s=0,s=r=0;e&&(l=a.ba,f=l.width,h=l.height,r=l.x,s=l.y);l=c.start.x* -f+c.start.offsetX;n=c.start.y*h+c.start.offsetY;p=c.end.x*f+c.end.offsetX;q=c.end.y*h+c.end.offsetY;l+=r;p+=r;n+=s;q+=s;c.type===ue?k=b.createLinearGradient(l,n,p,q):c.type===ve?(s=isNaN(c.us)?Math.max(f,h)/2:c.us,isNaN(c.ut)?(r=0,s=Math.max(f,h)/2):r=c.ut,k=b.createRadialGradient(l,n,r,p,q,s)):c.type===bl?k=b.createPattern(c.pattern,"repeat"):u.Kd(c.type,"Brush type");if(c.type!==bl&&(a=c.os,null!==a))for(a=a.i;a.next();)k.addColorStop(a.key,a.value);m&&(c.Fg=k,c.lx=f,c.kx=h)}d?b.Sm!==k&&(b.fillStyle= -k,b.Sm=k):b.Tm!==k&&(b.strokeStyle=k,b.Tm=k)}}}S.prototype.isContainedBy=S.prototype.gl=function(a){if(a instanceof A)a:{if(this!==a&&null!==a)for(var b=this.S;null!==b;){if(b===a){a=!0;break a}b=b.S}a=!1}else a=!1;return a};S.prototype.isVisibleObject=S.prototype.kl=function(){if(!this.visible)return!1;var a=this.S;return null!==a?a.kl():!0}; -function wl(a){if(0!==(a.ea&2048)===!0){var b=a.Sd;b.reset();if(!a.Xb.J()||!a.Pc.J()){Cl(a,!1);return}b.translate(a.Xb.x,a.Xb.y);b.translate(-a.Ba.x,-a.Ba.y);var c=a.Ha;nl(a,b,c.x,c.y,c.width,c.height);Cl(a,!1);Dl(a,!0)}0!==(a.ea&4096)===!0&&(b=a.S,null===b?(a.Xm.set(a.Sd),a.fu=a.scale,Dl(a,!1)):null!==b.Ff&&(c=a.Xm,c.reset(),b.Tf()?c.multiply(b.Xm):null!==b.S&&c.multiply(b.S.Xm),c.multiply(a.Sd),a.fu=a.scale*b.fu,Dl(a,!1)))} -function nl(a,b,c,d,e,f){1!==a.scale&&b.scale(a.scale);if(0!==a.angle){var h=Ib;a.Ze&&a.Ze.pd()&&(h=a.Ze);var k=u.K();if(a instanceof G&&a.ec!==a)for(c=a.ec,d=c.Ha,k.rt(d.x,d.y,d.width,d.height,h),c.yk.ab(k),k.offset(-c.Ba.x,-c.Ba.y),h=c.S;null!==h&&h!==a;)h.yk.ab(k),k.offset(-h.Ba.x,-h.Ba.y),h=h.S;else k.rt(c,d,e,f,h);b.rotate(a.angle,k.x,k.y);u.v(k)}}g=S.prototype; -g.R=function(a){void 0===a&&(a=!1);if(!0!==Aj(this)){uj(this,!0);rl(this,!0);var b=this.S;null!==b?a||b.R():(a=this.g,null!==a&&(a.Xf.add(this),this instanceof U&&(a.ha.gb||this.sf(),null!==this.ce&&El(this.ce)),a.de(!0)));if(this instanceof A){if(this.oa===Yi||this.oa===ah)a=this.If(),null!==a&&a.R(!0);a=this.ya.n;for(var b=a.length,c=0;ca?a=0:1a||1=a&&u.k("GraphObject.scale must be greater than zero"),this.$b=a,this.Jg(),this.R(),this.h("scale",b,a))});u.defineProperty(S,{angle:"angle"},function(){return this.Ym},function(a){var b=this.Ym;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.Ym=a,this.R(),this.Jg(),this.h("angle",b,a)))}); -u.defineProperty(S,{xa:"desiredSize"},function(){return this.jf},function(a){var b=this.jf;b.L(a)||(this.jf=a=a.Z(),this.R(),this instanceof X&&this.le(),this.h("desiredSize",b,a),a=this.T,null!==a&&0!==(this.ea&1024)&&(ll(this,a,"width"),ll(this,a,"height")))}); -u.defineProperty(S,{width:"width"},function(){return this.jf.width},function(a){if(this.jf.width!==a){var b=this.jf;this.jf=a=(new ia(a,this.jf.height)).freeze();this.R();this instanceof X&&this.le();this.h("desiredSize",b,a);b=this.T;null!==b&&0!==(this.ea&1024)&&ll(this,b,"width")}}); -u.defineProperty(S,{height:"height"},function(){return this.jf.height},function(a){if(this.jf.height!==a){var b=this.jf;this.jf=a=(new ia(this.jf.width,a)).freeze();this.R();this instanceof X&&this.le();this.h("desiredSize",b,a);b=this.T;null!==b&&0!==(this.ea&1024)&&ll(this,b,"height")}}); -u.defineProperty(S,{vg:"minSize"},function(){return this.nj},function(a){var b=this.nj;b.L(a)||(a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.nj=a,this.R(),this.h("minSize",b,a))});u.defineProperty(S,{af:"maxSize"},function(){return this.lj},function(a){var b=this.lj;b.L(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.lj=a,this.R(),this.h("maxSize",b,a))});u.u(S,{Ba:"measuredBounds"},function(){return this.Pc}); -u.u(S,{Ha:"naturalBounds"},function(){return this.Hc},{configurable:!0});u.defineProperty(S,{margin:"margin"},function(){return this.Gq},function(a){"number"===typeof a&&(a=new rb(a));var b=this.Gq;b.L(a)||(this.Gq=a=a.Z(),this.R(),this.h("margin",b,a))});u.u(S,{transform:null},function(){0!==(this.ea&2048)===!0&&wl(this);return this.Sd});u.u(S,{Ff:null},function(){0!==(this.ea&4096)===!0&&wl(this);return this.Xm}); -u.defineProperty(S,{alignment:"alignment"},function(){return this.se},function(a){var b=this.se;b.L(a)||(a.ne()&&!a.Lc()&&u.k("alignment must be a real Spot or Spot.Default"),this.se=a=a.Z(),El(this),this.h("alignment",b,a))});u.defineProperty(S,{column:"column"},function(){return this.Cp},function(a){a=Math.round(a);var b=this.Cp;b!==a&&(0>a&&u.wa(a,">= 0",S,"column"),this.Cp=a,this.R(),this.h("column",b,a))}); -u.defineProperty(S,{$F:"columnSpan"},function(){return this.Wi},function(a){a=Math.round(a);var b=this.Wi;b!==a&&(1>a&&u.wa(a,">= 1",S,"columnSpan"),this.Wi=a,this.R(),this.h("columnSpan",b,a))});u.defineProperty(S,{rc:"row"},function(){return this.wr},function(a){a=Math.round(a);var b=this.wr;b!==a&&(0>a&&u.wa(a,">= 0",S,"row"),this.wr=a,this.R(),this.h("row",b,a))}); -u.defineProperty(S,{rowSpan:"rowSpan"},function(){return this.tj},function(a){a=Math.round(a);var b=this.tj;b!==a&&(1>a&&u.wa(a,">= 1",S,"rowSpan"),this.tj=a,this.R(),this.h("rowSpan",b,a))});u.defineProperty(S,{Hj:"alignmentFocus"},function(){return this.vp},function(a){var b=this.vp;b.L(a)||(a.ne()&&!a.Lc()&&u.k("alignmentFocus must be a real Spot or Spot.Default"),this.vp=a=a.Z(),this.R(),this.h("alignmentFocus",b,a))}); -u.defineProperty(S,{Jd:"portId"},function(){return this.ir},function(a){var b=this.ir;if(b!==a){var c=this.T;null===c||c instanceof U||(u.k("portID being set on a Link: "+a),c=null);null!==b&&null!==c&&Ll(c,this);this.ir=a;if(null!==a&&c){c.xh=!0;null===c.Qd&&Ml(c);var d=this.Jd;null!==d&&c.Qd.add(d,this)}this.h("portId",b,a)}});function Nl(a){var b={value:null};Ol(a,b);return b.value}function Ol(a,b){var c=a.S;return null===c||!Ol(c,b)&&a.visible?(b.value=a,!1):!0} -function Il(a){var b=a.T;b instanceof U&&(a=a.g,null===a||a.ha.gb||b.sf())}u.defineProperty(S,{xb:"toSpot"},function(){return null!==this.Q?this.Q.Ej:vb},function(a){null===this.Q&&this.Ee();var b=this.Q.Ej;b.L(a)||(a=a.Z(),this.Q.Ej=a,this.h("toSpot",b,a),Il(this))}); -u.defineProperty(S,{vl:"toEndSegmentLength"},function(){return null!==this.Q?this.Q.Cj:10},function(a){null===this.Q&&this.Ee();var b=this.Q.Cj;b!==a&&(0>a&&u.wa(a,">= 0",S,"toEndSegmentLength"),this.Q.Cj=a,this.h("toEndSegmentLength",b,a),Il(this))});u.defineProperty(S,{wt:"toEndSegmentDirection"},function(){return null!==this.Q?this.Q.Bj:jl},function(a){null===this.Q&&this.Ee();var b=this.Q.Bj;b!==a&&(this.Q.Bj=a,this.h("toEndSegmentDirection",b,a),Il(this))}); -u.defineProperty(S,{yt:"toShortLength"},function(){return null!==this.Q?this.Q.Dj:0},function(a){null===this.Q&&this.Ee();var b=this.Q.Dj;b!==a&&(this.Q.Dj=a,this.h("toShortLength",b,a),Il(this))});u.defineProperty(S,{OE:"toLinkable"},function(){return this.Sr},function(a){var b=this.Sr;b!==a&&(this.Sr=a,this.h("toLinkable",b,a))});u.defineProperty(S,{yI:"toMaxLinks"},function(){return this.Tr},function(a){var b=this.Tr;b!==a&&(0>a&&u.wa(a,">= 0",S,"toMaxLinks"),this.Tr=a,this.h("toMaxLinks",b,a))}); -u.defineProperty(S,{vb:"fromSpot"},function(){return null!==this.Q?this.Q.cj:vb},function(a){null===this.Q&&this.Ee();var b=this.Q.cj;b.L(a)||(a=a.Z(),this.Q.cj=a,this.h("fromSpot",b,a),Il(this))});u.defineProperty(S,{Yk:"fromEndSegmentLength"},function(){return null!==this.Q?this.Q.aj:10},function(a){null===this.Q&&this.Ee();var b=this.Q.aj;b!==a&&(0>a&&u.wa(a,">= 0",S,"fromEndSegmentLength"),this.Q.aj=a,this.h("fromEndSegmentLength",b,a),Il(this))}); -u.defineProperty(S,{Es:"fromEndSegmentDirection"},function(){return null!==this.Q?this.Q.$i:jl},function(a){null===this.Q&&this.Ee();var b=this.Q.$i;b!==a&&(this.Q.$i=a,this.h("fromEndSegmentDirection",b,a),Il(this))});u.defineProperty(S,{Fs:"fromShortLength"},function(){return null!==this.Q?this.Q.bj:0},function(a){null===this.Q&&this.Ee();var b=this.Q.bj;b!==a&&(this.Q.bj=a,this.h("fromShortLength",b,a),Il(this))}); -u.defineProperty(S,{vD:"fromLinkable"},function(){return this.Wp},function(a){var b=this.Wp;b!==a&&(this.Wp=a,this.h("fromLinkable",b,a))});u.defineProperty(S,{DG:"fromMaxLinks"},function(){return this.Xp},function(a){var b=this.Xp;b!==a&&(0>a&&u.wa(a,">= 0",S,"fromMaxLinks"),this.Xp=a,this.h("fromMaxLinks",b,a))});u.defineProperty(S,{cursor:"cursor"},function(){return this.Jp},function(a){var b=this.Jp;b!==a&&(u.j(a,"string",S,"cursor"),this.Jp=a,this.h("cursor",b,a))}); -u.defineProperty(S,{click:"click"},function(){return null!==this.P?this.P.Wh:null},function(a){null===this.P&&gl(this);var b=this.P.Wh;b!==a&&(null!==a&&u.j(a,"function",S,"click"),this.P.Wh=a,this.h("click",b,a))});u.defineProperty(S,{ts:"doubleClick"},function(){return null!==this.P?this.P.ci:null},function(a){null===this.P&&gl(this);var b=this.P.ci;b!==a&&(null!==a&&u.j(a,"function",S,"doubleClick"),this.P.ci=a,this.h("doubleClick",b,a))}); -u.defineProperty(S,{Uy:"contextClick"},function(){return null!==this.P?this.P.Yh:null},function(a){null===this.P&&gl(this);var b=this.P.Yh;b!==a&&(null!==a&&u.j(a,"function",S,"contextClick"),this.P.Yh=a,this.h("contextClick",b,a))});u.defineProperty(S,{ZD:"mouseEnter"},function(){return null!==this.P?this.P.Rq:null},function(a){null===this.P&&gl(this);var b=this.P.Rq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseEnter"),this.P.Rq=a,this.h("mouseEnter",b,a))}); -u.defineProperty(S,{$D:"mouseLeave"},function(){return null!==this.P?this.P.Sq:null},function(a){null===this.P&&gl(this);var b=this.P.Sq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseLeave"),this.P.Sq=a,this.h("mouseLeave",b,a))});u.defineProperty(S,{Fz:"mouseOver"},function(){return null!==this.P?this.P.mi:null},function(a){null===this.P&&gl(this);var b=this.P.mi;b!==a&&(null!==a&&u.j(a,"function",S,"mouseOver"),this.P.mi=a,this.h("mouseOver",b,a))}); -u.defineProperty(S,{Ez:"mouseHover"},function(){return null!==this.P?this.P.li:null},function(a){null===this.P&&gl(this);var b=this.P.li;b!==a&&(null!==a&&u.j(a,"function",S,"mouseHover"),this.P.li=a,this.h("mouseHover",b,a))});u.defineProperty(S,{Dz:"mouseHold"},function(){return null!==this.P?this.P.ki:null},function(a){null===this.P&&gl(this);var b=this.P.ki;b!==a&&(null!==a&&u.j(a,"function",S,"mouseHold"),this.P.ki=a,this.h("mouseHold",b,a))}); -u.defineProperty(S,{CH:"mouseDragEnter"},function(){return null!==this.P?this.P.Pq:null},function(a){null===this.P&&gl(this);var b=this.P.Pq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseDragEnter"),this.P.Pq=a,this.h("mouseDragEnter",b,a))});u.defineProperty(S,{DH:"mouseDragLeave"},function(){return null!==this.P?this.P.Qq:null},function(a){null===this.P&&gl(this);var b=this.P.Qq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseDragLeave"),this.P.Qq=a,this.h("mouseDragLeave",b,a))}); -u.defineProperty(S,{Cz:"mouseDrop"},function(){return null!==this.P?this.P.ji:null},function(a){null===this.P&&gl(this);var b=this.P.ji;b!==a&&(null!==a&&u.j(a,"function",S,"mouseDrop"),this.P.ji=a,this.h("mouseDrop",b,a))});u.defineProperty(S,{HC:"actionDown"},function(){return null!==this.P?this.P.qp:null},function(a){null===this.P&&gl(this);var b=this.P.qp;b!==a&&(null!==a&&u.j(a,"function",S,"actionDown"),this.P.qp=a,this.h("actionDown",b,a))}); -u.defineProperty(S,{IC:"actionMove"},function(){return null!==this.P?this.P.rp:null},function(a){null===this.P&&gl(this);var b=this.P.rp;b!==a&&(null!==a&&u.j(a,"function",S,"actionMove"),this.P.rp=a,this.h("actionMove",b,a))});u.defineProperty(S,{JC:"actionUp"},function(){return null!==this.P?this.P.sp:null},function(a){null===this.P&&gl(this);var b=this.P.sp;b!==a&&(null!==a&&u.j(a,"function",S,"actionUp"),this.P.sp=a,this.h("actionUp",b,a))}); -u.defineProperty(S,{GC:"actionCancel"},function(){return null!==this.P?this.P.pp:null},function(a){null===this.P&&gl(this);var b=this.P.pp;b!==a&&(null!==a&&u.j(a,"function",S,"actionCancel"),this.P.pp=a,this.h("actionCancel",b,a))});u.defineProperty(S,{lA:"toolTip"},function(){return null!==this.P?this.P.ti:null},function(a){null===this.P&&gl(this);var b=this.P.ti;b!==a&&(null!==a&&u.C(a,lf,S,"toolTip"),this.P.ti=a,this.h("toolTip",b,a))}); -u.defineProperty(S,{contextMenu:"contextMenu"},function(){return null!==this.P?this.P.Zh:null},function(a){null===this.P&&gl(this);var b=this.P.Zh;b!==a&&(null!==a&&u.C(a,lf,S,"contextMenu"),this.P.Zh=a,this.h("contextMenu",b,a))});S.prototype.bind=S.prototype.bind=function(a){a.fg=this;var b=this.zo();null!==b&&Pl(b)&&u.k("Cannot add a Binding to a template that has already been copied: "+a);null===this.Gc&&(this.Gc=new E(bf));this.Gc.add(a)}; -S.prototype.findTemplateBinder=S.prototype.zo=function(){for(var a=this instanceof A?this:this.S;null!==a;){if(null!==a.yl)return a;a=a.S}return null};S.fromSvg=S.fromSVG=function(a){return Ql(a)};S.prototype.setProperties=function(a){u.ot(this,a)};var Rl; -S.make=Rl=function(a,b){var c=arguments,d=null,e=null;if("function"===typeof a)e=a;else if("string"===typeof a){var f=Sl.ta(a);"function"===typeof f?(c=u.Pk(arguments),d=f(c)):e=da[a]}null===d&&(void 0===e&&(d=window.$,void 0!==d&&void 0!==d.noop&&u.k("GraphObject.make failed to complete. Is it conflicting with another $ var? (such as jQuery)"),u.k("GraphObject.make failed to complete, it may be conflicting with another var.")),null!==e&&e.constructor||u.k("GraphObject.make requires a class function or class name, not: "+ -a),d=new e);f=1;if(d instanceof D&&1e)&&u.k("Must specify non-negative integer row for RowColumnDefinition "+ -b),a.ae=!0,a.index=e):void 0!==b.column&&(e=b.column,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&u.k("Must specify non-negative integer column for RowColumnDefinition "+b),a.ae=!1,a.index=e);e=new pa;for(c in b)"row"!==c&&"column"!==c&&(e[c]=b[c]);u.ot(a,e)}else u.ot(a,b);else u.k('Unknown initializer "'+b+'" for object being constructed by GraphObject.make: '+a)}var Sl=new la("string","function"); -S.getBuilders=function(){var a=new la("string","function"),b;for(b in Sl)if(b!==b.toLowerCase()){var c=Sl[b];"function"===typeof c&&a.add(b,c)}a.freeze();return a};var Dm;S.defineBuilder=Dm=function(a,b){u.j(a,"string",S,"defineBuilder:name");u.j(b,"function",S,"defineBuilder:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);Sl.add(a,b)};var Em; -S.takeBuilderArgument=Em=function(a,b,c){void 0===c&&(c=null);var d=a[1];if("function"===typeof c?c(d):"string"===typeof d)return a.splice(1,1),d;if(void 0===b)throw Error("no "+("function"===typeof c?"satisfactory":"string")+" argument for GraphObject builder "+a[0]);return b}; -Dm("Button",function(){var a=new ga(ue);a.addColorStop(0,"white");a.addColorStop(1,"lightgray");var b=new ga(ue);b.addColorStop(0,"white");b.addColorStop(1,"dodgerblue");a=Rl(A,Yi,{pz:!0},{_buttonFillNormal:a,_buttonStrokeNormal:"gray",_buttonFillOver:b,_buttonStrokeOver:"blue"},Rl(X,{name:"ButtonBorder",Fb:"Rectangle",A:new L(0,0,2.761423749153968,2.761423749153968),B:new L(1,1,-2.761423749153968,-2.761423749153968),fill:a,stroke:"gray"}));a.ZD=function(a,b){var e=b.je("ButtonBorder");if(e instanceof -X){var f=b._buttonFillOver;b._buttonFillNormal=e.fill;e.fill=f;f=b._buttonStrokeOver;b._buttonStrokeNormal=e.stroke;e.stroke=f}};a.$D=function(a,b){var e=b.je("ButtonBorder");e instanceof X&&(e.fill=b._buttonFillNormal,e.stroke=b._buttonStrokeNormal)};return a}); -Dm("TreeExpanderButton",function(){var a=Rl("Button",{_treeExpandedFigure:"MinusLine",_treeCollapsedFigure:"PlusLine"},Rl(X,{name:"ButtonIcon",Fb:"MinusLine",xa:K.mp},(new bf("figure","isTreeExpanded",function(a,c){var d=c.S;return a?d._treeExpandedFigure:d._treeCollapsedFigure})).rw()),{visible:!1},(new bf("visible","isTreeLeaf",function(a){return!a})).rw());a.click=function(a,c){var d=c.T;d instanceof lf&&(d=d.Kh);if(d instanceof U){var e=d.g;if(null!==e){e=e.Eb;if(d.Vc){if(!e.canCollapseTree(d))return}else if(!e.canExpandTree(d))return; -a.Tc=!0;d.Vc?e.collapseTree(d):e.expandTree(d)}}};return a}); -Dm("SubGraphExpanderButton",function(){var a=Rl("Button",{_subGraphExpandedFigure:"MinusLine",_subGraphCollapsedFigure:"PlusLine"},Rl(X,{name:"ButtonIcon",Fb:"MinusLine",xa:K.mp},(new bf("figure","isSubGraphExpanded",function(a,c){var d=c.S;return a?d._subGraphExpandedFigure:d._subGraphCollapsedFigure})).rw()));a.click=function(a,c){var d=c.T;d instanceof lf&&(d=d.Kh);if(d instanceof V){var e=d.g;if(null!==e){e=e.Eb;if(d.be){if(!e.canCollapseSubGraph(d))return}else if(!e.canExpandSubGraph(d))return;a.Tc= -!0;d.be?e.collapseSubGraph(d):e.expandSubGraph(d)}}};return a});Dm("ContextMenuButton",function(){var a=Rl("Button");a.stretch=fl;var b=a.je("ButtonBorder");b instanceof X&&(b.Fb="Rectangle",b.A=new L(0,0,2,3),b.B=new L(1,1,-2,-2));return a}); -Dm("PanelExpanderButton",function(a){var b=Em(a,"COLLAPSIBLE");a=Rl("Button",Rl(X,"TriangleUp",{xa:new ia(6,4)},(new bf("figure","visible",function(a){return a?"TriangleUp":"TriangleDown"})).rw(b)));var c=a.je("ButtonBorder");c instanceof X&&(c.stroke=null,c.fill="transparent");a.click=function(a,c){var f=c.g;if(null!==f){var h=c.T.je(b);null!==h&&(f.Wb("Collapse/Expand Panel"),h.visible=!h.visible,f.Wd("Collapse/Expand Panel"))}};return a}); -function hl(){this.Zh=this.ti=this.pp=this.sp=this.rp=this.qp=this.ji=this.Qq=this.Pq=this.ki=this.li=this.mi=this.Sq=this.Rq=this.Yh=this.ci=this.Wh=null}hl.prototype.copy=function(){var a=new hl;a.Wh=this.Wh;a.ci=this.ci;a.Yh=this.Yh;a.Rq=this.Rq;a.Sq=this.Sq;a.mi=this.mi;a.li=this.li;a.ki=this.ki;a.Pq=this.Pq;a.Qq=this.Qq;a.ji=this.ji;a.qp=this.qp;a.rp=this.rp;a.sp=this.sp;a.pp=this.pp;a.ti=this.ti;a.Zh=this.Zh;return a}; -function A(a){S.call(this);void 0===a?0===arguments.length?this.oa=vh:u.k("invalid argument to Panel constructor: undefined"):(u.rb(a,A,A,"type"),this.oa=a);this.ya=new E(S);this.Pe=K.np;this.Kg=!1;this.oa===bj&&(this.Kg=!0);this.gq=!1;this.Mp=uc;this.bi=dl;this.oa===Fl&&Fm(this);this.jo=sh;this.aq=(new ia(10,10)).freeze();this.bq=K.Wj;this.yl=this.qh=null;this.uq=NaN;this.Zf=this.gi=null;this.Hn="category";this.Yf=null;this.vi=new z(NaN,NaN,NaN,NaN);this.hm=null;this.xh=!1;this.xr=null}u.Ga(A,S); -u.Lh(A);u.fa("Panel",A);function Fm(a){a.Xi=K.np;a.th=1;a.ai=null;a.Dl=null;a.sh=1;a.rh=null;a.Cl=null;a.yd=[];a.rd=[];a.am=Gm;a.Al=Gm;a.ui=0;a.hi=0} -A.prototype.cloneProtected=function(a){S.prototype.cloneProtected.call(this,a);a.oa=this.oa;a.Pe=this.Pe.Z();a.Kg=this.Kg;a.gq=this.gq;a.Mp=this.Mp.Z();a.bi=this.bi;if(a.oa===Fl){a.Xi=this.Xi.Z();a.th=this.th;a.ai=this.ai;a.Dl=this.Dl;a.sh=this.sh;a.rh=this.rh;a.Cl=this.Cl;var b=[];if(0a&&u.wa(a,">= 0",A,"padding"),a=new rb(a)):(u.C(a,rb,A,"padding"),0>a.left&&u.wa(a.left,">= 0",A,"padding:value.left"),0>a.right&&u.wa(a.right,">= 0",A,"padding:value.right"),0>a.top&&u.wa(a.top,">= 0",A,"padding:value.top"),0>a.bottom&&u.wa(a.bottom,">= 0",A,"padding:value.bottom"));var b=this.Pe;b.L(a)||(this.Pe=a=a.Z(),this.R(),this.h("padding",b,a))}); -u.defineProperty(A,{Tk:"defaultAlignment"},function(){return this.Mp},function(a){var b=this.Mp;b.L(a)||(this.Mp=a=a.Z(),this.R(),this.h("defaultAlignment",b,a))});u.defineProperty(A,{Bd:"defaultStretch"},function(){return this.bi},function(a){var b=this.bi;b!==a&&(u.rb(a,S,A,"defaultStretch"),this.bi=a,this.R(),this.h("defaultStretch",b,a))}); -u.defineProperty(A,{rJ:"defaultSeparatorPadding"},function(){return void 0===this.Xi?K.np:this.Xi},function(a){if(void 0!==this.Xi){"number"===typeof a&&(a=new rb(a));var b=this.Xi;b.L(a)||(this.Xi=a=a.Z(),this.h("defaultSeparatorPadding",b,a))}}); -u.defineProperty(A,{pJ:"defaultRowSeparatorStroke"},function(){return void 0===this.ai?null:this.ai},function(a){var b=this.ai;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.ai=a,this.h("defaultRowSeparatorStroke",b,a))});u.defineProperty(A,{qJ:"defaultRowSeparatorStrokeWidth"},function(){return void 0===this.th?1:this.th},function(a){if(void 0!==this.th){var b=this.th;b!==a&&isFinite(a)&&0<=a&&(this.th=a,this.h("defaultRowSeparatorStrokeWidth",b,a))}}); -u.defineProperty(A,{oJ:"defaultRowSeparatorDashArray"},function(){return void 0===this.Dl?null:this.Dl},function(a){if(void 0!==this.Dl){var b=this.Dl;if(b!==a){null===a||Array.isArray(a)||u.Kd(a,"Array",A,"defaultRowSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e=c&&(c=1);var d=this.aw,e=d.width,d=d.height,f=this.Ha,h=f.width,f=f.height,k=Math.ceil(h/e),l=Math.ceil(f/d),m=this.CD;a.save();a.beginPath();a.rect(0,0,h,f);a.clip();for(var n=[],p=this.ya.n,q=p.length,r=0;re*s*c))break}a.stroke()}else if("LineH"===B.Fb){a.lineWidth= -B.hb;yl(this,a,B.stroke,!1,!1);a.beginPath();for(I=x=Math.floor(-m.y/d);I<=x+l&&!(H=I*d+m.y,0<=H&&H<=f&&Hm(I,s,t)&&(v&&!y?kl(a,0,H,h,H,C,B.cd):(a.moveTo(0,H),a.lineTo(h,H)),2>d*s*c));I++);a.stroke()}else if("BarV"===B.Fb)for(yl(this,a,B.fill,!0,!1),B=B.width,isNaN(B)&&(B=e),I=x=Math.floor(-m.x/e);I<=x+k&&!(H=I*e+m.x,0<=H&&He*s*c));I++);else if("BarH"===B.Fb)for(yl(this,a,B.fill,!0,!1),B=B.height,isNaN(B)&&(B=d),I=x=Math.floor(-m.y/d);I<=x+l&&!(H=I*d+m.y,0<=H&& -H<=f&&Hm(I,s,t)&&(a.fillRect(0,H,h,B),2>d*s*c));I++);v&&(void 0!==a.setLineDash?(a.setLineDash(u.mh),a.lineDashOffset=0):void 0!==a.webkitLineDash?(a.webkitLineDash=u.mh,a.webkitLineDashOffset=0):void 0!==a.mozDash&&(a.mozDash=null,a.mozDashOffset=0))}}a.restore();$i(b,a,!1)}else{this.oa===Fl&&(a.lineCap="butt",Im(this,a,!0,this.yd,!0),Im(this,a,!1,this.rd,!0),Jm(this,a,!0,this.yd),Jm(this,a,!1,this.rd),Im(this,a,!0,this.yd,!1),Im(this,a,!1,this.rd,!1));(c=this.LD)&&a.save();e=this.If();d=this.ya.n; -h=d.length;for(f=0;ff.height&&(m-=r-f.height):r>f.width&&(m-=r-f.width);l=l.position+m/2;b.lineWidth=m;r=a.padding;c?(l+=r.top,m=r.left,r=f.width-r.right,n&&!p?kl(b,m,l,r,l,q,0):(b.moveTo(m,l),b.lineTo(r,l))):(l+=r.left,m=r.top,r=f.height-r.bottom,n&&!p?kl(b,l,m,l,r,q,0):(b.moveTo(l,m),b.lineTo(l,r)));b.stroke();n&&(void 0!==b.setLineDash?(b.setLineDash(u.mh),b.lineDashOffset=0):void 0!==b.webkitLineDash?(b.webkitLineDash=u.mh,b.webkitLineDashOffset=0):void 0!==b.mozDash&&(b.mozDash=null,b.mozDashOffset=0))}}}} -function Im(a,b,c,d,e){for(var f=d.length,h=a.ba,k=0;km)){var n=l.lg(),p=l.ep;isNaN(p)&&(p=c?a.th:a.sh);var q=l.dp;null===q&&(q=c?a.ai:a.rh);null===q&&(p=0);n-=p;p=l.position+p;n+=l.Qa;p+n>m&&(n=m-p);0>=n||(m=a.padding,yl(a,b,l.background,!0,!1),c?b.fillRect(m.left,p+m.top,h.width-(m.left+m.right),n):b.fillRect(p+m.left,m.top,n,h.height-(m.top+m.bottom)))}}}} -function Hm(a,b,c){if(0!==a%b)return!1;b=c.length;for(var d=0;dkd&&(Ac=kd),ba.Qa+=Ac,kd=Math.max(kd-Ac,0));1!==ha.Wi||Wd!==qh&&Wd!==el||(ba=this.ed(Sc),Ac=Math.max(Ye-ba.Qa,0),Ac>zc&&(Ac=zc),ba.Qa+=Ac,zc=Math.max(zc-Ac,0));rg&&ha.Fo()}}}u.ra(Rg);for(var qc=0,Xd=0,Fa=this.ps,ca=0;ca=this.kt);Pb++)ba=this.fd(ha.rc+Pb),Ee.height+=Math.max(ba.Ki,isNaN(ba.Qe)?ba.Kf:Math.min(ba.Qe,ba.Kf));for(Pb=1;Pb=this.ps);Pb++)ba=this.ed(ha.column+Pb),Ee.width+=Math.max(ba.Ki,isNaN(ba.Qe)?ba.Kf:Math.min(ba.Qe,ba.Kf));pb.width+=Ee.width;pb.height+=Ee.height;Ob=ha.margin;Rf=Ob.right+Ob.left;Sf=Ob.top+Ob.bottom;Ph(ha,pb.width,pb.height,pm,zi);for(var De=ha.Ba,Ye=Math.max(De.width+ -Rf,0),Cd=Math.max(De.height+Sf,0),Bh=0,Pb=0;Pb=this.kt);Pb++)ba=this.fd(ha.rc+Pb),Bh+=ba.total||0;if(BhEd&&(ba.Qa=Math.min(ba.Kf,Ed+Dd),ba.yb!==Ed&&(Dd-=ba.yb-Ed));if(-1===ba.index-1)break;ba=this.fd(ba.index-1)}for(var Tf=0,Pb=0;Pb=this.ps);Pb++)ba=this.ed(ha.column+Pb),Tf+=ba.total||0;if(TfEd&&(ba.Qa=Math.min(ba.Kf,Ed+Dd),ba.yb!== -Ed&&(Dd-=ba.yb-Ed));if(-1===ba.index-1)break;ba=this.ed(ba.index-1)}}u.ra(Tc);u.Oj(Ee);u.Oj(pb);for(var Uf=0,Ze=0,Wd=pl(this,!0),Fd=this.xa,Vf=this.af,ne=Xd=qc=0,ld=0,Fa=this.ps,ca=0;caDh)Ph(Qb,Infinity,Infinity),Yd=Qb.Ba,Ge.Sh(Yd),this.Vi.add(Yd);else{var Yf=Qb.Pf,Pp=Qb.Bw,sm=Qb.Hj;sm.ne()&&(sm=Ib);var Gi=Qb.Cw,Sr=Qb.BE,Hi=0,Ii=0,ek=0;if(Yf<-Dh||Yf>=Dh){var Qp=ug.XD,Ji=ug.WD;Gi!==dh&&(ek=ug.computeAngle(Qb,Gi,Ji),Qb.angle=ek);Hi=Qp.x- -$e.x;Ii=Qp.y-$e.y}else{var tf,Fh;if(0<=Yf)tf=Ei.ja(Yf),Fh=Yfc||p>d)this.R(),Ph(this,n>c?c:n,p>d?d:p);break;case cd:this.R(!0);Ph(this,c+r,d+s,0,0);break;case fl:this.R(!0);Ph(this,c+r,p+s,0,0);break;case el:this.R(!0),Ph(this,n+r,d+s,0,0)}}k=this.ba;k.x=a;k.y= -b;k.width=c;k.height=d;var t=this.oa.Ub;switch(t){case "Position":for(var v=f.length,x=e.x-this.padding.left,B=e.y-this.padding.top,y=0;y=this.kt);ca++){var ha=this.fd(ob+ca);id.height+=ha.total}for(ca=1;ca=this.ps);ca++){var pg=this.ed(Td+ca);id.width+=pg.total}var Qg=Ud.yb+id.width,yh=Rc.yb+id.height;h.x=Qc;h.y=Hc;h.width=Qg;h.height=yh;var Sc=Qc,zh=Hc,Sb=Qg,Rg=yh;Qc+Qg>e.width&&(Sb=Math.max(e.width-Qc,0));Hc+yh>e.height&&(Rg=Math.max(e.height-Hc,0));var Tc=Fa.alignment,je=0,Ic=0,jd=0,zc=0;if(Tc.Lc()){Tc= -this.Tk;Tc.pd()||(Tc=Ib);var je=Tc.x,Ic=Tc.y,jd=Tc.offsetX,zc=Tc.offsetY,kd=Ud.alignment,Pf=Rc.alignment;kd.pd()&&(je=kd.x,jd=kd.offsetX);Pf.pd()&&(Ic=Pf.y,zc=Pf.offsetY)}else je=Tc.x,Ic=Tc.y,jd=Tc.offsetX,zc=Tc.offsetY;if(isNaN(je)||isNaN(Ic))Ic=je=.5,zc=jd=0;var ba=Be.width,ke=Be.height,Ce=Fa.margin,Tj=Ce.left+Ce.right,Uj=Ce.top+Ce.bottom,Ac=Gl(Fa,Rc,Ud,!1);!isNaN(Fa.xa.width)||Ac!==cd&&Ac!==fl||(ba=Math.max(Qg-Tj,0));!isNaN(Fa.xa.height)||Ac!==cd&&Ac!==el||(ke=Math.max(yh-Uj,0));var fb=Fa.af,gb= -Fa.vg,ba=Math.min(fb.width,ba),ke=Math.min(fb.height,ke),ba=Math.max(gb.width,ba),ke=Math.max(gb.height,ke),Vj=ke+Uj;h.x+=h.width*je-(ba+Tj)*je+jd+Ce.left;h.y+=h.height*Ic-Vj*Ic+zc+Ce.top;Fa.visible&&(qb(Sc,zh,Sb,Rg,h.x,h.y,Be.width,Be.height)?Fa.zc(h.x,h.y,ba,ke):Fa.zc(h.x,h.y,ba,ke,new z(Sc,zh,Sb,Rg)))}else{Fa.Jg();Fa.Xb.La();var Qf=Fa.Xb;Qf.x=Vd.type===tl?Pg:Qc;Qf.y=Vd.type===ul?Of:Hc;Qf.width=Be.width;Qf.height=Be.height;Fa.Xb.freeze();rl(Fa,!1)}}u.Oj(id);for(ob=0;ob=pb){var Uf=this.XD,Ze=this.WD;Pb!==dh&&(Tf=this.computeAngle(Bc,Pb,Ze),Bc.angle=Tf);Dd=Uf.x;Ed=Uf.y}else{var Fd=void 0,Vf=void 0;if(0<=Jc)Fd=me.n[Jc],Vf=Jcp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof A?m:null;p=u.jh();p.set(h);if(null!==m?m.Nj(a,b,c,d,e,p):ol(n,a,d,p))null!== -b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);u.Ye(p)}}}void 0===f&&u.Ye(h);return d}void 0===f&&u.Ye(h);return!1};function Um(a,b,c,d){for(var e=a.ya.n,f=e.length;f--;){var h=e[f];if(h.visible){var k=h.ba,l=a.Ha;k.x>l.width||k.y>l.height||0>k.x+k.width||0>k.y+k.height||(h instanceof A&&Um(h,b,c,d),null!==b&&(h=b(h)),null===h||null!==c&&!c(h)||d.add(h))}}} -g.ym=function(a,b,c,d,e,f){if(!1===this.Ag)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var h=this.Ha,k=this.Tf(),l=k?a:Wa(u.fc(a.x,a.y),this.transform),m=k?b:Wa(u.fc(b.x,b.y),this.transform),n=l.Lj(m),p=0s.width||r.y>s.height||0>r.x+r.width||0>r.y+r.height||(q.Tf()?(r=q.transform,Wa(k.set(a),r),Wa(l.set(b),r)):(k.set(a),l.set(b)),r=q,q=q instanceof A?q:null,null!==q?!q.ym(k,l,c,d,e,f):!r.sD(k,l,e))||(null!==c&&(r=c(r)),null===r||null!==d&&!d(r)||f.add(r))}}u.v(k);u.v(l)}return e? -p:h}return!1};function Km(a){var b=a.A;if(void 0===b||b===uc)b=null;null===b&&a instanceof X&&(a=a.Pa,null!==a&&(b=a.A));null===b&&(b=xb);return b}function Lm(a){var b=a.B;if(void 0===b||b===uc)b=null;null===b&&a instanceof X&&(a=a.Pa,null!==a&&(b=a.B));null===b&&(b=Vb);return b}A.prototype.add=A.prototype.add=function(a){u.C(a,S,A,"add:element");this.Yd(this.ya.count,a)};A.prototype.elt=A.prototype.ja=function(a){return this.ya.ja(a)}; -A.prototype.insertAt=A.prototype.Yd=function(a,b){b instanceof G&&u.k("Cannot add a Part to a Panel: "+b);if(this===b||this.gl(b))this===b&&u.k("Cannot make a Panel contain itself: "+this.toString()),u.k("Cannot make a Panel indirectly contain itself: "+this.toString()+" already contains "+b.toString());var c=b.S;null!==c&&c!==this&&u.k("Cannot add a GraphObject that already belongs to another Panel to this Panel: "+b.toString()+", already contained by "+c.toString()+", cannot be shared by this Panel: "+ -this.toString());this.oa!==bj||b instanceof X||u.k("Can only add Shapes to a Grid Panel, not: "+b);b.ql(this);b.Wl=null;if(null!==this.QD){var d=b.data;null!==d&&"object"===typeof d&&(null===this.Yf&&(this.Yf=new la(Object,A)),this.Yf.add(d,b))}var e=this.ya,d=-1;if(c===this){for(var f=-1,h=this.ya.n,k=h.length,l=0;l=e.count&&a>=e.count)return;e.hd(f);d=f}else u.k("element "+b.toString()+" has panel "+c.toString()+" but is not contained by it.")}if(0> -a||a>e.count)a=e.count;e.Yd(a,b);this.R();b.R();null!==b.Jd?this.xh=!0:b instanceof A&&!0===b.xh&&(this.xh=!0);c=this.T;null!==c&&(c.Bk=null,c.kj=NaN,this.xh&&c instanceof U&&(c.xh=!0),c.xh&&(c.Qd=null),e=this.g,null!==e&&e.ha.gb||(-1!==d&&c.Dc(ce,"elements",this,b,null,d,null),c.Dc(be,"elements",this,null,b,null,a)))};A.prototype.remove=A.prototype.remove=function(a){u.C(a,S,A,"remove:element");for(var b=this.ya.n,c=b.length,d=-1,e=0;ea&&u.wa(a,">= 0",A,"getRowDefinition:idx");a=Math.round(a);var b=this.yd;if(void 0===b[a]){var c=new Se;c.ql(this);c.ae=!0;c.index=a;b[a]=c}return b[a]};A.prototype.removeRowDefinition=A.prototype.oE=function(a){0>a&&u.wa(a,">= 0",A,"removeRowDefinition:idx");a=Math.round(a);var b=this.yd;this.Dc(ce,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.R()};u.u(A,{ps:"columnCount"},function(){return void 0===this.rd?0:this.rd.length}); -A.prototype.getColumnDefinition=A.prototype.ed=function(a){0>a&&u.wa(a,">= 0",A,"getColumnDefinition:idx");a=Math.round(a);var b=this.rd;if(void 0===b[a]){var c=new Se;c.ql(this);c.ae=!1;c.index=a;b[a]=c}return b[a]};A.prototype.removeColumnDefinition=A.prototype.kE=function(a){0>a&&u.wa(a,">= 0",A,"removeColumnDefinition:idx");a=Math.round(a);var b=this.rd;this.Dc(ce,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.R()}; -u.defineProperty(A,{bI:"rowSizing"},function(){return void 0===this.am?Gm:this.am},function(a){if(void 0!==this.am){var b=this.am;b!==a&&(a!==Gm&&a!==Nm&&u.k("rowSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"),this.am=a,this.R(),this.h("rowSizing",b,a))}}); -u.defineProperty(A,{ZF:"columnSizing"},function(){return void 0===this.Al?Gm:this.Al},function(a){if(void 0!==this.Al){var b=this.Al;b!==a&&(a!==Gm&&a!==Nm&&u.k("columnSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"),this.Al=a,this.R(),this.h("columnSizing",b,a))}}); -u.defineProperty(A,{CK:"topIndex"},function(){return void 0===this.ui?0:this.ui},function(a){if(void 0!==this.ui){var b=this.ui;b!==a&&((!isFinite(a)||0>a)&&u.k("topIndex must be greater than zero and a real number. Was "+a),this.ui=a,this.R(),this.h("topIndex",b,a))}}); -u.defineProperty(A,{OJ:"leftIndex"},function(){return void 0===this.hi?0:this.hi},function(a){if(void 0!==this.hi){var b=this.hi;b!==a&&((!isFinite(a)||0>a)&&u.k("leftIndex must be greater than zero and a real number. Was "+a),this.hi=a,this.R(),this.h("leftIndex",b,a))}});A.prototype.findRowForLocalY=function(a){if(0>a)return-1;if(this.type!==Fl)return NaN;for(var b=0,c=this.yd,d=c.length,e=this.ui;ea)return-1;if(this.type!==Fl)return NaN;for(var b=0,c=this.rd,d=c.length,e=this.hi;ea;)this.Fe(a);a=this.QD;if(null!==a)for(var b=u.qb(a),c=0;cc)){var d=a.getCategoryForItemData(b,c),d=a.findTemplateForItemData(b,c,d);if(null!==d){nf(d);d=d.copy();"object"===typeof b&&(null===a.Yf&&(a.Yf=new la(Object,A)),a.Yf.add(b,d));var e=c;sk(a)&&e++;a.Yd(e,d);tk(a,e,c);d.data=b}}} -function tk(a,b,c){for(a=a.ya;ba&&u.wa(a,">= 0",Se,"height"),this.Qe=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("height",b,a))});u.defineProperty(Se,{width:"width"},function(){return this.Qe},function(a){var b=this.Qe;b!==a&&(0>a&&u.wa(a,">= 0",Se,"width"),this.Qe=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("width",b,a))}); -u.defineProperty(Se,{Ki:"minimum"},function(){return this.oj},function(a){var b=this.oj;b!==a&&((0>a||!isFinite(a))&&u.wa(a,">= 0",Se,"minimum"),this.oj=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("minimum",b,a))});u.defineProperty(Se,{Kf:"maximum"},function(){return this.mj},function(a){var b=this.mj;b!==a&&(0>a&&u.wa(a,">= 0",Se,"maximum"),this.mj=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("maximum",b,a))}); -u.defineProperty(Se,{alignment:"alignment"},function(){return this.se},function(a){var b=this.se;b.L(a)||(this.se=a.Z(),null!==this.S&&this.S.R(),this.Rc("alignment",b,a))});u.defineProperty(Se,{stretch:"stretch"},function(){return this.Hh},function(a){var b=this.Hh;b!==a&&(this.Hh=a,null!==this.S&&this.S.R(),this.Rc("stretch",b,a))}); -u.defineProperty(Se,{DE:"separatorPadding"},function(){return this.wj},function(a){"number"===typeof a&&(a=new rb(a));var b=this.wj;null!==a&&null!==b&&b.L(a)||(null!==a&&(a=a.Z()),this.wj=a,null!==this.S&&this.S.R(),this.Rc("separatorPadding",b,a))});u.defineProperty(Se,{dp:"separatorStroke"},function(){return this.Gr},function(a){var b=this.Gr;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.Gr=a,null!==this.S&&this.S.R(),this.Rc("separatorStroke",b,a))}); -u.defineProperty(Se,{ep:"separatorStrokeWidth"},function(){return this.Hr},function(a){var b=this.Hr;b!==a&&(this.Hr=a,null!==this.S&&this.S.R(),this.Rc("separatorStrokeWidth",b,a))}); -u.defineProperty(Se,{gI:"separatorDashArray"},function(){return this.Dh},function(a){var b=this.Dh;if(b!==a){null===a||Array.isArray(a)||u.Kd(a,"Array",Se,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;ee)){for(var k=c[0],l=c[1],p=0,q=0,r=0,s=m=0,t=q=0,v=u.eb(),x=2;xt){u.ra(v);return}e>m?(B= -e-m,e=m):B=0;var y=Math.sqrt(e*e/(1+r*r));0>p&&(y=-y);k+=y;l+=r*y;a.translate(k,l);a.rotate(s);a.translate(-(h/2),-(f/2));0===B&&d.Mj(a,b);a.translate(h/2,f/2);a.rotate(-s);a.translate(-k,-l);t-=e;m-=e;if(0!==B){q++;if(q===v.length){u.ra(v);return}m=v[q];p=m[0];s=m[1];r=m[2];m=m[3];e=B}}u.ra(v)}} -X.prototype.Mj=function(a,b){if(null!==this.yc||null!==this.jd){null!==this.jd&&yl(this,a,this.jd,!0,!1);null!==this.yc&&yl(this,a,this.yc,!1,!1);var c=this.Sg;if(0===c){var d=this.T;d instanceof lf&&d.type===ah&&d.vc instanceof X&&(c=d.vc.hb)}a.lineWidth=c;a.lineJoin=this.eo;a.lineCap=this.co;a.miterLimit=this.gm;var e=!1;this.T&&b.Qg.drawShadows&&(e=this.T.il);var f=!0;null!==this.yc&&null===this.jd&&(f=!1);var d=!1,h=!0,k=this.gA;null!==k&&(d=!0,void 0!==a.setLineDash?(a.setLineDash(k),a.lineDashOffset= -this.cd):void 0!==a.webkitLineDash?(a.webkitLineDash=k,a.webkitLineDashOffset=this.cd):void 0!==a.mozDash?(a.mozDash=k,a.mozDashOffset=this.cd):h=!1);var l=this.Pa;if(null!==l){if(l.oa===dd)a.beginPath(),d&&!h?kl(a,l.nc,l.uc,l.pb,l.Bb,k,this.cd):(a.moveTo(l.nc,l.uc),a.lineTo(l.pb,l.Bb)),null!==this.jd&&zl(a,this.jd),0!==c&&null!==this.yc&&Bl(a);else if(l.oa===md){var m=l.nc,n=l.uc,p=l.pb,q=l.Bb,l=Math.min(m,p),r=Math.min(n,q),m=Math.abs(p-m),n=Math.abs(q-n);null!==this.jd&&(a.beginPath(),a.rect(l, -r,m,n),zl(a,this.jd));if(null!==this.yc){var s=p=0,t=0;f&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0);d&&!h?(h=u.eb(),h.push(l),h.push(r),h.push(l+m),h.push(r),h.push(l+m),h.push(r+n),h.push(l),h.push(r+n),h.push(l),h.push(r),a.beginPath(),$m(a,h,k,this.cd),Bl(a),u.ra(h)):0!==c&&(a.beginPath(),a.rect(l,r,m,n),Bl(a));f&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t)}}else if(l.oa===nd)m=l.nc,n=l.uc,p=l.pb,q=l.Bb,l=Math.abs(p-m)/ -2,r=Math.abs(q-n)/2,m=Math.min(m,p)+l,n=Math.min(n,q)+r,a.beginPath(),a.moveTo(m,n-r),a.bezierCurveTo(m+K.sa*l,n-r,m+l,n-K.sa*r,m+l,n),a.bezierCurveTo(m+l,n+K.sa*r,m+K.sa*l,n+r,m,n+r),a.bezierCurveTo(m-K.sa*l,n+r,m-l,n+K.sa*r,m-l,n),a.bezierCurveTo(m-l,n-K.sa*r,m-K.sa*l,n-r,m,n-r),a.closePath(),null!==this.jd&&zl(a,this.jd),d&&!h&&(h=u.eb(),K.ye(m,n-r,m+K.sa*l,n-r,m+l,n-K.sa*r,m+l,n,.5,h),K.ye(m+l,n,m+l,n+K.sa*r,m+K.sa*l,n+r,m,n+r,.5,h),K.ye(m,n+r,m-K.sa*l,n+r,m-l,n+K.sa*r,m-l,n,.5,h),K.ye(m-l,n, -m-l,n-K.sa*r,m-K.sa*l,n-r,m,n-r,.5,h),a.beginPath(),$m(a,h,k,this.cd),u.ra(h)),0!==c&&null!==this.yc&&(t=s=p=0,f&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),Bl(a),f&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t));else if(l.oa===ad){r=l.Zi;n=r.length;for(q=0;qx.Qf);else for(var v=Hd(x,m),B=v.length,y=0;ye))if(h=b[0],k=b[1],4===e)kl(a,h,k,b[2],b[3],c,d);else{a.moveTo(h,k);for(var n=0,p=0,q=0,r=p=l=0,s=u.eb(),t=2;tr&&(e=r);e>l?(v=e-l,e=l):v=0;var x=Math.sqrt(e*e/ -(1+q*q));0>n&&(x=-x);h+=x;k+=q*x;m?a.lineTo(h,k):a.moveTo(h,k);r-=e;l-=e;if(0!==v){p++;if(p===s.length){u.ra(s);return}l=s[p];n=l[0];q=l[1];l=l[2];e=v}else m=!m}u.ra(s)}}X.prototype.getDocumentPoint=X.prototype.lb=function(a,b){void 0===b&&(b=new w);a.ne()&&u.k("getDocumentPoint:s Spot must be real: "+a.toString());var c=this.Ha,d=this.hb;b.m(a.x*(c.width+d)-d/2+c.x+a.offsetX,a.y*(c.height+d)-d/2+c.y+a.offsetY);this.Ff.ab(b);return b}; -X.prototype.Jj=function(a,b){var c=this.Pa;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.kb,e=this.hb/2;c.type!==dd||b||(e+=2);var f=u.Sf();f.assign(d);f.Jf(e+2,e+2);if(!f.Aa(a))return u.ic(f),!1;d=e+1E-4;if(c.type===dd){if(null===this.stroke)return!1;d=(c.F-c.ua)*(a.x-c.ua)+(c.G-c.va)*(a.y-c.va);if(0>(c.ua-c.F)*(a.x-c.F)+(c.va-c.G)*(a.y-c.G)||0>d)return!1;u.ic(f);return K.Hd(c.ua,c.va,c.F,c.G,e,a.x,a.y)}if(c.type===md){var h=c.ua,k=c.va,l=c.F,m=c.G,c=Math.min(h,l),n=Math.min(k, -m),h=Math.abs(l-h),k=Math.abs(m-k);f.x=c;f.y=n;f.width=h;f.height=k;if(null===this.fill){f.Jf(-d,-d);if(f.Aa(a))return u.ic(f),!1;f.Jf(d,d)}null!==this.stroke&&f.Jf(e,e);e=f.Aa(a);u.ic(f);return e}if(c.type===nd){h=c.ua;k=c.va;l=c.F;m=c.G;c=Math.min(h,l);n=Math.min(k,m);h=Math.abs(l-h);k=Math.abs(m-k);h/=2;k/=2;c=a.x-(c+h);n=a.y-(n+k);if(null===this.fill){h-=d;k-=d;if(0>=h||0>=k||1>=c*c/(h*h)+n*n/(k*k))return u.ic(f),!1;h+=d;k+=d}null!==this.stroke&&(h+=e,k+=e);u.ic(f);return 0>=h||0>=k?!1:1>=c*c/ -(h*h)+n*n/(k*k)}if(c.type===ad)return u.ic(f),null===this.fill?Ld(c,a.x,a.y,e):c.Aa(a,e,1=this.hb)n=K.$g(p.nc,p.uc,p.pb,p.Bb,f,h,k,l,e);else{var r=0,s=0;p.nc===p.pb?(r=m,s=0):(b=(p.Bb-p.uc)/(p.pb-p.nc),s=m/Math.sqrt(1+b*b),r=s*b);d=u.eb();b=new w;K.$g(p.nc+ -r,p.uc+s,p.pb+r,p.Bb+s,f,h,k,l,b)&&d.push(b);b=new w;K.$g(p.nc-r,p.uc-s,p.pb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=new w;K.$g(p.nc+r,p.uc+s,p.nc-r,p.uc-s,f,h,k,l,b)&&d.push(b);b=new w;K.$g(p.pb+r,p.Bb+s,p.pb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=d.length;if(0===b)return u.ra(d),!1;n=!0;s=Infinity;for(r=0;rMath.abs(c)){n=h-b-c*(f-d);if(0>a*a*c*c+v*v-n*n){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(a*a*c*c+v*v-n*n);k=(-(a*a*c*n)+a*v*m)/(v*v+a*a*c*c)+d;a=(-(a*a*c*n)-a*v*m)/(v*v+a*a*c*c)+d;l=c*(k-d)+n+b;b=c*(a-d)+n+b;d=Math.abs((f-k)*(f-k))+Math.abs((h-l)*(h-l));h=Math.abs((f-a)*(f-a))+Math.abs((h-b)* -(h-b));dk){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(k);l=b+m;b-=m;d=Math.abs(l-h);h=Math.abs(b-h);dc?a-c:c-a)<(b>d?b-d:d-b)?(e=be||K.mb(l.y,e))&&(l.ye||K.mb(l.x,e))&&(l.x=h&&d<=a}a=h&&f<=a} -X.prototype.sD=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.Jj(a,!0))return!0;var e=a.Lj(b);b=e;1.5=e||Ya(b,f,0,-p)>=e||Ya(b,f,0,p)>=e||Ya(b,f,n,0)>=e?!1:!0}else if(f.type=== -ad){h=f.kb;k=h.x;l=h.y;m=h.x+h.width;h=h.y+h.height;if(a.x>m&&a.xh&&a.ye&&Xa(a.x,a.y,k,l,m,l)>e&&Xa(a.x,a.y,m,h,k,h)>e&&Xa(a.x,a.y,m,h,m,l)>e)return!1;b=Math.sqrt(e);if(c){if(null===this.fill?Ld(f,a.x,a.y,b):f.Aa(a,b,!0))return!0}else{c=f.ub;for(b=0;be)return!1;l=k.Fa.n;m=l.length;for(h=0;he)return!1;break;case zd:f=u.eb();K.ye(n,p,q.Rb,q.jc, -q.df,q.ef,q.F,q.G,.8,f);n=d(f,a);u.ra(f);if(n)return!1;n=q.F;p=q.G;if(a.ss(n,p)>e)return!1;break;case Ad:f=u.eb();K.Xo(n,p,q.Rb,q.jc,q.F,q.G,.8,f);n=d(f,a);u.ra(f);if(n)return!1;n=q.F;p=q.G;if(a.ss(n,p)>e)return!1;break;case Bd:case Gd:var q=q.type===Bd?Hd(q,k):Id(q,k,n,p),r=q.length,s=null,f=u.eb();for(b=0;b= 0",X,"strokeWidth:value")});u.defineProperty(X,{qI:"strokeCap"},function(){return this.co},function(a){var b=this.co;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?u.wa(a,'"butt", "round", or "square"',X,"strokeCap"):(this.co=a,this.ma(),this.h("strokeCap",b,a)))}); -u.defineProperty(X,{wK:"strokeJoin"},function(){return this.eo},function(a){var b=this.eo;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?u.wa(a,'"miter", "bevel", or "round"',X,"strokeJoin"):(this.eo=a,this.ma(),this.h("strokeJoin",b,a)))});u.defineProperty(X,{xK:"strokeMiterLimit"},function(){return this.gm},function(a){var b=this.gm;if(b!==a)if(0 0",X,"strokeWidth:value")}); -u.defineProperty(X,{gA:"strokeDashArray"},function(){return this.fm},function(a){var b=this.fm;if(b!==a){null===a||Array.isArray(a)||u.Kd(a,"Array",X,"strokeDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;em*k*k&&(h=!0);b.Gg!==a&&(h=!1);!1===b.$v("textGreeking")&&(h=!1);for(var m=this.yj,k=this.zj,l=this.ve,n=0;nc&&(p=c);var f=f+m,r=q,q=a,s=f,t=c, -v=d,x=0;h?("start"===this.Rd||"left"===this.Rd?x=0:"end"===this.Rd||"right"===this.Rd?x=t-p:"center"===this.Rd?x=(t-p)/2:u.k("textAlign must be start, end, left, right, or center"),q.fillRect(0+x,s+.25*v,p,1)):("start"===this.Rd||"left"===this.Rd?x=0:"end"===this.Rd||"right"===this.Rd?x=t:"center"===this.Rd?x=t/2:u.k("textAlign must be start, end, left, right, or center"),q.fillText(r,0+x,s+v-.25*v),r=v/20|0,0===r&&(r=1),"end"===this.Rd||"right"===this.Rd?x-=p:"center"===this.Rd&&(x-=p/2),this.Ll&& -(q.beginPath(),q.lineWidth=r,q.moveTo(0+x,s+v-.2*v),q.lineTo(0+x+p,s+v-.2*v),q.stroke()),this.Kl&&(q.beginPath(),q.lineWidth=r,s=s+v-v/2.2|0,0!==r%2&&(s+=.5),q.moveTo(0+x,s),q.lineTo(0+x+p,s),q.stroke()));f+=d+k}}}; -qa.prototype.Oo=function(a,b,c,d){var e=this.ej;e.reset();var f=0,h=0;if(isNaN(this.xa.width)){f=this.ie.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===f.length)f=0;else if(this.iw){for(var k=h=0,l=!1;!l;){var m=f.indexOf("\n",k);-1===m&&(m=f.length,l=!0);k=wn(f.substr(k,m-k).replace(/^\s+|\s+$/g,""),this.Hg);k>h&&(h=k);k=m+1}f=h}else h=f.indexOf("\n",0),0<=h&&(f=f.substr(0,h)),f=k=wn(f,this.Hg);f=Math.min(f,a/this.scale);f=Math.max(8,f)}else f=this.xa.width;null!==this.S&&(f=Math.min(f,this.S.af.width), -f=Math.max(f,this.S.vg.width));h=un(this,f,e);m=h=isNaN(this.xa.height)?Math.min(h,b/this.scale):this.xa.height;if(0!==e.Oe&&1!==e.te.length&&this.Ek===sn&&(b=this.Hg,l=this.Ek===sn?xn(b):0,k=this.yj+this.zj,k=Math.max(0,vn(this)+k),m=Math.max(Math.floor(m/k)-1,0),!(m+1>=e.te.length))){k=e.te[m];for(a=Math.max(1,a-l);wn(k,b)>a&&1=a.ii)return new ia(0,l);if(a.jm===qn){c.wi=1;f=wn(b,k);if(0===h||f<=d)return c.Oe=f,c.gf.push(c.Oe),c.te.push(b),new ia(f,l);var m=yn(b);b=b.substr(m.length);for(var n=yn(b),f=wn(m+n,k);0d&&1d;){n=1;f=wn(m.substr(0,n),k);for(h=0;f<=d;)n++,h=f,f=wn(m.substr(0,n),k);1===n?(c.gf[a.ve+p]=f,e=Math.max(e,f)):(c.gf[a.ve+p]=h,e=Math.max(e,h));n--;1>n&&(n=1);c.te[a.ve+p]=m.substr(0,n);p++;m=m.substr(n);if(a.ve+p>a.ii)break}n=yn(b);for(f=wn(m+n,k);0a.ii))break}c.wi=Math.min(a.ii,p);c.Oe=Math.max(c.Oe,e);return new ia(c.Oe,l*c.wi)}function yn(a){for(var b=a.length,c=0;c=b?a:a.substr(0,c)}function wn(a,b){on!==b&&(on=pn.font=b);return pn.measureText(a).width} -function vn(a){if(null!==a.vn)return a.vn;var b=a.Hg;on!==b&&(on=pn.font=b);var c=0;void 0!==jn[b]&&5E3>kn?c=jn[b]:(c=1.3*pn.measureText("M").width,jn[b]=c,kn++);return a.vn=c}function xn(a){on!==a&&(on=pn.font=a);var b=0;void 0!==ln[a]&&5E3>mn?b=ln[a]:(b=pn.measureText(nn).width,ln[a]=b,mn++);return b} -function un(a,b,c){var d=a.ie.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),e=a.yj+a.zj,e=Math.max(0,vn(a)+e);if(0===d.length)return c.Oe=0,a.ve=1,e;if(!a.iw){var f=d.indexOf("\n",0);0<=f&&(d=d.substr(0,f))}for(var f=0,h=a.ve=0,k=-1,l=!1;!l;)k=d.indexOf("\n",h),-1===k&&(k=d.length,l=!0),h<=k&&(h=d.substr(h,k-h),a.jm!==qn?(c.wi=0,h=tn(a,h,c,b),f+=h.height,a.ve+=c.wi):(tn(a,h,c,b),f+=e,a.ve++),a.ve===a.ii&&(l=!0)),h=k+1;return a.Gu=f} -u.defineProperty(qa,{jA:"textValidation"},function(){return this.Hk},function(a){var b=this.Hk;b!==a&&(null!==a&&u.j(a,"function",qa,"textValidation"),this.Hk=a,this.h("textValidation",b,a))});u.defineProperty(qa,{tK:"spacingAbove"},function(){return this.yj},function(a){var b=this.yj;b!==a&&(this.yj=a,this.h("spacingAbove",b,a))});u.defineProperty(qa,{uK:"spacingBelow"},function(){return this.zj},function(a){var b=this.zj;b!==a&&(this.zj=a,this.h("spacingBelow",b,a))}); -u.defineProperty(qa,{WJ:"maxLines"},function(){return this.ii},function(a){var b=this.ii;b!==a&&(a=Math.floor(a),0>=a&&u.wa(a,"> 0",qa,"maxLines"),this.ii=a,this.h("maxLines",b,a),this.R())});u.u(qa,{XJ:"metrics"},function(){return this.ej});function hn(){this.Oe=this.wi=0;this.gf=[];this.te=[]}hn.prototype.reset=function(){this.Oe=this.wi=0;this.gf=[];this.te=[]};hn.prototype.qs=function(a){this.wi=a.wi;this.Oe=a.Oe;this.gf=u.Pk(a.gf);this.te=u.Pk(a.te)};u.u(hn,{aJ:"arrSize"},function(){return this.gf}); -u.u(hn,{bJ:"arrText"},function(){return this.te});u.u(hn,{VJ:"maxLineWidth"},function(){return this.Oe});function Ri(){S.call(this);this.Me=null;this.Lr="";this.xj=(new z(NaN,NaN,NaN,NaN)).freeze();this.zn=cd;this.Qr=this.Aj=this.kf=null;this.Sx=!1;this.Zn=null;this.JB=0}u.Ga(Ri,S);u.fa("Picture",Ri);var zn=new pa,An=0,Mi=[]; -function Bn(){var a=Mi;if(0===a.length)for(var b=window.document.getElementsByTagName("canvas"),c=b.length,d=0;dr.mo.length&&(Gn(r,4,l,m),Gn(r,16, -l,m));for(var l=r.mo,m=l.length,q=l[0],t=0;te;e++)a.lineTo(d[e].x*b,d[e].y*c); -u.ra(d);P(a);b=a.o;b.A=new L(.2,.22);b.B=new L(.8,.9);u.q(a);return b},DataTransmission:"Hexagon",Hexagon:function(a,b,c){var d=K.Qk(6);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;6>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.07,.25);b.B=new L(.93,.75);u.q(a);return b},Heptagon:function(a,b,c){var d=K.Qk(7);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;7>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.2,.15);b.B=new L(.8,.85);u.q(a);return b},Octagon:function(a, -b,c){var d=K.Qk(8);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;8>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.15,.15);b.B=new L(.85,.85);u.q(a);return b},Nonagon:function(a,b,c){var d=K.Qk(9);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;9>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.17,.13);b.B=new L(.82,.82);u.q(a);return b},Decagon:function(a,b,c){var d=K.Qk(10);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a); -b=a.o;b.A=new L(.16,.16);b.B=new L(.84,.84);u.q(a);return b},Dodecagon:function(a,b,c){var d=K.Qk(12);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.16,.16);b.B=new L(.84,.84);u.q(a);return b},FivePointedStar:function(a,b,c){var d=K.wm(5);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.312,.383);b.B=new L(.693,.765);u.q(a);return b},SixPointedStar:function(a,b,c){var d= -K.wm(6);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.17,.251);b.B=new L(.833,.755);u.q(a);return b},SevenPointedStar:function(a,b,c){var d=K.wm(7);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;14>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.363,.361);b.B=new L(.641,.709);u.q(a);return b},EightPointedStar:function(a,b,c){var d=K.wm(8);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;16>e;e++)a.lineTo(d[e].x*b,d[e].y* -c);u.ra(d);P(a);b=a.o;b.A=new L(.252,.255);b.B=new L(.75,.75);u.q(a);return b},NinePointedStar:function(a,b,c){var d=K.wm(9);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;18>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.355,.361);b.B=new L(.645,.651);u.q(a);return b},TenPointedStar:function(a,b,c){var d=K.wm(10);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;20>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.281,.261);b.B=new L(.723,.748);u.q(a);return b},FivePointedBurst:function(a, -b,c){var d=K.uo(5);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;ea&&(a=.15);var d=u.p(),e=.2*K.sa;M(d,0,.2*c,!0);O(d,0,(.2-e)*c,(.2-e)*b, -0,.2*b,0);d.lineTo(.8*b,0);O(d,(.8+e)*b,0,1*b,(.2-e)*c,1*b,.2*c);d.lineTo(1*b,.8*c);O(d,1*b,(.8+e)*c,(.8+e)*b,1*c,.8*b,1*c);d.lineTo(.2*b,1*c);O(d,(.2-e)*b,1*c,0,(.8+e)*c,0,.8*c);d.lineTo(0,.2*c);M(d,0,a*c,!1);d.lineTo(1*b,a*c);d.$a(!1);b=d.o;b.A=new L(0,a);b.B=new L(1,1-a);u.q(d);return b},DividedProcess:function(a,b,c){a=a?a.xc:NaN;if(isNaN(a)||.1>a)a=.1;var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,0,a*c,!1);d.lineTo(1*b,a*c);d.$a(!1);b=d.o;b.A=new L(0,a);b.B= -Vb;u.q(d);return b},Document:function(a,b,c){c/=.8;a=u.p();M(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);b=a.o;b.A=xb;b.B=new L(1,.6);u.q(a);return b},ExternalOrganization:function(a,b,c){a=a?a.xc:NaN;if(isNaN(a)||.2>a)a=.2;var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,a*b,0,!1);d.lineTo(0,a*c);d.moveTo(1*b,a*c);d.lineTo((1-a)*b,0);d.moveTo(0,(1-a)*c);d.lineTo(a*b,1*c);d.moveTo((1-a)*b,1*c);d.lineTo(1*b,(1- -a)*c);d.$a(!1);b=d.o;b.A=new L(a/2,a/2);b.B=new L(1-a/2,1-a/2);u.q(d);return b},ExternalProcess:function(a,b,c){a=u.p();M(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);P(a);M(a,.1*b,.4*c,!1);a.lineTo(.1*b,.6*c);a.moveTo(.9*b,.6*c);a.lineTo(.9*b,.4*c);a.moveTo(.6*b,.1*c);a.lineTo(.4*b,.1*c);a.moveTo(.4*b,.9*c);a.lineTo(.6*b,.9*c);a.$a(!1);b=a.o;b.A=new L(.25,.25);b.B=new L(.75,.75);u.q(a);return b},File:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c); -a.lineTo(1*b,1*c);a.lineTo(0,1*c);P(a);M(a,.75*b,0,!1);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.25*c);a.$a(!1);b=a.o;b.A=new L(0,.25);b.B=Vb;u.q(a);return b},Interrupt:function(a,b,c){a=u.p();M(a,1*b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);M(a,1*b,.5*c,!1);a.lineTo(1*b,1*c);M(a,1*b,.5*c,!1);a.lineTo(1*b,0);b=a.o;b.A=new L(0,.25);b.B=new L(.5,.75);u.q(a);return b},InternalStorage:function(a,b,c){var d=a?a.xc:NaN;a=a?a.et:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.1);var e=u.p();M(e,0,0,!0);e.lineTo(1* -b,0);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);M(e,d*b,0,!1);e.lineTo(d*b,1*c);e.moveTo(0,a*c);e.lineTo(1*b,a*c);e.$a(!1);b=e.o;b.A=new L(d,a);b.B=Vb;u.q(e);return b},Junction:function(a,b,c){a=u.p();var d=1/Math.SQRT2,e=(1-1/Math.SQRT2)/2,f=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+f)*c,(.5+f)*b,1*c,.5*b,1*c);O(a,(.5-f)*b,1*c,0,(.5+f)*c,0,.5*c);O(a,0,(.5-f)*c,(.5-f)*b,0,.5*b,0);O(a,(.5+f)*b,0,1*b,(.5-f)*c,1*b,.5*c);M(a,(e+d)*b,(e+d)*c,!1);a.lineTo(e*b,e*c);a.moveTo(e*b,(e+d)*c);a.lineTo((e+d)*b,e*c);a.$a(!1); -b=a.o;b.Bd=sh;u.q(a);return b},LinedDocument:function(a,b,c){c/=.8;a=u.p();M(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);M(a,.1*b,0,!1);a.lineTo(.1*b,.75*c);a.$a(!1);b=a.o;b.A=new L(.1,0);b.B=new L(1,.6);u.q(a);return b},LoopLimit:function(a,b,c){a=u.p();M(a,0,1*c,!0);a.lineTo(0,.25*c);a.lineTo(.25*b,0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(1*b,1*c);P(a);b=a.o;b.A=new L(0,.25);b.B=Vb;u.q(a);return b},SequentialData:"MagneticTape",MagneticTape:function(a, -b,c){a=u.p();var d=.5*K.sa;M(a,.5*b,1*c,!0);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,.9*c,.6*b,.9*c);a.lineTo(1*b,.9*c);a.lineTo(1*b,1*c);a.lineTo(.5*b,1*c);b=a.o;b.A=new L(.15,.15);b.B=new L(.85,.8);u.q(a);return b},ManualInput:function(a,b,c){a=u.p();M(a,1*b,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.25*c);P(a);b=a.o;b.A=new L(0,.25);b.B=Vb;u.q(a);return b},MessageFromUser:function(a,b,c){a=a?a.xc: -NaN;isNaN(a)&&(a=.7);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(a*b,.5*c);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=xb;b.B=new L(a,1);u.q(d);return b},MicroformProcessing:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.25);var d=u.p();M(d,0,0,!0);d.lineTo(.5*b,a*c);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.5*b,(1-a)*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=new L(0,a);b.B=new L(1,1-a);u.q(d);return b},MicroformRecording:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.15* -c);a.lineTo(1*b,.85*c);a.lineTo(.75*b,.75*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=new L(0,.25);b.B=new L(1,.75);u.q(a);return b},MultiDocument:function(a,b,c){c/=.8;a=u.p();M(a,b,0,!0);a.lineTo(b,.5*c);O(a,.96*b,.47*c,.93*b,.45*c,.9*b,.44*c);a.lineTo(.9*b,.6*c);O(a,.86*b,.57*c,.83*b,.55*c,.8*b,.54*c);a.lineTo(.8*b,.7*c);O(a,.4*b,.4*c,.4*b,1*c,0,.7*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);a.lineTo(.1*b,.1*c);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);P(a);M(a,.1*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.lineTo(.8*b,.54* -c);a.moveTo(.2*b,.1*c);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.44*c);a.$a(!1);b=a.o;b.A=new L(0,.25);b.B=new L(.8,.77);u.q(a);return b},MultiProcess:function(a,b,c){a=u.p();M(a,.1*b,.1*c,!0);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);a.lineTo(1*b,0);a.lineTo(1*b,.8*c);a.lineTo(.9*b,.8*c);a.lineTo(.9*b,.9*c);a.lineTo(.8*b,.9*c);a.lineTo(.8*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);P(a);M(a,.2*b,.1*c,!1);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.8*c);a.moveTo(.1*b,.2*c);a.lineTo(.8*b,.2*c);a.lineTo(.8* -b,.9*c);a.$a(!1);b=a.o;b.A=new L(0,.2);b.B=new L(.8,1);u.q(a);return b},OfflineStorage:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=1-a,e=u.p();M(e,0,0,!0);e.lineTo(1*b,0);e.lineTo(.5*b,1*c);P(e);M(e,.5*a*b,a*c,!1);e.lineTo((1-.5*a)*b,a*c);e.$a(!1);b=e.o;b.A=new L(d/4+.5*a,a);b.B=new L(3*d/4+.5*a,a+.5*d);u.q(e);return b},OffPageConnector:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.5*c);a.lineTo(.75*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=xb;b.B=new L(.75,1);u.q(a);return b}, -Or:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);M(a,1*b,.5*c,!1);a.lineTo(0,.5*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,0);a.$a(!1);b=a.o;b.Bd=sh;u.q(a);return b},PaperTape:function(a,b,c){c/=.8;a=u.p();M(a,0,.7*c,!0);a.lineTo(0,.3*c);O(a,.5*b,.6*c,.5*b,0,1*b,.3*c);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);b=a.o;b.A=new L(0,.49);b.B= -new L(1,.75);u.q(a);return b},PrimitiveFromCall:function(a,b,c){var d=a?a.xc:NaN;a=a?a.et:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=u.p();M(e,0,0,!0);e.lineTo(1*b,0);e.lineTo((1-a)*b,.5*c);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.A=new L(d,0);b.B=new L(1-a,1);u.q(e);return b},PrimitiveToCall:function(a,b,c){var d=a?a.xc:NaN;a=a?a.et:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=u.p();M(e,0,0,!0);e.lineTo((1-a)*b,0);e.lineTo(1*b,.5*c);e.lineTo((1-a)*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.A=new L(d, -0);b.B=new L(1-a,1);u.q(e);return b},Subroutine:"Procedure",Procedure:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,(1-a)*b,0,!1);d.lineTo((1-a)*b,1*c);d.moveTo(a*b,0);d.lineTo(a*b,1*c);d.$a(!1);b=d.o;b.A=new L(a,0);b.B=new L(1-a,1);u.q(d);return b},Process:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,a*b,0,!1);d.lineTo(a*b,1*c);d.$a(!1); -b=d.o;b.A=new L(a,0);b.B=Vb;u.q(d);return b},Sort:function(a,b,c){a=u.p();M(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);P(a);M(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.$a(!1);b=a.o;b.A=new L(.25,.25);b.B=new L(.75,.5);u.q(a);return b},Start:function(a,b,c){a=u.p();M(a,.25*b,0,!0);M(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);M(a,.25*b,0,!1);a.lineTo(.25*b,1*c);a.moveTo(.75*b,0);a.lineTo(.75*b,1*c);a.$a(!1);b=a.o;b.A=new L(.25,0);b.B= -new L(.75,1);u.q(a);return b},Terminator:function(a,b,c){a=u.p();M(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);b=a.o;b.A=new L(.23,0);b.B=new L(.77,1);u.q(a);return b},TransmittalTape:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.75*b,(1-a)*c);d.lineTo(0,(1-a)*c);P(d);b=d.o;b.A=xb;b.B=new L(1,1-a);u.q(d);return b},AndGate:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,0,0,!0);a.lineTo(.5* -b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=xb;b.B=new L(.55,1);u.q(a);return b},Buffer:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=new L(0,.25);b.B=new L(.5,.75);u.q(a);return b},Clock:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c); -M(a,1*b,.5*c,!1);a.lineTo(1*b,.5*c);M(a,.8*b,.75*c,!1);a.lineTo(.8*b,.25*c);a.lineTo(.6*b,.25*c);a.lineTo(.6*b,.75*c);a.lineTo(.4*b,.75*c);a.lineTo(.4*b,.25*c);a.lineTo(.2*b,.25*c);a.lineTo(.2*b,.75*c);a.$a(!1);b=a.o;b.Bd=sh;u.q(a);return b},Ground:function(a,b,c){a=u.p();M(a,.5*b,0,!1);a.lineTo(.5*b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.3*b,.8*c);a.lineTo(.7*b,.8*c);a.moveTo(.4*b,1*c);a.lineTo(.6*b,1*c);b=a.o;u.q(a);return b},Inverter:function(a,b,c){a=u.p();var d=.1*K.sa;M(a,.8* -b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.8*b,.5*c);M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.9+d)*b,.6*c,.9*b,.6*c);O(a,(.9-d)*b,.6*c,.8*b,(.5+d)*c,.8*b,.5*c);O(a,.8*b,(.5-d)*c,(.9-d)*b,.4*c,.9*b,.4*c);O(a,(.9+d)*b,.4*c,1*b,(.5-d)*c,1*b,.5*c);b=a.o;b.A=new L(0,.25);b.B=new L(.4,.75);u.q(a);return b},NandGate:function(a,b,c){a=u.p();var d=K.sa,e=.5*d,f=.4*d,d=.1*d;M(a,.8*b,.5*c,!0);O(a,.8*b,(.5+f)*c,(.4+e)*b,1*c,.4*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.4*b,0);O(a,(.4+e)*b,0,.8*b,(.5-f)* -c,.8*b,.5*c);M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.9+d)*b,.6*c,.9*b,.6*c);O(a,(.9-d)*b,.6*c,.8*b,(.5+d)*c,.8*b,.5*c);O(a,.8*b,(.5-d)*c,(.9-d)*b,.4*c,.9*b,.4*c);O(a,(.9+d)*b,.4*c,1*b,(.5-d)*c,1*b,.5*c);b=a.o;b.A=new L(0,.05);b.B=new L(.55,.95);u.q(a);return b},NorGate:function(a,b,c){a=u.p();var d=K.sa,e=.5,f=d*e,h=0,k=.5;M(a,.8*b,.5*c,!0);O(a,.7*b,(k+f)*c,(h+f)*b,(k+e)*c,0,1*c);O(a,.25*b,.75*c,.25*b,.25*c,0,0);O(a,(h+f)*b,(k-e)*c,.7*b,(k-f)*c,.8*b,.5*c);e=.1;f=.1*d;h=.9;k=.5;M(a,(h-e)*b,k*c,!0);O(a, -(h-e)*b,(k-f)*c,(h-f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h+f)*b,(k-e)*c,(h+e)*b,(k-f)*c,(h+e)*b,k*c);O(a,(h+e)*b,(k+f)*c,(h+f)*b,(k+e)*c,h*b,(k+e)*c);O(a,(h-f)*b,(k+e)*c,(h-e)*b,(k+f)*c,(h-e)*b,k*c);b=a.o;b.A=new L(.2,.25);b.B=new L(.6,.75);u.q(a);return b},OrGate:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,0,0,!0);O(a,(0+d+d)*b,0*c,.8*b,(.5-d)*c,1*b,.5*c);O(a,.8*b,(.5+d)*c,(0+d+d)*b,1*c,0,1*c);O(a,.25*b,.75*c,.25*b,.25*c,0,0);P(a);b=a.o;b.A=new L(.2,.25);b.B=new L(.75,.75);u.q(a);return b},XnorGate:function(a, -b,c){a=u.p();var d=K.sa,e=.5,f=d*e,h=.2,k=.5;M(a,.1*b,0,!1);O(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);M(a,.8*b,.5*c,!0);O(a,.7*b,(k+f)*c,(h+f)*b,(k+e)*c,.2*b,1*c);O(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);O(a,(h+f)*b,(k-e)*c,.7*b,(k-f)*c,.8*b,.5*c);e=.1;f=.1*d;h=.9;k=.5;M(a,(h-e)*b,k*c,!0);O(a,(h-e)*b,(k-f)*c,(h-f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h+f)*b,(k-e)*c,(h+e)*b,(k-f)*c,(h+e)*b,k*c);O(a,(h+e)*b,(k+f)*c,(h+f)*b,(k+e)*c,h*b,(k+e)*c);O(a,(h-f)*b,(k+e)*c,(h-e)*b,(k+f)*c,(h-e)*b,k*c);b=a.o;b.A=new L(.4,.25); -b.B=new L(.65,.75);u.q(a);return b},XorGate:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,.1*b,0,!1);O(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);M(a,.2*b,0,!0);O(a,(.2+d)*b,0*c,.9*b,(.5-d)*c,1*b,.5*c);O(a,.9*b,(.5+d)*c,(.2+d)*b,1*c,.2*b,1*c);O(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);P(a);b=a.o;b.A=new L(.4,.25);b.B=new L(.8,.75);u.q(a);return b},Capacitor:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},Resistor:function(a,b,c){a=u.p();M(a,0,.5*c,!1);a.lineTo(.1* -b,0);a.lineTo(.2*b,1*c);a.lineTo(.3*b,0);a.lineTo(.4*b,1*c);a.lineTo(.5*b,0);a.lineTo(.6*b,1*c);a.lineTo(.7*b,.5*c);b=a.o;u.q(a);return b},Inductor:function(a,b,c){a=u.p();var d=.1*K.sa,e=.1;M(a,(e-.5*d)*b,c,!1);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.3;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.5;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.7;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.9;O(a,(e+.1)*b,0,(e+d)*b,c, -(e+.5*d)*b,c);b=a.o;u.q(a);return b},ACvoltageSource:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,0*b,.5*c,!1);O(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);O(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b,.5*c);a.moveTo(.1*b,.5*c);O(a,.5*b,0*c,.5*b,1*c,.9*b,.5*c);b=a.o;b.Bd=sh;u.q(a);return b},DCvoltageSource:function(a,b,c){a=u.p();M(a,0,.75*c,!1);a.lineTo(0,.25*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},Diode:function(a,b, -c){a=u.p();M(a,1*b,0,!1);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);a.lineTo(1*b,1*c);b=a.o;b.A=new L(0,.25);b.B=new L(.5,.75);u.q(a);return b},Wifi:function(a,b,c){var d=b,e=c;b*=.38;c*=.6;a=u.p();var f=K.sa,h=.8*f,k=.8,l=0,m=.5,d=(d-b)/2,e=(e-c)/2;M(a,l*b+d,(m+k)*c+e,!0);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,l*b+d,(m-k)*c+e,(l-k+.5*h)*b+d,(m-h)*c+e,(l-k+.5*h)*b+d,m*c+e);O(a,(l-k+.5*h)* -b+d,(m+h)*c+e,l*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);P(a);h=.4*f;k=.4;l=.2;m=.5;M(a,l*b+d,(m+k)*c+e,!0);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,l*b+d,(m-k)*c+e,(l-k+.5*h)*b+d,(m-h)*c+e,(l-k+.5*h)*b+d,m*c+e);O(a,(l-k+.5*h)*b+d,(m+h)*c+e,l*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);P(a);h=.2*f;k=.2;m=l=.5;M(a,(l-k)*b+d,m*c+e,!0);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,(l+h)*b+d,(m-k)*c+e,(l+k)*b+d,(m-h)*c+e, -(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);h=.4*f;k=.4;l=.8;m=.5;M(a,l*b+d,(m-k)*c+e,!0);O(a,(l+h)*b+d,(m-k)*c+e,(l+k)*b+d,(m-h)*c+e,(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,l*b+d,(m+k)*c+e,(l+k-.5*h)*b+d,(m+h)*c+e,(l+k-.5*h)*b+d,m*c+e);O(a,(l+k-.5*h)*b+d,(m-h)*c+e,l*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);P(a);h=.8*f;k=.8;l=1;m=.5;M(a,l*b+d,(m-k)*c+e,!0);O(a,(l+h)*b+d,(m- -k)*c+e,(l+k)*b+d,(m-h)*c+e,(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,l*b+d,(m+k)*c+e,(l+k-.5*h)*b+d,(m+h)*c+e,(l+k-.5*h)*b+d,m*c+e);O(a,(l+k-.5*h)*b+d,(m-h)*c+e,l*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);P(a);b=a.o;u.q(a);return b},Email:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);P(a);M(a,0,0,!1);a.lineTo(.5*b,.6*c);a.lineTo(1*b,0);a.moveTo(0,1*c);a.lineTo(.45*b,.54*c);a.moveTo(1*b,1*c);a.lineTo(.55*b,.54*c);a.$a(!1); -b=a.o;u.q(a);return b},Ethernet:function(a,b,c){a=u.p();M(a,.35*b,0,!0);a.lineTo(.65*b,0);a.lineTo(.65*b,.4*c);a.lineTo(.35*b,.4*c);a.lineTo(.35*b,0);P(a);M(a,.1*b,1*c,!0,!0);a.lineTo(.4*b,1*c);a.lineTo(.4*b,.6*c);a.lineTo(.1*b,.6*c);a.lineTo(.1*b,1*c);P(a);M(a,.6*b,1*c,!0,!0);a.lineTo(.9*b,1*c);a.lineTo(.9*b,.6*c);a.lineTo(.6*b,.6*c);a.lineTo(.6*b,1*c);P(a);M(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.5*b,.4*c);a.moveTo(.75*b,.5*c);a.lineTo(.75*b,.6*c);a.moveTo(.25*b,.5*c);a.lineTo(.25* -b,.6*c);a.$a(!1);b=a.o;u.q(a);return b},Power:function(a,b,c){a=u.p();var d=K.sa,e=.4*d,f=.4,h=u.K(),k=u.K(),l=u.K(),m=u.K();K.Ai(.5,.5-f,.5+e,.5-f,.5+f,.5-e,.5+f,.5,.5,h,h,k,l,m);var n=u.fc(k.x,k.y);M(a,k.x*b,k.y*c,!0);O(a,l.x*b,l.y*c,m.x*b,m.y*c,(.5+f)*b,.5*c);O(a,(.5+f)*b,(.5+e)*c,(.5+e)*b,(.5+f)*c,.5*b,(.5+f)*c);O(a,(.5-e)*b,(.5+f)*c,(.5-f)*b,(.5+e)*c,(.5-f)*b,.5*c);K.Ai(.5-f,.5,.5-f,.5-e,.5-e,.5-f,.5,.5-f,.5,l,m,k,h,h);O(a,l.x*b,l.y*c,m.x*b,m.y*c,k.x*b,k.y*c);e=.3*d;f=.3;K.Ai(.5-f,.5,.5-f,.5- -e,.5-e,.5-f,.5,.5-f,.5,l,m,k,h,h);a.lineTo(k.x*b,k.y*c);O(a,m.x*b,m.y*c,l.x*b,l.y*c,(.5-f)*b,.5*c);O(a,(.5-f)*b,(.5+e)*c,(.5-e)*b,(.5+f)*c,.5*b,(.5+f)*c);O(a,(.5+e)*b,(.5+f)*c,(.5+f)*b,(.5+e)*c,(.5+f)*b,.5*c);K.Ai(.5,.5-f,.5+e,.5-f,.5+f,.5-e,.5+f,.5,.5,h,h,k,l,m);O(a,m.x*b,m.y*c,l.x*b,l.y*c,k.x*b,k.y*c);P(a);M(a,.45*b,0,!0);a.lineTo(.45*b,.5*c);a.lineTo(.55*b,.5*c);a.lineTo(.55*b,0);P(a);u.v(h);u.v(k);u.v(l);u.v(m);u.v(n);b=a.o;b.A=new L(.25,.55);b.B=new L(.75,.8);u.q(a);return b},Fallout:function(a, -b,c){a=u.p();var d=.5*K.sa;M(a,0*b,.5*c,!0);O(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);O(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b,.5*c);var e=d=0;M(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.4;e=0;P(a);M(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.2;e=-.3;P(a);M(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+ -d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);P(a);b=a.o;b.Bd=sh;u.q(a);return b},IrritationHazard:function(a,b,c){a=u.p();M(a,.2*b,0*c,!0);a.lineTo(.5*b,.3*c);a.lineTo(.8*b,0*c);a.lineTo(1*b,.2*c);a.lineTo(.7*b,.5*c);a.lineTo(1*b,.8*c);a.lineTo(.8*b,1*c);a.lineTo(.5*b,.7*c);a.lineTo(.2*b,1*c);a.lineTo(0*b,.8*c);a.lineTo(.3*b,.5*c);a.lineTo(0*b,.2*c);P(a);b=a.o;b.A=new L(.3,.3);b.B=new L(.7,.7);u.q(a);return b},ElectricalHazard:function(a,b,c){a=u.p();M(a,.37*b,0*c,!0);a.lineTo(.5* -b,.11*c);a.lineTo(.77*b,.04*c);a.lineTo(.33*b,.49*c);a.lineTo(1*b,.37*c);a.lineTo(.63*b,.86*c);a.lineTo(.77*b,.91*c);a.lineTo(.34*b,1*c);a.lineTo(.34*b,.78*c);a.lineTo(.44*b,.8*c);a.lineTo(.65*b,.56*c);a.lineTo(0*b,.68*c);P(a);b=a.o;u.q(a);return b},FireHazard:function(a,b,c){a=u.p();M(a,.1*b,1*c,!0);O(a,-.25*b,.63*c,.45*b,.44*c,.29*b,0*c);O(a,.48*b,.17*c,.54*b,.35*c,.51*b,.42*c);O(a,.59*b,.29*c,.58*b,.28*c,.59*b,.18*c);O(a,.8*b,.34*c,.88*b,.43*c,.75*b,.6*c);O(a,.87*b,.48*c,.88*b,.43*c,.88*b,.31* -c);O(a,1.17*b,.76*c,.82*b,.8*c,.9*b,1*c);P(a);b=a.o;b.A=new L(.05,.645);b.B=new L(.884,.908);u.q(a);return b},BpmnActivityLoop:function(a,b,c){a=u.p();var d=4*(Math.SQRT2-1)/3*.5;M(a,.65*b,1*c,!1);O(a,(1-d+0)*b,1*c,1*b,(.5+d+0)*c,1*b,.5*c);O(a,1*b,(.5-d+0)*c,(.5+d+0)*b,0*c,.5*b,0*c);O(a,(.5-d+0)*b,0*c,0*b,(.5-d+0)*c,0*b,.5*c);O(a,0*b,(.5+d+0)*c,(.5-d+0)*b,1*c,.35*b,.98*c);a.moveTo(.25*b,.8*c);a.lineTo(.35*b,1*c);a.lineTo(.1*b,1*c);b=a.o;u.q(a);return b},BpmnActivityParallel:function(a,b,c){a=u.p(); -M(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},BpmnActivitySequential:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(1*b,0);a.moveTo(0,.5*c);a.lineTo(1*b,.5*c);a.moveTo(0,1*c);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},BpmnActivityAdHoc:function(a,b,c){a=u.p();M(a,0,0,!1);M(a,1*b,1*c,!1);M(a,0,.5*c,!1);O(a,.2*b,.35*c,.3*b,.35*c,.5*b,.5*c);O(a,.7*b,.65*c,.8*b,.65*c,1*b,.5*c);b=a.o;u.q(a);return b},BpmnActivityCompensation:function(a, -b,c){a=u.p();M(a,0,.5*c,!0);a.lineTo(.5*b,0);a.lineTo(.5*b,.5*c);a.lineTo(1*b,1*c);a.lineTo(1*b,0);a.lineTo(.5*b,.5*c);a.lineTo(.5*b,1*c);P(a);b=a.o;u.q(a);return b},BpmnTaskMessage:function(a,b,c){a=u.p();M(a,0,.2*c,!0);a.lineTo(1*b,.2*c);a.lineTo(1*b,.8*c);a.lineTo(0,.8*c);a.lineTo(0,.8*c);P(a);M(a,0,.2*c,!1);a.lineTo(.5*b,.5*c);a.lineTo(1*b,.2*c);a.$a(!1);b=a.o;u.q(a);return b},BpmnTaskScript:function(a,b,c){a=u.p();M(a,.7*b,1*c,!0);a.lineTo(.3*b,1*c);O(a,.6*b,.5*c,0,.5*c,.3*b,0);a.lineTo(.7*b, -0);O(a,.4*b,.5*c,1*b,.5*c,.7*b,1*c);P(a);M(a,.45*b,.73*c,!1);a.lineTo(.7*b,.73*c);a.moveTo(.38*b,.5*c);a.lineTo(.63*b,.5*c);a.moveTo(.31*b,.27*c);a.lineTo(.56*b,.27*c);a.$a(!1);b=a.o;u.q(a);return b},BpmnTaskUser:function(a,b,c){a=u.p();M(a,0,0,!1);M(a,.335*b,(1-.555)*c,!0);a.lineTo(.335*b,.595*c);a.lineTo(.665*b,.595*c);a.lineTo(.665*b,(1-.555)*c);O(a,.88*b,.46*c,.98*b,.54*c,1*b,.68*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.68*c);O(a,.02*b,.54*c,.12*b,.46*c,.335*b,(1-.555)*c);a.lineTo(.365* -b,.405*c);var d=.5-.285,e=Math.PI/4,f=4*(1-Math.cos(e))/(3*Math.sin(e)),e=f*d,f=f*d;O(a,(.5-(e+d)/2)*b,(d+(d+f)/2)*c,(.5-d)*b,(d+f)*c,(.5-d)*b,d*c);O(a,(.5-d)*b,(d-f)*c,(.5-e)*b,(d-d)*c,.5*b,(d-d)*c);O(a,(.5+e)*b,(d-d)*c,(.5+d)*b,(d-f)*c,(.5+d)*b,d*c);O(a,(.5+d)*b,(d+f)*c,(.5+(e+d)/2)*b,(d+(d+f)/2)*c,.635*b,.405*c);a.lineTo(.635*b,.405*c);a.lineTo(.665*b,(1-.555)*c);a.lineTo(.665*b,.595*c);a.lineTo(.335*b,.595*c);M(a,.2*b,1*c,!1);a.lineTo(.2*b,.8*c);M(a,.8*b,1*c,!1);a.lineTo(.8*b,.8*c);b=a.o;u.q(a); -return b},BpmnEventConditional:function(a,b,c){a=u.p();M(a,.1*b,0,!0);a.lineTo(.9*b,0);a.lineTo(.9*b,1*c);a.lineTo(.1*b,1*c);P(a);M(a,.2*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.moveTo(.2*b,.4*c);a.lineTo(.8*b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.2*b,.8*c);a.lineTo(.8*b,.8*c);a.$a(!1);b=a.o;u.q(a);return b},BpmnEventError:function(a,b,c){a=u.p();M(a,0,1*c,!0);a.lineTo(.33*b,0);a.lineTo(.66*b,.5*c);a.lineTo(1*b,0);a.lineTo(.66*b,1*c);a.lineTo(.33*b,.5*c);P(a);b=a.o;u.q(a);return b},BpmnEventEscalation:function(a, -b,c){a=u.p();M(a,0,0,!1);M(a,1*b,1*c,!1);M(a,.1*b,1*c,!0);a.lineTo(.5*b,0);a.lineTo(.9*b,1*c);a.lineTo(.5*b,.5*c);P(a);b=a.o;u.q(a);return b},BpmnEventTimer:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);M(a,.5*b,0,!1);a.lineTo(.5*b,.15*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,.85*c);a.moveTo(0,.5*c);a.lineTo(.15*b,.5*c);a.moveTo(1*b,.5*c);a.lineTo(.85* -b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.58*b,.1*c);a.moveTo(.5*b,.5*c);a.lineTo(.78*b,.54*c);a.$a(!1);b=a.o;b.Bd=sh;u.q(a);return b}};for(var In in K.qg)K.qg[In.toLowerCase()]=In; -K.Hv={"":"",Standard:"F1 m 0,0 l 8,4 -8,4 2,-4 z",Backward:"F1 m 8,0 l -2,4 2,4 -8,-4 z",Triangle:"F1 m 0,0 l 8,4.62 -8,4.62 z",BackwardTriangle:"F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z",Boomerang:"F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z",BackwardBoomerang:"F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z",SidewaysV:"m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z",BackwardV:"m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z",OpenTriangle:"m 0,0 l 8,4 -8,4",BackwardOpenTriangle:"m 8,0 l -8,4 8,4",OpenTriangleLine:"m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8", -BackwardOpenTriangleLine:"m 8,0 l -8,4 8,4 m -8.5,0 l 0,-8",OpenTriangleTop:"m 0,0 l 8,4 m 0,4",BackwardOpenTriangleTop:"m 8,0 l -8,4 m 0,4",OpenTriangleBottom:"m 0,8 l 8,-4",BackwardOpenTriangleBottom:"m 0,4 l 8,4",HalfTriangleTop:"F1 m 0,0 l 0,4 8,0 z m 0,8",BackwardHalfTriangleTop:"F1 m 8,0 l 0,4 -8,0 z m 0,8",HalfTriangleBottom:"F1 m 0,4 l 0,4 8,-4 z",BackwardHalfTriangleBottom:"F1 m 8,4 l 0,4 -8,-4 z",ForwardSemiCircle:"m 4,0 b 270 180 0 4 4",BackwardSemiCircle:"m 4,8 b 90 180 0 -4 4",Feather:"m 0,0 l 3,4 -3,4", -BackwardFeather:"m 3,0 l -3,4 3,4",DoubleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardDoubleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4",TripleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardTripleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4",ForwardSlash:"m 0,8 l 5,-8",BackSlash:"m 0,0 l 5,8",DoubleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8",DoubleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8",TripleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8", -TripleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8",Fork:"m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4",LineFork:"m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardLineFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8",CircleFork:"F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3",CircleLineFork:"F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", -BackwardCircleLineFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3",Circle:"F1 m 8,4 b 0 360 -4 0 4 z",Block:"F1 m 0,0 l 0,8 8,0 0,-8 z",StretchedDiamond:"F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z",Diamond:"F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z",Chevron:"F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z",StretchedChevron:"F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z",NormalArrow:"F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z",X:"m 0,0 l 8,8 m 0,-8 l -8,8",TailedNormalArrow:"F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z", -DoubleTriangle:"F1 m 0,0 l 4,4 -4,4 0,-8 z m 4,0 l 4,4 -4,4 0,-8 z",BigEndArrow:"F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z",ConcaveTailArrow:"F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z",RoundedTriangle:"F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z",SimpleArrow:"F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z",AccelerationArrow:"F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z",BoxArrow:"F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z", -TriangleLine:"F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8",CircleEndedArrow:"F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z",DynamicWidthArrow:"F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z",EquilibriumArrow:"m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3",FastForward:"F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z",Kite:"F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z",HalfArrowTop:"F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8",HalfArrowBottom:"F1 m 0,8 l 4,-4 4,0 -8,4 z", -OpposingDirectionDoubleArrow:"F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z",PartialDoubleTriangle:"F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z",LineCircle:"F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z",DoubleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",TripleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",CircleLine:"F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8",DiamondCircle:"F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z",PlusCircle:"F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8", -OpenRightTriangleTop:"m 8,0 l 0,4 -8,0 m 0,4",OpenRightTriangleBottom:"m 8,8 l 0,-4 -8,0",Line:"m 0,0 l 0,8",DoubleLine:"m 0,0 l 0,8 m 2,0 l 0,-8",TripleLine:"m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8",PentagonArrow:"F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z"};K.jI=function(){if(null!==K.Hv){for(var a in K.Hv){var b=sd(K.Hv[a],!1);K.Qi[a]=b;a.toLowerCase()!==a&&(K.Qi[a.toLowerCase()]=a)}K.Hv=null}}; -K.UC=function(a){K.jI();var b=K.Qi[a];if(void 0===b){b=a.toLowerCase();if("none"===b)return"None";b=K.Qi[b]}return"string"===typeof b?b:b instanceof $c?a:null}; -function G(a){0===arguments.length?A.call(this):A.call(this,a);this.O=311807;this.wk=this.Vh="";this.ur=this.rr=this.Dr=this.xq=null;this.Fr="";this.Th=this.Er=this.bm=null;this.tr="";this.Vn=null;this.sr=(new ia(NaN,NaN)).freeze();this.vr="";this.Wn=null;this.ie="";this.Bu=this.Gp=this.kk=null;this.Mg=(new w(NaN,NaN)).freeze();this.Eq="";this.zk=null;this.Fq=xb;this.Oq=K.fF;this.Hq=K.eF;this.Qp=null;this.yq=Jn;this.em=(new w(6,6)).freeze();this.dm="gray";this.cm=4;this.BB=-1;this.qF=new z;this.Bk= -null;this.kj=NaN}u.Ga(G,A);u.fa("Part",G);G.prototype.cloneProtected=function(a){A.prototype.cloneProtected.call(this,a);a.O=this.O&-4097|49152;a.Vh=this.Vh;a.wk=this.wk;a.xq=this.xq;a.Dr=this.Dr;a.rr=this.rr;a.ur=this.ur;a.Fr=this.Fr;a.Er=this.Er;a.Th=null;a.tr=this.tr;a.sr.assign(this.sr);a.vr=this.vr;a.ie=this.ie;a.Gp=this.Gp;a.Mg.assign(this.Mg);a.Eq=this.Eq;a.Fq=this.Fq.Z();a.Oq=this.Oq.Z();a.Hq=this.Hq.Z();a.Qp=this.Qp;a.yq=this.yq;a.em.assign(this.em);a.dm=this.dm;a.cm=this.cm}; -G.prototype.Mh=function(a){A.prototype.Mh.call(this,a);a.dl();a.bm=null;a.Vn=null;a.Wn=null;a.zk=null;a.Bk=null};G.prototype.toString=function(){var a=u.rg(Object.getPrototypeOf(this))+"#"+u.Uc(this);null!==this.data&&(a+="("+de(this.data)+")");return a};G.LayoutNone=0;var Jj;G.LayoutAdded=Jj=1;var Rj;G.LayoutRemoved=Rj=2;G.LayoutShown=4;G.LayoutHidden=8;G.LayoutNodeSized=16;var Ik;G.LayoutGroupLayout=Ik=32;G.LayoutNodeReplaced=64;var Jn;G.LayoutStandard=Jn=Jj|Rj|28|Ik|64;G.LayoutAll=16777215; -G.prototype.Lm=function(a,b,c,d,e,f,h){var k=this.g;null!==k&&(a===be&&"elements"===b?e instanceof A?Kj(e,function(a){Mj(k,a);Lj(k,a)}):e instanceof Ri&&uk(k,e):a===ce&&"elements"===b&&(e instanceof A?Kj(e,function(a){Qj(k,a);Pj(k,a)}):e instanceof Ri&&vk(k,e)),k.Dc(a,b,c,d,e,f,h))};G.prototype.updateTargetBindings=G.prototype.Nb=function(a){A.prototype.Nb.call(this,a);if(null!==this.data){a=this.ya.n;for(var b=a.length,c=0;ck&&a.y>l&&a.rightk&&b.y>l&&b.right=c.wH)){this.O^=4096;var d=!1;if(null!==c){d=c.cb;c.cb=!0;var e=c.selection;e.La();a?e.add(this):e.remove(this);e.freeze()}this.h("isSelected",b,a);this.Zd();a=this.fI;null!==a&&a(this);null!==c&&(c.de(),c.cb=d)}}}); -u.defineProperty(G,{Wg:"isHighlighted"},function(){return 0!==(this.O&524288)},function(a){var b=0!==(this.O&524288);if(b!==a){this.O^=524288;var c=this.g;null!==c&&(c=c.bw,c.La(),a?c.add(this):c.remove(this),c.freeze());this.h("isHighlighted",b,a);this.ma()}});u.defineProperty(G,{il:"isShadowed"},function(){return 0!==(this.O&8192)},function(a){var b=0!==(this.O&8192);b!==a&&(this.O^=8192,this.h("isShadowed",b,a),this.ma())});function Cj(a){return 0!==(a.O&32768)} -function Ln(a,b){a.O=b?a.O|32768:a.O&-32769}function sl(a,b){a.O=b?a.O|65536:a.O&-65537}function ti(a){return 0!==(a.O&131072)}G.prototype.xf=function(a){this.O=a?this.O|131072:this.O&-131073};function Rn(a,b){a.O=b?a.O|1048576:a.O&-1048577}u.defineProperty(G,{JD:"isAnimated"},function(){return 0!==(this.O&262144)},function(a){var b=0!==(this.O&262144);b!==a&&(this.O^=262144,this.h("isAnimated",b,a))}); -u.defineProperty(G,{Zz:"selectionObjectName"},function(){return this.Fr},function(a){var b=this.Fr;b!==a&&(this.Fr=a,this.bm=null,this.h("selectionObjectName",b,a))});u.defineProperty(G,{eI:"selectionAdornmentTemplate"},function(){return this.Dr},function(a){var b=this.Dr;b!==a&&(this instanceof W&&(a.type=ah),this.Dr=a,this.h("selectionAdornmentTemplate",b,a))}); -u.u(G,{nt:"selectionObject"},function(){if(null===this.bm){var a=this.Zz;null!==a&&""!==a?(a=this.je(a),this.bm=null!==a?a:this):this instanceof W?(a=this.path,this.bm=null!==a?a:this):this.bm=this}return this.bm});u.defineProperty(G,{fI:"selectionChanged"},function(){return this.Er},function(a){var b=this.Er;b!==a&&(null!==a&&u.j(a,"function",G,"selectionChanged"),this.Er=a,this.h("selectionChanged",b,a))}); -u.defineProperty(G,{rE:"resizeAdornmentTemplate"},function(){return this.rr},function(a){var b=this.rr;b!==a&&(this.rr=a,this.h("resizeAdornmentTemplate",b,a))});u.defineProperty(G,{tE:"resizeObjectName"},function(){return this.tr},function(a){var b=this.tr;b!==a&&(this.tr=a,this.Vn=null,this.h("resizeObjectName",b,a))});u.u(G,{sE:"resizeObject"},function(){if(null===this.Vn){var a=this.tE;null!==a&&""!==a?(a=this.je(a),this.Vn=null!==a?a:this):this.Vn=this}return this.Vn}); -u.defineProperty(G,{VH:"resizeCellSize"},function(){return this.sr},function(a){var b=this.sr;b.L(a)||(this.sr=a=a.Z(),this.h("resizeCellSize",b,a))});u.defineProperty(G,{YH:"rotateAdornmentTemplate"},function(){return this.ur},function(a){var b=this.ur;b!==a&&(this.ur=a,this.h("rotateAdornmentTemplate",b,a))});u.defineProperty(G,{ZH:"rotateObjectName"},function(){return this.vr},function(a){var b=this.vr;b!==a&&(this.vr=a,this.Wn=null,this.h("rotateObjectName",b,a))}); -u.u(G,{vE:"rotateObject"},function(){if(null===this.Wn){var a=this.ZH;null!==a&&""!==a?(a=this.je(a),this.Wn=null!==a?a:this):this.Wn=this}return this.Wn});u.defineProperty(G,{text:"text"},function(){return this.ie},function(a){var b=this.ie;b!==a&&(this.ie=a,this.h("text",b,a))}); -u.defineProperty(G,{Ra:"containingGroup"},function(){return this.kk},function(a){if(this.Fd()){var b=this.kk;if(b!==a){null===a||this!==a&&!a.Ph(this)||(this===a&&u.k("Cannot make a Group a member of itself: "+this.toString()),u.k("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.H(Rj);var c=this.g;null!==b?Sn(b,this):this instanceof V&&null!==c&&c.Ik.remove(this);this.kk=a;null!==a?Tn(a,this):this instanceof V&&null!==c&&c.Ik.add(this);this.H(Jj); -if(null!==c){var d=this.data,e=c.ga;null!==d&&e instanceof Q&&e.Fw(d,e.wb(null!==a?a.data:null))}d=this.bD;null!==d&&(e=!0,null!==c&&(e=c.Na,c.Na=!0),d(this,b,a),null!==c&&(c.Na=e));if(this instanceof V)for(c=new F(G),kf(c,this,!0,0,!0),c=c.i;c.next();)if(d=c.value,d instanceof U)for(d=d.oe;d.next();)xk(d.value);if(this instanceof U)for(d=this.oe;d.next();)xk(d.value);this.h("containingGroup",b,a);null!==a&&a.Jw()}}else u.k("cannot set the Part.containingGroup of a Link or Adornment")});g=G.prototype; -g.dl=function(){var a=this.Ra;null!==a&&(a.R(),null!==a.Pb&&a.Pb.R(),a.sf())};g.ma=function(){var a=this.g;null!==a&&!Bj(this)&&!Cj(this)&&this.Ea()&&this.Xb.J()&&a.ma(yi(this,this.Xb))};g.Js=function(a){var b=this.kk;null===b||a||Tn(b,this)};g.Ks=function(a){var b=this.kk;null===b||a||Sn(b,this)};g.xm=function(){var a=this.data;if(null!==a){var b=this.g;null!==b&&(b=b.ga,null!==b&&b.Vz(a))}}; -u.defineProperty(G,{bD:"containingGroupChanged"},function(){return this.Gp},function(a){var b=this.Gp;b!==a&&(null!==a&&u.j(a,"function",G,"containingGroupChanged"),this.Gp=a,this.h("containingGroupChanged",b,a))});G.prototype.findSubGraphLevel=function(){return Un(this,this)};function Un(a,b){var c=b.Ra;return null!==c?1+Un(a,c):b instanceof U&&(c=b.ce,null!==c)?Un(a,c):0}G.prototype.findTopLevelPart=function(){return Vn(this,this)}; -function Vn(a,b){var c=b.Ra;return null!==c?Vn(a,c):b instanceof U&&(c=b.ce,null!==c)?Vn(a,c):b}u.u(G,{Ho:"isTopLevel"},function(){return null!==this.Ra||this instanceof U&&this.tf?!1:!0});G.prototype.isMemberOf=G.prototype.Ph=function(a){return a instanceof V?Wn(this,this,a):!1};function Wn(a,b,c){if(b===c||null===c)return!1;var d=b.Ra;return null===d||d!==c&&!Wn(a,d,c)?b instanceof U&&(b=b.ce,null!==b)?Wn(a,b,c):!1:!0} -G.prototype.findCommonContainingGroup=G.prototype.yG=function(a){if(null===a)return null;if(this===a)return this instanceof V?this:null;for(var b=this;null!==b;)b instanceof V&&Rn(b,!0),b=b.Ra;for(var c=null,b=a;null!==b;){if(0!==(b.O&1048576)){c=b;break}b=b.Ra}for(b=this;null!==b;)b instanceof V&&Rn(b,!1),b=b.Ra;return c};u.defineProperty(G,{nH:"layoutConditions"},function(){return this.yq},function(a){var b=this.yq;b!==a&&(this.yq=a,this.h("layoutConditions",b,a))}); -G.prototype.canLayout=function(){if(!this.OD||!this.Ea())return!1;var a=this.layer;return null!==a&&a.Ac||this instanceof U&&this.tf?!1:!0};G.prototype.invalidateLayout=G.prototype.H=function(a){void 0===a&&(a=16777215);var b;this.OD&&0!==(a&this.nH)?(b=this.layer,null!==b&&b.Ac||this instanceof U&&this.tf?b=!1:(b=this.g,b=null!==b&&b.ha.gb?!1:!0)):b=!1;if(b)if(b=this.kk,null!==b){var c=b.Qb;null!==c?c.H():b.H(a)}else a=this.g,null!==a&&(c=a.Qb,null!==c&&c.H())}; -function Oj(a){if(!a.Ea())return!1;a=a.layer;return null!==a&&a.Ac?!1:!0}u.defineProperty(G,{mD:"dragComputation"},function(){return this.Qp},function(a){var b=this.Qp;b!==a&&(null!==a&&u.j(a,"function",G,"dragComputation"),this.Qp=a,this.h("dragComputation",b,a))});u.defineProperty(G,{kI:"shadowOffset"},function(){return this.em},function(a){var b=this.em;b.L(a)||(this.em=a=a.Z(),this.ma(),this.h("shadowOffset",b,a))}); -u.defineProperty(G,{shadowColor:"shadowColor"},function(){return this.dm},function(a){var b=this.dm;b!==a&&(this.dm=a,this.ma(),this.h("shadowColor",b,a))});u.defineProperty(G,{shadowBlur:"shadowBlur"},function(){return this.cm},function(a){var b=this.cm;b!==a&&(this.cm=a,this.ma(),this.h("shadowBlur",b,a))});function lf(a){0===arguments.length?G.call(this,vh):G.call(this,a);this.wf="Adornment";this.Gb=null;this.O&=-257;this.Mg=new w(NaN,NaN);this.Vi=new E(z);this.Pb=null}u.Ga(lf,G); -u.fa("Adornment",lf);lf.prototype.toString=function(){var a=this.Kh;return"Adornment("+this.Kc+")"+(null!==a?a.toString():"")};lf.prototype.updateRelationshipsFromData=function(){};lf.prototype.Xs=function(){var a=this.vc.T,b=this.vc;if(a instanceof W&&b instanceof X){var c=a.path,b=c.Pa;a.Xs();for(var b=c.Pa,a=this.ya.n,c=a.length,d=0;da&&(a=1);var b=this.g;if(null!==b&&!b.me){var c=b.Lb;0!==b.ha.Le&&c.ml();b.me=!0;var c=b.qd,d=new F(U);d.add(this);jo(this,d,c,a,this.Vc);b.me=!1}}; -function jo(a,b,c,d,e){if(1a&&(a=2);var b=this.g;if(null!==b&&!b.me){var c=b.Lb;0!==b.ha.Le&&c.ml();b.me=!0;var d=b.qd,e=new F(U);e.add(this);lo(this,e,d,a,this.Vc,c,this);b.me=!1}}; -function lo(a,b,c,d,e,f,h){for(var k=c?a.Wv():a.og();k.next();){var l=k.value;l.Bc&&(e||l.hg||l.Vb(),l=l.hz(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),e||(l.He(!0),l.dl(),ri(f,l,h)),2a&&(a-=180);break;case ro:a=K.ct(c+90);90a&&(a-=180);break;case so:a=K.ct(c-90);90a&&(a-=180);break;case to:a=K.ct(c);if(45a||225a)return 0;90a&&(a-=180)}return K.ct(a)}; -u.defineProperty(W,{W:"fromNode"},function(){return this.Wf},function(a){var b=this.Wf;if(b!==a){var c=this.od;null!==b&&(this.gg!==b&&fo(b,this,c),uo(this),this.H(Rj));this.Wf=a;this.di=null;this.Vb();var d=this.g;if(null!==d){var e=this.data,f=d.ga;if(null!==e)if(f instanceof Q){var h=null!==a?a.data:null;f.Ew(e,f.wb(h))}else f instanceof qe&&(h=null!==a?a.data:null,d.qd?f.ih(e,f.wb(h)):(null!==b&&f.ih(b.data,void 0),f.ih(h,f.wb(null!==this.gg?this.gg.data:null))))}e=this.od;f=this.wD;null!==f&& -(h=!0,null!==d&&(h=d.Na,d.Na=!0),f(this,c,e),null!==d&&(d.Na=h));null!==a&&(this.gg!==a&&eo(a,this,e),vo(this),this.H(Jj));this.h("fromNode",b,a);xk(this)}}); -u.defineProperty(W,{pg:"fromPortId"},function(){return this.wh},function(a){var b=this.wh;if(b!==a){var c=this.od;null!==c&&co(this.W,c);uo(this);this.wh=a;var d=this.od;null!==d&&co(this.W,d);var e=this.g;if(null!==e){var f=this.data,h=e.ga;null!==f&&h instanceof Q&&h.aA(f,a)}c!==d&&(this.di=null,this.Vb(),f=this.wD,null!==f&&(h=!0,null!==e&&(h=e.Na,e.Na=!0),f(this,c,d),null!==e&&(e.Na=h)));vo(this);this.h("fromPortId",b,a)}});u.u(W,{od:"fromPort"},function(){var a=this.Wf;return null===a?null:a.Xk(this.wh)}); -u.defineProperty(W,{wD:"fromPortChanged"},function(){return this.Yp},function(a){var b=this.Yp;b!==a&&(null!==a&&u.j(a,"function",W,"fromPortChanged"),this.Yp=a,this.h("fromPortChanged",b,a))}); -u.defineProperty(W,{ca:"toNode"},function(){return this.gg},function(a){var b=this.gg;if(b!==a){var c=this.fe;null!==b&&(this.Wf!==b&&fo(b,this,c),uo(this),this.H(Rj));this.gg=a;this.di=null;this.Vb();var d=this.g;if(null!==d){var e=this.data,f=d.ga;if(null!==e)if(f instanceof Q){var h=null!==a?a.data:null;f.Gw(e,f.wb(h))}else f instanceof qe&&(h=null!==a?a.data:null,d.qd?(null!==b&&f.ih(b.data,void 0),f.ih(h,f.wb(null!==this.Wf?this.Wf.data:null))):f.ih(e,f.wb(h)))}e=this.fe;f=this.PE;null!==f&& -(h=!0,null!==d&&(h=d.Na,d.Na=!0),f(this,c,e),null!==d&&(d.Na=h));null!==a&&(this.Wf!==a&&eo(a,this,e),vo(this),this.H(Jj));this.h("toNode",b,a);xk(this)}}); -u.defineProperty(W,{lh:"toPortId"},function(){return this.Ih},function(a){var b=this.Ih;if(b!==a){var c=this.fe;null!==c&&co(this.ca,c);uo(this);this.Ih=a;var d=this.fe;null!==d&&co(this.ca,d);var e=this.g;if(null!==e){var f=this.data,h=e.ga;null!==f&&h instanceof Q&&h.eA(f,a)}c!==d&&(this.di=null,this.Vb(),f=this.PE,null!==f&&(h=!0,null!==e&&(h=e.Na,e.Na=!0),f(this,c,d),null!==e&&(e.Na=h)));vo(this);this.h("toPortId",b,a)}});u.u(W,{fe:"toPort"},function(){var a=this.gg;return null===a?null:a.Xk(this.Ih)}); -u.defineProperty(W,{PE:"toPortChanged"},function(){return this.Ur},function(a){var b=this.Ur;b!==a&&(null!==a&&u.j(a,"function",W,"toPortChanged"),this.Ur=a,this.h("toPortChanged",b,a))});u.defineProperty(W,{vb:"fromSpot"},function(){return null!==this.Q?this.Q.cj:uc},function(a){null===this.Q&&this.Ee();var b=this.Q.cj;b.L(a)||(a=a.Z(),this.Q.cj=a,this.h("fromSpot",b,a),this.Vb())}); -u.defineProperty(W,{Yk:"fromEndSegmentLength"},function(){return null!==this.Q?this.Q.aj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.aj;b!==a&&(0>a&&u.wa(a,">= 0",W,"fromEndSegmentLength"),this.Q.aj=a,this.h("fromEndSegmentLength",b,a),this.Vb())});u.defineProperty(W,{Es:"fromEndSegmentDirection"},function(){return null!==this.Q?this.Q.$i:Yn},function(a){null===this.Q&&this.Ee();var b=this.Q.$i;b!==a&&(this.Q.$i=a,this.h("fromEndSegmentDirection",b,a),this.Vb())}); -u.defineProperty(W,{Fs:"fromShortLength"},function(){return null!==this.Q?this.Q.bj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.bj;b!==a&&(this.Q.bj=a,this.h("fromShortLength",b,a),this.Vb())});u.defineProperty(W,{xb:"toSpot"},function(){return null!==this.Q?this.Q.Ej:uc},function(a){null===this.Q&&this.Ee();var b=this.Q.Ej;b.L(a)||(a=a.Z(),this.Q.Ej=a,this.h("toSpot",b,a),this.Vb())}); -u.defineProperty(W,{vl:"toEndSegmentLength"},function(){return null!==this.Q?this.Q.Cj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.Cj;b!==a&&(0>a&&u.wa(a,">= 0",W,"toEndSegmentLength"),this.Q.Cj=a,this.h("toEndSegmentLength",b,a),this.Vb())});u.defineProperty(W,{wt:"toEndSegmentDirection"},function(){return null!==this.Q?this.Q.Bj:Yn},function(a){null===this.Q&&this.Ee();var b=this.Q.Bj;b!==a&&(this.Q.Bj=a,this.h("toEndSegmentDirection",b,a),this.Vb())}); -u.defineProperty(W,{yt:"toShortLength"},function(){return null!==this.Q?this.Q.Dj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.Dj;b!==a&&(this.Q.Dj=a,this.h("toShortLength",b,a),this.Vb())});function xk(a){var b=a.W,c=a.ca;null!==b?null!==c?wo(a,b.yG(c)):wo(a,null):wo(a,null)}function wo(a,b){var c=a.kk;if(c!==b){null!==c&&Sn(c,a);a.kk=b;null!==b&&Tn(b,a);var d=a.bD;if(null!==d){var e=!0,f=a.g;null!==f&&(e=f.Na,f.Na=!0);d(a,c,b);null!==f&&(f.Na=e)}!a.hg||a.oC!==c&&a.qC!==c||a.Vb()}} -W.prototype.dl=function(){var a=this.Ra;null!==a&&this.W!==a&&this.ca!==a&&G.prototype.dl.call(this)};W.prototype.getOtherNode=W.prototype.hz=function(a){var b=this.W;return a===b?this.ca:b};W.prototype.getOtherPort=function(a){var b=this.od;return a===b?this.fe:b};u.u(W,{EJ:"isLabeledLink"},function(){return null===this.ue?!1:0=d&&(h=d-1);var l=this.l(h-1),f=this.l(h);K.oo(e.x,e.y,k.x,k.y,l.x,l.y,f.x,f.y,.5,a);b=Math.min(f.x,b);c=Math.min(f.y,c);e=f}else for(e=this.l(0),f=this.l(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.m(e.x,e.y,0,0),a.Oi(f),h=2;hc&&(c=-c)):K.mb(c.y,d.y)?(c=d.x-c.x,0>c&&(c=-c)):c=Math.sqrt(c.Lj(d)),f.push(c),e+=c;for(d=h=c=0;ce/2)break;c+=d;h++}u.ra(f);b=this.l(h);f=this.l(h+1);b.x===f.x?b.y>f.y?a.m(b.x,b.y-(e/2-c)):a.m(b.x,b.y+(e/2-c)):b.y===f.y?b.x>f.x?a.m(b.x-(e/2-c),b.y):a.m(b.x+(e/2-c),b.y):(e=(e/2-c)/d,a.m(b.x+e*(f.x-b.x),b.y+e*(f.y-b.y)));return a};u.u(W,{WD:"midAngle"},function(){this.updateRoute();return this.computeMidAngle()}); -W.prototype.computeMidAngle=function(){var a=this.ka;if(2>a)return NaN;if(this.computeCurve()===kh&&4<=a&&!this.dc){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){var c=Math.floor(c),a=this.l(c),b=this.l(c+1),d=this.l(c+2),c=this.l(c+3);return K.TF(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0e?a.Fi(b):b.Fi(d)}; -u.defineProperty(W,{points:"points"},function(){return this.Qc},function(a){var b=this.Qc;if(b!==a){var c=null;if(Array.isArray(a)){var d=0===a.length%2;if(d)for(var e=0;ep&&(t-=180));0>t?t+=360:360<=t&&(t-=360);k&&(v+=Math.abs(p));0===t?r=v:90===t?s=v:180===t?r=-v:270===t?s=-v:(r=v*Math.cos(t*Math.PI/180),s=v*Math.sin(t*Math.PI/180));if(f.ne()&&k){var x=c.lb(Ib,u.K()),B=u.fc(x.x+1E3*r,x.y+1E3*s);this.getLinkPointFromPoint(b,c,x,B,!0,q);u.v(x);u.v(B)}}var v=this.getLinkPoint(d,e,h,!1,l,b,c),y=0,C=0,I=0;if(l||h!==vb||k)x= -this.computeEndSegmentLength(d,e,h,!1),I=this.getLinkDirection(d,e,v,h,!1,l,b,c),k&&(I+=l?0:30,0>p&&(I+=180)),0>I?I+=360:360<=I&&(I-=360),k&&(x+=Math.abs(p)),0===I?y=x:90===I?C=x:180===I?y=-x:270===I?C=-x:(y=x*Math.cos(I*Math.PI/180),C=x*Math.sin(I*Math.PI/180)),h.ne()&&k&&(x=e.lb(Ib,u.K()),B=u.fc(x.x+1E3*y,x.y+1E3*C),this.getLinkPointFromPoint(d,e,x,B,!1,v),u.v(x),u.v(B));e=q;if(l||f!==vb||k)e=new w(q.x+r,q.y+s);c=v;if(l||h!==vb||k)c=new w(v.x+y,v.y+C);!n&&!l&&f===vb&&3k&&(m=-m),r=(0>h?-1:1)*m+q,s=l*(r-q)+t),q=a.x+2*f/3,t=a.y+2*h/3,v=q,y=t,K.D(h,0)?y=0h?-1:1)*m+q,y=l*(v-q)+t),this.so(),this.Jh(a),this.Lk(r,s),this.Lk(v,y),this.Jh(n),this.yf(0, -this.getLinkPoint(b,c,vb,!0,!1,d,e)),this.yf(3,this.getLinkPoint(d,e,vb,!1,!1,b,c))):(a=d,d=this.getLinkPoint(b,c,vb,!0,!1,a,e),e=this.getLinkPoint(a,e,vb,!1,!1,b,c),this.hasCurviness()?(h=e.x-d.x,b=e.y-d.y,c=this.computeCurviness(),a=d.x+h/2,n=d.y+b/2,f=a,k=n,K.D(b,0)?k=0c&&(f=-f),f=(0>b?-1:1)*f+a,k=h*(f-a)+n),this.Jh(d),this.Lk(f,k)):this.Jh(d),this.Jh(e)));return!0}; -function Co(a,b){Math.abs(b.x-a.x)>Math.abs(b.y-a.y)?(b.x=b.x>=a.x?a.x+9E9:a.x-9E9,b.y=a.y):(b.y=b.y>=a.y?a.y+9E9:a.y-9E9,b.x=a.x);return b} -W.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new w);if(null===a||null===b)return f.assign(c),f;a.Ea()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));var h=e=0,k=0,l=0;a=null;e=b.S;null===e||e.Tf()||(e=e.S);if(null===e)e=d.x,h=d.y,k=c.x,l=c.y;else{a=e.Ff;e=1/(a.m11*a.m22-a.m12*a.m21);var k=a.m22*e,l=-a.m12*e,m=-a.m21*e,n=a.m11*e,p=e*(a.m21*a.dy-a.m22*a.dx),q=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*k+d.y*m+p;h=d.x*l+d.y*n+q;k=c.x*k+c.y*m+p;l=c.x*l+c.y*n+q}b.Co(e,h,k,l,f);null!== -a&&f.transform(a);return f};function Do(a,b){var c=b.jr;null===c&&(c=new Eo,c.port=b,c.Cc=b.T,b.jr=c);return Fo(c,a)} -W.prototype.getLinkPoint=function(a,b,c,d,e,f,h,k){void 0===k&&(k=new w);if(c.pd())return b.lb(c,k),k;if(c.Go()&&(c=Do(this,b),null!==c)){k.assign(c.Lo);if(e&&this.zw===mo){var l=Do(this,h);if(c.vm=m.x&&a.x<=m.x+m.width?k.x=a.x:a.y>=m.y&&a.y<=m.y+m.height&&(k.y=a.y);u.v(c);u.v(l)}}return k}f=b.lb(Ib,u.K());l=c=null;this.ka>(e?6:2)?(l=d?this.l(1):this.l(this.ka-2),e&&(l=Co(f,l.copy()))): -(c=u.K(),l=h.lb(Ib,c),e&&(l=Co(f,l)));this.getLinkPointFromPoint(a,b,f,l,d,k);u.v(f);null!==c&&u.v(c);return k}; -W.prototype.getLinkDirection=function(a,b,c,d,e,f,h,k){a:if(d.pd())c=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(n=e?this.l(1):this.l(this.ka-2),n=f?Co(l,n.copy()):c):(m=u.K(),n=k.lb(Ib,m));c=0;c=Math.abs(n.x-l.x)>Math.abs(n.y-l.y)?n.x>= -l.x?0:180:n.y>=l.y?90:270;u.v(l);null!==m&&u.v(m)}d.ne()&&h.Ph(a)&&(c+=180,360<=c&&(c-=360));a=Yn;a=e?this.Es:this.wt;a===Yn&&(a=e?b.Es:b.wt);switch(a){case Zn:b=b.Zk();c+=b;360<=c&&(c-=360);break;case Yn:case jl:b=b.Zk();if(0===b)break;45<=b&&135>b?c+=90:135<=b&&225>b?c+=180:225<=b&&315>b&&(c+=270);360<=c&&(c-=360)}return c}; -W.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Go()&&(a=Do(this,b),null!==a))return a.Sv;a=NaN;a=d?this.Yk:this.vl;null!==b&&isNaN(a)&&(a=d?b.Yk:b.vl);isNaN(a)&&(a=10);return a};W.prototype.computeSpot=function(a){return a?Ao(this,this.od):Bo(this,this.fe)};function Ao(a,b){if(null===b)return Ib;var c=a.vb;c.Lc()&&(void 0===b&&(b=a.od),null!==b&&(c=b.vb));return c===uc?vb:c} -function Bo(a,b){if(null===b)return Ib;var c=a.xb;c.Lc()&&(void 0===b&&(b=a.fe),null!==b&&(c=b.xb));return c===uc?vb:c}W.prototype.computeOtherPoint=function(a,b){var c=b.lb(Ib),d;d=b.jr;d=null!==d?Fo(d,this):null;null!==d&&(c=d.Lo);return c};W.prototype.computeShortLength=function(a){return a?Go(this):Ho(this)};function Go(a){var b=a.Fs;isNaN(b)&&(a=a.od,null!==a&&(b=a.Fs));return isNaN(b)?0:b}function Ho(a){var b=a.yt;isNaN(b)&&(a=a.fe,null!==a&&(b=a.yt));return isNaN(b)?0:b} -W.prototype.Nj=function(a,b,c,d,e,f){if(!1===this.Ag)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var h=f;void 0===f&&(h=u.jh(),h.reset());h.multiply(this.transform);if(this.sm(a,h))return Um(this,b,c,e),void 0===f&&u.Ye(h),!0;if(this.sg(a,h)){var k=!1;if(!this.Kg)for(var l=this.ya.n,m=l.length;m--;){var n=l[m];if(n.visible||n===this.ec){var p=n.ba,q=this.Ha;if(!(p.x>q.width||p.y>q.height||0>p.x+p.width||0>p.y+p.height)){p=u.jh();p.set(h);if(n instanceof A)k=n.Nj(a,b,c,d,e,p);else if(this.path=== -n){var k=n,r=a,s=d,q=p;if(!1===k.Ag)k=!1;else if(q.multiply(k.transform),s)b:{var t=r,v=q;if(k.sm(t,v))k=!0;else{if(void 0===v&&(v=k.transform,t.Kj(k.ba))){k=!0;break b}var q=t.left,r=t.right,s=t.top,t=t.bottom,x=u.K(),B=u.K(),y=u.K(),C=u.jh();C.set(v);C.aE(k.transform);C.oz();B.x=r;B.y=s;B.transform(C);x.x=q;x.y=s;x.transform(C);v=!1;cn(k,x,B,y)?v=!0:(x.x=r,x.y=t,x.transform(C),cn(k,x,B,y)?v=!0:(B.x=q,B.y=t,B.transform(C),cn(k,x,B,y)?v=!0:(x.x=q,x.y=s,x.transform(C),cn(k,x,B,y)&&(v=!0))));u.Ye(C); -u.v(x);u.v(B);u.v(y);k=v}}else k=k.sm(r,q)}else k=ol(n,a,d,p);k&&(null!==b&&(n=b(n)),n&&(null===c||c(n))&&e.add(n));u.Ye(p)}}}void 0===f&&u.Ye(h);return k||null!==this.background||null!==this.nm}void 0===f&&u.Ye(h);return!1};u.u(W,{dc:"isOrthogonal"},function(){return 2===(this.Yl.value&2)});u.u(W,{el:"isAvoiding"},function(){return 4===(this.Yl.value&4)});W.prototype.computeCurve=function(){if(null===this.di){var a=this.od,b=this.dc;this.di=null!==a&&a===this.fe&&!b}return this.di?kh:this.Ve}; -W.prototype.computeCorner=function(){if(this.Ve===kh)return 0;var a=this.Yy;if(isNaN(a)||0>a)a=10;return a};W.prototype.computeCurviness=function(){var a=this.Ov;if(isNaN(a)){var b=this.hf;if(0!==b){var a=10,c=this.g;null!==c&&(a=c.ow);c=Math.abs(b);a=a/2+((c-1)/2|0)*a;0===c%2&&(a=-a);0>b&&(a=-a)}else a=10}return a};W.prototype.computeThickness=function(){var a=this.path;return null!==a?Math.max(a.hb,1):1};W.prototype.hasCurviness=function(){return!isNaN(this.Ov)||0!==this.hf&&!this.dc}; -W.prototype.adjustPoints=function(a,b,c,d){var e=this.es;if(this.dc){if(e===Vl)return!1;e===Wl&&(e=Ul)}switch(e){case Vl:var f=this.l(a),h=this.l(c);if(!f.L(b)||!h.L(d)){var e=f.x,f=f.y,k=h.x-e,l=h.y-f,m=Math.sqrt(k*k+l*l);if(!K.D(m,0)){var n=0;K.D(k,0)?n=0>l?-Math.PI/2:Math.PI/2:(n=Math.atan(l/Math.abs(k)),0>k&&(n=Math.PI-n));var h=b.x,p=b.y,l=d.x-h,q=d.y-p,r=Math.sqrt(l*l+q*q),k=0;K.D(l,0)?k=0>q?-Math.PI/2:Math.PI/2:(k=Math.atan(q/Math.abs(l)),0>l&&(k=Math.PI-k));m=r/m;n=k-n;this.yf(a,b);for(a+= -1;al?-Math.PI/2:Math.PI/2:(q=Math.atan(l/Math.abs(k)),0>k&&(q=Math.PI-q)),k=q+n,b*=m,this.V(a,h+b*Math.cos(k),p+b*Math.sin(k)));this.yf(c,d)}}return!0;case Wl:f=this.l(a);p=this.l(c);if(!f.L(b)||!p.L(d)){var e=f.x,f=f.y,h=p.x,p=p.y,m=(h-e)*(h-e)+(p-f)*(p-f),k=b.x,n=b.y,l=d.x,q=d.y,r=0,s=1,r=0!==l-k?(q-n)/(l-k):9E9;0!==r&&(s=Math.sqrt(1+1/(r*r)));this.yf(a,b);for(a+=1;ab?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=-45<=d&&45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.ba.copy(),k=f.ba.copy();if(h.J()&&k.J()){h.Jf(8,8);k.Jf(8,8);h.Oi(a);k.Oi(c);var l,m;if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l=new w(c.x,a.y),m=new w(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.Aa(a)||h.Aa(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l=new w(Math.max((a.x+c.x)/2,a.x),a.y),m=new w(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,k.right,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.left,m.x=l.x,m.y=c.y):180===d&&a.x>k.right&&a.y>k.top&&a.yh.bottom)0===d&&(k.Aa(a)||h.Aa(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.ya.y&&(0===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=a.x||a.x>=k.left&&a.x<=c.x){if(90===d||270===d)l=new w(Math.min((a.x+c.x)/2,a.x),a.y),m=new w(l.x,c.y)}else l.y=270=== -d||(0===d||180===d)&&c.ya.y||180===d&&c.xa.y||0===d&&c.x>a.x&&k.bottom>a.y)l=new w(a.x,c.y),m=new w((a.x+c.x)/2,c.y),270===d?(l.y=this.computeMidOrthoPosition(a.y,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.xa.x?(l.y=a.yk.right)? -this.computeMidOrthoPosition(a.y,c.y,!0):k.bottom,m.x=c.x,m.y=l.y):90===d&&a.yk.left&&a.xh.right)270===d&&(k.Aa(a)||h.Aa(c))?l.x=this.computeMidOrthoPosition(a.x,c.x,!1):c.xa.x&&(270===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right, -Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=h.top&&c.y<=a.y||a.y<=k.bottom&&a.y>=c.y){if(0===d||180===d)l=new w(a.x,Math.max((a.y+c.y)/2,a.y)),m=new w(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.y,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.y,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.Aa(a)||h.Aa(c))?l.x=this.computeMidOrthoPosition(a.x, -c.x,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l=new w(a.x,Math.min((a.y+c.y)/2,a.y)),m=new w(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.xk&&0!==Jo(e,c.x,c.y)){Ko(this,e,c.x,c.y,d,!0);d=this.l(2);if(4>this.ka)0===b||180===b?(d.x=a.x,d.y=c.y):(d.x=c.x,d.y=a.y),this.V(2,d.x,d.y),this.w(3,d.x,d.y);else if(c=this.l(3),0===b|| -180===b)K.D(d.x,c.x)?(b=0===b?Math.max(d.x,a.x):Math.min(d.x,a.x),this.V(2,b,a.y),this.V(3,b,c.y)):K.D(d.y,c.y)?(Math.abs(a.y-d.y)<=e.po/2&&(this.V(2,d.x,a.y),this.V(3,c.x,a.y)),this.w(2,d.x,a.y)):this.V(2,a.x,d.y);else if(90===b||270===b)K.D(d.y,c.y)?(b=90===b?Math.max(d.y,a.y):Math.min(d.y,a.y),this.V(2,a.x,b),this.V(3,c.x,b)):K.D(d.x,c.x)?(Math.abs(a.x-d.x)<=e.ro/2&&(this.V(2,a.x,d.y),this.V(3,a.x,c.y)),this.w(2,a.x,d.y)):this.V(2,d.x,a.y);a=!0}else a=!1}else a=!1;a||(this.Jh(l),this.Jh(m))}}; -W.prototype.computeMidOrthoPosition=function(a,b){if(this.hasCurviness()){var c=this.computeCurviness();return(a+b)/2+c}return(a+b)/2};function gg(a){if(!a.el)return!1;var b=a.points.n,c=b.length;if(4>c)return!1;a=Lk(a.g,!0,a.Ra,null);for(var d=1;da){var b=new $c(ad),c=new bd(0,0);b.ub.add(c);return b}var d=!1,b=this.g;null!==b&&0!==b.ha.Le&&xo(this)&&(d=!0);var c=b=0,e=this.l(0).copy(),f=e.copy(),b=this.Qc.n,h=this.computeCurve();if(h===kh&&3<=a&&!K.mb(this.gp,0))if(3===a)var k=this.l(1),b=Math.min(e.x,k.x),c=Math.min(e.y,k.y),k=this.l(2),b=Math.min(b,k.x),c=Math.min(c,k.y);else{if(this.dc)for(k=0;k=a&& -(k=a-1),b=this.l(k),f.x=Math.min(b.x,f.x),f.y=Math.min(b.y,f.y);b=f.x;c=f.y}else{for(k=0;kx?r>q?(t.x=B-C,t.y=q-C,v.x=B+s,v.y=q+s):(t.x= -B-C,t.y=q+C,v.x=B+s,v.y=q-s):r>q?(t.x=B+C,t.y=q-C,v.x=B-s,v.y=q+s):(t.x=B+C,t.y=q+C,v.x=B-s,v.y=q-s));K.mb(x,B)&&K.mb(q,r)&&(q>p?(y>B?(t.x=B-C,t.y=q-C,v.x=B+s):(t.x=B+C,t.y=q-C,v.x=B-s),v.y=q+s):(y>B?(t.x=B-C,t.y=q+C,v.x=B+s):(t.x=B+C,t.y=q+C,v.x=B-s),v.y=q-s));if(K.mb(x,B)&&K.mb(B,y)||K.mb(p,q)&&K.mb(q,r))x=.5*(x+y),p=.5*(p+r),t.x=x,t.y=p,v.x=x,v.y=p;1===k?(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y)):2===k&&K.mb(d.x,this.l(0).x)&&K.mb(d.y,this.l(0).y)&&(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y));O(l,e.x-b,e.y-c, -h.x-b,h.y-c,m.x-b,m.y-c);f.set(h);e.set(a);d=m}}k=d.x;d=d.y;f=this.l(this.ka-1);k=.5*(k+f.x);d=.5*(d+f.y);O(l,a.x-b,a.y-c,k-b,d-c,f.x-b,f.y-c)}else for(k=3;k=a&&(k=a-1),f=this.l(k-1),e=this.l(k),k===a-1&&0!==Ho(this)&&(e=e.copy(),Lo(this,e,!1,K.Wj)),O(l,d.x-b,d.y-c,f.x-b,f.y-c,e.x-b,e.y-c);else{f=u.K();f.assign(this.l(0));for(k=1;k=a-1){f!==t&&(0!==Ho(this)&&(t=t.copy(),Lo(this,t,!1,K.Wj)),Oo(this,l,-b,-c,f,t,d));break}k=Mo(this,t, -k+1,kn.x?t.x-s:t.x+s,C=v.y>t.y?t.y+B:t.y-B,Oo(this,e,h,m,n,new w(q,y),p),td(e,t.x+h,t.y+m,r+h,C+m),x.m(r,C))):K.D(n.x,t.x)&&K.D(t.y,v.y)?(s=this.computeCorner(),B=Math.min(s,Math.abs(t.y-n.y)/2),B=s=Math.min(B,Math.abs(v.x-t.x)/2),K.D(s,0)?(Oo(this,e,h,m,n,t,p),x.assign(t)): -(q=t.x,C=y=t.y,y=t.y>n.y?t.y-B:t.y+B,r=v.x>t.x?t.x+s:t.x-s,Oo(this,e,h,m,n,new w(q,y),p),td(e,t.x+h,t.y+m,r+h,C+m),x.m(r,C))):(Oo(this,e,h,m,n,t,p),x.assign(t))}u.v(f)}b=l.o;u.q(l)}return b};function No(a,b,c,d){a=c-a;if(isNaN(a)||Infinity===a||-Infinity===a)return NaN;0>a&&(a=-a);b=d-b;if(isNaN(b)||Infinity===b||-Infinity===b)return NaN;0>b&&(b=-b);return K.mb(a,0)?b:K.mb(b,0)?a:Math.sqrt(a*a+b*b)} -function Lo(a,b,c,d){var e=a.ka;if(!(2>e))if(c){var f=a.l(1);c=f.x-d.x;d=f.y-d.y;f=No(b.x,b.y,c,d);0!==f&&(e=2===e?.5*f:f,a=Go(a),a>e&&(a=e),c=a*(c-b.x)/f,a=a*(d-b.y)/f,b.x+=c,b.y+=a)}else f=a.l(e-2),c=f.x-d.x,d=f.y-d.y,f=No(b.x,b.y,c,d),0!==f&&(e=2===e?.5*f:f,a=Ho(a),a>e&&(a=e),c=a*(b.x-c)/f,a=a*(b.y-d)/f,b.x-=c,b.y-=a)} -function Mo(a,b,c,d){for(var e=a.ka,f=b;K.mb(b.x,f.x)&&K.mb(b.y,f.y);){if(c>=e)return e-1;f=a.l(c++)}if(!K.mb(b.x,f.x)&&!K.mb(b.y,f.y))return c-1;for(var h=f;K.mb(b.x,f.x)&&K.mb(f.x,h.x)&&(!d||(b.y>=f.y?f.y>=h.y:f.y<=h.y))||K.mb(b.y,f.y)&&K.mb(f.y,h.y)&&(!d||(b.x>=f.x?f.x>=h.x:f.x<=h.x));){if(c>=e)return e-1;h=a.l(c++)}return c-2} -function Oo(a,b,c,d,e,f,h){if(!h&&xo(a)){h=[];var k=0;a.Ea()&&(k=Po(a,e,f,h));var l=e.x,l=e.y;if(0p-10)m--,p=Math.max(q-5,f.x);else break;q=f.y-10+d;n=p+c;p=f.y+d;a.Ve===ch?M(b,n,p,!1,!1):O(b,l,q,n,q,n,p)}else if(K.D(e.x,f.x))if(e.yp-10)m--,p=Math.max(q-5,f.y);else break;q=f.x-10+c;n=f.x+c;p+=d;a.Ve===ch?M(b,n,p,!1,!1):O(b,q,l,q,p,n,p)}}b.lineTo(f.x+c,f.y+d)} -function Po(a,b,c,d){var e=a.g;if(null===e||b.L(c))return 0;for(e=e.mw;e.next();){var f=e.value;if(null!==f&&f.visible)for(var f=f.Db.n,h=f.length,k=0;kh.x&&n.x>m.x||m.xh.y&&n.y>m.y||m.yt&&Math.min(h,x)q&&!K.D(h,x)){n.x=t;n.y=q;n=!0;break a}}else if(!K.D(q,s)&&K.D(h,x)&&Math.min(q, -s)h&&Math.min(t,v)p&&!K.D(t,v)){n.x=p;n.y=h;n=!0;break a}n.x=0;n.y=0;n=!1}n&&(e?c.push(k.x):c.push(k.y));h=m}u.v(k)}u.u(W,{Bs:"firstPickIndex"},function(){return 2>=this.ka?0:this.dc||Ao(this)!==vb?1:0});u.u(W,{lw:"lastPickIndex"},function(){var a=this.ka;return 0===a?0:2>=a?a-1:this.dc||Bo(this)!==vb?a-2:a-1});function xo(a){a=a.Ve;return a===bh||a===ch}function zo(a,b){if(b||xo(a)){var c=a.g;null===c||c.El.contains(a)||null===a.py||c.El.add(a,a.py)}} -function eh(a,b){var c=a.layer;if(null!==c&&c.visible&&!c.Ac){var d=c.g;if(null!==d)for(var e=!1,d=d.mw;d.next();){var f=d.value;if(f.visible)if(f===c)for(var e=!0,h=!1,f=f.Db.n,k=f.length,l=0;lb.links.count)1===b.links.count&&(c=b.links.n[0],c.an=null,c.hf=0,c.Vb()),c=b.Uo,null!==b&&null!==c.nh&&c.nh.remove(b),c=b.at,null!==b&&null!==c.nh&&c.nh.remove(b);else for(c=Math.abs(c),a=0===c%2,b=b.links.i;b.next();){var d=b.value,e=Math.abs(d.hf),f=0===e%2;e>c&&a===f&&(d.hf=0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.ag=Math.floor((a.x-this.ge)/this.ge)*this.ge;this.bg=Math.floor((b-this.he)/this.he)*this.he;this.Iq=Math.ceil((c+2*this.ge)/this.ge)*this.ge;this.Jq=Math.ceil((d+2*this.he)/this.he)*this.he;a=1+(Math.ceil((this.Iq-this.ag)/this.ge)|0);b=1+(Math.ceil((this.Jq-this.bg)/this.he)|0);if(null===this.mc||this.hothis.Iq||a+cthis.Jq||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.ho)|0;for(c=Math.min(b+e-1,this.io)|0;a<=d;a++)for(e=b;e<=c;e++)if(0===this.mc[a][e])return!1;return!0}; -function To(a,b,c,d,e,f,h,k,l){if(!(bh||cl)){var m,n;m=b|0;n=c|0;var p=a.mc[m][n];if(1<=p&&999999>p)for(e?n+=d:m+=d,p+=1;f<=m&&m<=h&&k<=n&&n<=l&&!(p>=a.mc[m][n]);)a.mc[m][n]=p,p+=1,e?n+=d:m+=d;m=e?n:m;if(e)if(0m;c+=d)To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h,k,l);else if(0m;b+=d)To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h, -k,l)}}function Uo(a,b,c,d,e,f,h,k,l,m,n){for(var p=b|0,q=c|0,r=a.mc[p][q];0===r&&p>k&&pm&&q=Math.abs(p-d)&&1>=Math.abs(q-e))return a.abort=!0,0;p=b|0;q=c|0;r=a.mc[p][q];b=1;for(a.mc[p][q]=b;0===r&&p>k&&pm&&q=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;b=f.y;d=f.x+f.width;var p=f.y+f.height,n=n-a.ag,n=n/a.ge;b-=a.bg;b/=a.he;d-=a.ag;d/=a.ge;p-=a.bg;p/=a.he;f=Math.max(0,Math.min(a.ho,n|0));d=Math.min(a.ho,Math.max(0,d|0));b=Math.max(0,Math.min(a.io,b|0));var p=Math.min(a.io,Math.max(0,p|0)),h=h|0,k=k|0,l=l|0, -m=m|0,n=h,q=k,r=0===c||90===c?1:-1;(c=90===c||270===c)?q=Uo(a,h,k,l,m,r,c,f,d,b,p):n=Uo(a,h,k,l,m,r,c,f,d,b,p);if(!a.abort){a:{c=0===e||90===e?1:-1;e=90===e||270===e;for(var r=l|0,s=m|0,t=a.mc[r][s];0===t&&r>f&&rb&&s=Math.abs(r-h)&&1>=Math.abs(s-k)){a.abort=!0;break a}r=l|0;s=m|0;t=a.mc[r][s];for(a.mc[r][s]=999999;0===t&&r>f&&rb&&s=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case u.Fc|u.Xc:return c>a&&c<=180+a?180:270;case u.Xc|u.Oc:return c>180-a&&c<=360-a?270:0;case u.Oc|u.Nc:return c>a&&c<=180+a?90:0;case u.Nc|u.Fc:return c>180-a&&c<=360-a?180:90;case u.Fc|u.Xc|u.Oc:return 90180+a&&c<=360- -a?270:0;case u.Xc|u.Oc|u.Nc:return 180a&&180>=c?90:0;case u.Oc|u.Nc|u.Fc:return c>a&&c<=180-a?90:c>180-a&&270>=c?180:0;case u.Nc|u.Fc|u.Xc:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&b!==(u.Fc|u.Xc|u.Oc|u.Nc)&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0} -function Fo(a,b){var c=a.wg;if(0===c.length){a:if(!a.To){c=a.To;a.To=!0;var d,e=null,f=a.Cc,f=f instanceof V?f:null;if(null===f||f.be)d=a.Cc.qD(a.port.Jd);else{if(!f.ba.J()){a.To=c;break a}e=f;d=e.pD()}var h=a.wg.length=0,k=a.port.lb(xb,u.K()),l=a.port.lb(Vb,u.K()),f=u.Vj(k.x,k.y,0,0);f.Oi(l);u.v(k);u.v(l);k=u.fc(f.x+f.width/2,f.y+f.height/2);for(d=d.i;d.next();)if(l=d.value,l.Ea()){var m=vb,n=l.od===a.port||l.W.Ph(e),m=n?Ao(l,a.port):Bo(l,a.port);if(m.Go()&&(n=n?l.fe:l.od,null!==n)){var p=n.T;if(null!== -p){var n=l.computeOtherPoint(p,n),p=k.Fi(n),m=Vo(f,m,p,l.dc),q=0;0===m?(q=u.Oc,180Math.abs(H)?(y=Math.abs(H)/ -q,q=Math.abs(H)):y=1;break;case u.Fc:r>Math.abs(I)?(y=Math.abs(I)/r,r=Math.abs(I)):y=1;break;case u.Xc:n>Math.abs(H)?(y=Math.abs(H)/n,n=Math.abs(H)):y=1;break;default:case u.Oc:p>Math.abs(I)?(y=Math.abs(I)/p,p=Math.abs(I)):y=1}B=0}var T=t.Lo;if(e===$n){v=t.link.computeThickness();v*=y;T.set(C);switch(x){case u.Nc:T.x=C.x+H/2+q/2-B-v/2;break;case u.Fc:T.y=C.y+I/2+r/2-B-v/2;break;case u.Xc:T.x=C.x+H/2-n/2+B+v/2;break;default:case u.Oc:T.y=C.y+I/2-p/2+B+v/2}B+=v}else v=.5,e===Xn&&(v=(t.Do+1)/(t.vm+1)), -T.x=C.x+H*v,T.y=C.y+I*v}u.v(k);u.v(d);u.v(l);u.v(m);C=a.wg;for(H=0;Hb.ee?1:a.angleb.angle?1:0}; -Eo.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.Cc,this.port,vb,b.od===this.port),d=a.Do;if(0>d)return c;var e=a.vm;if(1>=e||!b.dc)return c;var b=a.tw,f=a.Lo;if(a.ee===u.Fc||a.ee===u.Nc)d=e-1-d;return((a=a.ee===u.Fc||a.ee===u.Oc)?b.ye&&(e=k.right);k.bottom>f&&(f=k.bottom)}}isFinite(c)&&isFinite(d)?a.m(c,d,e-c,f-d):(b=b.location,c=this.padding,a.m(b.x+c.left,b.y+c.top,0,0));return a}; -u.defineProperty(ph,{padding:"padding"},function(){return this.Pe},function(a){"number"===typeof a?((isNaN(a)||0>a)&&u.wa(a,">= 0",ph,"padding"),a=new rb(a)):(u.C(a,rb,ph,"padding"),(isNaN(a.left)||0>a.left)&&u.wa(a.left,">= 0",ph,"padding:value.left"),(isNaN(a.right)||0>a.right)&&u.wa(a.right,">= 0",ph,"padding:value.right"),(isNaN(a.top)||0>a.top)&&u.wa(a.top,">= 0",ph,"padding:value.top"),(isNaN(a.bottom)||0>a.bottom)&&u.wa(a.bottom,">= 0",ph,"padding:value.bottom"));var b=this.Pe;b.L(a)||(this.Pe= -a=a.Z(),this.h("padding",b,a))});function Je(){0=c-1?(h=0,e=d,f+=k+20,k=0):h++}null!==a&&a.Wd("Layout")}this.vf=!0};Je.prototype.Gz=function(a){return!a.location.J()||a instanceof V&&a.jy?!0:!1}; -function Zo(a,b,c,d,e,f,h,k){for(c=c.i;c.next();){var l=c.value;d&&!l.Ho||null!==e&&!e(l)||!l.canLayout()||(f&&l instanceof U?l.tf||(l instanceof V?null===l.Qb?Zo(a,b,l.Mc,!1,e,f,h,k):b.add(l):b.add(l)):h&&l instanceof W?b.add(l):!k||!l.Fd()||l instanceof U||b.add(l))}} -Je.prototype.collectParts=function(a){var b=new F(G);a instanceof D?(Zo(this,b,a.yg,!0,null,!0,!0,!0),Zo(this,b,a.links,!0,null,!0,!0,!0),Zo(this,b,a.Sj,!0,null,!0,!0,!0)):a instanceof V?Zo(this,b,a.Mc,!1,null,!0,!0,!0):Zo(this,b,a.i,!1,null,!0,!0,!0);return b};u.defineProperty(Je,{Ud:"arrangementOrigin"},function(){return this.wp},function(a){u.C(a,w,Je,"arrangementOrigin");this.wp.L(a)||(this.wp.assign(a),this.H())}); -Je.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.lb(xb),(isNaN(c.x)||isNaN(c.y))&&c.set(a),c.x+=b.padding.left,c.y+=b.padding.top);return c}return a};function xa(){u.gc(this);this.Nd=null;this.clear()}u.fa("LayoutNetwork",xa); -xa.prototype.clear=function(){if(this.vertexes)for(var a=this.vertexes.i;a.next();){var b=a.value;b.clear();b.network=null}if(this.edges)for(a=this.edges.i;a.next();)b=a.value,b.clear(),b.network=null;this.vertexes=new F(ya);this.edges=new F(Aa);this.Kz=new la(U,ya);this.yz=new la(W,Aa)}; -xa.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.Qb?"("+this.Qb.toString()+")":"");if(0>=a)return b;b+=" vertexes: "+this.vertexes.count+" edges: "+this.edges.count;if(1d?1:0):1:null!==d?-1:0}; -ya.smartComparer=function(a,b){if(null!==a){if(null!==b){var c=a.kd,d=b.kd;if(null!==c){if(null!==d){for(var c=c.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=d.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e=f&&0>=h&&(f=1);c=this.spacing.width;isFinite(c)||(c=0);a=this.spacing.height;isFinite(a)||(a=0);null!==b&&b.Wb("Layout");d=[];switch(this.alignment){case fm:var k= -c,l=a,m=Math.max(this.qo.width,1);if(!isFinite(m))for(var n=m=0;nf-1|| -0h)d.push(new z(0,x,h+k,y)),B=0,v=t,x+=y,y=0;y=Math.max(y,I);I=0;switch(s){case dm:I=-q.width;break;default:I=0}p.moveTo(v+I,x);switch(s){case dm:v-=C;break;default:v+=C}B++}d.push(new z(0,x,h+k,y));break;case em:k=f;l=c;m=a;n=Math.max(this.qo.width,1);p=x=C=0;q=u.K();for(f=0;f=C&&(h-=C);for(var C=I=0,H=Math.max(this.qo.height,1),aa=p=0,R=!0,N=u.K(),f=0;fk-1||0h){d.push(new z(0,R?B-p:B,h+l,aa+p+m));for(T=0;TC&&(e.width+=e.x-C,e.x=C)}for(k=f=h=e=0;kd?1:0}; -Xk.smartComparer=function(a,b){if(null!==a){if(null!==b){for(var c=a.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=b.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e=a.count)1===a.count&&(a=a.first(),a.Ja=0,a.Ua=0);else{var b=new E(hp);b.Td(a.i);a=new E(hp);var c=new E(hp),d;d=this.sort(b);var e=this.Fx,f=this.eB,h=this.td,k=this.rn,l=this.Gx,m=this.Sp,b=this.mk,n=this.yC,p=this.jg,q=this.Vt,e=this.Gf,f=this.qw,h=this.OH;if(!isFinite(h)|| -0>=h)h=NaN;k=this.QF;if(!isFinite(k)||0>=k)k=1;l=this.Je;isFinite(l)||(l=0);m=this.Qf;if(!isFinite(m)||360m)m=360;b=this.spacing;isFinite(b)||(b=NaN);e===Am&&f===Bm?e=zm:e===Am&&f!==Bm&&(f=Bm,e=this.Gf);if((this.direction===mm||this.direction===nm)&&this.sorting!==lm){for(var r=0;!(r>=d.length);r+=2){a.add(d.ja(r));if(r+1>=d.length)break;c.add(d.ja(r+1))}this.direction===mm?(this.Gf===Am&&a.reverse(),d=new E(hp),d.Td(a),d.Td(c)):(this.Gf===Am&&c.reverse(),d=new E(hp),d.Td(c),d.Td(a))}for(var s= -d.length,t=n=0,r=0;rm&&(0===r||r===d.length-1)&&(v/=2);n+=v;t++}if(isNaN(h)||e===Am){isNaN(b)&&(b=6);if(e!==zm&&e!==Am){v=-Infinity;for(r=0;rh?(h=r,p=h*k):q=t/(360<=m?s:s-1)}this.Fx=e;this.eB=f;this.td=h;this.rn=k;this.Gx=l;this.Sp=m;this.mk=b;this.yC=n;this.jg=p;this.Vt=q;b=d;d=this.Fx;e=this.td;f=this.Gx;k=this.Sp;l=this.mk;m=this.jg;n=this.Vt;if(this.direction!==mm&&this.direction!==nm||d!==Am)if(this.direction===mm||this.direction===nm){h=0;switch(d){case ym:h=180*lp(this,e,m,f,n)/Math.PI;break;case zm:n=b=0;h=a.first();null!==h&&(b=ip(h,Math.PI/2));h=c.first();null!==h&&(n=ip(h,Math.PI/2));h=180*lp(this,e,m,f,l+(b+ -n)/2)/Math.PI;break;case xm:h=k/b.length}if(this.direction===mm){switch(d){case ym:mp(this,a,f,wm);break;case zm:np(this,a,f,wm);break;case xm:op(this,a,k/2,f,wm)}switch(d){case ym:mp(this,c,f+h,om);break;case zm:np(this,c,f+h,om);break;case xm:op(this,c,k/2,f+h,om)}}else{switch(d){case ym:mp(this,c,f,wm);break;case zm:np(this,c,f,wm);break;case xm:op(this,c,k/2,f,wm)}switch(d){case ym:mp(this,a,f+h,om);break;case zm:np(this,a,f+h,om);break;case xm:op(this,a,k/2,f+h,om)}}}else switch(d){case ym:mp(this, -b,f,this.direction);break;case zm:np(this,b,f,this.direction);break;case xm:op(this,b,k,f,this.direction);break;case Am:pp(this,b,k,f,this.direction)}else pp(this,b,k,f-k/2,om)}this.updateParts();this.network=null;this.vf=!0}; -function op(a,b,c,d,e){var f=a.Sp,h=a.td;a=a.jg;d=d*Math.PI/180;c=c*Math.PI/180;for(var k=b.length,l=0;lc){for(f=d+(e===om?f:-f);0>f;)f+=360;f%=360;180=n.length-1)break;sp(a,l,m,n,p,e,f)||tp(a,l,m,n,p,e,f);l=f.x;m=f.y}u.v(f);a.Vl++;if(!(23Math.abs(r)?Math.abs(l-f)<(n[0].width+n[n.length-1].width)/2&&(h=0):h=0Math.abs(q)?0:q;q=!1;q=Math.abs(f)>Math.abs(p)?0p:0a.Vl?a.td-h/(2*Math.PI):5>n.length&&10=p.length-1)break;sp(a,l,m,p,q,e,n)||tp(a,l,m,p,q,e,n);l=n.x;m=n.y}u.v(n);a.Vl++;if(!(23a.Vl?a.td-f/(2*Math.PI):a.td-(0k){m=b-a;if(m<-k)return h.x=m,h.y=n,!1;p=!0}}else if(m=b-a,m<-k){m=b+a;if(m>k)return h.x=m,h.y=n,!1;p=!0}n=Math.sqrt(1-Math.min(1,m*m/(k*k)))*l;0>c!==p&&(n=-n);if(Math.abs(c-n)>(d[e].height+d[e+1].height)/2)return h.x=m,h.y=n,!1;h.x=m;h.y=n;return!0} -function tp(a,b,c,d,e,f,h){var k=a.td,l=a.jg,m=0,n=0;a=(d[e].height+d[e+1].height)/2+a.mk;d=!1;if(0<=b!==(f===om)){if(n=c-a,n<-l){n=c+a;if(n>l){h.x=m;h.y=n;return}d=!0}}else if(n=c+a,n>l){n=c-a;if(n<-l){h.x=m;h.y=n;return}d=!0}m=Math.sqrt(1-Math.min(1,n*n/(l*l)))*k;0>b!==d&&(m=-m);h.x=m;h.y=n}gm.prototype.commitLayout=function(){this.commitNodes();this.Qs&&this.commitLinks()}; -gm.prototype.commitNodes=function(){for(var a=this.IF,b=this.network.vertexes.i;b.next();){var c=b.value;c.x+=a.x;c.y+=a.y;c.commit()}};gm.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()}; -function kp(a,b,c,d,e){var f=a.zF;if(.001>Math.abs(a.rn-1))return void 0!==d&&void 0!==e?e*b:2*Math.PI*b;a=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c;for(var h=0,k=0,k=void 0!==d&&void 0!==e?e/(f+1):Math.PI/(2*(f+1)),l=0,m=0;m<=f;m++)l=void 0!==d&&void 0!==e?d+m*e/f:m*Math.PI/(2*f),l=Math.sin(l),h+=Math.sqrt(1-a*a*l*l)*k;return void 0!==d&&void 0!==e?(b>c?b:c)*h:4*(b>c?b:c)*h}function jp(a,b,c,d,e){var f=0,f=void 0!==d&&void 0!==e?kp(a,1,c,d,e):kp(a,1,c);return b/f} -function lp(a,b,c,d,e){if(.001>Math.abs(a.rn-1))return e/b;var f=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c,h=0;a=2*Math.PI/(700*a.network.vertexes.count);b>c&&(d+=Math.PI/2);for(var k=0;;k++){var l=Math.sin(d+k*a),h=h+(b>c?b:c)*Math.sqrt(1-f*f*l*l)*a;if(h>=e)return k*a}} -gm.prototype.sort=function(a){switch(this.sorting){case jm:break;case km:a.reverse();break;case hm:a.sort(this.comparer);break;case im:a.sort(this.comparer);a.reverse();break;case lm:for(var b=[],c=0;ce&&(e=k,f=h)}else for(h=0;he&&(e=k,f=h);d.add(a.ja(f));b[f]=-1;f=a.ja(f);e=0;for(h=f.kc;h.next();)e=a.indexOf(h.value.fromVertex),0>e||0<=b[e]&& -b[e]++;for(f=f.bc;f.next();)e=a.indexOf(f.value.toVertex),0>e||0<=b[e]&&b[e]++}a=[];for(b=0;ba[b].indexOf(l)&&a[b].push(l);for(c=h.kc;c.next();)l=d.indexOf(c.value.fromVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l)}h=[];for(b=0;ba[c[p]].indexOf(c[p===c.length-1?0:p+1])&&t.push(p===c.length-1?0:p+1);if(0===t.length)for(p=0;pI.indexOf(R)||NI.indexOf(R)||N< -y[R]&&y[R]=v?l+1:l)),B+=l=v&&l++,C>=v&&C++,l>C&&(I=C,C=l,l=I),C-l<(c.length+2)/2===(lq||q===l||(s=q>l?q-l:l-q,p+=qm-s?1:-1);c.splice(0>p?l:l+1,0,b);e.splice(h,1);h--}else k=!1;if(k)break;else c.push(e[0]),e.splice(0,1)}for(b=0;b=a?a:360,this.H())}); -u.defineProperty(gm,{Gf:"arrangement"},function(){return this.Yc},function(a){this.Yc!==a&&(u.rb(a,gm,gm,"arrangement"),a===Am||a===zm||a===ym||a===xm)&&(this.Yc=a,this.H())});u.defineProperty(gm,{direction:"direction"},function(){return this.la},function(a){this.la!==a&&(u.rb(a,gm,gm,"direction"),a===om||a===wm||a===mm||a===nm)&&(this.la=a,this.H())}); -u.defineProperty(gm,{sorting:"sorting"},function(){return this.Fh},function(a){this.Fh!==a&&(u.rb(a,gm,gm,"sorting"),a===jm||a===km||a===hm||im||a===lm)&&(this.Fh=a,this.H())});u.defineProperty(gm,{comparer:"comparer"},function(){return this.ph},function(a){this.ph!==a&&(u.j(a,"function",gm,"comparer"),this.ph=a,this.H())});u.defineProperty(gm,{spacing:"spacing"},function(){return this.Gh},function(a){this.Gh!==a&&(u.j(a,"number",gm,"spacing"),this.Gh=a,this.H())}); -u.defineProperty(gm,{qw:"nodeDiameterFormula"},function(){return this.Zq},function(a){this.Zq!==a&&(u.rb(a,gm,gm,"nodeDiameterFormula"),a===Cm||a===Bm)&&(this.Zq=a,this.H())});u.u(gm,{JF:"actualXRadius"},function(){return this.td});u.u(gm,{KF:"actualYRadius"},function(){return this.jg});u.u(gm,{FI:"actualSpacing"},function(){return this.mk});u.u(gm,{IF:"actualCenter"},function(){return isNaN(this.Ud.x)||isNaN(this.Ud.y)?new w(0,0):new w(this.Ud.x+this.JF,this.Ud.y+this.KF)});var zm; -gm.ConstantSpacing=zm=u.s(gm,"ConstantSpacing",0);var ym;gm.ConstantDistance=ym=u.s(gm,"ConstantDistance",1);var xm;gm.ConstantAngle=xm=u.s(gm,"ConstantAngle",2);var Am;gm.Packed=Am=u.s(gm,"Packed",3);var om;gm.Clockwise=om=u.s(gm,"Clockwise",4);var wm;gm.Counterclockwise=wm=u.s(gm,"Counterclockwise",5);var mm;gm.BidirectionalLeft=mm=u.s(gm,"BidirectionalLeft",6);var nm;gm.BidirectionalRight=nm=u.s(gm,"BidirectionalRight",7);var jm;gm.Forwards=jm=u.s(gm,"Forwards",8);var km; -gm.Reverse=km=u.s(gm,"Reverse",9);var hm;gm.Ascending=hm=u.s(gm,"Ascending",10);var im;gm.Descending=im=u.s(gm,"Descending",11);var lm;gm.Optimized=lm=u.s(gm,"Optimized",12);var Cm;gm.Pythagorean=Cm=u.s(gm,"Pythagorean",13);var Bm;gm.Circular=Bm=u.s(gm,"Circular",14);function fp(){this.Ao=-Infinity;this.lp=this.Qm=null} -fp.prototype.compare=function(a,b){if(0this.Ao||Math.abs(a)a&&0f?(e=n.x+n.width/2,k=n.y+n.height/2,l[0]=new w(n.x+n.width+d.width,n.y),l[1]=new w(n.x,n.y+n.height+d.height),f=2):(p=yp(l,f,e,k,n.width,n.height,d),q=l[p],r=new w(q.x+n.width+d.width, -q.y),s=new w(q.x,q.y+n.height+d.height),p+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().kb,d=this.network.vertexes.i;d.next();){if(d.value.kb.sg(c)&&(a++,2a.network.vertexes.count)return!1;null===a.ig?a.ig=new E(Dp):a.ig.clear();a.ig.Td(a.network.vertexes);var c=a.ig;c.sort(function(a,b){return null===a||null===b||a===b?0:b.Of-a.Of});for(var d=c.count-1;0<=d&&1>=c.ja(d).Of;)d--;return 1=h))){for(var m=0,n=0,p=l.count-h;ps&&(s=1);m=K.sqrt((m+s+n*n*4/(h*h))/s);h=(m-1)*p/2;m=(m-1)*q/2;f.kb=new z(l-r.x-h,k-r.y-m,p+2*h,q+2*m);f.focus=new w(r.x+h,r.y+m)}a.network=d;return c}function Cp(a,b){for(var c=a.network.vertexes.i;c.next();){var d=c.value;d.network=b;if(null!==d.hh){var e=d.hh.ja(d.Yz);d.Of=e.Sw;var f=e.qA,h=e.rA;d.kb=new z(d.Ja-f,d.Ua-h,e.Vw,e.Rw);d.focus=new w(f,h);d.Yz--}}for(c=a.network.edges.i;c.next();)c.value.network=b;a.network=b} -function Ep(a,b){var c=b.rm;if(null!==c&&0!==c.count){var d=b.Ja,e=b.Ua,f=b.width,h=b.height;null!==b.hh&&0=p.Of?l++:(k=!0,m++,h+=Math.atan2(b.Ua-p.Ua,b.Ja-p.Ja))}if(0!==l)for(0>1)+n)*(0===k%2?1:-1);l.Ja=d+p*Math.cos(q);l.Ua=e+p*Math.sin(q);k++}}}function yp(a,b,c,d,e,f,h){var k=9E19,l=-1,m=0;a:for(;mn.y&&a[q].x-n.xn.x&&a[q].y-n.yl+h?(d=d+f-k,e=e-l-h,K.sqrt(d*d+e*e)):e+ck+m?e>l+h?(d=d-k-m,e=e-l-h,K.sqrt(d*d+e*e)):e+cl+h?e-(l+h):e+c=b.length)return!1;var c=b[0];c.forceX=0;c.forceY=0;for(var d=c.Ja,e=d,f=c.Ua,h=f,c=1;ch-f)?b.sort(function(a,b){return null===a||null===b||a===b?0:a.Ja-b.Ja}):b.sort(function(a,b){return null===a||null===b||a===b?0:a.Ua-b.Ua});for(var h=a.yh,m=0,n=0,p=0,c=0;ch||p-d>h){if(f)break}else if(l-r>h||r-l>h){if(!f)break}else{var s=Gp(k,e);1>s?(n=a.xw,null===n&&(a.xw=n=new Ga(0)),m=n.random(),s=n.random(),d>p?(n=Math.abs(e.aa.right-k.aa.x),n=(1+n)*m):dr?(p=Math.abs(e.aa.bottom-k.aa.y),p=(1+p)*s):ds?(n=a.xw,null===n&&(a.xw=n=new Ga(0)), -m=n.random(),s=n.random(),n=(d>p?1:-1)*(1+(e.width>k.width)?e.width:k.width)*m,p=(l>r?1:-1)*(1+(e.height>k.height)?e.height:k.height)*s):(m=f.stiffness*(s-f.length),n=(p-d)/s*m,p=(r-l)/s*m),k.forceX+=n,k.forceY+=p,e.forceX-=n,e.forceY-=p;c=0;d=Math.max(a.yh/20,50);for(e=0;ed&&(f=d),h<-d?h=-d:h>d&&(h=d),k.Ja+=f,k.Ua+=h,c=Math.max(c,f*f+h*h));return c>a.oD*a.oD}vp.prototype.moveFixedVertex=function(){}; -vp.prototype.commitLayout=function(){this.cA();this.commitNodes();this.Qs&&this.commitLinks()};vp.prototype.cA=function(){if(this.fp)for(var a=this.network.edges.i;a.next();){var b=a.value.link;null!==b&&(b.vb=uc,b.xb=uc)}};vp.prototype.commitNodes=function(){var a=0,b=0;if(this.PF){var c=u.Sf();this.kg(this.network,c);b=this.Ud;a=b.x-c.x;b=b.y-c.y;u.ic(c)}for(var c=u.Sf(),d=this.network.vertexes.i;d.next();){var e=d.value;if(0!==a||0!==b)c.assign(e.kb),c.x+=a,c.y+=b,e.kb=c;e.commit()}u.ic(c)}; -vp.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()};vp.prototype.springStiffness=function(a){a=a.stiffness;return isNaN(a)?this.mn:a};vp.prototype.springLength=function(a){a=a.length;return isNaN(a)?this.ln:a};vp.prototype.electricalCharge=function(a){a=a.charge;return isNaN(a)?this.hn:a};vp.prototype.electricalFieldX=function(){return 0};vp.prototype.electricalFieldY=function(){return 0}; -vp.prototype.gravitationalMass=function(a){a=a.mass;return isNaN(a)?this.kn:a};vp.prototype.gravitationalFieldX=function(){return 0};vp.prototype.gravitationalFieldY=function(){return 0};vp.prototype.isFixed=function(a){return a.isFixed};u.u(vp,{gJ:"currentIteration"},function(){return this.vq});u.defineProperty(vp,{QC:"arrangementSpacing"},function(){return this.Uf},function(a){u.C(a,ia,vp,"arrangementSpacing");this.Uf.L(a)||(this.Uf.assign(a),this.H())}); -u.defineProperty(vp,{PF:"arrangesToOrigin"},function(){return this.xp},function(a){this.xp!==a&&(u.j(a,"boolean",vp,"arrangesToOrigin"),this.xp=a,this.H())});u.defineProperty(vp,{fp:"setsPortSpots"},function(){return this.Eh},function(a){this.Eh!==a&&(u.j(a,"boolean",vp,"setsPortSpots"),this.Eh=a,this.H())});u.defineProperty(vp,{comments:"comments"},function(){return this.oh},function(a){this.oh!==a&&(u.j(a,"boolean",vp,"comments"),this.oh=a,this.H())}); -u.defineProperty(vp,{Az:"maxIterations"},function(){return this.On},function(a){this.On!==a&&(u.j(a,"number",vp,"maxIterations"),0<=a&&(this.On=a,this.H()))});u.defineProperty(vp,{oD:"epsilonDistance"},function(){return this.Up},function(a){this.Up!==a&&(u.j(a,"number",vp,"epsilonDistance"),0b.toVertex.index&&(this.network.yw(b),b.rev=!0);break;case Op:for(b=this.network.vertexes.i;b.next();)a=b.value,a.wo=-1,a.finish=-1;for(a=this.network.edges.i;a.next();)a.value.forest=!1;this.Uq=0;for(b.reset();b.next();)c=b.value,0===c.kc.count&&aq(this,c);for(b.reset();b.next();)c=b.value,-1===c.wo&&aq(this,c);for(a.reset();a.next();)b=a.value,b.forest||(c=b.fromVertex, -d=c.finish,e=b.toVertex,f=e.finish,e.wos&&0s&&0b[this.Cf]&&(this.Fu=b[c]-1,this.Cf=c),b[c]h)for(var p=h+1;pn;p--)l=d[p],l.near===m&&l.om===m.om||k++;var m=0,q,r=q=p=l=0,s,t=0,v=0;s=0;var x;if(0<=c)for(n=d[h].Ie,m=0;mt||l===t&&q>s)&&k++,vl||t===l&&s>q)&&k++);if(0>=c)for(n=d[h].Ce,m=0;mt||l===t&&p>v)&&k++,sl||t===l&&v>p)&&k++);f[h*e+h]=k;for(n=h+1;n=c)for(k=d[h].Ce,x=d[n].Ce,m=0;m=c&&(l=k.Ie);var m=null;0<=c&&(m=k.Ce);var n=0,p=0,q=k.near;null!==q&&q.layer===k.layer&&(n+=q.column-1,p++);if(null!==l)for(q=0;q=c&&(l=k.Ie);var m=null;0<=c&&(m=k.Ce);var n=0,p=[],q=k.near;null!==q&&q.layer===k.layer&&(p[n]=q.column-1,n++);if(null!==l)for(q=0;q>1,f[h]=n&1?p[m]:p[m-1]+p[m]>>1)}eq(a,b,d);return f}function mq(a,b,c,d,e,f){if(b.component===d){b.component=c;var h=0,k=0;if(e)for(var l=b.bc;l.next();){var k=l.value,m=k.toVertex,h=b.layer-m.layer,k=a.linkMinLength(k);h===k&&mq(a,m,c,d,e,f)}if(f)for(l=b.kc;l.next();)k=l.value,m=k.fromVertex,h=m.layer-b.layer,k=a.linkMinLength(k),h===k&&mq(a,m,c,d,e,f)}} -function nq(a,b,c,d,e,f){if(b.component===d){b.component=c;if(e)for(var h=b.bc;h.next();)nq(a,h.value.toVertex,c,d,e,f);if(f)for(b=b.kc;b.next();)nq(a,b.value.fromVertex,c,d,e,f)}}function Yp(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid)return b}return null}function Zp(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.bc;d.next();)if(d.value.toVertex.valid){c=!1;break}if(c)return b}}return null} -function $p(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.kc;d.next();)if(d.value.fromVertex.valid){c=!1;break}if(c)return b}}return null}function aq(a,b){b.wo=a.Uq;a.Uq++;for(var c=b.bc;c.next();){var d=c.value,e=d.toVertex;-1===e.wo&&(d.forest=!0,aq(a,e))}b.finish=a.Uq;a.Uq++} -Yl.prototype.assignLayers=function(){switch(this.Mn){case oq:pq(this);break;case qq:for(var a=0,b=this.network.vertexes.i;b.next();)a=rq(this,b.value),this.jb=Math.max(a,this.jb);for(b.reset();b.next();)a=b.value,a.layer=this.jb-a.layer;break;default:case Sp:pq(this);for(b=this.network.vertexes.i;b.next();)b.value.valid=!1;for(b.reset();b.next();)a=b.value,0===a.kc.count&&sq(this,a);a=Infinity;for(b.reset();b.next();)a=Math.min(a,b.value.layer);this.jb=-1;for(b.reset();b.next();){var c=b.value;c.layer-= -a;this.jb=Math.max(this.jb,c.layer)}}};function pq(a){for(var b=a.network.vertexes.i;b.next();){var c=tq(a,b.value);a.jb=Math.max(c,a.jb)}}function tq(a,b){var c=0;if(-1===b.layer){for(var d=b.bc;d.next();)var e=d.value,f=e.toVertex,e=a.linkMinLength(e),c=Math.max(c,tq(a,f)+e);b.layer=c}else c=b.layer;return c}function rq(a,b){var c=0;if(-1===b.layer){for(var d=b.kc;d.next();)var e=d.value,f=e.fromVertex,e=a.linkMinLength(e),c=Math.max(c,rq(a,f)+e);b.layer=c}else c=b.layer;return c} -function sq(a,b){if(!b.valid){b.valid=!0;for(var c=b.bc;c.next();)sq(a,c.value.toVertex);for(c=a.network.vertexes.i;c.next();)c.value.component=-1;for(var d=b.Ie.n,e=d.length,f=0;fk&&mq(a,h.fromVertex,0,-1,!0,!1)}for(mq(a,b,1,-1,!0,!0);0!==b.component;){for(var k=0,d=Infinity,l=0,m=null,n=a.network.vertexes.i;n.next();){var p=n.value;if(1===p.component){for(var q=0,r=!1,s=p.Ie.n,e=s.length,f=0;fd)&&!p&&(k=m,d=n)}if(0>f){for(c.reset();c.next();)f=c.value,1===f.component&&(f.layer-=e);b.component=0}else k.component=0}}} -function cq(a,b,c){return 90===a.la?c&&!b.rev||!c&&b.rev?270:90:180===a.la?c&&!b.rev||!c&&b.rev?0:180:270===a.la?c&&!b.rev||!c&&b.rev?90:270:c&&!b.rev||!c&&b.rev?180:0} -Yl.prototype.initializeIndices=function(){switch(this.Bn){default:case uq:for(var a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;b.index=this.Ld[c];this.Ld[c]++}break;case Tp:a=this.network.vertexes.i;for(b=this.jb;0<=b;b--)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&vq(this,c);break;case wq:for(a=this.network.vertexes.i,b=0;b<=this.jb;b++)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&xq(this,c)}}; -function vq(a,b){var c=b.layer;b.index=a.Ld[c];a.Ld[c]++;for(var c=b.Ce.Ke(),d=!0;d;)for(var d=!1,e=0;eh.portFromColOffset&&(d=!0,c[e]=h,c[e+1]=f)}for(e=0;eh.portToColOffset&&(d=!0,c[e]=h,c[e+1]=f)}for(e=0;e=h;d--)f=zq(this,d,-1)||f;e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,1)||f;e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1, -d=h;d<=c;d++)f=zq(this,d,-1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this))}break;default:case Up:for(c=this.jb,h=0,k=a+1;(d=this.countCrossings())=h;d--)f=zq(this,d,-1)||f;e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,1)||f;e=this.countCrossings(); -e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,-1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this))}}hq(this,b)}; -function yq(a,b,c){var d=0,e=dq(a,b),f=a.Ld[b],h=lq(a,b,c);c=kq(a,b,c);for(d=0;df+1&&(q+=4*(B-f),r+=4*(B-(f+1)))}C=d[f].bc.i;for(C.reset();C.next();)if(y=C.value,y.valid&&y.toVertex.layer===b){y=y.toVertex;for(B=0;d[B]!==y;)B++;B===f+1&&(r+=1)}C=d[f+1].kc.i;for(C.reset();C.next();)if(y=C.value,y.valid&&y.fromVertex.layer===b){y=y.fromVertex;for(B=0;d[B]!==y;)B++;Bf+1&&(q+=4*(B-(f+1)),r+=4*(B-f))}C=d[f+1].bc.i;for(C.reset();C.next();)if(y=C.value, -y.valid&&y.toVertex.layer===b){y=y.toVertex;for(B=0;d[B]!==y;)B++;B===f&&(q+=1)}var B=y=0,C=h[d[f].index],I=k[d[f].index],H=h[d[f+1].index],T=k[d[f+1].index];-1!==C&&(y+=Math.abs(C-s),B+=Math.abs(C-x));-1!==I&&(y+=Math.abs(I-s),B+=Math.abs(I-x));-1!==H&&(y+=Math.abs(H-t),B+=Math.abs(H-v));-1!==T&&(y+=Math.abs(T-t),B+=Math.abs(T-v));if(r>1)+8*d;this.Hb*=8}if(0!==(this.oi&Dq))for(b=!0;b;){b=!1;for(a=this.Cf+1;a<=this.jb;a++)b=Eq(this,a,1)||b; -for(a=this.Cf-1;0<=a;a--)b=Eq(this,a,-1)||b;b=Eq(this,this.Cf,0)||b}if(0!==(this.oi&Fq)){for(a=this.Cf+1;a<=this.jb;a++)Gq(this,a,1);for(a=this.Cf-1;0<=a;a--)Gq(this,a,-1);Gq(this,this.Cf,0)}c&&(Hq(this,-1),Hq(this,1));if(0!==(this.oi&Dq))for(b=!0;b;){b=!1;b=Eq(this,this.Cf,0)||b;for(a=this.Cf+1;a<=this.jb;a++)b=Eq(this,a,0)||b;for(a=this.Cf-1;0<=a;a--)b=Eq(this,a,0)||b}};function Eq(a,b,c){for(var d=!1;Iq(a,b,c);)d=!0;return d} -function Iq(a,b,c){var d=0,e=dq(a,b),f=a.Ld[b],h=kq(a,b,-1);if(0c)for(d=0;dd-1||n-e[d-1].column-1>p+a.nodeMinColumnSpace(e[d-1],!1)?n-1:n,p=0,p=d+1>=f||e[d+1].column-n-1>q+a.nodeMinColumnSpace(e[d+1],!0)?n+1:n,s=q=0,t=0,v=0,x=0,B=0;if(0>=c)for(var y=e[d].kc.i;y.next();){var C=y.value;C.valid&&C.fromVertex.layer!== -b&&(v=fq(C),x=C.portFromColOffset,B=C.portToColOffset,C=C.fromVertex.column,q+=(Math.abs(n+B-(C+x))+1)*v,s+=(Math.abs(r+B-(C+x))+1)*v,t+=(Math.abs(p+B-(C+x))+1)*v)}if(0<=c)for(y=e[d].bc.i;y.next();)C=y.value,C.valid&&C.toVertex.layer!==b&&(v=fq(C),x=C.portFromColOffset,B=C.portToColOffset,C=C.toVertex.column,q+=(Math.abs(n+x-(C+B))+1)*v,s+=(Math.abs(r+x-(C+B))+1)*v,t+=(Math.abs(p+x-(C+B))+1)*v);B=x=v=0;y=h[e[d].index];C=k[e[d].index];-1!==y&&(v+=Math.abs(y-n),x+=Math.abs(y-r),B+=Math.abs(y-p));-1!== -C&&(v+=Math.abs(C-n),x+=Math.abs(C-r),B+=Math.abs(C-p));if(s=c[d]?n=q:p<=c[d]&&(n=p));n!==k&&(h=!0,e[d].column=n)}eq(a,b,e);a.normalize()} -function Jq(a,b){for(var c=!0,d=a.network.vertexes.i;d.next();){var e=d.value,f=a.nodeMinColumnSpace(e,!0),h=a.nodeMinColumnSpace(e,!1);if(e.column-f<=b&&e.column+h>=b){c=!1;break}}e=!1;if(c)for(d.reset();d.next();)c=d.value,c.column>b&&(c.column-=1,e=!0);return e} -function Kq(a,b){for(var c=b,c=b+1,d=0,e=[],f=[],d=0;d<=a.jb;d++)e[d]=!1,f[d]=!1;for(var h=a.network.vertexes.i;h.next();){var d=h.value,k=d.column-a.nodeMinColumnSpace(d,!0),l=d.column+a.nodeMinColumnSpace(d,!1);k<=b&&l>=b&&(e[d.layer]=!0);k<=c&&l>=c&&(f[d.layer]=!0)}k=!0;c=!1;for(d=0;d<=a.jb;d++)k=k&&!(e[d]&&f[d]);if(k)for(h.reset();h.next();)e=h.value,e.column>b&&(e.column-=1,c=!0);return c} -function Hq(a,b){for(var c=0;c<=a.Hb;c++)for(;Jq(a,c););a.normalize();for(c=0;ce?hq(a,d):hb)for(c=a.Hb;0<=c;c--)for(d=gq(a),e=jq(a),f=e+1;ee?hq(a,d):hc)for(d.reset();d.next();)e=d.value,e.column+a.nodeMinColumnSpace(e,!1)>=b&&(e.component=a.cg);a.cg++;for(d.reset();d.next();)b=d.value,-1===b.component&&(nq(a,b,a.cg,-1,!0,!0),a.cg++);var f=0;b=[];for(f=0;fc)for(k=a.Hb;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} -Yl.prototype.commitLayout=function(){if(this.fp)for(var a=bq(this,!0),b=bq(this,!1),c=this.network.edges.i;c.next();){var d=c.value.link;null!==d&&(d.vb=a,d.xb=b)}this.commitNodes();this.Sy();this.Qs&&this.commitLinks()};function bq(a,b){return 270===a.la?b?vc:Cc:90===a.la?b?Cc:vc:180===a.la?b?wc:xc:b?xc:wc} -Yl.prototype.commitNodes=function(){this.Lg=[];this.$f=[];this.Bf=[];this.Kb=[];for(var a=0;a<=this.jb;a++)this.Lg[a]=0,this.$f[a]=0,this.Bf[a]=0,this.Kb[a]=0;for(a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;this.Lg[c]=Math.max(this.Lg[c],this.nodeMinLayerSpace(b,!0));this.$f[c]=Math.max(this.$f[c],this.nodeMinLayerSpace(b,!1))}for(var b=0,d=this.Ql,c=0;c<=this.jb;c++){var e=d;0>=this.Lg[c]+this.$f[c]&&(e=0);0=ua.aa.y&&ec<=ua.aa.bottom&&(ra=ua.Ja+Lf,ec=ec=ua.aa.x&&ec<=ua.aa.right&&(ra=ua.Ua+Lf,ec=ecLb.y&&(Nf=og.y>Lb.y?0:Ec.xpc.x&&(Of=Pg.x>pc.x?0:Pc.yb.layer?1:a.Beb.Be?1:a.Vdb.Vd?1:0:0};Yl.prototype.zE=function(a,b){return a instanceof Mq&&b instanceof Mq&&a!==b?a.firstb.first||a.Rhb.Rh||a.Beb.Be?1:a.Vdb.Vd?1:0:0}; -Yl.prototype.Aw=function(a,b){return a instanceof Mq&&b instanceof Mq&&a!==b?a.Gdb.Gd||a.Rhb.Rh||a.Beb.Be?1:a.Vdb.Vd?1:0:0};Yl.prototype.D=function(a,b){var c=a-b;return-1c};function dq(a,b){var c,d=a.Ld[b];if(d>=a.Ng.length){c=[];for(var e=0;ea&&(this.oi=a,this.H()))});u.defineProperty(Yl,{fp:"setsPortSpots"},function(){return this.Eh},function(a){this.Eh!==a&&(u.j(a,"boolean",Yl,"setsPortSpots"),this.Eh=a,this.H())});u.defineProperty(Yl,{ow:"linkSpacing"},function(){return this.gj},function(a){this.gj!==a&&(u.j(a,"number",Yl,"linkSpacing"),0<=a&&(this.gj=a,this.H()))});u.u(Yl,{uH:"maxLayer"},function(){return this.jb}); -u.u(Yl,{TJ:"maxIndex"},function(){return this.Fu});u.u(Yl,{SJ:"maxColumn"},function(){return this.Hb});u.u(Yl,{ZJ:"minIndexLayer"},function(){return this.Nq});u.u(Yl,{UJ:"maxIndexLayer"},function(){return this.Cf});var Op;Yl.CycleDepthFirst=Op=u.s(Yl,"CycleDepthFirst",0);var Xp;Yl.CycleGreedy=Xp=u.s(Yl,"CycleGreedy",1);var Sp;Yl.LayerOptimalLinkLength=Sp=u.s(Yl,"LayerOptimalLinkLength",0);var oq;Yl.LayerLongestPathSink=oq=u.s(Yl,"LayerLongestPathSink",1);var qq; -Yl.LayerLongestPathSource=qq=u.s(Yl,"LayerLongestPathSource",2);var Tp;Yl.InitDepthFirstOut=Tp=u.s(Yl,"InitDepthFirstOut",0);var wq;Yl.InitDepthFirstIn=wq=u.s(Yl,"InitDepthFirstIn",1);var uq;Yl.InitNaive=uq=u.s(Yl,"InitNaive",2);var Aq;Yl.AggressiveNone=Aq=u.s(Yl,"AggressiveNone",0);var Up;Yl.AggressiveLess=Up=u.s(Yl,"AggressiveLess",1);var Bq;Yl.AggressiveMore=Bq=u.s(Yl,"AggressiveMore",2);Yl.PackNone=0;var Cq;Yl.PackExpand=Cq=1;var Dq;Yl.PackStraighten=Dq=2;var Fq;Yl.PackMedian=Fq=4;var Vp; -Yl.PackAll=Vp=7;function Mq(){this.index=this.Vd=this.Be=this.Gd=this.first=this.layer=0;this.link=null;this.Rh=0}u.Xd(Mq,{layer:!0,first:!0,Gd:!0,Be:!0,Vd:!0,index:!0,link:!0,Rh:!0});function Wp(){xa.call(this)}u.Ga(Wp,xa);u.fa("LayeredDigraphNetwork",Wp);Wp.prototype.createVertex=function(){return new Nq};Wp.prototype.createEdge=function(){return new Oq}; -function Nq(){ya.call(this);this.index=this.column=this.layer=-1;this.component=NaN;this.near=null;this.valid=!1;this.finish=this.wo=NaN;this.om=0;this.Hz=this.Iz=null}u.Ga(Nq,ya);u.fa("LayeredDigraphVertex",Nq);function Oq(){Aa.call(this);this.forest=this.rev=this.valid=!1;this.portToPos=this.portFromPos=NaN;this.portToColOffset=this.portFromColOffset=0}u.Ga(Oq,Aa);u.fa("LayeredDigraphEdge",Oq); -function Y(){0b.level)return!1;a.removeChild(c.parent,c)}return!0}Y.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;ef?Cr(a,k,na,y,C):Dr(a,k,na,y,C);na=R.x;y=R.width;C=R.height;break;case qr:for(m=0;ms&&(Nra&&(Ir(a,-ra,0,Oa,m-1),Jr(H,-ra,0),Jr(T,-ra,0),ra=0)}n.ia.m(ra,Z);y=Math.max(y,aa);C=Math.max(C,I+(0===Ea?0:x)+Ca.height);N=aa}else{0s&&(Zra&&(Ir(a,0,-ra,Oa,m-1),Jr(H,0,-ra),Jr(T,0,-ra),ra=0);n.ia.m(N,ra);C=Math.max(C,R);y=Math.max(y,I+(0===Ea?0:x)+Ca.width);Z=R}ua++}0h&&(h=0),135q&&(q=0),p===rr&&(l+=t/2+a.M.y),k+=d+c):b?(null===a.comments?d>y&&(p=Nr(p,d-y,0),k=p.x,l=p.y,y=d,h=0):y=Lr(a,y,h),0>h&&(k-=h,h=0),135C&&(p=Nr(p,0,e-C),k=p.x,l=p.y,C=e,q=0):C=Mr(a,C,q),0>q&&(l-=q,q=0),k+=d+c);if(0f[0].x?f[2].assign(f[1]):f[1].assign(f[2])),f[3].yf[0].x?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(h+d,0),p[1].m(p[0].x,e),p[2].yf[0].y?f[2].assign(f[1]):f[1].assign(f[2])),f[3].xf[0].y?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(0,q+e),p[1].m(d,p[0].y),p[2].xc?Cr(b,e,ua,I,H):Dr(b,e,ua,I,H);ua=H.x;I=H.width;H=H.height;break;case qr:for(k=0;kr&&(aar&&(Rp&&(p=0),135y&&(y=0));b.Ia.m(p,y);b.Ya.m(I,H)}} -function Cr(a,b,c,d,e){var f=b.length;if(0===f)return new z(c,0,d,e);if(1===f){var h=b[0];d=h.Ya.width;e=h.Ya.height;return new z(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=90===xr(a),n=0,p=0,q=0,r=0;rm&&(d-=m),e=Math.max(e,Math.max(B, -q)+b+s.height),0>h.ia.x&&(c=Wr(a,h.ia.x,!1,c,k))):(h.ia.m(d+b,c+k/2-h.M.y-h.Ia.y),d=Math.max(d,Math.max(x,p)+b+s.width),m=c+k/2-h.M.y-h.Ia.y,e=Math.max(e,m+s.height),0>m&&(e-=m),0>h.ia.y&&(c=Wr(a,h.ia.y,!0,c,k))));return new z(c,0,d,e)} -function Dr(a,b,c,d,e){var f=b.length;if(0===f)return new z(c,0,d,e);if(1===f){var h=b[0];d=h.Ya.width;e=h.Ya.height;return new z(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=270===xr(a),n=0,p=0,q=0,r=0;rp&&(d-=p),e=Math.max(e,Math.abs(Math.min(B, -q))+l+s.height),0>h.ia.x&&(c=Wr(a,h.ia.x,!1,c,k))):(h.ia.m(-d-s.width-l,c+k/2-h.M.y-h.Ia.y),d=Math.max(d,Math.abs(Math.min(x,p))+l+s.width),p=c+k/2-h.M.y-h.Ia.y,e=Math.max(e,p+s.height),0>p&&(e-=p),0>h.ia.y&&(c=Wr(a,h.ia.y,!0,c,k))));for(r=0;rd&&(d=c+a.width);0>c&&(d-=c);return d;case yr:return a.width>b?a.width:b;case zr:return 2*a.M.x>b?a.width:b+a.width-2*a.M.x;case pr:case er:return d=Math.min(0,c),c=Math.max(b,c+a.width),Math.max(a.width,c-d);case qr:return a.width-a.M.x+a.nodeSpacing/2+b;case rr:return Math.max(a.width,a.M.x+a.nodeSpacing/2+b);default:return b}} -function Mr(a,b,c){switch(a.alignment){case nr:case Kr:var d=b;c+a.height>d&&(d=c+a.height);0>c&&(d-=c);return d;case yr:return a.height>b?a.height:b;case zr:return 2*a.M.y>b?a.height:b+a.height-2*a.M.y;case pr:case er:return d=Math.min(0,c),c=Math.max(b,c+a.height),Math.max(a.height,c-d);case qr:return a.height-a.M.y+a.nodeSpacing/2+b;case rr:return Math.max(a.height,a.M.y+a.nodeSpacing/2+b);default:return b}} -function Nr(a,b,c){switch(a){case Kr:b/=2;c/=2;break;case nr:b/=2;c/=2;break;case yr:c=b=0;break;case zr:break;default:u.k("Unhandled alignment value "+a.toString())}return new w(b,c)}function Fr(a,b,c,d,e,f){b=Nr(b,c,d);Ir(a,b.x,b.y,e,f)}function Ir(a,b,c,d,e){if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].ia;f.x+=b;f.y+=c}} -function Gr(a,b,c,d){var e=b.parent;switch(a.Af){case Qq:for(a=b.kc;a.next();)b=a.value,b.fromVertex===e&&b.nr.m(c,d);break;case Xq:for(a=b.bc;a.next();)b=a.value,b.toVertex===e&&b.nr.m(c,d);break;default:u.k("Unhandled path value "+a.Af.toString())}}function Jr(a,b,c){for(var d=0;dp.length||null===q||2>q.length))for(m=l=0;lv&&e.ye.y&&vb.length||null===l||2>l.length)d=null;else{n=Er(a,b.length+l.length);for(d=f=e=0;fe;)v=l[f++],n[d++].m(v.x+m,v.y);l=Er(a,d);for(e=0;ep.length||null===f||2>f.length)e=null;else{n=Er(a,p.length+f.length);for(m=x=l=0;lf;)e=p[l++],n[m++].m(e.x,e.y);e=Er(a,m);for(l=0;lp.length||null===q||2>q.length))for(m=l=0;lf&&e.xe.x&&fb.length||null===l||2>l.length)d=null;else{n=Er(a, -b.length+l.length);for(d=f=e=0;fe;)v=l[f++],n[d++].m(v.x,v.y+m);l=Er(a,d);for(e=0;ep.length||null===f||2>f.length)e=null;else{n=Er(a,p.length+f.length);for(m=x=l=0;lf;)e=p[l++],n[m++].m(e.x,e.y);e=Er(a,m);for(l=0;l=a?0:135>=a?90:225>=a?180:315>=a?270:0} -function Ar(a){var b=xr(a),b=90===b||270===b,c=a.layerSpacing;if(0=a&&(this.qa.nodeIndentPastParent=a,this.H()))}); -u.defineProperty(Y,{nodeSpacing:"nodeSpacing"},function(){return this.qa.nodeSpacing},function(a){this.qa.nodeSpacing!==a&&(u.j(a,"number",Y,"nodeSpacing"),this.qa.nodeSpacing=a,this.H())});u.defineProperty(Y,{layerSpacing:"layerSpacing"},function(){return this.qa.layerSpacing},function(a){this.qa.layerSpacing!==a&&(u.j(a,"number",Y,"layerSpacing"),this.qa.layerSpacing=a,this.H())}); -u.defineProperty(Y,{layerSpacingParentOverlap:"layerSpacingParentOverlap"},function(){return this.qa.layerSpacingParentOverlap},function(a){this.qa.layerSpacingParentOverlap!==a&&(u.j(a,"number",Y,"layerSpacingParentOverlap"),0<=a&&1>=a&&(this.qa.layerSpacingParentOverlap=a,this.H()))});u.defineProperty(Y,{compaction:"compaction"},function(){return this.qa.compaction},function(a){this.qa.compaction!==a&&(u.rb(a,Y,Y,"compaction"),a===ur||a===wr)&&(this.qa.compaction=a,this.H())}); -u.defineProperty(Y,{breadthLimit:"breadthLimit"},function(){return this.qa.breadthLimit},function(a){this.qa.breadthLimit!==a&&(u.j(a,"number",Y,"breadthLimit"),0<=a&&(this.qa.breadthLimit=a,this.H()))});u.defineProperty(Y,{rowSpacing:"rowSpacing"},function(){return this.qa.rowSpacing},function(a){this.qa.rowSpacing!==a&&(u.j(a,"number",Y,"rowSpacing"),this.qa.rowSpacing=a,this.H())}); -u.defineProperty(Y,{rowIndent:"rowIndent"},function(){return this.qa.rowIndent},function(a){this.qa.rowIndent!==a&&(u.j(a,"number",Y,"rowIndent"),0<=a&&(this.qa.rowIndent=a,this.H()))});u.defineProperty(Y,{commentSpacing:"commentSpacing"},function(){return this.qa.commentSpacing},function(a){this.qa.commentSpacing!==a&&(u.j(a,"number",Y,"commentSpacing"),this.qa.commentSpacing=a,this.H())}); -u.defineProperty(Y,{commentMargin:"commentMargin"},function(){return this.qa.commentMargin},function(a){this.qa.commentMargin!==a&&(u.j(a,"number",Y,"commentMargin"),this.qa.commentMargin=a,this.H())});u.defineProperty(Y,{setsPortSpot:"setsPortSpot"},function(){return this.qa.setsPortSpot},function(a){this.qa.setsPortSpot!==a&&(u.j(a,"boolean",Y,"setsPortSpot"),this.qa.setsPortSpot=a,this.H())}); -u.defineProperty(Y,{portSpot:"portSpot"},function(){return this.qa.portSpot},function(a){u.C(a,L,Y,"portSpot");this.qa.portSpot.L(a)||(this.qa.portSpot=a,this.H())});u.defineProperty(Y,{setsChildPortSpot:"setsChildPortSpot"},function(){return this.qa.setsChildPortSpot},function(a){this.qa.setsChildPortSpot!==a&&(u.j(a,"boolean",Y,"setsChildPortSpot"),this.qa.setsChildPortSpot=a,this.H())}); -u.defineProperty(Y,{childPortSpot:"childPortSpot"},function(){return this.qa.childPortSpot},function(a){u.C(a,L,Y,"childPortSpot");this.qa.childPortSpot.L(a)||(this.qa.childPortSpot=a,this.H())});u.defineProperty(Y,{$I:"alternateSorting"},function(){return this.pa.sorting},function(a){this.pa.sorting!==a&&(u.rb(a,Y,Y,"alternateSorting"),a===jr||a===kr||a===lr||mr)&&(this.pa.sorting=a,this.H())}); -u.defineProperty(Y,{NI:"alternateComparer"},function(){return this.pa.comparer},function(a){this.pa.comparer!==a&&(u.j(a,"function",Y,"alternateComparer"),this.pa.comparer=a,this.H())});u.defineProperty(Y,{HI:"alternateAngle"},function(){return this.pa.angle},function(a){this.pa.angle!==a&&(u.j(a,"number",Y,"alternateAngle"),0===a||90===a||180===a||270===a)&&(this.pa.angle=a,this.H())}); -u.defineProperty(Y,{GI:"alternateAlignment"},function(){return this.pa.alignment},function(a){this.pa.alignment!==a&&(u.rb(a,Y,Y,"alternateAlignment"),this.pa.alignment=a,this.H())});u.defineProperty(Y,{SI:"alternateNodeIndent"},function(){return this.pa.nodeIndent},function(a){this.pa.nodeIndent!==a&&(u.j(a,"number",Y,"alternateNodeIndent"),0<=a&&(this.pa.nodeIndent=a,this.H()))}); -u.defineProperty(Y,{TI:"alternateNodeIndentPastParent"},function(){return this.pa.nodeIndentPastParent},function(a){this.pa.nodeIndentPastParent!==a&&(u.j(a,"number",Y,"alternateNodeIndentPastParent"),0<=a&&1>=a&&(this.pa.nodeIndentPastParent=a,this.H()))});u.defineProperty(Y,{UI:"alternateNodeSpacing"},function(){return this.pa.nodeSpacing},function(a){this.pa.nodeSpacing!==a&&(u.j(a,"number",Y,"alternateNodeSpacing"),this.pa.nodeSpacing=a,this.H())}); -u.defineProperty(Y,{QI:"alternateLayerSpacing"},function(){return this.pa.layerSpacing},function(a){this.pa.layerSpacing!==a&&(u.j(a,"number",Y,"alternateLayerSpacing"),this.pa.layerSpacing=a,this.H())});u.defineProperty(Y,{RI:"alternateLayerSpacingParentOverlap"},function(){return this.pa.layerSpacingParentOverlap},function(a){this.pa.layerSpacingParentOverlap!==a&&(u.j(a,"number",Y,"alternateLayerSpacingParentOverlap"),0<=a&&1>=a&&(this.pa.layerSpacingParentOverlap=a,this.H()))}); -u.defineProperty(Y,{MI:"alternateCompaction"},function(){return this.pa.compaction},function(a){this.pa.compaction!==a&&(u.rb(a,Y,Y,"alternateCompaction"),a===ur||a===wr)&&(this.pa.compaction=a,this.H())});u.defineProperty(Y,{II:"alternateBreadthLimit"},function(){return this.pa.breadthLimit},function(a){this.pa.breadthLimit!==a&&(u.j(a,"number",Y,"alternateBreadthLimit"),0<=a&&(this.pa.breadthLimit=a,this.H()))}); -u.defineProperty(Y,{XI:"alternateRowSpacing"},function(){return this.pa.rowSpacing},function(a){this.pa.rowSpacing!==a&&(u.j(a,"number",Y,"alternateRowSpacing"),this.pa.rowSpacing=a,this.H())});u.defineProperty(Y,{WI:"alternateRowIndent"},function(){return this.pa.rowIndent},function(a){this.pa.rowIndent!==a&&(u.j(a,"number",Y,"alternateRowIndent"),0<=a&&(this.pa.rowIndent=a,this.H()))}); -u.defineProperty(Y,{LI:"alternateCommentSpacing"},function(){return this.pa.commentSpacing},function(a){this.pa.commentSpacing!==a&&(u.j(a,"number",Y,"alternateCommentSpacing"),this.pa.commentSpacing=a,this.H())});u.defineProperty(Y,{KI:"alternateCommentMargin"},function(){return this.pa.commentMargin},function(a){this.pa.commentMargin!==a&&(u.j(a,"number",Y,"alternateCommentMargin"),this.pa.commentMargin=a,this.H())}); -u.defineProperty(Y,{ZI:"alternateSetsPortSpot"},function(){return this.pa.setsPortSpot},function(a){this.pa.setsPortSpot!==a&&(u.j(a,"boolean",Y,"alternateSetsPortSpot"),this.pa.setsPortSpot=a,this.H())});u.defineProperty(Y,{VI:"alternatePortSpot"},function(){return this.pa.portSpot},function(a){u.C(a,L,Y,"alternatePortSpot");this.pa.portSpot.L(a)||(this.pa.portSpot=a,this.H())}); -u.defineProperty(Y,{YI:"alternateSetsChildPortSpot"},function(){return this.pa.setsChildPortSpot},function(a){this.pa.setsChildPortSpot!==a&&(u.j(a,"boolean",Y,"alternateSetsChildPortSpot"),this.pa.setsChildPortSpot=a,this.H())});u.defineProperty(Y,{JI:"alternateChildPortSpot"},function(){return this.pa.childPortSpot},function(a){u.C(a,L,Y,"alternateChildPortSpot");this.pa.childPortSpot.L(a)||(this.pa.childPortSpot=a,this.H())});var Pq;Y.PathDefault=Pq=u.s(Y,"PathDefault",-1);var Qq; -Y.PathDestination=Qq=u.s(Y,"PathDestination",0);var Xq;Y.PathSource=Xq=u.s(Y,"PathSource",1);var jr;Y.SortingForwards=jr=u.s(Y,"SortingForwards",10);var kr;Y.SortingReverse=kr=u.s(Y,"SortingReverse",11);var lr;Y.SortingAscending=lr=u.s(Y,"SortingAscending",12);var mr;Y.SortingDescending=mr=u.s(Y,"SortingDescending",13);var Kr;Y.AlignmentCenterSubtrees=Kr=u.s(Y,"AlignmentCenterSubtrees",20);var nr;Y.AlignmentCenterChildren=nr=u.s(Y,"AlignmentCenterChildren",21);var yr; -Y.AlignmentStart=yr=u.s(Y,"AlignmentStart",22);var zr;Y.AlignmentEnd=zr=u.s(Y,"AlignmentEnd",23);var pr;Y.AlignmentBus=pr=u.s(Y,"AlignmentBus",24);var er;Y.AlignmentBusBranching=er=u.s(Y,"AlignmentBusBranching",25);var qr;Y.AlignmentTopLeftBus=qr=u.s(Y,"AlignmentTopLeftBus",26);var rr;Y.AlignmentBottomRightBus=rr=u.s(Y,"AlignmentBottomRightBus",27);var ur;Y.CompactionNone=ur=u.s(Y,"CompactionNone",30);var wr;Y.CompactionBlock=wr=u.s(Y,"CompactionBlock",31);var Rq; -Y.StyleLayered=Rq=u.s(Y,"StyleLayered",40);var ir;Y.StyleLastParents=ir=u.s(Y,"StyleLastParents",41);var hr;Y.StyleAlternating=hr=u.s(Y,"StyleAlternating",42);var gr;Y.StyleRootOnly=gr=u.s(Y,"StyleRootOnly",43);var Tq;Y.ArrangementVertical=Tq=u.s(Y,"ArrangementVertical",50);var Yr;Y.ArrangementHorizontal=Yr=u.s(Y,"ArrangementHorizontal",51);var Wq;Y.ArrangementFixedRoots=Wq=u.s(Y,"ArrangementFixedRoots",52);var Sq;Y.LayerIndividual=Sq=u.s(Y,"LayerIndividual",60);var cr; -Y.LayerSiblings=cr=u.s(Y,"LayerSiblings",61);var br;Y.LayerUniform=br=u.s(Y,"LayerUniform",62);function Vq(){xa.call(this)}u.Ga(Vq,xa);u.fa("TreeNetwork",Vq);Vq.prototype.createVertex=function(){return new Uq};Vq.prototype.createEdge=function(){return new $r}; -function Uq(){ya.call(this);this.initialized=!1;this.parent=null;this.children=[];this.maxGenerationCount=this.maxChildrenCount=this.descendantCount=this.level=0;this.comments=null;this.ia=new w(0,0);this.Ya=new ia(0,0);this.Ia=new w(0,0);this.cp=this.bp=this.aI=!1;this.jt=this.Ss=null;this.sorting=jr;this.comparer=dp;this.angle=0;this.alignment=nr;this.nodeIndentPastParent=this.nodeIndent=0;this.nodeSpacing=20;this.layerSpacing=50;this.layerSpacingParentOverlap=0;this.compaction=wr;this.breadthLimit= -0;this.rowSpacing=25;this.commentSpacing=this.rowIndent=10;this.commentMargin=20;this.setsPortSpot=!0;this.portSpot=uc;this.setsChildPortSpot=!0;this.childPortSpot=uc}u.Ga(Uq,ya);u.fa("TreeVertex",Uq); -Uq.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.sorting=a.sorting,this.comparer=a.comparer,this.angle=a.angle,this.alignment=a.alignment,this.nodeIndent=a.nodeIndent,this.nodeIndentPastParent=a.nodeIndentPastParent,this.nodeSpacing=a.nodeSpacing,this.layerSpacing=a.layerSpacing,this.layerSpacingParentOverlap=a.layerSpacingParentOverlap,this.compaction=a.compaction,this.breadthLimit=a.breadthLimit,this.rowSpacing=a.rowSpacing,this.rowIndent=a.rowIndent,this.commentSpacing=a.commentSpacing, -this.commentMargin=a.commentMargin,this.setsPortSpot=a.setsPortSpot,this.portSpot=a.portSpot,this.setsChildPortSpot=a.setsChildPortSpot,this.childPortSpot=a.childPortSpot)};u.u(Uq,{qm:"childrenCount"},function(){return this.children.length});u.defineProperty(Uq,{pK:"relativePosition"},function(){return this.ia},function(a){this.ia.set(a)});u.defineProperty(Uq,{zK:"subtreeSize"},function(){return this.Ya},function(a){this.Ya.set(a)}); -u.defineProperty(Uq,{yK:"subtreeOffset"},function(){return this.Ia},function(a){this.Ia.set(a)});function $r(){Aa.call(this);this.nr=new w(0,0)}u.Ga($r,Aa);u.fa("TreeEdge",$r); -$r.prototype.commit=function(){var a=this.link;if(null!==a&&!a.el){var b=this.network.Qb,c=null,d=null;switch(b.Af){case Qq:c=this.fromVertex;d=this.toVertex;break;case Xq:c=this.toVertex;d=this.fromVertex;break;default:u.k("Unhandled path value "+b.Af.toString())}if(null!==c&&null!==d)if(b=this.nr,0!==b.x||0!==b.y||c.aI){var d=c.kb,e=xr(c),f=Ar(c),h=c.rowSpacing;a.updateRoute();var k=a.Ve===kh,l=a.dc,m=0,n,p;a.rl();if(l||k){for(m=2;4q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Br(c))))):c.alignment===yr?(r=d.top+b.y,0===b.y&&n.yq.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Br(c))))):c.alignment===yr?(r=d.left+b.x,0===b.x&&n.xq.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Br(c))))):c.alignment===yr?(r=d.top+b.y,0===b.y&&n.yq.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Br(c))))):c.alignment===yr?(r=d.left+b.x,0===b.x&&n.xl?h=null:(m=parseFloat(n.getAttribute("cx")),isNaN(m)&&(m=0),n=parseFloat(n.getAttribute("cy")),isNaN(n)&&(n=0),p=new $c(nd),p.ua=0,p.va=0,p.F=2*l,p.G=2*l,h.position=new w(m-l,n-l),h.dd=p);break;case "ellipse":p=f;h=new X;l=parseFloat(p.getAttribute("rx"));isNaN(l)||0>l?h=null:(m=parseFloat(p.getAttribute("ry")),isNaN(m)||0>m?h=null:(n=parseFloat(p.getAttribute("cx")),isNaN(n)&&(n=0),p=parseFloat(p.getAttribute("cy")), -isNaN(p)&&(p=0),q=new $c(nd),q.ua=0,q.va=0,q.F=2*l,q.G=2*m,h.position=new w(n-l,p-m),h.dd=q));break;case "rect":q=f;h=new X;l=parseFloat(q.getAttribute("width"));if(isNaN(l)||0>l)h=null;else if(m=parseFloat(q.getAttribute("height")),isNaN(m)||0>m)h=null;else{n=parseFloat(q.getAttribute("x"));isNaN(n)&&(n=0);p=parseFloat(q.getAttribute("y"));isNaN(p)&&(p=0);var r=q.getAttribute("rx"),s=q.getAttribute("ry"),q=parseFloat(r);if(isNaN(q)||0>q)q=0;var t=parseFloat(s);if(isNaN(t)||0>t)t=0;null!==r&&""!== -r||null===s||""===s?null===r||""===r||null!==s&&""!==s||(t=q):q=t;q=Math.min(q,l/2);t=Math.min(t,m/2);s=void 0;0===q&&0===t?(s=new $c(md),s.ua=0,s.va=0,s.F=l,s.G=m):(s=K.sa/2,r=u.p(),M(r,q,0,!0),r.lineTo(l-q,0),O(r,l-q*s,0,l,t*s,l,t),r.lineTo(l,m-t),O(r,l,m-t*s,l-q*s,m,l-q,m),r.lineTo(q,m),O(r,q*s,m,0,m-t*s,0,m-t),r.lineTo(0,t),O(r,0,t*s,q*s,0,q,0),P(r),s=r.o,u.q(r));h.position=new w(n,p);h.dd=s}break;case "polygon":h=es(f);break;case "polyline":h=es(f)}if(null!==h){if(h instanceof X){m=h;l=bs(a, -f,"fill");null!==l&&-1!==l.indexOf("url")?(l=l.substring(l.indexOf("#")+1,l.length-1),l=a["_brush"+l],m.fill=l instanceof ga?l:"black"):m.fill=null===l?"black":"none"===l?null:l;l=bs(a,f,"stroke");null!==l&&-1!==l.indexOf("url")?(l=l.substring(l.indexOf("#")+1,l.length-1),l=a["_brush"+l],m.stroke=l instanceof ga?l:"black"):m.stroke="none"===l?null:l;l=parseFloat(bs(a,f,"stroke-width"));isNaN(l)||(m.hb=l);l=bs(a,f,"stroke-linecap");null!==l&&(m.qI=l);l=bs(a,f,"stroke-dasharray");if(null!==l&&""!== -l){n=l.split(",");p=[];for(l=0;lf.length)return null;for(var d=null,h=new E(Jd),k=1;k= a.length ? a.push(c) : a.splice(b, 0, c) : u.k("Cannot insert an object into an HTMLCollection or NodeList: " + c + " at " + b) + }, + zi: function (a, b) { + Array.isArray(a) ? b >= a.length ? a.pop() : a.splice(b, 1) : u.k("Cannot remove an object from an HTMLCollection or NodeList at " + b) + }, + Ww: [], + K: function () { + var a = u.Ww.pop(); + return void 0 === a ? new w : a + }, + fc: function (a, b) { + var c = u.Ww.pop(); + if (void 0 === c) return new w(a, b); + c.x = a; + c.y = b; + return c + }, + v: function (a) { + u.Ww.push(a) + }, + xA: [], + ul: function () { + var a = u.xA.pop(); + return void 0 === + a ? new ia : a + }, + Oj: function (a) { + u.xA.push(a) + }, + Xw: [], + Sf: function () { + var a = u.Xw.pop(); + return void 0 === a ? new z : a + }, + Vj: function (a, b, c, d) { + var e = u.Xw.pop(); + if (void 0 === e) return new z(a, b, c, d); + e.x = a; + e.y = b; + e.width = c; + e.height = d; + return e + }, + ic: function (a) { + u.Xw.push(a) + }, + yA: [], + jh: function () { + var a = u.yA.pop(); + return void 0 === a ? new ja : a + }, + Ye: function (a) { + u.yA.push(a) + }, + Yw: null, + p: function () { + var a = u.Yw; + return null !== a ? (u.Yw = null, a) : new ka + }, + q: function (a) { + a.reset(); + u.Yw = a + }, + wA: [], + eb: function () { + var a = u.wA.pop(); + return void 0 === a ? + [] : a + }, + ra: function (a) { + a.length = 0; + u.wA.push(a) + }, + mh: Object.freeze([]), + zA: 1, + gc: function (a) { + a.__gohashid = u.zA++ + }, + Is: function (a) { + var b = a.__gohashid; + void 0 === b && (b = u.zA++, a.__gohashid = b); + return b + }, + Uc: function (a) { + return a.__gohashid + }, + fa: function (a, b) { + b.hx = a; + da[a] = b + }, + Ga: function (a, b) { + function c() { + } + + c.prototype = b.prototype; + a.prototype = new c; + a.prototype.constructor = a + }, + Lh: function (a) { + a.AF = !0 + }, + defineProperty: function (a, b, c, d, e) { + u.j(a, "function", "Util.defineProperty:classfunc"); + u.j(b, "object", "Util.defineProperty:propobj"); + u.j(c, "function", "Util.defineProperty:getter"); + u.j(d, "function", "Util.defineProperty:setter"); + for (var f in b) { + b = b[f]; + c = {get: c, set: d}; + if (void 0 !== e) for (var h in e) c[h] = e[h]; + Object.defineProperty(a.prototype, f, c); + e = Object.getOwnPropertyDescriptor(a.prototype, f); + b && e && Object.defineProperty(a.prototype, b, e); + break + } + }, + u: function (a, b, c, d) { + u.j(a, "function", "Util.defineReadOnlyProperty:classfunc"); + u.j(b, "object", "Util.defineReadOnlyProperty:propobj"); + u.j(c, "function", "Util.defineReadOnlyProperty:getter"); + for (var e in b) { + var f = + b[e]; + b = { + get: c, set: function (a) { + u.k('The property "' + f + '" is read-only and cannot be set to ' + a) + } + }; + if (void 0 !== d) for (var h in d) b[h] = d[h]; + Object.defineProperty(a.prototype, e, b); + d = Object.getOwnPropertyDescriptor(a.prototype, e); + f && d && Object.defineProperty(a.prototype, f, d); + break + } + }, + Xd: function (a, b) { + for (var c in b) b[c] = !0; + a.prototype.UB = b + }, + getTypeName: function (a) { + return void 0 === a ? "" : "string" === typeof a ? a : "function" === typeof a ? u.rg(a) : null === a ? "*" : "" + }, + rg: function (a) { + if ("function" === typeof a) { + if (a.hx) return a.hx; + if (a.name) return a.name; + var b = a.toString(), c = b.indexOf("("), b = b.substring(9, c).trim(); + if ("" !== b) return a.hx = b + } else if ("object" === typeof a && a.constructor) return u.rg(a.constructor); + return typeof a + }, + s: function (a, b, c) { + u.j(a, "function", "Util.defineEnumValue:classfunc"); + u.j(b, "string", "Util.defineEnumValue:name"); + u.j(c, "number", "Util.defineEnumValue:num"); + c = new ea(a, b, c); + Object.freeze(c); + a[b] = c; + var d = a.Dt; + d instanceof la || (d = new la("string", ea), a.Dt = d); + d.add(b, c); + return c + }, + sb: function (a, b) { + if (!a || !b) return null; + var c = void 0; + try { + "function" === typeof b ? c = b(a) : "function" === typeof a.getAttribute ? (c = a.getAttribute(b), null === c && (c = void 0)) : c = a[b] + } catch (d) { + } + return c + }, + Oa: function (a, b, c) { + if (a && b) try { + "function" === typeof b ? b(a, c) : "function" === typeof a.setAttribute ? a.setAttribute(b, c) : a[b] = c + } catch (d) { + } + }, + ot: function (a, b) { + u.j(a, "object", "Setting properties requires Objects as arguments"); + u.j(b, "object", "Setting properties requires Objects as arguments"); + var c = a instanceof A, d = a instanceof D, e; + for (e in b) { + "" === e && u.k("Setting properties requires non-empty property names"); + var f = a, h = e; + if (c || d) { + var k = e.indexOf("."); + if (0 < k) { + var l = e.substring(0, k); + if (c) f = a.je(l); else if (f = a[l], void 0 === f || null === f) f = a.tb[l]; + u.Sa(f) ? h = e.substr(k + 1) : u.k("Unable to find object named: " + l + " in " + a.toString() + " when trying to set property: " + e) + } + } + if ("_" !== h[0] && !u.jz(f, h)) if (d && u.jz(a.tb, h)) f = a.tb; else if (d && ma(a, h)) { + a.Ky(h, b[h]); + continue + } else u.k('Trying to set undefined property "' + h + '" on object: ' + f.toString()); + f[h] = b[e]; + "_" === h[0] && (k = f.Bl, u.isArray(k) || (k = [], f.Bl = k), k.push(h)) + } + }, + jz: function (a, + b) { + if (a.hasOwnProperty(b)) return !0; + for (var c = Object.getPrototypeOf(a); c && c !== Function;) { + if (c.hasOwnProperty(b)) return !0; + var d = c.UB; + if (d && d[b]) return !0; + c = Object.getPrototypeOf(c) + } + return !1 + }, + VC: function (a, b) { + if (!u.Sa(b) || b instanceof Element || b instanceof CanvasRenderingContext2D || b instanceof oa || b instanceof pa) return ""; + var c = "", d; + for (d in b) if ("string" !== typeof d) "" === c && (c = b + "\n"), c += " " + d + " is not a string property\n"; else if ("_" !== d.charAt(0) && !(2 >= d.length)) { + var e = u.sb(b, d); + null === e || "function" === + typeof e || u.jz(b, d) || ("" === c && (c = b + "\n"), c += ' unknown property "' + d + '" has value: ' + e + " at " + a + "\n") + } + return c + }, + Kv: function (a, b) { + if (null !== b && "number" !== typeof b && "string" !== typeof b && "boolean" !== typeof b && "function" !== typeof b) if (void 0 !== u.Uc(b)) { + if (!u.bv.contains(b)) if (u.bv.add(b), u.Ju.add(u.VC(a, b)), b instanceof E || b instanceof F || b instanceof la) for (var c = b.i; c.next();) u.Kv(a + "[" + c.key + "]", c.value); else for (c in b) { + var d = u.sb(b, c); + if (void 0 !== d && null !== d && u.Sa(d) && d !== b.UB) { + if (b instanceof qa) { + if (d === + b.ej) continue + } else if (b instanceof A) { + if ("data" === c || d === b.qh) continue; + if ("itemArray" === c || d === b.gi) continue; + if (b instanceof G && d === b.Bk) continue + } else if (!(b instanceof D)) if (b instanceof sa) { + if ("archetypeGroupData" === c || d === b.ax) continue + } else if (b instanceof ta) { + if ("archetypeLinkData" === c || d === b.ex) continue; + if ("archetypeLabelNodeData" === c || d === b.bx) continue + } else if (b instanceof va) { + if ("archetypeNodeData" === c || d === b.ik) continue + } else if (b instanceof J) { + if ("nodeDataArray" === c || d === b.mf) continue; + if ("linkDataArray" === + c || d === b.Bh || d === b.Rl) continue; + if (d === b.tc) continue; + if (d === b.uh) continue + } else if (b instanceof xa || b instanceof ya || b instanceof Aa) continue; + u.Kv(a + "." + c, d) + } + } + } else if (Array.isArray(b)) for (c = 0; c < b.length; c++) u.Kv(a + "[" + c + "]", b[c]); else u.Ju.add(u.VC(a, b)) + }, + check: function (a) { + void 0 === u.bv ? u.bv = new F(Object) : u.bv.clear(); + u.Ju = new Ba; + u.Kv("", a); + a = u.Ju.toString(); + u.Ju = null; + return a + }, + PH: function (a) { + for (var b = [], c = 0; 256 > c; c++) b[c] = c; + for (var d = 0, e = 0, c = 0; 256 > c; c++) d = (d + b[c] + 119) % 256, e = b[c], b[c] = b[d], b[d] = e; + for (var d = c = 0, f = "", h = 0; h < a.length; h++) c = (c + 1) % 256, d = (d + b[c]) % 256, e = b[c], b[c] = b[d], b[d] = e, f += String.fromCharCode(a.charCodeAt(h) ^ b[(b[c] + b[d]) % 256]); + return f + }, + PG: function (a) { + for (var b = [], c = 0; 256 > c; c++) b["0123456789abcdef".charAt(c >> 4) + "0123456789abcdef".charAt(c & 15)] = String.fromCharCode(c); + a.length % 2 && (a = "0" + a); + for (var d = [], e = 0, c = 0; c < a.length; c += 2) d[e++] = b[a.substr(c, 2)]; + a = d.join(""); + return "" === a ? "0" : a + }, + Da: function (a) { + return u.PH(u.PG(a)) + }, + wl: null, + adym: "7da71ca0ad381e90", + XF: "@COLOR1", + YF: "@COLOR2" + }; + u.wl = function () { + var a = window.document.createElement("canvas"), b = a.getContext("2d"); + b[u.Da("7ca11abfd022028846")] = u.Da("398c3597c01238"); + for (var c = ["5da73c80a3330d854f9e5e671d6633", "32ab5ff3b26f42dc0ed90f22412913b54ae6247590da4bb21c324ba3a84e385776", "54a702f3e53909c447824c6706603faf4cfb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387", "74bf19bce72555874c86"], d = 1; 5 > d; d++) b[u.Da("7ca11abfd7330390")](u.Da(c[d - 1]), 10, 15 * d + 0); + b[u.Da("7ca11abfd022028846")] = u.Da("39f046ebb36e4b"); + for (d = 1; 5 > d; d++) b[u.Da("7ca11abfd7330390")](u.Da(c[d - + 1]), 10, 15 * d + 0); + if (4 !== c.length || "5" !== c[0][0] || "7" !== c[3][0]) u.s = function (a, b) { + var c = new ea(a, b, 2); + Object.freeze(c); + a[b] = c; + var d = a.Dt; + d instanceof la || (d = new la("string", ea), a.Dt = d); + d.add(b, c); + return c + }; + return a + }(); + + function ea(a, b, c) { + u.gc(this); + this.HA = a; + this.Ub = b; + this.FF = c + } + + ea.prototype.toString = function () { + return u.rg(this.HA) + "." + this.Ub + }; + u.u(ea, {Ae: "classType"}, function () { + return this.HA + }); + u.u(ea, {name: "name"}, function () { + return this.Ub + }); + u.u(ea, {value: "value"}, function () { + return this.FF + }); + var Da; + ea.findName = Da = function (a, b) { + if (null === b || "" === b) return null; + u.j(a, "function", "findName:classfunc"); + u.j(b, "string", "EnumValue.findName:name"); + var c = a.Dt; + return c instanceof la ? c.ta(b) : null + }; + + function Ba() { + this.FA = [] + } + + Ba.prototype.toString = function () { + return this.FA.join("") + }; + Ba.prototype.add = function (a) { + "" !== a && this.FA.push(a) + }; + + function pa() { + } + + function Ga(a) { + void 0 === a && (a = 42); + this.seed = a; + this.Pw = 48271; + this.Ct = 2147483647; + this.uA = this.Ct / this.Pw; + this.hF = this.Ct % this.Pw; + this.dF = 1 / this.Ct; + this.random() + } + + Ga.prototype.random = function () { + var a = this.seed % this.uA * this.Pw - this.seed / this.uA * this.hF; + this.seed = 0 < a ? a : a + this.Ct; + return this.seed * this.dF + }; + + function Ha() { + } + + u.u(Ha, {i: "iterator"}, function () { + return this + }); + Ha.prototype.reset = Ha.prototype.reset = function () { + }; + Ha.prototype.next = Ha.prototype.hasNext = Ha.prototype.next = function () { + return !1 + }; + Ha.prototype.first = Ha.prototype.first = function () { + return null + }; + Ha.prototype.any = function () { + return !1 + }; + Ha.prototype.all = function () { + return !0 + }; + Ha.prototype.each = function () { + }; + u.u(Ha, {count: "count"}, function () { + return 0 + }); + Ha.prototype.Vf = function () { + }; + Ha.prototype.toString = function () { + return "EmptyIterator" + }; + var Ia = new Ha; + + function Ja(a) { + this.key = -1; + this.value = a + } + + u.Xd(Ja, {key: !0, value: !0}); + u.u(Ja, {i: "iterator"}, function () { + return this + }); + Ja.prototype.reset = Ja.prototype.reset = function () { + this.key = -1 + }; + Ja.prototype.next = Ja.prototype.hasNext = Ja.prototype.next = function () { + return -1 === this.key ? (this.key = 0, !0) : !1 + }; + Ja.prototype.first = Ja.prototype.first = function () { + this.key = 0; + return this.value + }; + Ja.prototype.any = function (a) { + this.key = -1; + return a(this.value) + }; + Ja.prototype.all = function (a) { + this.key = -1; + return a(this.value) + }; + Ja.prototype.each = function (a) { + this.key = -1; + a(this.value) + }; + u.u(Ja, {count: "count"}, function () { + return 1 + }); + Ja.prototype.Vf = function () { + this.value = null + }; + Ja.prototype.toString = function () { + return "SingletonIterator(" + this.value + ")" + }; + + function Ka(a) { + this.xd = a; + this.sj = null; + this.reset() + } + + u.Xd(Ka, {key: !0, value: !0}); + u.u(Ka, {i: "iterator"}, function () { + return this + }); + u.defineProperty(Ka, {Km: "predicate"}, function () { + return this.sj + }, function (a) { + this.sj = a + }); + Ka.prototype.reset = Ka.prototype.reset = function () { + var a = this.xd; + a.wd = null; + this.Xa = a.U; + this.ud = -1 + }; + Ka.prototype.next = Ka.prototype.hasNext = Ka.prototype.next = function () { + var a = this.xd; + if (a.U !== this.Xa) { + if (0 > this.key) return !1; + u.Mb(a) + } + var a = a.n, b = a.length, c = ++this.ud, d = this.sj; + if (null !== d) for (; c < b;) { + var e = a[c]; + if (d(e)) return this.key = this.ud = c, this.value = e, !0; + c++ + } else { + if (c < b) return this.key = c, this.value = a[c], !0; + this.Vf() + } + return !1 + }; + Ka.prototype.first = Ka.prototype.first = function () { + var a = this.xd; + this.Xa = a.U; + this.ud = 0; + var a = a.n, b = a.length, c = this.sj; + if (null !== c) { + for (var d = 0; d < b;) { + var e = a[d]; + if (c(e)) return this.key = this.ud = d, this.value = e; + d++ + } + return null + } + return 0 < b ? (e = a[0], this.key = 0, this.value = e) : null + }; + Ka.prototype.any = function (a) { + var b = this.xd; + b.wd = null; + var c = b.U; + this.ud = -1; + for (var d = b.n, e = d.length, f = this.sj, h = 0; h < e; h++) { + var k = d[h]; + if (null === f || f(k)) { + if (a(k)) return !0; + b.U !== c && u.Mb(b) + } + } + return !1 + }; + Ka.prototype.all = function (a) { + var b = this.xd; + b.wd = null; + var c = b.U; + this.ud = -1; + for (var d = b.n, e = d.length, f = this.sj, h = 0; h < e; h++) { + var k = d[h]; + if (null === f || f(k)) { + if (!a(k)) return !1; + b.U !== c && u.Mb(b) + } + } + return !0 + }; + Ka.prototype.each = function (a) { + var b = this.xd; + b.wd = null; + var c = b.U; + this.ud = -1; + for (var d = b.n, e = d.length, f = this.sj, h = 0; h < e; h++) { + var k = d[h]; + if (null === f || f(k)) a(k), b.U !== c && u.Mb(b) + } + }; + u.u(Ka, {count: "count"}, function () { + var a = this.sj; + if (null !== a) { + for (var b = 0, c = this.xd.n, d = c.length, e = 0; e < d; e++) a(c[e]) && b++; + return b + } + return this.xd.n.length + }); + Ka.prototype.Vf = function () { + this.key = -1; + this.value = null; + this.Xa = -1; + this.sj = null; + this.xd.wd = this + }; + Ka.prototype.toString = function () { + return "ListIterator@" + this.ud + "/" + this.xd.count + }; + + function La(a) { + this.xd = a; + this.reset() + } + + u.Xd(La, {key: !0, value: !0}); + u.u(La, {i: "iterator"}, function () { + return this + }); + La.prototype.reset = La.prototype.reset = function () { + var a = this.xd; + a.In = null; + this.Xa = a.U; + this.ud = a.n.length + }; + La.prototype.next = La.prototype.hasNext = La.prototype.next = function () { + var a = this.xd; + if (a.U !== this.Xa) { + if (0 > this.key) return !1; + u.Mb(a) + } + var b = --this.ud; + if (0 <= b) return this.key = b, this.value = a.n[b], !0; + this.Vf(); + return !1 + }; + La.prototype.first = La.prototype.first = function () { + var a = this.xd; + this.Xa = a.U; + var b = a.n; + this.ud = a = b.length - 1; + return 0 <= a ? (b = b[a], this.key = a, this.value = b) : null + }; + La.prototype.any = function (a) { + var b = this.xd; + b.In = null; + var c = b.U, d = b.n, e = d.length; + this.ud = e; + for (e -= 1; 0 <= e; e++) { + if (a(d[e])) return !0; + b.U !== c && u.Mb(b) + } + return !1 + }; + La.prototype.all = function (a) { + var b = this.xd; + b.In = null; + var c = b.U, d = b.n, e = d.length; + this.ud = e; + for (e -= 1; 0 <= e; e++) { + if (!a(d[e])) return !1; + b.U !== c && u.Mb(b) + } + return !0 + }; + La.prototype.each = function (a) { + var b = this.xd; + b.In = null; + var c = b.U, d = b.n, e = d.length; + this.ud = e; + for (e -= 1; 0 <= e; e++) a(d[e]), b.U !== c && u.Mb(b) + }; + u.u(La, {count: "count"}, function () { + return this.xd.n.length + }); + La.prototype.Vf = function () { + this.key = -1; + this.value = null; + this.Xa = -1; + this.xd.In = this + }; + La.prototype.toString = function () { + return "ListIteratorBackwards(" + this.ud + "/" + this.xd.count + ")" + }; + + function E(a) { + u.gc(this); + this.Ca = !1; + this.n = []; + this.U = 0; + this.In = this.wd = null; + void 0 === a || null === a ? this.oa = null : "string" === typeof a ? "object" === a || "string" === a || "number" === a || "boolean" === a || "function" === a ? this.oa = a : u.wa(a, "the string 'object', 'number', 'string', 'boolean', or 'function'", "List constructor: type") : "function" === typeof a ? this.oa = a === Object ? "object" : a === String ? "string" : a === Number ? "number" : a === Boolean ? "boolean" : a === Function ? "function" : a : u.wa(a, "null, a primitive type name, or a class type", + "List constructor: type") + } + + u.fa("List", E); + E.prototype.Pd = function () { + var a = this.U; + a++; + 999999999 < a && (a = 0); + this.U = a + }; + E.prototype.freeze = E.prototype.freeze = function () { + this.Ca = !0; + return this + }; + E.prototype.thaw = E.prototype.La = function () { + this.Ca = !1; + return this + }; + E.prototype.toString = function () { + return "List(" + u.getTypeName(this.oa) + ")#" + u.Uc(this) + }; + E.prototype.add = E.prototype.push = E.prototype.add = function (a) { + null !== a && (u.I(this, a), this.n.push(a), this.Pd()) + }; + E.prototype.addAll = E.prototype.Td = function (a) { + if (null === a) return this; + u.I(this); + var b = this.n; + if (u.isArray(a)) for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + b.push(e) + } else for (a = a.i; a.next();) e = a.value, b.push(e); + this.Pd(); + return this + }; + E.prototype.clear = E.prototype.clear = function () { + u.I(this); + this.n.length = 0; + this.Pd() + }; + E.prototype.contains = E.prototype.has = E.prototype.contains = function (a) { + return null === a ? !1 : -1 !== this.n.indexOf(a) + }; + E.prototype.indexOf = E.prototype.indexOf = function (a) { + return null === a ? -1 : this.n.indexOf(a) + }; + E.prototype.elt = E.prototype.get = E.prototype.ja = function (a) { + var b = this.n; + (0 > a || a >= b.length) && u.wa(a, "0 <= i < length", E, "elt:i"); + return b[a] + }; + E.prototype.setElt = E.prototype.set = E.prototype.Bg = function (a, b) { + var c = this.n; + (0 > a || a >= c.length) && u.wa(a, "0 <= i < length", E, "setElt:i"); + u.I(this, a); + c[a] = b + }; + E.prototype.first = E.prototype.first = function () { + var a = this.n; + return 0 === a.length ? null : a[0] + }; + E.prototype.last = E.prototype.Gd = function () { + var a = this.n, b = a.length; + return 0 < b ? a[b - 1] : null + }; + E.prototype.pop = E.prototype.pop = function () { + u.I(this); + var a = this.n; + return 0 < a.length ? a.pop() : null + }; + E.prototype.any = function (a) { + for (var b = this.n, c = this.U, d = b.length, e = 0; e < d; e++) { + if (a(b[e])) return !0; + this.U !== c && u.Mb(this) + } + return !1 + }; + E.prototype.all = function (a) { + for (var b = this.n, c = this.U, d = b.length, e = 0; e < d; e++) { + if (!a(b[e])) return !1; + this.U !== c && u.Mb(this) + } + return !0 + }; + E.prototype.each = function (a) { + for (var b = this.n, c = this.U, d = b.length, e = 0; e < d; e++) a(b[e]), this.U !== c && u.Mb(this) + }; + E.prototype.insertAt = E.prototype.Yd = function (a, b) { + 0 > a && u.wa(a, ">= 0", E, "insertAt:i"); + u.I(this, a); + var c = this.n; + a >= c.length ? c.push(b) : c.splice(a, 0, b); + this.Pd(); + return !0 + }; + E.prototype.remove = E.prototype["delete"] = E.prototype.remove = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = this.n; + a = b.indexOf(a); + if (-1 === a) return !1; + a === b.length - 1 ? b.pop() : b.splice(a, 1); + this.Pd(); + return !0 + }; + E.prototype.removeAt = E.prototype.hd = function (a) { + var b = this.n; + (0 > a || a >= b.length) && u.wa(a, "0 <= i < length", E, "removeAt:i"); + u.I(this, a); + a === b.length - 1 ? b.pop() : b.splice(a, 1); + this.Pd() + }; + E.prototype.removeRange = E.prototype.removeRange = function (a, b) { + var c = this.n; + (0 > a || a >= c.length) && u.wa(a, "0 <= from < length", E, "elt:from"); + (0 > b || b >= c.length) && u.wa(b, "0 <= to < length", E, "elt:to"); + u.I(this, a); + var d = c.slice((b || a) + 1 || c.length); + c.length = 0 > a ? c.length + a : a; + c.push.apply(c, d); + this.Pd() + }; + E.prototype.copy = function () { + for (var a = new E(this.oa), b = this.n, c = this.count, d = 0; d < c; d++) a.add(b[d]); + return a + }; + E.prototype.toArray = E.prototype.Ke = function () { + for (var a = this.n, b = this.count, c = Array(b), d = 0; d < b; d++) c[d] = a[d]; + return c + }; + E.prototype.toSet = function () { + for (var a = new F(this.oa), b = this.n, c = this.count, d = 0; d < c; d++) a.add(b[d]); + return a + }; + E.prototype.sort = E.prototype.sort = function (a) { + u.I(this); + this.n.sort(a); + this.Pd(); + return this + }; + E.prototype.sortRange = E.prototype.hp = function (a, b, c) { + var d = this.n, e = d.length; + void 0 === b && (b = 0); + void 0 === c && (c = e); + u.I(this); + var f = c - b; + if (1 >= f) return this; + (0 > b || b >= e - 1) && u.wa(b, "0 <= from < length", E, "sortRange:from"); + if (2 === f) return c = d[b], e = d[b + 1], 0 < a(c, e) && (d[b] = e, d[b + 1] = c, this.Pd()), this; + if (0 === b) if (c >= e) d.sort(a); else for (f = d.slice(0, c), f.sort(a), a = 0; a < c; a++) d[a] = f[a]; else if (c >= e) for (f = d.slice(b), f.sort(a), a = b; a < e; a++) d[a] = f[a - b]; else for (f = d.slice(b, c), f.sort(a), a = b; a < c; a++) d[a] = f[a - b]; + this.Pd(); + return this + }; + E.prototype.reverse = E.prototype.reverse = function () { + u.I(this); + this.n.reverse(); + this.Pd(); + return this + }; + u.u(E, {count: "count"}, function () { + return this.n.length + }); + u.u(E, {size: "size"}, function () { + return this.n.length + }); + u.u(E, {length: "length"}, function () { + return this.n.length + }); + u.u(E, {i: "iterator"}, function () { + if (0 >= this.n.length) return Ia; + var a = this.wd; + return null !== a ? (a.reset(), a) : new Ka(this) + }); + u.u(E, {Fm: "iteratorBackwards"}, function () { + if (0 >= this.n.length) return Ia; + var a = this.In; + return null !== a ? (a.reset(), a) : new La(this) + }); + + function Ma(a) { + this.Gk = a; + this.reset() + } + + u.Xd(Ma, {key: !0, value: !0}); + u.u(Ma, {i: "iterator"}, function () { + return this + }); + Ma.prototype.reset = Ma.prototype.reset = function () { + var a = this.Gk; + a.wd = null; + this.Xa = a.U; + this.Cb = null + }; + Ma.prototype.next = Ma.prototype.hasNext = Ma.prototype.next = function () { + var a = this.Gk; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.value = b.value, this.key = b.key, !0; + this.Vf(); + return !1 + }; + Ma.prototype.first = Ma.prototype.first = function () { + var a = this.Gk; + this.Xa = a.U; + a = a.bb; + if (null !== a) { + this.Cb = a; + var b = a.value; + this.key = a.key; + return this.value = b + } + return null + }; + Ma.prototype.any = function (a) { + var b = this.Gk; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d.value)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Ma.prototype.all = function (a) { + var b = this.Gk; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d.value)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Ma.prototype.each = function (a) { + var b = this.Gk; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d.value), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Ma, {count: "count"}, function () { + return this.Gk.Zc + }); + Ma.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1; + this.Gk.wd = this + }; + Ma.prototype.toString = function () { + return null !== this.Cb ? "SetIterator@" + this.Cb.value : "SetIterator" + }; + + function F(a) { + u.gc(this); + this.Ca = !1; + void 0 === a || null === a ? this.oa = null : "string" === typeof a ? "object" === a || "string" === a || "number" === a ? this.oa = a : u.wa(a, "the string 'object', 'number' or 'string'", "Set constructor: type") : "function" === typeof a ? this.oa = a === Object ? "object" : a === String ? "string" : a === Number ? "number" : a : u.wa(a, "null, a primitive type name, or a class type", "Set constructor: type"); + this.$c = {}; + this.Zc = 0; + this.wd = null; + this.U = 0; + this.Ah = this.bb = null + } + + u.fa("Set", F); + F.prototype.Pd = function () { + var a = this.U; + a++; + 999999999 < a && (a = 0); + this.U = a + }; + F.prototype.freeze = F.prototype.freeze = function () { + this.Ca = !0; + return this + }; + F.prototype.thaw = F.prototype.La = function () { + this.Ca = !1; + return this + }; + F.prototype.toString = function () { + return "Set(" + u.getTypeName(this.oa) + ")#" + u.Uc(this) + }; + F.prototype.add = F.prototype.add = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = a; + u.Sa(a) && (b = u.Is(a)); + return void 0 === this.$c[b] ? (this.Zc++, a = new Pa(a, a), this.$c[b] = a, b = this.Ah, null === b ? this.bb = a : (a.Un = b, b.Sb = a), this.Ah = a, this.Pd(), !0) : !1 + }; + F.prototype.addAll = F.prototype.Td = function (a) { + if (null === a) return this; + u.I(this); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.add(u.fb(a, c)); else for (a = a.i; a.next();) this.add(a.value); + return this + }; + F.prototype.contains = F.prototype.has = F.prototype.contains = function (a) { + if (null === a) return !1; + var b = a; + return u.Sa(a) && (b = u.Uc(a), void 0 === b) ? !1 : void 0 !== this.$c[b] + }; + F.prototype.containsAll = function (a) { + if (null === a) return !0; + for (a = a.i; a.next();) if (!this.contains(a.value)) return !1; + return !0 + }; + F.prototype.containsAny = function (a) { + if (null === a) return !0; + for (a = a.i; a.next();) if (this.contains(a.value)) return !0; + return !1 + }; + F.prototype.first = F.prototype.first = function () { + var a = this.bb; + return null === a ? null : a.value + }; + F.prototype.any = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (a(c.value)) return !0; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !1 + }; + F.prototype.all = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (!a(c.value)) return !1; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !0 + }; + F.prototype.each = function (a) { + for (var b = this.U, c = this.bb; null !== c;) a(c.value), this.U !== b && u.Mb(this), c = c.Sb + }; + F.prototype.remove = F.prototype["delete"] = F.prototype.remove = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = a; + if (u.Sa(a) && (b = u.Uc(a), void 0 === b)) return !1; + a = this.$c[b]; + if (void 0 === a) return !1; + var c = a.Sb, d = a.Un; + null !== c && (c.Un = d); + null !== d && (d.Sb = c); + this.bb === a && (this.bb = c); + this.Ah === a && (this.Ah = d); + delete this.$c[b]; + this.Zc--; + this.Pd(); + return !0 + }; + F.prototype.removeAll = F.prototype.jE = function (a) { + if (null === a) return this; + u.I(this); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.remove(u.fb(a, c)); else for (a = a.i; a.next();) this.remove(a.value); + return this + }; + F.prototype.retainAll = function (a) { + if (null === a || 0 === this.count) return this; + u.I(this); + var b = new F(this.oa); + b.Td(a); + a = new E(this.oa); + for (var c = this.i; c.next();) b.contains(c.value) || a.add(c.value); + for (b = a.i; b.next();) this.remove(b.value); + return this + }; + F.prototype.clear = F.prototype.clear = function () { + u.I(this); + this.$c = {}; + this.Zc = 0; + this.Ah = this.bb = null; + this.Pd() + }; + F.prototype.copy = function () { + var a = new F(this.oa), b = this.$c, c; + for (c in b) a.add(b[c].value); + return a + }; + F.prototype.toArray = F.prototype.Ke = function () { + var a = Array(this.Zc), b = this.$c, c = 0, d; + for (d in b) a[c] = b[d].value, c++; + return a + }; + F.prototype.toList = function () { + var a = new E(this.oa), b = this.$c, c; + for (c in b) a.add(b[c].value); + return a + }; + u.u(F, {count: "count"}, function () { + return this.Zc + }); + u.u(F, {size: "size"}, function () { + return this.Zc + }); + u.u(F, {i: "iterator"}, function () { + if (0 >= this.Zc) return Ia; + var a = this.wd; + return null !== a ? (a.reset(), a) : new Ma(this) + }); + + function Qa(a) { + this.Wa = a; + this.reset() + } + + u.Xd(Qa, {key: !0, value: !0}); + u.u(Qa, {i: "iterator"}, function () { + return this + }); + Qa.prototype.reset = Qa.prototype.reset = function () { + this.Xa = this.Wa.U; + this.Cb = null + }; + Qa.prototype.next = Qa.prototype.hasNext = Qa.prototype.next = function () { + var a = this.Wa; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.value = this.key = a = b.key, !0; + this.Vf(); + return !1 + }; + Qa.prototype.first = Qa.prototype.first = function () { + var a = this.Wa; + this.Xa = a.U; + a = a.bb; + return null !== a ? (this.Cb = a, this.value = this.key = a = a.key) : null + }; + Qa.prototype.any = function (a) { + var b = this.Wa, c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d.key)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Qa.prototype.all = function (a) { + var b = this.Wa, c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d.key)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Qa.prototype.each = function (a) { + var b = this.Wa, c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d.key), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Qa, {count: "count"}, function () { + return this.Wa.Zc + }); + Qa.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1 + }; + Qa.prototype.toString = function () { + return null !== this.Cb ? "MapKeySetIterator@" + this.Cb.value : "MapKeySetIterator" + }; + + function Ra(a) { + u.gc(this); + this.Ca = !0; + this.Wa = a + } + + u.Ga(Ra, F); + Ra.prototype.freeze = function () { + return this + }; + Ra.prototype.La = function () { + return this + }; + Ra.prototype.toString = function () { + return "MapKeySet(" + this.Wa.toString() + ")" + }; + Ra.prototype.add = Ra.prototype.set = Ra.prototype.add = function () { + u.k("This Set is read-only: " + this.toString()); + return !1 + }; + Ra.prototype.contains = Ra.prototype.has = Ra.prototype.contains = function (a) { + return this.Wa.contains(a) + }; + Ra.prototype.remove = Ra.prototype["delete"] = Ra.prototype.remove = function () { + u.k("This Set is read-only: " + this.toString()); + return !1 + }; + Ra.prototype.clear = Ra.prototype.clear = function () { + u.k("This Set is read-only: " + this.toString()) + }; + Ra.prototype.first = Ra.prototype.first = function () { + var a = this.Wa.bb; + return null !== a ? a.key : null + }; + Ra.prototype.any = function (a) { + for (var b = this.Wa.bb; null !== b;) { + if (a(b.key)) return !0; + b = b.Sb + } + return !1 + }; + Ra.prototype.all = function (a) { + for (var b = this.Wa.bb; null !== b;) { + if (!a(b.key)) return !1; + b = b.Sb + } + return !0 + }; + Ra.prototype.each = function (a) { + for (var b = this.Wa.bb; null !== b;) a(b.key), b = b.Sb + }; + Ra.prototype.copy = function () { + return new Ra(this.Wa) + }; + Ra.prototype.toSet = function () { + var a = new F(this.Wa.wq), b = this.Wa.$c, c; + for (c in b) a.add(b[c].key); + return a + }; + Ra.prototype.toArray = Ra.prototype.Ke = function () { + var a = this.Wa.$c, b = Array(this.Wa.Zc), c = 0, d; + for (d in a) b[c] = a[d].key, c++; + return b + }; + Ra.prototype.toList = function () { + var a = new E(this.oa), b = this.Wa.$c, c; + for (c in b) a.add(b[c].key); + return a + }; + u.u(Ra, {count: "count"}, function () { + return this.Wa.Zc + }); + u.u(Ra, {size: "size"}, function () { + return this.Wa.Zc + }); + u.u(Ra, {i: "iterator"}, function () { + return 0 >= this.Wa.Zc ? Ia : new Qa(this.Wa) + }); + + function Sa(a) { + this.Wa = a; + this.reset() + } + + u.Xd(Sa, {key: !0, value: !0}); + u.u(Sa, {i: "iterator"}, function () { + return this + }); + Sa.prototype.reset = Sa.prototype.reset = function () { + var a = this.Wa; + a.Jn = null; + this.Xa = a.U; + this.Cb = null + }; + Sa.prototype.next = Sa.prototype.hasNext = Sa.prototype.next = function () { + var a = this.Wa; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.value = b.value, this.key = b.key, !0; + this.Vf(); + return !1 + }; + Sa.prototype.first = Sa.prototype.first = function () { + var a = this.Wa; + this.Xa = a.U; + a = a.bb; + if (null !== a) { + this.Cb = a; + var b = a.value; + this.key = a.key; + return this.value = b + } + return null + }; + Sa.prototype.any = function (a) { + var b = this.Wa; + b.Jn = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d.value)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Sa.prototype.all = function (a) { + var b = this.Wa; + b.Jn = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d.value)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Sa.prototype.each = function (a) { + var b = this.Wa; + b.Jn = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d.value), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Sa, {count: "count"}, function () { + return this.Wa.Zc + }); + Sa.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1; + this.Wa.Jn = this + }; + Sa.prototype.toString = function () { + return null !== this.Cb ? "MapValueSetIterator@" + this.Cb.value : "MapValueSetIterator" + }; + + function Pa(a, b) { + this.key = a; + this.value = b; + this.Un = this.Sb = null + } + + u.Xd(Pa, {key: !0, value: !0}); + Pa.prototype.toString = function () { + return "{" + this.key + ":" + this.value + "}" + }; + + function Ua(a) { + this.Wa = a; + this.reset() + } + + u.Xd(Ua, {key: !0, value: !0}); + u.u(Ua, {i: "iterator"}, function () { + return this + }); + Ua.prototype.reset = Ua.prototype.reset = function () { + var a = this.Wa; + a.wd = null; + this.Xa = a.U; + this.Cb = null + }; + Ua.prototype.next = Ua.prototype.hasNext = Ua.prototype.next = function () { + var a = this.Wa; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.key = b.key, this.value = b.value, !0; + this.Vf(); + return !1 + }; + Ua.prototype.first = Ua.prototype.first = function () { + var a = this.Wa; + this.Xa = a.U; + a = a.bb; + return null !== a ? (this.Cb = a, this.key = a.key, this.value = a.value, a) : null + }; + Ua.prototype.any = function (a) { + var b = this.Wa; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Ua.prototype.all = function (a) { + var b = this.Wa; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Ua.prototype.each = function (a) { + var b = this.Wa; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Ua, {count: "count"}, function () { + return this.Wa.Zc + }); + Ua.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1; + this.Wa.wd = this + }; + Ua.prototype.toString = function () { + return null !== this.Cb ? "MapIterator@" + this.Cb : "MapIterator" + }; + + function la(a, b) { + u.gc(this); + this.Ca = !1; + void 0 === a || null === a ? this.wq = null : "string" === typeof a ? "object" === a || "string" === a || "number" === a ? this.wq = a : u.wa(a, "the string 'object', 'number' or 'string'", "Map constructor: keytype") : "function" === typeof a ? this.wq = a === Object ? "object" : a === String ? "string" : a === Number ? "number" : a : u.wa(a, "null, a primitive type name, or a class type", "Map constructor: keytype"); + void 0 === b || null === b ? this.tv = null : "string" === typeof b ? "object" === b || "string" === b || "boolean" === b || "number" === + b || "function" === b ? this.tv = b : u.wa(b, "the string 'object', 'number', 'string', 'boolean', or 'function'", "Map constructor: valtype") : "function" === typeof b ? this.tv = b === Object ? "object" : b === String ? "string" : b === Number ? "number" : b === Boolean ? "boolean" : b === Function ? "function" : b : u.wa(b, "null, a primitive type name, or a class type", "Map constructor: valtype"); + this.$c = {}; + this.Zc = 0; + this.Jn = this.wd = null; + this.U = 0; + this.Ah = this.bb = null + } + + u.fa("Map", la); + la.prototype.Pd = function () { + var a = this.U; + a++; + 999999999 < a && (a = 0); + this.U = a + }; + la.prototype.freeze = la.prototype.freeze = function () { + this.Ca = !0; + return this + }; + la.prototype.thaw = la.prototype.La = function () { + this.Ca = !1; + return this + }; + la.prototype.toString = function () { + return "Map(" + u.getTypeName(this.wq) + "," + u.getTypeName(this.tv) + ")#" + u.Uc(this) + }; + la.prototype.add = la.prototype.set = la.prototype.add = function (a, b) { + u.I(this, a); + var c = a; + u.Sa(a) && (c = u.Is(a)); + var d = this.$c[c]; + if (void 0 === d) return this.Zc++, d = new Pa(a, b), this.$c[c] = d, c = this.Ah, null === c ? this.bb = d : (d.Un = c, c.Sb = d), this.Ah = d, this.Pd(), !0; + d.value = b; + return !1 + }; + la.prototype.addAll = la.prototype.Td = function (a) { + if (null === a) return this; + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + this.add(d.key, d.value) + } else for (a = a.i; a.next();) this.add(a.key, a.value); + return this + }; + la.prototype.first = la.prototype.first = function () { + return this.bb + }; + la.prototype.any = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (a(c)) return !0; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !1 + }; + la.prototype.all = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (!a(c)) return !1; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !0 + }; + la.prototype.each = function (a) { + for (var b = this.U, c = this.bb; null !== c;) a(c), this.U !== b && u.Mb(this), c = c.Sb + }; + la.prototype.contains = la.prototype.has = la.prototype.contains = function (a) { + var b = a; + return u.Sa(a) && (b = u.Uc(a), void 0 === b) ? !1 : void 0 !== this.$c[b] + }; + la.prototype.getValue = la.prototype.get = la.prototype.ta = function (a) { + var b = a; + if (u.Sa(a) && (b = u.Uc(a), void 0 === b)) return null; + a = this.$c[b]; + return void 0 === a ? null : a.value + }; + la.prototype.remove = la.prototype["delete"] = la.prototype.remove = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = a; + if (u.Sa(a) && (b = u.Uc(a), void 0 === b)) return !1; + a = this.$c[b]; + if (void 0 === a) return !1; + var c = a.Sb, d = a.Un; + null !== c && (c.Un = d); + null !== d && (d.Sb = c); + this.bb === a && (this.bb = c); + this.Ah === a && (this.Ah = d); + delete this.$c[b]; + this.Zc--; + this.Pd(); + return !0 + }; + la.prototype.clear = la.prototype.clear = function () { + u.I(this); + this.$c = {}; + this.Zc = 0; + this.Ah = this.bb = null; + this.Pd() + }; + la.prototype.copy = function () { + var a = new la(this.wq, this.tv), b = this.$c, c; + for (c in b) { + var d = b[c]; + a.add(d.key, d.value) + } + return a + }; + la.prototype.toArray = la.prototype.Ke = function () { + var a = this.$c, b = Array(this.Zc), c = 0, d; + for (d in a) { + var e = a[d]; + b[c] = new Pa(e.key, e.value); + c++ + } + return b + }; + la.prototype.toKeySet = la.prototype.Ni = function () { + return new Ra(this) + }; + u.u(la, {count: "count"}, function () { + return this.Zc + }); + u.u(la, {size: "size"}, function () { + return this.Zc + }); + u.u(la, {i: "iterator"}, function () { + if (0 >= this.count) return Ia; + var a = this.wd; + return null !== a ? (a.reset(), a) : new Ua(this) + }); + u.u(la, {NJ: "iteratorKeys"}, function () { + return 0 >= this.count ? Ia : new Qa(this) + }); + u.u(la, {RD: "iteratorValues"}, function () { + if (0 >= this.count) return Ia; + var a = this.Jn; + return null !== a ? (a.reset(), a) : new Sa(this) + }); + + function w(a, b) { + void 0 === a ? this.y = this.x = 0 : (this.x = a, this.y = b); + this.Ca = !1 + } + + u.fa("Point", w); + u.Lh(w); + u.Xd(w, {x: !0, y: !0}); + w.prototype.assign = function (a) { + this.x = a.x; + this.y = a.y + }; + w.prototype.setTo = w.prototype.m = function (a, b) { + this.x = a; + this.y = b; + return this + }; + w.prototype.set = w.prototype.set = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + return this + }; + w.prototype.copy = function () { + var a = new w; + a.x = this.x; + a.y = this.y; + return a + }; + g = w.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Point is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + w.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + return new w(c, e) + } + return new w + }; + w.stringify = function (a) { + return a instanceof w ? a.x.toString() + " " + a.y.toString() : a.toString() + }; + w.prototype.toString = function () { + return "Point(" + this.x + "," + this.y + ")" + }; + w.prototype.equals = w.prototype.L = function (a) { + return a instanceof w ? this.x === a.x && this.y === a.y : !1 + }; + w.prototype.equalTo = w.prototype.Tv = function (a, b) { + return this.x === a && this.y === b + }; + w.prototype.equalsApprox = w.prototype.De = function (a) { + return K.D(this.x, a.x) && K.D(this.y, a.y) + }; + w.prototype.add = w.prototype.add = function (a) { + this.I(); + this.x += a.x; + this.y += a.y; + return this + }; + w.prototype.subtract = w.prototype.vt = function (a) { + this.I(); + this.x -= a.x; + this.y -= a.y; + return this + }; + w.prototype.offset = w.prototype.offset = function (a, b) { + this.I(); + this.x += a; + this.y += b; + return this + }; + w.prototype.rotate = w.prototype.rotate = function (a) { + this.I(); + if (0 === a) return this; + var b = this.x, c = this.y; + if (0 === b && 0 === c) return this; + var d = 0, e = 0; + 360 <= a ? a -= 360 : 0 > a && (a += 360); + 90 === a ? (d = 0, e = 1) : 180 === a ? (d = -1, e = 0) : 270 === a ? (d = 0, e = -1) : (a = a * Math.PI / 180, d = Math.cos(a), e = Math.sin(a)); + this.x = d * b - e * c; + this.y = e * b + d * c; + return this + }; + w.prototype.scale = w.prototype.scale = function (a, b) { + this.x *= a; + this.y *= b; + return this + }; + w.prototype.distanceSquaredPoint = w.prototype.Lj = function (a) { + var b = a.x - this.x; + a = a.y - this.y; + return b * b + a * a + }; + w.prototype.distanceSquared = w.prototype.ss = function (a, b) { + var c = a - this.x, d = b - this.y; + return c * c + d * d + }; + w.prototype.normalize = w.prototype.normalize = function () { + this.I(); + var a = this.x, b = this.y, c = Math.sqrt(a * a + b * b); + 0 < c && (this.x = a / c, this.y = b / c); + return this + }; + w.prototype.directionPoint = w.prototype.Fi = function (a) { + return Va(a.x - this.x, a.y - this.y) + }; + w.prototype.direction = w.prototype.direction = function (a, b) { + return Va(a - this.x, b - this.y) + }; + + function Va(a, b) { + if (0 === a) return 0 < b ? 90 : 0 > b ? 270 : 0; + if (0 === b) return 0 < a ? 0 : 180; + if (isNaN(a) || isNaN(b)) return 0; + var c = 180 * Math.atan(Math.abs(b / a)) / Math.PI; + 0 > a ? c = 0 > b ? c + 180 : 180 - c : 0 > b && (c = 360 - c); + return c + } + + w.prototype.projectOntoLineSegment = function (a, b, c, d) { + K.Hm(a, b, c, d, this.x, this.y, this); + return this + }; + w.prototype.projectOntoLineSegmentPoint = function (a, b) { + K.Hm(a.x, a.y, b.x, b.y, this.x, this.y, this); + return this + }; + w.prototype.snapToGrid = function (a, b, c, d) { + K.xs(this.x, this.y, a, b, c, d, this); + return this + }; + w.prototype.snapToGridPoint = function (a, b) { + K.xs(this.x, this.y, a.x, a.y, b.width, b.height, this); + return this + }; + w.prototype.setRectSpot = w.prototype.pt = function (a, b) { + this.I(); + this.x = a.x + b.x * a.width + b.offsetX; + this.y = a.y + b.y * a.height + b.offsetY; + return this + }; + w.prototype.setSpot = w.prototype.rt = function (a, b, c, d, e) { + this.I(); + this.x = a + e.x * c + e.offsetX; + this.y = b + e.y * d + e.offsetY; + return this + }; + w.prototype.transform = function (a) { + a.ab(this); + return this + }; + + function Wa(a, b) { + b.Oh(a); + return a + } + + var Xa; + w.distanceLineSegmentSquared = Xa = function (a, b, c, d, e, f) { + var h = e - c, k = f - d, l = h * h + k * k; + c -= a; + d -= b; + var m = -c * h - d * k; + if (0 >= m || m >= l) return h = e - a, k = f - b, Math.min(c * c + d * d, h * h + k * k); + a = h * d - k * c; + return a * a / l + }; + var Ya; + w.distanceSquared = Ya = function (a, b, c, d) { + a = c - a; + b = d - b; + return a * a + b * b + }; + var Za; + w.direction = Za = function (a, b, c, d) { + a = c - a; + b = d - b; + if (0 === a) return 0 < b ? 90 : 0 > b ? 270 : 0; + if (0 === b) return 0 < a ? 0 : 180; + if (isNaN(a) || isNaN(b)) return 0; + d = 180 * Math.atan(Math.abs(b / a)) / Math.PI; + 0 > a ? d = 0 > b ? d + 180 : 180 - d : 0 > b && (d = 360 - d); + return d + }; + w.prototype.isReal = w.prototype.J = function () { + return isFinite(this.x) && isFinite(this.y) + }; + + function ia(a, b) { + void 0 === a ? this.height = this.width = 0 : (this.width = a, this.height = b); + this.Ca = !1 + } + + u.fa("Size", ia); + u.Lh(ia); + u.Xd(ia, {width: !0, height: !0}); + ia.prototype.assign = function (a) { + this.width = a.width; + this.height = a.height + }; + ia.prototype.setTo = ia.prototype.m = function (a, b) { + this.width = a; + this.height = b; + return this + }; + ia.prototype.set = ia.prototype.set = function (a) { + this.I(); + this.width = a.width; + this.height = a.height; + return this + }; + ia.prototype.copy = function () { + var a = new ia; + a.width = this.width; + a.height = this.height; + return a + }; + g = ia.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Size is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + ia.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + return new ia(c, e) + } + return new ia + }; + ia.stringify = function (a) { + return a instanceof ia ? a.width.toString() + " " + a.height.toString() : a.toString() + }; + ia.prototype.toString = function () { + return "Size(" + this.width + "," + this.height + ")" + }; + ia.prototype.equals = ia.prototype.L = function (a) { + return a instanceof ia ? this.width === a.width && this.height === a.height : !1 + }; + ia.prototype.equalTo = ia.prototype.Tv = function (a, b) { + return this.width === a && this.height === b + }; + ia.prototype.equalsApprox = ia.prototype.De = function (a) { + return K.D(this.width, a.width) && K.D(this.height, a.height) + }; + ia.prototype.isReal = ia.prototype.J = function () { + return isFinite(this.width) && isFinite(this.height) + }; + + function z(a, b, c, d) { + void 0 === a ? this.height = this.width = this.y = this.x = 0 : a instanceof w ? b instanceof w ? (this.x = Math.min(a.x, b.x), this.y = Math.min(a.y, b.y), this.width = Math.abs(a.x - b.x), this.height = Math.abs(a.y - b.y)) : b instanceof ia ? (this.x = a.x, this.y = a.y, this.width = b.width, this.height = b.height) : u.k("Incorrect arguments supplied to Rect constructor") : (this.x = a, this.y = b, this.width = c, this.height = d); + this.Ca = !1 + } + + u.fa("Rect", z); + u.Lh(z); + u.Xd(z, {x: !0, y: !0, width: !0, height: !0}); + z.prototype.assign = function (a) { + this.x = a.x; + this.y = a.y; + this.width = a.width; + this.height = a.height + }; + + function bb(a, b, c) { + a.width = b; + a.height = c + } + + z.prototype.setTo = z.prototype.m = function (a, b, c, d) { + this.x = a; + this.y = b; + this.width = c; + this.height = d; + return this + }; + z.prototype.set = z.prototype.set = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + this.width = a.width; + this.height = a.height; + return this + }; + z.prototype.setPoint = z.prototype.yf = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + return this + }; + z.prototype.setSize = function (a) { + this.I(); + this.width = a.width; + this.height = a.height; + return this + }; + z.prototype.copy = function () { + var a = new z; + a.x = this.x; + a.y = this.y; + a.width = this.width; + a.height = this.height; + return a + }; + g = z.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Rect is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + z.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + for (var f = 0; "" === a[b];) b++; + (d = a[b++]) && (f = parseFloat(d)); + for (var h = 0; "" === a[b];) b++; + (d = a[b++]) && (h = parseFloat(d)); + return new z(c, e, f, h) + } + return new z + }; + z.stringify = function (a) { + return a instanceof z ? a.x.toString() + " " + a.y.toString() + " " + a.width.toString() + " " + a.height.toString() : a.toString() + }; + z.prototype.toString = function () { + return "Rect(" + this.x + "," + this.y + "," + this.width + "," + this.height + ")" + }; + z.prototype.equals = z.prototype.L = function (a) { + return a instanceof z ? this.x === a.x && this.y === a.y && this.width === a.width && this.height === a.height : !1 + }; + z.prototype.equalTo = z.prototype.Tv = function (a, b, c, d) { + return this.x === a && this.y === b && this.width === c && this.height === d + }; + z.prototype.equalsApprox = z.prototype.De = function (a) { + return K.D(this.x, a.x) && K.D(this.y, a.y) && K.D(this.width, a.width) && K.D(this.height, a.height) + }; + z.prototype.containsPoint = z.prototype.Aa = function (a) { + return this.x <= a.x && this.x + this.width >= a.x && this.y <= a.y && this.y + this.height >= a.y + }; + z.prototype.containsRect = z.prototype.Kj = function (a) { + return this.x <= a.x && a.x + a.width <= this.x + this.width && this.y <= a.y && a.y + a.height <= this.y + this.height + }; + z.prototype.contains = z.prototype.contains = function (a, b, c, d) { + void 0 === c && (c = 0); + void 0 === d && (d = 0); + return this.x <= a && a + c <= this.x + this.width && this.y <= b && b + d <= this.y + this.height + }; + z.prototype.reset = function () { + this.I(); + this.height = this.width = this.y = this.x = 0 + }; + z.prototype.offset = z.prototype.offset = function (a, b) { + this.I(); + this.x += a; + this.y += b; + return this + }; + z.prototype.inflate = z.prototype.Jf = function (a, b) { + return hb(this, b, a, b, a) + }; + z.prototype.addMargin = z.prototype.yv = function (a) { + return hb(this, a.top, a.right, a.bottom, a.left) + }; + z.prototype.subtractMargin = z.prototype.tI = function (a) { + return hb(this, -a.top, -a.right, -a.bottom, -a.left) + }; + z.prototype.grow = function (a, b, c, d) { + return hb(this, a, b, c, d) + }; + + function hb(a, b, c, d, e) { + a.I(); + var f = a.width; + c + e <= -f ? (a.x += f / 2, a.width = 0) : (a.x -= e, a.width += c + e); + c = a.height; + b + d <= -c ? (a.y += c / 2, a.height = 0) : (a.y -= b, a.height += b + d); + return a + } + + z.prototype.intersectRect = function (a) { + return ib(this, a.x, a.y, a.width, a.height) + }; + z.prototype.intersect = function (a, b, c, d) { + return ib(this, a, b, c, d) + }; + + function ib(a, b, c, d, e) { + a.I(); + var f = Math.max(a.x, b), h = Math.max(a.y, c); + b = Math.min(a.x + a.width, b + d); + c = Math.min(a.y + a.height, c + e); + a.x = f; + a.y = h; + a.width = Math.max(0, b - f); + a.height = Math.max(0, c - h); + return a + } + + z.prototype.intersectsRect = z.prototype.sg = function (a) { + return this.HD(a.x, a.y, a.width, a.height) + }; + z.prototype.intersects = z.prototype.HD = function (a, b, c, d) { + var e = this.width, f = this.x; + if (Infinity !== e && Infinity !== c && (e += f, c += a, isNaN(c) || isNaN(e) || f > c || a > e)) return !1; + a = this.height; + c = this.y; + return Infinity !== a && Infinity !== d && (a += c, d += b, isNaN(d) || isNaN(a) || c > d || b > a) ? !1 : !0 + }; + + function jb(a, b) { + var c = a.width, d = b.width + 10 + 10, e = a.x, f = b.x - 10; + if (e > d + f || f > c + e) return !1; + c = a.height; + d = b.height + 10 + 10; + e = a.y; + f = b.y - 10; + return e > d + f || f > c + e ? !1 : !0 + } + + z.prototype.unionPoint = z.prototype.Oi = function (a) { + return kb(this, a.x, a.y, 0, 0) + }; + z.prototype.unionRect = z.prototype.Sh = function (a) { + return kb(this, a.x, a.y, a.width, a.height) + }; + z.prototype.union = z.prototype.YE = function (a, b, c, d) { + this.I(); + void 0 === c && (c = 0); + void 0 === d && (d = 0); + return kb(this, a, b, c, d) + }; + + function kb(a, b, c, d, e) { + var f = Math.min(a.x, b), h = Math.min(a.y, c); + b = Math.max(a.x + a.width, b + d); + c = Math.max(a.y + a.height, c + e); + a.x = f; + a.y = h; + a.width = b - f; + a.height = c - h; + return a + } + + z.prototype.setSpot = z.prototype.rt = function (a, b, c) { + this.I(); + this.x = a - c.offsetX - c.x * this.width; + this.y = b - c.offsetY - c.y * this.height; + return this + }; + var qb; + z.contains = qb = function (a, b, c, d, e, f, h, k) { + void 0 === h && (h = 0); + void 0 === k && (k = 0); + return a <= e && e + h <= a + c && b <= f && f + k <= b + d + }; + z.intersects = function (a, b, c, d, e, f, h, k) { + c += a; + h += e; + if (a > h || e > c) return !1; + a = d + b; + k += f; + return b > k || f > a ? !1 : !0 + }; + u.defineProperty(z, {left: "left"}, function () { + return this.x + }, function (a) { + this.I(a); + this.x = a + }); + u.defineProperty(z, {top: "top"}, function () { + return this.y + }, function (a) { + this.I(a); + this.y = a + }); + u.defineProperty(z, {right: "right"}, function () { + return this.x + this.width + }, function (a) { + this.I(a); + this.x += a - (this.x + this.width) + }); + u.defineProperty(z, {bottom: "bottom"}, function () { + return this.y + this.height + }, function (a) { + this.I(a); + this.y += a - (this.y + this.height) + }); + u.defineProperty(z, {position: "position"}, function () { + return new w(this.x, this.y) + }, function (a) { + this.I(a); + this.x = a.x; + this.y = a.y + }); + u.defineProperty(z, {size: "size"}, function () { + return new ia(this.width, this.height) + }, function (a) { + this.I(a); + this.width = a.width; + this.height = a.height + }); + u.defineProperty(z, {Ok: "center"}, function () { + return new w(this.x + this.width / 2, this.y + this.height / 2) + }, function (a) { + this.I(a); + this.x = a.x - this.width / 2; + this.y = a.y - this.height / 2 + }); + u.defineProperty(z, {Ja: "centerX"}, function () { + return this.x + this.width / 2 + }, function (a) { + this.I(a); + this.x = a - this.width / 2 + }); + u.defineProperty(z, {Ua: "centerY"}, function () { + return this.y + this.height / 2 + }, function (a) { + this.I(a); + this.y = a - this.height / 2 + }); + z.prototype.isReal = z.prototype.J = function () { + return isFinite(this.x) && isFinite(this.y) && isFinite(this.width) && isFinite(this.height) + }; + z.prototype.isEmpty = function () { + return 0 === this.width && 0 === this.height + }; + + function rb(a, b, c, d) { + void 0 === a ? this.left = this.bottom = this.right = this.top = 0 : void 0 === b ? this.left = this.bottom = this.right = this.top = a : void 0 === c ? (d = b, this.top = a, this.right = b, this.bottom = a, this.left = d) : void 0 !== d ? (this.top = a, this.right = b, this.bottom = c, this.left = d) : u.k("Invalid arguments to Margin constructor"); + this.Ca = !1 + } + + u.fa("Margin", rb); + u.Lh(rb); + u.Xd(rb, {top: !0, right: !0, bottom: !0, left: !0}); + rb.prototype.assign = function (a) { + this.top = a.top; + this.right = a.right; + this.bottom = a.bottom; + this.left = a.left + }; + rb.prototype.setTo = rb.prototype.m = function (a, b, c, d) { + this.I(); + this.top = a; + this.right = b; + this.bottom = c; + this.left = d; + return this + }; + rb.prototype.set = rb.prototype.set = function (a) { + this.I(); + this.top = a.top; + this.right = a.right; + this.bottom = a.bottom; + this.left = a.left; + return this + }; + rb.prototype.copy = function () { + var a = new rb; + a.top = this.top; + a.right = this.right; + a.bottom = this.bottom; + a.left = this.left; + return a + }; + g = rb.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Margin is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + rb.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = NaN; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + if (isNaN(c)) return new rb; + for (var e = NaN; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + if (isNaN(e)) return new rb(c); + for (var f = NaN; "" === a[b];) b++; + (d = a[b++]) && (f = parseFloat(d)); + if (isNaN(f)) return new rb(c, e); + for (var h = NaN; "" === a[b];) b++; + (d = a[b++]) && (h = parseFloat(d)); + return isNaN(h) ? new rb(c, e) : new rb(c, e, f, h) + } + return new rb + }; + rb.stringify = function (a) { + return a instanceof rb ? a.top.toString() + " " + a.right.toString() + " " + a.bottom.toString() + " " + a.left.toString() : a.toString() + }; + rb.prototype.toString = function () { + return "Margin(" + this.top + "," + this.right + "," + this.bottom + "," + this.left + ")" + }; + rb.prototype.equals = rb.prototype.L = function (a) { + return a instanceof rb ? this.top === a.top && this.right === a.right && this.bottom === a.bottom && this.left === a.left : !1 + }; + rb.prototype.equalTo = rb.prototype.Tv = function (a, b, c, d) { + return this.top === a && this.right === b && this.bottom === c && this.left === d + }; + rb.prototype.equalsApprox = rb.prototype.De = function (a) { + return K.D(this.top, a.top) && K.D(this.right, a.right) && K.D(this.bottom, a.bottom) && K.D(this.left, a.left) + }; + rb.prototype.isReal = rb.prototype.J = function () { + return isFinite(this.top) && isFinite(this.right) && isFinite(this.bottom) && isFinite(this.left) + }; + + function ja() { + this.m11 = 1; + this.m21 = this.m12 = 0; + this.m22 = 1; + this.dy = this.dx = 0 + } + + u.Lh(ja); + u.Xd(ja, {m11: !0, m12: !0, m21: !0, m22: !0, dx: !0, dy: !0}); + ja.prototype.set = ja.prototype.set = function (a) { + this.m11 = a.m11; + this.m12 = a.m12; + this.m21 = a.m21; + this.m22 = a.m22; + this.dx = a.dx; + this.dy = a.dy; + return this + }; + ja.prototype.copy = function () { + var a = new ja; + a.m11 = this.m11; + a.m12 = this.m12; + a.m21 = this.m21; + a.m22 = this.m22; + a.dx = this.dx; + a.dy = this.dy; + return a + }; + ja.prototype.toString = function () { + return "Transform(" + this.m11 + "," + this.m12 + "," + this.m21 + "," + this.m22 + "," + this.dx + "," + this.dy + ")" + }; + ja.prototype.equals = ja.prototype.L = function (a) { + return a instanceof ja ? this.m11 === a.m11 && this.m12 === a.m12 && this.m21 === a.m21 && this.m22 === a.m22 && this.dx === a.dx && this.dy === a.dy : !1 + }; + ja.prototype.isIdentity = ja.prototype.Os = function () { + return 1 === this.m11 && 0 === this.m12 && 0 === this.m21 && 1 === this.m22 && 0 === this.dx && 0 === this.dy + }; + ja.prototype.reset = ja.prototype.reset = function () { + this.m11 = 1; + this.m21 = this.m12 = 0; + this.m22 = 1; + this.dy = this.dx = 0; + return this + }; + ja.prototype.multiply = ja.prototype.multiply = function (a) { + var b = this.m12 * a.m11 + this.m22 * a.m12, c = this.m11 * a.m21 + this.m21 * a.m22, + d = this.m12 * a.m21 + this.m22 * a.m22, e = this.m11 * a.dx + this.m21 * a.dy + this.dx, + f = this.m12 * a.dx + this.m22 * a.dy + this.dy; + this.m11 = this.m11 * a.m11 + this.m21 * a.m12; + this.m12 = b; + this.m21 = c; + this.m22 = d; + this.dx = e; + this.dy = f; + return this + }; + ja.prototype.multiplyInverted = ja.prototype.aE = function (a) { + var b = 1 / (a.m11 * a.m22 - a.m12 * a.m21), c = a.m22 * b, d = -a.m12 * b, e = -a.m21 * b, f = a.m11 * b, + h = b * (a.m21 * a.dy - a.m22 * a.dx), k = b * (a.m12 * a.dx - a.m11 * a.dy); + a = this.m12 * c + this.m22 * d; + b = this.m11 * e + this.m21 * f; + e = this.m12 * e + this.m22 * f; + f = this.m11 * h + this.m21 * k + this.dx; + h = this.m12 * h + this.m22 * k + this.dy; + this.m11 = this.m11 * c + this.m21 * d; + this.m12 = a; + this.m21 = b; + this.m22 = e; + this.dx = f; + this.dy = h; + return this + }; + ja.prototype.invert = ja.prototype.oz = function () { + var a = 1 / (this.m11 * this.m22 - this.m12 * this.m21), b = -this.m12 * a, c = -this.m21 * a, d = this.m11 * a, + e = a * (this.m21 * this.dy - this.m22 * this.dx), f = a * (this.m12 * this.dx - this.m11 * this.dy); + this.m11 = this.m22 * a; + this.m12 = b; + this.m21 = c; + this.m22 = d; + this.dx = e; + this.dy = f; + return this + }; + ja.prototype.rotate = ja.prototype.rotate = function (a, b, c) { + 360 <= a ? a -= 360 : 0 > a && (a += 360); + if (0 === a) return this; + this.translate(b, c); + var d = 0, e = 0; + 90 === a ? (d = 0, e = 1) : 180 === a ? (d = -1, e = 0) : 270 === a ? (d = 0, e = -1) : (e = a * Math.PI / 180, d = Math.cos(e), e = Math.sin(e)); + a = this.m12 * d + this.m22 * e; + var f = this.m11 * -e + this.m21 * d, h = this.m12 * -e + this.m22 * d; + this.m11 = this.m11 * d + this.m21 * e; + this.m12 = a; + this.m21 = f; + this.m22 = h; + this.translate(-b, -c); + return this + }; + ja.prototype.translate = ja.prototype.translate = function (a, b) { + this.dx += this.m11 * a + this.m21 * b; + this.dy += this.m12 * a + this.m22 * b; + return this + }; + ja.prototype.scale = ja.prototype.scale = function (a, b) { + void 0 === b && (b = a); + this.m11 *= a; + this.m12 *= a; + this.m21 *= b; + this.m22 *= b; + return this + }; + ja.prototype.transformPoint = ja.prototype.ab = function (a) { + var b = a.x, c = a.y; + a.x = b * this.m11 + c * this.m21 + this.dx; + a.y = b * this.m12 + c * this.m22 + this.dy; + return a + }; + ja.prototype.invertedTransformPoint = ja.prototype.Oh = function (a) { + var b = 1 / (this.m11 * this.m22 - this.m12 * this.m21), c = -this.m12 * b, d = this.m11 * b, + e = b * (this.m12 * this.dx - this.m11 * this.dy), f = a.x, h = a.y; + a.x = f * this.m22 * b + h * -this.m21 * b + b * (this.m21 * this.dy - this.m22 * this.dx); + a.y = f * c + h * d + e; + return a + }; + ja.prototype.transformRect = ja.prototype.WE = function (a) { + var b = a.x, c = a.y, d = b + a.width, e = c + a.height, f = this.m11, h = this.m12, k = this.m21, l = this.m22, + m = this.dx, n = this.dy, p = b * f + c * k + m, q = b * h + c * l + n, r = d * f + c * k + m, + c = d * h + c * l + n, s = b * f + e * k + m, b = b * h + e * l + n, f = d * f + e * k + m, + d = d * h + e * l + n, e = p, h = q, p = Math.min(p, r), e = Math.max(e, r), h = Math.min(h, c), + q = Math.max(q, c), p = Math.min(p, s), e = Math.max(e, s), h = Math.min(h, b), q = Math.max(q, b), + p = Math.min(p, f), e = Math.max(e, f), h = Math.min(h, d), q = Math.max(q, d); + a.x = p; + a.y = h; + a.width = e - p; + a.height = q - h; + return a + }; + + function L(a, b, c, d) { + void 0 === a ? this.offsetY = this.offsetX = this.y = this.x = 0 : (void 0 === b && (b = 0), void 0 === c && (c = 0), void 0 === d && (d = 0), this.x = a, this.y = b, this.offsetX = c, this.offsetY = d); + this.Ca = !1 + } + + u.fa("Spot", L); + u.Lh(L); + u.Xd(L, {x: !0, y: !0, offsetX: !0, offsetY: !0}); + L.prototype.assign = function (a) { + this.x = a.x; + this.y = a.y; + this.offsetX = a.offsetX; + this.offsetY = a.offsetY + }; + L.prototype.setTo = L.prototype.m = function (a, b, c, d) { + this.I(); + this.x = a; + this.y = b; + this.offsetX = c; + this.offsetY = d; + return this + }; + L.prototype.set = L.prototype.set = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + this.offsetX = a.offsetX; + this.offsetY = a.offsetY; + return this + }; + L.prototype.copy = function () { + var a = new L; + a.x = this.x; + a.y = this.y; + a.offsetX = this.offsetX; + a.offsetY = this.offsetY; + return a + }; + g = L.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Spot is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + + function sb(a, b) { + a.x = NaN; + a.y = NaN; + a.offsetX = b; + return a + } + + var tb; + L.parse = tb = function (a) { + if ("string" === typeof a) { + a = a.trim(); + if ("None" === a) return vb; + if ("TopLeft" === a) return xb; + if ("Top" === a || "TopCenter" === a || "MiddleTop" === a) return Db; + if ("TopRight" === a) return Gb; + if ("Left" === a || "LeftCenter" === a || "MiddleLeft" === a) return Hb; + if ("Center" === a) return Ib; + if ("Right" === a || "RightCenter" === a || "MiddleRight" === a) return Jb; + if ("BottomLeft" === a) return Kb; + if ("Bottom" === a || "BottomCenter" === a || "MiddleBottom" === a) return Ub; + if ("BottomRight" === a) return Vb; + if ("TopSide" === a) return Wb; + if ("LeftSide" === + a) return Xb; + if ("RightSide" === a) return Yb; + if ("BottomSide" === a) return Zb; + if ("TopBottomSides" === a) return $b; + if ("LeftRightSides" === a) return ac; + if ("TopLeftSides" === a) return bc; + if ("TopRightSides" === a) return cc; + if ("BottomLeftSides" === a) return hc; + if ("BottomRightSides" === a) return ic; + if ("NotTopSide" === a) return lc; + if ("NotLeftSide" === a) return mc; + if ("NotRightSide" === a) return rc; + if ("NotBottomSide" === a) return sc; + if ("AllSides" === a) return tc; + if ("Default" === a) return uc; + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + void 0 !== d && 0 < d.length && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + d = a[b++]; + void 0 !== d && 0 < d.length && (e = parseFloat(d)); + for (var f = 0; "" === a[b];) b++; + d = a[b++]; + void 0 !== d && 0 < d.length && (f = parseFloat(d)); + for (var h = 0; "" === a[b];) b++; + d = a[b++]; + void 0 !== d && 0 < d.length && (h = parseFloat(d)); + return new L(c, e, f, h) + } + return new L + }; + L.stringify = function (a) { + return a instanceof L ? a.pd() ? a.x.toString() + " " + a.y.toString() + " " + a.offsetX.toString() + " " + a.offsetY.toString() : a.toString() : a.toString() + }; + L.prototype.toString = function () { + return this.pd() ? 0 === this.offsetX && 0 === this.offsetY ? "Spot(" + this.x + "," + this.y + ")" : "Spot(" + this.x + "," + this.y + "," + this.offsetX + "," + this.offsetY + ")" : this.L(vb) ? "None" : this.L(xb) ? "TopLeft" : this.L(Db) ? "Top" : this.L(Gb) ? "TopRight" : this.L(Hb) ? "Left" : this.L(Ib) ? "Center" : this.L(Jb) ? "Right" : this.L(Kb) ? "BottomLeft" : this.L(Ub) ? "Bottom" : this.L(Vb) ? "BottomRight" : this.L(Wb) ? "TopSide" : this.L(Xb) ? "LeftSide" : this.L(Yb) ? "RightSide" : this.L(Zb) ? "BottomSide" : this.L($b) ? "TopBottomSides" : this.L(ac) ? + "LeftRightSides" : this.L(bc) ? "TopLeftSides" : this.L(cc) ? "TopRightSides" : this.L(hc) ? "BottomLeftSides" : this.L(ic) ? "BottomRightSides" : this.L(lc) ? "NotTopSide" : this.L(mc) ? "NotLeftSide" : this.L(rc) ? "NotRightSide" : this.L(sc) ? "NotBottomSide" : this.L(tc) ? "AllSides" : this.L(uc) ? "Default" : "None" + }; + L.prototype.equals = L.prototype.L = function (a) { + return a instanceof L ? (this.x === a.x || isNaN(this.x) && isNaN(a.x)) && (this.y === a.y || isNaN(this.y) && isNaN(a.y)) && this.offsetX === a.offsetX && this.offsetY === a.offsetY : !1 + }; + L.prototype.opposite = function () { + return new L(.5 - (this.x - .5), .5 - (this.y - .5), -this.offsetX, -this.offsetY) + }; + L.prototype.includesSide = function (a) { + if (!this.Go() || !a.Go()) return !1; + a = a.offsetY; + return (this.offsetY & a) === a + }; + L.prototype.isSpot = L.prototype.pd = function () { + return !isNaN(this.x) && !isNaN(this.y) + }; + L.prototype.isNoSpot = L.prototype.ne = function () { + return isNaN(this.x) || isNaN(this.y) + }; + L.prototype.isSide = L.prototype.Go = function () { + return this.ne() && 1 === this.offsetX && 0 !== this.offsetY + }; + L.prototype.isDefault = L.prototype.Lc = function () { + return isNaN(this.x) && isNaN(this.y) && -1 === this.offsetX && 0 === this.offsetY + }; + var vb; + L.None = vb = sb(new L(0, 0, 0, 0), 0).Ka(); + var uc; + L.Default = uc = sb(new L(0, 0, -1, 0), -1).Ka(); + var xb; + L.TopLeft = xb = (new L(0, 0, 0, 0)).Ka(); + var Db; + L.TopCenter = Db = (new L(.5, 0, 0, 0)).Ka(); + var Gb; + L.TopRight = Gb = (new L(1, 0, 0, 0)).Ka(); + var Hb; + L.LeftCenter = Hb = (new L(0, .5, 0, 0)).Ka(); + var Ib; + L.Center = Ib = (new L(.5, .5, 0, 0)).Ka(); + var Jb; + L.RightCenter = Jb = (new L(1, .5, 0, 0)).Ka(); + var Kb; + L.BottomLeft = Kb = (new L(0, 1, 0, 0)).Ka(); + var Ub; + L.BottomCenter = Ub = (new L(.5, 1, 0, 0)).Ka(); + var Vb; + L.BottomRight = Vb = (new L(1, 1, 0, 0)).Ka(); + var vc; + L.MiddleTop = vc = Db; + var wc; + L.MiddleLeft = wc = Hb; + var xc; + L.MiddleRight = xc = Jb; + var Cc; + L.MiddleBottom = Cc = Ub; + L.Top = Db; + var Dc; + L.Left = Dc = Hb; + var Kc; + L.Right = Kc = Jb; + L.Bottom = Ub; + var Wb; + L.TopSide = Wb = sb(new L(0, 0, 1, u.Xc), 1).Ka(); + var Xb; + L.LeftSide = Xb = sb(new L(0, 0, 1, u.Fc), 1).Ka(); + var Yb; + L.RightSide = Yb = sb(new L(0, 0, 1, u.Oc), 1).Ka(); + var Zb; + L.BottomSide = Zb = sb(new L(0, 0, 1, u.Nc), 1).Ka(); + var $b; + L.TopBottomSides = $b = sb(new L(0, 0, 1, u.Xc | u.Nc), 1).Ka(); + var ac; + L.LeftRightSides = ac = sb(new L(0, 0, 1, u.Fc | u.Oc), 1).Ka(); + var bc; + L.TopLeftSides = bc = sb(new L(0, 0, 1, u.Xc | u.Fc), 1).Ka(); + var cc; + L.TopRightSides = cc = sb(new L(0, 0, 1, u.Xc | u.Oc), 1).Ka(); + var hc; + L.BottomLeftSides = hc = sb(new L(0, 0, 1, u.Nc | u.Fc), 1).Ka(); + var ic; + L.BottomRightSides = ic = sb(new L(0, 0, 1, u.Nc | u.Oc), 1).Ka(); + var lc; + L.NotTopSide = lc = sb(new L(0, 0, 1, u.Fc | u.Oc | u.Nc), 1).Ka(); + var mc; + L.NotLeftSide = mc = sb(new L(0, 0, 1, u.Xc | u.Oc | u.Nc), 1).Ka(); + var rc; + L.NotRightSide = rc = sb(new L(0, 0, 1, u.Xc | u.Fc | u.Nc), 1).Ka(); + var sc; + L.NotBottomSide = sc = sb(new L(0, 0, 1, u.Xc | u.Fc | u.Oc), 1).Ka(); + var tc; + L.AllSides = tc = sb(new L(0, 0, 1, u.Xc | u.Fc | u.Oc | u.Nc), 1).Ka(); + + function Lc() { + this.$e = [1, 0, 0, 1, 0, 0] + } + + Lc.prototype.copy = function () { + var a = new Lc; + a.$e[0] = this.$e[0]; + a.$e[1] = this.$e[1]; + a.$e[2] = this.$e[2]; + a.$e[3] = this.$e[3]; + a.$e[4] = this.$e[4]; + a.$e[5] = this.$e[5]; + return a + }; + + function Mc(a) { + this.type = a; + this.r2 = this.y2 = this.x2 = this.r1 = this.y1 = this.x1 = 0; + this.YC = [] + } + + Mc.prototype.addColorStop = function (a, b) { + this.YC.push({offset: a, color: b}) + }; + + function Nc(a, b, c) { + this.fillStyle = "#000000"; + this.font = "10px sans-serif"; + this.globalAlpha = 1; + this.lineCap = "butt"; + this.nw = 0; + this.lineJoin = "miter"; + this.lineWidth = 1; + this.miterLimit = 10; + this.shadowBlur = 0; + this.shadowColor = "rgba(0, 0, 0, 0)"; + this.shadowOffsetY = this.shadowOffsetX = 0; + this.strokeStyle = "#000000"; + this.textAlign = "start"; + this.document = b || document; + this.nD = c; + this.kw = null; + this.path = []; + this.Ei = new Lc; + this.stack = []; + this.rf = []; + this.HE = this.BD = this.Mv = 0; + this.Rv = a; + this.IH = "http://www.w3.org/2000/svg"; + this.width = + this.Rv.width; + this.height = this.Rv.height; + this.sl = Oc(this, "svg", { + width: this.width + "px", + height: this.height + "px", + EK: "0 0 " + this.Rv.width + " " + this.Rv.height + }); + this.sl.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "http://www.w3.org/2000/svg"); + this.sl.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + Uc(this, 1, 0, 0, 1, 0, 0); + a = Oc(this, "clipPath", {id: "mainClip"}); + a.appendChild(Oc(this, "rect", {x: 0, y: 0, width: this.width, height: this.height})); + this.sl.appendChild(a); + this.rf[0].setAttributeNS(null, "clip-path", "url(#mainClip)") + } + + g = Nc.prototype; + g.arc = function (a, b, c, d, e, f) { + Vc(this, a, b, c, d, e, f) + }; + g.beginPath = function () { + this.path = [] + }; + g.bezierCurveTo = function (a, b, c, d, e, f) { + this.path.push(["C", a, b, c, d, e, f]) + }; + g.clearRect = function () { + }; + g.clip = function () { + Wc(this, "clipPath", this.path, new Lc) + }; + g.closePath = function () { + this.path.push(["z"]) + }; + g.createLinearGradient = function (a, b, c, d) { + var e = new Mc("linear"); + e.x1 = a; + e.y1 = b; + e.x2 = c; + e.y2 = d; + return e + }; + g.createPattern = function () { + }; + g.createRadialGradient = function (a, b, c, d, e, f) { + var h = new Mc("radial"); + h.x1 = a; + h.y1 = b; + h.r1 = c; + h.x2 = d; + h.y2 = e; + h.r2 = f; + return h + }; + g.drawImage = function (a, b, c, d, e, f, h, k, l) { + a = [b, c, d, e, f, h, k, l, a]; + b = this.Ei; + e = a[8]; + c = ""; + e instanceof HTMLCanvasElement && (c = e.toDataURL()); + e instanceof HTMLImageElement && (c = e.src); + c = {x: 0, y: 0, width: a[6], height: a[7], href: c}; + d = ""; + f = a[6] / a[2]; + h = a[7] / a[3]; + if (0 !== a[4] || 0 !== a[5]) d += " translate(" + a[4] + ", " + a[5] + ")"; + if (1 !== f || 1 !== h) d += " scale(" + f + ", " + h + ")"; + if (0 !== a[0] || 0 !== a[1]) d += " translate(" + -a[0] + ", " + -a[1] + ")"; + if (0 !== a[0] || 0 !== a[1] || a[2] !== e.naturalWidth || a[3] !== e.naturalHeight) e = "CLIP" + this.Mv, this.Mv++, + f = Oc(this, "clipPath", {id: e}), f.appendChild(Oc(this, "rect", { + x: a[0], + y: a[1], + width: a[2], + height: a[3] + })), this.sl.appendChild(f), c["clip-path"] = "url(#" + e + ")"; + Xc(this, "image", c, b, d); + this.addElement("image", c) + }; + g.fill = function () { + Wc(this, "fill", this.path, this.Ei) + }; + g.fillRect = function (a, b, c, d) { + Yc(this, "fill", [a, b, c, d], this.Ei) + }; + g.fillText = function (a, b, c) { + a = [a, b, c]; + b = this.textAlign; + "left" === b ? b = "start" : "right" === b ? b = "end" : "center" === b && (b = "middle"); + b = {x: a[1], y: a[2], style: "font: " + this.font, "text-anchor": b}; + Xc(this, "fill", b, this.Ei); + this.addElement("text", b, a[0]) + }; + g.lineTo = function (a, b) { + this.path.push(["L", a, b]) + }; + g.moveTo = function (a, b) { + this.path.push(["M", a, b]) + }; + g.quadraticCurveTo = function (a, b, c, d) { + this.path.push(["Q", a, b, c, d]) + }; + g.rect = function (a, b, c, d) { + this.path.push(["M", a, b], ["L", a + c, b], ["L", a + c, b + d], ["L", a, b + d], ["z"]) + }; + g.restore = function () { + this.Ei = this.stack.pop(); + this.path = this.stack.pop(); + var a = this.stack.pop(); + this.fillStyle = a.fillStyle; + this.font = a.font; + this.globalAlpha = a.globalAlpha; + this.lineCap = a.lineCap; + this.nw = a.nw; + this.lineJoin = a.lineJoin; + this.lineWidth = a.lineWidth; + this.miterLimit = a.miterLimit; + this.shadowBlur = a.shadowBlur; + this.shadowColor = a.shadowColor; + this.shadowOffsetX = a.shadowOffsetX; + this.shadowOffsetY = a.shadowOffsetY; + this.strokeStyle = a.strokeStyle; + this.textAlign = a.textAlign + }; + g.save = function () { + this.stack.push({ + fillStyle: this.fillStyle, + font: this.font, + globalAlpha: this.globalAlpha, + lineCap: this.lineCap, + nw: this.nw, + lineJoin: this.lineJoin, + lineWidth: this.lineWidth, + miterLimit: this.miterLimit, + shadowBlur: this.shadowBlur, + shadowColor: this.shadowColor, + shadowOffsetX: this.shadowOffsetX, + shadowOffsetY: this.shadowOffsetY, + strokeStyle: this.strokeStyle, + textAlign: this.textAlign + }); + for (var a = [], b = 0; b < this.path.length; b++) a.push(this.path[b]); + this.stack.push(a); + this.stack.push(this.Ei.copy()) + }; + g.setTransform = function (a, b, c, d, e, f) { + 1 === a && 0 === b && 0 === c && 1 === d && 0 === e && 0 === f || Uc(this, a, b, c, d, e, f) + }; + g.scale = function () { + }; + g.stroke = function () { + Wc(this, "stroke", this.path, this.Ei) + }; + g.strokeRect = function (a, b, c, d) { + Yc(this, "stroke", [a, b, c, d], this.Ei) + }; + + function Oc(a, b, c, d) { + a = a.document.createElementNS(a.IH, b); + if (u.Sa(c)) for (var e in c) a.setAttributeNS("href" === e ? "http://www.w3.org/1999/xlink" : "", e, c[e]); + void 0 !== d && (a.textContent = d); + return a + } + + g.addElement = function (a, b, c) { + a = Oc(this, a, b, c); + 0 < this.rf.length ? this.rf[this.rf.length - 1].appendChild(a) : this.sl.appendChild(a); + return this.kw = a + }; + + function Xc(a, b, c, d, e) { + 1 !== a.globalAlpha && (c.opacity = a.globalAlpha); + "fill" == b ? (/^rgba\(/.test(a.fillStyle) ? (a = /^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.fillStyle), c.fill = "rgb(" + a[1] + "," + a[2] + "," + a[3] + ")", c["fill-opacity"] = a[4]) : c.fill = a.fillStyle instanceof Mc ? Zc(a, a.fillStyle) : a.fillStyle, c.stroke = "none") : "stroke" == b && (c.fill = "none", /^rgba\(/.test(a.strokeStyle) ? (b = /^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.strokeStyle), + c.stroke = "rgb(" + b[1] + "," + b[2] + "," + b[3] + ")", c["stroke-opacity"] = b[4]) : c.stroke = a.strokeStyle instanceof Mc ? Zc(a, a.strokeStyle) : a.strokeStyle, c["stroke-width"] = a.lineWidth, c["stroke-linecap"] = a.lineCap, c["stroke-linejoin"] = a.lineJoin, c["stroke-miterlimit"] = a.miterLimit); + d = d.$e; + d = "matrix(" + d[0] + ", " + d[1] + ", " + d[2] + ", " + d[3] + ", " + d[4] + ", " + d[5] + ")"; + void 0 !== e && (d += e); + c.transform = d + } + + function Zc(a, b) { + var c = "GRAD" + a.BD; + a.BD++; + var d; + if ("linear" === b.type) d = { + x1: b.x1, + x2: b.x2, + y1: b.y1, + y2: b.y2, + id: c, + gradientUnits: "userSpaceOnUse" + }, d = Oc(a, "linearGradient", d); else if ("radial" === b.type) d = { + x1: b.x1, + x2: b.x2, + y1: b.y1, + y2: b.y2, + r1: b.r1, + r2: b.r2, + id: c + }, d = Oc(a, "radialGradient", d); else throw Error("invalid gradient"); + for (var e = b.YC, f = e.length, h = [], k = 0; k < f; k++) { + var l = e[k], m = l.color, l = {offset: l.offset, "stop-color": m}; + /^rgba\(/.test(m) && (m = /^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(m), + l["stop-color"] = "rgb(" + m[1] + "," + m[2] + "," + m[3] + ")", l["stop-opacity"] = m[4]); + h.push(l) + } + h.sort(function (a, b) { + return a.offset > b.offset ? 1 : -1 + }); + for (k = 0; k < f; k++) d.appendChild(Oc(a, "stop", h[k])); + a.sl.appendChild(d); + return "url(#" + c + ")" + } + + function Yc(a, b, c, d) { + c = {x: c[0], y: c[1], width: c[2], height: c[3]}; + Xc(a, b, c, d); + a.addElement("rect", c) + } + + function Wc(a, b, c, d) { + for (var e = [], f = 0; f < c.length; f++) { + var h = u.Pk(c[f]), k = [h.shift()]; + if ("A" == k[0]) k.push(h.shift() + "," + h.shift(), h.shift(), h.shift() + "," + h.shift(), h.shift() + "," + h.shift()); else for (; h.length;) k.push(h.shift() + "," + h.shift()); + e.push(k.join(" ")) + } + c = {d: e.join(" ")}; + Xc(a, b, c, d); + "clipPath" === b ? (b = "CLIP" + a.Mv, a.Mv++, d = Oc(a, "clipPath", {id: b}), d.appendChild(Oc(a, "path", c)), a.sl.appendChild(d), 0 < a.rf.length && a.rf[a.rf.length - 1].setAttributeNS(null, "clip-path", "url(#" + b + ")")) : a.addElement("path", + c) + } + + function Vc(a, b, c, d, e, f, h) { + var k = Math.abs(e - f); + if (e != f) { + var l = b + d * Math.cos(f); + f = c + d * Math.sin(f); + k >= 2 * Math.PI ? (Vc(a, b, c, d, e, e + Math.PI, h), Vc(a, b, c, d, e + Math.PI, e + 2 * Math.PI, h), a.path.push(["M", l, f])) : (b += d * Math.cos(e), c += d * Math.sin(e), k = 180 * k / Math.PI, e = h ? 0 : 1, h = 180 <= k == !!h ? 0 : 1, 0 !== a.path.length ? a.path.push(["L", b, c]) : a.path.push(["M", b, c]), a.path.push(["A", d, d, k, h, e, l, f])) + } + } + + function Uc(a, b, c, d, e, f, h) { + var k = new Lc; + k.$e = [b, c, d, e, f, h]; + b = {}; + Xc(a, "g", b, k); + k = a.addElement("g", b); + a.rf.push(k) + } + + g.$a = function () { + if (0 !== this.shadowOffsetX || 0 !== this.shadowOffsetY || 0 !== this.shadowBlur) { + var a = "SHADOW" + this.HE; + this.HE++; + var b = this.addElement("filter", {id: a, x: "-100%", y: "-100%", width: "300%", height: "300%"}, null), c, + d, e, f, h; + c = Oc(this, "feGaussianBlur", {"in": "SourceAlpha", result: "blur", vK: this.shadowBlur / 2}); + d = Oc(this, "feFlood", {"in": "blur", result: "flood", "flood-color": this.shadowColor}); + e = Oc(this, "feComposite", {"in": "flood", in2: "blur", operator: "in", result: "comp"}); + f = Oc(this, "feOffset", { + "in": "comp", result: "offsetBlur", + dx: this.shadowOffsetX, dy: this.shadowOffsetY + }); + h = Oc(this, "feMerge", {}); + h.appendChild(Oc(this, "feMergeNode", {"in": "offsetBlur"})); + h.appendChild(Oc(this, "feMergeNode", {"in": "SourceGraphic"})); + b.appendChild(c); + b.appendChild(d); + b.appendChild(e); + b.appendChild(f); + b.appendChild(h); + 0 < this.rf.length && this.rf[this.rf.length - 1].setAttributeNS(null, "filter", "url(#" + a + ")") + } + }; + + function oa(a, b) { + this.ownerDocument = void 0 === b ? document : b; + var c = this.ownerDocument.createElement("canvas"); + c.tabIndex = 0; + this.Dd = c; + c.getContext && c.getContext("2d") || u.k("Browser does not support HTML Canvas Element"); + this.dG = c.getContext("2d"); + c.Y = a; + Object.seal(this) + } + + g = oa.prototype; + g.getContext = function () { + return this.dG + }; + g.toDataURL = function (a, b) { + return this.Dd.toDataURL(a, b) + }; + g.getBoundingClientRect = function () { + return this.Dd.getBoundingClientRect() + }; + g.focus = function () { + return this.Dd.focus() + }; + g.addEventListener = function (a, b, c) { + this.Dd.addEventListener(a, b, c) + }; + g.removeEventListener = function (a, b, c) { + this.Dd.removeEventListener(a, b, c) + }; + u.defineProperty(oa, {width: "width"}, function () { + return this.Dd.width + }, function (a) { + this.Dd.width = a + }); + u.defineProperty(oa, {height: "height"}, function () { + return this.Dd.height + }, function (a) { + this.Dd.height = a + }); + u.defineProperty(oa, {style: "style"}, function () { + return this.Dd.style + }, function (a) { + this.Dd.style = a + }); + var K = { + sa: 4 * ((Math.sqrt(2) - 1) / 3), + Wj: (new w(0, 0)).Ka(), + kF: (new z(0, 0, 0, 0)).Ka(), + np: (new rb(0, 0, 0, 0)).Ka(), + iF: (new rb(2, 2, 2, 2)).Ka(), + jF: (new ia(Infinity, Infinity)).Ka(), + fF: (new w(-Infinity, -Infinity)).Ka(), + eF: (new w(Infinity, Infinity)).Ka(), + op: (new ia(0, 0)).Ka(), + Tw: (new ia(1, 1)).Ka(), + mp: (new ia(6, 6)).Ka(), + Qw: (new ia(8, 8)).Ka(), + gF: (new w(NaN, NaN)).Ka(), + Uw: new pa, + Qi: new pa, + vA: null, + sqrt: function (a) { + if (0 >= a) return 0; + var b = K.vA; + if (null === b) { + for (var b = [], c = 0; 2E3 >= c; c++) b[c] = Math.sqrt(c); + K.vA = b + } + return 1 > a ? + (c = 1 / a, 2E3 >= c ? 1 / b[c | 0] : Math.sqrt(a)) : 2E3 >= a ? b[a | 0] : Math.sqrt(a) + }, + D: function (a, b) { + var c = a - b; + return .5 > c && -.5 < c + }, + mb: function (a, b) { + var c = a - b; + return 5E-8 > c && -5E-8 < c + }, + Hd: function (a, b, c, d, e, f, h) { + 0 >= e && (e = 1E-6); + var k = 0, l = 0, m = 0, n = 0; + a < c ? (l = a, k = c) : (l = c, k = a); + b < d ? (n = b, m = d) : (n = d, m = b); + if (a === c) return n <= h && h <= m && a - e <= f && f <= a + e; + if (b === d) return l <= f && f <= k && b - e <= h && h <= b + e; + k += e; + l -= e; + if (l <= f && f <= k && (m += e, n -= e, n <= h && h <= m)) if (k - l > m - n) if (a - c > e || c - a > e) { + if (f = (d - b) / (c - a) * (f - a) + b, f - e <= h && h <= f + e) return !0 + } else return !0; else if (b - + d > e || d - b > e) { + if (h = (c - a) / (d - b) * (h - b) + a, h - e <= f && f <= h + e) return !0 + } else return !0; + return !1 + }, + Iv: function (a, b, c, d, e, f, h, k, l, m, n, p) { + if (K.Hd(a, b, h, k, p, c, d) && K.Hd(a, b, h, k, p, e, f)) return K.Hd(a, b, h, k, p, m, n); + var q = (a + c) / 2, r = (b + d) / 2, s = (c + e) / 2, t = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (q + s) / 2; + c = (r + t) / 2; + var s = (s + e) / 2, t = (t + f) / 2, v = (d + s) / 2, x = (c + t) / 2; + return K.Iv(a, b, q, r, d, c, v, x, l, m, n, p) || K.Iv(v, x, s, t, e, f, h, k, l, m, n, p) + }, + UF: function (a, b, c, d, e, f, h, k, l) { + var m = (c + e) / 2, n = (d + f) / 2; + l.x = (((a + c) / 2 + m) / 2 + (m + (e + h) / 2) / 2) / 2; + l.y = (((b + d) / 2 + n) / 2 + (n + + (f + k) / 2) / 2) / 2; + return l + }, + TF: function (a, b, c, d, e, f, h, k) { + var l = (c + e) / 2, m = (d + f) / 2; + return Za(((a + c) / 2 + l) / 2, ((b + d) / 2 + m) / 2, (l + (e + h) / 2) / 2, (m + (f + k) / 2) / 2) + }, + oo: function (a, b, c, d, e, f, h, k, l, m) { + if (K.Hd(a, b, h, k, l, c, d) && K.Hd(a, b, h, k, l, e, f)) kb(m, a, b, 0, 0), kb(m, h, k, 0, 0); else { + var n = (a + c) / 2, p = (b + d) / 2, q = (c + e) / 2, r = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (n + q) / 2; + c = (p + r) / 2; + var q = (q + e) / 2, r = (r + f) / 2, s = (d + q) / 2, t = (c + r) / 2; + K.oo(a, b, n, p, d, c, s, t, l, m); + K.oo(s, t, q, r, e, f, h, k, l, m) + } + return m + }, + ye: function (a, b, c, d, e, f, h, k, l, m) { + if (K.Hd(a, b, h, k, l, c, d) && + K.Hd(a, b, h, k, l, e, f)) 0 === m.length && (m.push(a), m.push(b)), m.push(h), m.push(k); else { + var n = (a + c) / 2, p = (b + d) / 2, q = (c + e) / 2, r = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (n + q) / 2; + c = (p + r) / 2; + var q = (q + e) / 2, r = (r + f) / 2, s = (d + q) / 2, t = (c + r) / 2; + K.ye(a, b, n, p, d, c, s, t, l, m); + K.ye(s, t, q, r, e, f, h, k, l, m) + } + return m + }, + Oz: function (a, b, c, d, e, f, h, k, l, m) { + if (K.Hd(a, b, e, f, m, c, d)) return K.Hd(a, b, e, f, m, k, l); + var n = (a + c) / 2, p = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var q = (n + c) / 2, r = (p + d) / 2; + return K.Oz(a, b, n, p, q, r, h, k, l, m) || K.Oz(q, r, c, d, e, f, h, k, l, m) + }, + nK: function (a, b, c, + d, e, f, h) { + h.x = ((a + c) / 2 + (c + e) / 2) / 2; + h.y = ((b + d) / 2 + (d + f) / 2) / 2; + return h + }, + Nz: function (a, b, c, d, e, f, h, k) { + if (K.Hd(a, b, e, f, h, c, d)) kb(k, a, b, 0, 0), kb(k, e, f, 0, 0); else { + var l = (a + c) / 2, m = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var n = (l + c) / 2, p = (m + d) / 2; + K.Nz(a, b, l, m, n, p, h, k); + K.Nz(n, p, c, d, e, f, h, k) + } + return k + }, + Xo: function (a, b, c, d, e, f, h, k) { + if (K.Hd(a, b, e, f, h, c, d)) 0 === k.length && (k.push(a), k.push(b)), k.push(e), k.push(f); else { + var l = (a + c) / 2, m = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var n = (l + c) / 2, p = (m + d) / 2; + K.Xo(a, b, l, m, n, p, h, k); + K.Xo(n, p, c, d, e, f, h, k) + } + return k + }, + js: function (a, b, c, d, e, f, h, k, l, m, n, p, q, r) { + 0 >= q && (q = 1E-6); + if (K.Hd(a, b, h, k, q, c, d) && K.Hd(a, b, h, k, q, e, f)) { + var s = (a - h) * (m - p) - (b - k) * (l - n); + if (0 === s) return !1; + q = ((a * k - b * h) * (l - n) - (a - h) * (l * p - m * n)) / s; + s = ((a * k - b * h) * (m - p) - (b - k) * (l * p - m * n)) / s; + if ((l > n ? l - n : n - l) < (m > p ? m - p : p - m)) { + if (h = l = 0, b < k ? (l = b, h = k) : (l = k, h = b), s < l || s > h) return !1 + } else if (a < h ? l = a : (l = h, h = a), q < l || q > h) return !1; + r.x = q; + r.y = s; + return !0 + } + var s = (a + c) / 2, t = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + var v = (s + c) / 2, x = (t + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var B = (v + c) / 2, y = (x + d) / + 2, C = (n - l) * (n - l) + (p - m) * (p - m), I = !1; + K.js(a, b, s, t, v, x, B, y, l, m, n, p, q, r) && (b = (r.x - l) * (r.x - l) + (r.y - m) * (r.y - m), b < C && (C = b, I = !0)); + a = r.x; + s = r.y; + K.js(B, y, c, d, e, f, h, k, l, m, n, p, q, r) && (b = (r.x - l) * (r.x - l) + (r.y - m) * (r.y - m), b < C ? I = !0 : (r.x = a, r.y = s)); + return I + }, + ks: function (a, b, c, d, e, f, h, k, l, m, n, p, q) { + var r = 0; + 0 >= q && (q = 1E-6); + if (K.Hd(a, b, h, k, q, c, d) && K.Hd(a, b, h, k, q, e, f)) { + q = (a - h) * (m - p) - (b - k) * (l - n); + if (0 === q) return r; + var s = ((a * k - b * h) * (l - n) - (a - h) * (l * p - m * n)) / q, + t = ((a * k - b * h) * (m - p) - (b - k) * (l * p - m * n)) / q; + if (s >= n) return r; + if ((l > n ? l - n : n - l) < + (m > p ? m - p : p - m)) { + if (a = l = 0, b < k ? (l = b, a = k) : (l = k, a = b), t < l || t > a) return r + } else if (a < h ? (l = a, a = h) : l = h, s < l || s > a) return r; + 0 < q ? r++ : 0 > q && r-- + } else { + var s = (a + c) / 2, t = (b + d) / 2, v = (c + e) / 2, x = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (s + v) / 2; + c = (t + x) / 2; + var v = (v + e) / 2, x = (x + f) / 2, B = (d + v) / 2, y = (c + x) / 2, + r = r + K.ks(a, b, s, t, d, c, B, y, l, m, n, p, q), + r = r + K.ks(B, y, v, x, e, f, h, k, l, m, n, p, q) + } + return r + }, + Hm: function (a, b, c, d, e, f, h) { + if (K.mb(a, c)) { + var k = 0; + c = 0; + b < d ? (k = b, c = d) : (k = d, c = b); + d = f; + if (d < k) return h.x = a, h.y = k, !1; + if (d > c) return h.x = a, h.y = c, !1; + h.x = a; + h.y = d; + return !0 + } + if (K.mb(b, + d)) { + a < c ? k = a : (k = c, c = a); + d = e; + if (d < k) return h.x = k, h.y = b, !1; + if (d > c) return h.x = c, h.y = b, !1; + h.x = d; + h.y = b; + return !0 + } + k = ((a - e) * (a - c) + (b - f) * (b - d)) / ((c - a) * (c - a) + (d - b) * (d - b)); + if (-5E-6 > k) return h.x = a, h.y = b, !1; + if (1.000005 < k) return h.x = c, h.y = d, !1; + h.x = a + k * (c - a); + h.y = b + k * (d - b); + return !0 + }, + $g: function (a, b, c, d, e, f, h, k, l) { + if (K.D(a, c) && K.D(b, d)) return l.x = a, l.y = b, !1; + if (K.mb(e, h)) { + if (K.mb(a, c)) return K.Hm(a, b, c, d, e, f, l), !1; + f = (d - b) / (c - a) * (e - a) + b; + return K.Hm(a, b, c, d, e, f, l) + } + k = (k - f) / (h - e); + if (K.mb(a, c)) { + f = k * (a - e) + f; + c = h = 0; + b < d ? (h = b, + c = d) : (h = d, c = b); + if (f < h) return l.x = a, l.y = h, !1; + if (f > c) return l.x = a, l.y = c, !1; + l.x = a; + l.y = f; + return !0 + } + h = (d - b) / (c - a); + if (K.mb(k, h)) return K.Hm(a, b, c, d, e, f, l), !1; + e = (h * a - k * e + f - b) / (h - k); + if (K.mb(h, 0)) { + a < c ? h = a : (h = c, c = a); + if (e < h) return l.x = h, l.y = b, !1; + if (e > c) return l.x = c, l.y = b, !1; + l.x = e; + l.y = b; + return !0 + } + f = h * (e - a) + b; + return K.Hm(a, b, c, d, e, f, l) + }, + PJ: function (a, b, c, d, e) { + return K.$g(c.x, c.y, d.x, d.y, a.x, a.y, b.x, b.y, e) + }, + xJ: function (a, b, c, d, e, f, h, k, l, m) { + function n(c, d) { + var e = (c - a) * (c - a) + (d - b) * (d - b); + e < p && (p = e, l.x = c, l.y = d) + } + + var p = + Infinity; + n(l.x, l.y); + var q = 0, r = 0, s = 0, t = 0; + e < h ? (q = e, r = h) : (q = h, r = e); + f < k ? (s = e, t = h) : (s = h, t = e); + q = (r - q) / 2 + m; + m = (t - s) / 2 + m; + e = (e + h) / 2; + f = (f + k) / 2; + if (0 === q || 0 === m) return l; + if (.5 > (c > a ? c - a : a - c)) { + q = 1 - (c - e) * (c - e) / (q * q); + if (0 > q) return l; + q = Math.sqrt(q); + d = -m * q + f; + n(c, m * q + f); + n(c, d) + } else { + c = (d - b) / (c - a); + d = 1 / (q * q) + c * c / (m * m); + k = 2 * c * (b - c * a) / (m * m) - 2 * c * f / (m * m) - 2 * e / (q * q); + q = k * k - 4 * d * (2 * c * a * f / (m * m) - 2 * b * f / (m * m) + f * f / (m * m) + e * e / (q * q) - 1 + (b - c * a) * (b - c * a) / (m * m)); + if (0 > q) return l; + q = Math.sqrt(q); + m = (-k + q) / (2 * d); + n(m, c * m - c * a + b); + q = (-k - q) / (2 * d); + n(q, + c * q - c * a + b) + } + return l + }, + bl: function (a, b, c, d, e, f, h, k, l) { + var m = 1E21, n = a, p = b; + if (K.$g(a, b, a, d, e, f, h, k, l)) { + var q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f); + q < m && (m = q, n = l.x, p = l.y) + } + K.$g(c, b, c, d, e, f, h, k, l) && (q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f), q < m && (m = q, n = l.x, p = l.y)); + K.$g(a, b, c, b, e, f, h, k, l) && (q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f), q < m && (m = q, n = l.x, p = l.y)); + K.$g(a, d, c, d, e, f, h, k, l) && (q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f), q < m && (m = q, n = l.x, p = l.y)); + l.x = n; + l.y = p; + return 1E21 > m + }, + dw: function (a, b, c) { + var d = b.x, e = b.y, f = c.x, h = c.y, k = a.left, l = a.right, + m = a.top, n = a.bottom; + return d === f ? (f = a = 0, e < h ? (a = e, f = h) : (a = h, f = e), k <= d && d <= l && a <= n && f >= m) : e === h ? (d < f ? a = d : (a = f, f = d), m <= e && e <= n && a <= l && f >= k) : a.Aa(b) || a.Aa(c) || K.cw(k, m, l, m, d, e, f, h) || K.cw(l, m, l, n, d, e, f, h) || K.cw(l, n, k, n, d, e, f, h) || K.cw(k, n, k, m, d, e, f, h) ? !0 : !1 + }, + cw: function (a, b, c, d, e, f, h, k) { + return 0 >= K.Nv(a, b, c, d, e, f) * K.Nv(a, b, c, d, h, k) && 0 >= K.Nv(e, f, h, k, a, b) * K.Nv(e, f, h, k, c, d) + }, + Nv: function (a, b, c, d, e, f) { + c -= a; + d -= b; + a = e - a; + b = f - b; + f = a * d - b * c; + 0 === f && (f = a * c + b * d, 0 < f && (f = (a - c) * c + (b - d) * d, 0 > f && (f = 0))); + return 0 > f ? -1 : 0 < f ? 1 : 0 + }, + ct: function (a) { + 0 > a && (a += 360); + 360 <= a && (a -= 360); + return a + }, + fD: function (a, b, c, d, e, f) { + void 0 === f && (f = !1); + var h = Math.PI; + f || (d *= h / 180, e *= h / 180); + f = d < e ? 1 : -1; + var k = [], l = h / 2, m = d; + for (d = Math.min(2 * h + 1E-5, Math.abs(e - d)); 1E-5 < d;) e = m + f * Math.min(d, l), k.push(K.jG(c, m, e, a, b)), d -= Math.abs(e - m), m = e; + return k + }, + jG: function (a, b, c, d, e) { + var f = (c - b) / 2, h = a * Math.cos(f), k = a * Math.sin(f), l = .5522847498 * Math.tan(f), m = h + l * k, + h = -k + l * h, k = -h, l = f + b, f = Math.cos(l), l = Math.sin(l); + return [d + a * Math.cos(b), e + a * Math.sin(b), d + m * f - h * l, e + m * l + h * f, d + + m * f - k * l, e + m * l + k * f, d + a * Math.cos(c), e + a * Math.sin(c)] + }, + xs: function (a, b, c, d, e, f, h) { + c = Math.floor((a - c) / e) * e + c; + d = Math.floor((b - d) / f) * f + d; + var k = c; + c + e - a < e / 2 && (k = c + e); + a = d; + d + f - b < f / 2 && (a = d + f); + h.m(k, a); + return h + }, + xD: function (a, b) { + var c = Math.max(a, b), d = Math.min(a, b), e = 1, f = 1; + do e = c % d, c = f = d, d = e; while (0 < e); + return f + }, + sG: function (a, b, c, d) { + var e = 0 > c, f = 0 > d, h = 0, k = h = 0; + a < b ? (h = 1, k = 0) : (h = 0, k = 1); + var l = 0, m = 0, n = 0, l = 0 === h ? a : b, m = 0 === h ? c : d; + if (0 === h ? e : f) m = -m; + h = k; + n = 0 === h ? c : d; + if (0 === h ? e : f) n = -n; + return K.tG(l, 0 === h ? a : b, m, n, 0, 0) + }, + tG: function (a, + b, c, d, e, f) { + e = 0; + if (0 < d) if (0 < c) { + f = a * a; + e = b * b; + a *= c; + var h = b * d, k = -e + h, l = -e + Math.sqrt(a * a + h * h); + b = k; + for (var m = 0; 9999999999 > m; ++m) { + b = .5 * (k + l); + if (b === k || b === l) break; + var n = a / (b + f), p = h / (b + e), n = n * n + p * p - 1; + if (0 < n) k = b; else if (0 > n) l = b; else break + } + c = f * c / (b + f) - c; + d = e * d / (b + e) - d; + e = Math.sqrt(c * c + d * d) + } else e = Math.abs(d - b); else d = a * a - b * b, e = a * c, e < d ? (d = e / d, e = a * d, f = b * Math.sqrt(Math.abs(1 - d * d)), c = e - c, e = Math.sqrt(c * c + f * f)) : e = Math.abs(c - a); + return e + } + }; + + function $c(a) { + 1 < arguments.length && u.k("Geometry constructor can take at most one optional argument, the Geometry type."); + u.gc(this); + this.Ca = !1; + void 0 === a && (a = ad); + this.oa = a; + this.Bb = this.pb = this.uc = this.nc = 0; + this.Zi = new E(bd); + this.ju = this.Zi.U; + this.Ut = (new z).freeze(); + this.Ta = !0; + this.ri = xb; + this.si = Vb; + this.Cn = this.Dn = NaN; + this.bi = cd + } + + u.fa("Geometry", $c); + u.Lh($c); + $c.prototype.copy = function () { + var a = new $c; + a.oa = this.oa; + a.nc = this.nc; + a.uc = this.uc; + a.pb = this.pb; + a.Bb = this.Bb; + for (var b = this.Zi.n, c = b.length, d = a.Zi, e = 0; e < c; e++) { + var f = b[e].copy(); + d.add(f) + } + a.ju = this.ju; + a.Ut.assign(this.Ut); + a.Ta = this.Ta; + a.ri = this.ri.Z(); + a.si = this.si.Z(); + a.Dn = this.Dn; + a.Cn = this.Cn; + a.bi = this.bi; + return a + }; + var dd; + $c.Line = dd = u.s($c, "Line", 0); + var md; + $c.Rectangle = md = u.s($c, "Rectangle", 1); + var nd; + $c.Ellipse = nd = u.s($c, "Ellipse", 2); + var ad; + $c.Path = ad = u.s($c, "Path", 3); + $c.prototype.Ka = function () { + this.freeze(); + Object.freeze(this); + return this + }; + $c.prototype.freeze = function () { + this.Ca = !0; + var a = this.ub; + a.freeze(); + for (var a = a.n, b = a.length, c = 0; c < b; c++) a[c].freeze(); + return this + }; + $c.prototype.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + var a = this.ub; + a.La(); + for (var a = a.n, b = a.length, c = 0; c < b; c++) a[c].La(); + return this + }; + $c.prototype.equalsApprox = $c.prototype.De = function (a) { + if (!(a instanceof $c)) return !1; + if (this.type !== a.type) return this.type === dd && a.type === ad ? od(this, a) : a.type === dd && this.type === ad ? od(a, this) : !1; + if (this.type === ad) { + var b = this.ub.n; + a = a.ub.n; + var c = b.length; + if (c !== a.length) return !1; + for (var d = 0; d < c; d++) if (!b[d].De(a[d])) return !1; + return !0 + } + return K.D(this.ua, a.ua) && K.D(this.va, a.va) && K.D(this.F, a.F) && K.D(this.G, a.G) + }; + + function od(a, b) { + if (a.type !== dd || b.type !== ad) return !1; + if (1 === b.ub.count) { + var c = b.ub.ja(0); + if (1 === c.Fa.count && K.D(a.ua, c.ua) && K.D(a.va, c.va) && (c = c.Fa.ja(0), c.type === pd && K.D(a.F, c.F) && K.D(a.G, c.G))) return !0 + } + return !1 + } + + var qd; + $c.stringify = qd = function (a) { + return a.toString() + }; + $c.prototype.toString = function (a) { + void 0 === a && (a = -1); + switch (this.type) { + case dd: + return 0 > a ? "M" + this.ua.toString() + " " + this.va.toString() + "L" + this.F.toString() + " " + this.G.toString() : "M" + this.ua.toFixed(a) + " " + this.va.toFixed(a) + "L" + this.F.toFixed(a) + " " + this.G.toFixed(a); + case md: + var b = new z(this.ua, this.va, 0, 0); + b.YE(this.F, this.G, 0, 0); + return 0 > a ? "M" + b.x.toString() + " " + b.y.toString() + "H" + b.right.toString() + "V" + b.bottom.toString() + "H" + b.left.toString() + "z" : "M" + b.x.toFixed(a) + " " + b.y.toFixed(a) + "H" + b.right.toFixed(a) + + "V" + b.bottom.toFixed(a) + "H" + b.left.toFixed(a) + "z"; + case nd: + b = new z(this.ua, this.va, 0, 0); + b.YE(this.F, this.G, 0, 0); + if (0 > a) { + var c = b.left.toString() + " " + (b.y + b.height / 2).toString(), + d = b.right.toString() + " " + (b.y + b.height / 2).toString(); + return "M" + c + "A" + (b.width / 2).toString() + " " + (b.height / 2).toString() + " 0 0 1 " + d + "A" + (b.width / 2).toString() + " " + (b.height / 2).toString() + " 0 0 1 " + c + } + c = b.left.toFixed(a) + " " + (b.y + b.height / 2).toFixed(a); + d = b.right.toFixed(a) + " " + (b.y + b.height / 2).toFixed(a); + return "M" + c + "A" + (b.width / + 2).toFixed(a) + " " + (b.height / 2).toFixed(a) + " 0 0 1 " + d + "A" + (b.width / 2).toFixed(a) + " " + (b.height / 2).toFixed(a) + " 0 0 1 " + c; + case ad: + for (var b = "", c = this.ub.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + 0 < e && (b += " x "); + f.Ns && (b += "F "); + b += f.toString(a) + } + return b; + default: + return this.type.toString() + } + }; + var rd; + $c.fillPath = rd = function (a) { + "string" !== typeof a && u.Kd(a, "string", $c, "fillPath:str"); + a = a.split(/[Xx]/); + for (var b = a.length, c = "", d = 0; d < b; d++) var e = a[d], c = null !== e.match(/[Ff]/) ? 0 === d ? c + e : c + ("X" + (" " === e[0] ? "" : " ") + e) : c + ((0 === d ? "" : "X ") + "F" + (" " === e[0] ? "" : " ") + e); + return c + }; + var sd; + $c.parse = sd = function (a, b) { + function c() { + return m >= t - 1 ? !0 : null !== l[m + 1].match(/[A-Za-z]/) + } + + function d() { + m++; + return l[m] + } + + function e() { + var a = new w(parseFloat(d()), parseFloat(d())); + n === n.toLowerCase() && (a.x = s.x + a.x, a.y = s.y + a.y); + return a + } + + function f() { + return s = e() + } + + function h() { + return r = e() + } + + function k() { + return "c" !== p.toLowerCase() && "s" !== p.toLowerCase() ? s : new w(2 * s.x - r.x, 2 * s.y - r.y) + } + + void 0 === b && (b = !1); + "string" !== typeof a && u.Kd(a, "string", $c, "parse:str"); + a = a.replace(/,/gm, " "); + a = a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, + "$1 $2"); + a = a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, "$1 $2"); + a = a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([^\s])/gm, "$1 $2"); + a = a.replace(/([^\s])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, "$1 $2"); + a = a.replace(/([0-9])([+\-])/gm, "$1 $2"); + a = a.replace(/(\.[0-9]*)(\.)/gm, "$1 $2"); + a = a.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm, "$1 $3 $4 "); + a = a.replace(/[\s\r\t\n]+/gm, " "); + a = a.replace(/^\s+|\s+$/g, ""); + for (var l = a.split(" "), m = -1, n = "", p = "", q = new w(0, 0), r = new w(0, 0), s = new w(0, + 0), t = l.length, v = u.p(), x = !1, B = !1, y = !0; !(m >= t - 1);) if (p = n, n = d(), "" !== n) switch (n.toUpperCase()) { + case "X": + y = !0; + B = x = !1; + break; + case "M": + var C = f(); + null === v.Tb || !0 === y ? (M(v, C.x, C.y, x, !1, !B), y = !1) : v.moveTo(C.x, C.y); + for (q = s; !c();) C = f(), v.lineTo(C.x, C.y); + break; + case "L": + for (; !c();) C = f(), v.lineTo(C.x, C.y); + break; + case "H": + for (; !c();) s = C = new w((n === n.toLowerCase() ? s.x : 0) + parseFloat(d()), s.y), v.lineTo(s.x, s.y); + break; + case "V": + for (; !c();) s = C = new w(s.x, (n === n.toLowerCase() ? s.y : 0) + parseFloat(d())), v.lineTo(s.x, s.y); + break; + case "C": + for (; !c();) { + var I = e(), H = h(), C = f(); + O(v, I.x, I.y, H.x, H.y, C.x, C.y) + } + break; + case "S": + for (; !c();) I = k(), H = h(), C = f(), O(v, I.x, I.y, H.x, H.y, C.x, C.y); + break; + case "Q": + for (; !c();) H = h(), C = f(), td(v, H.x, H.y, C.x, C.y); + break; + case "T": + for (; !c();) r = H = k(), C = f(), td(v, H.x, H.y, C.x, C.y); + break; + case "B": + for (; !c();) { + var C = parseFloat(d()), I = parseFloat(d()), H = parseFloat(d()), T = parseFloat(d()), + aa = parseFloat(d()), R = aa, N = !1; + c() || (R = parseFloat(d()), c() || (N = 0 !== parseFloat(d()))); + n === n.toLowerCase() && (H += s.x, T += s.y); + v.arcTo(C, I, + H, T, aa, R, N) + } + break; + case "A": + for (; !c();) I = Math.abs(parseFloat(d())), H = Math.abs(parseFloat(d())), T = parseFloat(d()), aa = !!parseFloat(d()), R = !!parseFloat(d()), C = f(), ud(v, I, H, T, aa, R, C.x, C.y); + break; + case "Z": + C = v.o.ub.n[v.o.ub.length - 1]; + P(v); + s = q; + break; + case "F": + C = ""; + for (I = 1; l[m + I];) if (null !== l[m + I].match(/[Uu]/)) I++; else if (null === l[m + I].match(/[A-Za-z]/)) I++; else { + C = l[m + I]; + break + } + C.match(/[Mm]/) ? x = !0 : vd(v); + break; + case "U": + C = ""; + for (I = 1; l[m + I];) if (null !== l[m + I].match(/[Ff]/)) I++; else if (null === l[m + I].match(/[A-Za-z]/)) I++; + else { + C = l[m + I]; + break + } + C.match(/[Mm]/) ? B = !0 : v.$a(!1) + } + q = v.o; + u.q(v); + if (b) for (v = q.ub.i; v.next();) C = v.value, C.Ns = !0; + return q + }; + + function wd(a, b) { + for (var c = a.length, d = u.K(), e = 0; e < c; e++) { + var f = a[e]; + d.x = f[0]; + d.y = f[1]; + b.ab(d); + f[0] = d.x; + f[1] = d.y; + d.x = f[2]; + d.y = f[3]; + b.ab(d); + f[2] = d.x; + f[3] = d.y; + d.x = f[4]; + d.y = f[5]; + b.ab(d); + f[4] = d.x; + f[5] = d.y; + d.x = f[6]; + d.y = f[7]; + b.ab(d); + f[6] = d.x; + f[7] = d.y + } + u.v(d) + } + + $c.prototype.vz = function () { + if (this.Ta || this.ju !== this.ub.U) return !0; + for (var a = this.ub.n, b = a.length, c = 0; c < b; c++) if (a[c].vz()) return !0; + return !1 + }; + $c.prototype.nA = function () { + this.Ta = !1; + this.ju = this.ub.U; + for (var a = this.ub.n, b = a.length, c = 0; c < b; c++) a[c].nA() + }; + $c.prototype.kg = function () { + var a = this.Ut; + a.La(); + isNaN(this.Dn) || isNaN(this.Cn) ? a.m(0, 0, 0, 0) : a.m(0, 0, this.Dn, this.Cn); + xd(this, a, !1); + kb(a, 0, 0, 0, 0); + a.freeze() + }; + $c.prototype.computeBoundsWithoutOrigin = $c.prototype.aG = function () { + var a = new z; + xd(this, a, !0); + return a + }; + + function xd(a, b, c) { + switch (a.type) { + case dd: + case md: + case nd: + c ? b.m(a.nc, a.uc, 0, 0) : kb(b, a.nc, a.uc, 0, 0); + kb(b, a.pb, a.Bb, 0, 0); + break; + case ad: + var d = a.ub; + a = d.n; + for (var d = d.length, e = 0; e < d; e++) { + var f = a[e]; + c && 0 === e ? b.m(f.ua, f.va, 0, 0) : kb(b, f.ua, f.va, 0, 0); + for (var h = f.Fa.n, k = h.length, l = f.ua, m = f.va, n = 0; n < k; n++) { + var p = h[n]; + switch (p.type) { + case pd: + case yd: + l = p.F; + m = p.G; + kb(b, l, m, 0, 0); + break; + case zd: + K.oo(l, m, p.Rb, p.jc, p.df, p.ef, p.F, p.G, .5, b); + l = p.F; + m = p.G; + break; + case Ad: + K.Nz(l, m, p.Rb, p.jc, p.F, p.G, .5, b); + l = p.F; + m = p.G; + break; + case Bd: + case Gd: + for (var p = + p.type === Bd ? Hd(p, f) : Id(p, f, l, m), q = p.length, r = null, s = 0; s < q; s++) r = p[s], K.oo(r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], .5, b); + null !== r && (l = r[6], m = r[7]); + break; + default: + u.k("Unknown Segment type: " + p.type) + } + } + } + break; + default: + u.k("Unknown Geometry type: " + a.type) + } + } + + $c.prototype.normalize = $c.prototype.normalize = function () { + u.I(this); + var a = this.aG(); + this.offset(-a.x, -a.y); + return new w(-a.x, -a.y) + }; + $c.prototype.offset = $c.prototype.offset = function (a, b) { + u.I(this); + this.transform(1, 0, 0, 1, a, b); + return this + }; + $c.prototype.scale = $c.prototype.scale = function (a, b) { + u.I(this); + this.transform(a, 0, 0, b, 0, 0); + return this + }; + $c.prototype.rotate = $c.prototype.rotate = function (a, b, c) { + u.I(this); + void 0 === b && (b = 0); + void 0 === c && (c = 0); + var d = u.jh(); + d.reset(); + d.rotate(a, b, c); + this.transform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + u.Ye(d); + return this + }; + $c.prototype.transform = $c.prototype.transform = function (a, b, c, d, e, f) { + var h = 0, k = 0; + switch (this.type) { + case dd: + case md: + case nd: + h = this.nc; + k = this.uc; + this.nc = h * a + k * c + e; + this.uc = h * b + k * d + f; + h = this.pb; + k = this.Bb; + this.pb = h * a + k * c + e; + this.Bb = h * b + k * d + f; + break; + case ad: + for (var l = this.ub.n, m = l.length, n = 0; n < m; n++) { + var p = l[n], h = p.ua, k = p.va; + p.ua = h * a + k * c + e; + p.va = h * b + k * d + f; + for (var p = p.Fa.n, q = p.length, r = 0; r < q; r++) { + var s = p[r]; + switch (s.type) { + case pd: + case yd: + h = s.F; + k = s.G; + s.F = h * a + k * c + e; + s.G = h * b + k * d + f; + break; + case zd: + h = s.Rb; + k = s.jc; + s.Rb = + h * a + k * c + e; + s.jc = h * b + k * d + f; + h = s.df; + k = s.ef; + s.df = h * a + k * c + e; + s.ef = h * b + k * d + f; + h = s.F; + k = s.G; + s.F = h * a + k * c + e; + s.G = h * b + k * d + f; + break; + case Ad: + h = s.Rb; + k = s.jc; + s.Rb = h * a + k * c + e; + s.jc = h * b + k * d + f; + h = s.F; + k = s.G; + s.F = h * a + k * c + e; + s.G = h * b + k * d + f; + break; + case Bd: + h = s.Ja; + k = s.Ua; + s.Ja = h * a + k * c + e; + s.Ua = h * b + k * d + f; + 0 !== b && (h = 180 * Math.atan2(b, a) / Math.PI, 0 > h && (h += 360), s.Je += h); + 0 > a && (s.Je = 180 - s.Je, s.Qf = -s.Qf); + 0 > d && (s.Je = -s.Je, s.Qf = -s.Qf); + s.radiusX *= Math.sqrt(a * a + c * c); + void 0 !== s.radiusY && (s.radiusY *= Math.sqrt(b * b + d * d)); + break; + case Gd: + h = s.F; + k = s.G; + s.F = h * + a + k * c + e; + s.G = h * b + k * d + f; + 0 !== b && (h = 180 * Math.atan2(b, a) / Math.PI, 0 > h && (h += 360), s.Pi += h); + 0 > a && (s.Pi = 180 - s.Pi, s.fl = !s.fl); + 0 > d && (s.Pi = -s.Pi, s.fl = !s.fl); + s.radiusX *= Math.sqrt(a * a + c * c); + s.radiusY *= Math.sqrt(b * b + d * d); + break; + default: + u.k("Unknown Segment type: " + s.type) + } + } + } + } + this.Ta = !0; + return this + }; + $c.prototype.Xr = function (a, b) { + var c = this.nc, d = this.uc, e = this.pb, f = this.Bb, h = Math.min(c, e), k = Math.min(d, f), + c = Math.abs(e - c), d = Math.abs(f - d), f = u.K(); + f.x = h; + f.y = k; + b.ab(f); + e = new bd(f.x, f.y); + f.x = h + c; + f.y = k; + b.ab(f); + e.Fa.add(new Jd(pd, f.x, f.y)); + f.x = h + c; + f.y = k + d; + b.ab(f); + e.Fa.add(new Jd(pd, f.x, f.y)); + f.x = h; + f.y = k + d; + b.ab(f); + e.Fa.add((new Jd(pd, f.x, f.y)).close()); + u.v(f); + a.type = ad; + a.ub.add(e); + return a + }; + $c.prototype.Aa = function (a, b, c, d) { + var e = a.x, f = a.y, h = this.kb.x - 20; + a = a.y; + for (var k = 0, l = 0, m = 0, n = 0, p = 0, q = 0, r = this.ub.n, s = r.length, t = 0; t < s; t++) { + var v = r[t]; + if (v.Ns) { + if (c && v.Aa(e, f, b)) return !0; + for (var x = v.Fa, l = v.ua, m = v.va, B = l, y = m, C = x.n, I = 0; I <= x.length; I++) { + var H, T; + I !== x.length ? (H = C[I], T = H.type, p = H.F, q = H.G) : (T = pd, p = B, q = y); + switch (T) { + case yd: + n = Kd(e, f, h, a, l, m, B, y); + if (isNaN(n)) return !0; + k += n; + B = p; + y = q; + break; + case pd: + n = Kd(e, f, h, a, l, m, p, q); + if (isNaN(n)) return !0; + k += n; + break; + case zd: + n = K.ks(l, m, H.Rb, H.jc, H.df, H.ef, p, q, + h, a, e, f, .5); + k += n; + break; + case Ad: + n = K.ks(l, m, (l + 2 * H.Rb) / 3, (m + 2 * H.jc) / 3, (H.Rb + 2 * p) / 3, (H.Rb + 2 * p) / 3, p, q, h, a, e, f, .5); + k += n; + break; + case Bd: + case Gd: + T = H.type === Bd ? Hd(H, v) : Id(H, v, l, m); + for (var aa = T.length, R = null, N = 0; N < aa; N++) { + R = T[N]; + if (0 === N) { + n = Kd(e, f, h, a, l, m, R[0], R[1]); + if (isNaN(n)) return !0; + k += n + } + n = K.ks(R[0], R[1], R[2], R[3], R[4], R[5], R[6], R[7], h, a, e, f, .5); + k += n + } + null !== R && (p = R[6], q = R[7]); + break; + default: + u.k("Unknown Segment type: " + H.type) + } + l = p; + m = q + } + if (0 !== k) return !0; + k = 0 + } else if (v.Aa(e, f, d ? b : b + 2)) return !0 + } + return 0 !== k + }; + + function Kd(a, b, c, d, e, f, h, k) { + if (K.Hd(e, f, h, k, .05, a, b)) return NaN; + var l = (a - c) * (f - k); + if (0 === l) return 0; + var m = ((a * d - b * c) * (e - h) - (a - c) * (e * k - f * h)) / l; + b = (a * d - b * c) * (f - k) / l; + if (m >= a) return 0; + if ((e > h ? e - h : h - e) < (f > k ? f - k : k - f)) { + if (e = a = 0, f < k ? (a = f, e = k) : (a = k, e = f), b < a || b > e) return 0 + } else if (e < h ? (a = e, e = h) : a = h, m < a || m > e) return 0; + return 0 < l ? 1 : -1 + } + + function Ld(a, b, c, d) { + a = a.ub.n; + for (var e = a.length, f = 0; f < e; f++) if (a[f].Aa(b, c, d)) return !0; + return !1 + } + + $c.prototype.getPointAlongPath = function (a) { + (0 > a || 1 < a) && u.wa(a, "0 <= fraction <= 1", $c, "getPointAlongPath:fraction"); + var b = this.ub.first(), c = u.eb(), d = []; + d.push(b.ua); + d.push(b.va); + for (var e = b.ua, f = b.va, h = e, k = f, l = b.Fa.n, m = l.length, n = 0; n < m; n++) { + var p = l[n]; + switch (p.oa) { + case yd: + c.push(d); + d = []; + d.push(p.F); + d.push(p.G); + e = p.F; + f = p.G; + h = e; + k = f; + break; + case pd: + d.push(p.F); + d.push(p.G); + e = p.F; + f = p.G; + break; + case zd: + K.ye(e, f, p.bd, p.xe, p.dg, p.eg, p.pb, p.Bb, .5, d); + e = p.F; + f = p.G; + break; + case Ad: + K.Xo(e, f, p.bd, p.xe, p.pb, p.Bb, .5, d); + e = p.F; + f = p.G; + break; + case Bd: + for (var q = Hd(p, b), r = q.length, s = 0; s < r; s++) { + var t = q[s]; + K.ye(e, f, t[2], t[3], t[4], t[5], t[6], t[7], .5, d); + e = t[6]; + f = t[7] + } + break; + case Gd: + q = Id(p, b, e, f); + r = q.length; + for (s = 0; s < r; s++) t = q[s], K.ye(e, f, t[2], t[3], t[4], t[5], t[6], t[7], .5, d), e = t[6], f = t[7]; + break; + default: + u.k("Segment not of valid type") + } + p.zh && (d.push(h), d.push(k)) + } + c.push(d); + q = 0; + h = c.length; + for (k = d = b = 0; k < h; k++) for (l = c[k], m = l.length, n = 0; n < m; n += 2) e = l[n], f = l[n + 1], 0 !== n && (p = Math.sqrt(Ya(b, d, e, f)), q += p), b = e, d = f; + a *= q; + for (k = q = 0; k < h; k++) for (l = + c[k], m = l.length, n = 0; n < m; n++) { + e = l[n]; + f = l[n + 1]; + if (0 !== n) { + p = Math.sqrt(Ya(b, d, e, f)); + if (q + p > a) return n = (a - q) / p, u.ra(c), new w(b + (e - b) * n, d + (f - d) * n); + q += p + } + b = e; + d = f + } + u.ra(c); + return null + }; + u.defineProperty($c, {type: "type"}, function () { + return this.oa + }, function (a) { + this.oa !== a && (u.I(this, a), this.oa = a, this.Ta = !0) + }); + u.defineProperty($c, {ua: "startX"}, function () { + return this.nc + }, function (a) { + this.nc !== a && (u.I(this, a), this.nc = a, this.Ta = !0) + }); + u.defineProperty($c, {va: "startY"}, function () { + return this.uc + }, function (a) { + this.uc !== a && (u.I(this, a), this.uc = a, this.Ta = !0) + }); + u.defineProperty($c, {F: "endX"}, function () { + return this.pb + }, function (a) { + this.pb !== a && (u.I(this, a), this.pb = a, this.Ta = !0) + }); + u.defineProperty($c, {G: "endY"}, function () { + return this.Bb + }, function (a) { + this.Bb !== a && (u.I(this, a), this.Bb = a, this.Ta = !0) + }); + u.defineProperty($c, {ub: "figures"}, function () { + return this.Zi + }, function (a) { + this.Zi !== a && (u.I(this, a), this.Zi = a, this.Ta = !0) + }); + $c.prototype.add = $c.prototype.add = function (a) { + this.Zi.add(a); + return this + }; + u.defineProperty($c, {A: "spot1"}, function () { + return this.ri + }, function (a) { + u.I(this, a); + this.ri = a.Z() + }); + u.defineProperty($c, {B: "spot2"}, function () { + return this.si + }, function (a) { + u.I(this, a); + this.si = a.Z() + }); + u.defineProperty($c, {Bd: "defaultStretch"}, function () { + return this.bi + }, function (a) { + u.I(this, a); + this.bi = a + }); + u.u($c, {kb: "bounds"}, function () { + this.vz() && (this.nA(), this.kg()); + return this.Ut + }); + + function bd(a, b, c, d) { + u.gc(this); + this.Ca = !1; + void 0 === c && (c = !0); + this.Il = c; + void 0 === d && (d = !0); + this.En = d; + this.nc = void 0 !== a ? a : 0; + this.uc = void 0 !== b ? b : 0; + this.Yn = new E(Jd); + this.cv = this.Yn.U; + this.Ta = !0 + } + + u.fa("PathFigure", bd); + u.Lh(bd); + bd.prototype.copy = function () { + var a = new bd; + a.Il = this.Il; + a.En = this.En; + a.nc = this.nc; + a.uc = this.uc; + for (var b = this.Yn.n, c = b.length, d = a.Yn, e = 0; e < c; e++) { + var f = b[e].copy(); + d.add(f) + } + a.cv = this.cv; + a.Ta = this.Ta; + return a + }; + bd.prototype.equalsApprox = bd.prototype.De = function (a) { + if (!(a instanceof bd && K.D(this.ua, a.ua) && K.D(this.va, a.va))) return !1; + var b = this.Fa.n; + a = a.Fa.n; + var c = b.length; + if (c !== a.length) return !1; + for (var d = 0; d < c; d++) if (!b[d].De(a[d])) return !1; + return !0 + }; + g = bd.prototype; + g.toString = function (a) { + void 0 === a && (a = -1); + for (var b = 0 > a ? "M" + this.ua.toString() + " " + this.va.toString() : "M" + this.ua.toFixed(a) + " " + this.va.toFixed(a), c = this.Fa.n, d = c.length, e = 0; e < d; e++) b += " " + c[e].toString(a); + return b + }; + g.freeze = function () { + this.Ca = !0; + var a = this.Fa; + a.freeze(); + for (var b = a.n, a = a.length, c = 0; c < a; c++) b[c].freeze(); + return this + }; + g.La = function () { + this.Ca = !1; + var a = this.Fa; + a.La(); + for (var a = a.n, b = a.length, c = 0; c < b; c++) a[c].La(); + return this + }; + g.vz = function () { + if (this.Ta) return !0; + var a = this.Fa; + if (this.cv !== a.U) return !0; + for (var a = a.n, b = a.length, c = 0; c < b; c++) if (a[c].Ta) return !0; + return !1 + }; + g.nA = function () { + this.Ta = !1; + var a = this.Fa; + this.cv = a.U; + for (var a = a.n, b = a.length, c = 0; c < b; c++) { + var d = a[c]; + d.Ta = !1; + d.Ri = null + } + }; + u.defineProperty(bd, {Ns: "isFilled"}, function () { + return this.Il + }, function (a) { + u.I(this, a); + this.Il = a + }); + u.defineProperty(bd, {il: "isShadowed"}, function () { + return this.En + }, function (a) { + u.I(this, a); + this.En = a + }); + u.defineProperty(bd, {ua: "startX"}, function () { + return this.nc + }, function (a) { + u.I(this, a); + this.nc = a; + this.Ta = !0 + }); + u.defineProperty(bd, {va: "startY"}, function () { + return this.uc + }, function (a) { + u.I(this, a); + this.uc = a; + this.Ta = !0 + }); + u.defineProperty(bd, {Fa: "segments"}, function () { + return this.Yn + }, function (a) { + u.I(this, a); + this.Yn = a; + this.Ta = !0 + }); + bd.prototype.add = bd.prototype.add = function (a) { + this.Yn.add(a); + return this + }; + bd.prototype.Aa = function (a, b, c) { + for (var d = this.ua, e = this.va, f = d, h = e, k = this.Fa.n, l = k.length, m = 0; m < l; m++) { + var n = k[m]; + switch (n.type) { + case yd: + f = n.F; + h = n.G; + d = n.F; + e = n.G; + break; + case pd: + if (K.Hd(d, e, n.F, n.G, c, a, b)) return !0; + d = n.F; + e = n.G; + break; + case zd: + if (K.Iv(d, e, n.Rb, n.jc, n.df, n.ef, n.F, n.G, .5, a, b, c)) return !0; + d = n.F; + e = n.G; + break; + case Ad: + if (K.Oz(d, e, n.Rb, n.jc, n.F, n.G, .5, a, b, c)) return !0; + d = n.F; + e = n.G; + break; + case Bd: + case Gd: + for (var p = n.type === Bd ? Hd(n, this) : Id(n, this, d, e), q = p.length, r = null, s = 0; s < q; s++) if (r = p[s], 0 === s && + K.Hd(d, e, r[0], r[1], c, a, b) || K.Iv(r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], .5, a, b, c)) return !0; + null !== r && (d = r[6], e = r[7]); + break; + default: + u.k("Unknown Segment type: " + n.type) + } + if (n.ew && (d !== f || e !== h) && K.Hd(d, e, f, h, c, a, b)) return !0 + } + return !1 + }; + + function Jd(a, b, c, d, e, f, h, k) { + u.gc(this); + this.Ca = !1; + void 0 === a && (a = pd); + this.oa = a; + this.pb = void 0 !== b ? b : 0; + this.Bb = void 0 !== c ? c : 0; + a === Gd ? (void 0 !== f && (a = f % 360, 0 > a && (a += 360), this.bd = a), void 0 !== d && (this.dg = Math.max(d, 0)), void 0 !== e && (this.eg = Math.max(e, 0)), this.Ln = !!h, this.bn = !!k) : (void 0 !== d && (this.bd = d), void 0 !== e && (this.xe = e), void 0 !== f && (a === Bd && (f = Math.max(f, 0)), this.dg = f), void 0 !== h && "number" === typeof h && (a === Bd && (h = Math.max(h, 0)), this.eg = h)); + this.zh = !1; + this.Ta = !0; + this.Ri = null + } + + u.fa("PathSegment", Jd); + u.Lh(Jd); + Jd.prototype.copy = function () { + var a = new Jd; + a.oa = this.oa; + a.pb = this.pb; + a.Bb = this.Bb; + void 0 !== this.bd && (a.bd = this.bd); + void 0 !== this.xe && (a.xe = this.xe); + void 0 !== this.dg && (a.dg = this.dg); + void 0 !== this.eg && (a.eg = this.eg); + void 0 !== this.Ln && (a.Ln = this.Ln); + void 0 !== this.bn && (a.bn = this.bn); + a.zh = this.zh; + a.Ta = this.Ta; + return a + }; + Jd.prototype.equalsApprox = Jd.prototype.De = function (a) { + if (!(a instanceof Jd) || this.type !== a.type || this.ew !== a.ew) return !1; + switch (this.type) { + case yd: + case pd: + return K.D(this.F, a.F) && K.D(this.G, a.G); + case zd: + return K.D(this.F, a.F) && K.D(this.G, a.G) && K.D(this.Rb, a.Rb) && K.D(this.jc, a.jc) && K.D(this.df, a.df) && K.D(this.ef, a.ef); + case Ad: + return K.D(this.F, a.F) && K.D(this.G, a.G) && K.D(this.Rb, a.Rb) && K.D(this.jc, a.jc); + case Bd: + return K.D(this.Je, a.Je) && K.D(this.Qf, a.Qf) && K.D(this.Ja, a.Ja) && K.D(this.Ua, a.Ua) && K.D(this.radiusX, + a.radiusX) && K.D(this.radiusY, a.radiusY); + case Gd: + return this.fl === a.fl && this.hw === a.hw && K.D(this.Pi, a.Pi) && K.D(this.F, a.F) && K.D(this.G, a.G) && K.D(this.radiusX, a.radiusX) && K.D(this.radiusY, a.radiusY); + default: + return !1 + } + }; + Jd.prototype.toString = function (a) { + void 0 === a && (a = -1); + var b = ""; + switch (this.type) { + case yd: + b = 0 > a ? "M" + this.F.toString() + " " + this.G.toString() : "M" + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case pd: + b = 0 > a ? "L" + this.F.toString() + " " + this.G.toString() : "L" + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case zd: + b = 0 > a ? "C" + this.Rb.toString() + " " + this.jc.toString() + " " + this.df.toString() + " " + this.ef.toString() + " " + this.F.toString() + " " + this.G.toString() : "C" + this.Rb.toFixed(a) + " " + this.jc.toFixed(a) + " " + this.df.toFixed(a) + + " " + this.ef.toFixed(a) + " " + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case Ad: + b = 0 > a ? "Q" + this.Rb.toString() + " " + this.jc.toString() + " " + this.F.toString() + " " + this.G.toString() : "Q" + this.Rb.toFixed(a) + " " + this.jc.toFixed(a) + " " + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case Bd: + b = 0 > a ? "B" + this.Je.toString() + " " + this.Qf.toString() + " " + this.Ja.toString() + " " + this.Ua.toString() + " " + this.radiusX : "B" + this.Je.toFixed(a) + " " + this.Qf.toFixed(a) + " " + this.Ja.toFixed(a) + " " + this.Ua.toFixed(a) + " " + this.radiusX; + break; + case Gd: + b = 0 > a ? "A" + this.radiusX.toString() + " " + this.radiusY.toString() + " " + this.Pi.toString() + " " + (this.hw ? 1 : 0) + " " + (this.fl ? 1 : 0) + " " + this.F.toString() + " " + this.G.toString() : "A" + this.radiusX.toFixed(a) + " " + this.radiusY.toFixed(a) + " " + this.Pi.toFixed(a) + " " + (this.hw ? 1 : 0) + " " + (this.fl ? 1 : 0) + " " + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + default: + b = this.type.toString() + } + return b + (this.zh ? "z" : "") + }; + var yd; + Jd.Move = yd = u.s(Jd, "Move", 0); + var pd; + Jd.Line = pd = u.s(Jd, "Line", 1); + var zd; + Jd.Bezier = zd = u.s(Jd, "Bezier", 2); + var Ad; + Jd.QuadraticBezier = Ad = u.s(Jd, "QuadraticBezier", 3); + var Bd; + Jd.Arc = Bd = u.s(Jd, "Arc", 4); + var Gd; + Jd.SvgArc = Gd = u.s(Jd, "SvgArc", 4); + Jd.prototype.freeze = function () { + this.Ca = !0; + return this + }; + Jd.prototype.La = function () { + this.Ca = !1; + return this + }; + Jd.prototype.close = Jd.prototype.close = function () { + this.zh = !0; + return this + }; + + function Hd(a, b) { + if (null !== a.Ri && !1 === b.Ta) return a.Ri; + var c = a.radiusX, d = a.radiusY; + void 0 === d && (d = c); + var e = a.bd, f = a.xe, h = K.fD(0, 0, c < d ? c : d, a.Je, a.Je + a.Qf, !1); + if (c !== d) { + var k = u.jh(); + k.reset(); + c < d ? k.scale(1, d / c) : k.scale(c / d, 1); + wd(h, k); + u.Ye(k) + } + c = h.length; + for (d = 0; d < c; d++) k = h[d], k[0] += e, k[1] += f, k[2] += e, k[3] += f, k[4] += e, k[5] += f, k[6] += e, k[7] += f; + a.Ri = h; + return a.Ri + } + + function Id(a, b, c, d) { + function e(a, b, c, d) { + return (a * d < b * c ? -1 : 1) * Math.acos(f(a, b, c, d)) + } + + function f(a, b, c, d) { + return (a * c + b * d) / (Math.sqrt(a * a + b * b) * Math.sqrt(c * c + d * d)) + } + + if (null !== a.Ri && !1 === b.Ta) return a.Ri; + b = a.dg; + var h = a.eg, k = Math.PI / 180 * a.bd, l = a.Ln, m = a.bn, n = a.pb, p = a.Bb, q = Math.cos(k), + r = Math.sin(k), s = q * (c - n) / 2 + r * (d - p) / 2, k = -r * (c - n) / 2 + q * (d - p) / 2, + t = s * s / (b * b) + k * k / (h * h); + 1 < t && (b *= Math.sqrt(t), h *= Math.sqrt(t)); + t = (l === m ? -1 : 1) * Math.sqrt((b * b * h * h - b * b * k * k - h * h * s * s) / (b * b * k * k + h * h * s * s)); + isNaN(t) && (t = 0); + l = t * b * k / h; + t = t * -h * s / + b; + isNaN(l) && (l = 0); + isNaN(t) && (t = 0); + c = (c + n) / 2 + q * l - r * t; + d = (d + p) / 2 + r * l + q * t; + p = e(1, 0, (s - l) / b, (k - t) / h); + q = (s - l) / b; + n = (k - t) / h; + s = (-s - l) / b; + l = (-k - t) / h; + k = e(q, n, s, l); + s = f(q, n, s, l); + -1 >= s ? k = Math.PI : 1 <= s && (k = 0); + !m && 0 < k && (k -= 2 * Math.PI); + m && 0 > k && (k += 2 * Math.PI); + m = b > h ? 1 : b / h; + s = b > h ? h / b : 1; + b = K.fD(0, 0, b > h ? b : h, p, p + k, !0); + h = u.jh(); + h.reset(); + h.translate(c, d); + h.rotate(a.bd, 0, 0); + h.scale(m, s); + wd(b, h); + u.Ye(h); + a.Ri = b; + return a.Ri + } + + u.defineProperty(Jd, {ew: "isClosed"}, function () { + return this.zh + }, function (a) { + this.zh !== a && (this.zh = a, this.Ta = !0) + }); + u.defineProperty(Jd, {type: "type"}, function () { + return this.oa + }, function (a) { + u.I(this, a); + this.oa = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {F: "endX"}, function () { + return this.pb + }, function (a) { + u.I(this, a); + this.pb = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {G: "endY"}, function () { + return this.Bb + }, function (a) { + u.I(this, a); + this.Bb = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Rb: "point1X"}, function () { + return this.bd + }, function (a) { + u.I(this, a); + this.bd = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {jc: "point1Y"}, function () { + return this.xe + }, function (a) { + u.I(this, a); + this.xe = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {df: "point2X"}, function () { + return this.dg + }, function (a) { + u.I(this, a); + this.dg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {ef: "point2Y"}, function () { + return this.eg + }, function (a) { + u.I(this, a); + this.eg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Ja: "centerX"}, function () { + return this.bd + }, function (a) { + u.I(this, a); + this.bd = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Ua: "centerY"}, function () { + return this.xe + }, function (a) { + u.I(this, a); + this.xe = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {radiusX: "radiusX"}, function () { + return this.dg + }, function (a) { + 0 > a && u.wa(a, ">= zero", Jd, "radiusX"); + u.I(this, a); + this.dg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {radiusY: "radiusY"}, function () { + return this.eg + }, function (a) { + 0 > a && u.wa(a, ">= zero", Jd, "radiusY"); + u.I(this, a); + this.eg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Je: "startAngle"}, function () { + return this.pb + }, function (a) { + this.pb !== a && (u.I(this, a), a %= 360, 0 > a && (a += 360), this.pb = a, this.Ta = !0) + }); + u.defineProperty(Jd, {Qf: "sweepAngle"}, function () { + return this.Bb + }, function (a) { + u.I(this, a); + 360 < a && (a = 360); + -360 > a && (a = -360); + this.Bb = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {fl: "isClockwiseArc"}, function () { + return this.bn + }, function (a) { + u.I(this, a); + this.bn = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {hw: "isLargeArc"}, function () { + return this.Ln + }, function (a) { + u.I(this, a); + this.Ln = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Pi: "xAxisRotation"}, function () { + return this.bd + }, function (a) { + a %= 360; + 0 > a && (a += 360); + u.I(this, a); + this.bd = a; + this.Ta = !0 + }); + + function Md() { + this.Y = null; + this.Hy = (new w(0, 0)).freeze(); + this.Cx = (new w(0, 0)).freeze(); + this.Rt = this.Mu = 0; + this.Au = ""; + this.rv = this.gu = !1; + this.cu = this.Tt = 0; + this.Si = this.nu = this.wu = !1; + this.Vp = null; + this.qv = 0; + this.fg = this.nv = null + } + + u.fa("InputEvent", Md); + Md.prototype.copy = function () { + var a = new Md; + a.Y = this.Y; + a.Hy.assign(this.ff); + a.Cx.assign(this.da); + a.Mu = this.Mu; + a.Rt = this.Rt; + a.Au = this.Au; + a.gu = this.gu; + a.rv = this.rv; + a.Tt = this.Tt; + a.cu = this.cu; + a.wu = this.wu; + a.nu = this.nu; + a.Si = this.Si; + a.Vp = this.Vp; + a.qv = this.qv; + a.nv = this.nv; + a.fg = this.fg; + return a + }; + Md.prototype.toString = function () { + var a = "^"; + 0 !== this.gd && (a += "M:" + this.gd); + 0 !== this.button && (a += "B:" + this.button); + "" !== this.key && (a += "K:" + this.key); + 0 !== this.Te && (a += "C:" + this.Te); + 0 !== this.Uk && (a += "D:" + this.Uk); + this.Tc && (a += "h"); + this.bubbles && (a += "b"); + null !== this.da && (a += "@" + this.da.toString()); + return a + }; + u.defineProperty(Md, {g: "diagram"}, function () { + return this.Y + }, function (a) { + this.Y = a + }); + u.defineProperty(Md, {ff: "viewPoint"}, function () { + return this.Hy + }, function (a) { + u.C(a, w, Md, "viewPoint"); + this.Hy.assign(a) + }); + u.defineProperty(Md, {da: "documentPoint"}, function () { + return this.Cx + }, function (a) { + u.C(a, w, Md, "documentPoint"); + this.Cx.assign(a) + }); + u.defineProperty(Md, {gd: "modifiers"}, function () { + return this.Mu + }, function (a) { + this.Mu = a + }); + u.defineProperty(Md, {button: "button"}, function () { + return this.Rt + }, function (a) { + this.Rt = a + }); + u.defineProperty(Md, {key: "key"}, function () { + return this.Au + }, function (a) { + this.Au = a + }); + u.defineProperty(Md, {Wk: "down"}, function () { + return this.gu + }, function (a) { + this.gu = a + }); + u.defineProperty(Md, {up: "up"}, function () { + return this.rv + }, function (a) { + this.rv = a + }); + u.defineProperty(Md, {Te: "clickCount"}, function () { + return this.Tt + }, function (a) { + this.Tt = a + }); + u.defineProperty(Md, {Uk: "delta"}, function () { + return this.cu + }, function (a) { + this.cu = a + }); + u.defineProperty(Md, {Ps: "isMultiTouch"}, function () { + return this.wu + }, function (a) { + this.wu = a + }); + u.defineProperty(Md, {Tc: "handled"}, function () { + return this.nu + }, function (a) { + this.nu = a + }); + u.defineProperty(Md, {bubbles: "bubbles"}, function () { + return this.Si + }, function (a) { + this.Si = a + }); + u.defineProperty(Md, {event: "event"}, function () { + return this.Vp + }, function (a) { + this.Vp = a + }); + u.u(Md, {jl: "isTouchEvent"}, function () { + var a = window.TouchEvent; + return a && this.event instanceof a ? !0 : (a = window.PointerEvent) && this.event instanceof a && "touch" === this.event.pointerType + }); + u.defineProperty(Md, {timestamp: "timestamp"}, function () { + return this.qv + }, function (a) { + this.qv = a + }); + u.defineProperty(Md, {Cg: "targetDiagram"}, function () { + return this.nv + }, function (a) { + this.nv = a + }); + u.defineProperty(Md, {pe: "targetObject"}, function () { + return this.fg + }, function (a) { + this.fg = a + }); + u.defineProperty(Md, {control: "control"}, function () { + return 0 !== (this.gd & 1) + }, function (a) { + this.gd = a ? this.gd | 1 : this.gd & -2 + }); + u.defineProperty(Md, {shift: "shift"}, function () { + return 0 !== (this.gd & 4) + }, function (a) { + this.gd = a ? this.gd | 4 : this.gd & -5 + }); + u.defineProperty(Md, {alt: "alt"}, function () { + return 0 !== (this.gd & 2) + }, function (a) { + this.gd = a ? this.gd | 2 : this.gd & -3 + }); + u.defineProperty(Md, {Ys: "meta"}, function () { + return 0 !== (this.gd & 8) + }, function (a) { + this.gd = a ? this.gd | 8 : this.gd & -9 + }); + u.defineProperty(Md, {left: "left"}, function () { + return 0 === this.button + }, function (a) { + this.button = a ? 0 : 2 + }); + u.defineProperty(Md, {YJ: "middle"}, function () { + return 1 === this.button + }, function (a) { + this.button = a ? 1 : 0 + }); + u.defineProperty(Md, {right: "right"}, function () { + return 2 === this.button + }, function (a) { + this.button = a ? 2 : 0 + }); + + function Nd() { + this.Y = null; + this.Ub = ""; + this.Vu = this.iv = null; + this.St = !1 + } + + u.fa("DiagramEvent", Nd); + Nd.prototype.copy = function () { + var a = new Nd; + a.Y = this.Y; + a.Ub = this.Ub; + a.iv = this.iv; + a.Vu = this.Vu; + a.St = this.St; + return a + }; + Nd.prototype.toString = function () { + var a = "*" + this.name; + this.cancel && (a += "x"); + null !== this.hA && (a += ":" + this.hA.toString()); + null !== this.Mz && (a += "(" + this.Mz.toString() + ")"); + return a + }; + u.defineProperty(Nd, {g: "diagram"}, function () { + return this.Y + }, function (a) { + this.Y = a + }); + u.defineProperty(Nd, {name: "name"}, function () { + return this.Ub + }, function (a) { + this.Ub = a + }); + u.defineProperty(Nd, {hA: "subject"}, function () { + return this.iv + }, function (a) { + this.iv = a + }); + u.defineProperty(Nd, {Mz: "parameter"}, function () { + return this.Vu + }, function (a) { + this.Vu = a + }); + u.defineProperty(Nd, {cancel: "cancel"}, function () { + return this.St + }, function (a) { + this.St = a + }); + + function Zd() { + this.Bp = $d; + this.Xl = this.Lu = ""; + this.Wq = this.Xq = this.ar = this.br = this.$q = this.Y = this.Od = null + } + + u.fa("ChangedEvent", Zd); + var ae; + Zd.Transaction = ae = u.s(Zd, "Transaction", -1); + var $d; + Zd.Property = $d = u.s(Zd, "Property", 0); + var be; + Zd.Insert = be = u.s(Zd, "Insert", 1); + var ce; + Zd.Remove = ce = u.s(Zd, "Remove", 2); + Zd.prototype.clear = Zd.prototype.clear = function () { + this.Wq = this.Xq = this.ar = this.br = this.$q = this.Y = this.Od = null + }; + Zd.prototype.copy = function () { + var a = new Zd; + a.Od = this.Od; + a.Y = this.Y; + a.Bp = this.Bp; + a.Lu = this.Lu; + a.Xl = this.Xl; + a.$q = this.$q; + var b = this.br; + a.br = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + b = this.ar; + a.ar = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + b = this.Xq; + a.Xq = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + b = this.Wq; + a.Wq = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + return a + }; + Zd.prototype.toString = function () { + var a = "", + a = this.Ad === ae ? a + "* " : this.Ad === $d ? a + (null !== this.ga ? "!m" : "!d") : a + ((null !== this.ga ? "!m" : "!d") + this.Ad); + this.propertyName && "string" === typeof this.propertyName && (a += " " + this.propertyName); + this.Lf && this.Lf !== this.propertyName && (a += " " + this.Lf); + a += ": "; + this.Ad === ae ? null !== this.oldValue && (a += " " + this.oldValue) : (null !== this.object && (a += de(this.object)), null !== this.oldValue && (a += " old: " + de(this.oldValue)), null !== this.zg && (a += " " + this.zg), null !== this.newValue && + (a += " new: " + de(this.newValue)), null !== this.xg && (a += " " + this.xg)); + return a + }; + Zd.prototype.getValue = Zd.prototype.ta = function (a) { + return a ? this.oldValue : this.newValue + }; + Zd.prototype.getParam = function (a) { + return a ? this.zg : this.xg + }; + Zd.prototype.canUndo = Zd.prototype.canUndo = function () { + return null !== this.ga || null !== this.g ? !0 : !1 + }; + Zd.prototype.undo = Zd.prototype.undo = function () { + this.canUndo() && (null !== this.ga ? this.ga.pm(this, !0) : null !== this.g && this.g.pm(this, !0)) + }; + Zd.prototype.canRedo = Zd.prototype.canRedo = function () { + return null !== this.ga || null !== this.g ? !0 : !1 + }; + Zd.prototype.redo = Zd.prototype.redo = function () { + this.canRedo() && (null !== this.ga ? this.ga.pm(this, !1) : null !== this.g && this.g.pm(this, !1)) + }; + u.defineProperty(Zd, {ga: "model"}, function () { + return this.Od + }, function (a) { + this.Od = a + }); + u.defineProperty(Zd, {g: "diagram"}, function () { + return this.Y + }, function (a) { + this.Y = a + }); + u.defineProperty(Zd, {Ad: "change"}, function () { + return this.Bp + }, function (a) { + this.Bp = a + }); + u.defineProperty(Zd, {Lf: "modelChange"}, function () { + return this.Lu + }, function (a) { + this.Lu = a + }); + u.defineProperty(Zd, {propertyName: "propertyName"}, function () { + return this.Xl + }, function (a) { + this.Xl = a + }); + u.u(Zd, {IJ: "isTransactionFinished"}, function () { + return this.Bp === ae && ("CommittedTransaction" === this.Xl || "FinishedUndo" === this.Xl || "FinishedRedo" === this.Xl) + }); + u.defineProperty(Zd, {object: "object"}, function () { + return this.$q + }, function (a) { + this.$q = a + }); + u.defineProperty(Zd, {oldValue: "oldValue"}, function () { + return this.br + }, function (a) { + this.br = a + }); + u.defineProperty(Zd, {zg: "oldParam"}, function () { + return this.ar + }, function (a) { + this.ar = a + }); + u.defineProperty(Zd, {newValue: "newValue"}, function () { + return this.Xq + }, function (a) { + this.Xq = a + }); + u.defineProperty(Zd, {xg: "newParam"}, function () { + return this.Wq + }, function (a) { + this.Wq = a + }); + + function J(a) { + 1 < arguments.length && u.k("Model constructor can only take one optional argument, the Array of node data."); + u.gc(this); + this.wx = this.Ub = ""; + this.vk = !1; + this.gy = {}; + this.mf = []; + this.tc = new la(null, Object); + this.Tl = "key"; + this.Xt = this.Eu = null; + this.nx = this.ox = !1; + this.Yq = "category"; + this.uh = new la(null, F); + this.jj = null; + this.qi = !1; + this.Gy = null; + this.ha = new ee; + void 0 !== a && (this.ah = a) + } + + u.fa("Model", J); + J.prototype.clear = J.prototype.clear = function () { + this.mf = []; + this.tc.clear(); + this.uh.clear(); + this.ha.clear() + }; + g = J.prototype; + g.At = function () { + var a = ""; + "" !== this.name && (a += ',\n "name": ' + this.quote(this.name)); + "" !== this.Sk && (a += ',\n "dataFormat": ' + this.quote(this.Sk)); + this.nb && (a += ',\n "isReadOnly": ' + this.nb); + "key" !== this.Jm && "string" === typeof this.Jm && (a += ',\n "nodeKeyProperty": ' + this.quote(this.Jm)); + this.Xy && (a += ',\n "copiesArrays": true'); + this.Wy && (a += ',\n "copiesArrayObjects": true'); + "category" !== this.Im && "string" === typeof this.Im && (a += ',\n "nodeCategoryProperty": ' + this.quote(this.Im)); + return a + }; + g.pA = function () { + var a = "", b = this.Zs, c = !1, d; + for (d in b) if (!fe(d, b[d])) { + c = !0; + break + } + c && (a = ',\n "modelData": ' + oe(this, b)); + return a + ',\n "nodeDataArray": ' + pe(this, this.ah, !0) + }; + g.ft = function (a) { + a.name && (this.name = a.name); + a.dataFormat && (this.Sk = a.dataFormat); + a.isReadOnly && (this.nb = a.isReadOnly); + a.nodeKeyProperty && (this.Jm = a.nodeKeyProperty); + a.copiesArrays && (this.Xy = a.copiesArrays); + a.copiesArrayObjects && (this.Wy = a.copiesArrayObjects); + a.nodeCategoryProperty && (this.Im = a.nodeCategoryProperty) + }; + g.Qz = function (a) { + var b = a.modelData; + u.Sa(b) && (this.ht(b), this.Zs = b); + a = a.nodeDataArray; + u.isArray(a) && (this.ht(a), this.ah = a) + }; + g.toString = function (a) { + void 0 === a && (a = 0); + if (1 < a) return this.kA(); + var b = ("" !== this.name ? this.name : "") + " Model"; + if (0 < a) { + b += "\n node data:"; + a = this.ah; + for (var c = u.qb(a), d = 0; d < c; d++) var e = u.fb(a, d), b = b + (" " + this.wb(e) + ":" + de(e)) + } + return b + }; + J.prototype.toJson = J.prototype.toJSON = J.prototype.kA = function (a) { + void 0 === a && (a = this.constructor === J ? "go.Model" : this.constructor === Q ? "go.GraphLinksModel" : this.constructor === qe ? "go.TreeModel" : u.rg(this)); + return '{ "class": ' + this.quote(a) + this.At() + this.pA() + "}" + }; + J.fromJson = J.fromJSON = function (a, b) { + void 0 === b && (b = null); + null !== b && u.C(b, J, J, "fromJson:model"); + var c = null; + if ("string" === typeof a) if (window.JSON && window.JSON.parse) try { + c = window.JSON.parse(a) + } catch (d) { + } else u.trace("WARNING: no JSON.parse available"); else "object" === typeof a ? c = a : u.k("Unable to construct a Model from: " + a); + if (null === b) { + var e; + e = null; + var f = c["class"]; + if ("string" === typeof f) try { + var h = null; + 0 === f.indexOf("go.") ? (f = f.substr(3), h = da[f]) : (h = da[f], void 0 === h && (h = window[f])); + "function" === typeof h && + (e = new h) + } catch (k) { + } + null === e || e instanceof J ? b = e : u.k("Unable to construct a Model of declared class: " + c["class"]) + } + null === b && (b = new Q); + b.ft(c); + b.Qz(c); + return b + }; + J.prototype.replaceJsonObjects = J.prototype.ht = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + u.Sa(d) && u.RC(a, c, this.ht(d)) + } else if (u.Sa(a)) { + for (c in a) if (d = a[c], u.Sa(d) && (d = this.ht(d), a[c] = d, "points" === c && Array.isArray(d))) { + for (var e = 0 === d.length % 2, f = 0; f < d.length; f++) if ("number" !== typeof d[f]) { + e = !1; + break + } + if (e) { + e = new E(w); + for (f = 0; f < d.length / 2; f++) e.add(new w(d[2 * f], d[2 * f + 1])); + e.freeze(); + a[c] = e + } + } + if ("object" === typeof a) { + c = a; + d = a["class"]; + if ("NaN" === d) c = NaN; else if ("Date" === + d) c = new Date(a.value); else if ("go.Point" === d) c = new w(re(a.x), re(a.y)); else if ("go.Size" === d) c = new ia(re(a.width), re(a.height)); else if ("go.Rect" === d) c = new z(re(a.x), re(a.y), re(a.width), re(a.height)); else if ("go.Margin" === d) c = new rb(re(a.top), re(a.right), re(a.bottom), re(a.left)); else if ("go.Spot" === d) c = "string" === typeof a["enum"] ? tb(a["enum"]) : new L(re(a.x), re(a.y), re(a.offsetX), re(a.offsetY)); else if ("go.Brush" === d) { + if (c = new ga, c.type = Da(ga, a.type), "string" === typeof a.color && (c.color = a.color), a.start instanceof + L && (c.start = a.start), a.end instanceof L && (c.end = a.end), "number" === typeof a.startRadius && (c.ut = re(a.startRadius)), "number" === typeof a.endRadius && (c.us = re(a.endRadius)), a = a.colorStops, u.Sa(a)) for (b in a) c.addColorStop(parseFloat(b), a[b]) + } else "go.Geometry" === d && (b = null, b = "string" === typeof a.path ? sd(a.path) : new $c, b.type = Da($c, a.type), "number" === typeof a.startX && (b.ua = re(a.startX)), "number" === typeof a.startY && (b.va = re(a.startY)), "number" === typeof a.endX && (b.F = re(a.endX)), "number" === typeof a.endY && (b.G = + re(a.endY)), a.spot1 instanceof L && (b.A = a.spot1), a.spot2 instanceof L && (b.B = a.spot2), c = b); + a = c + } + } + return a + }; + J.prototype.quote = function (a) { + for (var b = "", c = a.length, d = 0; d < c; d++) var e = a[d], b = '"' === e || "\\" === e ? b + ("\\" + e) : "\b" === e ? b + "\\b" : "\f" === e ? b + "\\f" : "\n" === e ? b + "\\n" : "\r" === e ? b + "\\r" : "\t" === e ? b + "\\t" : b + e; + return '"' + b + '"' + }; + J.prototype.writeJsonValue = J.prototype.Bt = function (a) { + return void 0 === a ? "undefined" : null === a ? "null" : !0 === a ? "true" : !1 === a ? "false" : "string" === typeof a ? this.quote(a) : "number" === typeof a ? Infinity === a ? "9e9999" : -Infinity === a ? "-9e9999" : isNaN(a) ? '{"class":"NaN"}' : a.toString() : a instanceof Date ? '{"class":"Date", "value":"' + a.toJSON() + '"}' : a instanceof Number ? this.Bt(a.valueOf()) : u.isArray(a) ? pe(this, a) : u.Sa(a) ? oe(this, a) : "function" === typeof a ? "null" : a.toString() + }; + + function pe(a, b, c) { + void 0 === c && (c = !1); + var d = u.qb(b); + if (0 >= d) return "[]"; + var e = new Ba; + e.add("[ "); + c && 1 < d && e.add("\n"); + for (var f = 0; f < d; f++) { + var h = u.fb(b, f); + void 0 !== h && (0 < f && (e.add(","), c && e.add("\n")), e.add(a.Bt(h))) + } + c && 1 < d && e.add("\n"); + e.add(" ]"); + return e.toString() + } + + function fe(a, b) { + return void 0 === b || "__gohashid" === a || "_" === a[0] || "function" === typeof b ? !0 : !1 + } + + function se(a) { + return isNaN(a) ? "NaN" : Infinity === a ? "9e9999" : -Infinity === a ? "-9e9999" : a + } + + function oe(a, b) { + var c = b; + if (c instanceof w) { + var d = c; + b = {"class": "go.Point", x: se(d.x), y: se(d.y)} + } else if (c instanceof ia) { + var e = c; + b = {"class": "go.Size", width: se(e.width), height: se(e.height)} + } else if (c instanceof z) b = { + "class": "go.Rect", + x: se(c.x), + y: se(c.y), + width: se(c.width), + height: se(c.height) + }; else if (c instanceof rb) b = { + "class": "go.Margin", + top: se(c.top), + right: se(c.right), + bottom: se(c.bottom), + left: se(c.left) + }; else if (c instanceof L) e = c, b = e.pd() ? { + "class": "go.Spot", x: se(e.x), y: se(e.y), offsetX: se(e.offsetX), + offsetY: se(e.offsetY) + } : {"class": "go.Spot", "enum": e.toString()}; else if (c instanceof ga) { + b = {"class": "go.Brush", type: c.type.name}; + if (c.type === te) b.color = c.color; else if (c.type === ue || c.type === ve) b.start = c.start, b.end = c.end, c.type === ve && (0 !== c.ut && (b.startRadius = se(c.ut)), isNaN(c.us) || (b.endRadius = se(c.us))); + if (null !== c.os) { + for (var f = {}, h = c.os.i; h.next();) f[h.key] = h.value; + b.colorStops = f + } + } else if (c instanceof $c) b = { + "class": "go.Geometry", + type: c.type.name + }, 0 !== c.ua && (b.startX = se(c.ua)), 0 !== c.va && (b.startY = + se(c.va)), 0 !== c.F && (b.endX = se(c.F)), 0 !== c.G && (b.endY = se(c.G)), c.A.L(xb) || (b.spot1 = c.A), c.B.L(Vb) || (b.spot2 = c.B), c.type === ad && (b.path = qd(c)); else if (c instanceof S || c instanceof D || c instanceof we || c instanceof J || c instanceof xe || c instanceof sa || c instanceof Je || c instanceof xa || c instanceof ee || c instanceof Ke) return u.trace("ERROR: trying to convert a GraphObject or Diagram or Model or Tool or Layout or UndoManager into JSON text: " + c.toString()), "{}"; + f = "{"; + c = !0; + for (d in b) if (e = u.sb(b, d), !fe(d, + e)) if (c ? c = !1 : f += ", ", f += '"' + d + '":', "points" === d && e instanceof E && e.oa === w) { + h = e; + e = "["; + for (h = h.i; h.next();) { + var k = h.value; + 1 < e.length && (e += ","); + e += a.Bt(k.x); + e += ","; + e += a.Bt(k.y) + } + e += "]"; + f += e + } else f += a.Bt(e); + return f + "}" + } + + function re(a) { + return "number" === typeof a ? a : "NaN" === a ? NaN : "9e9999" === a ? Infinity : "-9e9999" === a ? -Infinity : parseFloat(a) + } + + u.defineProperty(J, {name: "name"}, function () { + return this.Ub + }, function (a) { + var b = this.Ub; + b !== a && (u.j(a, "string", J, "name"), this.Ub = a, this.h("name", b, a)) + }); + u.defineProperty(J, {Sk: "dataFormat"}, function () { + return this.wx + }, function (a) { + var b = this.wx; + b !== a && (u.j(a, "string", J, "dataFormat"), this.wx = a, this.h("dataFormat", b, a)) + }); + u.defineProperty(J, {nb: "isReadOnly"}, function () { + return this.vk + }, function (a) { + var b = this.vk; + b !== a && (u.j(a, "boolean", J, "isReadOnly"), this.vk = a, this.h("isReadOnly", b, a)) + }); + u.defineProperty(J, {Zs: "modelData"}, function () { + return this.gy + }, function (a) { + var b = this.gy; + b !== a && (u.j(a, "object", J, "modelData"), this.gy = a, this.h("modelData", b, a), this.Nb(a)) + }); + J.prototype.addChangedListener = J.prototype.Jy = function (a) { + u.j(a, "function", J, "addChangedListener:listener"); + null === this.jj && (this.jj = new E("function")); + this.jj.add(a) + }; + J.prototype.removeChangedListener = J.prototype.Tz = function (a) { + u.j(a, "function", J, "removeChangedListener:listener"); + null !== this.jj && (this.jj.remove(a), 0 === this.jj.count && (this.jj = null)) + }; + J.prototype.Jv = function (a) { + this.cb || this.ha.ED(a); + if (null !== this.jj) { + var b = this.jj, c = b.length; + if (1 === c) b = b.ja(0), b(a); else if (0 !== c) for (var d = b.Ke(), e = 0; e < c; e++) b = d[e], b(a) + } + }; + J.prototype.raiseChangedEvent = J.prototype.Dc = function (a, b, c, d, e, f, h) { + Le(this, "", a, b, c, d, e, f, h) + }; + J.prototype.raiseChanged = J.prototype.h = function (a, b, c, d, e) { + Le(this, "", $d, a, this, b, c, d, e) + }; + J.prototype.raiseDataChanged = J.prototype.Pz = function (a, b, c, d, e, f) { + Le(this, "", $d, b, a, c, d, e, f) + }; + + function Le(a, b, c, d, e, f, h, k, l) { + void 0 === k && (k = null); + void 0 === l && (l = null); + var m = new Zd; + m.ga = a; + m.Ad = c; + m.Lf = b; + m.propertyName = d; + m.object = e; + m.oldValue = f; + m.zg = k; + m.newValue = h; + m.xg = l; + a.Jv(m) + } + + u.defineProperty(J, {ha: "undoManager"}, function () { + return this.Gy + }, function (a) { + var b = this.Gy; + b !== a && (u.C(a, ee, J, "undoManager"), null !== b && b.SH(this), this.Gy = a, null !== a && a.MF(this)) + }); + u.defineProperty(J, {cb: "skipsUndoManager"}, function () { + return this.qi + }, function (a) { + u.j(a, "boolean", J, "skipsUndoManager"); + this.qi = a + }); + J.prototype.pm = function (a, b) { + if (null !== a && a.ga === this) if (a.Ad === $d) { + var c = a.object, d = a.propertyName, e = a.ta(b); + u.Oa(c, d, e) + } else a.Ad === be ? "nodeDataArray" === a.Lf ? (c = a.newValue, u.Sa(c) && (d = this.wb(c), void 0 !== d && (b ? (u.zi(this.mf, a.xg), this.tc.remove(d)) : (u.yi(this.mf, a.xg, c), this.tc.add(d, c))))) : "" === a.Lf ? (c = a.object, !u.isArray(c) && a.propertyName && (c = u.sb(a.object, a.propertyName)), u.isArray(c) && (d = a.newValue, e = a.xg, b ? u.zi(c, e) : u.yi(c, e, d))) : u.k("unknown ChangedEvent.Insert object: " + a.toString()) : a.Ad === + ce ? "nodeDataArray" === a.Lf ? (c = a.oldValue, u.Sa(c) && (d = this.wb(c), void 0 !== d && (b ? (u.yi(this.mf, a.zg, c), this.tc.add(d, c)) : (u.zi(this.mf, a.zg), this.tc.remove(d))))) : "" === a.Lf ? (c = a.object, !u.isArray(c) && a.propertyName && (c = u.sb(a.object, a.propertyName)), u.isArray(c) && (d = a.oldValue, e = a.zg, b ? u.yi(c, e, d) : u.zi(c, e))) : u.k("unknown ChangedEvent.Remove object: " + a.toString()) : a.Ad !== ae && u.k("unknown ChangedEvent: " + a.toString()) + }; + J.prototype.startTransaction = J.prototype.Wb = function (a) { + return this.ha.Wb(a) + }; + J.prototype.commitTransaction = J.prototype.Wd = function (a) { + return this.ha.Wd(a) + }; + J.prototype.rollbackTransaction = J.prototype.ap = function () { + return this.ha.ap() + }; + J.prototype.updateTargetBindings = J.prototype.Nb = function (a, b) { + void 0 === b && (b = ""); + Le(this, "SourceChanged", ae, b, a, null, null) + }; + u.defineProperty(J, {Jm: "nodeKeyProperty"}, function () { + return this.Tl + }, function (a) { + var b = this.Tl; + b !== a && (Me(a, J, "nodeKeyProperty"), 0 < this.tc.count && u.k("Cannot set Model.nodeKeyProperty when there is existing node data"), this.Tl = a, this.h("nodeKeyProperty", b, a)) + }); + + function Me(a, b, c) { + "string" !== typeof a && "function" !== typeof a && u.Kd(a, "string or function", b, c) + } + + J.prototype.getKeyForNodeData = J.prototype.wb = function (a) { + if (null !== a) { + var b = this.Tl; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("Key value for node data " + a + " is not a number or a string: " + b) + } + } + }; + J.prototype.setKeyForNodeData = J.prototype.bA = function (a, b) { + void 0 !== b && null !== b && Ne(b) || u.Kd(b, "number or string", J, "setKeyForNodeData:key"); + if (null !== a) { + var c = this.Tl; + if ("" !== c) if (this.Ue(a)) { + var d = u.sb(a, c); + d !== b && null === this.qf(b) && (u.Oa(a, c, b), this.tc.remove(d), this.tc.add(b, a), Le(this, "nodeKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c), this.gt(d, b)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(J, {RJ: "makeUniqueKeyFunction"}, function () { + return this.Eu + }, function (a) { + var b = this.Eu; + b !== a && (null !== a && u.j(a, "function", J, "makeUniqueKeyFunction"), this.Eu = a, this.h("makeUniqueKeyFunction", b, a)) + }); + + function Ne(a) { + return "number" === typeof a || "string" === typeof a + } + + J.prototype.containsNodeData = J.prototype.Ue = function (a) { + a = this.wb(a); + return void 0 === a ? !1 : this.tc.contains(a) + }; + J.prototype.findNodeDataForKey = J.prototype.qf = function (a) { + null === a && u.k("Model.findNodeDataForKey:key must not be null"); + return void 0 !== a && Ne(a) ? this.tc.ta(a) : null + }; + u.defineProperty(J, {ah: "nodeDataArray"}, function () { + return this.mf + }, function (a) { + var b = this.mf; + if (b !== a) { + u.Qy(a, J, "nodeDataArray"); + this.tc.clear(); + this.mA(); + for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + if (!u.Sa(e)) { + u.k("Model.nodeDataArray must only contain Objects, not: " + e); + return + } + u.Is(e) + } + this.mf = a; + for (var f = new E(Object), d = 0; d < c; d++) { + var e = u.fb(a, d), h = this.wb(e); + void 0 === h ? f.add(e) : null !== this.tc.ta(h) ? f.add(e) : this.tc.add(h, e) + } + for (d = f.i; d.next();) e = d.value, this.UD(e), f = this.wb(e), void 0 !== f && + this.tc.add(f, e); + Le(this, "nodeDataArray", $d, "nodeDataArray", this, b, a); + for (d = 0; d < c; d++) e = u.fb(a, d), this.$o(e), this.Zo(e); + this.XC(); + u.eH(a) || (this.nb = !0) + } + }); + J.prototype.makeNodeDataKeyUnique = J.prototype.UD = function (a) { + if (null !== a) { + var b = this.Tl; + if ("" !== b) { + var c = this.wb(a); + if (void 0 === c || this.tc.contains(c)) { + var d = this.Eu; + if (null !== d && (c = d(this, a), void 0 !== c && null !== c && !this.tc.contains(c))) { + u.Oa(a, b, c); + return + } + if ("string" === typeof c) { + for (d = 2; this.tc.contains(c + d);) d++; + u.Oa(a, b, c + d) + } else if (void 0 === c || "number" === typeof c) { + for (d = -this.tc.count - 1; this.tc.contains(d);) d--; + u.Oa(a, b, d) + } else u.k("Model.getKeyForNodeData returned something other than a string or a number: " + + c) + } + } + } + }; + J.prototype.addNodeData = J.prototype.km = function (a) { + if (null !== a) { + u.Is(a); + var b = this.wb(a); + if (void 0 === b || this.tc.ta(b) !== a) this.UD(a), b = this.wb(a), void 0 === b ? u.k("Model.makeNodeDataKeyUnique failed on " + a + ". Data not added to Model.") : (this.tc.add(b, a), b = u.qb(this.mf), u.yi(this.mf, b, a), Le(this, "nodeDataArray", be, "nodeDataArray", this, null, a, null, b), this.$o(a), this.Zo(a)) + } + }; + J.prototype.addNodeDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.km(u.fb(a, c)); else for (a = a.i; a.next();) this.km(a.value) + }; + J.prototype.removeNodeData = J.prototype.Vz = function (a) { + if (null !== a) { + var b = this.wb(a); + void 0 !== b && this.tc.contains(b) && (this.tc.remove(b), b = u.Py(this.mf, a), 0 > b || (u.zi(this.mf, b), Le(this, "nodeDataArray", ce, "nodeDataArray", this, a, null, b, null), this.zt(a))) + } + }; + J.prototype.removeNodeDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.Vz(u.fb(a, c)); else for (a = a.i; a.next();) this.Vz(a.value) + }; + g = J.prototype; + g.gt = function (a, b) { + var c = Oe(this, a); + c instanceof F && this.uh.add(b, c) + }; + g.mA = function () { + }; + g.$o = function () { + }; + g.Zo = function () { + }; + g.zt = function () { + }; + + function Pe(a, b, c) { + if (void 0 !== b) { + var d = a.uh.ta(b); + null === d && (d = new F(Object), a.uh.add(b, d)); + d.add(c) + } + } + + function Qe(a, b, c) { + if (void 0 !== b) { + var d = a.uh.ta(b); + d instanceof F && (void 0 === c || null === c ? a.uh.remove(b) : (d.remove(c), 0 === d.count && a.uh.remove(b))) + } + } + + function Oe(a, b) { + if (void 0 === b) return null; + var c = a.uh.ta(b); + return c instanceof F ? c : null + } + + J.prototype.clearUnresolvedReferences = J.prototype.XC = function (a) { + void 0 === a ? this.uh.clear() : this.uh.remove(a) + }; + u.defineProperty(J, {fJ: "copyNodeDataFunction"}, function () { + return this.Xt + }, function (a) { + var b = this.Xt; + b !== a && (null !== a && u.j(a, "function", J, "copyNodeDataFunction"), this.Xt = a, this.h("copyNodeDataFunction", b, a)) + }); + u.defineProperty(J, {Xy: "copiesArrays"}, function () { + return this.ox + }, function (a) { + var b = this.ox; + b !== a && (null !== a && u.j(a, "boolean", J, "copiesArrays"), this.ox = a, this.h("copiesArrays", b, a)) + }); + u.defineProperty(J, {Wy: "copiesArrayObjects"}, function () { + return this.nx + }, function (a) { + var b = this.nx; + b !== a && (null !== a && u.j(a, "boolean", J, "copiesArrayObjects"), this.nx = a, this.h("copiesArrayObjects", b, a)) + }); + J.prototype.copyNodeData = function (a) { + if (null === a) return null; + var b = null, b = this.Xt, b = null !== b ? b(a, this) : Re(this, a, !0); + u.Sa(b) && u.gc(b); + return b + }; + + function Re(a, b, c) { + if (a.Xy && Array.isArray(b)) { + var d = []; + for (c = 0; c < b.length; c++) { + var e = Re(a, b[c], a.Wy); + d.push(e) + } + u.gc(d); + return d + } + if (c && u.Sa(b)) { + c = (c = b.constructor) ? new c : {}; + for (d in b) if ("__gohashid" !== d) { + var e = u.sb(b, d), f; + f = e; + f instanceof S || f instanceof D || f instanceof we || f instanceof Se || f instanceof Te || f instanceof xe || f instanceof sa || f instanceof Je || f instanceof Md || f instanceof Nd ? ("_" !== d[0] && u.trace('Warning: found GraphObject or Diagram reference when copying model data on property "' + + d + '" of data object: ' + b.toString() + " \nModel data should not have any references to a Diagram or any part of a diagram, such as: " + f.toString()), f = !0) : f = f instanceof J || f instanceof ee || f instanceof Ke || f instanceof Zd ? !0 : !1; + f || (e = Re(a, e, !1)); + u.Oa(c, d, e) + } + u.gc(c); + return c + } + return b + } + + var Ue = !1; + J.prototype.setDataProperty = function (a, b, c) { + if (this.Ue(a)) if (b === this.Jm) this.bA(a, c); else { + if (b === this.Im) { + this.Dw(a, c); + return + } + } else !Ue && a instanceof S && (Ue = !0, u.trace('Model.setDataProperty is modifying a GraphObject, "' + a.toString() + '"'), u.trace(" Is that really your intent?")); + var d = u.sb(a, b); + d !== c && (u.Oa(a, b, c), this.Pz(a, b, d, c)) + }; + J.prototype.addArrayItem = function (a, b) { + this.XG(a, -1, b) + }; + J.prototype.insertArrayItem = J.prototype.XG = function (a, b, c) { + a === this.mf && u.k("Model.insertArrayItem or Model.addArrayItem should not be called on the Model.nodeDataArray"); + 0 > b && (b = u.qb(a)); + u.yi(a, b, c); + Le(this, "", be, "", a, null, c, null, b) + }; + J.prototype.removeArrayItem = function (a, b) { + void 0 === b && (b = -1); + a === this.mf && u.k("Model.removeArrayItem should not be called on the Model.nodeDataArray"); + -1 === b && (b = u.qb(a) - 1); + var c = u.fb(a, b); + u.zi(a, b); + Le(this, "", ce, "", a, c, null, b, null) + }; + u.defineProperty(J, {Im: "nodeCategoryProperty"}, function () { + return this.Yq + }, function (a) { + var b = this.Yq; + b !== a && (Me(a, J, "nodeCategoryProperty"), this.Yq = a, this.h("nodeCategoryProperty", b, a)) + }); + J.prototype.getCategoryForNodeData = J.prototype.fz = function (a) { + if (null === a) return ""; + var b = this.Yq; + if ("" === b) return ""; + b = u.sb(a, b); + if (void 0 === b) return ""; + if ("string" === typeof b) return b; + u.k("getCategoryForNodeData found a non-string category for " + a + ": " + b); + return "" + }; + J.prototype.setCategoryForNodeData = J.prototype.Dw = function (a, b) { + u.j(b, "string", J, "setCategoryForNodeData:cat"); + if (null !== a) { + var c = this.Yq; + if ("" !== c) if (this.Ue(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "nodeCategory", $d, c, a, d, b)) + } else u.Oa(a, c, b) + } + }; + + function Q(a, b) { + 2 < arguments.length && u.k("GraphLinksModel constructor can only take two optional arguments, the Array of node data and the Array of link data."); + J.call(this); + this.Bh = []; + this.Rl = new F(Object); + this.ik = this.Wt = null; + this.fj = "from"; + this.ij = "to"; + this.Dq = this.Cq = ""; + this.zq = "category"; + this.Ch = ""; + this.Ou = "isGroup"; + this.pj = "group"; + this.px = !1; + void 0 !== a && (this.ah = a); + void 0 !== b && (this.Qj = b) + } + + u.Ga(Q, J); + u.fa("GraphLinksModel", Q); + Q.prototype.clear = Q.prototype.clear = function () { + J.prototype.clear.call(this); + this.Bh = []; + this.Rl.clear() + }; + g = Q.prototype; + g.toString = function (a) { + void 0 === a && (a = 0); + if (2 <= a) return this.kA(); + var b = ("" !== this.name ? this.name : "") + " GraphLinksModel"; + if (0 < a) { + b += "\n node data:"; + a = this.ah; + for (var c = u.qb(a), d = 0, d = 0; d < c; d++) var e = u.fb(a, d), b = b + (" " + this.wb(e) + ":" + de(e)); + b += "\n link data:"; + a = this.Qj; + c = u.qb(a); + for (d = 0; d < c; d++) e = u.fb(a, d), b += " " + this.$k(e) + "--\x3e" + this.cl(e) + } + return b + }; + g.At = function () { + var a = J.prototype.At.call(this), b = ""; + "category" !== this.Ts && "string" === typeof this.Ts && (b += ',\n "linkCategoryProperty": ' + this.quote(this.Ts)); + "from" !== this.Ko && "string" === typeof this.Ko && (b += ',\n "linkFromKeyProperty": ' + this.quote(this.Ko)); + "to" !== this.Mo && "string" === typeof this.Mo && (b += ',\n "linkToKeyProperty": ' + this.quote(this.Mo)); + "" !== this.Us && "string" === typeof this.Us && (b += ',\n "linkFromPortIdProperty": ' + this.quote(this.Us)); + "" !== this.Ws && "string" === typeof this.Ws && (b += + ',\n "linkToPortIdProperty": ' + this.quote(this.Ws)); + "" !== this.Vs && "string" === typeof this.Vs && (b += ',\n "linkLabelKeysProperty": ' + this.quote(this.Vs)); + "isGroup" !== this.bt && "string" === typeof this.bt && (b += ',\n "nodeIsGroupProperty": ' + this.quote(this.bt)); + "group" !== this.Vo && "string" === typeof this.Vo && (b += ',\n "nodeGroupKeyProperty": ' + this.quote(this.Vo)); + return a + b + }; + g.pA = function () { + var a = J.prototype.pA.call(this), b = ',\n "linkDataArray": ' + pe(this, this.Qj, !0); + return a + b + }; + g.ft = function (a) { + J.prototype.ft.call(this, a); + a.linkFromKeyProperty && (this.Ko = a.linkFromKeyProperty); + a.linkToKeyProperty && (this.Mo = a.linkToKeyProperty); + a.linkFromPortIdProperty && (this.Us = a.linkFromPortIdProperty); + a.linkToPortIdProperty && (this.Ws = a.linkToPortIdProperty); + a.linkCategoryProperty && (this.Ts = a.linkCategoryProperty); + a.linkLabelKeysProperty && (this.Vs = a.linkLabelKeysProperty); + a.nodeIsGroupProperty && (this.bt = a.nodeIsGroupProperty); + a.nodeGroupKeyProperty && (this.Vo = a.nodeGroupKeyProperty) + }; + g.Qz = function (a) { + J.prototype.Qz.call(this, a); + a = a.linkDataArray; + u.isArray(a) && (this.ht(a), this.Qj = a) + }; + g.pm = function (a, b) { + var c = null; + if (a.Ad === be) { + if ("linkDataArray" === a.Lf ? c = this.Bh : "linkLabelKeys" === a.Lf && (c = this.Pj(a.object)), u.isArray(c)) { + b ? u.zi(c, a.xg) : u.yi(c, a.xg, a.newValue); + return + } + } else if (a.Ad === ce && ("linkDataArray" === a.Lf ? c = this.Bh : "linkLabelKeys" === a.Lf && (c = this.Pj(a.object)), u.isArray(c))) { + b ? u.yi(c, a.zg, a.oldValue) : u.zi(c, a.zg); + return + } + J.prototype.pm.call(this, a, b) + }; + u.defineProperty(Q, {Oy: "archetypeNodeData"}, function () { + return this.ik + }, function (a) { + var b = this.ik; + b !== a && (null !== a && u.C(a, Object, Q, "archetypeNodeData"), this.ik = a, this.h("archetypeNodeData", b, a)) + }); + Q.prototype.Gm = function (a) { + if (void 0 !== a) { + var b = this.ik; + if (null !== b) { + var c = this.qf(a); + null === c && (c = this.copyNodeData(b), u.Oa(c, this.Tl, a), this.km(c)) + } + return a + } + }; + u.defineProperty(Q, {Ko: "linkFromKeyProperty"}, function () { + return this.fj + }, function (a) { + var b = this.fj; + b !== a && (Me(a, Q, "linkFromKeyProperty"), this.fj = a, this.h("linkFromKeyProperty", b, a)) + }); + Q.prototype.getFromKeyForLinkData = Q.prototype.$k = function (a) { + if (null !== a) { + var b = this.fj; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("FromKey value for link data " + a + " is not a number or a string: " + b) + } + } + }; + Q.prototype.setFromKeyForLinkData = Q.prototype.Ew = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", Q, "setFromKeyForLinkData:key"); + if (null !== a) { + var c = this.fj; + if ("" !== c) if (b = this.Gm(b), this.Ci(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "linkFromKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Mo: "linkToKeyProperty"}, function () { + return this.ij + }, function (a) { + var b = this.ij; + b !== a && (Me(a, Q, "linkToKeyProperty"), this.ij = a, this.h("linkToKeyProperty", b, a)) + }); + Q.prototype.getToKeyForLinkData = Q.prototype.cl = function (a) { + if (null !== a) { + var b = this.ij; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("ToKey value for link data " + a + " is not a number or a string: " + b) + } + } + }; + Q.prototype.setToKeyForLinkData = Q.prototype.Gw = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", Q, "setToKeyForLinkData:key"); + if (null !== a) { + var c = this.ij; + if ("" !== c) if (b = this.Gm(b), this.Ci(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "linkToKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Us: "linkFromPortIdProperty"}, function () { + return this.Cq + }, function (a) { + var b = this.Cq; + b !== a && (Me(a, Q, "linkFromPortIdProperty"), this.Cq = a, this.h("linkFromPortIdProperty", b, a)) + }); + Q.prototype.getFromPortIdForLinkData = Q.prototype.FG = function (a) { + if (null === a) return ""; + var b = this.Cq; + if ("" === b) return ""; + a = u.sb(a, b); + return void 0 === a ? "" : a + }; + Q.prototype.setFromPortIdForLinkData = Q.prototype.aA = function (a, b) { + u.j(b, "string", Q, "setFromPortIdForLinkData:portname"); + if (null !== a) { + var c = this.Cq; + if ("" !== c) if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "linkFromPortId", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Ws: "linkToPortIdProperty"}, function () { + return this.Dq + }, function (a) { + var b = this.Dq; + b !== a && (Me(a, Q, "linkToPortIdProperty"), this.Dq = a, this.h("linkToPortIdProperty", b, a)) + }); + Q.prototype.getToPortIdForLinkData = Q.prototype.IG = function (a) { + if (null === a) return ""; + var b = this.Dq; + if ("" === b) return ""; + a = u.sb(a, b); + return void 0 === a ? "" : a + }; + Q.prototype.setToPortIdForLinkData = Q.prototype.eA = function (a, b) { + u.j(b, "string", Q, "setToPortIdForLinkData:portname"); + if (null !== a) { + var c = this.Dq; + if ("" !== c) if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "linkToPortId", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Vs: "linkLabelKeysProperty"}, function () { + return this.Ch + }, function (a) { + var b = this.Ch; + b !== a && (Me(a, Q, "linkLabelKeysProperty"), this.Ch = a, this.h("linkLabelKeysProperty", b, a)) + }); + Q.prototype.getLabelKeysForLinkData = Q.prototype.Pj = function (a) { + if (null === a) return u.mh; + var b = this.Ch; + if ("" === b) return u.mh; + a = u.sb(a, b); + return void 0 === a ? u.mh : a + }; + Q.prototype.setLabelKeysForLinkData = Q.prototype.FE = function (a, b) { + u.Qy(b, Q, "setLabelKeysForLinkData:arr"); + if (null !== a) { + var c = this.Ch; + if ("" !== c) if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = u.mh); + if (d !== b) { + for (var e = u.qb(d), f = 0; f < e; f++) { + var h = u.fb(d, f); + Qe(this, h, a) + } + u.Oa(a, c, b); + e = u.qb(b); + for (f = 0; f < e; f++) h = u.fb(b, f), null === this.qf(h) && Pe(this, h, a); + Le(this, "linkLabelKeys", $d, c, a, d, b); + "string" === typeof c && this.Nb(a, c) + } + } else u.Oa(a, c, b) + } + }; + Q.prototype.addLabelKeyForLinkData = Q.prototype.Ly = function (a, b) { + if (null !== b && void 0 !== b && (Ne(b) || u.Kd(b, "number or string", Q, "addLabelKeyForLinkData:key"), null !== a)) { + var c = this.Ch; + if ("" !== c) { + var d = u.sb(a, c); + void 0 === d ? (c = [], c.push(b), this.FE(a, c)) : u.isArray(d) ? 0 <= u.Py(d, b) || (u.yi(d, Infinity, b), this.Ci(a) && (null === this.qf(b) && Pe(this, b, a), Le(this, "linkLabelKeys", be, c, a, null, b))) : u.k(c + " property is not an Array; cannot addLabelKeyForLinkData: " + a) + } + } + }; + Q.prototype.removeLabelKeyForLinkData = Q.prototype.mE = function (a, b) { + if (null !== b && void 0 !== b && (Ne(b) || u.Kd(b, "number or string", Q, "removeLabelKeyForLinkData:key"), null !== a)) { + var c = this.Ch; + if ("" !== c) { + var d = u.sb(a, c); + if (u.isArray(d)) { + var e = u.Py(d, b); + 0 > e || (u.zi(d, e), this.Ci(a) && (Qe(this, b, a), Le(this, "linkLabelKeys", ce, c, a, b, null))) + } else void 0 !== d && u.k(c + " property is not an Array; cannot removeLabelKeyforLinkData: " + a) + } + } + }; + u.defineProperty(Q, {Qj: "linkDataArray"}, function () { + return this.Bh + }, function (a) { + var b = this.Bh; + if (b !== a) { + u.Qy(a, Q, "linkDataArray"); + for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + if (!u.Sa(e)) { + u.k("GraphLinksModel.linkDataArray must only contain Objects, not: " + e); + return + } + u.Is(e) + } + this.Bh = a; + for (var f = new F(Object), d = 0; d < c; d++) e = u.fb(a, d), f.add(e); + this.Rl = f; + Le(this, "linkDataArray", $d, "linkDataArray", this, b, a); + for (d = 0; d < c; d++) e = u.fb(a, d), af(this, e) + } + }); + Q.prototype.containsLinkData = Q.prototype.Ci = function (a) { + return null === a ? !1 : this.Rl.contains(a) + }; + Q.prototype.addLinkData = Q.prototype.xv = function (a) { + if (null !== a) { + if (void 0 === u.Uc(a)) u.gc(a); else if (this.Ci(a)) return; + this.Rl.add(a); + var b = u.qb(this.Bh); + u.yi(this.Bh, b, a); + Le(this, "linkDataArray", be, "linkDataArray", this, null, a, null, b); + af(this, a) + } + }; + Q.prototype.addLinkDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.xv(u.fb(a, c)); else for (a = a.i; a.next();) this.xv(a.value) + }; + Q.prototype.removeLinkData = Q.prototype.Uz = function (a) { + if (null !== a) { + this.Rl.remove(a); + var b = this.Bh.indexOf(a); + if (!(0 > b)) { + u.zi(this.Bh, b); + Le(this, "linkDataArray", ce, "linkDataArray", this, a, null, b, null); + b = this.$k(a); + Qe(this, b, a); + b = this.cl(a); + Qe(this, b, a); + var c = this.Pj(a); + if (u.isArray(c)) for (var d = u.qb(c), e = 0; e < d; e++) b = u.fb(c, e), Qe(this, b, a) + } + } + }; + Q.prototype.removeLinkDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.Uz(u.fb(a, c)); else for (a = a.i; a.next();) this.Uz(a.value) + }; + + function af(a, b) { + var c = a.$k(b), c = a.Gm(c); + null === a.qf(c) && Pe(a, c, b); + c = a.cl(b); + c = a.Gm(c); + null === a.qf(c) && Pe(a, c, b); + var d = a.Pj(b); + if (u.isArray(d)) for (var e = u.qb(d), f = 0; f < e; f++) c = u.fb(d, f), null === a.qf(c) && Pe(a, c, b) + } + + u.defineProperty(Q, {eJ: "copyLinkDataFunction"}, function () { + return this.Wt + }, function (a) { + var b = this.Wt; + b !== a && (null !== a && u.j(a, "function", Q, "copyLinkDataFunction"), this.Wt = a, this.h("copyLinkDataFunction", b, a)) + }); + Q.prototype.copyLinkData = Q.prototype.eD = function (a) { + if (null === a) return null; + var b = null, b = this.Wt; + if (null !== b) b = b(a, this); else { + var b = new a.constructor, c; + for (c in a) if ("__gohashid" !== c) { + var d = u.sb(a, c); + u.Oa(b, c, d) + } + } + null !== b && (u.gc(b), "" !== this.fj && u.Oa(b, this.fj, void 0), "" !== this.ij && u.Oa(b, this.ij, void 0), "" !== this.Ch && u.Oa(b, this.Ch, [])); + return b + }; + u.defineProperty(Q, {bt: "nodeIsGroupProperty"}, function () { + return this.Ou + }, function (a) { + var b = this.Ou; + b !== a && (Me(a, Q, "nodeIsGroupProperty"), this.Ou = a, this.h("nodeIsGroupProperty", b, a)) + }); + Q.prototype.isGroupForNodeData = Q.prototype.sz = function (a) { + if (null === a) return !1; + var b = this.Ou; + return "" === b ? !1 : u.sb(a, b) ? !0 : !1 + }; + u.defineProperty(Q, {Vo: "nodeGroupKeyProperty"}, function () { + return this.pj + }, function (a) { + var b = this.pj; + b !== a && (Me(a, Q, "nodeGroupKeyProperty"), this.pj = a, this.h("nodeGroupKeyProperty", b, a)) + }); + u.defineProperty(Q, {tm: "copiesGroupKeyOfNodeData"}, function () { + return this.px + }, function (a) { + this.px !== a && (u.j(a, "boolean", Q, "copiesGroupKeyOfNodeData"), this.px = a) + }); + Q.prototype.getGroupKeyForNodeData = Q.prototype.Bm = function (a) { + if (null !== a) { + var b = this.pj; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("GroupKey value for node data " + a + " is not a number or a string: " + b) + } + } + }; + Q.prototype.setGroupKeyForNodeData = Q.prototype.Fw = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", Q, "setGroupKeyForNodeData:key"); + if (null !== a) { + var c = this.pj; + if ("" !== c) if (this.Ue(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "nodeGroupKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + Q.prototype.copyNodeData = function (a) { + if (null === a) return null; + a = J.prototype.copyNodeData.call(this, a); + this.tm || "" === this.pj || u.Oa(a, this.pj, void 0); + return a + }; + Q.prototype.setDataProperty = function (a, b, c) { + if (this.Ue(a)) if (b === this.Jm) this.bA(a, c); else { + if (b === this.Im) { + this.Dw(a, c); + return + } + if (b === this.Vo) { + this.Fw(a, c); + return + } + b === this.bt && u.k("GraphLinksModel.setDataProperty: property name must not be the nodeIsGroupProperty: " + b) + } else if (this.Ci(a)) { + if (b === this.Ko) { + this.Ew(a, c); + return + } + if (b === this.Mo) { + this.Gw(a, c); + return + } + if (b === this.Us) { + this.aA(a, c); + return + } + if (b === this.Ws) { + this.eA(a, c); + return + } + if (b === this.Ts) { + this.EE(a, c); + return + } + if (b === this.Vs) { + this.FE(a, c); + return + } + } else !Ue && + a instanceof S && (Ue = !0, u.trace('GraphLinksModel.setDataProperty is modifying a GraphObject, "' + a.toString() + '"'), u.trace(" Is that really your intent?")); + var d = u.sb(a, b); + d !== c && (u.Oa(a, b, c), this.Pz(a, b, d, c)) + }; + g = Q.prototype; + g.gt = function (a, b) { + J.prototype.gt.call(this, a, b); + for (var c = this.tc.i; c.next();) this.Xz(c.value, a, b); + for (var d = this.Rl.i; d.next();) { + var e = c.value, f = a, h = b; + if (this.$k(e) === f) { + var k = this.fj; + u.Oa(e, k, h); + Le(this, "linkFromKey", $d, k, e, f, h); + "string" === typeof k && this.Nb(e, k) + } + this.cl(e) === f && (k = this.ij, u.Oa(e, k, h), Le(this, "linkToKey", $d, k, e, f, h), "string" === typeof k && this.Nb(e, k)); + var l = this.Pj(e); + if (u.isArray(l)) for (var m = u.qb(l), k = this.Ch, n = 0; n < m; n++) u.fb(l, n) === f && (u.RC(l, n, h), Le(this, "linkLabelKeys", be, k, + e, f, h)) + } + }; + g.Xz = function (a, b, c) { + if (this.Bm(a) === b) { + var d = this.pj; + u.Oa(a, d, c); + Le(this, "nodeGroupKey", $d, d, a, b, c); + "string" === typeof d && this.Nb(a, d) + } + }; + g.mA = function () { + J.prototype.mA.call(this); + for (var a = this.Qj, b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + af(this, d) + } + }; + g.$o = function (a) { + J.prototype.$o.call(this, a); + a = this.wb(a); + var b = Oe(this, a); + if (null !== b) { + for (var c = new E(Object), b = b.i; b.next();) { + var d = b.value; + if (this.Ue(d)) { + if (this.Bm(d) === a) { + var e = this.pj; + Le(this, "nodeGroupKey", $d, e, d, a, a); + "string" === typeof e && this.Nb(d, e); + c.add(d) + } + } else { + this.$k(d) === a && (e = this.fj, Le(this, "linkFromKey", $d, e, d, a, a), "string" === typeof e && this.Nb(d, e), c.add(d)); + this.cl(d) === a && (e = this.ij, Le(this, "linkToKey", $d, e, d, a, a), "string" === typeof e && this.Nb(d, e), c.add(d)); + var f = this.Pj(d); + if (u.isArray(f)) for (var h = + u.qb(f), e = this.Ch, k = 0; k < h; k++) u.fb(f, k) === a && (Le(this, "linkLabelKeys", be, e, d, a, a), c.add(d)) + } + } + for (c = c.i; c.next();) Qe(this, a, c.value) + } + }; + g.Zo = function (a) { + J.prototype.Zo.call(this, a); + var b = this.Bm(a); + null === this.qf(b) && Pe(this, b, a) + }; + g.zt = function (a) { + J.prototype.zt.call(this, a); + var b = this.Bm(a); + Qe(this, b, a) + }; + u.defineProperty(Q, {Ts: "linkCategoryProperty"}, function () { + return this.zq + }, function (a) { + var b = this.zq; + b !== a && (Me(a, Q, "linkCategoryProperty"), this.zq = a, this.h("linkCategoryProperty", b, a)) + }); + Q.prototype.getCategoryForLinkData = Q.prototype.Zv = function (a) { + if (null === a) return ""; + var b = this.zq; + if ("" === b) return ""; + b = u.sb(a, b); + if (void 0 === b) return ""; + if ("string" === typeof b) return b; + u.k("getCategoryForLinkData found a non-string category for " + a + ": " + b); + return "" + }; + Q.prototype.setCategoryForLinkData = Q.prototype.EE = function (a, b) { + u.j(b, "string", Q, "setCategoryForLinkData:cat"); + if (null !== a) { + var c = this.zq; + if ("" === c) return ""; + if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "linkCategory", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + + function qe(a) { + 1 < arguments.length && u.k("TreeModel constructor can only take one optional argument, the Array of node data."); + J.call(this); + this.qj = "parent"; + this.qx = !1; + this.er = "parentLinkCategory"; + void 0 !== a && (this.ah = a) + } + + u.Ga(qe, J); + u.fa("TreeModel", qe); + qe.prototype.toString = function (a) { + void 0 === a && (a = 0); + if (2 <= a) return this.kA(); + var b = ("" !== this.name ? this.name : "") + " TreeModel"; + if (0 < a) { + b += "\n node data:"; + a = this.ah; + for (var c = u.qb(a), d = 0; d < c; d++) var e = u.fb(a, d), b = b + (" " + this.wb(e) + ":" + de(e)) + } + return b + }; + qe.prototype.At = function () { + var a = J.prototype.At.call(this), b = ""; + "parent" !== this.Wo && "string" === typeof this.Wo && (b += ',\n "nodeParentKeyProperty": ' + this.quote(this.Wo)); + return a + b + }; + qe.prototype.ft = function (a) { + J.prototype.ft.call(this, a); + a.nodeParentKeyProperty && (this.Wo = a.nodeParentKeyProperty) + }; + qe.prototype.Gm = function (a) { + return a + }; + u.defineProperty(qe, {Wo: "nodeParentKeyProperty"}, function () { + return this.qj + }, function (a) { + var b = this.qj; + b !== a && (Me(a, qe, "nodeParentKeyProperty"), this.qj = a, this.h("nodeParentKeyProperty", b, a)) + }); + u.defineProperty(qe, {um: "copiesParentKeyOfNodeData"}, function () { + return this.qx + }, function (a) { + this.qx !== a && (u.j(a, "boolean", qe, "copiesParentKeyOfNodeData"), this.qx = a) + }); + qe.prototype.getParentKeyForNodeData = qe.prototype.Cm = function (a) { + if (null !== a) { + var b = this.qj; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("ParentKey value for node data " + a + " is not a number or a string: " + b) + } + } + }; + qe.prototype.setParentKeyForNodeData = qe.prototype.ih = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", qe, "setParentKeyForNodeData:key"); + if (null !== a) { + var c = this.qj; + if ("" !== c) if (b = this.Gm(b), this.Ue(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "nodeParentKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(qe, {lK: "parentLinkCategoryProperty"}, function () { + return this.er + }, function (a) { + var b = this.er; + b !== a && (Me(a, qe, "parentLinkCategoryProperty"), this.er = a, this.h("parentLinkCategoryProperty", b, a)) + }); + qe.prototype.getParentLinkCategoryForNodeData = qe.prototype.HG = function (a) { + if (null === a) return ""; + var b = this.er; + if ("" === b) return ""; + b = u.sb(a, b); + if (void 0 === b) return ""; + if ("string" === typeof b) return b; + u.k("getParentLinkCategoryForNodeData found a non-string category for " + a + ": " + b); + return "" + }; + qe.prototype.setParentLinkCategoryForNodeData = qe.prototype.hI = function (a, b) { + u.j(b, "string", qe, "setParentLinkCategoryForNodeData:cat"); + if (null !== a) { + var c = this.er; + if ("" === c) return ""; + if (this.Ue(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "parentLinkCategory", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + qe.prototype.copyNodeData = function (a) { + if (null === a) return null; + a = J.prototype.copyNodeData.call(this, a); + this.um || "" === this.qj || u.Oa(a, this.qj, void 0); + return a + }; + qe.prototype.setDataProperty = function (a, b, c) { + if (this.Ue(a)) if (b === this.Jm) this.bA(a, c); else { + if (b === this.Im) { + this.Dw(a, c); + return + } + if (b === this.Wo) { + this.ih(a, c); + return + } + } else !Ue && a instanceof S && (Ue = !0, u.trace('TreeModel.setDataProperty is modifying a GraphObject, "' + a.toString() + '"'), u.trace(" Is that really your intent?")); + var d = u.sb(a, b); + d !== c && (u.Oa(a, b, c), this.Pz(a, b, d, c)) + }; + g = qe.prototype; + g.gt = function (a, b) { + J.prototype.gt.call(this, a, b); + for (var c = this.tc.i; c.next();) this.Xz(c.value, a, b) + }; + g.Xz = function (a, b, c) { + if (this.Cm(a) === b) { + var d = this.qj; + u.Oa(a, d, c); + Le(this, "nodeParentKey", $d, d, a, b, c); + "string" === typeof d && this.Nb(a, d) + } + }; + g.$o = function (a) { + J.prototype.$o.call(this, a); + a = this.wb(a); + var b = Oe(this, a); + if (null !== b) { + for (var c = new E(Object), b = b.i; b.next();) { + var d = b.value; + if (this.Ue(d) && this.Cm(d) === a) { + var e = this.qj; + Le(this, "nodeParentKey", $d, e, d, a, a); + "string" === typeof e && this.Nb(d, e); + c.add(d) + } + } + for (c = c.i; c.next();) Qe(this, a, c.value) + } + }; + g.Zo = function (a) { + J.prototype.Zo.call(this, a); + var b = this.Cm(a), b = this.Gm(b); + null === this.qf(b) && Pe(this, b, a) + }; + g.zt = function (a) { + J.prototype.zt.call(this, a); + var b = this.Cm(a); + Qe(this, b, a) + }; + + function bf(a, b, c) { + u.gc(this); + this.Ca = !1; + void 0 === a ? a = "" : u.j(a, "string", bf, "constructor:targetprop"); + void 0 === b ? b = a : u.j(b, "string", bf, "constructor:sourceprop"); + void 0 === c ? c = null : null !== c && u.j(c, "function", bf, "constructor:conv"); + this.mC = -1; + this.fg = null; + this.ov = a; + this.mv = this.Ay = 0; + this.hC = null; + this.Ey = !1; + this.fv = b; + this.mx = c; + this.ey = cf; + this.gx = null + } + + u.fa("Binding", bf); + var cf; + bf.OneWay = cf = u.s(bf, "OneWay", 1); + var df; + bf.TwoWay = df = u.s(bf, "TwoWay", 2); + bf.parseEnum = function (a, b) { + u.j(a, "function", bf, "parseEnum:ctor"); + u.rb(b, a, bf, "parseEnum:defval"); + return function (c) { + c = Da(a, c); + return null === c ? b : c + } + }; + var de; + bf.toString = de = function (a) { + var b = a; + u.Sa(a) && (a.text ? b = a.text : a.name ? b = a.name : void 0 !== a.key ? b = a.key : void 0 !== a.id ? b = a.id : a.constructor === Object && (a.Text ? b = a.Text : a.Name ? b = a.Name : void 0 !== a.Key ? b = a.Key : void 0 !== a.Id ? b = a.Id : void 0 !== a.ID && (b = a.ID))); + return void 0 === b ? "undefined" : null === b ? "null" : b.toString() + }; + bf.prototype.toString = function () { + return "Binding(" + this.Lw + ":" + this.LE + (-1 !== this.tl ? " " + this.tl : "") + " " + this.mode.name + ")" + }; + bf.prototype.freeze = function () { + this.Ca = !0; + return this + }; + bf.prototype.La = function () { + this.Ca = !1; + return this + }; + u.defineProperty(bf, {tl: null}, function () { + return this.mC + }, function (a) { + u.I(this); + u.j(a, "number", bf, "targetId"); + this.mC = a + }); + u.defineProperty(bf, {Lw: "targetProperty"}, function () { + return this.ov + }, function (a) { + u.I(this); + u.j(a, "string", bf, "targetProperty"); + this.ov = a + }); + u.defineProperty(bf, {Nm: "sourceName"}, function () { + return this.hC + }, function (a) { + u.I(this); + null !== a && u.j(a, "string", bf, "sourceName"); + this.hC = a; + null !== a && (this.Ey = !1) + }); + u.defineProperty(bf, {xt: "toModel"}, function () { + return this.Ey + }, function (a) { + u.I(this); + u.j(a, "boolean", bf, "toModel"); + this.Ey = a + }); + u.defineProperty(bf, {LE: "sourceProperty"}, function () { + return this.fv + }, function (a) { + u.I(this); + u.j(a, "string", bf, "sourceProperty"); + this.fv = a + }); + u.defineProperty(bf, {eG: "converter"}, function () { + return this.mx + }, function (a) { + u.I(this); + null !== a && u.j(a, "function", bf, "converter"); + this.mx = a + }); + u.defineProperty(bf, {SF: "backConverter"}, function () { + return this.gx + }, function (a) { + u.I(this); + null !== a && u.j(a, "function", bf, "backConverter"); + this.gx = a + }); + u.defineProperty(bf, {mode: "mode"}, function () { + return this.ey + }, function (a) { + u.I(this); + u.rb(a, bf, bf, "mode"); + this.ey = a + }); + bf.prototype.makeTwoWay = function (a) { + void 0 === a && (a = null); + null !== a && u.j(a, "function", bf, "makeTwoWay"); + this.mode = df; + this.SF = a; + return this + }; + bf.prototype.ofObject = bf.prototype.rw = function (a) { + void 0 === a && (a = ""); + this.Nm = a; + this.xt = !1; + return this + }; + bf.prototype.ofModel = function () { + this.Nm = null; + this.xt = !0; + return this + }; + bf.prototype.ofData = function () { + this.Nm = null; + this.xt = !1; + return this + }; + + function ef(a, b, c) { + a = a.Nm; + var d = null; + return d = null === a || "" === a ? b : "." === a ? c : ".." === a ? c.S : b.je(a) + } + + bf.prototype.updateTarget = bf.prototype.ZE = function (a, b, c) { + var d = this.fv; + if (void 0 === c || d === c) { + c = this.ov; + var e = this.mx; + if (null === e && "" === c) u.trace("Binding error: target property is the empty string: " + this.toString()); else { + var f = b; + "" !== d && (f = u.sb(b, d)); + if (void 0 !== f) if (null === e) "" !== c && u.Oa(a, c, f); else try { + if ("" !== c) { + var h = e(f, a); + u.Oa(a, c, h) + } else e(f, a) + } catch (k) { + } + } + } + }; + bf.prototype.updateSource = bf.prototype.Mw = function (a, b, c, d) { + void 0 === d && (d = null); + if (this.ey === df) { + var e = this.ov; + if (void 0 === c || e === c) { + c = this.fv; + var f = this.gx; + if (null !== f || "" !== c) { + var h = a; + "" !== e && (h = u.sb(a, e)); + if (void 0 !== h) if (null === f) null !== d && d.ga ? d.ga.setDataProperty(b, c, h) : u.Oa(b, c, h); else try { + if ("" !== c) { + var k = f(h, b); + null !== d && d.ga ? d.ga.setDataProperty(b, c, k) : u.Oa(b, c, k) + } else f(h, b) + } catch (l) { + } + } + } + } + }; + + function Ke() { + this.mF = (new E(Zd)).freeze(); + this.Ub = ""; + this.nB = !1 + } + + u.fa("Transaction", Ke); + Ke.prototype.toString = function (a) { + var b = "Transaction: " + this.name + " " + this.Ug.count.toString() + (this.Ms ? "" : ", incomplete"); + if (void 0 !== a && 0 < a) { + a = this.Ug.count; + for (var c = 0; c < a; c++) { + var d = this.Ug.ja(c); + null !== d && (b += "\n " + d.toString()) + } + } + return b + }; + Ke.prototype.clear = Ke.prototype.clear = function () { + var a = this.Ug; + a.La(); + for (var b = a.count - 1; 0 <= b; b--) { + var c = a.ja(b); + null !== c && c.clear() + } + a.clear(); + a.freeze() + }; + Ke.prototype.canUndo = Ke.prototype.canUndo = function () { + return this.Ms + }; + Ke.prototype.undo = Ke.prototype.undo = function () { + if (this.canUndo()) for (var a = this.Ug.count - 1; 0 <= a; a--) { + var b = this.Ug.ja(a); + null !== b && b.undo() + } + }; + Ke.prototype.canRedo = Ke.prototype.canRedo = function () { + return this.Ms + }; + Ke.prototype.redo = Ke.prototype.redo = function () { + if (this.canRedo()) for (var a = this.Ug.count, b = 0; b < a; b++) { + var c = this.Ug.ja(b); + null !== c && c.redo() + } + }; + u.u(Ke, {Ug: "changes"}, function () { + return this.mF + }); + u.defineProperty(Ke, {name: "name"}, function () { + return this.Ub + }, function (a) { + this.Ub = a + }); + u.defineProperty(Ke, {Ms: "isComplete"}, function () { + return this.nB + }, function (a) { + this.nB = a + }); + + function ee() { + this.hy = new F(J); + this.Ne = !1; + this.tF = (new E(Ke)).freeze(); + this.Ig = -1; + this.CB = 999; + this.fi = !1; + this.bu = null; + this.Jk = 0; + this.GA = !1; + this.Og = (new E("string")).freeze(); + this.Qn = new E("number"); + this.Kx = !0; + this.Yx = !1 + } + + u.fa("UndoManager", ee); + ee.prototype.toString = function (a) { + for (var b = "UndoManager " + this.Ii + "<" + this.history.count + "<=" + this.VD, b = b + "[", c = this.bE.count, d = 0; d < c; d++) 0 < d && (b += " "), b += this.bE.ja(d); + b += "]"; + if (void 0 !== a && 0 < a) for (c = this.history.count, d = 0; d < c; d++) b += "\n " + this.history.ja(d).toString(a - 1); + return b + }; + ee.prototype.clear = ee.prototype.clear = function () { + var a = this.history; + a.La(); + for (var b = a.count - 1; 0 <= b; b--) { + var c = a.ja(b); + null !== c && c.clear() + } + a.clear(); + this.Ig = -1; + a.freeze(); + this.fi = !1; + this.bu = null; + this.Jk = 0; + this.Og.La(); + this.Og.clear(); + this.Og.freeze(); + this.Qn.clear() + }; + ee.prototype.addModel = ee.prototype.MF = function (a) { + this.hy.add(a) + }; + ee.prototype.removeModel = ee.prototype.SH = function (a) { + this.hy.remove(a) + }; + ee.prototype.startTransaction = ee.prototype.Wb = function (a) { + void 0 === a && (a = ""); + null === a && (a = ""); + if (this.gb) return !1; + !0 === this.Kx && (this.Kx = !1, this.Jk++, this.Rc("StartingFirstTransaction", a, this.Di), 0 < this.Jk && this.Jk--); + this.isEnabled && (this.Og.La(), this.Og.add(a), this.Og.freeze(), null === this.Di ? this.Qn.add(0) : this.Qn.add(this.Di.Ug.count)); + this.Jk++; + var b = 1 === this.Le; + b && this.Rc("StartedTransaction", a, this.Di); + return b + }; + ee.prototype.commitTransaction = ee.prototype.Wd = function (a) { + void 0 === a && (a = ""); + return ff(this, !0, a) + }; + ee.prototype.rollbackTransaction = ee.prototype.ap = function () { + return ff(this, !1, "") + }; + + function ff(a, b, c) { + if (a.gb) return !1; + a.Ry && 1 > a.Le && u.trace("Ending transaction without having started a transaction: " + c); + var d = 1 === a.Le; + d && b && a.isEnabled && a.Rc("CommittingTransaction", c, a.Di); + var e = 0; + if (0 < a.Le && (a.Jk--, a.isEnabled)) { + var f = a.Og.count; + 0 < f && ("" === c && (c = a.Og.ja(0)), a.Og.La(), a.Og.hd(f - 1), a.Og.freeze()); + f = a.Qn.count; + 0 < f && (e = a.Qn.ja(f - 1), a.Qn.hd(f - 1)) + } + f = a.Di; + if (d) { + if (b) { + a.Yx = !1; + if (a.isEnabled && null !== f) { + b = f; + b.Ms = !0; + b.name = c; + d = a.history; + d.La(); + for (e = d.count - 1; e > a.Ii; e--) f = d.ja(e), null !== + f && f.clear(), d.hd(e), a.Yx = !0; + e = a.VD; + 0 === e && (e = 1); + 0 < e && d.count >= e && (f = d.ja(0), null !== f && f.clear(), d.hd(0), a.Ig--); + d.add(b); + a.Ig++; + d.freeze(); + f = b + } + a.Rc("CommittedTransaction", c, f) + } else { + a.fi = !0; + try { + a.isEnabled && null !== f && (f.Ms = !0, f.undo()) + } finally { + a.Rc("RolledBackTransaction", c, f), a.fi = !1 + } + null !== f && f.clear() + } + a.bu = null; + return !0 + } + if (a.isEnabled && !b && null !== f) { + a = e; + c = f.Ug; + for (b = c.count - 1; b >= a; b--) d = c.ja(b), null !== d && d.undo(), c.La(), c.hd(b); + c.freeze() + } + return !1 + } + + ee.prototype.canUndo = ee.prototype.canUndo = function () { + if (!this.isEnabled || 0 < this.Le || this.gb) return !1; + var a = this.UE; + return null !== a && a.canUndo() ? !0 : !1 + }; + ee.prototype.undo = ee.prototype.undo = function () { + if (this.canUndo()) { + var a = this.UE; + try { + this.Rc("StartingUndo", "Undo", a), this.fi = !0, this.Ig--, a.undo() + } catch (b) { + u.trace("undo error: " + b.toString()) + } finally { + this.fi = !1, this.Rc("FinishedUndo", "Undo", a) + } + } + }; + ee.prototype.canRedo = ee.prototype.canRedo = function () { + if (!this.isEnabled || 0 < this.Le || this.gb) return !1; + var a = this.TE; + return null !== a && a.canRedo() ? !0 : !1 + }; + ee.prototype.redo = ee.prototype.redo = function () { + if (this.canRedo()) { + var a = this.TE; + try { + this.Rc("StartingRedo", "Redo", a), this.fi = !0, this.Ig++, a.redo() + } catch (b) { + u.trace("redo error: " + b.toString()) + } finally { + this.fi = !1, this.Rc("FinishedRedo", "Redo", a) + } + } + }; + ee.prototype.Rc = function (a, b, c) { + void 0 === c && (c = null); + var d = new Zd; + d.Ad = ae; + d.propertyName = a; + d.object = c; + d.oldValue = b; + for (a = this.BH; a.next();) b = a.value, d.ga = b, b.Jv(d) + }; + ee.prototype.handleChanged = ee.prototype.ED = function (a) { + if (this.isEnabled && !this.gb && !this.skipsEvent(a)) { + var b = this.Di; + null === b && (this.bu = b = new Ke); + var c = a.copy(), b = b.Ug; + b.La(); + b.add(c); + b.freeze(); + this.Ry && 0 >= this.Le && !this.Kx && (a = a.g, null !== a && !1 === a.lf || u.trace("Change not within a transaction: " + c.toString())) + } + }; + ee.prototype.skipsEvent = function (a) { + if (null === a || 0 > a.Ad.value) return !0; + a = a.object; + if (a instanceof S) { + if (a = a.layer, null !== a && a.Ac) return !0 + } else if (a instanceof we && a.Ac) return !0; + return !1 + }; + u.u(ee, {BH: "models"}, function () { + return this.hy.i + }); + u.defineProperty(ee, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + this.Ne = a + }); + u.u(ee, {UE: "transactionToUndo"}, function () { + return 0 <= this.Ii && this.Ii <= this.history.count - 1 ? this.history.ja(this.Ii) : null + }); + u.u(ee, {TE: "transactionToRedo"}, function () { + return this.Ii < this.history.count - 1 ? this.history.ja(this.Ii + 1) : null + }); + u.u(ee, {gb: "isUndoingRedoing"}, function () { + return this.fi + }); + u.u(ee, {history: "history"}, function () { + return this.tF + }); + u.defineProperty(ee, {VD: "maxHistoryLength"}, function () { + return this.CB + }, function (a) { + this.CB = a + }); + u.u(ee, {Ii: "historyIndex"}, function () { + return this.Ig + }); + u.u(ee, {Di: "currentTransaction"}, function () { + return this.bu + }); + u.u(ee, {Le: "transactionLevel"}, function () { + return this.Jk + }); + u.u(ee, {ND: "isInTransaction"}, function () { + return 0 < this.Jk + }); + u.defineProperty(ee, {Ry: "checksTransactionLevel"}, function () { + return this.GA + }, function (a) { + this.GA = a + }); + u.u(ee, {bE: "nestedTransactionNames"}, function () { + return this.Og + }); + + function sa() { + 0 < arguments.length && u.Wc(sa); + u.gc(this); + this.Y = null; + this.JA = !0; + this.LA = this.MA = this.XA = this.NA = !1; + this.Ak = this.ax = null; + this.EC = 1.05; + this.VA = 1; + this.Zx = NaN; + this.zB = null; + this.FC = NaN + } + + u.fa("CommandHandler", sa); + var gf = null, hf = ""; + sa.prototype.toString = function () { + return "CommandHandler" + }; + u.u(sa, {g: "diagram"}, function () { + return this.Y + }); + sa.prototype.Ec = function (a) { + this.Y = a + }; + sa.prototype.doKeyDown = function () { + var a = this.g; + if (null !== a) { + var b = a.N, c = u.Em ? b.Ys : b.control, d = b.shift, e = b.alt, f = b.key; + !c || "C" !== f && "Insert" !== f ? c && "X" === f || d && "Del" === f ? this.canCutSelection() && this.cutSelection() : c && "V" === f || d && "Insert" === f ? this.canPasteSelection() && this.pasteSelection() : c && "Y" === f || e && d && "Backspace" === f ? this.canRedo() && this.redo() : c && "Z" === f || e && "Backspace" === f ? this.canUndo() && this.undo() : "Del" === f || "Backspace" === f ? this.canDeleteSelection() && this.deleteSelection() : c && "A" === f ? this.canSelectAll() && + this.selectAll() : "Esc" === f ? this.canStopCommand() && this.stopCommand() : "Up" === f ? a.Se && (c ? a.scroll("pixel", "up") : a.scroll("line", "up")) : "Down" === f ? a.Se && (c ? a.scroll("pixel", "down") : a.scroll("line", "down")) : "Left" === f ? a.Re && (c ? a.scroll("pixel", "left") : a.scroll("line", "left")) : "Right" === f ? a.Re && (c ? a.scroll("pixel", "right") : a.scroll("line", "right")) : "PageUp" === f ? d && a.Re ? a.scroll("page", "left") : a.Se && a.scroll("page", "up") : "PageDown" === f ? d && a.Re ? a.scroll("page", "right") : a.Se && a.scroll("page", "down") : "Home" === + f ? (b = a.Cd, c && a.Se ? a.position = new w(a.position.x, b.y) : !c && a.Re && (a.position = new w(b.x, a.position.y))) : "End" === f ? (b = a.Cd, d = a.ob, c && a.Se ? a.position = new w(d.x, b.bottom - d.height) : !c && a.Re && (a.position = new w(b.right - d.width, d.y))) : "Subtract" === f ? this.canDecreaseZoom() && this.decreaseZoom() : "Add" === f ? this.canIncreaseZoom() && this.increaseZoom() : c && "0" === f ? this.canResetZoom() && this.resetZoom() : d && "Z" === f ? this.canZoomToFit() && this.zoomToFit() : c && !d && "G" === f ? this.canGroupSelection() && this.groupSelection() : c && + d && "G" === f ? this.canUngroupSelection() && this.ungroupSelection() : b.event && 113 === b.event.which ? this.canEditTextBlock() && this.editTextBlock() : b.event && 93 === b.event.which ? this.canShowContextMenu() && this.showContextMenu() : b.bubbles = !0 : this.canCopySelection() && this.copySelection() + } + }; + sa.prototype.doKeyUp = function () { + var a = this.g; + null !== a && (a.N.bubbles = !0) + }; + sa.prototype.stopCommand = function () { + var a = this.g; + if (null !== a) { + var b = a.Va; + b instanceof jf && a.of && a.Lv(); + null !== b && b.doCancel() + } + }; + sa.prototype.canStopCommand = function () { + return !0 + }; + sa.prototype.selectAll = function () { + var a = this.g; + if (null !== a) { + a.ma(); + try { + a.ac = "wait"; + a.za("ChangingSelection"); + for (var b = a.Sj; b.next();) b.value.Za = !0; + for (var c = a.yg; c.next();) c.value.Za = !0; + for (var d = a.links; d.next();) d.value.Za = !0 + } finally { + a.za("ChangedSelection"), a.ac = "" + } + } + }; + sa.prototype.canSelectAll = function () { + var a = this.g; + return null !== a && a.of + }; + sa.prototype.deleteSelection = function () { + var a = this.g; + if (null !== a && !a.za("SelectionDeleting", a.selection)) try { + a.ac = "wait"; + a.Wb("Delete"); + a.za("ChangingSelection"); + for (var b = new F(G), c = a.selection.i; c.next();) kf(b, c.value, !0, this.qG ? Infinity : 0, !0, function (a) { + return a.canDelete() + }); + a.Wz(b, !0); + a.za("SelectionDeleted", b) + } finally { + a.za("ChangedSelection"), a.Wd("Delete"), a.ac = "" + } + }; + sa.prototype.canDeleteSelection = function () { + var a = this.g; + return null === a || a.nb || a.uf || !a.lm || 0 === a.selection.count ? !1 : !0 + }; + + function kf(a, b, c, d, e, f) { + void 0 === f && (f = null); + if (!(a.contains(b) || null !== f && !f(b) || b instanceof lf)) if (a.add(b), b instanceof U) { + if (c && b instanceof V) for (var h = b.Mc; h.next();) kf(a, h.value, c, d, e, f); + if (e) for (h = b.oe; h.next();) { + var k = h.value; + if (!a.contains(k)) { + var l = k.W, m = k.ca; + null !== l && a.contains(l) && null !== m && a.contains(m) ? kf(a, k, c, d, e, f) : null !== l && null !== m || kf(a, k, c, d, e, f) + } + } + if (1 < d) for (b = b.tD(); b.next();) kf(a, b.value, c, d - 1, e, f) + } else if (b instanceof W) for (h = b.ug; h.next();) kf(a, h.value, c, d, e, f) + } + + sa.prototype.to = function (a, b, c) { + var d = new la(G, G); + for (a = a.i; a.next();) mf(this, a.value, b, d, c); + if (null !== b) { + c = b.ga; + a = !1; + null !== b.tb.Ed && (a = b.tb.Ed.Gi); + for (var e = new F(W), f = new la(W, W), h = d.i; h.next();) { + var k = h.value; + if (k instanceof W) { + var l = k; + a || null !== l.W && null !== l.ca || e.add(l) + } else if (c instanceof qe && k instanceof U && null !== k.data) { + var l = c, m = k, k = h.key, n = k.zm(); + null !== n && (n = d.ta(n), null !== n ? (l.ih(m.data, l.wb(n.data)), l = b.ng(m.data), k = k.As(), null !== k && null !== l && f.add(k, l)) : l.ih(m.data, void 0)) + } + } + 0 < e.count && + b.Wz(e, !1); + if (0 < f.count) for (b = f.i; b.next();) d.add(b.key, b.value) + } + for (b = d.i; b.next();) b.value.Nb(); + return d + }; + + function mf(a, b, c, d, e) { + if (null === b || e && !b.canCopy()) return null; + if (d.contains(b)) return d.ta(b); + var f = null, h = b.data; + if (null !== h && null !== c) { + var k = c.ga; + b instanceof W ? k instanceof Q && (h = k.eD(h), u.Sa(h) && (k.xv(h), f = c.ng(h))) : (h = k.copyNodeData(h), u.Sa(h) && (k.km(h), f = c.Nh(h))) + } else nf(b), f = b.copy(), null !== c && null !== f && c.add(f); + if (!(f instanceof G)) return null; + f.Za = !1; + f.Wg = !1; + d.add(b, f); + if (b instanceof U) { + for (k = b.oe; k.next();) { + h = k.value; + if (h.W === b) { + var l = d.ta(h); + null !== l && (l.W = f) + } + h.ca === b && (l = d.ta(h), null !== + l && (l.ca = f)) + } + if (b instanceof V && f instanceof V) for (k = f, b = b.Mc; b.next();) h = mf(a, b.value, c, d, e), h instanceof W || null === h || (h.Ra = k) + } else if (b instanceof W) for (k = b.W, null !== k && (k = d.ta(k), null !== k && (f.W = k)), k = b.ca, null !== k && (k = d.ta(k), null !== k && (f.ca = k)), b = b.ug; b.next();) k = mf(a, b.value, c, d, e), null !== k && (k.ce = f); + return f + } + + sa.prototype.copySelection = function () { + var a = this.g; + if (null !== a) { + for (var b = new F(G), a = a.selection.i; a.next();) kf(b, a.value, !0, this.hG ? Infinity : 0, this.fG, function (a) { + return a.canCopy() + }); + this.copyToClipboard(b) + } + }; + sa.prototype.canCopySelection = function () { + var a = this.g; + return null !== a && a.Ij && a.My && 0 !== a.selection.count ? !0 : !1 + }; + sa.prototype.cutSelection = function () { + this.copySelection(); + this.deleteSelection() + }; + sa.prototype.canCutSelection = function () { + var a = this.g; + return null !== a && !a.nb && !a.uf && a.Ij && a.lm && a.My && 0 !== a.selection.count ? !0 : !1 + }; + sa.prototype.copyToClipboard = function (a) { + var b = this.g; + if (null !== b) { + var c = null; + if (null === a) gf = null, hf = ""; else { + var c = b.ga, d = !1, e = !1, f = null; + try { + if (c instanceof qe) { + var h = c, d = h.um; + h.um = this.dD + } + c instanceof Q && (h = c, e = h.tm, h.tm = this.cD); + f = b.to(a, null, !0) + } finally { + c instanceof qe && (c.um = d), c instanceof Q && (c.tm = e), c = new E(G), c.Td(f), gf = c, hf = b.ga.Sk + } + } + b.za("ClipboardChanged", c) + } + }; + sa.prototype.pasteFromClipboard = function () { + var a = new F(G), b = gf; + if (null === b) return a; + var c = this.g; + if (null === c || hf !== c.ga.Sk) return a; + var d = c.ga, e = !1, f = !1, h = null; + try { + if (d instanceof qe) { + var k = d, e = k.um; + k.um = this.dD + } + d instanceof Q && (k = d, f = k.tm, k.tm = this.cD); + h = c.to(b, c, !1) + } finally { + for (d instanceof qe && (d.um = e), d instanceof Q && (d.tm = f), b = h.i; b.next();) c = b.value, d = b.key, c.location.J() || (d.location.J() ? c.location = d.location : !c.position.J() && d.position.J() && (c.position = d.position)), a.add(c) + } + return a + }; + sa.prototype.pasteSelection = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null !== b) try { + b.ac = "wait"; + b.Wb("Paste"); + b.za("ChangingSelection"); + var c = this.pasteFromClipboard(); + 0 < c.count && of(b); + for (var d = c.i; d.next();) d.value.Za = !0; + b.za("ChangedSelection"); + if (null !== a) { + var e = b.computePartsBounds(b.selection); + if (e) { + var f = b.tb.Ed; + null === f && (f = new uf, f.Ec(b)); + var h = f.computeEffectiveCollection(b.selection); + f.moveParts(h, new w(a.x - e.Ja, a.y - e.Ua), !1) + } + } + b.za("ClipboardPasted", c) + } finally { + b.Wd("Paste"), b.ac = + "" + } + }; + sa.prototype.canPasteSelection = function () { + var a = this.g; + return null === a || a.nb || a.uf || !a.lo || !a.My || null === gf || hf !== a.ga.Sk ? !1 : !0 + }; + sa.prototype.undo = function () { + var a = this.g; + null !== a && a.ha.undo() + }; + sa.prototype.canUndo = function () { + var a = this.g; + return null === a || a.nb || a.uf ? !1 : a.NC && a.ha.canUndo() + }; + sa.prototype.redo = function () { + var a = this.g; + null !== a && a.ha.redo() + }; + sa.prototype.canRedo = function () { + var a = this.g; + return null === a || a.nb || a.uf ? !1 : a.NC && a.ha.canRedo() + }; + sa.prototype.decreaseZoom = function (a) { + void 0 === a && (a = 1 / this.Ow); + u.ze(a, sa, "decreaseZoom:factor"); + var b = this.g; + null !== b && b.no === vf && (a *= b.scale, a < b.Yg || a > b.Xg || (b.scale = a)) + }; + sa.prototype.canDecreaseZoom = function (a) { + void 0 === a && (a = 1 / this.Ow); + u.ze(a, sa, "canDecreaseZoom:factor"); + var b = this.g; + if (null === b || b.no !== vf) return !1; + a *= b.scale; + return a < b.Yg || a > b.Xg ? !1 : b.Gv + }; + sa.prototype.increaseZoom = function (a) { + void 0 === a && (a = this.Ow); + u.ze(a, sa, "increaseZoom:factor"); + var b = this.g; + null !== b && b.no === vf && (a *= b.scale, a < b.Yg || a > b.Xg || (b.scale = a)) + }; + sa.prototype.canIncreaseZoom = function (a) { + void 0 === a && (a = this.Ow); + u.ze(a, sa, "canIncreaseZoom:factor"); + var b = this.g; + if (null === b || b.no !== vf) return !1; + a *= b.scale; + return a < b.Yg || a > b.Xg ? !1 : b.Gv + }; + sa.prototype.resetZoom = function (a) { + void 0 === a && (a = this.Pv); + u.ze(a, sa, "resetZoom:newscale"); + var b = this.g; + null === b || a < b.Yg || a > b.Xg || (b.scale = a) + }; + sa.prototype.canResetZoom = function (a) { + void 0 === a && (a = this.Pv); + u.ze(a, sa, "canResetZoom:newscale"); + var b = this.g; + return null === b || a < b.Yg || a > b.Xg ? !1 : b.Gv + }; + sa.prototype.zoomToFit = function () { + var a = this.g; + if (null !== a) { + var b = a.scale, c = a.position; + b !== this.FC || isNaN(this.Zx) ? (this.Zx = b, this.zB = c.copy(), a.zoomToFit(), a.bf(), this.FC = a.scale) : (a.scale = this.Zx, a.position = this.zB) + } + }; + sa.prototype.canZoomToFit = function () { + var a = this.g; + return null === a ? !1 : a.Gv + }; + sa.prototype.collapseTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Collapse Tree"); + var c = new E(U); + if (null !== a && a.Vc) a.collapseTree(), c.add(a); else for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof U && (a = e, a.Vc && (a.collapseTree(), c.add(a))) + } + b.za("TreeCollapsed", c) + } finally { + b.Wd("Collapse Tree") + } + }; + sa.prototype.canCollapseTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) { + if (!a.Vc) return !1; + if (0 < a.Yv().count) return !0 + } else for (a = b.selection.i; a.next();) if (b = a.value, b instanceof U && b.Vc && 0 < b.Yv().count) return !0; + return !1 + }; + sa.prototype.expandTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Expand Tree"); + var c = new E(U); + if (null === a || a.Vc) for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof U && (a = e, a.Vc || (a.expandTree(), c.add(a))) + } else a.expandTree(), c.add(a); + b.za("TreeExpanded", c) + } finally { + b.Wd("Expand Tree") + } + }; + sa.prototype.canExpandTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) { + if (a.Vc) return !1; + if (0 < a.Yv().count) return !0 + } else for (a = b.selection.i; a.next();) if (b = a.value, b instanceof U && !b.Vc && 0 < b.Yv().count) return !0; + return !1 + }; + sa.prototype.groupSelection = function () { + var a = this.g; + if (null !== a) { + var b = a.ga; + if (b instanceof Q) { + var c = this.OC; + if (null !== c) { + var d = null; + try { + a.ac = "wait"; + a.Wb("Group"); + a.za("ChangingSelection"); + for (var e = new E(G), f = a.selection.i; f.next();) { + var h = f.value; + h.Fd() && h.canGroup() && e.add(h) + } + for (var k = new E(G), l = e.i; l.next();) { + for (var m = l.value, f = !1, n = e.i; n.next();) if (m.Ph(n.value)) { + f = !0; + break + } + f || k.add(m) + } + if (0 < k.count) { + var p = k.first().Ra; + if (null !== p) for (; null !== p;) { + for (var e = !1, q = k.i; q.next();) if (!q.value.Ph(p)) { + e = + !0; + break + } + if (e) p = p.Ra; else break + } + if (c instanceof V) nf(c), d = c.copy(), null !== d && a.add(d); else if (b.sz(c)) { + var r = b.copyNodeData(c); + u.Sa(r) && (b.km(r), d = a.Xv(r)) + } + if (null !== d) { + null !== p && this.isValidMember(p, d) && (d.Ra = p); + for (var s = k.i; s.next();) { + var t = s.value; + this.isValidMember(d, t) && (t.Ra = d) + } + a.select(d) + } + } + a.za("ChangedSelection"); + a.za("SelectionGrouped", d) + } finally { + a.Wd("Group"), a.ac = "" + } + } + } + } + }; + sa.prototype.canGroupSelection = function () { + var a = this.g; + if (null === a || a.nb || a.uf || !a.lo || !a.Bv || !(a.ga instanceof Q) || null === this.OC) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canGroup()) return !0 + } + return !1 + }; + + function wf(a) { + var b = u.eb(); + for (a = a.i; a.next();) { + var c = a.value; + c instanceof W || b.push(c) + } + a = new F(G); + for (var c = b.length, d = 0; d < c; d++) { + for (var e = b[d], f = !0, h = 0; h < c; h++) if (e.Ph(b[h])) { + f = !1; + break + } + f && a.add(e) + } + u.ra(b); + return a + } + + sa.prototype.isValidMember = function (a, b) { + if (null === b || a === b || b instanceof W) return !1; + if (null !== a) { + if (a === b || a.Ph(b)) return !1; + var c = a.Bz; + if (null !== c && !c(a, b) || null === a.data && null !== b.data || null !== a.data && null === b.data) return !1 + } + c = this.Bz; + return null !== c ? c(a, b) : !0 + }; + sa.prototype.ungroupSelection = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof Q) try { + b.ac = "wait"; + b.Wb("Ungroup"); + b.za("ChangingSelection"); + var d = new E(V); + if (null !== a) d.add(a); else for (var e = b.selection.i; e.next();) { + var f = e.value; + f instanceof V && (a = f, a.canUngroup() && d.add(a)) + } + if (0 < d.count) { + b.Lv(); + for (var h = d.i; h.next();) { + var k = h.value; + k.expandSubGraph(); + var l = k.Ra, m = null !== l && null !== l.data ? c.wb(l.data) : void 0, n = new E(G); + n.Td(k.Mc); + for (var p = n.i; p.next();) { + var q = + p.value; + q.Za = !0; + if (!(q instanceof W)) { + var r = q.data; + null !== r ? c.Fw(r, m) : q.Ra = l + } + } + b.remove(k) + } + } + b.za("ChangedSelection"); + b.za("SelectionUngrouped", d, n) + } finally { + b.Wd("Ungroup"), b.ac = "" + } + } + }; + sa.prototype.canUngroupSelection = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb || b.uf || !b.lm || !b.Fv || !(b.ga instanceof Q)) return !1; + if (null !== a) { + if (a.canUngroup()) return !0 + } else for (a = b.selection.i; a.next();) if (b = a.value, b instanceof V && b.canUngroup()) return !0; + return !1 + }; + sa.prototype.addTopLevelParts = function (a, b) { + for (var c = !0, d = wf(a).i; d.next();) { + var e = d.value; + null !== e.Ra && (!b || this.isValidMember(null, e) ? e.Ra = null : c = !1) + } + return c + }; + sa.prototype.collapseSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Collapse SubGraph"); + var c = new E(V); + if (null !== a && a.be) a.collapseSubGraph(), c.add(a); else for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof V && (a = e, a.be && (a.collapseSubGraph(), c.add(a))) + } + b.za("SubGraphCollapsed", c) + } finally { + b.Wd("Collapse SubGraph") + } + }; + sa.prototype.canCollapseSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) return a.be ? !0 : !1; + for (a = b.selection.i; a.next();) if (b = a.value, b instanceof V && b.be) return !0; + return !1 + }; + sa.prototype.expandSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Expand SubGraph"); + var c = new E(V); + if (null === a || a.be) for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof V && (a = e, a.be || (a.expandSubGraph(), c.add(a))) + } else a.expandSubGraph(), c.add(a); + b.za("SubGraphExpanded", c) + } finally { + b.Wd("Expand SubGraph") + } + }; + sa.prototype.canExpandSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) return a.be ? !1 : !0; + for (a = b.selection.i; a.next();) if (b = a.value, b instanceof V && !b.be) return !0; + return !1 + }; + sa.prototype.editTextBlock = function (a) { + void 0 === a && (a = null); + null !== a && u.C(a, qa, sa, "editTextBlock"); + var b = this.g; + if (null !== b) { + var c = b.tb.iA; + if (null !== c) { + if (null === a) { + a = null; + for (var d = b.selection.i; d.next();) { + var e = d.value; + if (e.canEdit()) { + a = e; + break + } + } + if (null === a) return; + a = a.vs(function (a) { + return a instanceof qa && a.bz + }) + } + null !== a && (b.Va = null, c.kh = a, b.Va = c) + } + } + }; + sa.prototype.canEditTextBlock = function (a) { + void 0 === a && (a = null); + null !== a && u.C(a, qa, sa, "canEditTextBlock"); + var b = this.g; + if (null === b || b.nb || b.uf || !b.Ev || null === b.tb.iA) return !1; + if (null !== a) { + if (a = a.T, null !== a && a.canEdit()) return !0 + } else for (b = b.selection.i; b.next();) if (a = b.value, a.canEdit() && (a = a.vs(function (a) { + return a instanceof qa && a.bz + }), null !== a)) return !0; + return !1 + }; + sa.prototype.showContextMenu = function (a) { + var b = this.g; + if (null !== b) { + var c = b.tb.Vy; + if (null !== c && (void 0 === a && (a = 0 < b.selection.count ? b.selection.first() : b), a = c.findObjectWithContextMenu(a), null !== a)) { + var d = new Md, e = null; + a instanceof S ? e = a.lb(Ib) : b.fH || (e = b.ob, e = new w(e.x + e.width / 2, e.y + e.height / 2)); + null !== e && (d.ff = b.VE(e), d.da = e, b.N = d); + b.Va = c; + xf(c, !1, a) + } + } + }; + sa.prototype.canShowContextMenu = function (a) { + var b = this.g; + if (null === b) return !1; + var c = b.tb.Vy; + if (null === c) return !1; + void 0 === a && (a = 0 < b.selection.count ? b.selection.first() : b); + return null === c.findObjectWithContextMenu(a) ? !1 : !0 + }; + u.defineProperty(sa, {fG: "copiesConnectedLinks"}, function () { + return this.JA + }, function (a) { + u.j(a, "boolean", sa, "copiesConnectedLinks"); + this.JA = a + }); + u.defineProperty(sa, {hG: "copiesTree"}, function () { + return this.NA + }, function (a) { + u.j(a, "boolean", sa, "copiesTree"); + this.NA = a + }); + u.defineProperty(sa, {qG: "deletesTree"}, function () { + return this.XA + }, function (a) { + u.j(a, "boolean", sa, "deletesTree"); + this.XA = a + }); + u.defineProperty(sa, {dD: "copiesParentKey"}, function () { + return this.MA + }, function (a) { + u.j(a, "boolean", sa, "copiesParentKey"); + this.MA = a + }); + u.defineProperty(sa, {cD: "copiesGroupKey"}, function () { + return this.LA + }, function (a) { + u.j(a, "boolean", sa, "copiesGroupKey"); + this.LA = a + }); + u.defineProperty(sa, {OC: "archetypeGroupData"}, function () { + return this.ax + }, function (a) { + null !== a && u.C(a, Object, sa, "archetypeGroupData"); + var b = this.g; + null !== b && (b = b.ga, b instanceof Q && (a instanceof V || b.sz(a) || u.k("CommandHandler.archetypeGroupData must be either a Group or a data object for which GraphLinksModel.isGroupForNodeData is true: " + a))); + this.ax = a + }); + u.defineProperty(sa, {Bz: "memberValidation"}, function () { + return this.Ak + }, function (a) { + null !== a && u.j(a, "function", sa, "memberValidation"); + this.Ak = a + }); + u.defineProperty(sa, {Pv: "defaultScale"}, function () { + return this.VA + }, function (a) { + u.ze(a, sa, "defaultScale"); + 0 < a || u.k("defaultScale must be larger than zero, not: " + a); + this.VA = a + }); + u.defineProperty(sa, {Ow: "zoomFactor"}, function () { + return this.EC + }, function (a) { + u.ze(a, sa, "zoomFactor"); + 1 < a || u.k("zoomFactor must be larger than 1.0, not: " + a); + this.EC = a + }); + + function xe() { + 0 < arguments.length && u.Wc(xe); + u.gc(this); + this.Y = null; + this.Ub = ""; + this.Ne = !0; + this.lB = !1; + this.AC = null; + this.vv = -1 + } + + u.fa("Tool", xe); + xe.prototype.Ec = function (a) { + this.Y = a + }; + xe.prototype.toString = function () { + return "" !== this.name ? this.name + " Tool" : u.rg(Object.getPrototypeOf(this)) + }; + xe.prototype.updateAdornments = function () { + }; + xe.prototype.canStart = function () { + return this.isEnabled + }; + xe.prototype.doStart = function () { + }; + xe.prototype.doActivate = function () { + this.na = !0 + }; + xe.prototype.doDeactivate = function () { + this.na = !1 + }; + xe.prototype.doStop = function () { + }; + xe.prototype.doCancel = function () { + this.stopTool() + }; + xe.prototype.stopTool = function () { + var a = this.g; + null !== a && a.Va === this && (a.Va = null, a.ac = "") + }; + xe.prototype.doMouseDown = function () { + !this.na && this.canStart() && this.doActivate() + }; + xe.prototype.doMouseMove = function () { + }; + xe.prototype.doMouseUp = function () { + this.stopTool() + }; + xe.prototype.doMouseWheel = function () { + }; + xe.prototype.canStartMultiTouch = function () { + return !0 + }; + xe.prototype.standardPinchZoomStart = function () { + var a = this.g; + if (null !== a) { + var b = a.N.event, c = null, d = null; + if (void 0 !== b.targetTouches) { + if (2 > b.targetTouches.length) return; + c = b.targetTouches[0]; + d = b.targetTouches[1] + } else if (null !== a.Df[0]) c = a.Df[0], d = a.Df[1]; else return; + this.doCancel(); + if (a.yn) { + a.Lx = !0; + a.MB = a.scale; + var e = a.Ab, f = a.zb, h = a.ib.getBoundingClientRect(), k = c.clientX - e / h.width * h.left, + l = c.clientY - f / h.height * h.top, c = d, d = c.clientX - e / h.width * h.left - k, + f = c.clientY - f / h.height * h.top - l, f = Math.sqrt(d * d + f * + f); + a.iC = f; + b.preventDefault(); + b.cancelBubble = !0 + } else yf(a) + } + }; + xe.prototype.standardPinchZoomMove = function () { + var a = this.g; + if (null !== a) { + var b = a.N.event; + this.doCancel(); + yf(a); + var c = null, d = null; + if (void 0 !== b.targetTouches) { + if (2 > b.targetTouches.length) return; + c = b.targetTouches[0]; + d = b.targetTouches[1] + } else if (null !== a.Df[0]) c = a.Df[0], d = a.Df[1]; else return; + if (a.yn && a.Lx) { + var e = a.Ab, f = a.zb, h = a.ib.getBoundingClientRect(), k = c, c = k.clientX - e / h.width * h.left, + l = k.clientY - f / h.height * h.top, k = d, d = k.clientX - e / h.width * h.left, + f = k.clientY - f / h.height * h.top, h = d - c, e = f - l, h = Math.sqrt(h * + h + e * e) / a.iC, + c = new w((Math.min(d, c) + Math.max(d, c)) / 2, (Math.min(f, l) + Math.max(f, l)) / 2), + l = a.MB * h, d = a.Eb; + l !== a.scale && d.canResetZoom(l) && (f = a.Rm, a.Rm = c, d.resetZoom(l), a.Rm = f); + b.preventDefault(); + b.cancelBubble = !0 + } + } + }; + xe.prototype.doKeyDown = function () { + var a = this.g; + null !== a && "Esc" === a.N.key && this.doCancel() + }; + xe.prototype.doKeyUp = function () { + }; + xe.prototype.startTransaction = xe.prototype.Wb = function (a) { + void 0 === a && (a = this.name); + this.zf = null; + var b = this.g; + return null === b ? !1 : b.Wb(a) + }; + xe.prototype.stopTransaction = xe.prototype.Uj = function () { + var a = this.g; + return null === a ? !1 : null === this.zf ? a.ap() : a.Wd(this.zf) + }; + xe.prototype.standardMouseSelect = function () { + var a = this.g; + if (null !== a && a.of) { + var b = a.N, c = a.zs(b.da, !1); + if (null !== c) if (u.Em ? b.Ys : b.control) { + a.za("ChangingSelection"); + for (b = c; null !== b && !b.canSelect();) b = b.Ra; + null !== b && (b.Za = !b.Za); + a.za("ChangedSelection") + } else if (b.shift) { + if (!c.Za) { + a.za("ChangingSelection"); + for (b = c; null !== b && !b.canSelect();) b = b.Ra; + null !== b && (b.Za = !0); + a.za("ChangedSelection") + } + } else { + if (!c.Za) { + for (b = c; null !== b && !b.canSelect();) b = b.Ra; + null !== b && a.select(b) + } + } else !b.left || (u.Em ? b.Ys : b.control) || + b.shift || a.Lv() + } + }; + xe.prototype.standardMouseClick = function (a, b) { + void 0 === a && (a = null); + void 0 === b && (b = function (a) { + return !a.layer.Ac + }); + var c = this.g; + if (null !== c) { + var d = c.N, e = c.ke(d.da, a, b); + d.pe = e; + zf(e, d, c) + } + }; + + function zf(a, b, c) { + var d = 0; + b.left ? d = 1 === b.Te ? 1 : 2 === b.Te ? 2 : 1 : b.right && 1 === b.Te && (d = 3); + var e = ""; + if (null !== a) { + switch (d) { + case 1: + e = "ObjectSingleClicked"; + break; + case 2: + e = "ObjectDoubleClicked"; + break; + case 3: + e = "ObjectContextClicked" + } + 0 !== d && c.za(e, a) + } else { + switch (d) { + case 1: + e = "BackgroundSingleClicked"; + break; + case 2: + e = "BackgroundDoubleClicked"; + break; + case 3: + e = "BackgroundContextClicked" + } + 0 !== d && c.za(e) + } + if (null !== a) for (b.Tc = !1; null !== a;) { + c = null; + switch (d) { + case 1: + c = a.click; + break; + case 2: + c = a.ts ? a.ts : a.click; + break; + case 3: + c = + a.Uy + } + if (null !== c && (c(b, a), b.Tc)) break; + a = a.S + } else { + a = null; + switch (d) { + case 1: + a = c.click; + break; + case 2: + a = c.ts ? c.ts : c.click; + break; + case 3: + a = c.Uy + } + null !== a && a(b) + } + } + + xe.prototype.standardMouseOver = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + if (null !== b.g && !0 !== a.Lb.ld) { + var c = a.cb; + a.cb = !0; + var d = a.ke(b.da, null, null); + b.pe = d; + var e = !1; + if (d !== a.en) { + var f = a.en, h = f; + a.en = d; + this.doCurrentObjectChanged(f, d); + for (b.Tc = !1; null !== f;) { + var k = f.$D; + if (null !== k) { + if (d === f) break; + if (null !== d && d.gl(f)) break; + k(b, f, d); + e = !0; + if (b.Tc) break + } + f = f.S + } + f = h; + for (b.Tc = !1; null !== d;) { + k = d.ZD; + if (null !== k) { + if (f === d) break; + if (null !== f && f.gl(d)) break; + k(b, d, f); + e = !0; + if (b.Tc) break + } + d = d.S + } + d = a.en + } + if (null !== d) { + f = + d; + for (k = ""; null !== f;) { + k = f.cursor; + if ("" !== k) break; + f = f.S + } + a.ac = k; + b.Tc = !1; + for (f = d; null !== f;) { + k = f.Fz; + if (null !== k && (k(b, f), e = !0, b.Tc)) break; + f = f.S + } + } else a.ac = "", k = a.Fz, null !== k && (k(b), e = !0); + e && a.de(); + a.cb = c + } + } + }; + xe.prototype.doCurrentObjectChanged = function () { + }; + xe.prototype.standardMouseWheel = function () { + var a = this.g; + if (null !== a) { + var b = a.N, c = b.Uk; + if (0 !== c && a.Cd.J()) { + var d = a.Eb, e = a.tb.$s; + if ((e === Af && !b.shift || e === Bf && b.control) && (0 < c ? d.canIncreaseZoom() : d.canDecreaseZoom())) e = a.Rm, a.Rm = b.ff, 0 < c ? d.increaseZoom() : d.decreaseZoom(), a.Rm = e, b.bubbles = !1; else if (e === Af && b.shift || e === Bf && !b.control) { + d = a.position.copy(); + e = 0 < c ? c : -c; + if (!b.shift && a.Se) { + var f = a.mt, e = e / 40 * f; + 0 < c ? a.scroll("pixel", "up", e) : a.scroll("pixel", "down", e) + } else b.shift && a.Re && (f = a.lt, e = e / 40 * f, 0 < c ? + a.scroll("pixel", "left", e) : a.scroll("pixel", "right", e)); + a.position.L(d) || (b.bubbles = !1) + } + } + } + }; + xe.prototype.standardWaitAfter = function (a) { + u.j(a, "number", xe, "standardWaitAfter:delay"); + this.cancelWaitAfter(); + var b = this; + this.vv = u.setTimeout(function () { + b.doWaitAfter() + }, a) + }; + xe.prototype.cancelWaitAfter = function () { + -1 !== this.vv && u.clearTimeout(this.vv); + this.vv = -1 + }; + xe.prototype.doWaitAfter = function () { + }; + xe.prototype.findToolHandleAt = function (a, b) { + var c = this.g; + if (null === c) return null; + c = c.ke(a, null, function (a) { + a = a.T; + return null === a ? !1 : null !== a.vc + }); + if (null === c) return null; + var d = c.T; + return null === d || d.Kc !== b ? null : c + }; + xe.prototype.isBeyondDragSize = function (a, b) { + var c = this.g; + if (null === c) return !1; + void 0 === a && (a = c.wc.ff); + void 0 === b && (b = c.N.ff); + var d = c.tb.vG, e = d.width, d = d.height; + c.wc.jl && (e += 6, d += 6); + return Math.abs(b.x - a.x) > e || Math.abs(b.y - a.y) > d + }; + u.u(xe, {g: "diagram"}, function () { + return this.Y + }); + u.defineProperty(xe, {name: "name"}, function () { + return this.Ub + }, function (a) { + u.j(a, "string", xe, "name"); + this.Ub = a + }); + u.defineProperty(xe, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + u.j(a, "boolean", xe, "isEnabled"); + this.Ne = a + }); + u.defineProperty(xe, {na: "isActive"}, function () { + return this.lB + }, function (a) { + u.j(a, "boolean", xe, "isActive"); + this.lB = a + }); + u.defineProperty(xe, {zf: "transactionResult"}, function () { + return this.AC + }, function (a) { + null !== a && u.j(a, "string", xe, "transactionResult"); + this.AC = a + }); + + function uf() { + 0 < arguments.length && u.Wc(uf); + xe.call(this); + this.name = "Dragging"; + this.KA = this.pB = !0; + this.iq = this.cB = !1; + this.tB = !0; + this.Mx = (new ia(NaN, NaN)).freeze(); + this.Nx = xb; + this.Ox = (new w(NaN, NaN)).freeze(); + this.bB = !1; + this.$A = this.IA = this.aB = this.QA = this.pi = null; + this.Rp = this.rB = !1; + this.bo = new w(NaN, NaN); + this.gv = new w; + this.jv = !1; + this.ev = this.oB = !0; + this.pn = 100; + this.Yi = []; + this.sF = (new F(G)).freeze() + } + + u.Ga(uf, xe); + u.fa("DraggingTool", uf); + u.defineProperty(uf, {MD: "isCopyEnabled"}, function () { + return this.pB + }, function (a) { + u.j(a, "boolean", uf, "isCopyEnabled"); + this.pB = a + }); + u.defineProperty(uf, {gG: "copiesEffectiveCollection"}, function () { + return this.KA + }, function (a) { + u.j(a, "boolean", uf, "copiesEffectiveCollection"); + this.KA = a + }); + u.defineProperty(uf, {wG: "dragsTree"}, function () { + return this.cB + }, function (a) { + u.j(a, "boolean", uf, "dragsTree"); + this.cB = a + }); + u.defineProperty(uf, {gw: "isGridSnapEnabled"}, function () { + return this.iq + }, function (a) { + u.j(a, "boolean", uf, "isGridSnapEnabled"); + this.iq = a + }); + u.defineProperty(uf, {YG: "isComplexRoutingRealtime"}, function () { + return this.oB + }, function (a) { + u.j(a, "boolean", uf, "isComplexRoutingRealtime"); + this.oB = a + }); + u.defineProperty(uf, {$G: "isGridSnapRealtime"}, function () { + return this.tB + }, function (a) { + u.j(a, "boolean", uf, "isGridSnapRealtime"); + this.tB = a + }); + u.defineProperty(uf, {DD: "gridSnapCellSize"}, function () { + return this.Mx + }, function (a) { + u.C(a, ia, uf, "gridSnapCellSize"); + this.Mx.L(a) || (this.Mx = a = a.Z()) + }); + u.defineProperty(uf, {JG: "gridSnapCellSpot"}, function () { + return this.Nx + }, function (a) { + u.C(a, L, uf, "gridSnapCellSpot"); + this.Nx.L(a) || (this.Nx = a = a.Z()) + }); + u.defineProperty(uf, {KG: "gridSnapOrigin"}, function () { + return this.Ox + }, function (a) { + u.C(a, w, uf, "gridSnapOrigin"); + this.Ox.L(a) || (this.Ox = a = a.Z()) + }); + u.defineProperty(uf, {Gi: "dragsLink"}, function () { + return this.bB + }, function (a) { + u.j(a, "boolean", uf, "dragsLink"); + this.bB = a + }); + u.defineProperty(uf, {rs: "currentPart"}, function () { + return this.QA + }, function (a) { + null !== a && u.C(a, G, uf, "currentPart"); + this.QA = a + }); + u.defineProperty(uf, {oc: "copiedParts"}, function () { + return this.IA + }, function (a) { + this.IA = a + }); + u.defineProperty(uf, {cc: "draggedParts"}, function () { + return this.aB + }, function (a) { + this.aB = a + }); + u.u(uf, {uJ: "draggingParts"}, function () { + return null !== this.oc ? this.oc.Ni() : null !== this.cc ? this.cc.Ni() : this.sF + }); + u.defineProperty(uf, {Sc: "draggedLink"}, function () { + return this.$A + }, function (a) { + null !== a && u.C(a, W, uf, "draggedLink"); + this.$A = a + }); + u.defineProperty(uf, {fw: "isDragOutStarted"}, function () { + return this.rB + }, function (a) { + this.rB = a + }); + u.defineProperty(uf, {Tj: "startPoint"}, function () { + return this.gv + }, function (a) { + u.C(a, w, uf, "startPoint"); + this.gv.L(a) || (this.gv = a = a.Z()) + }); + u.defineProperty(uf, {iD: "delay"}, function () { + return this.pn + }, function (a) { + u.j(a, "number", uf, "delay"); + this.pn = a + }); + uf.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || !a.Nk && !a.Ij && !a.Av || !a.of) return !1; + var b = a.N; + return !b.left || a.Va !== this && (!this.isBeyondDragSize() || b.jl && b.timestamp - a.wc.timestamp < this.pn) ? !1 : null !== this.findDraggablePart() + }; + uf.prototype.findDraggablePart = function () { + var a = this.g; + if (null === a) return null; + a = a.zs(a.wc.da, !1); + if (null === a) return null; + for (; null !== a && !a.canSelect();) a = a.Ra; + return null !== a && (a.canMove() || a.canCopy()) ? a : null + }; + uf.prototype.standardMouseSelect = function () { + var a = this.g; + if (null !== a && a.of) { + var b = a.zs(a.wc.da, !1); + if (null !== b) { + for (; null !== b && !b.canSelect();) b = b.Ra; + this.rs = b; + this.rs.Za || (a.za("ChangingSelection"), b = a.N, (u.Em ? b.Ys : b.control) || b.shift || of(a), this.rs.Za = !0, a.za("ChangedSelection")) + } + } + }; + uf.prototype.doActivate = function () { + var a = this.g; + if (null !== a) { + this.standardMouseSelect(); + var b = this.rs; + null !== b && (b.canMove() || b.canCopy()) && (this.na = !0, this.bo.set(a.position), Cf(this, a.selection), this.Yi.length = 0, this.cc = this.computeEffectiveCollection(a.selection), a.tt = !0, Df(this, this.cc), this.Wb("Drag"), this.Tj = a.wc.da, a.Ge = !0, a.Av && (this.fw = !0, this.Rp = !1, Ef = this, Ff = this.g, this.doSimulatedDragOut())) + } + }; + + function Cf(a, b) { + if (a.Gi) { + var c = a.g; + null !== c && c.mm && (c.ga instanceof Q && 1 === b.count && b.first() instanceof W ? (a.Sc = b.first(), a.Sc.canRelinkFrom() && a.Sc.canRelinkTo() && a.Sc.ls(), a.pi = c.tb.iE, null === a.pi && (a.pi = new Gf, a.pi.Ec(c))) : (a.Sc = null, a.pi = null)) + } + } + + uf.prototype.computeEffectiveCollection = function (a) { + var b = null !== this.g && this.g.Va === this, c = new la(G); + if (null === a) return c; + for (var d = a.i; d.next();) Hf(this, c, d.value, b); + if (null !== this.Sc && this.Gi) return c; + for (d = a.i; d.next();) a = d.value, a instanceof W && (b = a.W, null === b || c.contains(b) ? (b = a.ca, null === b || c.contains(b) || c.remove(a)) : c.remove(a)); + return c + }; + + function If(a) { + return void 0 === a ? new Jf(K.Wj) : new Jf(a.copy()) + } + + function Hf(a, b, c, d) { + if (!b.contains(c) && (!d || c.canMove() || c.canCopy())) if (c instanceof U) { + b.add(c, If(c.location)); + if (c instanceof V) for (var e = c.Mc; e.next();) Hf(a, b, e.value, d); + for (e = c.oe; e.next();) { + var f = e.value; + if (!b.contains(f)) { + var h = f.W, k = f.ca; + null !== h && b.contains(h) && null !== k && b.contains(k) && Hf(a, b, f, d) + } + } + if (a.wG) for (c = c.tD(); c.next();) Hf(a, b, c.value, d) + } else if (c instanceof W) for (f = c, b.add(f, If()), e = f.ug; e.next();) Hf(a, b, e.value, d); else c instanceof lf || b.add(c, If(c.location)) + } + + uf.prototype.doDeactivate = function () { + this.na = !1; + var a = this.g; + null !== a && Kf(a); + Zf(this); + $f(this, this.cc); + this.cc = null; + this.Rp = this.fw = !1; + if (0 < ag.count) { + for (var b = ag.length, c = 0; c < b; c++) { + var d = ag.ja(c); + bg(d); + cg(d); + Zf(d); + null !== d.g && Kf(d.g) + } + ag.clear() + } + bg(this); + this.bo.m(NaN, NaN); + Ef = Ff = null; + cg(this); + a.Ge = !1; + a.ac = ""; + a.tt = !1; + this.Uj() + }; + + function Zf(a) { + var b = a.g; + if (null !== b) { + var c = b.cb; + b.cb = !0; + dg(a, b.N, null); + b.cb = c + } + a.Yi.length = 0 + } + + function eg() { + var a = Ef; + cg(a); + fg(a); + var b = a.g; + null !== b && a.bo.J() && (b.position = a.bo); + null !== b && Kf(b) + } + + uf.prototype.doCancel = function () { + cg(this); + fg(this); + var a = this.g; + null !== a && this.bo.J() && (a.position = this.bo); + this.stopTool() + }; + + function Df(a, b) { + if (null !== b) { + a.jv = !0; + for (var c = b.i; c.next();) { + var d = c.key; + d instanceof W && (d.ip = !0) + } + } + } + + function $f(a, b) { + if (null !== b) { + for (var c = b.i; c.next();) { + var d = c.key; + d instanceof W && (d.ip = !1, d.el && gg(d) && d.Vb()) + } + a.jv = !1 + } + } + + uf.prototype.doKeyDown = function () { + var a = this.g; + null !== a && (a = a.N, null !== a && this.na && ("Esc" === a.key ? this.doCancel() : this.doMouseMove())) + }; + uf.prototype.doKeyUp = function () { + var a = this.g; + null !== a && null !== a.N && this.na && this.doMouseMove() + }; + + function hg(a, b) { + for (var c = Infinity, d = Infinity, e = -Infinity, f = -Infinity, h = a.i; h.next();) { + var k = h.value; + if (k.Fd() && k.Ea()) { + var l = k.location, k = l.x, l = l.y; + isNaN(k) || isNaN(l) || (k < c && (c = k), l < d && (d = l), k > e && (e = k), l > f && (f = l)) + } + } + Infinity === c ? b.m(0, 0, 0, 0) : b.m(c, d, e - c, f - d) + } + + function ig(a, b) { + if (null === a.oc) { + var c = a.g; + if (!(null === c || b && (c.nb || c.uf)) && null !== a.cc) { + var d = c.ha; + d.isEnabled && d.ND ? null !== d.Di && 0 < d.Di.Ug.count && (c.ha.ap(), c.Wb("Drag")) : fg(a); + c.cb = !b; + c.Vm = !b; + a.Tj = c.wc.da; + d = a.gG ? a.cc.Ni() : c.selection; + d = c.to(d, c, !0); + for (c = d.i; c.next();) c.value.location = c.key.location; + c = u.Sf(); + hg(d, c); + u.ic(c); + for (var c = new la(G), e = a.cc.i; e.next();) { + var f = e.key; + f.Fd() && f.canCopy() && (f = d.ta(f), null !== f && (f.pf(), c.add(f, If(f.location)))) + } + for (d = d.i; d.next();) e = d.value, e instanceof W && + e.canCopy() && c.add(e, If()); + a.oc = c; + Cf(a, c.Ni()); + null !== a.Sc && (c = a.Sc, d = c.Mm, c.ll(a.Tj.x - (d.x + d.width / 2), a.Tj.y - (d.y + d.height / 2))) + } + } + } + + function cg(a) { + var b = a.g; + if (null !== b) { + if (null !== a.oc && (b.Wz(a.oc.Ni(), !1), a.oc = null, null !== a.cc)) for (var c = a.cc.i; c.next();) c.key instanceof W && (c.value.point = new w(0, 0)); + b.cb = !1; + b.Vm = !1; + a.Tj = b.wc.da + } + } + + function bg(a) { + if (null !== a.Sc) { + if (a.Gi && null !== a.pi) { + var b = a.pi; + b.g.remove(b.qe); + b.g.remove(b.re) + } + a.Sc = null; + a.pi = null + } + } + + function jg(a, b, c) { + var d = a.g; + if (null !== d) { + var e = a.Tj, f = u.K(); + f.assign(d.N.da); + a.moveParts(b, f.vt(e), c); + u.v(f) + } + } + + uf.prototype.moveParts = function (a, b, c) { + if (null !== a && (u.C(a, la, uf, "moveParts:parts"), 0 !== a.count)) { + var d = u.K(), e = u.K(); + e.assign(b); + isNaN(e.x) && (e.x = 0); + isNaN(e.y) && (e.y = 0); + var f = this.jv; + f || Df(this, a); + for (var h = new E(kg), k = new E(Pa), l = a.i; l.next();) { + var m = l.key; + if (m.Fd()) { + var n = lg(this, m, a); + if (null !== n) h.add(new kg(m, l.value, n)); else if (!c || m.canMove()) { + n = l.value.point; + d.assign(n); + var p = u.K(), q = this.computeMove(m, d.add(e), a, p); + m.location = q; + u.v(p); + l.value.IE = p.vt(n) + } + } else l.key instanceof W && k.add(l.Cb) + } + for (c = + h.i; c.next();) h = c.value, n = h.info.point, d.assign(n), h.Cc.location = d.add(h.LG.IE); + n = u.K(); + c = u.K(); + for (k = k.i; k.next();) if (p = k.value, h = p.key, h instanceof W) if (h.ip) l = h.W, m = h.ca, null !== this.Sc && this.Gi ? (p = p.value.point, a.add(h, If(e)), l = b.x - p.x, m = b.y - p.y, h.ll(l, m)) : (null !== l && (n.assign(l.location), q = a.ta(l), null !== q && n.vt(q.point)), null !== m && (c.assign(m.location), q = a.ta(m), null !== q && c.vt(q.point)), null !== l && null !== m ? n.De(c) ? (p = p.value.point, l = d, l.assign(n), l.vt(p), a.add(h, If(n)), h.ll(l.x, l.y)) : (h.ip = !1, + h.Vb()) : (p = p.value.point, a.add(h, If(null !== l ? n : null !== m ? c : b)), l = e.x - p.x, m = e.y - p.y, h.ll(l, m))); else if (null === h.W || null === h.ca) p = p.value.point, a.add(h, If(b)), l = e.x - p.x, m = e.y - p.y, h.ll(l, m); + u.v(d); + u.v(e); + u.v(n); + u.v(c); + f || $f(this, a) + } + }; + + function lg(a, b, c) { + b = b.Ra; + if (null !== b) { + a = lg(a, b, c); + if (null !== a) return a; + a = c.ta(b); + if (null !== a) return a + } + return null + } + + function fg(a) { + if (null !== a.cc) { + for (var b = a.g, c = a.cc.i; c.next();) { + var d = c.key; + d.Fd() && (d.location = c.value.point) + } + for (c = a.cc.i; c.next();) if (d = c.key, d instanceof W && d.ip) { + var e = c.value.point; + a.cc.add(d, If()); + d.ll(-e.x, -e.y) + } + b.bf() + } + } + + uf.prototype.computeMove = function (a, b, c, d) { + void 0 === d && (d = new w); + d.assign(b); + if (null === a) return d; + void 0 === c && (c = null); + var e = b; + if (this.gw && (this.$G || null === c || this.g.N.up) && (e = u.K(), c = e, c.assign(b), null !== a)) { + var f = this.g; + if (null !== f) { + var h = f.Gs, k = this.DD, f = k.width, k = k.height, l = this.KG, m = l.x, l = l.y, n = this.JG; + if (null !== h) { + var p = h.aw; + isNaN(f) && (f = p.width); + isNaN(k) && (k = p.height); + h = h.CD; + isNaN(m) && (m = h.x); + isNaN(l) && (l = h.y) + } + h = u.fc(0, 0); + h.rt(0, 0, f, k, n); + K.xs(b.x, b.y, m + h.x, l + h.y, f, k, c); + u.v(h) + } + } + c = null !== a.mD ? + a.mD(a, b, e) : e; + k = a.AH; + f = k.x; + isNaN(f) && (f = a.location.x); + k = k.y; + isNaN(k) && (k = a.location.y); + h = a.vH; + m = h.x; + isNaN(m) && (m = a.location.x); + h = h.y; + isNaN(h) && (h = a.location.y); + d.m(Math.max(f, Math.min(c.x, m)), Math.max(k, Math.min(c.y, h))); + e !== b && u.v(e); + return d + }; + + function mg(a, b) { + if (null === b) return !0; + var c = b.T; + return null === c || c instanceof lf || c.layer.Ac || a.cc && a.cc.contains(c) || a.oc && a.oc.contains(c) ? !0 : !1 + } + + function ng(a, b, c, d) { + var e = a.g; + if (null !== e) { + a.Gi && (null !== a.Sc && (a.Sc.W = null, a.Sc.ca = null), vg(a, !1)); + var f = !1; + !1 === a.ev && (f = e.cb, e.cb = !0); + var h = wg(e, b, null, function (b) { + return !mg(a, b) + }), k = e.N; + k.pe = h; + var l = e.cb; + e.cb = !0; + var m = dg(a, k, h); + if (a.na || null !== Ef) { + if (null === h) { + var n = e.EH; + null !== n && (n(k), m = !0) + } + if (a.na || null !== Ef) if (a.doDragOver(b, h), a.na || null !== Ef) e.cb = l, m && e.bf(), !1 === a.ev && (e.cb = f), (e.Re || e.Se) && (c || d) && xg(e, k.ff) + } + } + } + + function dg(a, b, c) { + var d = !1, e = a.Yi.length, f = 0 < e ? a.Yi[0] : null; + if (c === f) return !1; + b.Tc = !1; + for (var h = 0; h < e; h++) { + var k = a.Yi[h], l = k.DH; + if (null !== l && (l(b, k, c), d = !0, b.Tc)) break + } + a.Yi.length = 0; + if (!a.na && null === Ef || null === c) return d; + for (b.Tc = !1; null !== c;) a.Yi.push(c), c = yg(c); + e = a.Yi.length; + for (h = 0; h < e && (k = a.Yi[h], l = k.CH, null === l || (l(b, k, f), d = !0, !b.Tc)); h++) ; + return d + } + + function yg(a) { + var b = a.S; + return null !== b ? b : a instanceof G && !(a instanceof V) && (a = a.Ra, null !== a && a.OG) ? a : null + } + + function zg(a, b, c) { + var d = a.pi; + if (null === d) return null; + var e = a.g.ym(b, d.fE, function (a) { + return d.findValidLinkablePort(a, c) + }); + a = u.K(); + for (var f = Infinity, h = null, e = e.i; e.next();) { + var k = e.value; + if (null !== k.T) { + var l = k.lb(Ib, a), l = b.Lj(l); + l < f && (h = k, f = l) + } + } + u.v(a); + return h + } + + function vg(a, b) { + var c = a.Sc; + if (null !== c && !(2 > c.ka)) { + var d = a.g; + if (null !== d && !d.nb && (d = a.pi, null !== d)) { + var e = null, f = null; + null === c.W && (e = zg(a, c.l(0), !1), null !== e && (f = e.T)); + var h = null, k = null; + null === c.ca && (h = zg(a, c.l(c.ka - 1), !0), null !== h && (k = h.T)); + d.isValidLink(f, e, k, h) ? b ? (c.jn = c.l(0).copy(), c.nn = c.l(c.ka - 1).copy(), c.ip = !1, c.W = f, null !== e && (c.pg = e.Jd), c.ca = k, null !== h && (c.lh = h.Jd)) : Ag(d, f, e, k, h) : Ag(d, null, null, null, null) + } + } + } + + uf.prototype.doDragOver = function () { + }; + + function Bg(a, b) { + var c = a.g; + if (null !== c) { + a.Gi && vg(a, !0); + Zf(a); + var d = wg(c, b, null, function (b) { + return !mg(a, b) + }), e = c.N; + e.pe = d; + if (null !== d) { + e.Tc = !1; + for (var f = d; null !== f;) { + var h = f.Cz; + if (null !== h && (h(e, f), e.Tc)) break; + f = yg(f) + } + } else h = c.Cz, null !== h && h(e); + if (a.na || null !== Ef) if (a.doDropOnto(b, d), a.na || null !== Ef) for (d = c.selection.i; d.next();) e = d.value, e instanceof U && Cg(c, e.ba) + } + } + + uf.prototype.doDropOnto = function () { + }; + uf.prototype.doMouseMove = function () { + if (this.na) { + var a = this.g; + if (null !== a && null !== this.rs && null !== this.cc) { + var b = !1, c = !1; + this.mayCopy() ? (b = !0, a.ac = "copy", ig(this, !1), Df(this, this.oc), jg(this, this.oc, !1), $f(this, this.oc)) : this.mayMove() ? (c = !0, a.ac = "default", cg(this), jg(this, this.cc, !0)) : this.mayDragOut() ? (a.ac = "no-drop", ig(this, !1), jg(this, this.oc, !1)) : cg(this); + ng(this, a.N.da, c, b) + } + } + }; + uf.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + if (null !== a) { + var b = !1, c = this.mayCopy(); + c && null !== this.oc ? (cg(this), ig(this, !0), Df(this, this.oc), jg(this, this.oc, !1), $f(this, this.oc), null !== this.oc && a.CE(this.oc.Ni())) : (b = !0, cg(this), this.mayMove() && (jg(this, this.cc, !0), this.ev = !1, ng(this, a.N.da, !0, !1), this.ev = !0)); + this.Rp = !0; + Bg(this, a.N.da); + if (this.na) { + this.oc = null; + if (b && null !== this.cc) for (b = this.cc.i; b.next();) { + var d = b.key; + d instanceof U && (d = d.Ra, null === d || null === d.placeholder || this.cc.contains(d) || + d.aD && d.R()) + } + a.pc(); + $f(this, this.cc); + this.zf = c ? "Copy" : "Move"; + a.za(c ? "SelectionCopied" : "SelectionMoved", a.selection) + } + this.stopTool() + } + } + }; + uf.prototype.mayCopy = function () { + if (!this.MD) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.lo || !a.Ij || (u.Em ? !a.N.alt : !a.N.control)) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canCopy()) return !0 + } + return null !== this.Sc && this.Gi && this.Sc.canCopy() ? !0 : !1 + }; + uf.prototype.mayDragOut = function () { + if (!this.MD) return !1; + var a = this.g; + if (null === a || !a.Av || !a.Ij || a.Nk) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canCopy()) return !0 + } + return null !== this.Sc && this.Gi && this.Sc.canCopy() ? !0 : !1 + }; + uf.prototype.mayMove = function () { + var a = this.g; + if (null === a || a.nb || !a.Nk) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canMove()) return !0 + } + return null !== this.Sc && this.Gi && this.Sc.canMove() ? !0 : !1 + }; + var ag = new E(uf), Ef = null, Ff = null; + uf.prototype.mayDragIn = function () { + var a = this.g; + if (null === a || !a.MC || a.nb || a.uf || !a.lo) return !1; + var b = Ef; + return null === b || b.g.ga.Sk !== a.ga.Sk ? !1 : !0 + }; + uf.prototype.doSimulatedDragEnter = function () { + if (this.mayDragIn()) { + var a = this.g; + a.Lb.Mi(); + Dg(a); + a = Ef; + null !== a && (a.g.ac = "copy") + } + }; + uf.prototype.doSimulatedDragLeave = function () { + var a = Ef; + null !== a && a.doSimulatedDragOut(); + this.doCancel() + }; + uf.prototype.doSimulatedDragOver = function () { + var a = this.g; + if (null !== a) { + var b = Ef; + null !== b && null !== b.cc && this.mayDragIn() && (a.ac = "copy", Eg(this, b.cc.Ni(), !1), jg(this, this.oc, !1), ng(this, a.N.da, !1, !0)) + } + }; + uf.prototype.doSimulatedDrop = function () { + var a = this.g; + if (null !== a) { + var b = Ef; + null !== b && (b.Rp = !0, cg(this), this.mayDragIn() && (this.Wb("Drop"), Eg(this, b.cc.Ni(), !0), jg(this, this.oc, !1), null !== this.oc && a.CE(this.oc.Ni()), this.zf = "ExternalCopy", Bg(this, a.N.da), a.pc(), this.oc = null, a.focus(), a.za("ExternalObjectsDropped", a.selection), this.Uj())) + } + }; + + function Eg(a, b, c) { + if (null === a.oc) { + var d = a.g; + if (null !== d && !d.nb && !d.uf) { + d.cb = !c; + d.Vm = !c; + a.Tj = d.N.da; + d = d.to(b, d, !0); + c = u.Sf(); + hg(b, c); + var e = c.x + c.width / 2, f = c.y + c.height / 2; + u.ic(c); + var h = a.gv; + c = new la(G); + var k = u.K(); + for (b = b.i; b.next();) { + var l = b.value; + if (l.Fd() && l.canCopy()) { + var m = l.location, l = d.ta(l); + k.m(h.x - (e - m.x), h.y - (f - m.y)); + l.location = k; + l.pf(); + c.add(l, If(k)) + } + } + u.v(k); + for (d = d.i; d.next();) e = d.value, e instanceof W && e.canCopy() && c.add(e, If()); + a.oc = c; + Cf(a, c.Ni()); + null !== a.Sc && (c = a.Sc, d = c.Mm, c.ll(a.Tj.x - + (d.x + d.width / 2), a.Tj.y - (d.y + d.height / 2))) + } + } + } + + uf.prototype.doSimulatedDragOut = function () { + var a = this.g; + null !== a && (this.mayCopy() || this.mayMove() ? a.ac = "" : a.ac = "no-drop") + }; + + function Jf(a) { + this.point = a; + this.IE = K.Wj + } + + u.fa("DraggingInfo", Jf); + + function kg(a, b, c) { + this.Cc = a; + this.info = b; + this.LG = c + } + + function Fg() { + 0 < arguments.length && u.Wc(Fg); + xe.call(this); + this.XB = 100; + this.xB = !1; + var a = new W, b = new X; + b.tg = !0; + b.stroke = "blue"; + a.add(b); + b = new X; + b.jp = "Standard"; + b.fill = "blue"; + b.stroke = "blue"; + a.add(b); + a.wf = "Tool"; + this.tC = a; + a = new U; + b = new X; + b.Jd = ""; + b.Fb = "Rectangle"; + b.fill = null; + b.stroke = "magenta"; + b.hb = 2; + b.xa = K.Tw; + a.add(b); + a.pl = !1; + a.wf = "Tool"; + this.rC = a; + this.sC = b; + a = new U; + b = new X; + b.Jd = ""; + b.Fb = "Rectangle"; + b.fill = null; + b.stroke = "magenta"; + b.hb = 2; + b.xa = K.Tw; + a.add(b); + a.pl = !1; + a.wf = "Tool"; + this.uC = a; + this.vC = b; + this.TB = + this.SB = this.OB = this.NB = this.PB = null; + this.sB = !0; + this.EF = new la(S, "boolean"); + this.YB = this.xk = this.nC = null + } + + u.Ga(Fg, xe); + u.fa("LinkingBaseTool", Fg); + Fg.prototype.doStop = function () { + var a = this.g; + null !== a && Kf(a); + this.fh = this.eh = this.dh = this.bh = this.qc = null; + this.Nw.clear(); + this.Rf = null + }; + u.defineProperty(Fg, {fE: "portGravity"}, function () { + return this.XB + }, function (a) { + u.j(a, "number", Fg, "portGravity"); + 0 <= a && (this.XB = a) + }); + u.defineProperty(Fg, {Io: "isUnconnectedLinkValid"}, function () { + return this.xB + }, function (a) { + u.j(a, "boolean", Fg, "isUnconnectedLinkValid"); + this.xB = a + }); + u.defineProperty(Fg, {Dg: "temporaryLink"}, function () { + return this.tC + }, function (a) { + u.C(a, W, Fg, "temporaryLink"); + this.tC = a + }); + u.defineProperty(Fg, {qe: "temporaryFromNode"}, function () { + return this.rC + }, function (a) { + u.C(a, U, Fg, "temporaryFromNode"); + this.rC = a + }); + u.defineProperty(Fg, {Om: "temporaryFromPort"}, function () { + return this.sC + }, function (a) { + u.C(a, S, Fg, "temporaryFromPort"); + this.sC = a + }); + u.defineProperty(Fg, {re: "temporaryToNode"}, function () { + return this.uC + }, function (a) { + u.C(a, U, Fg, "temporaryToNode"); + this.uC = a + }); + u.defineProperty(Fg, {Pm: "temporaryToPort"}, function () { + return this.vC + }, function (a) { + u.C(a, S, Fg, "temporaryToPort"); + this.vC = a + }); + u.defineProperty(Fg, {qc: "originalLink"}, function () { + return this.PB + }, function (a) { + null !== a && u.C(a, W, Fg, "originalLink"); + this.PB = a + }); + u.defineProperty(Fg, {bh: "originalFromNode"}, function () { + return this.NB + }, function (a) { + null !== a && u.C(a, U, Fg, "originalFromNode"); + this.NB = a + }); + u.defineProperty(Fg, {dh: "originalFromPort"}, function () { + return this.OB + }, function (a) { + null !== a && u.C(a, S, Fg, "originalFromPort"); + this.OB = a + }); + u.defineProperty(Fg, {eh: "originalToNode"}, function () { + return this.SB + }, function (a) { + null !== a && u.C(a, U, Fg, "originalToNode"); + this.SB = a + }); + u.defineProperty(Fg, {fh: "originalToPort"}, function () { + return this.TB + }, function (a) { + null !== a && u.C(a, S, Fg, "originalToPort"); + this.TB = a + }); + u.defineProperty(Fg, {$d: "isForwards"}, function () { + return this.sB + }, function (a) { + u.j(a, "boolean", Fg, "isForwards"); + this.sB = a + }); + u.u(Fg, {Nw: "validPortsCache"}, function () { + return this.EF + }); + u.defineProperty(Fg, {Rf: "targetPort"}, function () { + return this.nC + }, function (a) { + null !== a && u.C(a, S, Fg, "targetPort"); + this.nC = a + }); + Fg.prototype.copyPortProperties = function (a, b, c, d, e) { + if (null !== a && null !== b && null !== c && null !== d) { + d.xa = b.ba.size; + e ? (d.xb = b.xb, d.vl = b.vl) : (d.vb = b.vb, d.Yk = b.Yk); + c.Ze = Ib; + var f = u.K(); + c.location = b.lb(Ib, f); + u.v(f); + d.angle = b.Zk(); + null !== this.ww && this.ww(a, b, c, d, e) + } + }; + Fg.prototype.setNoTargetPortProperties = function (a, b, c) { + null !== b && (b.xa = K.Tw, b.vb = vb, b.xb = vb); + null !== a && (a.location = this.g.N.da); + null !== this.ww && this.ww(null, null, a, b, c) + }; + Fg.prototype.doMouseDown = function () { + this.na && this.doMouseMove() + }; + Fg.prototype.doMouseMove = function () { + if (this.na) { + var a = this.g; + if (null !== a) { + this.Rf = this.findTargetPort(this.$d); + if (null !== this.Rf) { + var b = this.Rf.T; + if (b instanceof U) { + this.$d ? this.copyPortProperties(b, this.Rf, this.re, this.Pm, !0) : this.copyPortProperties(b, this.Rf, this.qe, this.Om, !1); + return + } + } + this.$d ? this.setNoTargetPortProperties(this.re, this.Pm, !0) : this.setNoTargetPortProperties(this.qe, this.Om, !1); + (a.Re || a.Se) && xg(a, a.N.ff) + } + } + }; + Fg.prototype.findValidLinkablePort = function (a, b) { + if (null === a) return null; + var c = a.T; + if (!(c instanceof U)) return null; + for (; null !== a;) { + var d = b ? a.OE : a.vD; + if (!0 === d && (null !== a.Jd || a instanceof U) && (b ? this.isValidTo(c, a) : this.isValidFrom(c, a))) return a; + if (!1 === d) break; + a = a.S + } + return null + }; + Fg.prototype.findTargetPort = function (a) { + var b = this.g, c = b.N.da, d = this.fE; + 0 >= d && (d = .1); + for (var e = this, f = b.ym(c, d, function (b) { + return e.findValidLinkablePort(b, a) + }, null, !0), d = Infinity, b = null, f = f.i; f.next();) { + var h = f.value, k = h.T; + if (k instanceof U) { + var l = h.lb(Ib, u.K()), m = c.x - l.x, n = c.y - l.y; + u.v(l); + l = m * m + n * n; + l < d && (m = this.Nw.ta(h), null !== m ? m && (b = h, d = l) : a && this.isValidLink(this.bh, this.dh, k, h) || !a && this.isValidLink(k, h, this.eh, this.fh) ? (this.Nw.add(h, !0), b = h, d = l) : this.Nw.add(h, !1)) + } + } + return null !== b && (c = b.T, + c instanceof U && (null === c.layer || c.layer.gs)) ? b : null + }; + Fg.prototype.isValidFrom = function (a, b) { + if (null === a || null === b) return this.Io; + if (this.g.Va === this && (null !== a.layer && !a.layer.gs || !0 !== b.vD)) return !1; + var c = b.DG; + if (Infinity > c) { + if (null !== this.qc && a === this.bh && b === this.dh) return !0; + var d = b.Jd; + null === d && (d = ""); + if (a.Wv(d).count >= c) return !1 + } + return !0 + }; + Fg.prototype.isValidTo = function (a, b) { + if (null === a || null === b) return this.Io; + if (this.g.Va === this && (null !== a.layer && !a.layer.gs || !0 !== b.OE)) return !1; + var c = b.yI; + if (Infinity > c) { + if (null !== this.qc && a === this.eh && b === this.fh) return !0; + var d = b.Jd; + null === d && (d = ""); + if (a.og(d).count >= c) return !1 + } + return !0 + }; + Fg.prototype.isInSameNode = function (a, b) { + if (null === a || null === b) return !1; + if (a === b) return !0; + var c = a.T, d = b.T; + return null !== c && c === d + }; + Fg.prototype.isLinked = function (a, b) { + if (null === a || null === b) return !1; + var c = a.T; + if (!(c instanceof U)) return !1; + var d = a.Jd; + null === d && (d = ""); + var e = b.T; + if (!(e instanceof U)) return !1; + var f = b.Jd; + null === f && (f = ""); + for (e = e.og(f); e.next();) if (f = e.value, f.W === c && f.pg === d) return !0; + return !1 + }; + Fg.prototype.isValidLink = function (a, b, c, d) { + if (!this.isValidFrom(a, b) || !this.isValidTo(c, d) || !(null === b || null === d || (b.CG && d.xI || !this.isInSameNode(b, d)) && (b.BG && d.wI || !this.isLinked(b, d))) || null !== this.qc && (null !== a && this.isLabelDependentOnLink(a, this.qc) || null !== c && this.isLabelDependentOnLink(c, this.qc)) || null !== a && null !== c && (null === a.data && null !== c.data || null !== a.data && null === c.data) || !this.isValidCycle(a, c, this.qc)) return !1; + if (null !== a) { + var e = a.pw; + if (null !== e && !e(a, b, c, d, this.qc)) return !1 + } + if (null !== + c && (e = c.pw, null !== e && !e(a, b, c, d, this.qc))) return !1; + e = this.pw; + return null !== e ? e(a, b, c, d, this.qc) : !0 + }; + Fg.prototype.isLabelDependentOnLink = function (a, b) { + if (null === a) return !1; + var c = a.ce; + if (null === c) return !1; + if (c === b) return !0; + var d = new F(U); + d.add(a); + return Gg(this, c, b, d) + }; + + function Gg(a, b, c, d) { + if (b === c) return !0; + var e = b.W; + if (null !== e && e.tf && (d.add(e), Gg(a, e.ce, c, d))) return !0; + b = b.ca; + return null !== b && b.tf && (d.add(b), Gg(a, b.ce, c, d)) ? !0 : !1 + } + + Fg.prototype.isValidCycle = function (a, b, c) { + void 0 === c && (c = null); + if (null === a || null === b) return this.Io; + var d = this.g.DI; + if (d !== Hg) { + if (d === Ig) { + if (null !== c && !c.Bc) return !0; + for (d = b.oe; d.next();) { + var e = d.value; + if (e !== c && e.Bc && e.ca === b) return !1 + } + return !Jg(this, a, b, c, !0) + } + if (d === Kg) { + if (null !== c && !c.Bc) return !0; + for (d = a.oe; d.next();) if (e = d.value, e !== c && e.Bc && e.W === a) return !1; + return !Jg(this, a, b, c, !0) + } + if (d === Lg) return a === b ? a = !0 : (d = new F(U), d.add(b), a = Ug(this, d, a, b, c)), !a; + if (d === Vg) return !Jg(this, a, b, c, !1); + if (d === + Wg) return a === b ? a = !0 : (d = new F(U), d.add(b), a = Xg(this, d, a, b, c)), !a + } + return !0 + }; + + function Jg(a, b, c, d, e) { + if (b === c) return !0; + if (null === b || null === c) return !1; + for (var f = b.oe; f.next();) { + var h = f.value; + if (h !== d && (!e || h.Bc) && h.ca === b && (h = h.W, h !== b && Jg(a, h, c, d, e))) return !0 + } + return !1 + } + + function Ug(a, b, c, d, e) { + if (c === d) return !0; + if (null === c || null === d || b.contains(c)) return !1; + b.add(c); + for (var f = c.oe; f.next();) { + var h = f.value; + if (h !== e && h.ca === c && (h = h.W, h !== c && Ug(a, b, h, d, e))) return !0 + } + return !1 + } + + function Xg(a, b, c, d, e) { + if (c === d) return !0; + if (null === c || null === d || b.contains(c)) return !1; + b.add(c); + for (var f = c.oe; f.next();) { + var h = f.value; + if (h !== e) { + var k = h.W, h = h.ca, k = k === c ? h : k; + if (k !== c && Xg(a, b, k, d, e)) return !0 + } + } + return !1 + } + + u.defineProperty(Fg, {pw: "linkValidation"}, function () { + return this.xk + }, function (a) { + null !== a && u.j(a, "function", Fg, "linkValidation"); + this.xk = a + }); + u.defineProperty(Fg, {ww: "portTargeted"}, function () { + return this.YB + }, function (a) { + null !== a && u.j(a, "function", Fg, "portTargeted"); + this.YB = a + }); + + function ta() { + 0 < arguments.length && u.Wc(ta); + Fg.call(this); + this.name = "Linking"; + this.ex = {}; + this.bx = null; + this.la = Yg; + this.yy = this.jC = null + } + + u.Ga(ta, Fg); + u.fa("LinkingTool", ta); + var Yg; + ta.Either = Yg = u.s(ta, "Either", 0); + var Zg; + ta.ForwardsOnly = Zg = u.s(ta, "ForwardsOnly", 0); + var $g; + ta.BackwardsOnly = $g = u.s(ta, "BackwardsOnly", 0); + u.defineProperty(ta, {OF: "archetypeLinkData"}, function () { + return this.ex + }, function (a) { + null !== a && u.C(a, Object, ta, "archetypeLinkData"); + a instanceof S && u.C(a, W, ta, "archetypeLinkData"); + this.ex = a + }); + u.defineProperty(ta, {PC: "archetypeLabelNodeData"}, function () { + return this.bx + }, function (a) { + null !== a && u.C(a, Object, ta, "archetypeLabelNodeData"); + a instanceof S && u.C(a, U, ta, "archetypeLabelNodeData"); + this.bx = a + }); + u.defineProperty(ta, {direction: "direction"}, function () { + return this.la + }, function (a) { + u.rb(a, ta, ta, "direction"); + this.la = a + }); + u.defineProperty(ta, {ME: "startObject"}, function () { + return this.jC + }, function (a) { + null !== a && u.C(a, S, ta, "startObject"); + this.jC = a + }); + u.u(ta, {Kw: "startPort"}, function () { + return this.yy + }); + ta.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.gs) return !1; + var b = a.ga; + return (b instanceof Q || b instanceof qe) && a.N.left && (a.Va === this || this.isBeyondDragSize()) ? null !== this.findLinkablePort() : !1 + }; + ta.prototype.findLinkablePort = function () { + var a = this.g; + if (null === a) return null; + var b = this.ME; + null === b && (b = a.ke(a.wc.da, null, null)); + if (null === b || !(b.T instanceof U)) return null; + a = this.direction; + if (a === Yg || a === Zg) { + var c = this.findValidLinkablePort(b, !1); + if (null !== c) return this.$d = !0, c + } + if (a === Yg || a === $g) if (c = this.findValidLinkablePort(b, !0), null !== c) return this.$d = !1, c; + return null + }; + ta.prototype.doActivate = function () { + var a = this.g; + if (null !== a && (null === this.Kw && (this.yy = this.findLinkablePort()), null !== this.Kw)) { + this.Wb(this.name); + a.Ge = !0; + a.ac = "pointer"; + if (this.$d) { + this.dh = this.Kw; + var b = this.dh.T; + b instanceof U && (this.bh = b); + this.copyPortProperties(this.bh, this.dh, this.qe, this.Om, !1) + } else this.fh = this.Kw, b = this.fh.T, b instanceof U && (this.eh = b), this.copyPortProperties(this.eh, this.fh, this.re, this.Pm, !0); + a.add(this.qe); + a.add(this.re); + null !== this.Dg && (null !== this.qe && (this.Dg.W = this.qe), + null !== this.re && (this.Dg.ca = this.re), this.Dg.Vb(), a.add(this.Dg)); + this.na = !0 + } + }; + ta.prototype.doDeactivate = function () { + this.na = !1; + var a = this.g; + null !== a && (a.remove(this.Dg), a.remove(this.qe), a.remove(this.re), a.Ge = !1, a.ac = "", this.Uj()) + }; + ta.prototype.doStop = function () { + Fg.prototype.doStop.call(this); + this.ME = this.yy = null + }; + ta.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + if (null === a) return; + var b = this.zf = null, c = null, d = null, e = null, f = this.Rf = this.findTargetPort(this.$d); + if (null !== f) { + var h = f.T; + h instanceof U && (this.$d ? (null !== this.bh && (b = this.bh, c = this.dh), d = h, e = f) : (b = h, c = f, null !== this.eh && (d = this.eh, e = this.fh))) + } else this.$d ? null !== this.bh && this.Io && (b = this.bh, c = this.dh) : null !== this.eh && this.Io && (d = this.eh, e = this.fh); + if (null !== b || null !== d) b = this.insertLink(b, c, d, e), null !== b ? (null === f && (this.$d ? b.nn = a.N.da.copy() : + b.jn = a.N.da.copy()), a.of && a.select(b), this.zf = this.name, a.za("LinkDrawn", b)) : a.ga.XC() + } + this.stopTool() + }; + ta.prototype.insertLink = function (a, b, c, d) { + var e = this.g; + if (null === e) return null; + var f = e.ga; + if (f instanceof qe) { + var h = a; + b = c; + e.qd || (h = c, b = a); + if (null !== h && null !== b) return f.ih(b.data, f.wb(h.data)), b.As() + } else if (f instanceof Q) if (h = "", null !== a && (null === b && (b = a), h = b.Jd, null === h && (h = "")), b = "", null !== c && (null === d && (d = c), b = d.Jd, null === b && (b = "")), d = this.OF, d instanceof W) { + if (nf(d), f = d.copy(), null !== f) return f.W = a, f.pg = h, f.ca = c, f.lh = b, e.add(f), a = this.PC, a instanceof U && (nf(a), a = a.copy(), null !== a && (a.ce = f, e.add(a))), + f + } else if (null !== d && (d = f.eD(d), u.Sa(d))) return null !== a && f.Ew(d, f.wb(a.data)), f.aA(d, h), null !== c && f.Gw(d, f.wb(c.data)), f.eA(d, b), f.xv(d), a = this.PC, null === a || a instanceof U || (a = f.copyNodeData(a), u.Sa(a) && (f.km(a), a = f.wb(a), void 0 !== a && f.Ly(d, a))), f = e.ng(d); + return null + }; + + function Gf() { + 0 < arguments.length && u.Wc(Gf); + Fg.call(this); + this.name = "Relinking"; + var a = new X; + a.Fb = "Diamond"; + a.xa = K.Qw; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.cursor = "pointer"; + a.Pf = 0; + this.gB = a; + a = new X; + a.Fb = "Diamond"; + a.xa = K.Qw; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.cursor = "pointer"; + a.Pf = -1; + this.wC = a; + this.Yb = null; + this.QB = new z + } + + u.Ga(Gf, Fg); + u.fa("RelinkingTool", Gf); + Gf.prototype.updateAdornments = function (a) { + if (null !== a && a instanceof W) { + var b = "RelinkFrom", c = null; + if (a.Za && !this.g.nb) { + var d = a.nt; + null !== d && a.canRelinkFrom() && a.ba.J() && a.Ea() && d.ba.J() && d.kl() && (c = a.xo(b), null === c && (c = this.makeAdornment(d, !1), null !== c && (c.Kc = b), a.Kk(b, c))) + } + null === c && a.ol(b); + b = "RelinkTo"; + c = null; + a.Za && !this.g.nb && (d = a.nt, null !== d && a.canRelinkTo() && a.ba.J() && a.Ea() && d.ba.J() && d.kl() && (c = a.xo(b), null === c && (c = this.makeAdornment(d, !0), null !== c && (c.Kc = b), a.Kk(b, c)))); + null === c && a.ol(b) + } + }; + Gf.prototype.makeAdornment = function (a, b) { + var c = new lf; + c.type = ah; + var d = b ? this.vI : this.AG; + null !== d && c.add(d.copy()); + c.vc = a; + return c + }; + u.defineProperty(Gf, {AG: "fromHandleArchetype"}, function () { + return this.gB + }, function (a) { + null !== a && u.C(a, S, Gf, "fromHandleArchetype"); + this.gB = a + }); + u.defineProperty(Gf, {vI: "toHandleArchetype"}, function () { + return this.wC + }, function (a) { + null !== a && u.C(a, S, Gf, "toHandleArchetype"); + this.wC = a + }); + u.u(Gf, {handle: "handle"}, function () { + return this.Yb + }); + Gf.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.mm) return !1; + var b = a.ga; + if (!(b instanceof Q || b instanceof qe) || !a.N.left) return !1; + b = this.findToolHandleAt(a.wc.da, "RelinkFrom"); + null === b && (b = this.findToolHandleAt(a.wc.da, "RelinkTo")); + return null !== b + }; + Gf.prototype.doActivate = function () { + var a = this.g; + if (null !== a) { + if (null === this.qc) { + var b = this.findToolHandleAt(a.wc.da, "RelinkFrom"); + null === b && (b = this.findToolHandleAt(a.wc.da, "RelinkTo")); + if (null === b) return; + var c = b.T; + if (!(c instanceof lf && c.Kh instanceof W)) return; + this.Yb = b; + this.$d = null === c || "RelinkTo" === c.Kc; + this.qc = c.Kh + } + this.Wb(this.name); + a.Ge = !0; + a.ac = "pointer"; + this.dh = this.qc.od; + this.bh = this.qc.W; + this.fh = this.qc.fe; + this.eh = this.qc.ca; + this.QB.set(this.qc.ba); + null !== this.qc && 0 < this.qc.ka && (null === + this.qc.W && (null !== this.Om && (this.Om.xa = K.op), null !== this.qe && (this.qe.location = this.qc.l(0))), null === this.qc.ca && (null !== this.Pm && (this.Pm.xa = K.op), null !== this.re && (this.re.location = this.qc.l(this.qc.ka - 1)))); + this.copyPortProperties(this.bh, this.dh, this.qe, this.Om, !1); + this.copyPortProperties(this.eh, this.fh, this.re, this.Pm, !0); + a.add(this.qe); + a.add(this.re); + null !== this.Dg && (null !== this.qe && (this.Dg.W = this.qe), null !== this.re && (this.Dg.ca = this.re), this.copyLinkProperties(this.qc, this.Dg), this.Dg.Vb(), + a.add(this.Dg)); + this.na = !0 + } + }; + Gf.prototype.copyLinkProperties = function (a, b) { + if (null !== a && null !== b) { + b.es = a.es; + b.Yy = a.Yy; + var c = a.Ve; + if (c === bh || c === ch) c = dh; + b.Ve = c; + b.Ov = a.Ov; + b.zw = a.zw; + b.gp = a.gp; + b.vb = a.vb; + b.Yk = a.Yk; + b.Es = a.Es; + b.Fs = a.Fs; + b.xb = a.xb; + b.vl = a.vl; + b.wt = a.wt; + b.yt = a.yt + } + }; + Gf.prototype.doDeactivate = function () { + this.na = !1; + var a = this.g; + null !== a && (a.remove(this.Dg), a.remove(this.qe), a.remove(this.re), a.Ge = !1, a.ac = "", this.Uj()) + }; + Gf.prototype.doStop = function () { + Fg.prototype.doStop.call(this); + this.Yb = null + }; + Gf.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + if (null === a) return; + this.zf = null; + var b = this.bh, c = this.dh, d = this.eh, e = this.fh, f = this.qc; + this.Rf = this.findTargetPort(this.$d); + if (null !== this.Rf) { + var h = this.Rf.T; + h instanceof U && (this.$d ? (d = h, e = this.Rf) : (b = h, c = this.Rf)) + } else this.Io ? this.$d ? e = d = null : c = b = null : f = null; + null !== f && (this.reconnectLink(f, this.$d ? d : b, this.$d ? e : c, this.$d), null === this.Rf && (this.$d ? f.nn = a.N.da.copy() : f.jn = a.N.da.copy(), f.Vb()), a.of && (f.Za = !0), this.zf = this.name, a.za("LinkRelinked", + f, this.$d ? this.fh : this.dh)); + eh(this.qc, this.QB) + } + this.stopTool() + }; + Gf.prototype.reconnectLink = function (a, b, c, d) { + if (null === this.g) return !1; + c = null !== c && null !== c.Jd ? c.Jd : ""; + d ? (a.ca = b, a.lh = c) : (a.W = b, a.pg = c); + return !0 + }; + + function Ag(a, b, c, d, e) { + null !== b ? (a.copyPortProperties(b, c, a.qe, a.Om, !1), a.g.add(a.qe)) : a.g.remove(a.qe); + null !== d ? (a.copyPortProperties(d, e, a.re, a.Pm, !0), a.g.add(a.re)) : a.g.remove(a.re) + } + + function fh() { + 0 < arguments.length && u.Wc(fh); + xe.call(this); + this.name = "LinkReshaping"; + var a = new X; + a.Fb = "Rectangle"; + a.xa = K.mp; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + this.pk = a; + a = new X; + a.Fb = "Diamond"; + a.xa = K.mp; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + this.DB = a; + this.ZB = 3; + this.$w = this.Yb = null; + this.RB = new w; + this.my = null + } + + u.Ga(fh, xe); + u.fa("LinkReshapingTool", fh); + var gh; + fh.None = gh = u.s(fh, "None", 0); + var hh; + fh.Horizontal = hh = u.s(fh, "Horizontal", 1); + var ih; + fh.Vertical = ih = u.s(fh, "Vertical", 2); + var jh; + fh.All = jh = u.s(fh, "All", 3); + fh.prototype.getReshapingBehavior = fh.prototype.AD = function (a) { + return a && a.$B ? a.$B : gh + }; + fh.prototype.setReshapingBehavior = fh.prototype.qt = function (a, b) { + u.C(a, S, fh, "setReshapingBehavior:obj"); + u.rb(b, fh, fh, "setReshapingBehavior:behavior"); + a.$B = b + }; + fh.prototype.updateAdornments = function (a) { + if (null !== a && a instanceof W) { + if (a.Za && !this.g.nb) { + var b = a.path; + if (null !== b && a.canReshape() && a.ba.J() && a.Ea() && b.ba.J() && b.kl()) { + var c = a.xo(this.name); + if (null === c || c.xF !== a.ka || c.GF !== a.it) c = this.makeAdornment(b), null !== c && (c.xF = a.ka, c.GF = a.it, a.Kk(this.name, c)); + if (null !== c) { + c.location = a.position; + return + } + } + } + a.ol(this.name) + } + }; + fh.prototype.makeAdornment = function (a) { + var b = a.T, c = b.ka, d = b.dc, e = null; + if (null !== b.points && 1 < c) { + e = new lf; + e.type = ah; + var c = b.Bs, f = b.lw, h = d ? 1 : 0; + if (b.it && b.Ve !== kh) for (var k = c + h; k < f - h; k++) { + var l = this.makeResegmentHandle(a, k); + null !== l && (l.Pf = k, l.Bw = .5, e.add(l)) + } + for (k = c + 1; k < f; k++) if (l = this.makeHandle(a, k), null !== l) { + l.Pf = k; + if (k !== c) if (k === c + 1 && d) { + var h = b.l(c), m = b.l(c + 1); + K.D(h.x, m.x) && K.D(h.y, m.y) && (m = b.l(c - 1)); + K.D(h.x, m.x) ? (this.qt(l, ih), l.cursor = "n-resize") : K.D(h.y, m.y) && (this.qt(l, hh), l.cursor = "w-resize") + } else k === + f - 1 && d ? (h = b.l(f - 1), m = b.l(f), K.D(h.x, m.x) && K.D(h.y, m.y) && (h = b.l(f + 1)), K.D(h.x, m.x) ? (this.qt(l, ih), l.cursor = "n-resize") : K.D(h.y, m.y) && (this.qt(l, hh), l.cursor = "w-resize")) : k !== f && (this.qt(l, jh), l.cursor = "move"); + e.add(l) + } + e.Kc = this.name; + e.vc = a + } + return e + }; + fh.prototype.makeHandle = function () { + var a = this.Hs; + return null === a ? null : a.copy() + }; + u.defineProperty(fh, {Hs: "handleArchetype"}, function () { + return this.pk + }, function (a) { + null !== a && u.C(a, S, fh, "handleArchetype"); + this.pk = a + }); + fh.prototype.makeResegmentHandle = function () { + var a = this.zH; + return null === a ? null : a.copy() + }; + u.defineProperty(fh, {zH: "midHandleArchetype"}, function () { + return this.DB + }, function (a) { + null !== a && u.C(a, S, fh, "midHandleArchetype"); + this.DB = a + }); + u.u(fh, {handle: "handle"}, function () { + return this.Yb + }); + u.u(fh, {fs: "adornedLink"}, function () { + return this.$w + }); + fh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null !== a && !a.nb && a.Cv && a.N.left ? null !== this.findToolHandleAt(a.wc.da, this.name) : !1 + }; + fh.prototype.doActivate = function () { + var a = this.g; + if (null !== a && (this.Yb = this.findToolHandleAt(a.wc.da, this.name), null !== this.Yb)) { + var b = this.Yb.T.Kh; + if (b instanceof W) { + this.$w = b; + a.Ge = !0; + this.Wb(this.name); + if (b.it && .5 === this.Yb.Bw) { + var c = b.points.copy(), d = this.Yb.lb(Ib); + c.Yd(this.Yb.Pf + 1, d); + b.dc && c.Yd(this.Yb.Pf + 1, d); + b.points = c; + b.Zd(); + this.Yb = this.findToolHandleAt(a.wc.da, this.name) + } + this.RB = b.l(this.Yb.Pf); + this.my = b.points.copy(); + this.na = !0 + } + } + }; + fh.prototype.doDeactivate = function () { + this.Uj(); + this.$w = this.Yb = null; + var a = this.g; + null !== a && (a.Ge = !1); + this.na = !1 + }; + fh.prototype.doCancel = function () { + var a = this.fs; + null !== a && (a.points = this.my); + this.stopTool() + }; + fh.prototype.doMouseMove = function () { + var a = this.g; + this.na && null !== a && (a = this.computeReshape(a.N.da), this.reshape(a)) + }; + fh.prototype.doMouseUp = function () { + var a = this.g; + if (this.na && null !== a) { + var b = this.computeReshape(a.N.da); + this.reshape(b); + b = this.fs; + if (null !== b && b.it) { + var c = this.handle.Pf, d = b.l(c - 1), e = b.l(c), f = b.l(c + 1); + if (b.dc) { + if (c > b.Bs + 1 && c < b.lw - 1) { + var h = b.l(c - 2); + if (Math.abs(d.x - e.x) < this.gh && Math.abs(d.y - e.y) < this.gh && (lh(this, h, d, e, f, !0) || lh(this, h, d, e, f, !1))) { + var k = b.points.copy(); + lh(this, h, d, e, f, !0) ? (k.Bg(c - 2, new w(h.x, (f.y + h.y) / 2)), k.Bg(c + 1, new w(f.x, (f.y + h.y) / 2))) : (k.Bg(c - 2, new w((f.x + h.x) / 2, h.y)), k.Bg(c + 1, + new w((f.x + h.x) / 2, f.y))); + k.hd(c); + k.hd(c - 1); + b.points = k; + b.Zd() + } else h = b.l(c + 2), Math.abs(e.x - f.x) < this.gh && Math.abs(e.y - f.y) < this.gh && (lh(this, d, e, f, h, !0) || lh(this, d, e, f, h, !1)) && (k = b.points.copy(), lh(this, d, e, f, h, !0) ? (k.Bg(c - 1, new w(d.x, (d.y + h.y) / 2)), k.Bg(c + 2, new w(h.x, (d.y + h.y) / 2))) : (k.Bg(c - 1, new w((d.x + h.x) / 2, d.y)), k.Bg(c + 2, new w((d.x + h.x) / 2, h.y))), k.hd(c + 1), k.hd(c), b.points = k, b.Zd()) + } + } else h = u.K(), K.Hm(d.x, d.y, f.x, f.y, e.x, e.y, h) && h.Lj(e) < this.gh * this.gh && (k = b.points.copy(), k.hd(c), b.points = k, b.Zd()), + u.v(h) + } + a.pc(); + this.zf = this.name; + a.za("LinkReshaped", this.fs) + } + this.stopTool() + }; + + function lh(a, b, c, d, e, f) { + return f ? Math.abs(b.y - c.y) < a.gh && Math.abs(c.y - d.y) < a.gh && Math.abs(d.y - e.y) < a.gh : Math.abs(b.x - c.x) < a.gh && Math.abs(c.x - d.x) < a.gh && Math.abs(d.x - e.x) < a.gh + } + + u.defineProperty(fh, {gh: "resegmentingDistance"}, function () { + return this.ZB + }, function (a) { + u.j(a, "number", fh, "resegmentingDistance"); + this.ZB = a + }); + fh.prototype.reshape = function (a) { + var b = this.fs; + b.rl(); + var c = this.handle.Pf, d = this.AD(this.handle); + if (b.dc) if (c === b.Bs + 1) c = b.Bs + 1, d === ih ? (b.V(c, b.l(c - 1).x, a.y), b.V(c + 1, b.l(c + 2).x, a.y)) : d === hh && (b.V(c, a.x, b.l(c - 1).y), b.V(c + 1, a.x, b.l(c + 2).y)); else if (c === b.lw - 1) c = b.lw - 1, d === ih ? (b.V(c - 1, b.l(c - 2).x, a.y), b.V(c, b.l(c + 1).x, a.y)) : d === hh && (b.V(c - 1, a.x, b.l(c - 2).y), b.V(c, a.x, b.l(c + 1).y)); else { + var d = c, e = b.l(d), f = b.l(d - 1), h = b.l(d + 1); + K.D(f.x, e.x) && K.D(e.y, h.y) ? (K.D(f.x, b.l(d - 2).x) && !K.D(f.y, b.l(d - 2).y) ? (b.w(d, a.x, + f.y), c++, d++) : b.V(d - 1, a.x, f.y), K.D(h.y, b.l(d + 2).y) && !K.D(h.x, b.l(d + 2).x) ? b.w(d + 1, h.x, a.y) : b.V(d + 1, h.x, a.y)) : K.D(f.y, e.y) && K.D(e.x, h.x) ? (K.D(f.y, b.l(d - 2).y) && !K.D(f.x, b.l(d - 2).x) ? (b.w(d, f.x, a.y), c++, d++) : b.V(d - 1, f.x, a.y), K.D(h.x, b.l(d + 2).x) && !K.D(h.y, b.l(d + 2).y) ? b.w(d + 1, a.x, h.y) : b.V(d + 1, a.x, h.y)) : K.D(f.x, e.x) && K.D(e.x, h.x) ? (K.D(f.x, b.l(d - 2).x) && !K.D(f.y, b.l(d - 2).y) ? (b.w(d, a.x, f.y), c++, d++) : b.V(d - 1, a.x, f.y), K.D(h.x, b.l(d + 2).x) && !K.D(h.y, b.l(d + 2).y) ? b.w(d + 1, a.x, h.y) : b.V(d + 1, a.x, h.y)) : K.D(f.y, e.y) && K.D(e.y, + h.y) && (K.D(f.y, b.l(d - 2).y) && !K.D(f.x, b.l(d - 2).x) ? (b.w(d, f.x, a.y), c++, d++) : b.V(d - 1, f.x, a.y), K.D(h.y, b.l(d + 2).y) && !K.D(h.x, b.l(d + 2).x) ? b.w(d + 1, h.x, a.y) : b.V(d + 1, h.x, a.y)); + b.V(c, a.x, a.y) + } else b.V(c, a.x, a.y), 1 === c && b.computeSpot(!0).ne() && (e = b.W, f = b.od, null === e || e.Ea() || (e = e.findVisibleNode(), e !== b.W && (f = e.Xk(""))), d = f.lb(Ib, u.K()), e = b.getLinkPointFromPoint(e, f, d, a, !0, u.K()), b.V(0, e.x, e.y), u.v(d), u.v(e)), c === b.ka - 2 && b.computeSpot(!1).ne() && (c = b.ca, e = b.fe, null === c || c.Ea() || (c = c.findVisibleNode(), c !== b.ca && + (e = c.Xk(""))), d = e.lb(Ib, u.K()), e = b.getLinkPointFromPoint(c, e, d, a, !1, u.K()), b.V(b.ka - 1, e.x, e.y), u.v(d), u.v(e)); + b.Bi() + }; + fh.prototype.computeReshape = function (a) { + var b = this.fs, c = this.handle.Pf; + switch (this.AD(this.handle)) { + case jh: + return a; + case ih: + return b = b.l(c), new w(b.x, a.y); + case hh: + return b = b.l(c), new w(a.x, b.y); + default: + case gh: + return b.l(c) + } + }; + u.u(fh, {hK: "originalPoint"}, function () { + return this.RB + }); + u.u(fh, {iK: "originalPoints"}, function () { + return this.my + }); + + function mh() { + 0 < arguments.length && u.Wc(mh); + xe.call(this); + this.name = "Resizing"; + this.nj = (new ia(1, 1)).freeze(); + this.lj = (new ia(9999, 9999)).freeze(); + this.Ti = (new ia(NaN, NaN)).freeze(); + this.iq = !1; + this.Gb = null; + var a = new X; + a.Hj = Ib; + a.Fb = "Rectangle"; + a.xa = K.mp; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.hb = 1; + a.cursor = "pointer"; + this.pk = a; + this.Yb = null; + this.Tu = new ia; + this.ly = new w; + this.Jx = new ia(0, 0); + this.Ix = new ia(Infinity, Infinity); + this.Hx = new ia(1, 1); + this.KB = !0 + } + + u.Ga(mh, xe); + u.fa("ResizingTool", mh); + mh.prototype.updateAdornments = function (a) { + if (!(null === a || a instanceof W)) { + if (a.Za && !this.g.nb) { + var b = a.sE; + if (null !== b && a.canResize() && a.ba.J() && a.Ea() && b.ba.J() && b.kl()) { + var c = a.xo(this.name); + null === c && (c = this.makeAdornment(b)); + if (null !== c) { + var d = b.Zk(); + c.angle = d; + var e = b.lb(c.Ze, u.K()), f = b.Hi(); + c.location = e; + u.v(e); + e = c.placeholder; + if (null !== e) { + var b = b.Ha, h = u.ul(); + h.m(b.width * f, b.height * f); + e.xa = h; + u.Oj(h) + } + nh(this, c, d); + a.Kk(this.name, c); + return + } + } + } + a.ol(this.name) + } + }; + mh.prototype.makeAdornment = function (a) { + var b = null, b = a.T.rE; + if (null === b) { + b = new lf; + b.type = oh; + b.Ze = Ib; + var c = new ph; + c.tg = !0; + b.add(c); + b.add(this.makeHandle(a, xb)); + b.add(this.makeHandle(a, Gb)); + b.add(this.makeHandle(a, Vb)); + b.add(this.makeHandle(a, Kb)); + b.add(this.makeHandle(a, vc)); + b.add(this.makeHandle(a, xc)); + b.add(this.makeHandle(a, Cc)); + b.add(this.makeHandle(a, wc)) + } else if (nf(b), b = b.copy(), null === b) return null; + b.Kc = this.name; + b.vc = a; + return b + }; + mh.prototype.makeHandle = function (a, b) { + var c = this.Hs; + if (null === c) return null; + c = c.copy(); + c.alignment = b; + return c + }; + + function nh(a, b, c) { + if (null !== b) if (!b.alignment.Lc() && "" !== b.cursor) a:{ + a = b.alignment; + a.ne() && (a = Ib); + if (0 >= a.x) c = 0 >= a.y ? c + 225 : 1 <= a.y ? c + 135 : c + 180; else if (1 <= a.x) 0 >= a.y ? c += 315 : 1 <= a.y && (c += 45); else if (0 >= a.y) c += 270; else if (1 <= a.y) c += 90; else break a; + 0 > c ? c += 360 : 360 <= c && (c -= 360); + b.cursor = 22.5 > c ? "e-resize" : 67.5 > c ? "se-resize" : 112.5 > c ? "s-resize" : 157.5 > c ? "sw-resize" : 202.5 > c ? "w-resize" : 247.5 > c ? "nw-resize" : 292.5 > c ? "n-resize" : 337.5 > c ? "ne-resize" : "e-resize" + } else if (b instanceof A) for (b = b.elements; b.next();) nh(a, + b.value, c) + } + + u.defineProperty(mh, {Hs: "handleArchetype"}, function () { + return this.pk + }, function (a) { + null !== a && u.C(a, S, mh, "handleArchetype"); + this.pk = a + }); + u.u(mh, {handle: "handle"}, function () { + return this.Yb + }); + u.defineProperty(mh, {vc: "adornedObject"}, function () { + return this.Gb + }, function (a) { + null !== a && u.C(a, S, mh, "adornedObject"); + this.Gb = a + }); + mh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null !== a && !a.nb && a.hs && a.N.left ? null !== this.findToolHandleAt(a.wc.da, this.name) ? !0 : !1 : !1 + }; + mh.prototype.doActivate = function () { + var a = this.g; + null !== a && (this.Yb = this.findToolHandleAt(a.wc.da, this.name), null !== this.Yb && (this.Gb = this.Yb.T.vc, this.ly.set(this.Gb.T.location), this.Tu.set(this.Gb.xa), this.Hx = this.computeCellSize(), this.Jx = this.computeMinSize(), this.Ix = this.computeMaxSize(), a.Ge = !0, this.KB = a.Lb.isEnabled, a.Lb.isEnabled = !1, this.Wb(this.name), this.na = !0)) + }; + mh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (this.Uj(), this.Gb = this.Yb = null, this.na = a.Ge = !1, a.Lb.isEnabled = this.KB) + }; + mh.prototype.doCancel = function () { + this.Gb.xa = this.Tu; + this.Gb.T.location = this.ly; + this.stopTool() + }; + mh.prototype.doMouseMove = function () { + var a = this.g; + if (this.na && null !== a) { + var b = this.Jx, c = this.Ix, d = this.Hx, e = this.Gb.zD(a.N.da, u.K()), f = qh; + this.Gb instanceof X && (f = rh(this.Gb)); + b = this.computeResize(e, this.Yb.alignment, b, c, d, !(f === sh || f === th || a.N.shift)); + this.resize(b); + a.bf(); + u.v(e) + } + }; + mh.prototype.doMouseUp = function () { + var a = this.g; + if (this.na && null !== a) { + var b = this.Jx, c = this.Ix, d = this.Hx, e = this.Gb.zD(a.N.da, u.K()), f = qh; + this.Gb instanceof X && (f = rh(this.Gb)); + b = this.computeResize(e, this.Yb.alignment, b, c, d, !(f === sh || f === th || a.N.shift)); + this.resize(b); + u.v(e); + a.pc(); + this.zf = this.name; + a.za("PartResized", this.Gb, this.Tu) + } + this.stopTool() + }; + mh.prototype.resize = function (a) { + if (null !== this.g) { + var b = this.vc, c = b.T, d = b.Zk(), e = b.Hi(), f = Math.PI * d / 180, h = Math.cos(f), f = Math.sin(f), + k = 0 < d && 180 > d ? 1 : 0, l = 90 < d && 270 > d ? 1 : 0, d = 180 < d && 360 > d ? 1 : 0, + m = b.Ha.width, n = b.Ha.height; + b.xa = a.size; + var p = c.position.copy(); + c.pf(); + m = b.Ha.width - m; + n = b.Ha.height - n; + if (0 !== m || 0 !== n) 0 !== m && (p.x += e * ((a.x + m * l) * h - (a.y + n * k) * f)), 0 !== n && (p.y += e * ((a.x + m * d) * f + (a.y + n * l) * h)), c.move(p) + } + }; + mh.prototype.computeResize = function (a, b, c, d, e, f) { + b.ne() && (b = Ib); + var h = this.vc.Ha, k = h.x, l = h.y, m = h.x + h.width, n = h.y + h.height, p = 1; + if (!f) { + var p = h.width, q = h.height; + 0 >= p && (p = 1); + 0 >= q && (q = 1); + p = q / p + } + q = u.K(); + K.xs(a.x, a.y, k, l, e.width, e.height, q); + a = h.copy(); + 0 >= b.x ? 0 >= b.y ? (a.x = Math.max(q.x, m - d.width), a.x = Math.min(a.x, m - c.width), a.width = Math.max(m - a.x, c.width), a.y = Math.max(q.y, n - d.height), a.y = Math.min(a.y, n - c.height), a.height = Math.max(n - a.y, c.height), f || (b = a.height / a.width, p < b ? (a.height = p * a.width, a.y = n - a.height) : + (a.width = a.height / p, a.x = m - a.width))) : 1 <= b.y ? (a.x = Math.max(q.x, m - d.width), a.x = Math.min(a.x, m - c.width), a.width = Math.max(m - a.x, c.width), a.height = Math.max(Math.min(q.y - l, d.height), c.height), f || (b = a.height / a.width, p < b ? a.height = p * a.width : (a.width = a.height / p, a.x = m - a.width))) : (a.x = Math.max(q.x, m - d.width), a.x = Math.min(a.x, m - c.width), a.width = m - a.x, f || (a.height = p * a.width, a.y = l + .5 * (n - l - a.height))) : 1 <= b.x ? 0 >= b.y ? (a.width = Math.max(Math.min(q.x - k, d.width), c.width), a.y = Math.max(q.y, n - d.height), a.y = Math.min(a.y, n - + c.height), a.height = Math.max(n - a.y, c.height), f || (b = a.height / a.width, p < b ? (a.height = p * a.width, a.y = n - a.height) : a.width = a.height / p)) : 1 <= b.y ? (a.width = Math.max(Math.min(q.x - k, d.width), c.width), a.height = Math.max(Math.min(q.y - l, d.height), c.height), f || (b = a.height / a.width, p < b ? a.height = p * a.width : a.width = a.height / p)) : (a.width = Math.max(Math.min(q.x - k, d.width), c.width), f || (a.height = p * a.width, a.y = l + .5 * (n - l - a.height))) : 0 >= b.y ? (a.y = Math.max(q.y, n - d.height), a.y = Math.min(a.y, n - c.height), a.height = n - a.y, f || (a.width = a.height / + p, a.x = k + .5 * (m - k - a.width))) : 1 <= b.y && (a.height = Math.max(Math.min(q.y - l, d.height), c.height), f || (a.width = a.height / p, a.x = k + .5 * (m - k - a.width))); + u.v(q); + return a + }; + mh.prototype.computeMinSize = function () { + var a = this.vc.vg.copy(), b = this.vg; + !isNaN(b.width) && b.width > a.width && (a.width = b.width); + !isNaN(b.height) && b.height > a.height && (a.height = b.height); + return a + }; + mh.prototype.computeMaxSize = function () { + var a = this.vc.af.copy(), b = this.af; + !isNaN(b.width) && b.width < a.width && (a.width = b.width); + !isNaN(b.height) && b.height < a.height && (a.height = b.height); + return a + }; + mh.prototype.computeCellSize = function () { + var a = new ia(NaN, NaN), b = this.vc.T; + if (null !== b) { + var c = b.VH; + !isNaN(c.width) && 0 < c.width && (a.width = c.width); + !isNaN(c.height) && 0 < c.height && (a.height = c.height) + } + c = this.qo; + isNaN(a.width) && !isNaN(c.width) && 0 < c.width && (a.width = c.width); + isNaN(a.height) && !isNaN(c.height) && 0 < c.height && (a.height = c.height); + b = this.g; + (isNaN(a.width) || isNaN(a.height)) && b && (c = b.tb.Ed, null !== c && c.gw && (c = c.DD, isNaN(a.width) && !isNaN(c.width) && 0 < c.width && (a.width = c.width), isNaN(a.height) && !isNaN(c.height) && + 0 < c.height && (a.height = c.height)), b = b.Gs, null !== b && b.visible && this.gw && (c = b.aw, isNaN(a.width) && !isNaN(c.width) && 0 < c.width && (a.width = c.width), isNaN(a.height) && !isNaN(c.height) && 0 < c.height && (a.height = c.height))); + if (isNaN(a.width) || 0 === a.width || Infinity === a.width) a.width = 1; + if (isNaN(a.height) || 0 === a.height || Infinity === a.height) a.height = 1; + return a + }; + u.defineProperty(mh, {vg: "minSize"}, function () { + return this.nj + }, function (a) { + u.C(a, ia, mh, "minSize"); + if (!this.nj.L(a)) { + var b = a.width; + isNaN(b) && (b = 0); + a = a.height; + isNaN(a) && (a = 0); + this.nj.m(b, a) + } + }); + u.defineProperty(mh, {af: "maxSize"}, function () { + return this.lj + }, function (a) { + u.C(a, ia, mh, "maxSize"); + if (!this.lj.L(a)) { + var b = a.width; + isNaN(b) && (b = Infinity); + a = a.height; + isNaN(a) && (a = Infinity); + this.lj.m(b, a) + } + }); + u.defineProperty(mh, {qo: "cellSize"}, function () { + return this.Ti + }, function (a) { + u.C(a, ia, mh, "cellSize"); + this.Ti.L(a) || this.Ti.assign(a) + }); + u.defineProperty(mh, {gw: "isGridSnapEnabled"}, function () { + return this.iq + }, function (a) { + u.j(a, "boolean", mh, "isGridSnapEnabled"); + this.iq = a + }); + u.u(mh, {fK: "originalDesiredSize"}, function () { + return this.Tu + }); + u.u(mh, {gK: "originalLocation"}, function () { + return this.ly + }); + + function uh() { + 0 < arguments.length && u.Wc(uh); + xe.call(this); + this.name = "Rotating"; + this.gC = 45; + this.fC = 2; + this.Gb = null; + var a = new X; + a.Fb = "Ellipse"; + a.xa = K.Qw; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.hb = 1; + a.cursor = "pointer"; + this.pk = a; + this.Yb = null; + this.Su = 0; + this.aC = new w + } + + u.Ga(uh, xe); + u.fa("RotatingTool", uh); + uh.prototype.updateAdornments = function (a) { + if (!(null === a || a instanceof W)) { + if (a.Za && !this.g.nb) { + var b = a.vE; + if (null !== b && a.canRotate() && a.ba.J() && a.Ea() && b.ba.J() && b.kl()) { + var c = a.xo(this.name); + null === c && (c = this.makeAdornment(b)); + if (null !== c) { + c.angle = b.Zk(); + var d = null, e = null; + b === a || b === a.ec ? (d = a.ec, e = a.Ze) : (d = b, e = Ib); + for (var f = d.Ha, e = u.fc(f.width * e.x + e.offsetX, f.height * e.y + e.offsetY); null !== d && d !== b;) d.transform.ab(e), d = d.S; + var d = e.y, f = Math.max(e.x - b.Ha.width, 0), h = u.K(); + c.location = b.lb(new L(1, 0, 50 + + f, d), h); + u.v(h); + u.v(e); + a.Kk(this.name, c); + return + } + } + } + a.ol(this.name) + } + }; + uh.prototype.makeAdornment = function (a) { + var b = null, b = a.T.YH; + if (null === b) { + b = new lf; + b.type = vh; + b.Ze = Ib; + var c = this.Hs; + null !== c && b.add(c.copy()) + } else if (nf(b), b = b.copy(), null === b) return null; + b.Kc = this.name; + b.vc = a; + return b + }; + u.defineProperty(uh, {Hs: "handleArchetype"}, function () { + return this.pk + }, function (a) { + null !== a && u.C(a, S, uh, "handleArchetype"); + this.pk = a + }); + u.u(uh, {handle: "handle"}, function () { + return this.Yb + }); + u.defineProperty(uh, {vc: "adornedObject"}, function () { + return this.Gb + }, function (a) { + null !== a && u.C(a, S, uh, "adornedObject"); + this.Gb = a + }); + uh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null !== a && !a.nb && a.Dv && a.N.left ? null !== this.findToolHandleAt(a.wc.da, this.name) ? !0 : !1 : !1 + }; + uh.prototype.doActivate = function () { + var a = this.g; + if (null !== a && (this.Yb = this.findToolHandleAt(a.wc.da, this.name), null !== this.Yb)) { + this.Gb = this.Yb.T.vc; + var b = this.Gb.T, c = b.ec; + this.aC = this.Gb === b || this.Gb === c ? c.lb(b.Ze) : this.Gb.lb(Ib); + this.Su = this.Gb.angle; + a.Ge = !0; + a.az = !0; + this.Wb(this.name); + this.na = !0 + } + }; + uh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (this.Uj(), this.Gb = this.Yb = null, this.na = a.Ge = !1) + }; + uh.prototype.doCancel = function () { + var a = this.g; + null !== a && (a.az = !1); + this.rotate(this.Su); + this.stopTool() + }; + uh.prototype.doMouseMove = function () { + var a = this.g; + this.na && null !== a && (a = this.computeRotate(a.N.da), this.rotate(a)) + }; + uh.prototype.doMouseUp = function () { + var a = this.g; + if (this.na && null !== a) { + a.az = !1; + var b = this.computeRotate(a.N.da); + this.rotate(b); + a.pc(); + this.zf = this.name; + a.za("PartRotated", this.Gb, this.Su) + } + this.stopTool() + }; + uh.prototype.rotate = function (a) { + null !== this.Gb && (this.Gb.angle = a) + }; + uh.prototype.computeRotate = function (a) { + a = this.aC.Fi(a); + var b = this.Gb.S; + null !== b && (a -= b.Zk(), 360 <= a ? a -= 360 : 0 > a && (a += 360)); + var b = Math.min(Math.abs(this.mI), 180), c = Math.min(Math.abs(this.lI), b / 2); + !this.g.N.shift && 0 < b && 0 < c && (a % b < c ? a = Math.floor(a / b) * b : a % b > b - c && (a = (Math.floor(a / b) + 1) * b)); + 360 <= a ? a -= 360 : 0 > a && (a += 360); + return a + }; + u.defineProperty(uh, {mI: "snapAngleMultiple"}, function () { + return this.gC + }, function (a) { + u.j(a, "number", uh, "snapAngleMultiple"); + this.gC = a + }); + u.defineProperty(uh, {lI: "snapAngleEpsilon"}, function () { + return this.fC + }, function (a) { + u.j(a, "number", uh, "snapAngleEpsilon"); + this.fC = a + }); + u.u(uh, {eK: "originalAngle"}, function () { + return this.Su + }); + + function wh() { + 0 < arguments.length && u.Wc(wh); + xe.call(this); + this.name = "ClickSelecting" + } + + u.Ga(wh, xe); + u.fa("ClickSelectingTool", wh); + wh.prototype.canStart = function () { + return !this.isEnabled || null === this.g || this.isBeyondDragSize() ? !1 : !0 + }; + wh.prototype.doMouseUp = function () { + this.na && (this.standardMouseSelect(), this.standardMouseClick()); + this.stopTool() + }; + + function xh() { + 0 < arguments.length && u.Wc(xh); + xe.call(this); + this.name = "Action"; + this.Um = null + } + + u.Ga(xh, xe); + u.fa("ActionTool", xh); + xh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a) return !1; + var b = a.N, c = a.ke(b.da, function (a) { + for (; null !== a.S && !a.pz;) a = a.S; + return a + }, function (a) { + return a.pz + }); + return null !== c ? (this.Um = c, a.en = a.ke(b.da, null, null), !0) : !1 + }; + xh.prototype.doMouseDown = function () { + if (this.na) { + var a = this.g.N, b = this.Um; + null !== b && (a.pe = b, null !== b.HC && b.HC(a, b)) + } else this.canStart() && this.doActivate() + }; + xh.prototype.doMouseMove = function () { + if (this.na) { + var a = this.g.N, b = this.Um; + null !== b && (a.pe = b, null !== b.IC && b.IC(a, b)) + } + }; + xh.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g, b = a.N, c = this.Um; + if (null === c) return; + b.pe = c; + null !== c.JC && c.JC(b, c); + this.isBeyondDragSize() || zf(c, b, a) + } + this.stopTool() + }; + xh.prototype.doCancel = function () { + var a = this.g; + if (null !== a) { + var a = a.N, b = this.Um; + if (null === b) return; + a.pe = b; + null !== b.GC && b.GC(a, b) + } + this.stopTool() + }; + xh.prototype.doStop = function () { + this.Um = null + }; + + function va() { + 0 < arguments.length && u.Wc(va); + xe.call(this); + this.name = "ClickCreating"; + this.ik = null; + this.qB = !0; + this.fB = new w(0, 0) + } + + u.Ga(va, xe); + u.fa("ClickCreatingTool", va); + va.prototype.canStart = function () { + if (!this.isEnabled || null === this.Oy) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.lo || !a.N.left || this.isBeyondDragSize()) return !1; + if (this.ZG) { + if (1 === a.N.Te && (this.fB = a.N.ff.copy()), 2 !== a.N.Te || this.isBeyondDragSize(this.fB)) return !1 + } else if (1 !== a.N.Te) return !1; + return a.Va !== this && null !== a.zs(a.N.da, !0) ? !1 : !0 + }; + va.prototype.doMouseUp = function () { + var a = this.g; + this.na && null !== a && this.insertPart(a.N.da); + this.stopTool() + }; + va.prototype.insertPart = function (a) { + var b = this.g; + if (null === b) return null; + var c = this.Oy; + if (null === c) return null; + this.Wb(this.name); + var d = null; + c instanceof G ? c.Fd() && (nf(c), d = c.copy(), null !== d && b.add(d)) : null !== c && (c = b.ga.copyNodeData(c), u.Sa(c) && (b.ga.km(c), d = b.Nh(c))); + null !== d && (d.location = a, b.of && b.select(d)); + b.pc(); + this.zf = this.name; + b.za("PartCreated", d); + this.Uj(); + return d + }; + u.defineProperty(va, {Oy: "archetypeNodeData"}, function () { + return this.ik + }, function (a) { + null !== a && u.C(a, Object, va, "archetypeNodeData"); + this.ik = a + }); + u.defineProperty(va, {ZG: "isDoubleClick"}, function () { + return this.qB + }, function (a) { + u.j(a, "boolean", va, "isDoubleClick"); + this.qB = a + }); + + function Hh(a, b, c) { + this.text = a; + this.ZC = b; + this.visible = c + } + + function Ih() { + 0 < arguments.length && u.Wc(Ih); + xe.call(this); + this.name = "ContextMenu"; + this.fn = this.OA = null; + this.HB = new w; + this.xx = this.on = null; + Jh(this) + } + + u.Ga(Ih, xe); + u.fa("ContextMenuTool", Ih); + u.hD = !1; + u.ms = null; + u.ns = null; + + function Jh(a) { + a.on = new lf; + a.xC = function () { + a.stopTool() + }; + if (!1 === u.hD) { + var b = u.createElement("div"), c = u.createElement("div"); + b.style.cssText = "top: 0px;z-index:300;position: fixed;display: none;text-align: center;left: 25%;width: 50%;background-color: #F5F5F5;padding: 16px;border: 16px solid #444;border-radius: 10px;margin-top: 10px"; + c.style.cssText = "z-index:299;position: fixed;display: none;top: 0;left: 0;width: 100%;height: 100%;background-color: black;-moz-opacity: 0.8;opacity:.80;filter: alpha(opacity=80);"; + var d = + u.createElement("style"); + window.document.getElementsByTagName("head")[0].appendChild(d); + d.sheet.insertRule(".defaultCXul { list-style: none; }", 0); + d.sheet.insertRule(".defaultCXli {font:700 1.5em Helvetica, Arial, sans-serif;position: relative;min-width: 60px; }", 0); + d.sheet.insertRule(".defaultCXa {color: #444;display: inline-block;padding: 4px;text-decoration: none;margin: 2px;border: 1px solid gray;border-radius: 10px; }", 0); + b.addEventListener("contextmenu", function (a) { + a.preventDefault(); + return !1 + }, + !1); + b.addEventListener("selectstart", function (a) { + a.preventDefault(); + return !1 + }, !1); + c.addEventListener("contextmenu", function (a) { + a.preventDefault(); + return !1 + }, !1); + window.document.body && (window.document.body.appendChild(b), window.document.body.appendChild(c)); + u.ns = b; + u.ms = c; + u.hD = !0 + } + } + + Ih.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null === a || this.isBeyondDragSize() || !a.N.right ? !1 : null !== this.on && a.N.jl || null !== this.findObjectWithContextMenu() ? !0 : !1 + }; + Ih.prototype.doStart = function () { + var a = this.g; + null !== a && this.HB.set(a.wc.da) + }; + Ih.prototype.doStop = function () { + this.hideDefaultContextMenu(); + this.hideContextMenu(); + this.fn = null + }; + Ih.prototype.findObjectWithContextMenu = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return null; + var c = b.N, d = null; + a instanceof D || (d = a instanceof S ? a : b.ke(c.da, null, function (a) { + return !a.layer.Ac + })); + if (null !== d) { + for (a = d; null !== a;) { + c = a.contextMenu; + if (null !== c) return a; + a = a.S + } + if (null !== this.on && b.N.jl) return d.T + } else if (c = b.contextMenu, null !== c) return b; + return null + }; + Ih.prototype.doActivate = function () { + }; + Ih.prototype.doMouseUp = function () { + var a = this.g; + null !== a && (this.na ? null !== this.Hf && (a = a.ke(a.N.da, null, null), null !== a && a.gl(this.Hf) && this.standardMouseClick(null, null), this.stopTool()) : this.canStart() && xf(this, !0)) + }; + + function xf(a, b, c) { + void 0 === c && (c = null); + a.na = !0; + b && a.standardMouseSelect(); + a.standardMouseClick(); + a.fn = null; + null === c && (c = a.findObjectWithContextMenu()); + null !== c ? (b = c.contextMenu, null !== b ? (a.fn = c instanceof S ? c : null, a.showContextMenu(b, a.fn)) : a.showDefaultContextMenu()) : a.showDefaultContextMenu() + } + + Ih.prototype.doMouseMove = function () { + this.na && this.standardMouseOver() + }; + Ih.prototype.showContextMenu = function (a, b) { + u.C(a, lf, Ih, "showContextMenu:contextmenu"); + null !== b && u.C(b, S, Ih, "showContextMenu:obj"); + var c = this.g; + if (null !== c) { + a !== this.Hf && this.hideContextMenu(); + a.wf = "Tool"; + a.pl = !1; + a.scale = 1 / c.scale; + a.Kc = this.name; + c.add(a); + if (null !== b) { + var c = null, d = b.zo(); + null !== d && (c = d.data); + a.vc = b; + a.data = c + } else a.data = c.ga; + a.pf(); + this.positionContextMenu(a, b); + this.Hf = a + } + }; + Ih.prototype.positionContextMenu = function (a) { + if (null === a.placeholder) { + var b = this.g; + if (null !== b) { + var c = b.N.da.copy(), d = a.Ba, e = b.ob; + b.N.jl && (c.x -= d.width); + c.x + d.width > e.right && (c.x -= d.width + 5); + c.x < e.x && (c.x = e.x); + c.y + d.height > e.bottom && (c.y -= d.height + 5); + c.y < e.y && (c.y = e.y); + a.position = c + } + } + }; + Ih.prototype.hideContextMenu = function () { + var a = this.g; + null !== a && null !== this.Hf && (this.Hf.data = null, this.Hf.vc = null, a.remove(this.Hf), this.Hf = null, this.standardMouseOver()) + }; + Ih.prototype.initializeDefaultButtons = function () { + if (null === this.g) return null; + var a = new E(Hh); + a.add(new Hh("Copy", function (a) { + a.Eb.copySelection() + }, function (a) { + return a.Eb.canCopySelection() + })); + a.add(new Hh("Cut", function (a) { + a.Eb.cutSelection() + }, function (a) { + return a.Eb.canCutSelection() + })); + a.add(new Hh("Delete", function (a) { + a.Eb.deleteSelection() + }, function (a) { + return a.Eb.canDeleteSelection() + })); + a.add(new Hh("Paste", function (a) { + a.Eb.pasteSelection(a.N.da) + }, function (a) { + return a.Eb.canPasteSelection() + })); + a.add(new Hh("Select All", function (a) { + a.Eb.selectAll() + }, function (a) { + return a.Eb.canSelectAll() + })); + a.add(new Hh("Undo", function (a) { + a.Eb.undo() + }, function (a) { + return a.Eb.canUndo() + })); + a.add(new Hh("Redo", function (a) { + a.Eb.redo() + }, function (a) { + return a.Eb.canRedo() + })); + a.add(new Hh("Zoom To Fit", function (a) { + a.Eb.zoomToFit() + }, function (a) { + return a.Eb.canZoomToFit() + })); + a.add(new Hh("Reset Zoom", function (a) { + a.Eb.resetZoom() + }, function (a) { + return a.Eb.canResetZoom() + })); + a.add(new Hh("Group Selection", function (a) { + a.Eb.groupSelection() + }, + function (a) { + return a.Eb.canGroupSelection() + })); + a.add(new Hh("Ungroup Selection", function (a) { + a.Eb.ungroupSelection() + }, function (a) { + return a.Eb.canUngroupSelection() + })); + a.add(new Hh("Edit Text", function (a) { + a.Eb.editTextBlock() + }, function (a) { + return a.Eb.canEditTextBlock() + })); + return a + }; + Ih.prototype.showDefaultContextMenu = function () { + var a = this.g; + if (null !== a) { + null === this.xx && (this.xx = this.initializeDefaultButtons()); + this.on !== this.Hf && this.hideContextMenu(); + u.ns.innerHTML = ""; + u.ms.addEventListener("click", this.xC, !1); + var b = this, c = u.createElement("ul"); + c.className = "defaultCXul"; + u.ns.appendChild(c); + c.innerHTML = ""; + for (var d = this.xx.i; d.next();) { + var e = d.value, f = e.text, h = e.visible; + if ("function" === typeof e.ZC && ("function" !== typeof h || h(a))) { + h = u.createElement("li"); + h.className = "defaultCXli"; + var k = u.createElement("a"); + k.className = "defaultCXa"; + k.href = "#"; + k.nF = e.ZC; + k.addEventListener("click", function (c) { + this.nF(a); + b.stopTool(); + c.preventDefault(); + return !1 + }, !1); + k.textContent = f; + h.appendChild(k); + c.appendChild(h) + } + } + u.ns.style.display = "block"; + u.ms.style.display = "block"; + this.Hf = this.on + } + }; + Ih.prototype.hideDefaultContextMenu = function () { + null !== this.Hf && this.Hf === this.on && (u.ns.style.display = "none", u.ms.style.display = "none", u.ms.removeEventListener("click", this.xC, !1), this.Hf = null) + }; + u.defineProperty(Ih, {Hf: "currentContextMenu"}, function () { + return this.OA + }, function (a) { + null !== a && u.C(a, lf, Ih, "currentContextMenu"); + this.OA = a + }); + u.defineProperty(Ih, {hJ: "currentObject"}, function () { + return this.fn + }, function (a) { + null !== a && u.C(a, S, Ih, "currentObject"); + this.fn = a + }); + u.u(Ih, {$J: "mouseDownPoint"}, function () { + return this.HB + }); + + function Kh() { + 0 < arguments.length && u.Wc(Kh); + xe.call(this); + this.name = "DragSelecting"; + this.pn = 175; + this.vB = !1; + var a = new G; + a.wf = "Tool"; + a.pl = !1; + var b = new X; + b.name = "SHAPE"; + b.Fb = "Rectangle"; + b.fill = null; + b.stroke = "magenta"; + a.add(b); + this.zl = a + } + + u.Ga(Kh, xe); + u.fa("DragSelectingTool", Kh); + Kh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || !a.of) return !1; + var b = a.N; + return !b.left || a.Va !== this && (!this.isBeyondDragSize() || b.timestamp - a.wc.timestamp < this.iD || null !== a.zs(b.da, !0)) ? !1 : !0 + }; + Kh.prototype.doActivate = function () { + var a = this.g; + null !== a && (this.na = !0, a.Ge = !0, a.cb = !0, a.add(this.Tg), this.doMouseMove()) + }; + Kh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (a.remove(this.Tg), a.cb = !1, this.na = a.Ge = !1) + }; + Kh.prototype.doMouseMove = function () { + if (null !== this.g && this.na && null !== this.Tg) { + var a = this.computeBoxBounds(), b = this.Tg.je("SHAPE"); + null === b && (b = this.Tg.If()); + b.xa = a.size; + this.Tg.position = a.position + } + }; + Kh.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + a.remove(this.Tg); + try { + a.ac = "wait", this.selectInRect(this.computeBoxBounds()) + } finally { + a.ac = "" + } + } + this.stopTool() + }; + Kh.prototype.computeBoxBounds = function () { + var a = this.g; + return null === a ? new z(0, 0, 0, 0) : new z(a.wc.da, a.N.da) + }; + Kh.prototype.selectInRect = function (a) { + var b = this.g; + if (null !== b) { + var c = b.N; + b.za("ChangingSelection"); + a = b.Nj(a, null, function (a) { + return a instanceof G ? a.canSelect() : !1 + }, this.hH); + if (u.Em ? c.Ys : c.control) if (c.shift) for (a = a.i; a.next();) c = a.value, c.Za && (c.Za = !1); else for (a = a.i; a.next();) c = a.value, c.Za = !c.Za; else { + if (!c.shift) { + for (var c = new E(G), d = b.selection.i; d.next();) { + var e = d.value; + a.contains(e) || c.add(e) + } + for (c = c.i; c.next();) c.value.Za = !1 + } + for (a = a.i; a.next();) c = a.value, c.Za || (c.Za = !0) + } + b.za("ChangedSelection") + } + }; + u.defineProperty(Kh, {iD: "delay"}, function () { + return this.pn + }, function (a) { + u.j(a, "number", Kh, "delay"); + this.pn = a + }); + u.defineProperty(Kh, {hH: "isPartialInclusion"}, function () { + return this.vB + }, function (a) { + u.j(a, "boolean", Kh, "isPartialInclusion"); + this.vB = a + }); + u.defineProperty(Kh, {Tg: "box"}, function () { + return this.zl + }, function (a) { + null !== a && u.C(a, G, Kh, "box"); + this.zl = a + }); + + function Lh() { + 0 < arguments.length && u.Wc(Lh); + xe.call(this); + this.name = "Panning"; + this.ny = new w; + this.Si = !1; + var a = this; + this.lC = function () { + window.document.removeEventListener("scroll", a.lC, !1); + a.stopTool() + } + } + + u.Ga(Lh, xe); + u.fa("PanningTool", Lh); + Lh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null === a || !a.Re && !a.Se || !a.N.left || a.Va !== this && !this.isBeyondDragSize() ? !1 : !0 + }; + Lh.prototype.doActivate = function () { + var a = this.g; + null !== a && (this.Si ? (a.N.bubbles = !0, window.document.addEventListener("scroll", this.lC, !1)) : (a.ac = "move", a.Ge = !0, this.ny = a.position.copy()), this.na = !0) + }; + Lh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (a.ac = "", this.na = a.Ge = !1) + }; + Lh.prototype.doCancel = function () { + var a = this.g; + null !== a && (a.position = this.ny, a.Ge = !1); + this.stopTool() + }; + Lh.prototype.doMouseMove = function () { + this.move() + }; + Lh.prototype.doMouseUp = function () { + this.move(); + this.stopTool() + }; + Lh.prototype.move = function () { + var a = this.g; + if (this.na && a) if (this.Si) a.N.bubbles = !0; else { + var b = a.position, c = a.wc.da, d = a.N.da, e = b.x + c.x - d.x, c = b.y + c.y - d.y; + a.Re || (e = b.x); + a.Se || (c = b.y); + a.position = new w(e, c) + } + }; + u.defineProperty(Lh, {bubbles: "bubbles"}, function () { + return this.Si + }, function (a) { + u.j(a, "boolean", Lh, "bubbles"); + this.Si = a + }); + u.u(Lh, {jK: "originalPosition"}, function () { + return this.ny + }); + + function Mh() { + 0 < arguments.length && u.Wc(Mh); + xe.call(this); + this.name = "TextEditing"; + this.pC = null; + this.Qx = 0; + this.RA = this.pv = null; + this.kC = Nh; + this.Hk = null; + this.Xa = Oh; + this.Dk = null; + this.EB = 1; + this.dC = !0; + var a = u.createElement("textarea"); + a.AA = !0; + this.WA = a; + a.addEventListener("input", function () { + var a = this.textEditingTool, c = a.pC; + c.text = this.value; + Ph(c, a.Qx, Infinity); + this.rows = c.oH + }, !1); + a.addEventListener("keydown", function (a) { + var c = a.which, d = this.textEditingTool; + if (null !== d) if (13 === c) !1 === d.pv.iw && a.preventDefault(), + d.acceptText(Qh); else { + if (9 === c) return d.acceptText(Rh), a.preventDefault(), !1; + 27 === c && (d.doCancel(), null !== d.g && d.g.focus()) + } + }, !1); + a.addEventListener("focus", function () { + var a = this.textEditingTool; + a.Xa === Sh ? a.Xa = Th : a.Xa === Uh ? a.Xa = Vh : a.Xa === Vh && (a.Xa = Th); + "function" === typeof this.select && a.$z && this.select() + }, !1); + a.addEventListener("blur", function () { + "function" === typeof this.focus && this.focus(); + var a = this.textEditingTool; + "function" === typeof this.select && a.$z && this.select() + }, !1) + } + + u.fa("TextEditingTool", Mh); + u.Ga(Mh, xe); + var Wh; + Mh.LostFocus = Wh = u.s(Mh, "LostFocus", 0); + var Xh; + Mh.MouseDown = Xh = u.s(Mh, "MouseDown", 1); + var Rh; + Mh.Tab = Rh = u.s(Mh, "Tab", 2); + var Qh; + Mh.Enter = Qh = u.s(Mh, "Enter", 3); + Mh.SingleClick = u.s(Mh, "SingleClick", 0); + var Nh; + Mh.SingleClickSelected = Nh = u.s(Mh, "SingleClickSelected", 1); + var Oh = u.s(Mh, "StateNone", 0), Sh = u.s(Mh, "StateActive", 1), Th = u.s(Mh, "StateEditing", 2), + Vh = u.s(Mh, "StateEditing2", 3), Yh = u.s(Mh, "StateValidating", 4), Uh = u.s(Mh, "StateValidated", 5); + u.defineProperty(Mh, {kh: "textBlock"}, function () { + return this.pv + }, function (a) { + null !== a && u.C(a, qa, Mh, "textBlock"); + this.pv = a + }); + u.defineProperty(Mh, {mg: "currentTextEditor"}, function () { + return this.RA + }, function (a) { + this.RA = a + }); + u.defineProperty(Mh, {nG: "defaultTextEditor"}, function () { + return this.WA + }, function (a) { + u.C(a, Element, Mh, "defaultTextEditor"); + this.WA = a + }); + u.defineProperty(Mh, {pI: "starting"}, function () { + return this.kC + }, function (a) { + u.rb(a, Mh, Mh, "starting"); + this.kC = a + }); + Mh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || a.nb || !a.N.left || this.isBeyondDragSize()) return !1; + a = a.ke(a.N.da, null, function (a) { + return a instanceof qa + }); + if (null === a || !a.bz || !a.T.canEdit()) return !1; + a = a.T; + return null === a || this.pI === Nh && !a.Za ? !1 : !0 + }; + Mh.prototype.doStart = function () { + this.na || null === this.kh || this.doActivate() + }; + Mh.prototype.doActivate = function () { + if (!this.na) { + var a = this.g; + if (null !== a) { + var b = this.kh; + null === b && (b = a.ke(a.N.da, function (a) { + return a instanceof qa ? a : null + })); + if (null !== b) { + this.kh = b; + var c = b.T; + if (null !== c) { + this.na = !0; + this.Xa = Sh; + var d = this.nG, e = !1; + null !== b.NE && (d = b.NE); + null === d || d.AA || (e = !0); + this.pC = this.kh.copy(); + a.cI(c.ba); + if (d.AA) { + var f = b.lb(Ib), h = a.position, k = a.scale, l = b.Hi() * k; + l < this.YD && (l = this.YD); + this.Qx = b.Ha.width; + var c = this.Qx * l, m = b.Ha.height * l, n = (f.x - h.x) * k, f = (f.y - h.y) * k; + d.value = b.text; + a.Vk.style.font = + b.font; + d.style.font = "inherit"; + d.style.fontSize = 100 * l + "%"; + d.style.lineHeight = "normal"; + d.style.width = c + 6 + "px"; + d.style.height = m + 2 + "px"; + d.style.left = (n - c / 2 | 0) - 1 + "px"; + d.style.top = (f - m / 2 | 0) - 1 + "px"; + d.style.textAlign = b.textAlign; + d.style.margin = "0"; + d.style.padding = "1px"; + d.style.border = "0"; + d.style.outline = "none"; + d.style["white-space"] = "pre-wrap"; + d.style.overflow = "hidden" + } + a.Vk.appendChild(d); + d.style.position = "absolute"; + d.style.zIndex = 100; + d.className = "start"; + d.textEditingTool = this; + d.BK = l; + if (e && "function" === typeof d.onActivate) d.onActivate(); + this.mg = d; + "function" === typeof d.focus && d.focus(); + "function" === typeof d.select && this.$z && d.select() + } + } + } + } + }; + Mh.prototype.doCancel = function () { + null !== this.Dk && (this.mg.style.border = this.Dk, this.Dk = null); + this.stopTool() + }; + Mh.prototype.doMouseUp = function () { + !this.na && this.canStart() && this.doActivate() + }; + Mh.prototype.doMouseDown = function () { + this.na && this.acceptText(Xh) + }; + Mh.prototype.acceptText = function (a) { + switch (a) { + case Xh: + if (this.Xa === Uh || this.Xa === Vh) "function" === typeof this.mg.focus && this.mg.focus(); else if (this.Xa === Sh || this.Xa === Th) this.Xa = Yh, Zh(this); + break; + case Wh: + case Qh: + case Rh: + if (Qh === a && !0 === this.pv.iw) break; + if (this.Xa === Sh || this.Xa === Th) this.Xa = Yh, Zh(this) + } + }; + + function Zh(a) { + if (null !== a.kh && null !== a.mg) { + var b = a.kh, c = a.kh.text, d = a.mg.value, e = "", e = "function" === typeof d ? d() : d; + if (!a.isValidText(a.kh, c, e)) { + a.Xa = Th; + null !== b.cz && b.cz(a, c, e); + null === a.Dk && (a.Dk = a.mg.style.border, a.mg.style.border = "3px solid red"); + "function" === typeof a.mg.focus && a.mg.focus(); + return + } + a.Wb(a.name); + a.Xa = Uh; + c !== e && (a.kh.text = e); + a.zf = a.name; + b = a.g; + null !== b && b.za("TextEdited", a.kh, c); + a.Uj(); + a.stopTool(); + null !== b && b.focus() + } + null !== a.Dk && (a.mg.style.border = a.Dk, a.Dk = null) + } + + Mh.prototype.doDeactivate = function () { + var a = this.g; + if (null !== a) { + this.Xa = Oh; + this.kh = null; + if (null !== this.mg) { + var b = this.mg; + if ("function" === typeof b.onDeactivate) b.onDeactivate(); + null !== b && a.Vk.removeChild(b) + } + this.na = !1 + } + }; + Mh.prototype.isValidText = function (a, b, c) { + u.C(a, qa, Mh, "isValidText:textblock"); + var d = this.jA; + if (null !== d && !d(a, b, c)) return !1; + d = a.jA; + return null === d || d(a, b, c) ? !0 : !1 + }; + u.defineProperty(Mh, {jA: "textValidation"}, function () { + return this.Hk + }, function (a) { + null !== a && u.j(a, "function", Mh, "textValidation"); + this.Hk = a + }); + u.defineProperty(Mh, {YD: "minimumEditorScale"}, function () { + return this.EB + }, function (a) { + null !== a && u.j(a, "number", Mh, "minimumEditorScale"); + this.EB = a + }); + u.defineProperty(Mh, {$z: "selectsTextOnActivate"}, function () { + return this.dC + }, function (a) { + null !== a && u.j(a, "boolean", Mh, "selectsTextOnActivate"); + this.dC = a + }); + + function jf() { + xe.call(this); + this.name = "ToolManager"; + this.uF = new E(xe); + this.vF = new E(xe); + this.wF = new E(xe); + this.jB = this.kB = 1E3; + this.ZA = (new ia(2, 2)).Ka(); + this.au = this.vx = null; + this.IB = Bf; + this.hB = $h + } + + u.Ga(jf, xe); + u.fa("ToolManager", jf); + var Bf; + jf.WheelScroll = Bf = u.s(jf, "WheelScroll", 0); + var Af; + jf.WheelZoom = Af = u.s(jf, "WheelZoom", 1); + jf.WheelNone = u.s(jf, "WheelNone", 2); + var $h; + jf.GestureZoom = $h = u.s(jf, "GestureZoom", 3); + var ai; + jf.GestureCancel = ai = u.s(jf, "GestureCancel", 4); + var bi; + jf.GestureNone = bi = u.s(jf, "GestureNone", 5); + u.defineProperty(jf, {$s: "mouseWheelBehavior"}, function () { + return this.IB + }, function (a) { + u.rb(a, jf, jf, "mouseWheelBehavior"); + this.IB = a + }); + u.defineProperty(jf, {Bo: "gestureBehavior"}, function () { + return this.hB + }, function (a) { + u.rb(a, jf, jf, "gestureBehavior"); + this.hB = a + }); + jf.prototype.initializeStandardTools = function () { + this.HF = new xh; + this.iE = new Gf; + this.rH = new fh; + this.uE = new mh; + this.$H = new uh; + this.TD = new ta; + this.Ed = new uf; + this.uG = new Kh; + this.JH = new Lh; + this.Vy = new Ih; + this.iA = new Mh; + this.VF = new va; + this.WF = new wh + }; + jf.prototype.doMouseDown = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + b.jl && this.Bo === ai && (b.bubbles = !1); + if (b.Ps) { + if (this.Bo === bi) { + b.bubbles = !0; + return + } + if (this.Bo === ai) return; + if (a.Va.canStartMultiTouch()) { + a.Va.standardPinchZoomStart(); + return + } + } + b = a.ha; + b.Ry && 0 !== b.Le && u.trace("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero"); + for (var b = this.cf.length, c = 0; c < b; c++) { + var d = this.cf.ja(c); + null === d.g && d.Ec(this.g); + if (d.canStart()) { + a.Va = d; + a.Va === d && (d.na || d.doActivate(), d.doMouseDown()); + return + } + } + 1 === a.N.button && (this.$s === Bf ? this.$s = Af : this.$s === Af && (this.$s = Bf)); + this.doActivate(); + this.standardWaitAfter(this.FD) + } + }; + jf.prototype.doMouseMove = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + if (b.Ps) { + if (this.Bo === bi) { + b.bubbles = !0; + return + } + if (this.Bo === ai) return; + if (a.Va.canStartMultiTouch()) { + a.Va.standardPinchZoomMove(); + return + } + } + if (this.na) for (var b = this.Mf.length, c = 0; c < b; c++) { + var d = this.Mf.ja(c); + null === d.g && d.Ec(this.g); + if (d.canStart()) { + a.Va = d; + a.Va === d && (d.na || d.doActivate(), d.doMouseMove()); + return + } + } + this.standardMouseOver(); + this.isBeyondDragSize() && this.standardWaitAfter(this.na ? this.FD : this.QG) + } + }; + jf.prototype.doCurrentObjectChanged = function (a, b) { + var c = this.Rk; + null === c || null !== b && (b === c || b.gl(c)) || this.hideToolTip() + }; + jf.prototype.doWaitAfter = function () { + var a = this.g; + null !== a && a.ib && (this.doMouseHover(), this.na || this.doToolTip()) + }; + jf.prototype.doMouseHover = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + null === b.pe && (b.pe = a.ke(b.da, null, null)); + var c = b.pe; + if (null !== c) for (b.Tc = !1; null !== c;) { + a = this.na ? c.Dz : c.Ez; + if (null !== a && (a(b, c), b.Tc)) break; + c = c.S + } else a = this.na ? a.Dz : a.Ez, null !== a && a(b) + } + }; + jf.prototype.doToolTip = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + null === b.pe && (b.pe = a.ke(b.da, null, null)); + b = b.pe; + if (null !== b) { + if (b !== this.Rk && !b.gl(this.Rk)) { + for (; null !== b;) { + a = b.lA; + if (null !== a) { + this.showToolTip(a, b); + return + } + b = b.S + } + this.hideToolTip() + } + } else a = a.lA, null !== a ? this.showToolTip(a, null) : this.hideToolTip() + } + }; + jf.prototype.showToolTip = function (a, b) { + u.C(a, lf, jf, "showToolTip:tooltip"); + null !== b && u.C(b, S, jf, "showToolTip:obj"); + var c = this.g; + if (null !== c) { + a !== this.Rk && this.hideToolTip(); + a.wf = "Tool"; + a.pl = !1; + a.scale = 1 / c.scale; + c.add(a); + if (null !== b && b !== this.au) { + var c = null, d = b.zo(); + null !== d && (c = d.data); + a.vc = b; + a.data = c + } else null === b && (a.data = c.ga); + if (null === b || b !== this.au) a.pf(), this.positionToolTip(a, b); + this.vx = a; + this.au = b + } + }; + jf.prototype.positionToolTip = function (a) { + if (null === a.placeholder) { + var b = this.g; + if (null !== b) { + var c = b.N.da.copy(), d = a.Ba, e = b.ob; + b.N.jl && (c.x -= d.width); + c.x + d.width > e.right && (c.x -= d.width + 5); + c.x < e.x && (c.x = e.x); + c.y = c.y + 20 + d.height > e.bottom ? c.y - (d.height + 5) : c.y + 20; + c.y < e.y && (c.y = e.y); + a.position = c + } + } + }; + jf.prototype.hideToolTip = function () { + if (null !== this.Rk) { + var a = this.g; + null !== a && (this.Rk.data = null, this.Rk.vc = null, a.remove(this.Rk), this.au = this.vx = null) + } + }; + u.u(jf, {Rk: "currentToolTip"}, function () { + return this.vx + }); + jf.prototype.doMouseUp = function () { + this.cancelWaitAfter(); + if (this.na) { + var a = this.g; + if (null === a) return; + for (var b = this.Nf.length, c = 0; c < b; c++) { + var d = this.Nf.ja(c); + null === d.g && d.Ec(this.g); + if (d.canStart()) { + a.Va = d; + a.Va === d && (d.na || d.doActivate(), d.doMouseUp()); + return + } + } + } + this.doDeactivate() + }; + jf.prototype.doMouseWheel = function () { + this.standardMouseWheel() + }; + jf.prototype.doKeyDown = function () { + var a = this.g; + null !== a && a.Eb.doKeyDown() + }; + jf.prototype.doKeyUp = function () { + var a = this.g; + null !== a && a.Eb.doKeyUp() + }; + jf.prototype.doCancel = function () { + null !== Ef && Ef.doCancel(); + xe.prototype.doCancel.call(this) + }; + jf.prototype.findTool = function (a) { + u.j(a, "string", jf, "findTool:name"); + for (var b = this.cf.length, c = 0; c < b; c++) { + var d = this.cf.ja(c); + if (d.name === a) return d + } + b = this.Mf.length; + for (c = 0; c < b; c++) if (d = this.Mf.ja(c), d.name === a) return d; + b = this.Nf.length; + for (c = 0; c < b; c++) if (d = this.Nf.ja(c), d.name === a) return d; + return null + }; + jf.prototype.replaceTool = function (a, b) { + u.j(a, "string", jf, "replaceTool:name"); + null !== b && (u.C(b, xe, jf, "replaceTool:newtool"), b.g && b.g !== this.g && u.k("Cannot share tools between Diagrams: " + b.toString()), b.Ec(this.g)); + for (var c = this.cf.length, d = 0; d < c; d++) { + var e = this.cf.ja(d); + if (e.name === a) return null !== b ? this.cf.Bg(d, b) : this.cf.hd(d), e + } + c = this.Mf.length; + for (d = 0; d < c; d++) if (e = this.Mf.ja(d), e.name === a) return null !== b ? this.Mf.Bg(d, b) : this.Mf.hd(d), e; + c = this.Nf.length; + for (d = 0; d < c; d++) if (e = this.Nf.ja(d), e.name === + a) return null !== b ? this.Nf.Bg(d, b) : this.Nf.hd(d), e; + return null + }; + + function ci(a, b, c, d) { + u.j(b, "string", jf, "replaceStandardTool:name"); + u.C(d, E, jf, "replaceStandardTool:list"); + null !== c && (u.C(c, xe, jf, "replaceStandardTool:newtool"), c.g && c.g !== a.g && u.k("Cannot share tools between Diagrams: " + c.toString()), c.name = b, c.Ec(a.g)); + a.findTool(b) ? a.replaceTool(b, c) : null !== c && d.add(c) + } + + u.u(jf, {cf: "mouseDownTools"}, function () { + return this.uF + }); + u.u(jf, {Mf: "mouseMoveTools"}, function () { + return this.vF + }); + u.u(jf, {Nf: "mouseUpTools"}, function () { + return this.wF + }); + u.defineProperty(jf, {QG: "hoverDelay"}, function () { + return this.kB + }, function (a) { + u.j(a, "number", jf, "hoverDelay"); + this.kB = a + }); + u.defineProperty(jf, {FD: "holdDelay"}, function () { + return this.jB + }, function (a) { + u.j(a, "number", jf, "holdDelay"); + this.jB = a + }); + u.defineProperty(jf, {vG: "dragSize"}, function () { + return this.ZA + }, function (a) { + u.C(a, ia, jf, "dragSize"); + this.ZA = a.Z() + }); + u.defineProperty(jf, {HF: "actionTool"}, function () { + return this.findTool("Action") + }, function (a) { + ci(this, "Action", a, this.cf) + }); + u.defineProperty(jf, {iE: "relinkingTool"}, function () { + return this.findTool("Relinking") + }, function (a) { + ci(this, "Relinking", a, this.cf) + }); + u.defineProperty(jf, {rH: "linkReshapingTool"}, function () { + return this.findTool("LinkReshaping") + }, function (a) { + ci(this, "LinkReshaping", a, this.cf) + }); + u.defineProperty(jf, {uE: "resizingTool"}, function () { + return this.findTool("Resizing") + }, function (a) { + ci(this, "Resizing", a, this.cf) + }); + u.defineProperty(jf, {$H: "rotatingTool"}, function () { + return this.findTool("Rotating") + }, function (a) { + ci(this, "Rotating", a, this.cf) + }); + u.defineProperty(jf, {TD: "linkingTool"}, function () { + return this.findTool("Linking") + }, function (a) { + ci(this, "Linking", a, this.Mf) + }); + u.defineProperty(jf, {Ed: "draggingTool"}, function () { + return this.findTool("Dragging") + }, function (a) { + ci(this, "Dragging", a, this.Mf) + }); + u.defineProperty(jf, {uG: "dragSelectingTool"}, function () { + return this.findTool("DragSelecting") + }, function (a) { + ci(this, "DragSelecting", a, this.Mf) + }); + u.defineProperty(jf, {JH: "panningTool"}, function () { + return this.findTool("Panning") + }, function (a) { + ci(this, "Panning", a, this.Mf) + }); + u.defineProperty(jf, {Vy: "contextMenuTool"}, function () { + return this.findTool("ContextMenu") + }, function (a) { + ci(this, "ContextMenu", a, this.Nf) + }); + u.defineProperty(jf, {iA: "textEditingTool"}, function () { + return this.findTool("TextEditing") + }, function (a) { + ci(this, "TextEditing", a, this.Nf) + }); + u.defineProperty(jf, {VF: "clickCreatingTool"}, function () { + return this.findTool("ClickCreating") + }, function (a) { + ci(this, "ClickCreating", a, this.Nf) + }); + u.defineProperty(jf, {WF: "clickSelectingTool"}, function () { + return this.findTool("ClickSelecting") + }, function (a) { + ci(this, "ClickSelecting", a, this.Nf) + }); + + function Te() { + this.pF = di; + this.Fl = this.Gl = this.Y = null; + this.CA = this.ld = this.Fn = this.dj = !1; + this.Ne = !0; + this.$t = this.Zt = this.PA = null; + this.tx = 0; + this.Ex = 600; + this.yF = new w(0, 0); + this.EA = this.DA = this.BC = !1; + this.Sn = new la(S, ei) + } + + u.fa("AnimationManager", Te); + Te.prototype.Ec = function (a) { + this.Y = a + }; + + function di(a, b, c, d) { + a /= d / 2; + return 1 > a ? c / 2 * a * a + b : -c / 2 * (--a * (a - 2) - 1) + b + } + + Te.prototype.prepareAnimation = Te.prototype.ml = function () { + this.Ne && (this.dj && this.Mi(), this.ld = !0, this.CA = !1) + }; + + function fi(a) { + a.Ne && requestAnimationFrame(function () { + !1 === a.ld || a.dj || (a.Y.im = 1, gi(a.Y), a.ld = !1, a.Y.za("AnimationStarting"), hi(a)) + }) + } + + function ii(a, b, c, d, e) { + if (a.ld && (!(b instanceof G) || b.JD)) { + var f = a.Sn; + if (f.contains(b)) { + b = f.ta(b); + a = b.start; + var h = b.end; + void 0 === a[c] && (a[c] = ji(d)); + h[c] = ji(e) + } else a = new pa, h = new pa, a[c] = ji(d), h[c] = ji(e), f.add(b, new ei(a, h)) + } + } + + function ji(a) { + return a instanceof w ? a.copy() : a instanceof ia ? a.copy() : a + } + + function hi(a) { + var b; + void 0 === b && (b = new pa); + var c = a.Y; + if (null !== c) if (0 === a.Sn.count) a.dj = !1, ki(c, !1), c.bf(); else { + a.dj = !0; + var d = b.wJ || a.pF, e = b.cK || null, f = b.dK || null, h = b.duration || a.Ex; + b = a.yF; + for (var k = a.Sn.i; k.next();) { + var l = k.value.start.position; + l instanceof w && (l.J() || l.assign(b)) + } + a.PA = d; + a.Zt = e; + a.$t = f; + a.tx = h; + var m = a.oF = a.Sn; + li(a); + mi(a, c, m, d, 0, h, null !== a.Gl && null !== a.Fl); + Dg(a.Y); + ni(a); + requestAnimationFrame(function (b) { + var e = b || +new Date, f = e + h; + (function s(b) { + if (!1 !== a.dj) { + b = b || +new Date; + var k = b > f ? + h : b - e; + li(a); + mi(a, c, m, d, k, h, null !== a.Gl && null !== a.Fl); + a.Zt && a.Zt(); + Dg(c); + ni(a); + b > f ? oi(a) : requestAnimationFrame(s) + } + })(e) + }) + } + } + + var pi = { + opacity: function (a, b, c, d, e, f) { + a.opacity = d(e, b, c - b, f) + }, position: function (a, b, c, d, e, f) { + e !== f ? a.GE(d(e, b.x, c.x - b.x, f), d(e, b.y, c.y - b.y, f)) : a.position = new w(d(e, b.x, c.x - b.x, f), d(e, b.y, c.y - b.y, f)) + }, scale: function (a, b, c, d, e, f) { + a.scale = d(e, b, c - b, f) + }, visible: function (a, b, c, d, e, f) { + a.visible = e !== f ? b : c + } + }; + + function li(a) { + if (!a.Fn) { + var b = a.Y; + a.BC = b.cb; + a.DA = b.Iw; + a.EA = b.tt; + b.cb = !0; + b.Iw = !0; + b.tt = !0; + a.Fn = !0 + } + } + + function ni(a) { + var b = a.Y; + b.cb = a.BC; + b.Iw = a.DA; + b.tt = a.EA; + a.Fn = !1 + } + + function mi(a, b, c, d, e, f, h) { + for (c = c.i; c.next();) { + var k = c.key, l = c.value, m = l.start, l = l.end, n; + for (n in l) if (void 0 !== pi[n]) pi[n](k, m[n], l[n], d, e, f) + } + h && (h = a.Gl, a = a.Fl, n = a.y - h.y, a = d(e, h.x, a.x - h.x, f), d = d(e, h.y, n, f), e = b.qz, b.qz = !0, b.position = new w(a, d), b.qz = e) + } + + Te.prototype.stopAnimation = Te.prototype.Mi = function () { + !0 === this.ld && (this.ld = !1, this.CA && this.Y.de()); + this.dj && this.Ne && (li(this), mi(this, this.Y, this.oF, this.PA, this.tx, this.tx, null !== this.Gl && null !== this.Fl), ni(this), oi(this)) + }; + + function oi(a) { + a.dj = !1; + a.Gl = null; + a.Fl = null; + a.Sn = new la(S, ei); + li(a); + for (var b = a.Y.links; b.next();) { + var c = b.value; + null !== c.Xn && (c.points = c.Xn, c.Xn = null) + } + b = a.Y; + ki(b, !1); + b.pc(); + b.bf(); + qi(b); + ni(a); + a.$t && a.$t(); + a.$t = null; + a.Zt = null; + b.za("AnimationFinished"); + b.de() + } + + function ri(a, b, c) { + var d = b.ba, e = c.ba, f = null; + c instanceof V && (f = c.placeholder); + null !== f ? (c = f.lb(xb), c.x += f.padding.left, c.y += f.padding.top, ii(a, b, "position", c, b.position)) : ii(a, b, "position", new w(e.x + e.width / 2 - d.width / 2, e.y + e.height / 2 - d.height / 2), b.position); + ii(a, b, "opacity", .01, b.opacity) + } + + function si(a, b, c) { + a.ld && (null === a.Gl && b.J() && null === a.Fl && (a.Gl = b.copy()), a.Fl = c.copy()) + } + + u.defineProperty(Te, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + u.j(a, "boolean", Te, "isEnabled"); + this.Ne = a + }); + u.defineProperty(Te, {duration: "duration"}, function () { + return this.Ex + }, function (a) { + u.j(a, "number", Te, "duration"); + 1 > a && u.wa(a, ">= 1", Te, "duration"); + this.Ex = a + }); + u.u(Te, {Vg: "isAnimating"}, function () { + return this.dj + }); + u.u(Te, {HJ: "isTicking"}, function () { + return this.Fn + }); + + function ei(a, b) { + this.start = a; + this.end = b + } + + function we() { + 0 < arguments.length && u.Wc(we); + u.gc(this); + this.Y = null; + this.Db = new E(G); + this.Ub = ""; + this.Ic = 1; + this.Wx = !1; + this.Fk = this.Iy = this.fk = this.ek = this.dk = this.ck = this.ak = this.bk = this.$j = this.hk = this.Zj = this.gk = this.Yj = this.Xj = !0; + this.Rx = !1; + this.Uu = [] + } + + u.fa("Layer", we); + we.prototype.Ec = function (a) { + this.Y = a + }; + we.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = 'Layer "' + this.name + '"'; + if (0 >= a) return b; + for (var c = 0, d = 0, e = 0, f = 0, h = 0, k = this.Db.i; k.next();) { + var l = k.value; + l instanceof V ? e++ : l instanceof U ? d++ : l instanceof W ? f++ : l instanceof lf ? h++ : c++ + } + k = ""; + 0 < c && (k += c + " Parts "); + 0 < d && (k += d + " Nodes "); + 0 < e && (k += e + " Groups "); + 0 < f && (k += f + " Links "); + 0 < h && (k += h + " Adornments "); + if (1 < a) for (a = this.Db.i; a.next();) c = a.value, k += "\n " + c.toString(), d = c.data, null !== d && u.Uc(d) && (k += " #" + u.Uc(d)), c instanceof U ? k += " " + + de(d) : c instanceof W && (k += " " + de(c.W) + " " + de(c.ca)); + return b + " " + this.Db.count + ": " + k + }; + we.prototype.findObjectAt = we.prototype.ke = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + if (!1 === this.Fk) return null; + var d = !1; + this.g.ob.Aa(a) && (d = !0); + for (var e = u.K(), f = this.Db.n, h = f.length; h--;) { + var k = f[h]; + if ((!0 !== d || !1 !== ti(k)) && k.Ea() && (e.assign(a), Wa(e, k.Ff), k = k.ke(e, b, c), null !== k && (null !== b && (k = b(k)), null !== k && (null === c || c(k))))) return u.v(e), k + } + u.v(e); + return null + }; + we.prototype.findObjectsAt = we.prototype.ys = function (a, b, c, d) { + void 0 === b && (b = null); + void 0 === c && (c = null); + d instanceof E || d instanceof F || (d = new F(S)); + if (!1 === this.Fk) return d; + var e = !1; + this.g.ob.Aa(a) && (e = !0); + for (var f = u.K(), h = this.Db.n, k = h.length; k--;) { + var l = h[k]; + !0 === e && !1 === ti(l) || !l.Ea() || (f.assign(a), Wa(f, l.Ff), l.ys(f, b, c, d) && (null !== b && (l = b(l)), null === l || null !== c && !c(l) || d.add(l))) + } + u.v(f); + return d + }; + we.prototype.findObjectsIn = we.prototype.Nj = function (a, b, c, d, e) { + void 0 === b && (b = null); + void 0 === c && (c = null); + void 0 === d && (d = !1); + e instanceof E || e instanceof F || (e = new F(S)); + if (!1 === this.Fk) return e; + var f = !1; + this.g.ob.Kj(a) && (f = !0); + for (var h = this.Db.n, k = h.length; k--;) { + var l = h[k]; + (!0 !== f || !1 !== ti(l)) && l.Ea() && l.Nj(a, b, c, d, e) && (null !== b && (l = b(l)), null === l || null !== c && !c(l) || e.add(l)) + } + return e + }; + we.prototype.dz = function (a, b, c, d, e, f, h) { + if (!1 === this.Fk) return e; + for (var k = this.Db.n, l = k.length; l--;) { + var m = k[l]; + (!0 !== h || !1 !== ti(m)) && f(m) && m.Ea() && m.Nj(a, b, c, d, e) && (null !== b && (m = b(m)), null === m || null !== c && !c(m) || e.add(m)) + } + return e + }; + we.prototype.findObjectsNear = we.prototype.ym = function (a, b, c, d, e, f) { + void 0 === c && (c = null); + void 0 === d && (d = null); + void 0 === e && (e = !0); + if (!1 !== e && !0 !== e) { + if (e instanceof E || e instanceof F) f = e; + e = !0 + } + f instanceof E || f instanceof F || (f = new F(S)); + if (!1 === this.Fk) return f; + var h = !1; + this.g.ob.Aa(a) && (h = !0); + for (var k = u.K(), l = u.K(), m = this.Db.n, n = m.length; n--;) { + var p = m[n]; + !0 === h && !1 === ti(p) || !p.Ea() || (k.assign(a), Wa(k, p.Ff), l.m(a.x + b, a.y), Wa(l, p.Ff), p.ym(k, l, c, d, e, f) && (null !== c && (p = c(p)), null === p || null !== d && !d(p) || + f.add(p))) + } + u.v(k); + u.v(l); + return f + }; + g = we.prototype; + g.xf = function (a, b) { + if (this.visible) { + var c; + c = void 0 === b ? a.ob : b; + for (var d = this.Db.n, e = d.length, f = 0; f < e; f++) { + var h = d[f]; + h.BB = f; + if (!(h instanceof W && !1 === h.hg)) { + if (h instanceof lf) { + var k = h; + if (null !== k.Kh) continue + } + if (jb(h.ba, c)) for (h.xf(!0), ui(h), h = h.zv; h.next();) k = h.value, Ph(k, Infinity, Infinity), k.zc(), k.xf(!0); else h.xf(!1), null !== h.zv && 0 < h.zv.count && ui(h) + } + } + } + }; + g.We = function (a, b, c, d) { + if (this.visible && 0 !== this.Ic && (void 0 === d && (d = !0), d || !this.Ac)) { + 1 !== this.Ic && (a.globalAlpha = this.Ic); + c = this.Uu; + c.length = 0; + d = b.scale; + for (var e = this.Db.n, f = e.length, h = 0; h < f; h++) { + var k = e[h]; + if (ti(k) || vi(k)) { + if (k instanceof W) { + var l = k; + l.dc && c.push(l); + if (!1 === l.hg) continue + } + l = k.ba; + 1 < l.width * d || 1 < l.height * d ? k.We(a, b) : wi(k, a) + } + } + a.globalAlpha = 1 + } + }; + + function xi(a, b, c, d) { + if (a.visible && 0 !== a.Ic) { + 1 !== a.Ic && (b.globalAlpha = a.Ic); + var e = a.Uu; + e.length = 0; + var f = c.scale; + a = a.Db.n; + for (var h = a.length, k = d.length, l = 0; l < h; l++) { + var m = a[l]; + if (ti(m) || vi(m)) { + if (m instanceof W) { + var n = m; + n.dc && e.push(n); + if (!1 === n.hg) continue + } + var n = yi(m, m.ba), p; + a:{ + p = n; + for (var q = d, r = k, s = 2 / f, t = 4 / f, v = 0; v < r; v++) { + var x = q[v]; + if (0 !== x.width && 0 !== x.height && p.HD(x.x - s, x.y - s, x.width + t, x.height + t)) { + p = !0; + break a + } + } + p = !1 + } + p && (1 < n.width * f || 1 < n.height * f ? m.We(b, c) : wi(m, b)) + } + } + b.globalAlpha = 1 + } + } + + g.h = function (a, b, c, d, e) { + var f = this.g; + null !== f && f.Dc($d, a, this, b, c, d, e) + }; + g.Eo = function (a, b, c) { + var d = this.Db; + b.Bu = this; + if (a >= d.count) a = d.count; else if (d.ja(a) === b) return -1; + d.Yd(a, b); + b.Js(c); + d = this.g; + null !== d && (c ? d.ma() : d.Eo(b)); + b instanceof V && this.Jw(b); + return a + }; + g.Fe = function (a, b, c) { + if (!c && b.layer !== this && null !== b.layer) return b.layer.Fe(a, b, c); + var d = this.Db; + if (0 > a || a >= d.length) { + if (a = d.indexOf(b), 0 > a) return -1 + } else if (d.ja(a) !== b && (a = d.indexOf(b), 0 > a)) return -1; + b.Ks(c); + d.hd(a); + d = this.g; + null !== d && (c ? d.ma() : d.Fe(b)); + b.Bu = null; + return a + }; + g.Jw = function (a) { + for (; null !== a;) { + if (a.layer === this) { + var b = a; + if (0 !== b.Mc.count) { + for (var c = -1, d = -1, e = this.Db.n, f = e.length, h = 0; h < f; h++) { + var k = e[h]; + if (k === b && (c = h, 0 <= d)) break; + if (0 > d && k.Ra === b && (d = h, 0 <= c)) break + } + !(0 > d) && d < c && (e = this.Db, e.hd(c), e.Yd(d, b)) + } + } + a = a.Ra + } + }; + g.clear = function () { + for (var a = this.Db.Ke(), b = a.length, c = 0; c < b; c++) a[c].xf(!1), this.Fe(-1, a[c], !1) + }; + u.u(we, {Sj: "parts"}, function () { + return this.Db.i + }); + u.u(we, {mK: "partsBackwards"}, function () { + return this.Db.Fm + }); + u.u(we, {g: "diagram"}, function () { + return this.Y + }); + u.defineProperty(we, {name: "name"}, function () { + return this.Ub + }, function (a) { + u.j(a, "string", we, "name"); + var b = this.Ub; + if (b !== a) { + var c = this.g; + if (null !== c) for ("" === b && u.k("Cannot rename default Layer to: " + a), c = c.mw; c.next();) c.value.name === a && u.k("Layer.name is already present in this diagram: " + a); + this.Ub = a; + this.h("name", b, a); + for (a = this.Db.i; a.next();) a.value.wf = this.Ub + } + }); + u.defineProperty(we, {opacity: "opacity"}, function () { + return this.Ic + }, function (a) { + var b = this.Ic; + b !== a && (u.j(a, "number", we, "opacity"), (0 > a || 1 < a) && u.wa(a, "0 <= value <= 1", we, "opacity"), this.Ic = a, this.h("opacity", b, a), a = this.g, null !== a && a.ma()) + }); + u.defineProperty(we, {Ac: "isTemporary"}, function () { + return this.Wx + }, function (a) { + var b = this.Wx; + b !== a && (u.j(a, "boolean", we, "isTemporary"), this.Wx = a, this.h("isTemporary", b, a)) + }); + u.defineProperty(we, {visible: "visible"}, function () { + return this.Iy + }, function (a) { + var b = this.Iy; + if (b !== a) { + u.j(a, "boolean", we, "visible"); + this.Iy = a; + this.h("visible", b, a); + for (b = this.Db.i; b.next();) b.value.He(a); + a = this.g; + null !== a && a.ma() + } + }); + u.defineProperty(we, {Ag: "pickable"}, function () { + return this.Fk + }, function (a) { + var b = this.Fk; + b !== a && (u.j(a, "boolean", we, "pickable"), this.Fk = a, this.h("pickable", b, a)) + }); + u.defineProperty(we, {KD: "isBoundsIncluded"}, function () { + return this.Rx + }, function (a) { + this.Rx !== a && (this.Rx = a, null !== this.g && this.g.pc()) + }); + u.defineProperty(we, {Ij: "allowCopy"}, function () { + return this.Xj + }, function (a) { + var b = this.Xj; + b !== a && (u.j(a, "boolean", we, "allowCopy"), this.Xj = a, this.h("allowCopy", b, a)) + }); + u.defineProperty(we, {lm: "allowDelete"}, function () { + return this.Yj + }, function (a) { + var b = this.Yj; + b !== a && (u.j(a, "boolean", we, "allowDelete"), this.Yj = a, this.h("allowDelete", b, a)) + }); + u.defineProperty(we, {Ev: "allowTextEdit"}, function () { + return this.gk + }, function (a) { + var b = this.gk; + b !== a && (u.j(a, "boolean", we, "allowTextEdit"), this.gk = a, this.h("allowTextEdit", b, a)) + }); + u.defineProperty(we, {Bv: "allowGroup"}, function () { + return this.Zj + }, function (a) { + var b = this.Zj; + b !== a && (u.j(a, "boolean", we, "allowGroup"), this.Zj = a, this.h("allowGroup", b, a)) + }); + u.defineProperty(we, {Fv: "allowUngroup"}, function () { + return this.hk + }, function (a) { + var b = this.hk; + b !== a && (u.j(a, "boolean", we, "allowUngroup"), this.hk = a, this.h("allowUngroup", b, a)) + }); + u.defineProperty(we, {gs: "allowLink"}, function () { + return this.$j + }, function (a) { + var b = this.$j; + b !== a && (u.j(a, "boolean", we, "allowLink"), this.$j = a, this.h("allowLink", b, a)) + }); + u.defineProperty(we, {mm: "allowRelink"}, function () { + return this.bk + }, function (a) { + var b = this.bk; + b !== a && (u.j(a, "boolean", we, "allowRelink"), this.bk = a, this.h("allowRelink", b, a)) + }); + u.defineProperty(we, {Nk: "allowMove"}, function () { + return this.ak + }, function (a) { + var b = this.ak; + b !== a && (u.j(a, "boolean", we, "allowMove"), this.ak = a, this.h("allowMove", b, a)) + }); + u.defineProperty(we, {Cv: "allowReshape"}, function () { + return this.ck + }, function (a) { + var b = this.ck; + b !== a && (u.j(a, "boolean", we, "allowReshape"), this.ck = a, this.h("allowReshape", b, a)) + }); + u.defineProperty(we, {hs: "allowResize"}, function () { + return this.dk + }, function (a) { + var b = this.dk; + b !== a && (u.j(a, "boolean", we, "allowResize"), this.dk = a, this.h("allowResize", b, a)) + }); + u.defineProperty(we, {Dv: "allowRotate"}, function () { + return this.ek + }, function (a) { + var b = this.ek; + b !== a && (u.j(a, "boolean", we, "allowRotate"), this.ek = a, this.h("allowRotate", b, a)) + }); + u.defineProperty(we, {of: "allowSelect"}, function () { + return this.fk + }, function (a) { + var b = this.fk; + b !== a && (u.j(a, "boolean", we, "allowSelect"), this.fk = a, this.h("allowSelect", b, a)) + }); + + function D(a) { + function b() { + window.document.removeEventListener("DOMContentLoaded", b, !1); + Li(c) + } + + 1 < arguments.length && u.k("Diagram constructor can only take one optional argument, the DIV HTML element or its id."); + u.gc(this); + Mi = []; + this.sc = !0; + this.Uh = new Te; + this.Uh.Ec(this); + this.zd = 17; + var c = this; + null !== window.document.body ? Li(this) : window.document.addEventListener("DOMContentLoaded", b, !1); + this.wB = !1; + this.Zb = new E(we); + this.zb = this.Ab = 0; + this.Qg = this.Jb = this.Gg = this.ib = null; + this.qE(); + this.dq = null; + this.pE(); + this.Ma = (new w(NaN, NaN)).freeze(); + this.$b = 1; + this.tu = (new w(NaN, NaN)).freeze(); + this.uu = NaN; + this.Ku = 1E-4; + this.Hu = 100; + this.Sd = new ja; + this.wv = (new w(NaN, NaN)).freeze(); + this.ku = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.vy = (new rb(0, 0, 0, 0)).freeze(); + this.wy = Ni; + this.qy = this.oy = null; + this.xl = vf; + this.dn = uc; + this.tk = vf; + this.An = uc; + this.vu = this.su = xb; + this.Xf = new F(S); + this.Md = !0; + this.fq = !1; + this.El = new la(W, z); + this.qn = !0; + this.lF = 250; + this.Zm = -1; + this.Qt = (new rb(16, 16, 16, 16)).freeze(); + this.du = this.Ef = !1; + this.un = !0; + this.nk = + new Md; + this.Jc = new Md; + this.Ob = new Md; + this.Ui = null; + this.lv = -1; + this.kv = !1; + this.Ax = this.Bx = null; + Oi(this); + this.Rn = new F(U); + this.Ik = new F(V); + this.Nn = new F(W); + this.Db = new F(G); + this.yu = !0; + this.mB = !1; + this.sv = Hg; + this.gj = 10; + this.ux = this.yx = this.Fy = null; + this.sx = ""; + this.Pp = "auto"; + this.Zh = this.ti = this.ji = this.Nu = this.ki = this.li = this.mi = this.Yh = this.ci = this.Wh = null; + this.yn = !0; + this.iy = !1; + this.WB = {}; + this.hr = 0; + this.Df = [null, null]; + this.ix = null; + this.zu = this.Vm = this.zx = this.xy = this.eC = this.qi = !1; + this.yB = !0; + this.Tx = this.vd = + !1; + this.Od = null; + var d = this; + this.FB = function (a) { + if (a.ga === d.ga && d.Na) { + d.Na = !1; + try { + var b = a.Ad; + "" === a.Lf && b === $d && Pi(d, a.object, a.propertyName) + } finally { + d.Na = !0 + } + } + }; + this.GB = function (a) { + Qi(d, a) + }; + this.DC = !0; + this.Ig = -2; + this.$h = new la(Object, G); + this.lk = new la(Object, W); + this.Ml = new la(Object, Array); + this.Tn = new la("string", Array); + this.VB = new E(Ri); + this.vk = !1; + this.Yj = this.Xj = this.Gt = this.Ne = !0; + this.It = this.Ht = !1; + this.Nt = this.Lt = this.fk = this.ek = this.dk = this.ck = this.ak = this.bk = this.$j = this.Kt = this.hk = this.Zj = this.gk = + !0; + this.Jl = this.uB = !1; + this.Mt = this.Jt = this.qu = this.pu = !0; + this.av = this.$u = 16; + this.sy = this.Zu = !1; + this.uy = this.ty = this.vj = this.uj = null; + this.Pe = (new rb(5)).freeze(); + this.dv = (new F(G)).freeze(); + this.Iu = 999999999; + this.ru = (new F(G)).freeze(); + this.uk = this.Hl = this.ei = !0; + this.rk = this.qk = !1; + this.Nd = null; + this.Ot = !0; + this.lf = !1; + this.md = null; + this.MB = 1; + this.Lx = !1; + this.iC = 0; + this.CC = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.eu = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.Ul = new F(Si); + Ti(this); + this.Du = this.mu = this.Pu = this.TA = + this.SA = this.UA = this.hj = this.ok = this.ni = null; + Ui(this); + this.ad = null; + this.lu = !1; + this.en = null; + this.tb = new jf; + this.tb.initializeStandardTools(); + this.Va = this.$y = this.tb; + this.Eb = new sa; + this.ga = new Q; + this.qi = !0; + this.Qb = new Je; + this.qi = !1; + this.dB = this.Dx = null; + this.nf = 1; + this.im = null; + this.sk = new Vi; + void 0 !== a && Wi(this, a); + this.Ol = 1; + this.Pl = 0; + this.AB = new w; + this.zC = 500; + this.Pt = new w; + this.Ir = null; + this.sc = this.Xx = !1 + } + + u.fa("Diagram", D); + + function Ui(a) { + a.ni = new la("string", G); + var b = new U, c = new qa; + c.bind(new bf("text", "", de)); + b.add(c); + a.UA = b; + a.ni.add("", b); + b = new U; + c = new qa; + c.stroke = "brown"; + c.bind(new bf("text", "", de)); + b.add(c); + a.ni.add("Comment", b); + b = new U; + b.pl = !1; + b.TC = !1; + c = new X; + c.Fb = "Ellipse"; + c.fill = "black"; + c.stroke = null; + c.xa = (new ia(3, 3)).Ka(); + b.add(c); + a.ni.add("LinkLabel", b); + a.ok = new la("string", V); + b = new V; + b.Zz = "GROUPPANEL"; + b.type = Xi; + c = new qa; + c.font = "bold 12pt sans-serif"; + c.bind(new bf("text", "", de)); + b.add(c); + c = new A(Yi); + c.name = + "GROUPPANEL"; + var d = new X; + d.Fb = "Rectangle"; + d.fill = "rgba(128,128,128,0.2)"; + d.stroke = "black"; + c.add(d); + d = new ph; + d.padding = (new rb(5, 5, 5, 5)).Ka(); + c.add(d); + b.add(c); + a.SA = b; + a.ok.add("", b); + a.hj = new la("string", W); + b = new W; + c = new X; + c.tg = !0; + b.add(c); + c = new X; + c.jp = "Standard"; + c.fill = "black"; + c.stroke = null; + c.hb = 0; + b.add(c); + a.TA = b; + a.hj.add("", b); + b = new W; + c = new X; + c.tg = !0; + c.stroke = "brown"; + b.add(c); + a.hj.add("Comment", b); + b = new lf; + b.type = Yi; + c = new X; + c.fill = null; + c.stroke = "dodgerblue"; + c.hb = 3; + b.add(c); + c = new ph; + c.margin = (new rb(1.5, + 1.5, 1.5, 1.5)).Ka(); + b.add(c); + a.Pu = b; + a.mu = b; + b = new lf; + b.type = ah; + c = new X; + c.tg = !0; + c.fill = null; + c.stroke = "dodgerblue"; + c.hb = 3; + b.add(c); + a.Du = b + } + + function Li(a) { + var b = u.createElement("p"); + b.style.width = "100%"; + b.style.height = "200px"; + b.style.boxSizing = "content-box"; + var c = u.createElement("div"); + c.style.position = "absolute"; + c.style.visibility = "hidden"; + c.style.width = "200px"; + c.style.height = "150px"; + c.style.overflow = "hidden"; + c.style.boxSizing = "content-box"; + c.appendChild(b); + window.document.body.appendChild(c); + var d = b.offsetWidth; + c.style.overflow = "scroll"; + b = b.offsetWidth; + d === b && (b = c.clientWidth); + window.document.body.removeChild(c); + a.zd = d - b + } + + D.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = ""; + this.id && (b = this.id); + this.Vk && this.Vk.id && (b = this.Vk.id); + b = 'Diagram "' + b + '"'; + if (0 >= a) return b; + for (var c = this.Zb.i; c.next();) b += "\n " + c.value.toString(a - 1); + return b + }; + D.prototype.checkProperties = function () { + return u.check(this) + }; + D.fromDiv = function (a) { + var b = a; + "string" === typeof a && (b = window.document.getElementById(a)); + return b instanceof HTMLDivElement && b.Y instanceof D ? b.Y : null + }; + u.defineProperty(D, {Vk: "div"}, function () { + return this.Jb + }, function (a) { + null !== a && u.C(a, HTMLDivElement, D, "div"); + if (this.Jb !== a) { + Mi = []; + var b = this.Jb; + null !== b ? (b.Y = void 0, b.innerHTML = "", null !== this.ib && (this.ib.removeEventListener("touchstart", this.SE, !1), this.ib.removeEventListener("touchmove", this.RE, !1), this.ib.removeEventListener("touchend", this.QE, !1), this.ib.Dd.Y = null), b = this.tb, null !== b && (b.cf.each(function (a) { + a.cancelWaitAfter() + }), b.Mf.each(function (a) { + a.cancelWaitAfter() + }), b.Nf.each(function (a) { + a.cancelWaitAfter() + })), + b.cancelWaitAfter(), this.Va.doCancel(), this.Gg = this.ib = null, window.removeEventListener("resize", this.aF, !1), window.removeEventListener("mousemove", this.Qo, !0), window.removeEventListener("mousedown", this.Po, !0), window.removeEventListener("mouseup", this.So, !0), window.removeEventListener("mousewheel", this.Zg, !0), window.removeEventListener("DOMMouseScroll", this.Zg, !0), window.removeEventListener("mouseout", this.Ro, !0)) : this.lf = !1; + this.Jb = null; + if (null !== a) { + if (b = a.Y) b.Vk = null; + Wi(this, a); + this.Sz() + } + } + }); + + function Zi(a) { + var b = a.ib; + b.addEventListener("touchstart", a.SE, !1); + b.addEventListener("touchmove", a.RE, !1); + b.addEventListener("touchend", a.QE, !1); + b.addEventListener("mousemove", a.Qo, !1); + b.addEventListener("mousedown", a.Po, !1); + b.addEventListener("mouseup", a.So, !1); + b.addEventListener("mousewheel", a.Zg, !1); + b.addEventListener("DOMMouseScroll", a.Zg, !1); + b.addEventListener("mouseout", a.Ro, !1); + b.addEventListener("keydown", a.kH, !1); + b.addEventListener("keyup", a.lH, !1); + b.addEventListener("selectstart", function (a) { + a.preventDefault(); + return !1 + }, !1); + b.addEventListener("contextmenu", function (a) { + a.preventDefault(); + return !1 + }, !1); + b.addEventListener("gesturechange", function (b) { + a.tb.Bo === ai && b.preventDefault() + }, !1); + b.addEventListener("pointerdown", a.KH, !1); + b.addEventListener("pointermove", a.MH, !1); + b.addEventListener("pointerleave", a.LH, !1); + window.addEventListener("resize", a.aF, !1) + } + + function ki(a, b) { + a.im = null; + b && a.hE() + } + + D.prototype.computePixelRatio = function () { + if (null !== this.im) return this.im; + var a = this.Gg; + return (window.devicePixelRatio || 1) / (a.webkitBackingStorePixelRatio || a.mozBackingStorePixelRatio || a.msBackingStorePixelRatio || a.oBackingStorePixelRatio || a.backingStorePixelRatio || 1) + }; + D.prototype.doMouseMove = function () { + this.Va.doMouseMove() + }; + D.prototype.doMouseDown = function () { + this.Va.doMouseDown() + }; + D.prototype.doMouseUp = function () { + this.Va.doMouseUp() + }; + D.prototype.doMouseWheel = function () { + this.Va.doMouseWheel() + }; + D.prototype.doKeyDown = function () { + this.Va.doKeyDown() + }; + D.prototype.doKeyUp = function () { + this.Va.doKeyUp() + }; + + function gi(a) { + if (null !== a.ib) { + var b = a.Jb; + if (0 !== b.clientWidth && 0 !== b.clientHeight) { + var c = a.rk ? a.zd : 0, d = a.qk ? a.zd : 0, e = a.nf; + a.nf = a.computePixelRatio(); + a.nf !== e && (a.fq = !0, a.de()); + if (b.clientWidth !== a.Ab + c || b.clientHeight !== a.zb + d) a.Hl = !0, a.Md = !0, b = a.Qb, null !== b && b.jw && b.H(), a.vd || a.de() + } + } + } + + D.prototype.focus = D.prototype.focus = function () { + this.ib && this.ib.focus() + }; + + function $i(a, b, c) { + void 0 === b && (b = a.Gg); + void 0 === c && (c = !0); + c && (b.Et = ""); + b.Tm = ""; + b.Sm = "" + } + + function Ti(a) { + var b = new we; + b.name = "Background"; + a.cs(b); + b = new we; + b.name = ""; + a.cs(b); + b = new we; + b.name = "Foreground"; + a.cs(b); + b = new we; + b.name = "Adornment"; + b.Ac = !0; + a.cs(b); + b = new we; + b.name = "Tool"; + b.Ac = !0; + b.KD = !0; + a.cs(b); + b = new we; + b.name = "Grid"; + b.of = !1; + b.Ag = !1; + b.Ac = !0; + a.LF(b, a.ws("Background")) + } + + function aj(a) { + a.ad = new A(bj); + a.ad.name = "GRID"; + var b = new X; + b.Fb = "LineH"; + b.stroke = "lightgray"; + b.hb = .5; + b.interval = 1; + a.ad.add(b); + b = new X; + b.Fb = "LineH"; + b.stroke = "gray"; + b.hb = .5; + b.interval = 5; + a.ad.add(b); + b = new X; + b.Fb = "LineH"; + b.stroke = "gray"; + b.hb = 1; + b.interval = 10; + a.ad.add(b); + b = new X; + b.Fb = "LineV"; + b.stroke = "lightgray"; + b.hb = .5; + b.interval = 1; + a.ad.add(b); + b = new X; + b.Fb = "LineV"; + b.stroke = "gray"; + b.hb = .5; + b.interval = 5; + a.ad.add(b); + b = new X; + b.Fb = "LineV"; + b.stroke = "gray"; + b.hb = 1; + b.interval = 10; + a.ad.add(b); + b = new G; + b.add(a.ad); + b.wf = "Grid"; + b.uz = !1; + b.JD = !1; + b.Ag = !1; + b.zz = "GRID"; + a.add(b); + a.Db.remove(b); + a.ad.visible = !1 + } + + D.prototype.LB = function () { + if (this.Y.isEnabled) { + var a = this.Y; + if (a.sy && null !== a.ib) { + a.Zu = !0; + var b = a.Cd, c = a.ob, d = b.width, e = c.width, f = b.height, h = c.height, k = b.right, l = c.right, + m = b.bottom, n = c.bottom, p = b.x, q = c.x, b = b.y, c = c.y, r = a.scale; + if (e < d || h < f) { + var s = u.K(); + this.bC && a.Re ? (s.m(this.scrollLeft / r + p, a.position.y), a.position = s) : this.cC && a.Se && (s.m(a.position.x, this.scrollTop / r + b), a.position = s); + u.v(s); + a.Zu = !1; + a.Hl = !1 + } else s = u.K(), this.bC && a.Re && (p < q && (a.position = new w(this.scrollLeft + p, a.position.y)), k > l && (a.position = + new w(-(a.uj.scrollWidth - a.Ab) + this.scrollLeft - a.Ab / r + a.Cd.right, a.position.y))), this.cC && a.Se && (b < c && (a.position = new w(a.position.x, this.scrollTop + b)), m > n && (a.position = new w(a.position.x, -(a.vj.scrollHeight - a.zb) + this.scrollTop - a.zb / r + a.Cd.bottom))), u.v(s), cj(a), a.Zu = !1, a.Hl = !1, b = a.Cd, c = a.ob, k = b.right, l = c.right, m = b.bottom, n = c.bottom, p = b.x, q = c.x, b = b.y, c = c.y, e >= d && p >= q && k <= l && (a.ty.style.width = "1px"), h >= f && b >= c && m <= n && (a.uy.style.height = "1px") + } + } else dj(this.Y) + }; + D.prototype.Ru = function () { + this.Y.isEnabled ? this.Y.sy = !0 : dj(this.Y) + }; + D.prototype.computeBounds = D.prototype.kg = function () { + 0 < this.Xf.count && ej(this); + return fj(this) + }; + + function fj(a) { + if (a.uD.J()) { + var b = a.uD.copy(); + b.yv(a.padding); + return b + } + for (var c = !0, d = a.Zb.n, e = d.length, f = 0; f < e; f++) { + var h = d[f]; + if (h.visible && (!h.Ac || h.KD)) for (var h = h.Db.n, k = h.length, l = 0; l < k; l++) { + var m = h[l]; + m.uz && m.Ea() && (m = m.ba, m.J() && (c ? (c = !1, b = m.copy()) : b.Sh(m))) + } + } + c && (b = new z(0, 0, 0, 0)); + b.yv(a.padding); + return b + } + + D.prototype.computePartsBounds = function (a) { + var b = null; + for (a = a.i; a.next();) { + var c = a.value; + c instanceof W || (c.pf(), null === b ? b = c.ba.copy() : b.Sh(c.ba)) + } + return null === b ? new z(NaN, NaN, 0, 0) : b + }; + + function gj(a, b) { + if ((b || a.lf) && !a.sc && null !== a.ib && !a.Lb.Vg && a.Cd.J()) { + a.sc = !0; + var c = a.xl; + b && a.tk !== vf && (c = a.tk); + var d = c !== vf ? hj(a, c) : a.scale, c = a.ob.copy(), e = a.Ab / d, f = a.zb / d, h = null, k = a.Lb; + k.ld && (h = a.Ma.copy()); + a.position.La(); + var l = a.dn; + b && !l.pd() && a.An.pd() && (l = a.An); + ij(a, a.Ma, a.Cd, e, f, l, b); + a.position.freeze(); + null !== h && si(k, h, a.Ma); + a.scale = d; + a.sc = !1; + d = a.ob; + d.De(c) || a.dt(c, d) + } + } + + function hj(a, b) { + var c = a.Eb.Pv; + if (null === a.ib) return c; + a.ei && jj(a, a.kg()); + var d = a.Cd; + if (!d.J()) return c; + var e = d.width, d = d.height, f = a.Ab, h = a.zb, k = f / e, l = h / d; + return b === kj ? (e = Math.min(l, k), e > c && (e = c), e < a.Yg && (e = a.Yg), e > a.Xg && (e = a.Xg), e) : b === lj ? (e = l > k ? (h - a.zd) / d : (f - a.zd) / e, e > c && (e = c), e < a.Yg && (e = a.Yg), e > a.Xg && (e = a.Xg), e) : a.scale + } + + D.prototype.zoomToFit = D.prototype.zoomToFit = function () { + this.scale = hj(this, kj) + }; + D.prototype.zoomToRect = function (a, b) { + void 0 === b && (b = kj); + var c = a.width, d = a.height; + if (!(0 === c || 0 === d || isNaN(c) && isNaN(d))) { + var e = 1; + if (b === kj || b === lj) if (isNaN(c)) e = this.ob.height * this.scale / d; else if (isNaN(d)) e = this.ob.width * this.scale / c; else var e = this.Ab, + f = this.zb, + e = b === lj ? f / d > e / c ? (f - (this.qk ? this.zd : 0)) / d : (e - (this.rk ? this.zd : 0)) / c : Math.min(f / d, e / c); + this.scale = e; + this.position = new w(a.x, a.y) + } + }; + u.defineProperty(D, {qz: null}, function () { + return this.sc + }, function (a) { + this.sc = a + }); + D.prototype.alignDocument = function (a, b) { + this.ei && jj(this, this.kg()); + var c = this.Cd, d = this.ob, e = this.sc; + this.sc = !0; + this.position = new w(c.x + (a.x * c.width + a.offsetX) - (b.x * d.width - b.offsetX), c.y + (a.y * c.height + a.offsetY) - (b.y * d.height - b.offsetY)); + this.sc = e; + this.ma() + }; + + function ij(a, b, c, d, e, f, h) { + var k = b.x, l = b.y; + if (h || a.yE === Ni) f.pd() && (d > c.width && (k = c.x + (f.x * c.width + f.offsetX) - (f.x * d - f.offsetX)), e > c.height && (l = c.y + (f.y * c.height + f.offsetY) - (f.y * e - f.offsetY))), f = a.xE, h = d - c.width, d < c.width + f.left + f.right ? (k = Math.min(k + d / 2, c.right + Math.max(h, f.right) - d / 2), k = Math.max(k, c.left - Math.max(h, f.left) + d / 2), k -= d / 2) : k > c.left ? k = c.left : k < c.right - d && (k = c.right - d), d = e - c.height, e < c.height + f.top + f.bottom ? (l = Math.min(l + e / 2, c.bottom + Math.max(d, f.bottom) - e / 2), l = Math.max(l, c.top - Math.max(d, + f.top) + e / 2), l -= e / 2) : l > c.top ? l = c.top : l < c.bottom - e && (l = c.bottom - e); + b.x = isFinite(k) ? k : -a.padding.left; + b.y = isFinite(l) ? l : -a.padding.top; + null !== a.gE && (a = a.gE(a, b), b.x = a.x, b.y = a.y) + } + + D.prototype.findPartAt = D.prototype.zs = function (a, b) { + var c = b ? wg(this, a, function (a) { + return a.T + }, function (a) { + return a.canSelect() + }) : wg(this, a, function (a) { + return a.T + }); + return c instanceof G ? c : null + }; + D.prototype.findObjectAt = D.prototype.ke = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + ej(this); + for (var d = this.Zb.Fm; d.next();) { + var e = d.value; + if (e.visible && (e = e.ke(a, b, c), null !== e)) return e + } + return null + }; + + function wg(a, b, c, d) { + void 0 === c && (c = null); + void 0 === d && (d = null); + ej(a); + for (a = a.Zb.Fm; a.next();) { + var e = a.value; + if (e.visible && !e.Ac && (e = e.ke(b, c, d), null !== e)) return e + } + return null + } + + D.prototype.findObjectsAt = D.prototype.ys = function (a, b, c, d) { + void 0 === b && (b = null); + void 0 === c && (c = null); + d instanceof E || d instanceof F || (d = new F(S)); + ej(this); + for (var e = this.Zb.Fm; e.next();) { + var f = e.value; + f.visible && f.ys(a, b, c, d) + } + return d + }; + D.prototype.findObjectsIn = D.prototype.Nj = function (a, b, c, d, e) { + void 0 === b && (b = null); + void 0 === c && (c = null); + void 0 === d && (d = !1); + e instanceof E || e instanceof F || (e = new F(S)); + ej(this); + for (var f = this.Zb.Fm; f.next();) { + var h = f.value; + h.visible && h.Nj(a, b, c, d, e) + } + return e + }; + D.prototype.dz = function (a, b, c, d, e, f) { + var h = new F(S); + ej(this); + for (var k = this.Zb.Fm; k.next();) { + var l = k.value; + l.visible && l.dz(a, b, c, d, h, e, f) + } + return h + }; + D.prototype.findObjectsNear = D.prototype.ym = function (a, b, c, d, e, f) { + void 0 === c && (c = null); + void 0 === d && (d = null); + void 0 === e && (e = !0); + if (!1 !== e && !0 !== e) { + if (e instanceof E || e instanceof F) f = e; + e = !0 + } + f instanceof E || f instanceof F || (f = new F(S)); + ej(this); + for (var h = this.Zb.Fm; h.next();) { + var k = h.value; + k.visible && k.ym(a, b, c, d, e, f) + } + return f + }; + + function yf(a) { + -1 !== a.lv && (u.clearTimeout(a.lv), a.lv = -1) + } + + function mj(a, b) { + var c = b.copy(); + a.lv = u.setTimeout(function () { + c.button = 2; + a.N = c; + a.kv = !0; + a.doMouseUp() + }, 850) + } + + D.prototype.acceptEvent = function (a) { + var b = this.Jc; + this.Jc = this.Ob; + this.Ob = b; + nj(this, this, a, b, a instanceof MouseEvent); + return b + }; + + function nj(a, b, c, d, e) { + d.g = b; + e ? oj(a, c, d) : (d.ff = b.Ob.ff, d.da = b.Ob.da); + a = 0; + c.ctrlKey && (a += 1); + c.altKey && (a += 2); + c.shiftKey && (a += 4); + c.metaKey && (a += 8); + d.gd = a; + d.button = c.button; + u.Em && 0 === c.button && c.ctrlKey && (d.button = 2); + d.Wk = !1; + d.up = !1; + d.Te = 1; + d.Uk = 0; + d.Tc = !1; + d.bubbles = !1; + d.event = c; + d.timestamp = Date.now(); + d.Ps = !1; + d.Cg = c.target.Y ? c.target.Y : null; + d.pe = null + } + + function pj(a, b, c, d, e) { + d.g = a; + oj(a, c, d); + d.gd = 0; + d.button = 0; + d.Wk = !0; + d.up = !1; + d.Te = 1; + d.Uk = 0; + d.Tc = !1; + d.bubbles = !0; + d.event = b; + d.timestamp = Date.now(); + d.Ps = e; + d.Cg = b.target.Y ? b.target.Y : null; + d.pe = null; + a.nk = d.copy(); + Ef = null + } + + function qj(a, b, c, d, e) { + var f = null; + d.g = a; + if (null !== c) { + var f = window.document.elementFromPoint(c.clientX, c.clientY), h; + f && f.Y ? h = f.Y : (c = b.changedTouches[0], h = a); + oj(a, c, d) + } else null !== a.Jc ? (d.da = a.Jc.da, d.ff = a.Jc.ff, d.Cg = a.Jc.Cg) : null !== a.nk && (d.da = a.nk.da, d.ff = a.nk.ff, d.Cg = a.nk.Cg); + d.gd = 0; + d.button = 0; + d.Wk = !1; + d.up = !1; + d.Te = 1; + d.Uk = 0; + d.Tc = !1; + d.bubbles = !1; + d.event = b; + d.timestamp = Date.now(); + d.Ps = e; + d.Cg = h; + d.pe = null + } + + function rj(a, b) { + if (a.bubbles) return !0; + void 0 !== b.stopPropagation && b.stopPropagation(); + (void 0 === b.touches || 2 > b.touches.length) && b.preventDefault(); + b.cancelBubble = !0; + return !1 + } + + D.prototype.kH = function (a) { + if (!this.Y.isEnabled) return !1; + var b = this.Y.Ob; + nj(this.Y, this.Y, a, b, !1); + b.key = String.fromCharCode(a.which); + b.Wk = !0; + switch (a.which) { + case 8: + b.key = "Backspace"; + break; + case 33: + b.key = "PageUp"; + break; + case 34: + b.key = "PageDown"; + break; + case 35: + b.key = "End"; + break; + case 36: + b.key = "Home"; + break; + case 37: + b.key = "Left"; + break; + case 38: + b.key = "Up"; + break; + case 39: + b.key = "Right"; + break; + case 40: + b.key = "Down"; + break; + case 45: + b.key = "Insert"; + break; + case 46: + b.key = "Del"; + break; + case 48: + b.key = "0"; + break; + case 187: + case 61: + case 107: + b.key = + "Add"; + break; + case 189: + case 173: + case 109: + b.key = "Subtract"; + break; + case 27: + b.key = "Esc" + } + this.Y.doKeyDown(); + return 187 !== a.which && 189 !== a.which && 48 !== a.which && 107 !== a.which && 109 !== a.which && 61 !== a.which && 173 !== a.which || !0 !== a.ctrlKey ? rj(b, a) : (a.cancelBubble = !0, a.preventDefault(), a.stopPropagation(), !1) + }; + D.prototype.lH = function (a) { + if (!this.Y.isEnabled) return !1; + var b = this.Y.Ob; + nj(this.Y, this.Y, a, b, !1); + b.key = String.fromCharCode(a.which); + b.up = !0; + switch (a.which) { + case 8: + b.key = "Backspace"; + break; + case 33: + b.key = "PageUp"; + break; + case 34: + b.key = "PageDown"; + break; + case 35: + b.key = "End"; + break; + case 36: + b.key = "Home"; + break; + case 37: + b.key = "Left"; + break; + case 38: + b.key = "Up"; + break; + case 39: + b.key = "Right"; + break; + case 40: + b.key = "Down"; + break; + case 45: + b.key = "Insert"; + break; + case 46: + b.key = "Del"; + break; + case 93: + a.preventDefault() + } + this.Y.doKeyUp(); + return rj(b, a) + }; + D.prototype.$p = function (a) { + var b = this.ib; + if (null === b) return new w(0, 0); + var c = this.Ab, d = this.zb, b = b.getBoundingClientRect(), c = a.clientX - c / b.width * b.left; + a = a.clientY - d / b.height * b.top; + return null !== this.Sd ? (a = new w(c, a), Wa(a, this.Sd), a) : new w(c, a) + }; + + function oj(a, b, c) { + var d = a.ib, e = a.Ab, f = a.zb, h = 0, k = 0; + null !== d && (d = d.getBoundingClientRect(), h = b.clientX - e / d.width * d.left, k = b.clientY - f / d.height * d.top); + c.ff.m(h, k); + null !== a.Sd ? (b = u.fc(h, k), a.Sd.Oh(b), c.da.assign(b), u.v(b)) : c.da.m(h, k) + } + + D.prototype.invalidateDocumentBounds = D.prototype.pc = function () { + this.ei || (this.ei = !0, this.de(!0)) + }; + + function qi(a) { + a.vd || ej(a); + a.ei && jj(a, a.kg()); + for (a = a.Ul.i; a.next();) qi(a.value) + } + + D.prototype.redraw = D.prototype.Sz = function () { + this.sc || this.vd || (this.ma(), sj(this), cj(this), this.pc(), this.bf()) + }; + D.prototype.isUpdateRequested = function () { + return this.Ef + }; + D.prototype.delayInitialization = D.prototype.oG = function (a) { + void 0 === a && (a = null); + var b = this.Lb, c = b.isEnabled; + b.Mi(); + b.isEnabled = !1; + Dg(this); + this.lf = !1; + b.isEnabled = c; + null !== a && u.setTimeout(a, 1) + }; + D.prototype.requestUpdate = D.prototype.de = function (a) { + void 0 === a && (a = !1); + if (!0 !== this.Ef && !(this.sc || !1 === a && this.vd)) { + this.Ef = !0; + var b = this; + requestAnimationFrame(function () { + b.Ef && b.bf() + }) + } + }; + D.prototype.maybeUpdate = D.prototype.bf = function () { + if (!this.un || this.Ef) this.un && (this.un = !1), Dg(this) + }; + + function tj(a, b) { + a.sc || !a.Hl || dj(a) || (b && ej(a), gj(a, !1)) + } + + function Dg(a) { + if (!a.vd && (a.Ef = !1, null !== a.Jb)) { + a.vd = !0; + var b = a.Uh, c = a.VB; + if (!b.Fn && 0 !== c.length) { + for (var d = c.n, e = d.length, f = 0; f < e; f++) { + var h = d[f]; + uj(h, !1); + h.R() + } + c.clear() + } + d = c = !1; + b.Vg && (d = !0, c = a.cb, a.cb = !0); + b.ld || gi(a); + tj(a, !1); + null !== a.ad && (a.ad.visible && !a.lu && (vj(a), a.lu = !0), !a.ad.visible && a.lu && (a.lu = !1)); + ej(a); + 0 !== a.El.count && (wj(a), ej(a)); + e = !1; + if (!a.lf || a.Ot) a.lf ? xj(a, !a.du) : (a.Wb("Initial Layout"), !1 === b.isEnabled && b.Mi(), xj(a, !1)), e = !0; + a.du = !1; + ej(a); + a.xy || b.Vg || qi(a); + e && (a.lf || (b = a.Zb.n, a.xf(b, + b.length, a), yj(a), vj(a)), a.za("LayoutCompleted")); + tj(a, !0); + ej(a); + e && !a.lf && (a.lf = !0, a.Wd("Initial Layout"), a.cb || a.ha.clear(), u.setTimeout(function () { + a.Qh = !1 + }, 1)); + a.We(); + d && (a.cb = c); + a.vd = !1 + } + } + + function yj(a) { + if (a.tk !== vf) a.scale = hj(a, a.tk); else if (a.xl !== vf) a.scale = hj(a, a.xl); else { + var b = a.UG; + isFinite(b) && 0 < b && (a.scale = b) + } + a.ei && jj(a, a.kg()); + b = a.TG; + if (b.J()) a.position = b; else { + b = u.K(); + b.pt(a.Cd, a.SG); + var c = a.ob, c = u.Vj(0, 0, c.width, c.height), d = u.K(); + d.pt(c, a.VG); + a.position = new w(b.x - d.x, b.y - d.y); + u.ic(c); + u.v(d); + u.v(b); + gj(a, !0) + } + a.za("InitialLayoutCompleted") + } + + function ej(a) { + if ((a.vd || !a.Lb.Vg) && 0 !== a.Xf.count) for (var b = 0; 23 > b; b++) { + var c = a.Xf.i; + if (null === c || 0 === a.Xf.count) break; + a.Xf = new F(S); + var d = a, e = a.Xf; + for (c.reset(); c.next();) { + var f = c.value; + !f.Fd() || f instanceof V || !f.Ea() || (f.hl() ? (Ph(f, Infinity, Infinity), f.zc()) : e.add(f)) + } + for (c.reset(); c.next();) f = c.value, f instanceof V && f.Ea() && zj(d, f); + for (c.reset(); c.next();) f = c.value, f instanceof W && (d = f, d.Ea() && (d.hl() ? (Ph(d, Infinity, Infinity), d.zc(), d.Xs()) : e.add(d))); + for (c.reset(); c.next();) d = c.value, d instanceof + lf && d.Ea() && (d.hl() ? (Ph(d, Infinity, Infinity), d.zc()) : e.add(d)) + } + } + + function zj(a, b) { + for (var c = u.eb(), d = u.eb(), e = b.Mc; e.next();) { + var f = e.value; + f.Ea() && (f instanceof V ? (Aj(f) || Bj(f) || Cj(f)) && zj(a, f) : f instanceof W ? f.W == b || f.ca == b ? d.push(f) : c.push(f) : (Ph(f, Infinity, Infinity), f.zc())) + } + for (var e = c.length, h = 0; h < e; h++) f = c[h], Ph(f, Infinity, Infinity), f.zc(); + u.ra(c); + Ph(b, Infinity, Infinity); + b.zc(); + e = d.length; + for (h = 0; h < e; h++) f = d[h], Ph(f, Infinity, Infinity), f.zc(); + u.ra(d) + } + + D.prototype.xf = function (a, b, c, d) { + var e = this.Uh; + if (this.uk || e.Vg) for (e = 0; e < b; e++) a[e].xf(c, d) + }; + D.prototype.We = function (a, b) { + void 0 === a && (a = this.Gg); + void 0 === b && (b = null); + null === this.Jb && u.k("No div specified"); + var c = this.ib; + null === c && u.k("No canvas specified"); + if (this.Uh.ld) 0 === this.ha.Le && this.de(!0); else { + Dj(this); + var d = a !== this.Gg, e = this.Zb.n, f = e.length, h = this; + this.xf(e, f, h); + if (d) $i(this, a), cj(this); else if (!this.Md && null === b) return; + var k = this.Ma, l = this.$b, m = Math.round(k.x * l) / l, n = Math.round(k.y * l) / l, f = this.Sd; + f.reset(); + 1 !== l && f.scale(l); + 0 === k.x && 0 === k.y || f.translate(-m, -n); + k = this.nf; + u.Dm ? + (c.width = c.width, $i(this, a), a.scale(k, k)) : (a.setTransform(1, 0, 0, 1, 0, 0), a.scale(k, k), a.clearRect(0, 0, this.Ab, this.zb)); + a.miterLimit = 9; + a.setTransform(1, 0, 0, 1, 0, 0); + a.scale(k, k); + a.transform(f.m11, f.m12, f.m21, f.m22, f.dx, f.dy); + c = null !== b ? function (c) { + var d = a, e = b; + if (c.visible && 0 !== c.Ic) { + 1 !== c.Ic && (d.globalAlpha = c.Ic); + var f = c.Uu; + f.length = 0; + var k = h.scale; + c = c.Db.n; + for (var l = c.length, m = 0; m < l; m++) { + var n = c[m]; + if ((ti(n) || vi(n)) && !e.contains(n)) { + if (n instanceof W) { + var y = n; + y.dc && f.push(y); + if (!1 === y.hg) continue + } + y = + n.ba; + 1 < y.width * k || 1 < y.height * k ? n.We(d, h) : wi(n, d) + } + } + d.globalAlpha = 1 + } + } : function (b) { + b.We(a, h) + }; + Ej(this, a); + f = e.length; + for (k = 0; k < f; k++) c(e[k]); + this.sk ? this.sk.wl(this) && this.Zw() : this.$p = function () { + return new w(0, 0) + }; + d ? ($i(this), cj(this)) : this.Md = this.uk = !1 + } + }; + + function Fj(a, b, c, d, e) { + null === a.Jb && u.k("No div specified"); + var f = a.ib; + null === f && u.k("No canvas specified"); + var h = a.Gg; + if (a.Md) { + Dj(a); + var k = a.nf; + u.Dm ? (f.width = f.width, $i(a, h)) : (h.setTransform(1, 0, 0, 1, 0, 0), h.clearRect(0, 0, a.Ab * k, a.zb * k)); + h.GD = !1; + h.drawImage(a.Dx.Dd, 0 < d ? 0 : Math.round(-d), 0 < e ? 0 : Math.round(-e)); + e = a.Ma; + var f = a.$b, l = Math.round(e.x * f) / f, m = Math.round(e.y * f) / f; + d = a.Sd; + d.reset(); + 1 !== f && d.scale(f); + 0 === e.x && 0 === e.y || d.translate(-l, -m); + h.save(); + h.beginPath(); + e = c.length; + for (f = 0; f < e; f++) l = c[f], 0 !== + l.width && 0 !== l.height && h.rect(Math.floor(l.x), Math.floor(l.y), Math.ceil(l.width), Math.ceil(l.height)); + h.clip(); + h.setTransform(1, 0, 0, 1, 0, 0); + h.scale(k, k); + h.transform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + c = a.Zb.n; + e = c.length; + a.xf(c, e, a); + Ej(a, h); + for (f = 0; f < e; f++) xi(c[f], h, a, b); + h.restore(); + $i(a); + a.sk ? a.sk.wl(a) && a.Zw() : a.$p = function () { + return new w(0, 0) + }; + a.uk = !1; + a.Md = !1; + a.hE() + } + } + + function Gj(a, b, c, d, e, f, h, k, l, m) { + null === a.Jb && u.k("No div specified"); + null === a.ib && u.k("No canvas specified"); + void 0 === h && (h = null); + void 0 === k && (k = null); + void 0 === l && (l = !1); + void 0 === m && (m = !1); + Dj(a); + $i(a); + cj(a); + a.Tx = !0; + var n = new z(f.x, f.y, d.width / e, d.height / e), p = n.copy(); + p.yv(c); + vj(a, p); + ej(a); + var p = a.Zb.n, q = p.length; + a.xf(p, q, a, n); + var r = a.nf; + b.setTransform(1, 0, 0, 1, 0, 0); + b.scale(r, r); + b.clearRect(0, 0, d.width, d.height); + null !== k && "" !== k && (b.fillStyle = k, b.fillRect(0, 0, d.width, d.height)); + d = u.jh(); + d.reset(); + d.translate(c.left, c.top); + d.scale(e); + 0 === f.x && 0 === f.y || d.translate(-f.x, -f.y); + b.setTransform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + u.Ye(d); + Ej(a, b); + if (null !== h) { + var s = new F(S); + c = h.i; + for (c.reset(); c.next();) e = c.value, !1 === m && "Grid" === e.layer.name || null === e || s.add(e); + c = function (c) { + var d = l; + if (c.visible && 0 !== c.Ic && (void 0 === d && (d = !0), d || !c.Ac)) { + 1 !== c.Ic && (b.globalAlpha = c.Ic); + d = c.Uu; + d.length = 0; + var e = a.scale; + c = c.Db.n; + for (var f = c.length, h = 0; h < f; h++) { + var k = c[h]; + if ((ti(k) || vi(k)) && s.contains(k)) { + if (k instanceof + W) { + var m = k; + m.dc && d.push(m); + if (!1 === m.hg) continue + } + m = k.ba; + 1 < m.width * e || 1 < m.height * e ? k.We(b, a) : wi(k, b) + } + } + b.globalAlpha = 1 + } + } + } else if (!l && m) { + var t = a.Gs.T, v = t.layer; + c = function (c) { + c === v ? t.We(b, a) : c.We(b, a, n, l, m) + } + } else c = function (c) { + c.We(b, a, n, l, m) + }; + for (e = 0; e < q; e++) c(p[e]); + a.Tx = !1; + a.sk ? a.sk.wl(a) && a.Zw() : a.$p = function () { + return new w(0, 0) + }; + $i(a); + cj(a); + a.xf(p, q, a); + vj(a) + } + + D.prototype.getRenderingHint = D.prototype.$v = function (a) { + return this.Qg[a] + }; + D.prototype.setRenderingHint = D.prototype.iI = function (a, b) { + this.Qg[a] = b; + this.Sz() + }; + D.prototype.resetRenderingHints = D.prototype.qE = function () { + this.Qg = new pa; + this.Qg.drawShadows = !0; + this.Qg.textGreeking = !0; + this.Qg.viewportOptimizations = u.cH ? !1 : !0; + this.Qg.temporaryPixelRatio = !0; + this.Qg.pictureRatioOptimization = !0 + }; + + function Ej(a, b) { + var c = a.Qg; + if (null !== c) { + if (void 0 !== c.imageSmoothingEnabled) { + var d = !!c.imageSmoothingEnabled; + b.GD = d; + b.aK = d + } + c = c.defaultFont; + void 0 !== c && null !== c && (b.font = c, b.Et = c) + } + } + + D.prototype.getInputOption = D.prototype.gz = function (a) { + return this.dq[a] + }; + D.prototype.setInputOption = function (a, b) { + this.dq[a] = b + }; + D.prototype.resetInputOptions = D.prototype.pE = function () { + this.dq = new pa; + this.dq.extraTouchArea = 10; + this.dq.extraTouchThreshold = 10 + }; + D.prototype.setProperties = function (a) { + u.ot(this, a) + }; + + function wj(a) { + if (0 === a.ha.Le) { + for (var b = a.El.i; b.next();) { + var c = b.key, d = b.value; + c.le(); + eh(c, d) + } + a.El.clear() + } + } + + D.prototype.ma = function (a) { + void 0 === a && (a = null); + if (null === a) this.Md = !0, this.de(); else { + var b = this.ob; + null !== a && a.J() && b.sg(a) && (this.Md = !0, this.de()) + } + for (b = this.Ul.i; b.next();) b.value.ma(a) + }; + D.prototype.nz = function (a, b) { + if (!0 !== this.Md) { + this.Md = !0; + var c = !0 === this.$v("temporaryPixelRatio"); + if (!0 === this.$v("viewportOptimizations") && this.yE !== Hj && this.xE.Tv(0, 0, 0, 0) && b.width === a.width && b.height === a.height) { + var d = this.scale, e = u.Sf(), f = Math.max(a.x, b.x), h = Math.max(a.y, b.y), + k = Math.min(a.x + a.width, b.x + b.width), l = Math.min(a.y + a.height, b.y + b.height); + e.x = f; + e.y = h; + e.width = Math.max(0, k - f) * d; + e.height = Math.max(0, l - h) * d; + if (0 < e.width && 0 < e.height) { + if (!this.vd && (this.Ef = !1, null !== this.Jb)) { + this.vd = !0; + ej(this); + 0 !== this.El.count && (wj(this), ej(this)); + this.Cd.J() || jj(this, this.kg()); + var m = this.ib; + if (null !== m) { + var n = this.nf, h = this.Ab * n, k = this.zb * n, f = this.scale * n, + d = Math.round(Math.round(b.x * f) - Math.round(a.x * f)), + f = Math.round(Math.round(b.y * f) - Math.round(a.y * f)), l = this.Dx, p = this.dB; + l.width !== h && (l.width = h); + l.height !== k && (l.height = k); + p.clearRect(0, 0, h, k); + var l = 190 * this.nf, q = 70 * this.nf, r = Math.max(d, 0), s = Math.max(f, 0), + t = Math.floor(h - r), v = Math.floor(k - s); + p.GD = !1; + p.drawImage(m.Dd, r, s, t, v, 0, 0, t, v); + this.sk.wl(this) && + p.clearRect(0, 0, l, q); + var m = u.eb(), p = u.eb(), v = Math.abs(d), t = Math.abs(f), x = 0 === r ? 0 : h - v, + r = u.fc(x, 0), v = u.fc(v + x, k); + p.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + var B = this.Sd; + B.reset(); + B.scale(n, n); + 1 !== this.$b && B.scale(this.$b); + n = this.Ma; + (0 !== n.x || 0 !== n.y) && isFinite(n.x) && isFinite(n.y) && B.translate(-n.x, -n.y); + Wa(r, B); + Wa(v, B); + m.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + x = 0 === s ? 0 : k - t; + r.m(0, x); + v.m(h, t + x); + p.push(new z(Math.min(r.x, + v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + Wa(r, B); + Wa(v, B); + m.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + this.sk.wl(this) && (h = 0 < d ? 0 : -d, k = 0 < f ? 0 : -f, r.m(h, k), v.m(l + h, q + k), p.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))), Wa(r, B), Wa(v, B), m.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y)))); + u.v(r); + u.v(v); + tj(this, !1); + Fj(this, m, p, d, f); + u.ra(m); + u.ra(p); + this.vd = !1 + } + } + } else this.bf(); + u.ic(e); + c && (this.im = 1, this.bf(), ki(this, !0)) + } else c ? (this.im = 1, this.bf(), ki(this, !0)) : this.bf(); + for (c = this.Ul.i; c.next();) c.value.nz() + } + }; + + function sj(a) { + !1 === a.Hl && (a.Hl = !0) + } + + function cj(a) { + !1 === a.uk && (a.uk = !0) + } + + function Dj(a) { + !1 !== a.fq && (a.fq = !1, Ij(a, a.Ab, a.zb)) + } + + function Ij(a, b, c) { + var d = a.ib, e = a.nf, f = b * e, e = c * e; + if (d.width !== f || d.height !== e) d.width = f, d.height = e, d.style.width = b + "px", d.style.height = c + "px", a.Md = !0, $i(a) + } + + function dj(a) { + var b = a.ib; + if (null === b) return !0; + var c = a.Jb, d = a.Ab, e = a.zb, f = a.CC.copy(), h = !1, k = a.rk ? a.zd : 0, l = a.qk ? a.zd : 0, + m = c.clientWidth || d + k, c = c.clientHeight || e + l; + if (m !== d + k || c !== e + l) a.rk = !1, a.qk = !1, l = k = 0, a.Ab = m, a.zb = c, h = a.fq = !0; + a.Hl = !1; + if (a.Lb.Vg) return h ? (a.Lb.Mi(), a.oG(), !1) : !0; + var n = a.ob, p = a.Cd, m = p.width, c = p.height, q = n.width, r = n.height, s = p.x, t = n.x, v = p.right, + k = n.right + k, x = p.y, B = n.y, p = p.bottom, l = n.bottom + l, y = n = "1px", C = a.scale; + a.kz && a.Re && (n = 1, s + 1 < t && (n = Math.max((t - s) * C + a.Ab, n)), v > k + 1 && (n = Math.max((v - + k) * C + a.Ab, n)), q + 1 < m && (n = Math.max((m - q) * C + a.Ab, n)), n += "px"); + a.lz && a.Se && (y = 1, x + 1 < B && (y = Math.max((B - x) * C + a.zb, y)), p > l + 1 && (y = Math.max((p - l) * C + a.zb, y)), r + 1 < c && (y = Math.max((c - r) * C + a.zb, y)), y += "px"); + var I = "1px" !== n, H = "1px" !== y; + if ((!I || !H) && I || H) H && (k -= a.zd), I && (l -= a.zd), a.kz && a.Re && (n = 1, s + 1 < t && (n = Math.max((t - s) * C + a.Ab, n)), v > k + 1 && (n = Math.max((v - k) * C + a.Ab, n)), q + 1 < m && (n = Math.max((m - q) * C + a.Ab, n)), n += "px"), a.lz && a.Se && (y = 1, x + 1 < B && (y = Math.max((B - x) * C + a.zb, y)), p > l + 1 && (y = Math.max((p - l) * C + a.zb, y)), r + 1 < c && (y = Math.max((c - + r) * C + a.zb, y)), y += "px"), I = "1px" !== n, H = "1px" !== y; + if (a.Zu && I === a.qk && H === a.rk) return d === a.Ab && e === a.zb || a.bf(), !1; + I !== a.qk && (a.zb = "1px" === n ? a.zb + a.zd : Math.max(a.zb - a.zd, 1), h = !0); + a.qk = I; + a.ty.style.width = n; + H !== a.rk && (a.Ab = "1px" === y ? a.Ab + a.zd : Math.max(a.Ab - a.zd, 1), h = !0, a.wB && (H ? (b.style.left = a.zd + "px", a.position = new w(a.Ma.x + a.zd / a.scale, a.Ma.y)) : (b.style.left = "0px", a.position = new w(a.Ma.x - a.zd / a.scale, a.Ma.y)))); + a.rk = H; + a.uy.style.height = y; + a.kz && a.Re && (q + 1 < m ? a.uj.scrollLeft = (a.position.x - s) * C : s + 1 < t ? a.uj.scrollLeft = + a.uj.scrollWidth - a.uj.clientWidth : v > k + 1 && (a.uj.scrollLeft = a.position.x * C)); + a.lz && a.Se && (r + 1 < c ? a.vj.scrollTop = (a.position.y - x) * C : x + 1 < B ? a.vj.scrollTop = a.vj.scrollHeight - a.vj.clientHeight : p > l + 1 && (a.vj.scrollTop = a.position.y * C)); + h && (a.fq = !0); + m = a.Ab; + c = a.zb; + a.vj.style.height = c + "px"; + a.vj.style.width = m + (a.rk ? a.zd : 0) + "px"; + a.uj.style.width = m + "px"; + a.uj.style.height = c + (a.qk ? a.zd : 0) + "px"; + a.sy = !1; + return d !== m || e !== c || a.Lb.ld ? (n = a.ob, a.dt(f, n, h), !1) : !0 + } + + D.prototype.add = D.prototype.add = function (a) { + u.C(a, G, D, "add:part"); + var b = a.g; + if (b !== this) { + null !== b && u.k("Cannot add part " + a.toString() + " to " + this.toString() + ". It is already a part of " + b.toString()); + this.Vm && (a.wk = "Tool"); + var c = a.wf, b = this.ws(c); + null === b && (b = this.ws("")); + null === b && u.k('Cannot add a Part when unable find a Layer named "' + c + '" and there is no default Layer'); + a.layer !== b && (c = b.Eo(99999999, a, a.g === this), 0 <= c && this.Dc(be, "parts", b, null, a, null, c), b.Ac || this.pc(), a.H(Jj), c = a.Rs, null !== + c && c(a, null, b)) + } + }; + D.prototype.Eo = function (a) { + if (a instanceof U) { + if (this.Rn.add(a), a instanceof V) { + var b = a.Ra; + null === b ? this.Ik.add(a) : b.Pn.add(a); + b = a.Qb; + null !== b && (b.g = this) + } + } else a instanceof W ? this.Nn.add(a) : a instanceof lf || this.Db.add(a); + var c = this; + Kj(a, function (a) { + Lj(c, a) + }); + a.Pb && a.R(); + b = a.data; + null !== b && (a instanceof lf || (a instanceof W ? this.lk.add(b, a) : this.$h.add(b, a)), Kj(a, function (a) { + Mj(c, a) + })); + !0 !== Bj(a) && !0 !== Cj(a) || this.Xf.add(a); + Nj(a, !0, this); + Oj(a) ? (a.ba.J() && this.ma(yi(a, a.ba)), this.pc()) : a.Ea() && a.ba.J() && + this.ma(yi(a, a.ba)); + this.de() + }; + D.prototype.Fe = function (a) { + a.ls(); + if (a instanceof U) { + if (this.Rn.remove(a), a instanceof V) { + var b = a.Ra; + null === b ? this.Ik.remove(a) : b.Pn.remove(a); + b = a.Qb; + null !== b && (b.g = null) + } + } else a instanceof W ? this.Nn.remove(a) : a instanceof lf || this.Db.remove(a); + var c = this; + Kj(a, function (a) { + Pj(c, a) + }); + b = a.data; + null !== b && (a instanceof lf || (a instanceof W ? this.lk.remove(b) : this.$h.remove(b)), Kj(a, function (a) { + Qj(c, a) + })); + this.Xf.remove(a); + Oj(a) ? (a.ba.J() && this.ma(yi(a, a.ba)), this.pc()) : a.Ea() && a.ba.J() && this.ma(yi(a, a.ba)); + this.de() + }; + D.prototype.remove = D.prototype.remove = function (a) { + u.C(a, G, D, "remove:part"); + a.Za = !1; + a.Wg = !1; + var b = a.layer; + if (null !== b && b.g === this) { + a.H(Rj); + a.xm(); + var c = b.Fe(-1, a, !1); + 0 <= c && this.Dc(ce, "parts", b, a, null, c, null); + c = a.Rs; + null !== c && c(a, b, null) + } + }; + D.prototype.removeParts = D.prototype.Wz = function (a, b) { + if (u.isArray(a)) for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + b && !e.canDelete() || this.remove(e) + } else for (e = new F(G), e.Td(a), c = e.i; c.next();) e = c.value, b && !e.canDelete() || this.remove(e) + }; + D.prototype.copyParts = D.prototype.to = function (a, b, c) { + return this.Eb.to(a, b, c) + }; + D.prototype.moveParts = D.prototype.moveParts = function (a, b, c) { + u.C(b, w, D, "moveParts:offset"); + var d = this.tb; + if (null !== d) { + d = d.Ed; + null === d && (d = new uf, d.Ec(this)); + var e = new la(G, Object); + if (null !== a) a = a.i; else { + for (a = this.Sj; a.next();) Hf(d, e, a.value, c); + for (a = this.yg; a.next();) Hf(d, e, a.value, c); + a = this.links + } + for (; a.next();) Hf(d, e, a.value, c); + d.moveParts(e, b, c) + } + }; + + function Sj(a, b, c) { + u.C(b, we, D, "addLayer:layer"); + null !== b.g && b.g !== a && u.k("Cannot share a Layer with another Diagram: " + b + " of " + b.g); + null === c ? null !== b.g && u.k("Cannot add an existing Layer to this Diagram again: " + b) : (u.C(c, we, D, "addLayer:existingLayer"), c.g !== a && u.k("Existing Layer must be in this Diagram: " + c + " not in " + c.g), b === c && u.k("Cannot move a Layer before or after itself: " + b)); + if (b.g !== a) { + b = b.name; + a = a.Zb; + c = a.count; + for (var d = 0; d < c; d++) a.ja(d).name === b && u.k("Cannot add Layer with the name '" + + b + "'; a Layer with the same name is already present in this Diagram.") + } + } + + D.prototype.addLayer = D.prototype.cs = function (a) { + Sj(this, a, null); + a.Ec(this); + var b = this.Zb, c = b.count - 1; + if (!a.Ac) for (; 0 <= c && b.ja(c).Ac;) c--; + b.Yd(c + 1, a); + null !== this.Od && this.Dc(be, "layers", this, null, a, null, c + 1); + this.ma(); + this.pc() + }; + D.prototype.addLayerBefore = D.prototype.LF = function (a, b) { + Sj(this, a, b); + a.Ec(this); + var c = this.Zb, d = c.indexOf(a); + 0 <= d && (c.remove(a), null !== this.Od && this.Dc(ce, "layers", this, a, null, d, null)); + for (var e = c.count, f = 0; f < e; f++) if (c.ja(f) === b) { + c.Yd(f, a); + break + } + null !== this.Od && this.Dc(be, "layers", this, null, a, null, f); + this.ma(); + 0 > d && this.pc() + }; + D.prototype.addLayerAfter = function (a, b) { + Sj(this, a, b); + a.Ec(this); + var c = this.Zb, d = c.indexOf(a); + 0 <= d && (c.remove(a), null !== this.Od && this.Dc(ce, "layers", this, a, null, d, null)); + for (var e = c.count, f = 0; f < e; f++) if (c.ja(f) === b) { + c.Yd(f + 1, a); + break + } + null !== this.Od && this.Dc(be, "layers", this, null, a, null, f + 1); + this.ma(); + 0 > d && this.pc() + }; + D.prototype.removeLayer = function (a) { + u.C(a, we, D, "removeLayer:layer"); + a.g !== this && u.k("Cannot remove a Layer from another Diagram: " + a + " of " + a.g); + if ("" !== a.name) { + var b = this.Zb, c = b.indexOf(a); + if (b.remove(a)) { + for (b = a.Db.copy().i; b.next();) { + var d = b.value, e = d.wf; + d.wf = e !== a.name ? e : "" + } + null !== this.Od && this.Dc(ce, "layers", this, a, null, c, null); + this.ma(); + this.pc() + } + } + }; + D.prototype.findLayer = D.prototype.ws = function (a) { + for (var b = this.mw; b.next();) { + var c = b.value; + if (c.name === a) return c + } + return null + }; + D.prototype.addChangedListener = D.prototype.Jy = function (a) { + u.j(a, "function", D, "addChangedListener:listener"); + null === this.Ui && (this.Ui = new E("function")); + this.Ui.add(a) + }; + D.prototype.removeChangedListener = D.prototype.Tz = function (a) { + u.j(a, "function", D, "removeChangedListener:listener"); + null !== this.Ui && (this.Ui.remove(a), 0 === this.Ui.count && (this.Ui = null)) + }; + D.prototype.Jv = function (a) { + this.cb || this.ha.ED(a); + a.Ad !== ae && (this.Qh = !0); + if (null !== this.Ui) { + var b = this.Ui, c = b.length; + if (1 === c) b = b.ja(0), b(a); else if (0 !== c) for (var d = b.Ke(), e = 0; e < c; e++) b = d[e], b(a) + } + }; + D.prototype.raiseChangedEvent = D.prototype.Dc = function (a, b, c, d, e, f, h) { + void 0 === f && (f = null); + void 0 === h && (h = null); + var k = new Zd; + k.g = this; + k.Ad = a; + k.propertyName = b; + k.object = c; + k.oldValue = d; + k.zg = f; + k.newValue = e; + k.xg = h; + this.Jv(k) + }; + D.prototype.raiseChanged = D.prototype.h = function (a, b, c, d, e) { + this.Dc($d, a, this, b, c, d, e) + }; + u.u(D, {Lb: "animationManager"}, function () { + return this.Uh + }); + u.u(D, {ha: "undoManager"}, function () { + return this.Od.ha + }); + u.defineProperty(D, {cb: "skipsUndoManager"}, function () { + return this.qi + }, function (a) { + u.j(a, "boolean", D, "skipsUndoManager"); + this.qi = a; + this.Od.qi = a + }); + u.defineProperty(D, {az: "delaysLayout"}, function () { + return this.zx + }, function (a) { + this.zx = a + }); + D.prototype.pm = function (a, b) { + if (null !== a && a.g === this) { + var c = a.Ad; + if (c === $d) { + var d = a.object, c = a.propertyName, e = a.ta(b); + u.Oa(d, c, e); + d instanceof S && (d = d.T, null !== d && d.Zd()); + this.Qh = !0 + } else if (c === be) { + e = a.object; + c = a.xg; + d = a.newValue; + if (e instanceof A) if ("number" === typeof c && d instanceof S) { + var f = e; + b ? f.Fe(c) : f.Yd(c, d); + d = e.T; + null !== d && d.Zd() + } else "number" === typeof c && d instanceof Se && (f = e, b ? d.ae ? f.oE(c) : f.kE(c) : (c = d.ae ? f.fd(d.index) : f.ed(d.index), c.qs(d))); else e instanceof we ? (f = !0 === a.zg, "number" === typeof c && + d instanceof G && (b ? (d.Zd(), e.Fe(f ? c : -1, d, f)) : e.Eo(c, d, f))) : e instanceof D ? "number" === typeof c && d instanceof we && (e = d, b ? this.Zb.hd(c) : (e.Ec(this), this.Zb.Yd(c, e))) : u.k("unknown ChangedEvent.Insert object: " + a.toString()); + this.Qh = !0 + } else c === ce ? (e = a.object, c = a.zg, d = a.oldValue, e instanceof A ? "number" === typeof c && d instanceof S ? (f = e, b ? f.Yd(c, d) : f.Fe(c)) : "number" === typeof c && d instanceof Se && (f = e, b ? (c = d.ae ? f.fd(d.index) : f.ed(d.index), c.qs(d)) : d.ae ? f.oE(c) : f.kE(c)) : e instanceof we ? (f = !0 === a.xg, "number" === + typeof c && d instanceof G && (b ? e.Eo(c, d, f) : (d.Zd(), e.Fe(f ? c : -1, d, f)))) : e instanceof D ? "number" === typeof c && d instanceof we && (e = d, b ? (e.Ec(this), this.Zb.Yd(c, e)) : this.Zb.hd(c)) : u.k("unknown ChangedEvent.Remove object: " + a.toString()), this.Qh = !0) : c !== ae && u.k("unknown ChangedEvent: " + a.toString()) + } + }; + D.prototype.startTransaction = D.prototype.Wb = function (a) { + return this.ha.Wb(a) + }; + D.prototype.commitTransaction = D.prototype.Wd = function (a) { + return this.ha.Wd(a) + }; + D.prototype.rollbackTransaction = D.prototype.ap = function () { + return this.ha.ap() + }; + D.prototype.updateAllTargetBindings = D.prototype.CI = function (a) { + void 0 === a && (a = ""); + for (var b = this.Sj; b.next();) b.value.Nb(a); + for (b = this.yg; b.next();) b.value.Nb(a); + for (b = this.links; b.next();) b.value.Nb(a) + }; + D.prototype.updateAllRelationshipsFromData = function () { + for (var a = this.Sj; a.next();) a.value.updateRelationshipsFromData(); + for (a = this.yg; a.next();) a.value.updateRelationshipsFromData(); + for (a = this.links; a.next();) a.value.updateRelationshipsFromData() + }; + + function Yj(a, b, c) { + if (a.sc || a.vd) a.$b = c; else if (a.sc = !0, null === a.ib) a.$b = c; else { + var d = a.ob.copy(), e = a.Ab, f = a.zb; + d.width = a.Ab / b; + d.height = a.zb / b; + var h = a.Rm.copy(); + if (isNaN(h.x)) switch (a.Ty) { + case Xb: + h.x = 0; + break; + case Yb: + h.x = e - 1; + break; + case Ib: + h.x = e / 2; + break; + case uc: + case tc: + h.x = e / 2 + } + if (isNaN(h.y)) switch (a.Ty) { + case Wb: + h.y = 0; + break; + case Zb: + h.y = f - 1; + break; + case Ib: + h.y = f / 2; + break; + case uc: + case tc: + h.y = f / 2 + } + null !== a.wE && (c = a.wE(a, c)); + c < a.Yg && (c = a.Yg); + c > a.Xg && (c = a.Xg); + a.position = new w(a.Ma.x + h.x / b - h.x / c, a.Ma.y + h.y / b - + h.y / c); + a.sc = !1; + a.$b = c; + a.dt(d, a.ob); + gj(a, !1); + a.ma(); + sj(a) + } + } + + D.prototype.dt = function (a, b, c) { + void 0 === c && (c = !1); + c || sj(this); + cj(this); + var d = this.Qb; + null === d || !d.jw || c || a.width === b.width && a.height === b.height || d.H(); + d = this.Va; + !0 === this.Jl && d instanceof jf && (this.N.da = this.XE(this.N.ff), d.doMouseMove()); + this.nz(a, b); + vj(this); + this.za("ViewportBoundsChanged", c ? u.mh : null, a) + }; + + function vj(a, b) { + void 0 === b && (b = null); + var c = a.ad; + if (null !== c && c.visible) { + for (var d = u.ul(), e = 1, f = 1, h = c.ya.n, k = h.length, l = 0; l < k; l++) { + var m = h[l], n = m.interval; + 2 > n || (hk(m.Fb) ? f = f * n / K.xD(f, n) : e = e * n / K.xD(e, n)) + } + h = c.aw; + d.m(f * h.width, e * h.height); + h = f = l = k = 0; + if (null !== b) k = b.width, l = b.height, f = b.x, h = b.y; else { + e = u.Sf(); + f = a.ob; + e.m(f.x, f.y, f.width, f.height); + for (h = a.Ul.i; h.next();) f = h.value.ob, f.J() && kb(e, f.x, f.y, f.width, f.height); + k = e.width; + l = e.height; + f = e.x; + h = e.y; + if (!e.J()) return + } + c.width = k + 2 * d.width; + c.height = l + 2 * d.height; + e = u.K(); + K.xs(f, h, 0, 0, d.width, d.height, e); + e.offset(-d.width, -d.height); + u.Oj(d); + c.T.location = e; + u.v(e) + } + } + + D.prototype.clearSelection = D.prototype.Lv = function () { + var a = 0 < this.selection.count; + a && this.za("ChangingSelection"); + of(this); + a && this.za("ChangedSelection") + }; + + function of(a) { + a = a.selection; + if (0 < a.count) { + for (var b = a.Ke(), c = b.length, d = 0; d < c; d++) b[d].Za = !1; + a.La(); + a.clear(); + a.freeze() + } + } + + D.prototype.select = D.prototype.select = function (a) { + null !== a && (u.C(a, G, D, "select:part"), a.layer.g === this && (!a.Za || 1 < this.selection.count) && (this.za("ChangingSelection"), of(this), a.Za = !0, this.za("ChangedSelection"))) + }; + D.prototype.selectCollection = D.prototype.CE = function (a) { + this.za("ChangingSelection"); + of(this); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + d instanceof G || u.k("Diagram.selectCollection given something that is not a Part: " + d); + d.Za = !0 + } else for (a = a.i; a.next();) d = a.value, d instanceof G || u.k("Diagram.selectCollection given something that is not a Part: " + d), d.Za = !0; + this.za("ChangedSelection") + }; + D.prototype.clearHighlighteds = D.prototype.WC = function () { + var a = this.bw; + if (0 < a.count) { + for (var b = a.Ke(), c = b.length, d = 0; d < c; d++) b[d].Wg = !1; + a.La(); + a.clear(); + a.freeze() + } + }; + D.prototype.highlight = function (a) { + null !== a && a.layer.g === this && (u.C(a, G, D, "highlight:part"), !a.Wg || 1 < this.bw.count) && (this.WC(), a.Wg = !0) + }; + D.prototype.highlightCollection = function (a) { + this.WC(); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + d instanceof G || u.k("Diagram.highlightCollection given something that is not a Part: " + d); + d.Wg = !0 + } else for (a = a.i; a.next();) d = a.value, d instanceof G || u.k("Diagram.highlightCollection given something that is not a Part: " + d), d.Wg = !0 + }; + D.prototype.scroll = D.prototype.scroll = function (a, b, c) { + void 0 === c && (c = 1); + var d = "up" === b || "down" === b, e = 0; + "pixel" === a ? e = c : "line" === a ? e = c * (d ? this.mt : this.lt) : "page" === a ? (a = d ? this.ob.height : this.ob.width, a *= this.scale, 0 !== a && (e = Math.max(a - (d ? this.mt : this.lt), 0), e *= c)) : u.k("scrolling unit must be 'pixel', 'line', or 'page', not: " + a); + e /= this.scale; + c = this.position.copy(); + "up" === b ? c.y = this.position.y - e : "down" === b ? c.y = this.position.y + e : "left" === b ? c.x = this.position.x - e : "right" === b ? c.x = this.position.x + e : u.k("scrolling direction must be 'up', 'down', 'left', or 'right', not: " + + b); + this.position = c + }; + D.prototype.scrollToRect = D.prototype.cI = function (a) { + var b = this.ob; + b.Kj(a) || (a = a.Ok, a.x -= b.width / 2, a.y -= b.height / 2, this.position = a) + }; + D.prototype.centerRect = function (a) { + var b = this.ob; + a = a.Ok; + a.x -= b.width / 2; + a.y -= b.height / 2; + this.position = a + }; + D.prototype.transformDocToView = D.prototype.VE = function (a) { + var b = this.Sd; + b.reset(); + 1 !== this.$b && b.scale(this.$b); + var c = this.Ma; + (0 !== c.x || 0 !== c.y) && isFinite(c.x) && isFinite(c.y) && b.translate(-c.x, -c.y); + return a.copy().transform(this.Sd) + }; + D.prototype.transformViewToDoc = D.prototype.XE = function (a) { + var b = this.Sd; + b.reset(); + 1 !== this.$b && b.scale(this.$b); + var c = this.Ma; + (0 !== c.x || 0 !== c.y) && isFinite(c.x) && isFinite(c.y) && b.translate(-c.x, -c.y); + return Wa(a.copy(), this.Sd) + }; + var vf; + D.None = vf = u.s(D, "None", 0); + var kj; + D.Uniform = kj = u.s(D, "Uniform", 1); + var lj; + D.UniformToFill = lj = u.s(D, "UniformToFill", 2); + var Hg; + D.CycleAll = Hg = u.s(D, "CycleAll", 10); + var Lg; + D.CycleNotDirected = Lg = u.s(D, "CycleNotDirected", 11); + var Vg; + D.CycleNotDirectedFast = Vg = u.s(D, "CycleNotDirectedFast", 12); + var Wg; + D.CycleNotUndirected = Wg = u.s(D, "CycleNotUndirected", 13); + var Ig; + D.CycleDestinationTree = Ig = u.s(D, "CycleDestinationTree", 14); + var Kg; + D.CycleSourceTree = Kg = u.s(D, "CycleSourceTree", 15); + var Ni; + D.DocumentScroll = Ni = u.s(D, "DocumentScroll", 1); + var Hj; + D.InfiniteScroll = Hj = u.s(D, "InfiniteScroll", 2); + u.defineProperty(D, {DI: "validCycle"}, function () { + return this.sv + }, function (a) { + var b = this.sv; + b !== a && (u.rb(a, D, D, "validCycle"), this.sv = a, this.h("validCycle", b, a)) + }); + u.defineProperty(D, {ow: "linkSpacing"}, function () { + return this.gj + }, function (a) { + var b = this.gj; + b !== a && (u.ze(a, D, "linkSpacing"), 0 > a && u.wa(a, ">= zero", D, "linkSpacing"), this.gj = a, this.h("linkSpacing", b, a)) + }); + u.u(D, {mw: "layers"}, function () { + return this.Zb.i + }); + u.defineProperty(D, {uf: "isModelReadOnly"}, function () { + var a = this.Od; + return null === a ? !1 : a.nb + }, function (a) { + var b = this.Od; + null !== b && (b.nb = a) + }); + u.defineProperty(D, {nb: "isReadOnly"}, function () { + return this.vk + }, function (a) { + var b = this.vk; + b !== a && (u.j(a, "boolean", D, "isReadOnly"), this.vk = a, this.h("isReadOnly", b, a)) + }); + u.defineProperty(D, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + var b = this.Ne; + b !== a && (u.j(a, "boolean", D, "isEnabled"), this.Ne = a, this.h("isEnabled", b, a)) + }); + u.defineProperty(D, {My: "allowClipboard"}, function () { + return this.Gt + }, function (a) { + var b = this.Gt; + b !== a && (u.j(a, "boolean", D, "allowClipboard"), this.Gt = a, this.h("allowClipboard", b, a)) + }); + u.defineProperty(D, {Ij: "allowCopy"}, function () { + return this.Xj + }, function (a) { + var b = this.Xj; + b !== a && (u.j(a, "boolean", D, "allowCopy"), this.Xj = a, this.h("allowCopy", b, a)) + }); + u.defineProperty(D, {lm: "allowDelete"}, function () { + return this.Yj + }, function (a) { + var b = this.Yj; + b !== a && (u.j(a, "boolean", D, "allowDelete"), this.Yj = a, this.h("allowDelete", b, a)) + }); + u.defineProperty(D, {Av: "allowDragOut"}, function () { + return this.Ht + }, function (a) { + var b = this.Ht; + b !== a && (u.j(a, "boolean", D, "allowDragOut"), this.Ht = a, this.h("allowDragOut", b, a)) + }); + u.defineProperty(D, {MC: "allowDrop"}, function () { + return this.It + }, function (a) { + var b = this.It; + b !== a && (u.j(a, "boolean", D, "allowDrop"), this.It = a, this.h("allowDrop", b, a)) + }); + u.defineProperty(D, {Ev: "allowTextEdit"}, function () { + return this.gk + }, function (a) { + var b = this.gk; + b !== a && (u.j(a, "boolean", D, "allowTextEdit"), this.gk = a, this.h("allowTextEdit", b, a)) + }); + u.defineProperty(D, {Bv: "allowGroup"}, function () { + return this.Zj + }, function (a) { + var b = this.Zj; + b !== a && (u.j(a, "boolean", D, "allowGroup"), this.Zj = a, this.h("allowGroup", b, a)) + }); + u.defineProperty(D, {Fv: "allowUngroup"}, function () { + return this.hk + }, function (a) { + var b = this.hk; + b !== a && (u.j(a, "boolean", D, "allowUngroup"), this.hk = a, this.h("allowUngroup", b, a)) + }); + u.defineProperty(D, {lo: "allowInsert"}, function () { + return this.Kt + }, function (a) { + var b = this.Kt; + b !== a && (u.j(a, "boolean", D, "allowInsert"), this.Kt = a, this.h("allowInsert", b, a)) + }); + u.defineProperty(D, {gs: "allowLink"}, function () { + return this.$j + }, function (a) { + var b = this.$j; + b !== a && (u.j(a, "boolean", D, "allowLink"), this.$j = a, this.h("allowLink", b, a)) + }); + u.defineProperty(D, {mm: "allowRelink"}, function () { + return this.bk + }, function (a) { + var b = this.bk; + b !== a && (u.j(a, "boolean", D, "allowRelink"), this.bk = a, this.h("allowRelink", b, a)) + }); + u.defineProperty(D, {Nk: "allowMove"}, function () { + return this.ak + }, function (a) { + var b = this.ak; + b !== a && (u.j(a, "boolean", D, "allowMove"), this.ak = a, this.h("allowMove", b, a)) + }); + u.defineProperty(D, {Cv: "allowReshape"}, function () { + return this.ck + }, function (a) { + var b = this.ck; + b !== a && (u.j(a, "boolean", D, "allowReshape"), this.ck = a, this.h("allowReshape", b, a)) + }); + u.defineProperty(D, {hs: "allowResize"}, function () { + return this.dk + }, function (a) { + var b = this.dk; + b !== a && (u.j(a, "boolean", D, "allowResize"), this.dk = a, this.h("allowResize", b, a)) + }); + u.defineProperty(D, {Dv: "allowRotate"}, function () { + return this.ek + }, function (a) { + var b = this.ek; + b !== a && (u.j(a, "boolean", D, "allowRotate"), this.ek = a, this.h("allowRotate", b, a)) + }); + u.defineProperty(D, {of: "allowSelect"}, function () { + return this.fk + }, function (a) { + var b = this.fk; + b !== a && (u.j(a, "boolean", D, "allowSelect"), this.fk = a, this.h("allowSelect", b, a)) + }); + u.defineProperty(D, {NC: "allowUndo"}, function () { + return this.Lt + }, function (a) { + var b = this.Lt; + b !== a && (u.j(a, "boolean", D, "allowUndo"), this.Lt = a, this.h("allowUndo", b, a)) + }); + u.defineProperty(D, {Gv: "allowZoom"}, function () { + return this.Nt + }, function (a) { + var b = this.Nt; + b !== a && (u.j(a, "boolean", D, "allowZoom"), this.Nt = a, this.h("allowZoom", b, a)) + }); + u.defineProperty(D, {lz: "hasVerticalScrollbar"}, function () { + return this.qu + }, function (a) { + var b = this.qu; + b !== a && (u.j(a, "boolean", D, "hasVerticalScrollbar"), this.qu = a, sj(this), this.ma(), this.h("hasVerticalScrollbar", b, a), gj(this, !1)) + }); + u.defineProperty(D, {kz: "hasHorizontalScrollbar"}, function () { + return this.pu + }, function (a) { + var b = this.pu; + b !== a && (u.j(a, "boolean", D, "hasHorizontalScrollbar"), this.pu = a, sj(this), this.ma(), this.h("hasHorizontalScrollbar", b, a), gj(this, !1)) + }); + u.defineProperty(D, {Re: "allowHorizontalScroll"}, function () { + return this.Jt + }, function (a) { + var b = this.Jt; + b !== a && (u.j(a, "boolean", D, "allowHorizontalScroll"), this.Jt = a, this.h("allowHorizontalScroll", b, a), gj(this, !1)) + }); + u.defineProperty(D, {Se: "allowVerticalScroll"}, function () { + return this.Mt + }, function (a) { + var b = this.Mt; + b !== a && (u.j(a, "boolean", D, "allowVerticalScroll"), this.Mt = a, this.h("allowVerticalScroll", b, a), gj(this, !1)) + }); + u.defineProperty(D, {lt: "scrollHorizontalLineChange"}, function () { + return this.$u + }, function (a) { + var b = this.$u; + b !== a && (u.j(a, "number", D, "scrollHorizontalLineChange"), 0 > a && u.wa(a, ">= 0", D, "scrollHorizontalLineChange"), this.$u = a, this.h("scrollHorizontalLineChange", b, a)) + }); + u.defineProperty(D, {mt: "scrollVerticalLineChange"}, function () { + return this.av + }, function (a) { + var b = this.av; + b !== a && (u.j(a, "number", D, "scrollVerticalLineChange"), 0 > a && u.wa(a, ">= 0", D, "scrollVerticalLineChange"), this.av = a, this.h("scrollVerticalLineChange", b, a)) + }); + u.defineProperty(D, {N: "lastInput"}, function () { + return this.Ob + }, function (a) { + this.Ob = a + }); + u.defineProperty(D, {wc: "firstInput"}, function () { + return this.nk + }, function (a) { + this.nk = a + }); + u.defineProperty(D, {ac: "currentCursor"}, function () { + return this.sx + }, function (a) { + "" === a && (a = this.Pp); + this.sx !== a && (u.j(a, "string", D, "currentCursor"), null !== this.ib && (this.sx = a, this.ib.style.cursor = a, this.Jb.style.cursor = a)) + }); + u.defineProperty(D, {lJ: "defaultCursor"}, function () { + return this.Pp + }, function (a) { + "" === a && (a = "auto"); + var b = this.Pp; + b !== a && (u.j(a, "string", D, "defaultCursor"), this.Pp = a, this.h("defaultCursor", b, a)) + }); + u.defineProperty(D, {zJ: "hasGestureZoom"}, function () { + return this.yn + }, function (a) { + var b = this.yn; + b !== a && (u.j(a, "boolean", D, "hasGestureZoom"), this.yn = a, this.h("hasGestureZoom", b, a)) + }); + u.defineProperty(D, {click: "click"}, function () { + return this.Wh + }, function (a) { + var b = this.Wh; + b !== a && (null !== a && u.j(a, "function", D, "click"), this.Wh = a, this.h("click", b, a)) + }); + u.defineProperty(D, {ts: "doubleClick"}, function () { + return this.ci + }, function (a) { + var b = this.ci; + b !== a && (null !== a && u.j(a, "function", D, "doubleClick"), this.ci = a, this.h("doubleClick", b, a)) + }); + u.defineProperty(D, {Uy: "contextClick"}, function () { + return this.Yh + }, function (a) { + var b = this.Yh; + b !== a && (null !== a && u.j(a, "function", D, "contextClick"), this.Yh = a, this.h("contextClick", b, a)) + }); + u.defineProperty(D, {Fz: "mouseOver"}, function () { + return this.mi + }, function (a) { + var b = this.mi; + b !== a && (null !== a && u.j(a, "function", D, "mouseOver"), this.mi = a, this.h("mouseOver", b, a)) + }); + u.defineProperty(D, {Ez: "mouseHover"}, function () { + return this.li + }, function (a) { + var b = this.li; + b !== a && (null !== a && u.j(a, "function", D, "mouseHover"), this.li = a, this.h("mouseHover", b, a)) + }); + u.defineProperty(D, {Dz: "mouseHold"}, function () { + return this.ki + }, function (a) { + var b = this.ki; + b !== a && (null !== a && u.j(a, "function", D, "mouseHold"), this.ki = a, this.h("mouseHold", b, a)) + }); + u.defineProperty(D, {EH: "mouseDragOver"}, function () { + return this.Nu + }, function (a) { + var b = this.Nu; + b !== a && (null !== a && u.j(a, "function", D, "mouseDragOver"), this.Nu = a, this.h("mouseDragOver", b, a)) + }); + u.defineProperty(D, {Cz: "mouseDrop"}, function () { + return this.ji + }, function (a) { + var b = this.ji; + b !== a && (null !== a && u.j(a, "function", D, "mouseDrop"), this.ji = a, this.h("mouseDrop", b, a)) + }); + u.defineProperty(D, {lA: "toolTip"}, function () { + return this.ti + }, function (a) { + var b = this.ti; + b !== a && (null !== a && u.C(a, lf, D, "toolTip"), this.ti = a, this.h("toolTip", b, a)) + }); + u.defineProperty(D, {contextMenu: "contextMenu"}, function () { + return this.Zh + }, function (a) { + var b = this.Zh; + b !== a && (null !== a && u.C(a, lf, D, "contextMenu"), this.Zh = a, this.h("contextMenu", b, a)) + }); + u.defineProperty(D, {Eb: "commandHandler"}, function () { + return this.ix + }, function (a) { + var b = this.ix; + b !== a && (u.C(a, sa, D, "commandHandler"), null !== a.g && u.k("Cannot share CommandHandlers between Diagrams: " + a.toString()), null !== b && b.Ec(null), this.ix = a, a.Ec(this)) + }); + u.defineProperty(D, {tb: "toolManager"}, function () { + return this.Fy + }, function (a) { + var b = this.Fy; + b !== a && (u.C(a, jf, D, "toolManager"), null !== a.g && u.k("Cannot share ToolManagers between Diagrams: " + a.toString()), null !== b && b.Ec(null), this.Fy = a, a.Ec(this)) + }); + u.defineProperty(D, {$y: "defaultTool"}, function () { + return this.yx + }, function (a) { + var b = this.yx; + b !== a && (u.C(a, xe, D, "defaultTool"), this.yx = a, this.Va === b && (this.Va = a)) + }); + u.defineProperty(D, {Va: "currentTool"}, function () { + return this.ux + }, function (a) { + var b = this.ux; + if (null !== b) for (b.na && b.doDeactivate(), b.cancelWaitAfter(), b.doStop(), b = this.Ul.i; b.next();) b.value.ma(); + null === a && (a = this.$y); + null !== a && (u.C(a, xe, D, "currentTool"), this.ux = a, a.Ec(this), a.doStart()) + }); + u.u(D, {selection: "selection"}, function () { + return this.dv + }); + u.defineProperty(D, {wH: "maxSelectionCount"}, function () { + return this.Iu + }, function (a) { + var b = this.Iu; + if (b !== a) if (u.j(a, "number", D, "maxSelectionCount"), 0 <= a && !isNaN(a)) { + if (this.Iu = a, this.h("maxSelectionCount", b, a), !this.ha.gb && (a = this.selection.count - a, 0 < a)) { + this.za("ChangingSelection"); + for (var b = this.selection.Ke(), c = 0; c < a; c++) b[c].Za = !1; + this.za("ChangedSelection") + } + } else u.wa(a, ">= 0", D, "maxSelectionCount") + }); + u.defineProperty(D, {HH: "nodeSelectionAdornmentTemplate"}, function () { + return this.Pu + }, function (a) { + var b = this.Pu; + b !== a && (u.C(a, lf, D, "nodeSelectionAdornmentTemplate"), this.Pu = a, this.h("nodeSelectionAdornmentTemplate", b, a)) + }); + u.defineProperty(D, {MG: "groupSelectionAdornmentTemplate"}, function () { + return this.mu + }, function (a) { + var b = this.mu; + b !== a && (u.C(a, lf, D, "groupSelectionAdornmentTemplate"), this.mu = a, this.h("groupSelectionAdornmentTemplate", b, a)) + }); + u.defineProperty(D, {sH: "linkSelectionAdornmentTemplate"}, function () { + return this.Du + }, function (a) { + var b = this.Du; + b !== a && (u.C(a, lf, D, "linkSelectionAdornmentTemplate"), this.Du = a, this.h("linkSelectionAdornmentTemplate", b, a)) + }); + u.u(D, {bw: "highlighteds"}, function () { + return this.ru + }); + u.defineProperty(D, {Qh: "isModified"}, function () { + var a = this.ha; + return a.isEnabled ? null !== a.Di ? !0 : this.Vx && this.Ig !== a.Ii : this.Vx + }, function (a) { + if (this.Vx !== a) { + u.j(a, "boolean", D, "isModified"); + this.Vx = a; + var b = this.ha; + !a && b.isEnabled && (this.Ig = b.Ii); + a || ik(this) + } + }); + + function ik(a) { + var b = a.Qh; + a.DC !== b && (a.DC = b, a.za("Modified")) + } + + u.defineProperty(D, {ga: "model"}, function () { + return this.Od + }, function (a) { + var b = this.Od; + if (b !== a) { + u.C(a, J, D, "model"); + this.Va.doCancel(); + null !== b && b.ha !== a.ha && b.ha.ND && u.k("Do not replace a Diagram.model while a transaction is in progress."); + this.Lb.Mi(); + this.Lv(); + this.lf = !1; + this.un = !0; + this.Ig = -2; + this.Ef = !1; + var c = this.vd; + this.vd = !0; + this.Lb.ml(); + null !== b && (b.Tz(this.GB), b instanceof Q && jk(this, b.Qj), jk(this, b.ah)); + this.Od = a; + a.Jy(this.FB); + kk(this, a.ah); + a instanceof Q && lk(this, a.Qj); + a.Tz(this.FB); + a.Jy(this.GB); + this.vd = c; + this.sc || this.ma(); + null !== b && (a.ha.isEnabled = b.ha.isEnabled) + } + }); + u.defineProperty(D, {Na: null}, function () { + return this.yB + }, function (a) { + this.yB = a + }); + + function Qi(a, b) { + if (b.ga === a.ga) { + var c = b.Ad, d = b.propertyName; + if (c === ae && "S" === d[0]) if ("StartingFirstTransaction" === d) c = a.tb, c.cf.each(function (b) { + b.Ec(a) + }), c.Mf.each(function (b) { + b.Ec(a) + }), c.Nf.each(function (b) { + b.Ec(a) + }), a.vd || a.lf || (a.du = !0, a.un && (a.Ef = !0), a.Uh.ml()); else if ("StartingUndo" === d || "StartingRedo" === d) { + var e = a.Lb; + e.Vg && !a.cb && e.Mi(); + a.za("ChangingSelection") + } else "StartedTransaction" === d && (e = a.Lb, e.Vg && !a.cb && e.Mi(), a.zu && e.ml()); else if (a.Na) { + a.Na = !1; + try { + var f = b.Lf; + if ("" !== f) if (c === $d) { + if ("linkFromKey" === + f) { + var h = b.object, k = a.ng(h); + if (null !== k) { + var l = b.newValue, m = a.Xe(l); + k.W = m + } + } else if ("linkToKey" === f) h = b.object, k = a.ng(h), null !== k && (l = b.newValue, m = a.Xe(l), k.ca = m); else if ("linkFromPortId" === f) { + if (h = b.object, k = a.ng(h), null !== k) { + var n = b.newValue; + "string" === typeof n && (k.pg = n) + } + } else if ("linkToPortId" === f) h = b.object, k = a.ng(h), null !== k && (n = b.newValue, "string" === typeof n && (k.lh = n)); else if ("nodeGroupKey" === f) { + var h = b.object, p = a.Nh(h); + if (null !== p) { + var q = b.newValue; + if (void 0 !== q) { + var r = a.Xe(q); + p.Ra = r instanceof + V ? r : null + } else p.Ra = null + } + } else if ("linkLabelKeys" === f) { + if (h = b.object, k = a.ng(h), null !== k) { + var s = b.oldValue, t = b.newValue; + if (u.isArray(s)) for (var v = u.qb(s), x = 0; x < v; x++) { + var B = u.fb(s, x), m = a.Xe(B); + null !== m && (m.ce = null) + } + if (u.isArray(t)) for (v = u.qb(t), x = 0; x < v; x++) B = u.fb(t, x), m = a.Xe(B), null !== m && (m.ce = k) + } + } else if ("nodeParentKey" === f) { + var y = b.object, C = a.Xe(b.newValue), I = a.Xv(y); + if (null !== I) { + var H = I.As(); + null !== H ? null === C ? a.remove(H) : a.qd ? H.W = C : H.ca = C : mk(a, C, I) + } + } else if ("parentLinkCategory" === f) { + var y = b.object, + I = a.Xv(y), T = b.newValue; + null !== I && "string" === typeof T && (H = I.As(), null !== H && (H.Kc = T)) + } else if ("nodeCategory" === f) { + var h = b.object, aa = a.Nh(h), T = b.newValue; + null !== aa && "string" === typeof T && (aa.Kc = T) + } else if ("linkCategory" === f) { + var h = b.object, R = a.ng(h), T = b.newValue; + null !== R && "string" === typeof T && (R.Kc = T) + } else if ("nodeDataArray" === f) { + var N = b.oldValue; + jk(a, N); + var Z = b.newValue; + kk(a, Z) + } else "linkDataArray" === f && (N = b.oldValue, jk(a, N), Z = b.newValue, lk(a, Z)); + a.Qh = !0 + } else c === be ? (Z = b.newValue, "nodeDataArray" === f && + u.Sa(Z) ? nk(a, Z) : "linkDataArray" === f && u.Sa(Z) ? ok(a, Z) : "linkLabelKeys" === f && Ne(Z) && (k = a.ng(b.object), m = a.Xe(Z), null !== k && null !== m && (m.ce = k)), a.Qh = !0) : c === ce ? (N = b.oldValue, "nodeDataArray" === f && u.Sa(N) ? pk(a, N) : "linkDataArray" === f && u.Sa(N) ? pk(a, N) : "linkLabelKeys" === f && Ne(N) && (m = a.Xe(N), null !== m && (m.ce = null)), a.Qh = !0) : c === ae && ("SourceChanged" === f ? Pi(a, b.object, b.propertyName) : "ModelDisplaced" === f && a.nl()); else if (c === $d) { + var Ea = b.propertyName, h = b.object; + if (h === a.ga) { + if ("nodeKeyProperty" === Ea || "nodeCategoryProperty" === + Ea || "linkFromKeyProperty" === Ea || "linkToKeyProperty" === Ea || "linkFromPortIdProperty" === Ea || "linkToPortIdProperty" === Ea || "linkLabelKeysProperty" === Ea || "nodeIsGroupProperty" === Ea || "nodeGroupKeyProperty" === Ea || "nodeParentKeyProperty" === Ea || "linkCategoryProperty" === Ea) a.ha.gb || a.nl() + } else Pi(a, h, Ea); + a.Qh = !0 + } else if (c === be || c === ce) qk(a, b), a.Qh = !0; else if (c === ae) { + if ("FinishedUndo" === d || "FinishedRedo" === d) a.ha.fi = !0, a.za("ChangedSelection"), ej(a), a.ha.fi = !1; + a.du = !0; + a.bf(); + e = a.Uh; + e.ld && 0 === a.ha.Le && fi(e); + "CommittedTransaction" === + d && a.ha.Yx && (a.Ig = Math.min(a.Ig, a.ha.Ii - 1)); + ik(a); + a.iy || "CommittedTransaction" !== d && "FinishedUndo" !== d && "FinishedRedo" !== d || (a.iy = !0, u.setTimeout(function () { + a.Va.standardMouseOver(); + a.iy = !1 + }, 10)) + } + } finally { + a.Na = !0 + } + } + } + } + + function Pi(a, b, c) { + if ("string" === typeof c) { + var d = a.Nh(b); + if (null !== d) d.Nb(c), a.ga instanceof qe && (d = a.ng(b), null !== d && d.Nb(c)); else { + for (var d = null, e = a.Ml.i; e.next();) { + for (var f = e.value, h = 0; h < f.length; h++) { + var k = f[h]; + null !== k.Yf && (k = k.Yf.ta(b), null !== k && (null === d && (d = u.eb()), d.push(k))) + } + if (null !== d) break + } + if (null !== d) { + for (e = 0; e < d.length; e++) d[e].Nb(c); + u.ra(d) + } + } + b === a.ga.Zs && a.CI(c) + } + } + + u.defineProperty(D, {Iw: "skipsModelSourceBindings"}, function () { + return this.eC + }, function (a) { + this.eC = a + }); + u.defineProperty(D, {tt: null}, function () { + return this.xy + }, function (a) { + this.xy = a + }); + + function qk(a, b) { + var c = b.Ad === be, d = c ? b.xg : b.zg, e = c ? b.newValue : b.oldValue, f = a.Ml.ta(b.object); + if (Array.isArray(f)) for (var h = 0; h < f.length; h++) { + var k = f[h]; + if (c) rk(k, e, d); else { + var l = d; + if (!(0 > l)) { + var m = l; + sk(k) && m++; + k.Fe(m); + tk(k, m, l) + } + } + } + } + + function Mj(a, b) { + var c = b.gi; + if (u.isArray(c)) { + var d = a.Ml.ta(c); + if (null === d) d = [], d.push(b), a.Ml.add(c, d); else { + for (c = 0; c < d.length; c++) if (d[c] === b) return; + d.push(b) + } + } + } + + function Qj(a, b) { + var c = b.gi; + if (u.isArray(c)) { + var d = a.Ml.ta(c); + if (null !== d) for (var e = 0; e < d.length; e++) if (d[e] === b) { + d.splice(e, 1); + 0 === d.length && a.Ml.remove(c); + break + } + } + } + + function Lj(a, b) { + for (var c = b.ya.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + f instanceof Ri && uk(a, f) + } + } + + function uk(a, b) { + var c = b.element; + if (null !== c) { + var c = c.src, d = a.Tn.ta(c); + if (null === d) d = [], d.push(b), a.Tn.add(c, d); else { + for (c = 0; c < d.length; c++) if (d[c] === b) return; + d.push(b) + } + } + } + + function Pj(a, b) { + for (var c = b.ya.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + f instanceof Ri && vk(a, f) + } + } + + function vk(a, b) { + var c = b.element; + if (null !== c) { + var c = c.src, d = a.Tn.ta(c); + if (null !== d) for (var e = 0; e < d.length; e++) if (d[e] === b) { + d.splice(e, 1); + 0 === d.length && a.Tn.remove(c); + break + } + } + } + + D.prototype.clear = D.prototype.clear = function () { + var a = null; + null !== this.ad && (a = this.ad.T); + this.ga.clear(); + for (var b = this.Zb.length, c = 0; c < b; c++) this.Zb.n[c].clear(); + this.Xf.clear(); + this.El.clear(); + this.Rn.clear(); + this.Ik.clear(); + this.Nn.clear(); + this.Db.clear(); + this.$h.clear(); + this.lk.clear(); + this.Ml.clear(); + this.dv.La(); + this.dv.clear(); + this.dv.freeze(); + this.ru.La(); + this.ru.clear(); + this.ru.freeze(); + gf = this.en = null; + hf = ""; + this.eu = (new z(NaN, NaN, NaN, NaN)).freeze(); + null !== a && (this.add(a), this.Db.remove(a)); + this.ma() + }; + D.prototype.reset = D.prototype.reset = function () { + this.sc = !0; + this.clear(); + this.Zb = new E(we); + this.qE(); + this.pE(); + this.Ma = (new w(NaN, NaN)).freeze(); + this.$b = 1; + this.tu = (new w(NaN, NaN)).freeze(); + this.uu = NaN; + this.Ku = 1E-4; + this.Hu = 100; + this.wv = (new w(NaN, NaN)).freeze(); + this.ku = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.xl = vf; + this.dn = uc; + this.tk = vf; + this.An = uc; + this.vu = this.su = xb; + this.Qt = (new rb(16, 16, 16, 16)).freeze(); + this.yu = !0; + this.sv = Hg; + this.Pp = "auto"; + this.Zh = this.ti = this.ji = this.Nu = this.ki = this.li = this.mi = this.Yh = + this.ci = this.Wh = null; + this.vk = !1; + this.Yj = this.Xj = this.Gt = this.Ne = !0; + this.It = this.Ht = !1; + this.Mt = this.Jt = this.qu = this.pu = this.Nt = this.Lt = this.fk = this.ek = this.dk = this.ck = this.ak = this.bk = this.$j = this.Kt = this.hk = this.Zj = this.gk = !0; + this.av = this.$u = 16; + this.Pe = (new rb(5)).freeze(); + this.Iu = 999999999; + this.Nd = null; + Ui(this); + this.ad = null; + this.qi = !0; + Ti(this); + this.Qb = new Je; + this.qi = !1; + this.ga = new Q; + this.lf = !1; + this.un = !0; + this.sc = this.Ef = !1; + this.ma() + }; + D.prototype.rebuildParts = D.prototype.nl = function () { + for (var a = this.Jz.i; a.next();) { + var b = a.value, c = a.key; + (!b.Fd() || b instanceof V) && u.k('Invalid node template in Diagram.nodeTemplateMap: template for "' + c + '" must be a Node or a simple Part, not a Group or Link: ' + b) + } + for (a = this.iz.i; a.next();) b = a.value, c = a.key, b instanceof V || u.k('Invalid group template in Diagram.groupTemplateMap: template for "' + c + '" must be a Group, not a normal Node or Link: ' + b); + for (a = this.xz.i; a.next();) b = a.value, c = a.key, b instanceof + W || u.k('Invalid link template in Diagram.linkTemplateMap: template for "' + c + '" must be a Link, not a normal Node or simple Part: ' + b); + a = u.eb(); + for (b = this.selection.i; b.next();) (c = b.value.data) && a.push(c); + for (var b = u.eb(), d = this.bw.i; d.next();) (c = d.value.data) && b.push(c); + c = u.eb(); + for (d = this.yg.i; d.next();) { + var e = d.value; + null !== e.data && (c.push(e.data), c.push(e.location)) + } + for (d = this.links.i; d.next();) e = d.value, null !== e.data && (c.push(e.data), c.push(e.location)); + for (d = this.Sj.i; d.next();) e = d.value, null !== + e.data && (c.push(e.data), c.push(e.location)); + d = this.ga; + d instanceof Q && jk(this, d.Qj); + jk(this, d.ah); + kk(this, d.ah); + d instanceof Q && lk(this, d.Qj); + for (d = 0; d < a.length; d++) e = this.Nh(a[d]), null !== e && (e.Za = !0); + for (d = 0; d < b.length; d++) e = this.Nh(b[d]), null !== e && (e.Wg = !0); + for (d = 0; d < c.length; d += 2) e = this.Nh(c[d]), null !== e && (e.location = c[d + 1]); + u.ra(a); + u.ra(b); + u.ra(c) + }; + + function kk(a, b) { + if (null !== b) { + for (var c = a.ga, d = u.qb(b), e = 0; e < d; e++) { + var f = u.fb(b, e); + c.Ue(f) ? nk(a, f, !1) : c instanceof Q && ok(a, f) + } + if (c instanceof Q || c instanceof qe) { + for (e = 0; e < d; e++) f = u.fb(b, e), c.Ue(f) && wk(a, f); + if (c instanceof Q) for (c = a.links; c.next();) xk(c.value) + } + yk(a, !1) + } + } + + function nk(a, b, c) { + if (void 0 !== b && null !== b && !a.ha.gb && !a.$h.contains(b)) { + void 0 === c && (c = !0); + var d = a.fz(b), e = zk(a, b, d); + null !== e && (nf(e), e = e.copy(), null !== e && (e.Vh = d, a.Vm && (e.wk = "Tool"), a.add(e), e.data = b, c && wk(a, b))) + } + } + + D.prototype.fz = function (a) { + return this.ga.fz(a) + }; + var Ak = !1, Bk = !1; + + function zk(a, b, c) { + var d = !1, e = a.ga; + e instanceof Q && (d = e.sz(b)); + d ? (b = a.iz.ta(c), null === b && (b = a.iz.ta(""), null === b && (Bk || (Bk = !0, u.trace('No Group template found for category "' + c + '"'), u.trace(" Using default group template")), b = a.SA))) : (b = a.Jz.ta(c), null === b && (b = a.Jz.ta(""), null === b && (Ak || (Ak = !0, u.trace('No Node template found for category "' + c + '"'), u.trace(" Using default node template")), b = a.UA))); + return b + } + + function wk(a, b) { + var c = a.ga; + if (c instanceof Q || c instanceof qe) { + var d = c.wb(b); + if (void 0 !== d) { + var e = Oe(c, d), f = a.Nh(b); + if (null !== e && null !== f) { + for (e = e.i; e.next();) { + var h = e.value; + if (c instanceof Q) { + var k = c; + if (k.Ue(h)) { + if (f instanceof V && k.Bm(h) === d) { + var l = f, h = a.Nh(h); + null !== h && (h.Ra = l) + } + } else { + var m = a.ng(h); + if (null !== m && f instanceof U && (l = f, k.$k(h) === d && (m.W = l), k.cl(h) === d && (m.ca = l), h = k.Pj(h), u.isArray(h))) for (k = 0; k < u.qb(h); k++) if (u.fb(h, k) === d) { + l.ce = m; + break + } + } + } else c instanceof qe && (m = c, m.Ue(h) && f instanceof + U && (l = f, m.Cm(h) === d && (h = a.Xv(h), mk(a, l, h)))) + } + Qe(c, d) + } + c instanceof Q ? (c = c.Bm(b), void 0 !== c && (c = a.Xe(c), c instanceof V && (f.Ra = c))) : c instanceof qe && (c = c.Cm(b), void 0 !== c && f instanceof U && (l = f, f = a.Xe(c), mk(a, f, l))) + } + } + } + + function mk(a, b, c) { + if (null !== b && null !== c) { + var d = a.tb.TD, e = b, f = c; + if (a.qd) for (b = f.oe; b.next();) { + if (b.value.ca === f) return + } else for (e = c, f = b, b = e.oe; b.next();) if (b.value.W === e) return; + null !== d && Jg(d, e, f, null, !0) || (d = a.Zv(c.data), b = Ck(a, d), null !== b && (nf(b), b = b.copy(), null !== b && (b.Vh = d, b.W = e, b.ca = f, a.add(b), b.data = c.data))) + } + } + + function lk(a, b) { + if (null !== b) { + for (var c = u.qb(b), d = 0; d < c; d++) { + var e = u.fb(b, d); + ok(a, e) + } + yk(a, !1) + } + } + + function ok(a, b) { + if (void 0 !== b && null !== b && !a.ha.gb && !a.lk.contains(b)) { + var c = a.Zv(b), d = Ck(a, c); + if (null !== d && (nf(d), d = d.copy(), null !== d)) { + d.Vh = c; + var c = a.ga, e = c.FG(b); + "" !== e && (d.pg = e); + e = c.$k(b); + void 0 !== e && (e = a.Xe(e), e instanceof U && (d.W = e)); + e = c.IG(b); + "" !== e && (d.lh = e); + e = c.cl(b); + void 0 !== e && (e = a.Xe(e), e instanceof U && (d.ca = e)); + c = c.Pj(b); + if (u.isArray(c)) for (var e = u.qb(c), f = 0; f < e; f++) { + var h = u.fb(c, f), h = a.Xe(h); + null !== h && (h.ce = d) + } + a.add(d); + d.data = b + } + } + } + + D.prototype.Zv = function (a) { + var b = this.ga, c = ""; + b instanceof Q ? c = b.Zv(a) : b instanceof qe && (c = b.HG(a)); + return c + }; + var Dk = !1; + + function Ck(a, b) { + var c = a.xz.ta(b); + null === c && (c = a.xz.ta(""), null === c && (Dk || (Dk = !0, u.trace('No Link template found for category "' + b + '"'), u.trace(" Using default link template")), c = a.TA)); + return c + } + + function jk(a, b) { + for (var c = u.qb(b), d = 0; d < c; d++) { + var e = u.fb(b, d); + pk(a, e) + } + } + + function pk(a, b) { + if (void 0 !== b && null !== b) { + var c = a.Nh(b); + if (null !== c) { + c.Za = !1; + c.Wg = !1; + var d = c.layer; + if (null !== d && d.g === a) { + var e = a.ga; + if (e instanceof Q && c instanceof U) { + var f = c, h = e.wb(f.data); + if (void 0 !== h) { + for (var k = f.oe; k.next();) Pe(e, h, k.value.data); + f.tf && (k = f.ce, null !== k && Pe(e, h, k.data)); + if (f instanceof V) for (f = f.Mc; f.next();) k = f.value.data, e.Ue(k) && Pe(e, h, k) + } + } else if (e instanceof qe && c instanceof U) { + f = c; + k = a.ng(f.data); + if (null !== k) { + k.Za = !1; + k.Wg = !1; + var l = k.layer; + if (null !== l) { + var m = l.Fe(-1, k, !1); + 0 <= m && a.Dc(ce, "parts", l, k, null, m, null); + m = k.Rs; + null !== m && m(k, l, null) + } + } + k = a.qd; + for (f = f.oe; f.next();) l = f.value, l = (k ? l.ca : l.W).data, e.Ue(l) && Pe(e, h, l) + } + e = d.Fe(-1, c, !1); + 0 <= e && a.Dc(ce, "parts", d, c, null, e, null); + e = c.Rs; + null !== e && e(c, d, null) + } + } + } + } + + D.prototype.findPartForKey = D.prototype.zG = function (a) { + if (null === a || void 0 === a) return null; + a = this.ga.qf(a); + return null === a ? null : this.$h.ta(a) + }; + D.prototype.findNodeForKey = D.prototype.Xe = function (a) { + if (null === a || void 0 === a) return null; + a = this.ga.qf(a); + if (null === a) return null; + a = this.$h.ta(a); + return a instanceof U ? a : null + }; + D.prototype.findPartForData = D.prototype.Nh = function (a) { + if (null === a) return null; + var b = this.$h.ta(a); + return null !== b ? b : b = this.lk.ta(a) + }; + D.prototype.findNodeForData = D.prototype.Xv = function (a) { + if (null === a) return null; + a = this.$h.ta(a); + return a instanceof U ? a : null + }; + D.prototype.findLinkForData = D.prototype.ng = function (a) { + return null === a ? null : this.lk.ta(a) + }; + D.prototype.findNodesByExample = function (a) { + for (var b = new F, c = this.Rn.i; c.next();) { + var d = c.value, e = d.data; + if (null !== e) for (var f = 0; f < arguments.length; f++) { + var h = arguments[f]; + if (u.Sa(h) && Ek(this, e, h)) { + b.add(d); + break + } + } + } + return b.i + }; + D.prototype.findLinksByExample = function (a) { + for (var b = new F, c = this.Nn.i; c.next();) { + var d = c.value, e = d.data; + if (null !== e) for (var f = 0; f < arguments.length; f++) { + var h = arguments[f]; + if (u.Sa(h) && Ek(this, e, h)) { + b.add(d); + break + } + } + } + return b.i + }; + + function Ek(a, b, c) { + for (var d in c) { + var e = b[d], f = c[d]; + if (u.isArray(f)) { + if (!u.isArray(e) || e.length >= f.length) return !1; + for (var h = 0; h < e.length; h++) { + var k = e[h], l = f[h]; + if (void 0 !== l && !Fk(a, k, l)) return !1 + } + } else if (!Fk(a, e, f)) return !1 + } + return !0 + } + + function Fk(a, b, c) { + if ("function" === typeof c) { + if (!c(b)) return !1 + } else if (c instanceof RegExp) { + if (!b || !c.test(b.toString())) return !1 + } else if (u.Sa(b) && u.Sa(c)) { + if (!Ek(a, b, c)) return !1 + } else if (b !== c) return !1; + return !0 + } + + u.defineProperty(D, {bK: "nodeTemplate"}, function () { + return this.ni.ta("") + }, function (a) { + var b = this.ni.ta(""); + b !== a && (u.C(a, G, D, "nodeTemplate"), this.ni.add("", a), this.h("nodeTemplate", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {Jz: "nodeTemplateMap"}, function () { + return this.ni + }, function (a) { + var b = this.ni; + b !== a && (u.C(a, la, D, "nodeTemplateMap"), this.ni = a, this.h("nodeTemplateMap", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {yJ: "groupTemplate"}, function () { + return this.ok.ta("") + }, function (a) { + var b = this.ok.ta(""); + b !== a && (u.C(a, V, D, "groupTemplate"), this.ok.add("", a), this.h("groupTemplate", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {iz: "groupTemplateMap"}, function () { + return this.ok + }, function (a) { + var b = this.ok; + b !== a && (u.C(a, la, D, "groupTemplateMap"), this.ok = a, this.h("groupTemplateMap", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {QJ: "linkTemplate"}, function () { + return this.hj.ta("") + }, function (a) { + var b = this.hj.ta(""); + b !== a && (u.C(a, W, D, "linkTemplate"), this.hj.add("", a), this.h("linkTemplate", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {xz: "linkTemplateMap"}, function () { + return this.hj + }, function (a) { + var b = this.hj; + b !== a && (u.C(a, la, D, "linkTemplateMap"), this.hj = a, this.h("linkTemplateMap", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {fH: null}, function () { + return this.Jl + }, function (a) { + this.Jl = a + }); + u.defineProperty(D, {Ge: "isMouseCaptured"}, function () { + return this.uB + }, function (a) { + var b = this.ib; + null !== b && (a ? (this.N.bubbles = !1, b.removeEventListener("mousemove", this.Qo, !1), b.removeEventListener("mousedown", this.Po, !1), b.removeEventListener("mouseup", this.So, !1), b.removeEventListener("mousewheel", this.Zg, !1), b.removeEventListener("DOMMouseScroll", this.Zg, !1), b.removeEventListener("mouseout", this.Ro, !1), window.addEventListener("mousemove", this.Qo, !0), window.addEventListener("mousedown", this.Po, !0), + window.addEventListener("mouseup", this.So, !0), window.addEventListener("mousewheel", this.Zg, !0), window.addEventListener("DOMMouseScroll", this.Zg, !0), window.addEventListener("mouseout", this.Ro, !0), window.addEventListener("selectstart", this.preventDefault, !1)) : (window.removeEventListener("mousemove", this.Qo, !0), window.removeEventListener("mousedown", this.Po, !0), window.removeEventListener("mouseup", this.So, !0), window.removeEventListener("mousewheel", this.Zg, !0), window.removeEventListener("DOMMouseScroll", + this.Zg, !0), window.removeEventListener("mouseout", this.Ro, !0), window.removeEventListener("selectstart", this.preventDefault, !1), b.addEventListener("mousemove", this.Qo, !1), b.addEventListener("mousedown", this.Po, !1), b.addEventListener("mouseup", this.So, !1), b.addEventListener("mousewheel", this.Zg, !1), b.addEventListener("DOMMouseScroll", this.Zg, !1), b.addEventListener("mouseout", this.Ro, !1)), this.uB = a) + }); + u.defineProperty(D, {position: "position"}, function () { + return this.Ma + }, function (a) { + var b = this.Ma; + if (!b.L(a)) { + u.C(a, w, D, "position"); + var c = this.ob.copy(); + a = a.copy(); + if (!this.sc && null !== this.ib) { + this.sc = !0; + var d = this.scale; + ij(this, a, this.Cd, this.Ab / d, this.zb / d, this.dn, !1); + this.sc = !1 + } + this.Ma = a.Z(); + a = this.Lb; + a.ld && si(a, b, this.Ma); + this.sc || this.dt(c, this.ob) + } + }); + u.defineProperty(D, {TG: "initialPosition"}, function () { + return this.tu + }, function (a) { + this.tu.L(a) || (u.C(a, w, D, "initialPosition"), this.tu = a.Z()) + }); + u.defineProperty(D, {UG: "initialScale"}, function () { + return this.uu + }, function (a) { + this.uu !== a && (u.j(a, "number", D, "initialScale"), this.uu = a) + }); + u.defineProperty(D, {Gs: "grid"}, function () { + null === this.ad && aj(this); + return this.ad + }, function (a) { + var b = this.ad; + if (b !== a) { + null === b && (aj(this), b = this.ad); + u.C(a, A, D, "grid"); + a.type !== bj && u.k("Diagram.grid must be a Panel of type Panel.Grid"); + var c = b.S; + null !== c && c.remove(b); + this.ad = a; + a.name = "GRID"; + null !== c && c.add(a); + vj(this); + this.ma(); + this.h("grid", b, a) + } + }); + u.u(D, {ob: "viewportBounds"}, function () { + var a = this.CC; + if (null === this.ib) return a; + var b = this.Ma, c = this.$b; + a.m(b.x, b.y, Math.max(this.Ab, 0) / c, Math.max(this.zb, 0) / c); + return a + }); + u.defineProperty(D, {uD: "fixedBounds"}, function () { + return this.ku + }, function (a) { + var b = this.ku; + b.L(a) || (u.C(a, z, D, "fixedBounds"), -Infinity !== a.width && Infinity !== a.height && -Infinity !== a.height || u.k("fixedBounds width/height must not be Infinity"), this.ku = a = a.Z(), this.pc(), this.h("fixedBounds", b, a)) + }); + u.defineProperty(D, {xE: "scrollMargin"}, function () { + return this.vy + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, D, "scrollMargin"); + var b = this.vy; + b.L(a) || (this.vy = a = a.Z(), this.pc(), this.h("scrollMargin", b, a)) + }); + u.defineProperty(D, {yE: "scrollMode"}, function () { + return this.wy + }, function (a) { + var b = this.wy; + b !== a && (u.rb(a, D, D, "scrollMode"), this.wy = a, a === Ni && gj(this, !1), this.h("scrollMode", b, a)) + }); + u.defineProperty(D, {gE: "positionComputation"}, function () { + return this.oy + }, function (a) { + var b = this.oy; + b !== a && (null !== a && u.j(a, "function", D, "positionComputation"), this.oy = a, gj(this, !1), this.h("positionComputation", b, a)) + }); + u.defineProperty(D, {wE: "scaleComputation"}, function () { + return this.qy + }, function (a) { + var b = this.qy; + b !== a && (null !== a && u.j(a, "function", D, "scaleComputation"), this.qy = a, Yj(this, this.scale, this.scale), this.h("scaleComputation", b, a)) + }); + u.u(D, {Cd: "documentBounds"}, function () { + return this.eu + }); + + function jj(a, b) { + a.ei = !1; + var c = a.eu; + c.L(b) || (b = b.Z(), a.eu = b, gj(a, !1), a.za("DocumentBoundsChanged", null, c.copy()), sj(a)) + } + + u.defineProperty(D, {scale: "scale"}, function () { + return this.$b + }, function (a) { + var b = this.$b; + u.ze(a, D, "scale"); + b !== a && Yj(this, b, a) + }); + u.defineProperty(D, {no: "autoScale"}, function () { + return this.xl + }, function (a) { + var b = this.xl; + b !== a && (u.rb(a, D, D, "autoScale"), this.xl = a, this.h("autoScale", b, a), a !== vf && gj(this, !1)) + }); + u.defineProperty(D, {BJ: "initialAutoScale"}, function () { + return this.tk + }, function (a) { + var b = this.tk; + b !== a && (u.rb(a, D, D, "initialAutoScale"), this.tk = a, this.h("initialAutoScale", b, a)) + }); + u.defineProperty(D, {VG: "initialViewportSpot"}, function () { + return this.vu + }, function (a) { + var b = this.vu; + b !== a && (u.C(a, L, D, "initialViewportSpot"), a.pd() || u.k("initialViewportSpot must be a real Spot: " + a), this.vu = a, this.h("initialViewportSpot", b, a)) + }); + u.defineProperty(D, {SG: "initialDocumentSpot"}, function () { + return this.su + }, function (a) { + var b = this.su; + b !== a && (u.C(a, L, D, "initialDocumentSpot"), a.pd() || u.k("initialViewportSpot must be a real Spot: " + a), this.su = a, this.h("initialDocumentSpot", b, a)) + }); + u.defineProperty(D, {Yg: "minScale"}, function () { + return this.Ku + }, function (a) { + u.ze(a, D, "minScale"); + var b = this.Ku; + b !== a && (0 < a ? (this.Ku = a, this.h("minScale", b, a), a > this.scale && (this.scale = a)) : u.wa(a, "> 0", D, "minScale")) + }); + u.defineProperty(D, {Xg: "maxScale"}, function () { + return this.Hu + }, function (a) { + u.ze(a, D, "maxScale"); + var b = this.Hu; + b !== a && (0 < a ? (this.Hu = a, this.h("maxScale", b, a), a < this.scale && (this.scale = a)) : u.wa(a, "> 0", D, "maxScale")) + }); + u.defineProperty(D, {Rm: "zoomPoint"}, function () { + return this.wv + }, function (a) { + this.wv.L(a) || (u.C(a, w, D, "zoomPoint"), this.wv = a = a.Z()) + }); + u.defineProperty(D, {Ty: "contentAlignment"}, function () { + return this.dn + }, function (a) { + var b = this.dn; + b.L(a) || (u.C(a, L, D, "contentAlignment"), this.dn = a = a.Z(), this.h("contentAlignment", b, a), gj(this, !1)) + }); + u.defineProperty(D, {CJ: "initialContentAlignment"}, function () { + return this.An + }, function (a) { + var b = this.An; + b.L(a) || (u.C(a, L, D, "initialContentAlignment"), this.An = a = a.Z(), this.h("initialContentAlignment", b, a)) + }); + u.defineProperty(D, {padding: "padding"}, function () { + return this.Pe + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, D, "padding"); + var b = this.Pe; + b.L(a) || (this.Pe = a = a.Z(), this.pc(), this.h("padding", b, a)) + }); + u.u(D, {yg: "nodes"}, function () { + return this.Rn.i + }); + u.u(D, {links: "links"}, function () { + return this.Nn.i + }); + u.u(D, {Sj: "parts"}, function () { + return this.Db.i + }); + D.prototype.findTopLevelNodesAndLinks = function () { + for (var a = new F(G), b = this.Rn.i; b.next();) { + var c = b.value; + c.Ho && a.add(c) + } + for (b = this.Nn.i; b.next();) c = b.value, c.Ho && a.add(c); + return a.i + }; + D.prototype.findTopLevelGroups = function () { + return this.Ik.i + }; + u.defineProperty(D, {Qb: "layout"}, function () { + return this.Nd + }, function (a) { + var b = this.Nd; + b !== a && (u.C(a, Je, D, "layout"), null !== b && (b.g = null, b.group = null), this.Nd = a, a.g = this, a.group = null, this.Ot = !0, this.h("layout", b, a), this.de()) + }); + D.prototype.layoutDiagram = function (a) { + ej(this); + a && yk(this, !0); + xj(this, !1) + }; + + function yk(a, b) { + for (var c = a.Ik.i; c.next();) Gk(a, c.value, b); + null !== a.Qb && (b ? a.Qb.vf = !1 : a.Qb.H()) + } + + function Gk(a, b, c) { + if (null !== b) { + for (var d = b.Pn.i; d.next();) Gk(a, d.value, c); + null !== b.Qb && (c ? b.Qb.vf = !1 : b.Qb.H()) + } + } + + function xj(a, b) { + if (!a.zx) { + var c = a.Qb, d = a.zu; + a.zu = !0; + var e = a.Na; + a.Na = !0; + try { + a.Wb("Layout"); + for (var f = a.Ik.i; f.next();) Hk(a, f.value, b); + c.vf || b && !c.PD || (c.doLayout(a), ej(a), c.vf = !0) + } finally { + a.Wd("Layout"), a.Ot = !c.vf, a.zu = d, a.Na = e + } + } + } + + function Hk(a, b, c) { + if (null !== b) { + for (var d = b.Pn.i; d.next();) Hk(a, d.value, c); + d = b.Qb; + null === d || d.vf || c && !d.PD || (b.jy = !b.location.J(), d.doLayout(b), b.H(Ik), d.vf = !0, zj(a, b)) + } + } + + u.defineProperty(D, {qd: "isTreePathToChildren"}, function () { + return this.yu + }, function (a) { + var b = this.yu; + if (b !== a && (u.j(a, "boolean", D, "isTreePathToChildren"), this.yu = a, this.h("isTreePathToChildren", b, a), !this.ha.gb)) for (a = this.yg; a.next();) Jk(a.value) + }); + D.prototype.findTreeRoots = function () { + for (var a = new E(U), b = this.yg; b.next();) { + var c = b.value; + c.Ho && null === c.As() && a.add(c) + } + return a.i + }; + u.defineProperty(D, {me: null}, function () { + return this.mB + }, function (a) { + this.mB = a + }); + + function Oi(a) { + function b(a) { + var b = a.toLowerCase(), h = new E("function"); + c.add(a, h); + c.add(b, h); + d.add(a, a); + d.add(b, a) + } + + var c = new la("string", E), d = new la("string", "string"); + b("AnimationStarting"); + b("AnimationFinished"); + b("BackgroundSingleClicked"); + b("BackgroundDoubleClicked"); + b("BackgroundContextClicked"); + b("ClipboardChanged"); + b("ClipboardPasted"); + b("DocumentBoundsChanged"); + b("ExternalObjectsDropped"); + b("InitialLayoutCompleted"); + b("LayoutCompleted"); + b("LinkDrawn"); + b("LinkRelinked"); + b("LinkReshaped"); + b("Modified"); + b("ObjectSingleClicked"); + b("ObjectDoubleClicked"); + b("ObjectContextClicked"); + b("PartCreated"); + b("PartResized"); + b("PartRotated"); + b("SelectionMoved"); + b("SelectionCopied"); + b("SelectionDeleting"); + b("SelectionDeleted"); + b("SelectionGrouped"); + b("SelectionUngrouped"); + b("ChangingSelection"); + b("ChangedSelection"); + b("SubGraphCollapsed"); + b("SubGraphExpanded"); + b("TextEdited"); + b("TreeCollapsed"); + b("TreeExpanded"); + b("ViewportBoundsChanged"); + a.Bx = c; + a.Ax = d + } + + function ma(a, b) { + var c = a.Ax.ta(b); + return null !== c ? c : a.Ax.ta(b.toLowerCase()) + } + + function Kk(a, b) { + var c = a.Bx.ta(b); + if (null !== c) return c; + c = a.Bx.ta(b.toLowerCase()); + if (null !== c) return c; + u.k("Unknown DiagramEvent name: " + b); + return null + } + + D.prototype.addDiagramListener = D.prototype.Ky = function (a, b) { + u.j(a, "string", D, "addDiagramListener:name"); + u.j(b, "function", D, "addDiagramListener:listener"); + var c = Kk(this, a); + null !== c && c.add(b) + }; + D.prototype.removeDiagramListener = D.prototype.lE = function (a, b) { + u.j(a, "string", D, "removeDiagramListener:name"); + u.j(b, "function", D, "addDiagramListener:listener"); + var c = Kk(this, a); + null !== c && c.remove(b) + }; + D.prototype.raiseDiagramEvent = D.prototype.za = function (a, b, c) { + var d = Kk(this, a), e = new Nd; + e.g = this; + e.name = ma(this, a); + void 0 !== b && (e.hA = b); + void 0 !== c && (e.Mz = c); + a = d.length; + if (1 === a) d = d.ja(0), d(e); else if (0 !== a) for (b = d.Ke(), c = 0; c < a; c++) d = b[c], d(e); + return e.cancel + }; + + function Cg(a, b) { + var c = !1; + a.ob.Kj(b) && (c = !0); + c = a.dz(b, function (a) { + return a.T + }, function (a) { + return a instanceof W + }, !0, function (a) { + return a instanceof W + }, c); + if (0 !== c.count) for (c = c.i; c.next();) { + var d = c.value; + d.el && d.Vb() + } + } + + D.prototype.isUnoccupied = D.prototype.Jo = function (a, b) { + void 0 === b && (b = null); + return Lk(this, !1, null, b).Jo(a.x, a.y, a.width, a.height) + }; + + function Lk(a, b, c, d) { + null === a.md && (a.md = new Mk); + if (a.md.Ls || a.md.group !== c || a.md.fA !== d) { + if (null === c) { + b = a.ei ? fj(a) : a.Cd.copy(); + b.Jf(100, 100); + a.md.initialize(b); + b = u.Sf(); + for (var e = a.yg; e.next();) { + var f = e.value, h = f.layer; + null !== h && h.visible && !h.Ac && Nk(a, f, d, b) + } + } else for (c.ba.J() || c.pf(), b = c.ba.copy(), b.Jf(20, 20), a.md.initialize(b), b = u.Sf(), e = c.Mc; e.next();) f = e.value, f instanceof U && Nk(a, f, d, b); + u.ic(b); + a.md.group = c; + a.md.fA = d; + a.md.Ls = !1 + } else b && Ok(a.md); + return a.md + } + + function Nk(a, b, c, d) { + if (b !== c) if (b.Ea() && b.canAvoid()) { + c = b.getAvoidableRect(d); + d = a.md.ro; + b = a.md.po; + for (var e = c.x + c.width, f = c.y + c.height, h = c.x; h < e; h += d) { + for (var k = c.y; k < f; k += b) Pk(a.md, h, k); + Pk(a.md, h, f) + } + for (k = c.y; k < f; k += b) Pk(a.md, e, k); + Pk(a.md, e, f) + } else if (b instanceof V) for (b = b.Mc; b.next();) e = b.value, e instanceof U && Nk(a, e, c, d) + } + + function Qk(a, b) { + null === a.md || a.md.Ls || null !== b && !b.canAvoid() || (a.md.Ls = !0) + } + + D.prototype.simulatedMouseMove = D.prototype.Hw = function (a, b, c) { + if (null !== Ef) { + var d = Ef.g; + c instanceof D || (c = null); + var e = Ff; + c !== e && (null !== e && e !== d && null !== e.tb.Ed && (Kf(e), Ef.fw = !1, e.tb.Ed.doSimulatedDragLeave()), Ff = c, null !== c && c !== d && null !== c.tb.Ed && (eg(), e = c.tb.Ed, ag.contains(e) || ag.add(e), c.tb.Ed.doSimulatedDragEnter())); + if (null === c || c === d || !c.MC || c.nb || !c.lo) return !1; + d = c.tb.Ed; + null !== d && (null !== a ? b = c.$p(a) : null === b && (b = new w), c.Ob.da = b, c.Ob.Wk = !1, c.Ob.up = !1, d.doSimulatedDragOver()); + return !0 + } + return !1 + }; + D.prototype.simulatedMouseUp = D.prototype.JE = function (a, b, c, d) { + if (null !== Ef) { + null === d && (d = b); + b = Ff; + var e = Ef.g; + if (d !== b) { + if (null !== b && b !== e && null !== b.tb.Ed) return Kf(b), Ef.fw = !1, b.tb.Ed.doSimulatedDragLeave(), !1; + Ff = d; + null !== d && null !== d.tb.Ed && (eg(), b = d.tb.Ed, ag.contains(b) || ag.add(b), d.tb.Ed.doSimulatedDragEnter()) + } + if (null === d) return Ef.doCancel(), !0; + if (d !== this) return null !== a && (c = d.$p(a)), d.Ob.da = c, d.Ob.Wk = !1, d.Ob.up = !0, a = d.tb.Ed, null !== a && a.doSimulatedDrop(), a = Ef, null !== a && (d = a.mayCopy(), a.zf = d ? "Copy" : + "Move", a.stopTool()), !0 + } + return !1 + }; + u.defineProperty(D, {SC: "autoScrollRegion"}, function () { + return this.Qt + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, D, "autoScrollRegion"); + var b = this.Qt; + b.L(a) || (this.Qt = a = a.Z(), this.pc(), this.h("autoScrollRegion", b, a)) + }); + + function xg(a, b) { + a.Pt.assign(b); + Rk(a, a.Pt).De(a.position) ? Kf(a) : Sk(a) + } + + function Sk(a) { + -1 === a.Zm && (a.Zm = u.setInterval(function () { + if (-1 !== a.Zm) { + Kf(a); + var b = a.N.event; + if (null !== b) { + var c = Rk(a, a.Pt); + c.De(a.position) || (a.position = c, a.N.da = a.XE(a.Pt), a.Hw(b, null, b.target.Y) || a.doMouseMove(), a.ei = !0, jj(a, a.kg()), a.Md = !0, a.bf(), Sk(a)) + } + } + }, a.lF)) + } + + function Kf(a) { + -1 !== a.Zm && (u.clearInterval(a.Zm), a.Zm = -1) + } + + function Rk(a, b) { + var c = a.position, d = a.SC; + if (0 >= d.top && 0 >= d.left && 0 >= d.right && 0 >= d.bottom) return c; + var e = a.ob, f = a.scale, e = u.Vj(0, 0, e.width * f, e.height * f), h = u.fc(0, 0); + if (b.x >= e.x && b.x < e.x + d.left) { + var k = Math.max(a.lt, 1), k = k | 0; + h.x -= k; + b.x < e.x + d.left / 2 && (h.x -= k); + b.x < e.x + d.left / 4 && (h.x -= 4 * k) + } else b.x <= e.x + e.width && b.x > e.x + e.width - d.right && (k = Math.max(a.lt, 1), k |= 0, h.x += k, b.x > e.x + e.width - d.right / 2 && (h.x += k), b.x > e.x + e.width - d.right / 4 && (h.x += 4 * k)); + b.y >= e.y && b.y < e.y + d.top ? (k = Math.max(a.mt, 1), k |= 0, h.y -= k, b.y < e.y + + d.top / 2 && (h.y -= k), b.y < e.y + d.top / 4 && (h.y -= 4 * k)) : b.y <= e.y + e.height && b.y > e.y + e.height - d.bottom && (k = Math.max(a.mt, 1), k |= 0, h.y += k, b.y > e.y + e.height - d.bottom / 2 && (h.y += k), b.y > e.y + e.height - d.bottom / 4 && (h.y += 4 * k)); + h.De(K.Wj) || (c = new w(c.x + h.x / f, c.y + h.y / f)); + u.ic(e); + u.v(h); + return c + } + + D.prototype.makeSVG = D.prototype.makeSvg = function (a) { + void 0 === a && (a = new pa); + a.context = "svg"; + a = Tk(this, a); + return null !== a ? a.sl : null + }; + D.prototype.makeImage = function (a) { + void 0 === a && (a = new pa); + var b = (a.document || document).createElement("img"); + b.src = this.tH(a); + return b + }; + D.prototype.makeImageData = D.prototype.tH = function (a) { + void 0 === a && (a = new pa); + var b = Tk(this, a); + return null !== b ? b.toDataURL(a.type, a.details) : "" + }; + var Uk = !1; + + function Tk(a, b) { + a.Lb.Mi(); + a.bf(); + if (null === a.ib) return null; + "object" !== typeof b && u.k("properties argument must be an Object."); + var c = !1, d = b.size || null, e = b.scale || null; + void 0 !== b.scale && isNaN(b.scale) && (e = "NaN"); + var f = b.maxSize; + void 0 === b.maxSize && (c = !0, f = "svg" === b.context ? new ia(Infinity, Infinity) : new ia(2E3, 2E3)); + var h = b.position || null, k = b.parts || null, l = void 0 === b.padding ? 1 : b.padding, + m = b.background || null, n = b.omitTemporary; + void 0 === n && (n = !0); + var p = b.document || document, q = b.elementFinished || null, r = + b.showTemporary; + void 0 === r && (r = !n); + n = b.showGrid; + void 0 === n && (n = r); + null !== d && isNaN(d.width) && isNaN(d.height) && (d = null); + "number" === typeof l ? l = new rb(l) : l instanceof rb || (l = new rb(0)); + l.left = Math.max(l.left, 0); + l.right = Math.max(l.right, 0); + l.top = Math.max(l.top, 0); + l.bottom = Math.max(l.bottom, 0); + a.qn = !1; + $i(a); + var s = new oa(null, p), t = s.getContext("2d"), v = s; + if (!(d || e || k || h)) return s.width = a.Ab + Math.ceil(l.left + l.right), s.height = a.zb + Math.ceil(l.top + l.bottom), "svg" === b.context && (t = v = new Nc(s.Dd, p, q), t instanceof + Nc && (a.qn = !0)), Gj(a, t, l, new ia(s.width, s.height), a.$b, a.Ma, k, m, r, n), a.qn = !0, v; + var x = a.Eb.Pv, B = new w(0, 0), y = a.Cd.copy(); + y.tI(a.padding); + if (r) for (var C = !0, C = a.Zb.n, I = C.length, H = 0; H < I; H++) { + var T = C[H]; + if (T.visible && T.Ac) for (var aa = T.Db.n, T = aa.length, R = 0; R < T; R++) { + var N = aa[R]; + N.uz && N.Ea() && (N = N.ba, N.J() && y.Sh(N)) + } + } + B.x = y.x; + B.y = y.y; + if (null !== k) { + var Z, C = !0, aa = k.i; + for (aa.reset(); aa.next();) I = aa.value, I instanceof G && (N = I, T = N.layer, null !== T && !T.visible || null !== T && !r && T.Ac || !N.Ea() || (N = N.ba, N.J() && (C ? (C = !1, Z = + N.copy()) : Z.Sh(N)))); + C && (Z = new z(0, 0, 0, 0)); + y.width = Z.width; + y.height = Z.height; + B.x = Z.x; + B.y = Z.y + } + null !== h && h.J() && (B = h, e || (e = x)); + C = aa = 0; + null !== l && (aa = l.left + l.right, C = l.top + l.bottom); + H = I = 0; + null !== d && (I = d.width, H = d.height, isFinite(I) && (I = Math.max(0, I - aa)), isFinite(H) && (H = Math.max(0, H - C))); + Z = h = 0; + null !== d && null !== e ? ("NaN" === e && (e = x), d.J() ? (h = I, Z = H) : isNaN(H) ? (h = I, Z = y.height * e) : (h = y.width * e, Z = H)) : null !== d ? d.J() ? (e = Math.min(I / y.width, H / y.height), h = I, Z = H) : isNaN(H) ? (e = I / y.width, h = I, Z = y.height * e) : (e = H / y.height, + h = y.width * e, Z = H) : null !== e ? "NaN" === e && f.J() ? (e = Math.min((f.width - aa) / y.width, (f.height - C) / y.height), e > x ? (e = x, h = y.width, Z = y.height) : (h = f.width, Z = f.height)) : (h = y.width * e, Z = y.height * e) : (e = x, h = y.width, Z = y.height); + null !== l ? (h += aa, Z += C) : l = new rb(0); + null !== f && (d = f.width, f = f.height, "svg" !== b.context && c && !Uk && (h > d || Z > f) && (u.trace("Diagram.makeImage(data): Diagram width or height is larger than the default max size. (" + Math.ceil(h) + "x" + Math.ceil(Z) + " vs 2000x2000) Consider increasing the max size."), Uk = !0), + isNaN(d) && (d = 2E3), isNaN(f) && (f = 2E3), isFinite(d) && (h = Math.min(h, d)), isFinite(f) && (Z = Math.min(Z, f))); + s.width = Math.ceil(h); + s.height = Math.ceil(Z); + "svg" === b.context && (t = v = new Nc(s.Dd, p, q), t instanceof Nc && (a.qn = !0)); + Gj(a, t, l, new ia(Math.ceil(h), Math.ceil(Z)), e, B, k, m, r, n); + a.qn = !0; + return v + } + + D.inherit = function (a, b) { + u.j(a, "function", D, "inherit"); + u.j(b, "function", D, "inherit"); + b.AF && u.k("Cannot inherit from " + u.rg(b)); + u.Ga(a, b) + }; + + function Vi() { + this.DF = "63ad05bbe23a1786468a4c741b6d2"; + this.DF === this._tk ? this.vh = !0 : Vk(this, !1) + } + + function Vk(a, b) { + var c = "p", d = window[u.Da("76a715b2f73f148a")][u.Da("72ba13b5")]; + if (u.Da("77bb5bb2f32603de") === window[u.Da("76a715b2f73f148a")][u.Da("6aba19a7ec351488")]) try { + a.vh = !window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b")])([u.Da("7bb8069ae7")] === u.Da(u.adym)); + if (!1 === a.vh) return; + a.vh = !window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b6c7a197c31bb4cfd3e")])([u.Da("7bb8069ae7")] === u.Da(u.adym)); + if (!1 === a.vh) return + } catch (e) { + } + for (var f = d[u.Da("76ad18b4f73e")], h = d[u.Da("73a612b6fb191d")](u.Da("35e7")) + 2; h < f; h++) c += d[h]; + d = c[u.Da("73a612b6fb191d")](u.Da(u.adym)); + 0 >= d && u.Da(u.adym) !== u.Da("7da71ca0ad381e90") && (d = c[u.Da("73a612b6fb191d")](u.Da("76a715b2ef3e149757"))); + a.vh = !(0 < d && d < c[u.Da("73a612b6fb191d")](u.Da("35"))); + a.vh && (c = window.document[u.Da("79ba13b2f7333e8846865a7d00")]("div"), d = u.Da("02cncncn"), "." === d[0] && (d = d[u.Da("69bd14a0f724128a44")](1)), c[u.Da("79a417a0f0181a8946")] = d, window.document[u.Da("78a712aa")] ? + (window.document[u.Da("78a712aa")][u.Da("7bb806b6ed32388c4a875b")](c), d = window[u.Da("7dad0290ec3b0b91578e5b40007031bf")](c)[u.Da("7dad0283f1390b81519f4645156528bf")](u.Da("78a704b7e62456904c9b12701b6532a8")), window.document[u.Da("78a712aa")][u.Da("68ad1bbcf533388c4a875b")](c), d && -1 !== d.indexOf(u.Da(u.XF)) && -1 !== d.indexOf(u.Da(u.YF)) && (a.vh = !1)) : (a.vh = null, b && (a.vh = !1))) + } + + Vi.prototype.wl = function (a) { + a.Gg.setTransform(a.nf, 0, 0, a.nf, 0, 0); + null === this.vh && Vk(this, !0); + return 0 < this.vh && this !== this.BF ? !0 : !1 + }; + Vi.prototype.t = function () { + this.BF = null + }; + + function Wi(a, b) { + void 0 !== b && null !== b || u.k("Diagram setup requires an argument DIV."); + null !== a.Jb && u.k("Diagram has already completed setup."); + "string" === typeof b ? a.Jb = window.document.getElementById(b) : b instanceof HTMLDivElement ? a.Jb = b : u.k("No DIV or DIV id supplied: " + b); + null === a.Jb && u.k("Invalid DIV id; could not get element with id: " + b); + void 0 !== a.Jb.Y && u.k("Invalid div id; div already has a Diagram associated with it."); + "static" === window.getComputedStyle(a.Jb, null).position && (a.Jb.style.position = + "relative"); + a.Jb.style["-webkit-tap-highlight-color"] = "rgba(255, 255, 255, 0)"; + a.Jb.style["-ms-touch-action"] = "none"; + a.Jb.innerHTML = ""; + a.Jb.Y = a; + var c = new oa(a); + c.Dd.innerHTML = "This text is displayed if your browser does not support the Canvas HTML element."; + void 0 !== c.style && (c.style.position = "absolute", c.style.top = "0px", c.style.left = "0px", "rtl" === window.getComputedStyle(a.Jb, null).getPropertyValue("direction") && (a.wB = !0), c.style.zIndex = "2", c.style.DK = "none", c.style.webkitUserSelect = "none", c.style.MozUserSelect = + "none"); + a.Ab = a.Jb.clientWidth || 1; + a.zb = a.Jb.clientHeight || 1; + a.ib = c; + a.Gg = c.getContext("2d"); + var d = a.Gg; + a.nf = a.computePixelRatio(); + Ij(a, a.Ab, a.zb); + a.Zw = d[u.Da("7eba17a4ca3b1a8346")][u.Da("78a118b7")](d, u.wl, 4, 4); + a.Jb.insertBefore(c.Dd, a.Jb.firstChild); + c = new oa(null); + c.width = 1; + c.height = 1; + a.Dx = c; + a.dB = c.getContext("2d"); + var c = u.createElement("div"), d = u.createElement("div"), e = u.createElement("div"), + f = u.createElement("div"); + c.style.position = "absolute"; + c.style.overflow = "auto"; + c.style.width = a.Ab + "px"; + c.style.height = + a.zb + "px"; + c.style.zIndex = "1"; + d.style.position = "absolute"; + d.style.overflow = "auto"; + d.style.width = a.Ab + "px"; + d.style.height = a.zb + "px"; + d.style.zIndex = "1"; + e.style.position = "absolute"; + e.style.width = "1px"; + e.style.height = "1px"; + f.style.position = "absolute"; + f.style.width = "1px"; + f.style.height = "1px"; + a.Jb.appendChild(c); + a.Jb.appendChild(d); + c.appendChild(e); + d.appendChild(f); + c.onscroll = a.LB; + c.onmousedown = a.Ru; + c.ontouchstart = a.Ru; + c.Y = a; + c.bC = !0; + d.onscroll = a.LB; + d.onmousedown = a.Ru; + d.ontouchstart = a.Ru; + d.Y = a; + d.cC = !0; + a.uj = + c; + a.vj = d; + a.ty = e; + a.uy = f; + a.hE = u.gD(function () { + a.im = null; + a.ma() + }, 300, !1); + a.aF = u.gD(function () { + gi(a) + }, 250, !1); + a.preventDefault = function (a) { + a.preventDefault(); + return !1 + }; + a.Qo = function (b) { + if (a.isEnabled) { + a.Jl = !0; + var c = a.Jc; + u.Dm && c.jl ? (b.preventDefault(), b.simulated = !0, a.Ir = b) : (a.Jc = a.Ob, a.Ob = c, nj(a, a, b, c, !0), a.Hw(b, null, b.target.Y) || (a.doMouseMove(), a.Va.isBeyondDragSize() && (yf(a), a.Ol = 0))) + } + }; + a.Po = function (b) { + if (a.isEnabled) { + a.Jl = !0; + var c = a.Jc; + if (u.Dm && null !== a.Ir) a.Ir = b, b.preventDefault(); else if (u.Dm && + 400 > b.timeStamp - a.Pl) b.preventDefault(); else if (a.Jc = a.Ob, a.Ob = c, nj(a, a, b, c, !0), c.Wk = !0, c.Te = b.detail, a.nk = c.copy(), !0 === c.Vp.simulated) b.preventDefault(), b.simulated = !0; else if (Ef = null, a.doMouseDown(), 1 === b.button) return b.preventDefault(), !1 + } + }; + a.So = function (b) { + if (a.isEnabled) { + a.Jl = !0; + var c = a.Jc; + if (u.Dm) { + if (400 > b.timeStamp - a.Pl) { + b.preventDefault(); + return + } + a.Pl = b.timeStamp + } + if (u.Dm && null !== a.Ir) a.Ir = null, b.preventDefault(); else { + a.Jc = a.Ob; + a.Ob = c; + nj(a, a, b, c, !0); + c.up = !0; + c.Te = b.detail; + if (u.aH || u.bH) b.timeStamp - + a.Pl < a.zC && !a.Va.isBeyondDragSize() ? a.Ol++ : a.Ol = 1, a.Pl = b.timeStamp, c.Te = a.Ol; + c.bubbles = b.bubbles; + b.target.Y && (c.Cg = b.target.Y); + a.JE(b, null, new w, c.Cg) || (a.doMouseUp(), Kf(a), rj(c, b)) + } + } + }; + a.Zg = function (b) { + if (a.isEnabled) { + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + nj(a, a, b, c, !0); + c.bubbles = !0; + c.Uk = void 0 !== b.wheelDelta ? b.wheelDelta : -40 * b.detail; + a.doMouseWheel(); + rj(c, b) + } + }; + a.Ro = function () { + if (a.isEnabled) { + a.Jl = !1; + var b = a.Va; + b.cancelWaitAfter(); + b instanceof jf && b.hideToolTip() + } + }; + a.SE = function (b) { + if (a.isEnabled) { + a.kv = !1; + a.Xx = !0; + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + pj(a, b, b.targetTouches[0], c, 1 < b.touches.length); + a.doMouseDown(); + 2 > b.touches.length && mj(a, c); + rj(c, b) + } + }; + a.RE = function (b) { + if (a.isEnabled) { + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + var d = null; + 0 < b.changedTouches.length ? d = b.changedTouches[0] : 0 < b.targetTouches.length && (d = b.targetTouches[0]); + qj(a, b, d, c, 1 < b.touches.length); + (a.Va.isBeyondDragSize() || 1 < b.touches.length) && yf(a); + a.Hw(d ? d : b, null, c.Cg) || (a.doMouseMove(), rj(c, b)) + } + }; + a.QE = function (b) { + if (a.isEnabled) { + yf(a); + if (a.kv) return b.preventDefault(), + !1; + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + if (1 < b.touches.length) a.yn && (a.Lx = !1); else { + var d = null, e = null; + 0 < b.changedTouches.length ? e = b.changedTouches[0] : 0 < b.targetTouches.length && (e = b.targetTouches[0]); + c.g = a; + c.Te = 1; + if (null !== e) { + var d = window.document.elementFromPoint(e.clientX, e.clientY), f, p; + d && d.Y ? (p = e, f = d.Y) : (p = b.changedTouches[0], f = a); + oj(f, p, c); + f = e.screenX; + p = e.screenY; + var q = a.AB; + b.timeStamp - a.Pl < a.zC && !(25 < Math.abs(q.x - f) || 25 < Math.abs(q.y - p)) ? a.Ol++ : a.Ol = 1; + c.Te = a.Ol; + a.Pl = b.timeStamp; + a.AB.m(f, p) + } + c.gd = 0; + c.button = + 0; + c.Wk = !1; + c.up = !0; + c.Uk = 0; + c.Tc = !1; + c.bubbles = !1; + c.event = b; + c.timestamp = Date.now(); + c.Cg = null === d ? b.target.Y : d.Y ? d.Y : null; + c.pe = null; + a.JE(e ? e : b, null, new w, c.Cg) || (a.doMouseUp(), rj(c, b), a.Xx = !1) + } + } + }; + a.KH = function (b) { + if ("touch" === b.pointerType) { + var c = a.WB; + void 0 === c[b.pointerId] && (a.hr++, c[b.pointerId] = b); + a.Df[0] = null; + a.Df[1] = null; + for (var d in c) if (null === a.Df[0]) a.Df[0] = c[d]; else if (null === a.Df[1]) { + a.Df[1] = c[d]; + break + } + a.isEnabled && (a.kv = !1, c = a.Jc, a.Jc = a.Ob, a.Ob = c, pj(a, b, b, c, 1 < a.hr), a.doMouseDown(), 2 > a.hr && + mj(a, c), rj(c, b)) + } + }; + a.MH = function (b) { + if ("touch" === b.pointerType && !(2 > a.hr)) { + var c = a.Df; + c[0].pointerId === b.pointerId && (c[0] = b); + c[1].pointerId === b.pointerId && (c[1] = b); + a.isEnabled && (c = a.Jc, a.Jc = a.Ob, a.Ob = c, qj(a, b, b, c, !0), yf(a), a.Hw(b, null, c.Cg) || (a.doMouseMove(), rj(c, b))) + } + }; + a.LH = function (b) { + if ("touch" === b.pointerType) { + var c = a.WB; + void 0 !== c[b.pointerId] && (a.hr--, delete c[b.pointerId], c = a.Df, null !== c[0] && c[0].pointerId === b.pointerId && (c[0] = null), null !== c[1] && c[1].pointerId === b.pointerId && (c[1] = null)) + } + }; + $i(a); + Zi(a) + } + + function Wk(a) { + 1 < arguments.length && u.k("Palette constructor can only take one optional argument, the DIV HTML element or its id."); + D.call(this, a); + this.Av = !0; + this.Nk = !1; + this.nb = !0; + this.Ty = Db; + this.Qb = new Xk + } + + u.Ga(Wk, D); + u.fa("Palette", Wk); + + function Si(a) { + 1 < arguments.length && u.k("Overview constructor can only take one optional argument, the DIV HTML element or its id."); + D.call(this, a); + this.Uh.isEnabled = !1; + this.sc = !0; + this.rj = null; + this.rF = this.hu = !0; + this.iI("drawShadows", !1); + var b = new G, c = new X; + c.stroke = "magenta"; + c.hb = 2; + c.fill = "transparent"; + c.name = "BOXSHAPE"; + b.pl = !0; + b.Zz = "BOXSHAPE"; + b.zz = "BOXSHAPE"; + b.tE = "BOXSHAPE"; + b.cursor = "move"; + b.add(c); + this.zl = b; + c = new lf; + c.type = oh; + c.Ze = Ib; + var d = new ph; + d.tg = !0; + c.add(d); + d = new X; + d.Hj = Ib; + d.Fb = "Rectangle"; + d.xa = new ia(64, 64); + d.cursor = "se-resize"; + d.alignment = Vb; + c.add(d); + b.rE = c; + this.lm = this.Ij = !1; + this.of = this.hs = !0; + this.SC = 0; + this.Cy = u.createElement("canvas"); + this.CF = this.Cy.getContext("2d"); + this.tb.Ed = new Yk; + this.tb.uE = new Zk; + var e = this; + this.click = function () { + var a = e.rj; + if (null !== a) { + var b = a.ob, c = e.N.da; + a.position = new w(c.x - b.width / 2, c.y - b.height / 2) + } + }; + this.dE = function () { + $k(e) + }; + this.cE = function () { + null !== e.rj && (e.pc(), e.ma()) + }; + this.no = kj; + this.sc = !1 + } + + u.Ga(Si, D); + u.fa("Overview", Si); + + function al(a) { + a.sc || a.vd || !1 !== a.Ef || (a.Ef = !0, requestAnimationFrame(function () { + if (a.Ef && !a.vd && (a.Ef = !1, null !== a.Jb)) { + a.vd = !0; + ej(a); + a.Cd.J() || jj(a, a.kg()); + null === a.Jb && u.k("No div specified"); + null === a.ib && u.k("No canvas specified"); + if (a.Md) { + var b = a.rj; + if (null !== b && !b.Lb.Vg && !b.Lb.ld) { + var b = a.Gg, c = a.Cy; + b.setTransform(1, 0, 0, 1, 0, 0); + b.clearRect(0, 0, a.ib.width, a.ib.height); + b.drawImage(c, 0, 0); + c = a.Sd; + c.reset(); + 1 !== a.$b && c.scale(a.scale); + 0 === a.position.x && 0 === a.position.y || c.translate(-a.Ma.x, -a.Ma.y); + b.setTransform(c.m11, + c.m12, c.m21, c.m22, c.dx, c.dy); + for (var c = a.Zb.n, d = c.length, e = 0; e < d; e++) c[e].We(b, a); + a.uk = !1; + a.Md = !1 + } + } + a.vd = !1 + } + })) + } + + Si.prototype.computePixelRatio = function () { + return 1 + }; + Si.prototype.We = function () { + null === this.Jb && u.k("No div specified"); + null === this.ib && u.k("No canvas specified"); + if (this.Md) { + var a = this.rj; + if (null !== a && !a.Lb.Vg && !a.Lb.ld) { + if (!this.rF) { + var b = a.tb.Ed; + if (null !== b && b.na) return + } + Dj(this); + b = a.Gs; + (null !== b && b.visible && isNaN(b.width) || isNaN(b.height)) && vj(a); + var c = this.ib, b = this.Gg, d = this.Cy, e = this.CF; + d.width = c.width; + d.height = c.height; + b.Et = ""; + b.setTransform(1, 0, 0, 1, 0, 0); + b.clearRect(0, 0, this.ib.width, this.ib.height); + d = this.Sd; + d.reset(); + 1 !== this.$b && d.scale(this.scale); + 0 === this.position.x && 0 === this.position.y || d.translate(-this.Ma.x, -this.Ma.y); + b.setTransform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + for (var d = this.hu, f = this.ob, h = a.Zb.n, k = h.length, a = 0; a < k; a++) { + var l = h[a], m = b, n = f, p = d; + if (l.visible && 0 !== l.Ic && (void 0 === p && (p = !0), p || !l.Ac)) { + 1 !== l.Ic && (m.globalAlpha = l.Ic); + for (var p = this.scale, l = l.Db.n, q = l.length, r = 0; r < q; r++) { + var s = l[r], t = s.ba; + t.sg(n) && (1 < t.width * p || 1 < t.height * p ? s.We(m, this) : wi(s, m)) + } + m.globalAlpha = 1 + } + } + e.drawImage(c.Dd, 0, 0); + c = this.Zb.n; + e = c.length; + for (a = 0; a < e; a++) c[a].We(b, + this); + this.Md = this.uk = !1 + } + } + }; + u.defineProperty(Si, {Lz: "observed"}, function () { + return this.rj + }, function (a) { + var b = this.rj; + null !== a && u.C(a, D, Si, "observed"); + a instanceof Si && u.k("Overview.observed Diagram may not be an Overview itself: " + a); + b !== a && (null !== b && (this.remove(this.Tg), b.lE("ViewportBoundsChanged", this.dE), b.lE("DocumentBoundsChanged", this.cE), b.Ul.remove(this)), this.rj = a, null !== a && (a.Ky("ViewportBoundsChanged", this.dE), a.Ky("DocumentBoundsChanged", this.cE), a.Ul.add(this), this.add(this.Tg), $k(this)), this.pc(), this.h("observed", + b, a)) + }); + u.defineProperty(Si, {Tg: "box"}, function () { + return this.zl + }, function (a) { + var b = this.zl; + b !== a && (this.zl = a, this.remove(b), this.add(this.zl), $k(this), this.h("box", b, a)) + }); + u.defineProperty(Si, {vJ: "drawsTemporaryLayers"}, function () { + return this.hu + }, function (a) { + this.hu !== a && (this.hu = a, this.Sz()) + }); + + function $k(a) { + var b = a.Tg; + if (null !== b) { + var c = a.rj; + if (null !== c) { + a.Md = !0; + var c = c.ob, d = b.nt, e = u.ul(); + e.m(c.width, c.height); + d.xa = e; + u.Oj(e); + a = 2 / a.scale; + d instanceof X && (d.hb = a); + b.location = new w(c.x - a / 2, c.y - a / 2) + } + } + } + + Si.prototype.kg = function () { + var a = this.rj; + return null === a ? K.kF : a.Cd + }; + Si.prototype.nz = function () { + !0 !== this.Md && (this.Md = !0, al(this)) + }; + Si.prototype.dt = function (a) { + this.sc || (cj(this), this.ma(), sj(this), this.pc(), $k(this), this.za("ViewportBoundsChanged", null, a)) + }; + + function Yk() { + uf.call(this); + this.Ck = null + } + + u.Ga(Yk, uf); + Yk.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || !a.Nk || !a.of) return !1; + var b = a.Lz; + if (null === b) return !1; + if (null === this.findDraggablePart()) { + var c = b.ob; + this.Ck = new w(c.width / 2, c.height / 2); + a = a.wc.da; + b.position = new w(a.x - this.Ck.x, a.y - this.Ck.y) + } + return !0 + }; + Yk.prototype.doActivate = function () { + this.Ck = null; + uf.prototype.doActivate.call(this) + }; + Yk.prototype.moveParts = function () { + var a = this.g, b = a.Lz; + if (null !== b) { + var c = a.Tg; + if (null !== c) { + if (null === this.Ck) { + var d = a.wc.da, c = c.location; + this.Ck = new w(d.x - c.x, d.y - c.y) + } + a = a.N.da; + b.position = new w(a.x - this.Ck.x, a.y - this.Ck.y) + } + } + }; + + function Zk() { + mh.call(this) + } + + u.Ga(Zk, mh); + Zk.prototype.resize = function (a) { + var b = this.g.Lz; + if (null !== b) { + var c = b.ob.copy(); + b.position = a.position; + (c.width !== a.width || c.height !== a.height) && 0 < a.width && 0 < a.height && (b.scale = Math.min(c.width / a.width, c.height / a.height)) + } + }; + + function ga(a) { + 1 < arguments.length && u.k("Brush constructor can take at most one optional argument, the Brush type."); + u.gc(this); + this.Ca = !1; + void 0 === a ? (this.oa = te, this.cn = "black") : "string" === typeof a ? (this.oa = te, this.cn = a) : (this.oa = a, this.cn = "black"); + var b = this.oa; + b === ue ? (this.ao = Db, this.sn = Ub) : this.sn = b === ve ? this.ao = Ib : this.ao = vb; + this.hv = 0; + this.iu = NaN; + this.Fg = this.Wu = this.Eg = null; + this.kx = this.lx = 0 + } + + u.fa("Brush", ga); + var te; + ga.Solid = te = u.s(ga, "Solid", 0); + var ue; + ga.Linear = ue = u.s(ga, "Linear", 1); + var ve; + ga.Radial = ve = u.s(ga, "Radial", 2); + var bl; + ga.Pattern = bl = u.s(ga, "Pattern", 4); + ga.prototype.copy = function () { + var a = new ga; + a.oa = this.oa; + a.cn = this.cn; + a.ao = this.ao.Z(); + a.sn = this.sn.Z(); + a.hv = this.hv; + a.iu = this.iu; + null !== this.Eg && (a.Eg = this.Eg.copy()); + a.Wu = this.Wu; + return a + }; + ga.prototype.Ka = function () { + this.freeze(); + Object.freeze(this); + return this + }; + ga.prototype.freeze = function () { + this.Ca = !0; + null !== this.Eg && this.Eg.freeze(); + return this + }; + ga.prototype.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + null !== this.Eg && this.Eg.La(); + return this + }; + ga.prototype.toString = function () { + var a = "Brush("; + if (this.type === te) a += this.color; else if (a = this.type === ue ? a + "Linear " : this.type === ve ? a + "Radial " : this.type === bl ? a + "Pattern " : a + "(unknown) ", a += this.start + " " + this.end, null !== this.os) for (var b = this.os.i; b.next();) a += " " + b.key + ":" + b.value; + return a + ")" + }; + ga.prototype.addColorStop = ga.prototype.addColorStop = function (a, b) { + u.I(this); + ("number" !== typeof a || !isFinite(a) || 1 < a || 0 > a) && u.wa(a, "0 <= loc <= 1", ga, "addColorStop:loc"); + u.j(b, "string", ga, "addColorStop:color"); + null === this.Eg && (this.Eg = new la("number", "string")); + this.Eg.add(a, b); + this.oa === te && (this.type = ue); + this.Fg = null + }; + u.defineProperty(ga, {type: "type"}, function () { + return this.oa + }, function (a) { + u.I(this, a); + u.rb(a, ga, ga, "type"); + this.oa = a; + this.start.ne() && (a === ue ? this.start = Db : a === ve && (this.start = Ib)); + this.end.ne() && (a === ue ? this.end = Ub : a === ve && (this.end = Ib)); + this.Fg = null + }); + u.defineProperty(ga, {color: "color"}, function () { + return this.cn + }, function (a) { + u.I(this, a); + this.cn = a; + this.Fg = null + }); + u.defineProperty(ga, {start: "start"}, function () { + return this.ao + }, function (a) { + u.I(this, a); + u.C(a, L, ga, "start"); + this.ao = a.Z(); + this.Fg = null + }); + u.defineProperty(ga, {end: "end"}, function () { + return this.sn + }, function (a) { + u.I(this, a); + u.C(a, L, ga, "end"); + this.sn = a.Z(); + this.Fg = null + }); + u.defineProperty(ga, {ut: "startRadius"}, function () { + return this.hv + }, function (a) { + u.I(this, a); + u.ze(a, ga, "startRadius"); + 0 > a && u.wa(a, ">= zero", ga, "startRadius"); + this.hv = a; + this.Fg = null + }); + u.defineProperty(ga, {us: "endRadius"}, function () { + return this.iu + }, function (a) { + u.I(this, a); + u.ze(a, ga, "endRadius"); + 0 > a && u.wa(a, ">= zero", ga, "endRadius"); + this.iu = a; + this.Fg = null + }); + u.defineProperty(ga, {os: "colorStops"}, function () { + return this.Eg + }, function (a) { + u.I(this, a); + this.Eg = a; + this.Fg = null + }); + u.defineProperty(ga, {pattern: "pattern"}, function () { + return this.Wu + }, function (a) { + u.I(this, a); + this.Wu = a; + this.Fg = null + }); + ga.randomColor = function (a, b) { + void 0 === a && (a = 128); + void 0 === b && (b = Math.max(a, 255)); + var c = Math.abs(b - a), d = Math.floor(a + Math.random() * c).toString(16), + e = Math.floor(a + Math.random() * c).toString(16), c = Math.floor(a + Math.random() * c).toString(16); + 2 > d.length && (d = "0" + d); + 2 > e.length && (e = "0" + e); + 2 > c.length && (c = "0" + c); + return "#" + d + e + c + }; + var cl = u.createElement("canvas").getContext("2d"), fa; + ga.isValidColor = fa = function (a) { + if ("black" === a) return !0; + if ("" === a) return !1; + cl.fillStyle = "#000000"; + var b = cl.fillStyle; + cl.fillStyle = a; + if (cl.fillStyle !== b) return !0; + cl.fillStyle = "#FFFFFF"; + b = cl.fillStyle; + cl.fillStyle = a; + return cl.fillStyle !== b + }; + + function S() { + u.gc(this); + this.ea = 30723; + this.Ic = 1; + this.Pg = null; + this.Ub = ""; + this.lc = this.Ib = null; + this.Ma = (new w(NaN, NaN)).freeze(); + this.jf = (new ia(NaN, NaN)).freeze(); + this.nj = K.op; + this.lj = K.jF; + this.Sd = new ja; + this.Xm = new ja; + this.yk = new ja; + this.$b = this.fu = 1; + this.Ym = 0; + this.Hh = dl; + this.Gq = K.np; + this.Pc = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.Xb = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.Hc = (new z(0, 0, NaN, NaN)).freeze(); + this.Sr = this.Wp = this.Q = this.ir = this.jr = null; + this.Tr = this.Xp = Infinity; + this.vp = this.se = uc; + this.wr = + 0; + this.tj = 1; + this.Cp = 0; + this.Wi = 1; + this.Ar = -Infinity; + this.zr = 0; + this.Br = K.Wj; + this.Cr = dh; + this.Jp = ""; + this.Gc = this.P = null; + this.$m = -1; + this.Wl = this.Xh = this.Bl = this.$n = null + } + + u.Lh(S); + u.fa("GraphObject", S); + S.prototype.cloneProtected = function (a) { + a.ea = this.ea | 6144; + a.Ic = this.Ic; + a.Ub = this.Ub; + a.Ib = this.Ib; + a.lc = this.lc; + a.Ma.assign(this.Ma); + a.jf.assign(this.jf); + a.nj = this.nj.Z(); + a.lj = this.lj.Z(); + a.yk = this.yk.copy(); + a.$b = this.$b; + a.Ym = this.Ym; + a.Hh = this.Hh; + a.Gq = this.Gq.Z(); + a.Pc.assign(this.Pc); + a.Xb.assign(this.Xb); + a.Hc.assign(this.Hc); + a.ir = this.ir; + a.Q = null !== this.Q ? this.Q.copy() : null; + a.Wp = this.Wp; + a.Xp = this.Xp; + a.Sr = this.Sr; + a.Tr = this.Tr; + a.se = this.se.Z(); + a.vp = this.vp.Z(); + a.wr = this.wr; + a.tj = this.tj; + a.Cp = this.Cp; + a.Wi = + this.Wi; + a.Ar = this.Ar; + a.zr = this.zr; + a.Br = this.Br.Z(); + a.Cr = this.Cr; + a.Jp = this.Jp; + a.P = null !== this.P ? this.P.copy() : null; + a.Gc = this.Gc; + a.$m = this.$m; + if (null !== this.Bl) { + a.Bl = u.Pk(this.Bl); + for (var b = 0; b < this.Bl.length; b++) { + var c = this.Bl[b]; + a[c] = this[c] + } + } + null !== this.Xh && (a.Xh = this.Xh.copy()) + }; + S.prototype.Mh = function (a) { + a.jr = null; + a.Wl = null; + a.R() + }; + S.prototype.clone = function () { + var a = new this.constructor; + this.cloneProtected(a); + return a + }; + S.prototype.copy = function () { + return this.clone() + }; + S.prototype.toString = function () { + return u.rg(Object.getPrototypeOf(this)) + "#" + u.Uc(this) + }; + var qh; + S.None = qh = u.s(S, "None", 0); + var dl; + S.Default = dl = u.s(S, "Default", 0); + var el; + S.Vertical = el = u.s(S, "Vertical", 4); + var fl; + S.Horizontal = fl = u.s(S, "Horizontal", 5); + var cd; + S.Fill = cd = u.s(S, "Fill", 3); + var sh; + S.Uniform = sh = u.s(S, "Uniform", 1); + var th; + S.UniformToFill = th = u.s(S, "UniformToFill", 2); + + function gl(a) { + a.P = new hl + } + + S.prototype.Ee = function () { + var a = new il; + a.cj = vb; + a.Ej = vb; + a.aj = 10; + a.Cj = 10; + a.$i = jl; + a.Bj = jl; + a.bj = 0; + a.Dj = 0; + this.Q = a + }; + + function kl(a, b, c, d, e, f, h) { + var k = .001, l = f.length; + a.moveTo(b, c); + d -= b; + k = e - c; + 0 === d && (d = .001); + e = k / d; + for (var m = Math.sqrt(d * d + k * k), n = 0, p = !0, q = 0 === h ? !1 : !0; .1 <= m;) { + if (q) { + k = f[n++ % l]; + for (k -= h; 0 > k;) k += f[n++ % l], p = !p; + q = !1 + } else k = f[n++ % l]; + k > m && (k = m); + var r = Math.sqrt(k * k / (1 + e * e)); + 0 > d && (r = -r); + b += r; + c += e * r; + p ? a.lineTo(b, c) : a.moveTo(b, c); + m -= k; + p = !p + } + } + + S.prototype.raiseChangedEvent = S.prototype.Dc = function (a, b, c, d, e, f, h) { + var k = this.T; + null !== k && (k.Lm(a, b, c, d, e, f, h), 0 !== (this.ea & 1024) && c === this && a === $d && ll(this, k, b)) + }; + + function ll(a, b, c) { + var d = a.zo(); + if (null !== d) for (var e = a.Gc.i; e.next();) { + var f = e.value, h = null; + if (null !== f.Nm) { + h = ef(f, d, a); + if (null === h) continue; + f.Mw(a, h, c, null) + } else if (f.xt) { + var k = b.g; + null !== k && f.Mw(a, k.ga.Zs, c, k) + } else { + var l = d.data; + if (null === l) continue; + k = b.g; + null !== k && k.Iw || f.Mw(a, l, c, k) + } + null !== h && (k = d.Vv(f.tl), null !== k && f.ZE(k, h, c)) + } + } + + S.prototype.Vv = function (a) { + return this.$m === a ? this : null + }; + S.prototype.raiseChanged = S.prototype.h = function (a, b, c) { + this.Dc($d, a, this, b, c) + }; + + function ml(a, b, c, d, e) { + var f = a.Pc, h = a.yk; + h.reset(); + nl(a, h, b, c, d, e); + a.yk = h; + f.x = b; + f.y = c; + f.width = d; + f.height = e; + h.Os() || h.WE(f) + } + + function ol(a, b, c, d) { + if (!1 === a.Ag) return !1; + d.multiply(a.transform); + return c ? a.sg(b, d) : a.sm(b, d) + } + + S.prototype.sD = function (a, b, c) { + if (!1 === this.Ag) return !1; + var d = this.Ha; + b = a.Lj(b); + var e = !1; + c && (e = Xa(a.x, a.y, 0, 0, 0, d.height) < b || Xa(a.x, a.y, 0, d.height, d.width, d.height) < b || Xa(a.x, a.y, d.width, d.height, d.width, 0) < b || Xa(a.x, a.y, d.width, 0, 0, 0) < b); + c || (e = Xa(a.x, a.y, 0, 0, 0, d.height) < b && Xa(a.x, a.y, 0, d.height, d.width, d.height) < b && Xa(a.x, a.y, d.width, d.height, d.width, 0) < b && Xa(a.x, a.y, d.width, 0, 0, 0) < b); + return e + }; + S.prototype.Tf = function () { + return !0 + }; + S.prototype.containsPoint = S.prototype.Aa = function (a) { + var b = u.K(); + b.assign(a); + this.transform.ab(b); + var c = this.ba; + if (!c.J()) return !1; + var d = this.g; + if (null !== d && d.Xx) { + var e = d.gz("extraTouchThreshold"), f = d.gz("extraTouchArea"), h = f / 2, k = this.Ha, + d = this.Hi() * d.scale, l = 1 / d; + if (k.width * d < e && k.height * d < e) return a = qb(c.x - h * l, c.y - h * l, c.width + f * l, c.height + f * l, b.x, b.y), u.v(b), a + } + if (this instanceof lf || this instanceof X ? qb(c.x - 5, c.y - 5, c.width + 10, c.height + 10, b.x, b.y) : c.Aa(b)) { + if (this.Xh && !this.Xh.Aa(b)) return !1; + if (null !== + this.lc && c.Aa(b) || null !== this.Ib && this.Hc.Aa(a)) return !0; + u.v(b); + return this.Jj(a) + } + u.v(b); + return !1 + }; + S.prototype.Jj = function (a) { + var b = this.Ha; + return qb(0, 0, b.width, b.height, a.x, a.y) + }; + S.prototype.containsRect = S.prototype.Kj = function (a) { + if (0 === this.angle) return this.ba.Kj(a); + var b = this.Ha, b = u.Vj(0, 0, b.width, b.height), c = this.transform, d = !1, e = u.fc(a.x, a.y); + b.Aa(c.Oh(e)) && (e.m(a.x, a.bottom), b.Aa(c.Oh(e)) && (e.m(a.right, a.bottom), b.Aa(c.Oh(e)) && (e.m(a.right, a.y), b.Aa(c.Oh(e)) && (d = !0)))); + u.v(e); + u.ic(b); + return d + }; + S.prototype.containedInRect = S.prototype.sm = function (a, b) { + if (void 0 === b) return a.Kj(this.ba); + var c = this.Ha, d = !1, e = u.fc(0, 0); + a.Aa(b.ab(e)) && (e.m(0, c.height), a.Aa(b.ab(e)) && (e.m(c.width, c.height), a.Aa(b.ab(e)) && (e.m(c.width, 0), a.Aa(b.ab(e)) && (d = !0)))); + return d + }; + S.prototype.intersectsRect = S.prototype.sg = function (a, b) { + if (void 0 === b && (b = this.transform, 0 === this.angle)) return a.sg(this.ba); + var c = this.Ha, d = b, e = u.fc(0, 0), f = u.fc(0, c.height), h = u.fc(c.width, c.height), + k = u.fc(c.width, 0), l = !1; + if (a.Aa(d.ab(e)) || a.Aa(d.ab(f)) || a.Aa(d.ab(h)) || a.Aa(d.ab(k))) l = !0; else { + var c = u.Vj(0, 0, c.width, c.height), m = u.fc(a.x, a.y); + c.Aa(d.Oh(m)) ? l = !0 : (m.m(a.x, a.bottom), c.Aa(d.Oh(m)) ? l = !0 : (m.m(a.right, a.bottom), c.Aa(d.Oh(m)) ? l = !0 : (m.m(a.right, a.y), c.Aa(d.Oh(m)) && (l = !0)))); + u.v(m); + u.ic(c); + !l && (K.dw(a, e, f) || K.dw(a, f, h) || K.dw(a, h, k) || K.dw(a, k, e)) && (l = !0) + } + u.v(e); + u.v(f); + u.v(h); + u.v(k); + return l + }; + S.prototype.getDocumentPoint = S.prototype.lb = function (a, b) { + void 0 === b && (b = new w); + a.ne() && u.k("getDocumentPoint:s Spot must be real: " + a.toString()); + var c = this.Ha; + b.m(a.x * c.width + a.offsetX, a.y * c.height + a.offsetY); + this.Ff.ab(b); + return b + }; + S.prototype.getDocumentAngle = S.prototype.Zk = function () { + var a; + a = this.Ff; + 1 === a.m11 && 0 === a.m12 ? a = 0 : (a = 180 * Math.atan2(a.m12, a.m11) / Math.PI, 0 > a && (a += 360)); + return a + }; + S.prototype.getDocumentScale = S.prototype.Hi = function () { + if (0 !== (this.ea & 4096) === !1) return this.fu; + var a = this.$b; + return null !== this.S ? a * this.S.Hi() : a + }; + S.prototype.getLocalPoint = S.prototype.zD = function (a, b) { + void 0 === b && (b = new w); + b.assign(a); + this.Ff.Oh(b); + return b + }; + S.prototype.getNearestIntersectionPoint = S.prototype.bl = function (a, b, c) { + return this.Co(a.x, a.y, b.x, b.y, c) + }; + g = S.prototype; + g.Co = function (a, b, c, d, e) { + var f = this.transform, h = 1 / (f.m11 * f.m22 - f.m12 * f.m21), k = f.m22 * h, l = -f.m12 * h, m = -f.m21 * h, + n = f.m11 * h, p = h * (f.m21 * f.dy - f.m22 * f.dx), q = h * (f.m12 * f.dx - f.m11 * f.dy); + if (null !== this.nm) return f = this.ba, K.bl(f.left, f.top, f.right, f.bottom, a, b, c, d, e); + h = a * k + b * m + p; + a = a * l + b * n + q; + b = c * k + d * m + p; + c = c * l + d * n + q; + e.m(0, 0); + d = this.Ha; + c = K.bl(0, 0, d.width, d.height, h, a, b, c, e); + e.transform(f); + return c + }; + + function Ph(a, b, c, d, e) { + if (!1 !== Aj(a)) { + var f = a.margin, h = f.right + f.left, f = f.top + f.bottom; + b = Math.max(b - h, 0); + c = Math.max(c - f, 0); + e = e || 0; + d = Math.max((d || 0) - h, 0); + e = Math.max(e - f, 0); + var h = a.angle, f = 0, f = a.xa, k = 0; + a.hb && (k = a.hb); + 90 === h || 270 === h ? (b = isFinite(f.height) ? f.height + k : b, c = isFinite(f.width) ? f.width + k : c) : (b = isFinite(f.width) ? f.width + k : b, c = isFinite(f.height) ? f.height + k : c); + var f = d || 0, k = e || 0, l = a instanceof A; + switch (pl(a, !0)) { + case qh: + k = f = 0; + l && (c = b = Infinity); + break; + case cd: + isFinite(b) && b > d && (f = b); + isFinite(c) && + c > e && (k = c); + break; + case fl: + isFinite(b) && b > d && (f = b); + k = 0; + l && (c = Infinity); + break; + case el: + isFinite(c) && c > e && (k = c), f = 0, l && (b = Infinity) + } + var l = a.af, m = a.vg; + f > l.width && m.width < l.width && (f = l.width); + k > l.height && m.height < l.height && (k = l.height); + d = Math.max(f / a.scale, m.width); + e = Math.max(k / a.scale, m.height); + l.width < d && (d = Math.min(m.width, d)); + l.height < e && (e = Math.min(m.height, e)); + b = Math.min(l.width, b); + c = Math.min(l.height, c); + b = Math.max(d, b); + c = Math.max(e, c); + if (90 === h || 270 === h) f = b, b = c, c = f, f = d, d = e, e = f; + a.Pc.La(); + a.Oo(b, c, + d, e); + a.Pc.freeze(); + a.Pc.J() || u.k("Non-real measuredBounds has been set. Object " + a + ", measuredBounds: " + a.Pc.toString()); + uj(a, !1) + } + } + + g.zc = function (a, b, c, d, e) { + this.Jg(); + var f = u.Sf(); + f.assign(this.Xb); + this.Xb.La(); + if (!1 === Bj(this)) { + var h = this.Xb; + h.x = a; + h.y = b; + h.width = c; + h.height = d + } else this.xi(a, b, c, d); + this.Xb.freeze(); + this.Xh = void 0 === e ? null : e; + c = !1; + void 0 !== e ? c = !0 : null !== this.S && (e = this.S.Hc, d = this.Ba, null !== this.nm && (d = this.Xb), c = b + d.height, d = a + d.width, c = !(0 <= a + .05 && d <= e.width + .05 && 0 <= b + .05 && c <= e.height + .05), this instanceof qa && (a = this.Hc, this.Gu > a.height || this.ej.Oe > a.width)) && (c = !0); + this.ea = c ? this.ea | 256 : this.ea & -257; + this.Xb.J() || + u.k("Non-real actualBounds has been set. Object " + this + ", actualBounds: " + this.Xb.toString()); + this.sw(f, this.Xb); + u.ic(f) + }; + g.xi = function () { + }; + + function ql(a, b, c, d, e) { + var f = a.ba; + f.x = b; + f.y = c; + f.width = d; + f.height = e; + if (!a.xa.J()) { + f = a.Pc; + c = a.margin; + b = c.right + c.left; + var h = c.top + c.bottom; + c = f.width + b; + f = f.height + h; + d += b; + e += h; + b = pl(a, !0); + c === d && f === e && (b = qh); + switch (b) { + case qh: + if (c > d || f > e) uj(a, !0), Ph(a, c > d ? d : c, f > e ? e : f); + break; + case cd: + uj(a, !0); + Ph(a, d, e, 0, 0); + break; + case fl: + uj(a, !0); + Ph(a, d, f, 0, 0); + break; + case el: + uj(a, !0), Ph(a, c, e, 0, 0) + } + } + } + + g.sw = function () { + rl(this, !1); + var a = this.T; + null !== a && null !== a.g && (a.dl(), this.Qu(a), this.ma(), a = this.T, null !== a && (a.nt !== this && a.sE !== this && a.vE !== this || sl(a, !0))) + }; + g.Qu = function (a) { + null !== this.Jd && sl(a, !0) + }; + g.We = function (a, b) { + if (this.visible) { + var c = this.opacity, d = 1; + if (1 !== c) { + if (0 === c) return; + d = a.globalAlpha; + a.globalAlpha = d * c + } + if (a instanceof Nc) a:{ + if (this.visible) { + var e = null, f = a.kw; + if (this instanceof A && (this.type === tl || this.type === ul)) vl(this, a, b); else { + var h = this.Xb; + if (0 !== h.width && 0 !== h.height && !isNaN(h.x) && !isNaN(h.y)) { + var k = this.transform, l = this.S; + 0 !== (this.ea & 4096) === !0 && wl(this); + var m = 0 !== (this.ea & 256), n = !1; + this instanceof qa && xl(this, a); + if (m) { + n = l.Tf() ? l.Ha : l.ba; + if (this.Xh) var p = this.Xh, q = p.x, r = + p.y, s = p.width, + p = p.height; else q = Math.max(h.x, n.x), r = Math.max(h.y, n.y), s = Math.min(h.right, n.right) - q, p = Math.min(h.bottom, n.bottom) - r; + if (q > h.width + h.x || h.x > n.width + n.x || r > h.height + h.y || h.y > n.height + n.y) break a; + n = !0; + Uc(a, 1, 0, 0, 1, 0, 0); + a.save(); + a.beginPath(); + a.rect(q, r, s, p); + a.clip() + } + q = !1; + if (this instanceof G && (q = !0, !this.Ea())) break a; + r = !1; + s = b.Qg; + this.T && s.drawShadows && (r = this.T.il); + a.Ei.$e = [1, 0, 0, 1, 0, 0]; + null !== this.lc && (yl(this, a, this.lc, !0, !0), this.lc instanceof ga && this.lc.type === ve ? (a.beginPath(), + a.rect(h.x, h.y, h.width, h.height), zl(a, this.lc)) : a.fillRect(h.x, h.y, h.width, h.height)); + q && this.il && s.drawShadows && (Uc(a, 1, 0, 0, 1, 0, 0), h = this.em, a.shadowOffsetX = h.x, a.shadowOffsetY = h.y, a.shadowColor = this.dm, a.shadowBlur = this.cm / b.scale, a.$a()); + this instanceof A ? Uc(a, k.m11, k.m12, k.m21, k.m22, k.dx, k.dy) : a.Ei.$e = [k.m11, k.m12, k.m21, k.m22, k.dx, k.dy]; + if (null !== this.Ib) { + var p = this.Ha, h = k = 0, s = p.width, p = p.height, t = 0; + this instanceof X && (p = this.Pa.kb, k = p.x, h = p.y, s = p.width, p = p.height, t = this.Sg); + yl(this, a, this.Ib, + !0, !1); + this.Ib instanceof ga && this.Ib.type === ve ? (a.beginPath(), a.rect(k - t / 2, h - t / 2, s + t, p + t), zl(a, this.Ib)) : a.fillRect(k - t / 2, h - t / 2, s + t, p + t) + } + s = h = k = 0; + r && (null !== this.Ib || null !== this.lc || null !== l && 0 !== (l.ea & 512) || null !== l && l.type === Yi && l.If() !== this) ? (Al(this, !0), k = a.shadowOffsetX, h = a.shadowOffsetY, s = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0) : Al(this, !1); + this.Mj(a, b); + r && 0 !== (this.ea & 512) === !0 && (a.shadowOffsetX = k, a.shadowOffsetY = h, a.shadowBlur = s); + q && r && (a.shadowOffsetX = 0, a.shadowOffsetY = + 0, a.shadowBlur = 0); + m && (a.restore(), n && a.rf.pop(), $i(b, a)); + this instanceof A && (e = a.rf.pop()); + q && r && a.rf.pop(); + null !== a.nD && (null === e && (f === a.kw ? (Uc(a, 1, 0, 0, 1, 0, 0), e = a.rf.pop()) : e = a.kw), a.nD(this, e)) + } + } + } + } else { + if (this instanceof A && (this.type === tl || this.type === ul)) { + vl(this, a, b); + 1 !== c && (a.globalAlpha = d); + return + } + q = this.Xb; + if (0 !== q.width && 0 !== q.height && !isNaN(q.x) && !isNaN(q.y)) { + e = this.transform; + f = this.S; + 0 !== (this.ea & 4096) === !0 && wl(this); + l = 0 !== (this.ea & 256); + this instanceof qa && xl(this, a); + if (l) { + m = f.Tf() ? f.Ha : + f.ba; + this.Xh ? (h = this.Xh, n = h.x, r = h.y, k = h.width, h = h.height) : (n = Math.max(q.x, m.x), r = Math.max(q.y, m.y), k = Math.min(q.right, m.right) - n, h = Math.min(q.bottom, m.bottom) - r); + if (n > q.width + q.x || q.x > m.width + m.x || r > q.height + q.y || q.y > m.height + m.y) { + 1 !== c && (a.globalAlpha = d); + return + } + a.save(); + a.beginPath(); + a.rect(n, r, k, h); + a.clip() + } + r = b.Qg; + m = !1; + if (this instanceof G) { + m = !0; + if (!this.Ea()) { + 1 !== c && (a.globalAlpha = d); + return + } + this.il && r.drawShadows && (n = this.em, a.shadowOffsetX = n.x * b.scale * b.nf, a.shadowOffsetY = n.y * b.scale * b.nf, a.shadowColor = + this.dm, a.shadowBlur = this.cm) + } + n = !1; + this.T && r.drawShadows && (n = this.T.il); + null !== this.lc && (yl(this, a, this.lc, !0, !0), this.lc instanceof ga && this.lc.type === ve ? (a.beginPath(), a.rect(q.x, q.y, q.width, q.height), zl(a, this.lc)) : a.fillRect(q.x, q.y, q.width, q.height)); + e.Os() || a.transform(e.m11, e.m12, e.m21, e.m22, e.dx, e.dy); + null !== this.Ib && (h = this.Ha, r = q = 0, k = h.width, h = h.height, s = 0, this instanceof X && (h = this.Pa.kb, q = h.x, r = h.y, k = h.width, h = h.height, s = this.Sg), yl(this, a, this.Ib, !0, !1), this.Ib instanceof ga && this.Ib.type === + ve ? (a.beginPath(), a.rect(q - s / 2, r - s / 2, k + s, h + s), zl(a, this.Ib)) : a.fillRect(q - s / 2, r - s / 2, k + s, h + s)); + k = r = q = 0; + n && (null !== this.Ib || null !== this.lc || null !== f && 0 !== (f.ea & 512) || null !== f && (f.type === Yi || f.type === oh) && f.If() !== this) ? (Al(this, !0), q = a.shadowOffsetX, r = a.shadowOffsetY, k = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0) : Al(this, !1); + this.Mj(a, b); + n && 0 !== (this.ea & 512) === !0 && (a.shadowOffsetX = q, a.shadowOffsetY = r, a.shadowBlur = k); + m && n && (a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0); + l ? (a.restore(), + this instanceof A ? $i(b, a, !0) : $i(b, a, !1)) : e.Os() || (f = 1 / (e.m11 * e.m22 - e.m12 * e.m21), a.transform(e.m22 * f, -e.m12 * f, -e.m21 * f, e.m11 * f, f * (e.m21 * e.dy - e.m22 * e.dx), f * (e.m12 * e.dx - e.m11 * e.dy))) + } + } + 1 !== c && (a.globalAlpha = d) + } + }; + + function vl(a, b, c) { + var d = a.Xb; + 0 === d.width || 0 === d.height || isNaN(d.x) || isNaN(d.y) || (null !== a.lc && (yl(a, b, a.lc, !0, !0), a.lc instanceof ga && a.lc.type === ve ? (b.beginPath(), b.rect(d.x, d.y, d.width, d.height), zl(b, a.lc)) : b.fillRect(d.x, d.y, d.width, d.height)), null !== a.Ib && (yl(a, b, a.Ib, !0, !1), a.Ib instanceof ga && a.Ib.type === ve ? (b.beginPath(), b.rect(d.x, d.y, d.width, d.height), zl(b, a.Ib)) : b.fillRect(d.x, d.y, d.width, d.height)), a.Mj(b, c)) + } + + g.Mj = function () { + }; + + function zl(a, b) { + if (b instanceof ga && b.type === ve && !(a instanceof Nc)) { + var c = b.lx, d = b.kx; + d > c ? (a.scale(c / d, 1), a.translate((d - c) / 2, 0)) : c > d && (a.scale(1, d / c), a.translate(0, (c - d) / 2)); + a.Ft ? a.clip() : a.fill(); + d > c ? (a.translate(-(d - c) / 2, 0), a.scale(1 / (c / d), 1)) : c > d && (a.translate(0, -(c - d) / 2), a.scale(1, 1 / (d / c))) + } else a.Ft ? a.clip() : a.fill() + } + + function Bl(a) { + a.Ft || a.stroke() + } + + function yl(a, b, c, d, e) { + if (null !== c) { + var f = 1, h = 1; + if ("string" === typeof c) d ? b.Sm !== c && (b.fillStyle = c, b.Sm = c) : b.Tm !== c && (b.strokeStyle = c, b.Tm = c); else if (c.type === te) c = c.color, d ? b.Sm !== c && (b.fillStyle = c, b.Sm = c) : b.Tm !== c && (b.strokeStyle = c, b.Tm = c); else { + var k, h = a.Ha, f = h.width, h = h.height; + if (e) var l = a.ba, f = l.width, h = l.height; + var m = b instanceof CanvasRenderingContext2D; + if (m && (c.Fg && c.type === bl || c.lx === f && c.kx === h)) k = c.Fg; else { + var n = l = 0, p = 0, q = 0, r = 0, s = 0, s = r = 0; + e && (l = a.ba, f = l.width, h = l.height, r = l.x, s = l.y); + l = c.start.x * + f + c.start.offsetX; + n = c.start.y * h + c.start.offsetY; + p = c.end.x * f + c.end.offsetX; + q = c.end.y * h + c.end.offsetY; + l += r; + p += r; + n += s; + q += s; + c.type === ue ? k = b.createLinearGradient(l, n, p, q) : c.type === ve ? (s = isNaN(c.us) ? Math.max(f, h) / 2 : c.us, isNaN(c.ut) ? (r = 0, s = Math.max(f, h) / 2) : r = c.ut, k = b.createRadialGradient(l, n, r, p, q, s)) : c.type === bl ? k = b.createPattern(c.pattern, "repeat") : u.Kd(c.type, "Brush type"); + if (c.type !== bl && (a = c.os, null !== a)) for (a = a.i; a.next();) k.addColorStop(a.key, a.value); + m && (c.Fg = k, c.lx = f, c.kx = h) + } + d ? b.Sm !== k && (b.fillStyle = + k, b.Sm = k) : b.Tm !== k && (b.strokeStyle = k, b.Tm = k) + } + } + } + + S.prototype.isContainedBy = S.prototype.gl = function (a) { + if (a instanceof A) a:{ + if (this !== a && null !== a) for (var b = this.S; null !== b;) { + if (b === a) { + a = !0; + break a + } + b = b.S + } + a = !1 + } else a = !1; + return a + }; + S.prototype.isVisibleObject = S.prototype.kl = function () { + if (!this.visible) return !1; + var a = this.S; + return null !== a ? a.kl() : !0 + }; + + function wl(a) { + if (0 !== (a.ea & 2048) === !0) { + var b = a.Sd; + b.reset(); + if (!a.Xb.J() || !a.Pc.J()) { + Cl(a, !1); + return + } + b.translate(a.Xb.x, a.Xb.y); + b.translate(-a.Ba.x, -a.Ba.y); + var c = a.Ha; + nl(a, b, c.x, c.y, c.width, c.height); + Cl(a, !1); + Dl(a, !0) + } + 0 !== (a.ea & 4096) === !0 && (b = a.S, null === b ? (a.Xm.set(a.Sd), a.fu = a.scale, Dl(a, !1)) : null !== b.Ff && (c = a.Xm, c.reset(), b.Tf() ? c.multiply(b.Xm) : null !== b.S && c.multiply(b.S.Xm), c.multiply(a.Sd), a.fu = a.scale * b.fu, Dl(a, !1))) + } + + function nl(a, b, c, d, e, f) { + 1 !== a.scale && b.scale(a.scale); + if (0 !== a.angle) { + var h = Ib; + a.Ze && a.Ze.pd() && (h = a.Ze); + var k = u.K(); + if (a instanceof G && a.ec !== a) for (c = a.ec, d = c.Ha, k.rt(d.x, d.y, d.width, d.height, h), c.yk.ab(k), k.offset(-c.Ba.x, -c.Ba.y), h = c.S; null !== h && h !== a;) h.yk.ab(k), k.offset(-h.Ba.x, -h.Ba.y), h = h.S; else k.rt(c, d, e, f, h); + b.rotate(a.angle, k.x, k.y); + u.v(k) + } + } + + g = S.prototype; + g.R = function (a) { + void 0 === a && (a = !1); + if (!0 !== Aj(this)) { + uj(this, !0); + rl(this, !0); + var b = this.S; + null !== b ? a || b.R() : (a = this.g, null !== a && (a.Xf.add(this), this instanceof U && (a.ha.gb || this.sf(), null !== this.ce && El(this.ce)), a.de(!0))); + if (this instanceof A) { + if (this.oa === Yi || this.oa === ah) a = this.If(), null !== a && a.R(!0); + a = this.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + !0 !== Aj(d) && (d.xa.J() || (d instanceof ph || d instanceof A || d instanceof qa || pl(d, !1) !== qh) && d.R(!0)) + } + } + } + }; + g.Fo = function () { + !1 === Aj(this) && (uj(this, !0), rl(this, !0)) + }; + + function El(a) { + if (!1 === Bj(a)) { + if (null !== a.S) a.S.R(); else { + var b = a.g; + null !== b && (b.Xf.add(a), a instanceof U && a.sf(), b.de()) + } + rl(a, !0) + } + } + + g.Jg = function () { + 0 !== (this.ea & 2048) === !1 && (Cl(this, !0), Dl(this, !0)) + }; + g.mz = function () { + Dl(this, !0) + }; + g.ma = function () { + var a = this.T; + null !== a && a.ma() + }; + + function pl(a, b) { + var c = a.stretch, d = a.S; + if (null !== d && d.oa === Fl) return Gl(a, d.fd(a.rc), d.ed(a.column), b); + if (null !== d && d.oa === Yi && d.If() === a) return Hl(a, cd, b); + if (c === dl) { + if (null !== d) { + if (d.oa === oh && d.If() === a) return Hl(a, cd, b); + c = d.Bd; + return c === dl ? Hl(a, qh, b) : Hl(a, c, b) + } + return Hl(a, qh, b) + } + return Hl(a, c, b) + } + + function Gl(a, b, c, d) { + var e = a.stretch; + if (e !== dl) return Hl(a, e, d); + var f = e = null; + switch (b.stretch) { + case el: + f = !0; + break; + case cd: + f = !0 + } + switch (c.stretch) { + case fl: + e = !0; + break; + case cd: + e = !0 + } + b = a.S.Bd; + null === e && (e = b === fl || b === cd); + null === f && (f = b === el || b === cd); + return !0 === e && !0 === f ? Hl(a, cd, d) : !0 === e ? Hl(a, fl, d) : !0 === f ? Hl(a, el, d) : Hl(a, qh, d) + } + + function Hl(a, b, c) { + if (c) return b; + if (b === qh) return qh; + c = a.xa; + if (c.J()) return qh; + a = a.angle; + if (!isNaN(c.width)) if (90 !== a && 270 !== a) { + if (b === fl) return qh; + if (b === cd) return el + } else { + if (b === el) return qh; + if (b === cd) return fl + } + if (!isNaN(c.height)) if (90 !== a && 270 !== a) { + if (b === el) return qh; + if (b === cd) return fl + } else { + if (b === fl) return qh; + if (b === cd) return el + } + return b + } + + u.defineProperty(S, {Cw: "segmentOrientation"}, function () { + return this.Cr + }, function (a) { + var b = this.Cr; + b !== a && (this.Cr = a, this.R(), this.h("segmentOrientation", b, a)) + }); + u.defineProperty(S, {Pf: "segmentIndex"}, function () { + return this.Ar + }, function (a) { + a = Math.round(a); + var b = this.Ar; + b !== a && (this.Ar = a, this.R(), this.h("segmentIndex", b, a)) + }); + u.defineProperty(S, {Bw: "segmentFraction"}, function () { + return this.zr + }, function (a) { + isNaN(a) ? a = 0 : 0 > a ? a = 0 : 1 < a && (a = 1); + var b = this.zr; + b !== a && (this.zr = a, this.R(), this.h("segmentFraction", b, a)) + }); + u.defineProperty(S, {BE: "segmentOffset"}, function () { + return this.Br + }, function (a) { + var b = this.Br; + b.L(a) || (this.Br = a = a.Z(), this.R(), this.h("segmentOffset", b, a)) + }); + u.defineProperty(S, {stretch: "stretch"}, function () { + return this.Hh + }, function (a) { + var b = this.Hh; + b !== a && (this.Hh = a, this.R(), this.h("stretch", b, a)) + }); + u.defineProperty(S, {name: "name"}, function () { + return this.Ub + }, function (a) { + var b = this.Ub; + b !== a && (this.Ub = a, null !== this.T && (this.T.Bk = null), this.h("name", b, a)) + }); + u.defineProperty(S, {opacity: "opacity"}, function () { + return this.Ic + }, function (a) { + var b = this.Ic; + b !== a && (u.j(a, "number", S, "opacity"), (0 > a || 1 < a) && u.wa(a, "0 <= value <= 1", S, "opacity"), this.Ic = a, this.h("opacity", b, a), a = this.g, b = this.T, null !== a && null !== b && a.ma(yi(b, b.ba))) + }); + u.defineProperty(S, {visible: "visible"}, function () { + return 0 !== (this.ea & 1) + }, function (a) { + var b = 0 !== (this.ea & 1); + b !== a && (this.ea ^= 1, this.h("visible", b, a), b = this.S, null !== b ? b.R() : this instanceof G && (this.dl(), this.He(a)), this.ma(), Il(this)) + }); + u.defineProperty(S, {Ag: "pickable"}, function () { + return 0 !== (this.ea & 2) + }, function (a) { + var b = 0 !== (this.ea & 2); + b !== a && (this.ea ^= 2, this.h("pickable", b, a)) + }); + u.defineProperty(S, {BG: "fromLinkableDuplicates"}, function () { + return 0 !== (this.ea & 4) + }, function (a) { + var b = 0 !== (this.ea & 4); + b !== a && (this.ea ^= 4, this.h("fromLinkableDuplicates", b, a)) + }); + u.defineProperty(S, {CG: "fromLinkableSelfNode"}, function () { + return 0 !== (this.ea & 8) + }, function (a) { + var b = 0 !== (this.ea & 8); + b !== a && (this.ea ^= 8, this.h("fromLinkableSelfNode", b, a)) + }); + u.defineProperty(S, {wI: "toLinkableDuplicates"}, function () { + return 0 !== (this.ea & 16) + }, function (a) { + var b = 0 !== (this.ea & 16); + b !== a && (this.ea ^= 16, this.h("toLinkableDuplicates", b, a)) + }); + u.defineProperty(S, {xI: "toLinkableSelfNode"}, function () { + return 0 !== (this.ea & 32) + }, function (a) { + var b = 0 !== (this.ea & 32); + b !== a && (this.ea ^= 32, this.h("toLinkableSelfNode", b, a)) + }); + u.defineProperty(S, {tg: "isPanelMain"}, function () { + return 0 !== (this.ea & 64) + }, function (a) { + var b = 0 !== (this.ea & 64); + b !== a && (this.ea ^= 64, this.R(), this.h("isPanelMain", b, a)) + }); + u.defineProperty(S, {pz: "isActionable"}, function () { + return 0 !== (this.ea & 128) + }, function (a) { + var b = 0 !== (this.ea & 128); + b !== a && (this.ea ^= 128, this.h("isActionable", b, a)) + }); + u.defineProperty(S, {nm: "areaBackground"}, function () { + return this.lc + }, function (a) { + var b = this.lc; + b !== a && (a instanceof ga && a.freeze(), this.lc = a, this.ma(), this.h("areaBackground", b, a)) + }); + u.defineProperty(S, {background: "background"}, function () { + return this.Ib + }, function (a) { + var b = this.Ib; + b !== a && (a instanceof ga && a.freeze(), this.Ib = a, this.ma(), this.h("background", b, a)) + }); + + function Al(a, b) { + a.ea = b ? a.ea | 512 : a.ea & -513 + } + + function Jl(a, b) { + a.ea = b ? a.ea | 1024 : a.ea & -1025 + } + + function Cl(a, b) { + a.ea = b ? a.ea | 2048 : a.ea & -2049 + } + + function Dl(a, b) { + a.ea = b ? a.ea | 4096 : a.ea & -4097 + } + + function Aj(a) { + return 0 !== (a.ea & 8192) + } + + function uj(a, b) { + a.ea = b ? a.ea | 8192 : a.ea & -8193 + } + + function Bj(a) { + return 0 !== (a.ea & 16384) + } + + function rl(a, b) { + a.ea = b ? a.ea | 16384 : a.ea & -16385 + } + + u.u(S, {T: "part"}, function () { + if (this instanceof G) return this; + if (this.Wl) return this.Wl; + var a; + for (a = this.S; a;) { + if (a instanceof G) return this.Wl = a; + a = a.S + } + return null + }); + u.u(S, {S: "panel"}, function () { + return this.Pg + }); + S.prototype.ql = function (a) { + this.Pg = a + }; + u.u(S, {layer: "layer"}, function () { + var a = this.T; + return null !== a ? a.layer : null + }); + u.u(S, {g: "diagram"}, function () { + var a = this.T; + return null !== a ? a.g : null + }, {configurable: !0}); + u.defineProperty(S, {position: "position"}, function () { + return this.Ma + }, function (a) { + var b = this.Ma; + b.L(a) || (a = a.Z(), this.dA(a, b) && this.h("position", b, a)) + }); + S.prototype.dA = function (a) { + this.Ma = a; + El(this); + this.Jg(); + return !0 + }; + S.prototype.GE = function (a, b) { + this.Ma.m(a, b); + Kl(this, !0); + this.Jg() + }; + u.u(S, {ba: "actualBounds"}, function () { + return this.Xb + }); + u.defineProperty(S, {scale: "scale"}, function () { + return this.$b + }, function (a) { + var b = this.$b; + b !== a && (0 >= a && u.k("GraphObject.scale must be greater than zero"), this.$b = a, this.Jg(), this.R(), this.h("scale", b, a)) + }); + u.defineProperty(S, {angle: "angle"}, function () { + return this.Ym + }, function (a) { + var b = this.Ym; + b !== a && (a %= 360, 0 > a && (a += 360), b !== a && (this.Ym = a, this.R(), this.Jg(), this.h("angle", b, a))) + }); + u.defineProperty(S, {xa: "desiredSize"}, function () { + return this.jf + }, function (a) { + var b = this.jf; + b.L(a) || (this.jf = a = a.Z(), this.R(), this instanceof X && this.le(), this.h("desiredSize", b, a), a = this.T, null !== a && 0 !== (this.ea & 1024) && (ll(this, a, "width"), ll(this, a, "height"))) + }); + u.defineProperty(S, {width: "width"}, function () { + return this.jf.width + }, function (a) { + if (this.jf.width !== a) { + var b = this.jf; + this.jf = a = (new ia(a, this.jf.height)).freeze(); + this.R(); + this instanceof X && this.le(); + this.h("desiredSize", b, a); + b = this.T; + null !== b && 0 !== (this.ea & 1024) && ll(this, b, "width") + } + }); + u.defineProperty(S, {height: "height"}, function () { + return this.jf.height + }, function (a) { + if (this.jf.height !== a) { + var b = this.jf; + this.jf = a = (new ia(this.jf.width, a)).freeze(); + this.R(); + this instanceof X && this.le(); + this.h("desiredSize", b, a); + b = this.T; + null !== b && 0 !== (this.ea & 1024) && ll(this, b, "height") + } + }); + u.defineProperty(S, {vg: "minSize"}, function () { + return this.nj + }, function (a) { + var b = this.nj; + b.L(a) || (a = a.copy(), isNaN(a.width) && (a.width = 0), isNaN(a.height) && (a.height = 0), a.freeze(), this.nj = a, this.R(), this.h("minSize", b, a)) + }); + u.defineProperty(S, {af: "maxSize"}, function () { + return this.lj + }, function (a) { + var b = this.lj; + b.L(a) || (a = a.copy(), isNaN(a.width) && (a.width = Infinity), isNaN(a.height) && (a.height = Infinity), a.freeze(), this.lj = a, this.R(), this.h("maxSize", b, a)) + }); + u.u(S, {Ba: "measuredBounds"}, function () { + return this.Pc + }); + u.u(S, {Ha: "naturalBounds"}, function () { + return this.Hc + }, {configurable: !0}); + u.defineProperty(S, {margin: "margin"}, function () { + return this.Gq + }, function (a) { + "number" === typeof a && (a = new rb(a)); + var b = this.Gq; + b.L(a) || (this.Gq = a = a.Z(), this.R(), this.h("margin", b, a)) + }); + u.u(S, {transform: null}, function () { + 0 !== (this.ea & 2048) === !0 && wl(this); + return this.Sd + }); + u.u(S, {Ff: null}, function () { + 0 !== (this.ea & 4096) === !0 && wl(this); + return this.Xm + }); + u.defineProperty(S, {alignment: "alignment"}, function () { + return this.se + }, function (a) { + var b = this.se; + b.L(a) || (a.ne() && !a.Lc() && u.k("alignment must be a real Spot or Spot.Default"), this.se = a = a.Z(), El(this), this.h("alignment", b, a)) + }); + u.defineProperty(S, {column: "column"}, function () { + return this.Cp + }, function (a) { + a = Math.round(a); + var b = this.Cp; + b !== a && (0 > a && u.wa(a, ">= 0", S, "column"), this.Cp = a, this.R(), this.h("column", b, a)) + }); + u.defineProperty(S, {$F: "columnSpan"}, function () { + return this.Wi + }, function (a) { + a = Math.round(a); + var b = this.Wi; + b !== a && (1 > a && u.wa(a, ">= 1", S, "columnSpan"), this.Wi = a, this.R(), this.h("columnSpan", b, a)) + }); + u.defineProperty(S, {rc: "row"}, function () { + return this.wr + }, function (a) { + a = Math.round(a); + var b = this.wr; + b !== a && (0 > a && u.wa(a, ">= 0", S, "row"), this.wr = a, this.R(), this.h("row", b, a)) + }); + u.defineProperty(S, {rowSpan: "rowSpan"}, function () { + return this.tj + }, function (a) { + a = Math.round(a); + var b = this.tj; + b !== a && (1 > a && u.wa(a, ">= 1", S, "rowSpan"), this.tj = a, this.R(), this.h("rowSpan", b, a)) + }); + u.defineProperty(S, {Hj: "alignmentFocus"}, function () { + return this.vp + }, function (a) { + var b = this.vp; + b.L(a) || (a.ne() && !a.Lc() && u.k("alignmentFocus must be a real Spot or Spot.Default"), this.vp = a = a.Z(), this.R(), this.h("alignmentFocus", b, a)) + }); + u.defineProperty(S, {Jd: "portId"}, function () { + return this.ir + }, function (a) { + var b = this.ir; + if (b !== a) { + var c = this.T; + null === c || c instanceof U || (u.k("portID being set on a Link: " + a), c = null); + null !== b && null !== c && Ll(c, this); + this.ir = a; + if (null !== a && c) { + c.xh = !0; + null === c.Qd && Ml(c); + var d = this.Jd; + null !== d && c.Qd.add(d, this) + } + this.h("portId", b, a) + } + }); + + function Nl(a) { + var b = {value: null}; + Ol(a, b); + return b.value + } + + function Ol(a, b) { + var c = a.S; + return null === c || !Ol(c, b) && a.visible ? (b.value = a, !1) : !0 + } + + function Il(a) { + var b = a.T; + b instanceof U && (a = a.g, null === a || a.ha.gb || b.sf()) + } + + u.defineProperty(S, {xb: "toSpot"}, function () { + return null !== this.Q ? this.Q.Ej : vb + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Ej; + b.L(a) || (a = a.Z(), this.Q.Ej = a, this.h("toSpot", b, a), Il(this)) + }); + u.defineProperty(S, {vl: "toEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.Cj : 10 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Cj; + b !== a && (0 > a && u.wa(a, ">= 0", S, "toEndSegmentLength"), this.Q.Cj = a, this.h("toEndSegmentLength", b, a), Il(this)) + }); + u.defineProperty(S, {wt: "toEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.Bj : jl + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Bj; + b !== a && (this.Q.Bj = a, this.h("toEndSegmentDirection", b, a), Il(this)) + }); + u.defineProperty(S, {yt: "toShortLength"}, function () { + return null !== this.Q ? this.Q.Dj : 0 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Dj; + b !== a && (this.Q.Dj = a, this.h("toShortLength", b, a), Il(this)) + }); + u.defineProperty(S, {OE: "toLinkable"}, function () { + return this.Sr + }, function (a) { + var b = this.Sr; + b !== a && (this.Sr = a, this.h("toLinkable", b, a)) + }); + u.defineProperty(S, {yI: "toMaxLinks"}, function () { + return this.Tr + }, function (a) { + var b = this.Tr; + b !== a && (0 > a && u.wa(a, ">= 0", S, "toMaxLinks"), this.Tr = a, this.h("toMaxLinks", b, a)) + }); + u.defineProperty(S, {vb: "fromSpot"}, function () { + return null !== this.Q ? this.Q.cj : vb + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.cj; + b.L(a) || (a = a.Z(), this.Q.cj = a, this.h("fromSpot", b, a), Il(this)) + }); + u.defineProperty(S, {Yk: "fromEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.aj : 10 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.aj; + b !== a && (0 > a && u.wa(a, ">= 0", S, "fromEndSegmentLength"), this.Q.aj = a, this.h("fromEndSegmentLength", b, a), Il(this)) + }); + u.defineProperty(S, {Es: "fromEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.$i : jl + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.$i; + b !== a && (this.Q.$i = a, this.h("fromEndSegmentDirection", b, a), Il(this)) + }); + u.defineProperty(S, {Fs: "fromShortLength"}, function () { + return null !== this.Q ? this.Q.bj : 0 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.bj; + b !== a && (this.Q.bj = a, this.h("fromShortLength", b, a), Il(this)) + }); + u.defineProperty(S, {vD: "fromLinkable"}, function () { + return this.Wp + }, function (a) { + var b = this.Wp; + b !== a && (this.Wp = a, this.h("fromLinkable", b, a)) + }); + u.defineProperty(S, {DG: "fromMaxLinks"}, function () { + return this.Xp + }, function (a) { + var b = this.Xp; + b !== a && (0 > a && u.wa(a, ">= 0", S, "fromMaxLinks"), this.Xp = a, this.h("fromMaxLinks", b, a)) + }); + u.defineProperty(S, {cursor: "cursor"}, function () { + return this.Jp + }, function (a) { + var b = this.Jp; + b !== a && (u.j(a, "string", S, "cursor"), this.Jp = a, this.h("cursor", b, a)) + }); + u.defineProperty(S, {click: "click"}, function () { + return null !== this.P ? this.P.Wh : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Wh; + b !== a && (null !== a && u.j(a, "function", S, "click"), this.P.Wh = a, this.h("click", b, a)) + }); + u.defineProperty(S, {ts: "doubleClick"}, function () { + return null !== this.P ? this.P.ci : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ci; + b !== a && (null !== a && u.j(a, "function", S, "doubleClick"), this.P.ci = a, this.h("doubleClick", b, a)) + }); + u.defineProperty(S, {Uy: "contextClick"}, function () { + return null !== this.P ? this.P.Yh : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Yh; + b !== a && (null !== a && u.j(a, "function", S, "contextClick"), this.P.Yh = a, this.h("contextClick", b, a)) + }); + u.defineProperty(S, {ZD: "mouseEnter"}, function () { + return null !== this.P ? this.P.Rq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Rq; + b !== a && (null !== a && u.j(a, "function", S, "mouseEnter"), this.P.Rq = a, this.h("mouseEnter", b, a)) + }); + u.defineProperty(S, {$D: "mouseLeave"}, function () { + return null !== this.P ? this.P.Sq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Sq; + b !== a && (null !== a && u.j(a, "function", S, "mouseLeave"), this.P.Sq = a, this.h("mouseLeave", b, a)) + }); + u.defineProperty(S, {Fz: "mouseOver"}, function () { + return null !== this.P ? this.P.mi : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.mi; + b !== a && (null !== a && u.j(a, "function", S, "mouseOver"), this.P.mi = a, this.h("mouseOver", b, a)) + }); + u.defineProperty(S, {Ez: "mouseHover"}, function () { + return null !== this.P ? this.P.li : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.li; + b !== a && (null !== a && u.j(a, "function", S, "mouseHover"), this.P.li = a, this.h("mouseHover", b, a)) + }); + u.defineProperty(S, {Dz: "mouseHold"}, function () { + return null !== this.P ? this.P.ki : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ki; + b !== a && (null !== a && u.j(a, "function", S, "mouseHold"), this.P.ki = a, this.h("mouseHold", b, a)) + }); + u.defineProperty(S, {CH: "mouseDragEnter"}, function () { + return null !== this.P ? this.P.Pq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Pq; + b !== a && (null !== a && u.j(a, "function", S, "mouseDragEnter"), this.P.Pq = a, this.h("mouseDragEnter", b, a)) + }); + u.defineProperty(S, {DH: "mouseDragLeave"}, function () { + return null !== this.P ? this.P.Qq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Qq; + b !== a && (null !== a && u.j(a, "function", S, "mouseDragLeave"), this.P.Qq = a, this.h("mouseDragLeave", b, a)) + }); + u.defineProperty(S, {Cz: "mouseDrop"}, function () { + return null !== this.P ? this.P.ji : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ji; + b !== a && (null !== a && u.j(a, "function", S, "mouseDrop"), this.P.ji = a, this.h("mouseDrop", b, a)) + }); + u.defineProperty(S, {HC: "actionDown"}, function () { + return null !== this.P ? this.P.qp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.qp; + b !== a && (null !== a && u.j(a, "function", S, "actionDown"), this.P.qp = a, this.h("actionDown", b, a)) + }); + u.defineProperty(S, {IC: "actionMove"}, function () { + return null !== this.P ? this.P.rp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.rp; + b !== a && (null !== a && u.j(a, "function", S, "actionMove"), this.P.rp = a, this.h("actionMove", b, a)) + }); + u.defineProperty(S, {JC: "actionUp"}, function () { + return null !== this.P ? this.P.sp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.sp; + b !== a && (null !== a && u.j(a, "function", S, "actionUp"), this.P.sp = a, this.h("actionUp", b, a)) + }); + u.defineProperty(S, {GC: "actionCancel"}, function () { + return null !== this.P ? this.P.pp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.pp; + b !== a && (null !== a && u.j(a, "function", S, "actionCancel"), this.P.pp = a, this.h("actionCancel", b, a)) + }); + u.defineProperty(S, {lA: "toolTip"}, function () { + return null !== this.P ? this.P.ti : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ti; + b !== a && (null !== a && u.C(a, lf, S, "toolTip"), this.P.ti = a, this.h("toolTip", b, a)) + }); + u.defineProperty(S, {contextMenu: "contextMenu"}, function () { + return null !== this.P ? this.P.Zh : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Zh; + b !== a && (null !== a && u.C(a, lf, S, "contextMenu"), this.P.Zh = a, this.h("contextMenu", b, a)) + }); + S.prototype.bind = S.prototype.bind = function (a) { + a.fg = this; + var b = this.zo(); + null !== b && Pl(b) && u.k("Cannot add a Binding to a template that has already been copied: " + a); + null === this.Gc && (this.Gc = new E(bf)); + this.Gc.add(a) + }; + S.prototype.findTemplateBinder = S.prototype.zo = function () { + for (var a = this instanceof A ? this : this.S; null !== a;) { + if (null !== a.yl) return a; + a = a.S + } + return null + }; + S.fromSvg = S.fromSVG = function (a) { + return Ql(a) + }; + S.prototype.setProperties = function (a) { + u.ot(this, a) + }; + var Rl; + S.make = Rl = function (a, b) { + var c = arguments, d = null, e = null; + if ("function" === typeof a) e = a; else if ("string" === typeof a) { + var f = Sl.ta(a); + "function" === typeof f ? (c = u.Pk(arguments), d = f(c)) : e = da[a] + } + null === d && (void 0 === e && (d = window.$, void 0 !== d && void 0 !== d.noop && u.k("GraphObject.make failed to complete. Is it conflicting with another $ var? (such as jQuery)"), u.k("GraphObject.make failed to complete, it may be conflicting with another var.")), null !== e && e.constructor || u.k("GraphObject.make requires a class function or class name, not: " + + a), d = new e); + f = 1; + if (d instanceof D && 1 < c.length) { + var h = d, e = c[1]; + if ("string" === typeof e || e instanceof HTMLDivElement) Wi(h, e), f++ + } + for (; f < c.length; f++) e = c[f], void 0 === e ? u.k("Undefined value at argument " + f + " for object being constructed by GraphObject.make: " + d) : Tl(d, e); + return d + }; + + function Tl(a, b) { + if ("string" === typeof b) if (a instanceof qa) a.text = b; else if (a instanceof X) a.Fb = b; else if (a instanceof Ri) a.source = b; else if (a instanceof A) { + var c = Da(A, b); + null !== c ? a.type = c : u.k("Unknown Panel type as an argument to GraphObject.make: " + b) + } else a instanceof ga ? (c = Da(ga, b), null !== c ? a.type = c : u.k("Unknown Brush type as an argument to GraphObject.make: " + b)) : a instanceof $c ? (c = Da($c, b), null !== c ? a.type = c : u.k("Unknown Geometry type as an argument to GraphObject.make: " + b)) : a instanceof Jd ? + (c = Da(Jd, b), null !== c ? a.type = c : u.k("Unknown PathSegment type as an argument to GraphObject.make: " + b)) : u.k("Unable to use a string as an argument to GraphObject.make: " + b); else if (b instanceof S) c = b, a instanceof A || u.k("A GraphObject can only be added to a Panel, not to: " + a), a.add(c); else if (b instanceof Se) { + var d = b, c = a, e; + d.ae && c.fd ? e = c.fd(d.index) : !d.ae && c.ed ? e = c.ed(d.index) : u.k("A RowColumnDefinition can only be added to a Panel, not to: " + a); + e.qs(d) + } else if (b instanceof ea) a instanceof W && b.Ae === + W ? 2 === (b.value & 2) ? a.zw = b : b === kh || b === ch || b === bh ? a.Ve = b : b === Ul || b === Vl || b === Wl ? a.es = b : b !== Xl && b !== dh && u.k("Unknown Link enum value for a Link property: " + b) : a instanceof A && b.Ae === A ? a.type = b : a instanceof qa && b.Ae === qa ? a.bF = b : a instanceof X && (b === qh || b === sh || b === th || b === dl) ? a.yD = b : a instanceof Ri && (b === qh || b === sh || b === th) ? a.RG = b : a instanceof S && b.Ae === W ? (c = a, 0 === b.name.indexOf("Orient") ? c.Cw = b : u.k("Unknown Link enum value for GraphObject.segmentOrientation property: " + b)) : a instanceof S && b.Ae === S ? a.stretch = + b : a instanceof Se && b.Ae === Se ? a.st = b : a instanceof D && b.Ae === D ? a.no = b : a instanceof ga && b.Ae === ga ? a.type = b : a instanceof $c && b.Ae === $c ? a.type = b : a instanceof Jd && b.Ae === Jd ? a.type = b : a instanceof bf && b.Ae === bf ? a.mode = b : a instanceof Zd && b.Ae === Zd ? a.Ad = b : a instanceof Y && b.Ae === Y ? 0 === b.name.indexOf("Alignment") ? a.alignment = b : 0 === b.name.indexOf("Arrangement") ? a.Gf = b : 0 === b.name.indexOf("Compaction") ? a.compaction = b : 0 === b.name.indexOf("Path") ? a.path = b : 0 === b.name.indexOf("Sorting") ? a.sorting = b : 0 === b.name.indexOf("Style") ? + a.AI = b : u.k("Unknown enum value: " + b) : a instanceof Yl && b.Ae === Yl ? 0 === b.name.indexOf("Aggressive") ? a.NF = b : 0 === b.name.indexOf("Cycle") ? a.kG = b : 0 === b.name.indexOf("Init") ? a.WG = b : 0 === b.name.indexOf("Layer") ? a.mH = b : u.k("Unknown enum value: " + b) : a instanceof Xk && b.Ae === Xk ? b === Zl || b === $l || b === am || b === bm ? a.sorting = b : b === cm || b === dm ? a.Gf = b : b === em || b === fm ? a.alignment = b : u.k("Unknown enum value: " + b) : a instanceof gm && b.Ae === gm ? b === hm || b === im || b === jm || b === km || b === lm ? a.sorting = b : b === mm || b === nm || b === om || b === wm ? a.direction = + b : b === xm || b === ym || b === zm || b === Am ? a.Gf = b : b === Bm || b === Cm ? a.qw = b : u.k("Unknown enum value: " + b) : u.k("No property to set for this enum value: " + b); else if (b instanceof bf) a instanceof S ? a.bind(b) : a instanceof Se ? a.bind(b) : u.k("A Binding can only be applied to a GraphObject or RowColumnDefinition, not to: " + a); else if (b instanceof bd) a instanceof $c ? a.ub.add(b) : u.k("A PathFigure can only be added to a Geometry, not to: " + a); else if (b instanceof Jd) a instanceof bd ? a.Fa.add(b) : u.k("A PathSegment can only be added to a PathFigure, not to: " + + a); else if (b instanceof Je) a instanceof D ? a.Qb = b : a instanceof V ? a.Qb = b : u.k("A Layout can only be assigned to a Diagram or a Group, not to: " + a); else if (Array.isArray(b)) for (c = 0; c < b.length; c++) Tl(a, b[c]); else if ("object" === typeof b && null !== b) if (a instanceof ga) { + e = new pa; + for (c in b) d = parseFloat(c), isNaN(d) ? e[c] = b[c] : a.addColorStop(d, b[c]); + u.ot(a, e) + } else if (a instanceof Se) { + void 0 !== b.row ? (e = b.row, (void 0 === e || null === e || Infinity === e || isNaN(e) || 0 > e) && u.k("Must specify non-negative integer row for RowColumnDefinition " + + b), a.ae = !0, a.index = e) : void 0 !== b.column && (e = b.column, (void 0 === e || null === e || Infinity === e || isNaN(e) || 0 > e) && u.k("Must specify non-negative integer column for RowColumnDefinition " + b), a.ae = !1, a.index = e); + e = new pa; + for (c in b) "row" !== c && "column" !== c && (e[c] = b[c]); + u.ot(a, e) + } else u.ot(a, b); else u.k('Unknown initializer "' + b + '" for object being constructed by GraphObject.make: ' + a) + } + + var Sl = new la("string", "function"); + S.getBuilders = function () { + var a = new la("string", "function"), b; + for (b in Sl) if (b !== b.toLowerCase()) { + var c = Sl[b]; + "function" === typeof c && a.add(b, c) + } + a.freeze(); + return a + }; + var Dm; + S.defineBuilder = Dm = function (a, b) { + u.j(a, "string", S, "defineBuilder:name"); + u.j(b, "function", S, "defineBuilder:func"); + var c = a.toLowerCase(); + "" !== a && "none" !== c && a !== c || u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: " + a); + Sl.add(a, b) + }; + var Em; + S.takeBuilderArgument = Em = function (a, b, c) { + void 0 === c && (c = null); + var d = a[1]; + if ("function" === typeof c ? c(d) : "string" === typeof d) return a.splice(1, 1), d; + if (void 0 === b) throw Error("no " + ("function" === typeof c ? "satisfactory" : "string") + " argument for GraphObject builder " + a[0]); + return b + }; + Dm("Button", function () { + var a = new ga(ue); + a.addColorStop(0, "white"); + a.addColorStop(1, "lightgray"); + var b = new ga(ue); + b.addColorStop(0, "white"); + b.addColorStop(1, "dodgerblue"); + a = Rl(A, Yi, {pz: !0}, { + _buttonFillNormal: a, + _buttonStrokeNormal: "gray", + _buttonFillOver: b, + _buttonStrokeOver: "blue" + }, Rl(X, { + name: "ButtonBorder", + Fb: "Rectangle", + A: new L(0, 0, 2.761423749153968, 2.761423749153968), + B: new L(1, 1, -2.761423749153968, -2.761423749153968), + fill: a, + stroke: "gray" + })); + a.ZD = function (a, b) { + var e = b.je("ButtonBorder"); + if (e instanceof + X) { + var f = b._buttonFillOver; + b._buttonFillNormal = e.fill; + e.fill = f; + f = b._buttonStrokeOver; + b._buttonStrokeNormal = e.stroke; + e.stroke = f + } + }; + a.$D = function (a, b) { + var e = b.je("ButtonBorder"); + e instanceof X && (e.fill = b._buttonFillNormal, e.stroke = b._buttonStrokeNormal) + }; + return a + }); + Dm("TreeExpanderButton", function () { + var a = Rl("Button", { + _treeExpandedFigure: "MinusLine", + _treeCollapsedFigure: "PlusLine" + }, Rl(X, {name: "ButtonIcon", Fb: "MinusLine", xa: K.mp}, (new bf("figure", "isTreeExpanded", function (a, c) { + var d = c.S; + return a ? d._treeExpandedFigure : d._treeCollapsedFigure + })).rw()), {visible: !1}, (new bf("visible", "isTreeLeaf", function (a) { + return !a + })).rw()); + a.click = function (a, c) { + var d = c.T; + d instanceof lf && (d = d.Kh); + if (d instanceof U) { + var e = d.g; + if (null !== e) { + e = e.Eb; + if (d.Vc) { + if (!e.canCollapseTree(d)) return + } else if (!e.canExpandTree(d)) return; + a.Tc = !0; + d.Vc ? e.collapseTree(d) : e.expandTree(d) + } + } + }; + return a + }); + Dm("SubGraphExpanderButton", function () { + var a = Rl("Button", { + _subGraphExpandedFigure: "MinusLine", + _subGraphCollapsedFigure: "PlusLine" + }, Rl(X, { + name: "ButtonIcon", + Fb: "MinusLine", + xa: K.mp + }, (new bf("figure", "isSubGraphExpanded", function (a, c) { + var d = c.S; + return a ? d._subGraphExpandedFigure : d._subGraphCollapsedFigure + })).rw())); + a.click = function (a, c) { + var d = c.T; + d instanceof lf && (d = d.Kh); + if (d instanceof V) { + var e = d.g; + if (null !== e) { + e = e.Eb; + if (d.be) { + if (!e.canCollapseSubGraph(d)) return + } else if (!e.canExpandSubGraph(d)) return; + a.Tc = + !0; + d.be ? e.collapseSubGraph(d) : e.expandSubGraph(d) + } + } + }; + return a + }); + Dm("ContextMenuButton", function () { + var a = Rl("Button"); + a.stretch = fl; + var b = a.je("ButtonBorder"); + b instanceof X && (b.Fb = "Rectangle", b.A = new L(0, 0, 2, 3), b.B = new L(1, 1, -2, -2)); + return a + }); + Dm("PanelExpanderButton", function (a) { + var b = Em(a, "COLLAPSIBLE"); + a = Rl("Button", Rl(X, "TriangleUp", {xa: new ia(6, 4)}, (new bf("figure", "visible", function (a) { + return a ? "TriangleUp" : "TriangleDown" + })).rw(b))); + var c = a.je("ButtonBorder"); + c instanceof X && (c.stroke = null, c.fill = "transparent"); + a.click = function (a, c) { + var f = c.g; + if (null !== f) { + var h = c.T.je(b); + null !== h && (f.Wb("Collapse/Expand Panel"), h.visible = !h.visible, f.Wd("Collapse/Expand Panel")) + } + }; + return a + }); + + function hl() { + this.Zh = this.ti = this.pp = this.sp = this.rp = this.qp = this.ji = this.Qq = this.Pq = this.ki = this.li = this.mi = this.Sq = this.Rq = this.Yh = this.ci = this.Wh = null + } + + hl.prototype.copy = function () { + var a = new hl; + a.Wh = this.Wh; + a.ci = this.ci; + a.Yh = this.Yh; + a.Rq = this.Rq; + a.Sq = this.Sq; + a.mi = this.mi; + a.li = this.li; + a.ki = this.ki; + a.Pq = this.Pq; + a.Qq = this.Qq; + a.ji = this.ji; + a.qp = this.qp; + a.rp = this.rp; + a.sp = this.sp; + a.pp = this.pp; + a.ti = this.ti; + a.Zh = this.Zh; + return a + }; + + function A(a) { + S.call(this); + void 0 === a ? 0 === arguments.length ? this.oa = vh : u.k("invalid argument to Panel constructor: undefined") : (u.rb(a, A, A, "type"), this.oa = a); + this.ya = new E(S); + this.Pe = K.np; + this.Kg = !1; + this.oa === bj && (this.Kg = !0); + this.gq = !1; + this.Mp = uc; + this.bi = dl; + this.oa === Fl && Fm(this); + this.jo = sh; + this.aq = (new ia(10, 10)).freeze(); + this.bq = K.Wj; + this.yl = this.qh = null; + this.uq = NaN; + this.Zf = this.gi = null; + this.Hn = "category"; + this.Yf = null; + this.vi = new z(NaN, NaN, NaN, NaN); + this.hm = null; + this.xh = !1; + this.xr = null + } + + u.Ga(A, S); + u.Lh(A); + u.fa("Panel", A); + + function Fm(a) { + a.Xi = K.np; + a.th = 1; + a.ai = null; + a.Dl = null; + a.sh = 1; + a.rh = null; + a.Cl = null; + a.yd = []; + a.rd = []; + a.am = Gm; + a.Al = Gm; + a.ui = 0; + a.hi = 0 + } + + A.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.oa = this.oa; + a.Pe = this.Pe.Z(); + a.Kg = this.Kg; + a.gq = this.gq; + a.Mp = this.Mp.Z(); + a.bi = this.bi; + if (a.oa === Fl) { + a.Xi = this.Xi.Z(); + a.th = this.th; + a.ai = this.ai; + a.Dl = this.Dl; + a.sh = this.sh; + a.rh = this.rh; + a.Cl = this.Cl; + var b = []; + if (0 < this.yd.length) for (var c = this.yd, d = c.length, e = 0; e < d; e++) if (void 0 !== c[e]) { + var f = c[e].copy(); + f.ql(a); + b[e] = f + } + a.yd = b; + b = []; + if (0 < this.rd.length) for (c = this.rd, d = c.length, e = 0; e < d; e++) void 0 !== c[e] && (f = c[e].copy(), f.ql(a), + b[e] = f); + a.rd = b; + a.am = this.am; + a.Al = this.Al; + a.ui = this.ui; + a.hi = this.hi + } + a.jo = this.jo; + a.aq.assign(this.aq); + a.bq = this.bq.Z(); + a.qh = this.qh; + a.yl = this.yl; + a.uq = this.uq; + a.gi = this.gi; + a.Zf = this.Zf; + a.Hn = this.Hn; + a.vi.assign(this.vi); + a.xh = this.xh; + null !== this.xr && (a.xr = this.xr) + }; + A.prototype.Mh = function (a) { + S.prototype.Mh.call(this, a); + a.ya = this.ya; + for (var b = a.ya.n, c = b.length, d = 0; d < c; d++) b[d].Pg = a; + a.hm = null + }; + A.prototype.copy = function () { + var a = S.prototype.copy.call(this); + if (null !== a) { + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d].copy(), f = a; + e.ql(f); + e.Wl = null; + var h = f.ya, k = h.count; + h.Yd(k, e); + h = f.T; + if (null !== h) { + h.Bk = null; + null !== e.Jd && h instanceof U && (h.xh = !0); + var l = f.g; + null !== l && l.ha.gb || h.Dc(be, "elements", f, null, e, null, k) + } + } + return a + } + return null + }; + A.prototype.toString = function () { + return "Panel(" + this.type + ")#" + u.Uc(this) + }; + var vh; + A.Position = vh = u.s(A, "Position", 0); + A.Horizontal = u.s(A, "Horizontal", 1); + var Xi; + A.Vertical = Xi = u.s(A, "Vertical", 2); + var oh; + A.Spot = oh = u.s(A, "Spot", 3); + var Yi; + A.Auto = Yi = u.s(A, "Auto", 4); + var Fl; + A.Table = Fl = u.s(A, "Table", 5); + A.Viewbox = u.s(A, "Viewbox", 6); + var tl; + A.TableRow = tl = u.s(A, "TableRow", 7); + var ul; + A.TableColumn = ul = u.s(A, "TableColumn", 8); + var ah; + A.Link = ah = u.s(A, "Link", 9); + var bj; + A.Grid = bj = u.s(A, "Grid", 10); + u.defineProperty(A, {type: "type"}, function () { + return this.oa + }, function (a) { + var b = this.oa; + b !== a && (b !== tl && b !== ul || u.k("Cannot change Panel.type when it is already a TableRow or a TableColumn: " + a), this.oa = a, this.oa === bj ? this.Kg = !0 : this.oa === Fl && Fm(this), this.R(), this.h("type", b, a)) + }); + u.u(A, {elements: "elements"}, function () { + return this.ya.i + }); + u.u(A, {Ha: "naturalBounds"}, function () { + return this.Hc + }); + u.defineProperty(A, {padding: "padding"}, function () { + return this.Pe + }, function (a) { + "number" === typeof a ? (0 > a && u.wa(a, ">= 0", A, "padding"), a = new rb(a)) : (u.C(a, rb, A, "padding"), 0 > a.left && u.wa(a.left, ">= 0", A, "padding:value.left"), 0 > a.right && u.wa(a.right, ">= 0", A, "padding:value.right"), 0 > a.top && u.wa(a.top, ">= 0", A, "padding:value.top"), 0 > a.bottom && u.wa(a.bottom, ">= 0", A, "padding:value.bottom")); + var b = this.Pe; + b.L(a) || (this.Pe = a = a.Z(), this.R(), this.h("padding", b, a)) + }); + u.defineProperty(A, {Tk: "defaultAlignment"}, function () { + return this.Mp + }, function (a) { + var b = this.Mp; + b.L(a) || (this.Mp = a = a.Z(), this.R(), this.h("defaultAlignment", b, a)) + }); + u.defineProperty(A, {Bd: "defaultStretch"}, function () { + return this.bi + }, function (a) { + var b = this.bi; + b !== a && (u.rb(a, S, A, "defaultStretch"), this.bi = a, this.R(), this.h("defaultStretch", b, a)) + }); + u.defineProperty(A, {rJ: "defaultSeparatorPadding"}, function () { + return void 0 === this.Xi ? K.np : this.Xi + }, function (a) { + if (void 0 !== this.Xi) { + "number" === typeof a && (a = new rb(a)); + var b = this.Xi; + b.L(a) || (this.Xi = a = a.Z(), this.h("defaultSeparatorPadding", b, a)) + } + }); + u.defineProperty(A, {pJ: "defaultRowSeparatorStroke"}, function () { + return void 0 === this.ai ? null : this.ai + }, function (a) { + var b = this.ai; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.ai = a, this.h("defaultRowSeparatorStroke", b, a)) + }); + u.defineProperty(A, {qJ: "defaultRowSeparatorStrokeWidth"}, function () { + return void 0 === this.th ? 1 : this.th + }, function (a) { + if (void 0 !== this.th) { + var b = this.th; + b !== a && isFinite(a) && 0 <= a && (this.th = a, this.h("defaultRowSeparatorStrokeWidth", b, a)) + } + }); + u.defineProperty(A, {oJ: "defaultRowSeparatorDashArray"}, function () { + return void 0 === this.Dl ? null : this.Dl + }, function (a) { + if (void 0 !== this.Dl) { + var b = this.Dl; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", A, "defaultRowSeparatorDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("defaultRowSeparatorDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.Dl = a; + this.ma(); + this.h("defaultRowSeparatorDashArray", + b, a) + } + } + }); + u.defineProperty(A, {jJ: "defaultColumnSeparatorStroke"}, function () { + return void 0 === this.rh ? null : this.rh + }, function (a) { + if (void 0 !== this.rh) { + var b = this.rh; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.rh = a, this.h("defaultColumnSeparatorStroke", b, a)) + } + }); + u.defineProperty(A, {kJ: "defaultColumnSeparatorStrokeWidth"}, function () { + return void 0 === this.sh ? 1 : this.sh + }, function (a) { + if (void 0 !== this.sh) { + var b = this.sh; + b !== a && isFinite(a) && 0 <= a && (this.sh = a, this.h("defaultColumnSeparatorStrokeWidth", b, a)) + } + }); + u.defineProperty(A, {iJ: "defaultColumnSeparatorDashArray"}, function () { + return void 0 === this.Cl ? null : this.Cl + }, function (a) { + if (void 0 !== this.Cl) { + var b = this.Cl; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", A, "defaultColumnSeparatorDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("defaultColumnSeparatorDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.Cl = a; + this.ma(); + this.h("defaultColumnSeparatorDashArray", + b, a) + } + } + }); + u.defineProperty(A, {FK: "viewboxStretch"}, function () { + return this.jo + }, function (a) { + var b = this.jo; + b !== a && (u.rb(a, S, A, "viewboxStretch"), this.jo = a, this.h("viewboxStretch", b, a)) + }); + u.defineProperty(A, {aw: "gridCellSize"}, function () { + return this.aq + }, function (a) { + var b = this.aq; + b.L(a) || (u.C(a, ia, A, "gridCellSize"), a.J() && 0 !== a.width && 0 !== a.height || u.k("Invalid Panel.gridCellSize: " + a), this.aq = a.Z(), null !== this.g && this === this.g.Gs && vj(this.g), this.ma(), this.h("gridCellSize", b, a)) + }); + u.defineProperty(A, {CD: "gridOrigin"}, function () { + return this.bq + }, function (a) { + var b = this.bq; + b.L(a) || (u.C(a, w, A, "gridOrigin"), a.J() || u.k("Invalid Panel.gridOrigin: " + a), this.bq = a.Z(), null !== this.g && vj(this.g), this.ma(), this.h("gridOrigin", b, a)) + }); + g = A.prototype; + g.Qu = function (a) { + S.prototype.Qu.call(this, a); + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) b[d].Qu(a) + }; + g.Mj = function (a, b) { + if (this.oa === bj) { + var c = this.Hi() * b.scale; + 0 >= c && (c = 1); + var d = this.aw, e = d.width, d = d.height, f = this.Ha, h = f.width, f = f.height, k = Math.ceil(h / e), + l = Math.ceil(f / d), m = this.CD; + a.save(); + a.beginPath(); + a.rect(0, 0, h, f); + a.clip(); + for (var n = [], p = this.ya.n, q = p.length, r = 0; r < q; r++) { + var s = p[r], t = []; + n.push(t); + if (s.visible) for (var s = hk(s.Fb), v = r + 1; v < q; v++) { + var x = p[v]; + x.visible && hk(x.Fb) === s && (x = x.interval, 2 <= x && t.push(x)) + } + } + p = this.ya.n; + q = p.length; + for (r = 0; r < q; r++) { + var B = p[r]; + if (B.visible) { + var t = n[r], s = B.interval, + v = !1, y = !0, C = B.gA; + null !== C && (v = !0, void 0 !== a.setLineDash ? (a.setLineDash(C), a.lineDashOffset = B.cd) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = C, a.webkitLineDashOffset = B.cd) : void 0 !== a.mozDash ? (a.mozDash = C, a.mozDashOffset = B.cd) : y = !1); + if ("LineV" === B.Fb) { + a.lineWidth = B.hb; + yl(this, a, B.stroke, !1, !1); + a.beginPath(); + for (var I = x = Math.floor(-m.x / e); I <= x + k; I++) { + var H = I * e + m.x; + if (0 <= H && H < h && Hm(I, s, t) && (v && !y ? kl(a, H, 0, H, f, C, B.cd) : (a.moveTo(H, 0), a.lineTo(H, f)), 2 > e * s * c)) break + } + a.stroke() + } else if ("LineH" === B.Fb) { + a.lineWidth = + B.hb; + yl(this, a, B.stroke, !1, !1); + a.beginPath(); + for (I = x = Math.floor(-m.y / d); I <= x + l && !(H = I * d + m.y, 0 <= H && H <= f && Hm(I, s, t) && (v && !y ? kl(a, 0, H, h, H, C, B.cd) : (a.moveTo(0, H), a.lineTo(h, H)), 2 > d * s * c)); I++) ; + a.stroke() + } else if ("BarV" === B.Fb) for (yl(this, a, B.fill, !0, !1), B = B.width, isNaN(B) && (B = e), I = x = Math.floor(-m.x / e); I <= x + k && !(H = I * e + m.x, 0 <= H && H < h && Hm(I, s, t) && (a.fillRect(H, 0, B, f), 2 > e * s * c)); I++) ; else if ("BarH" === B.Fb) for (yl(this, a, B.fill, !0, !1), B = B.height, isNaN(B) && (B = d), I = x = Math.floor(-m.y / d); I <= x + l && !(H = I * d + m.y, 0 <= H && + H <= f && Hm(I, s, t) && (a.fillRect(0, H, h, B), 2 > d * s * c)); I++) ; + v && (void 0 !== a.setLineDash ? (a.setLineDash(u.mh), a.lineDashOffset = 0) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = u.mh, a.webkitLineDashOffset = 0) : void 0 !== a.mozDash && (a.mozDash = null, a.mozDashOffset = 0)) + } + } + a.restore(); + $i(b, a, !1) + } else { + this.oa === Fl && (a.lineCap = "butt", Im(this, a, !0, this.yd, !0), Im(this, a, !1, this.rd, !0), Jm(this, a, !0, this.yd), Jm(this, a, !1, this.rd), Im(this, a, !0, this.yd, !1), Im(this, a, !1, this.rd, !1)); + (c = this.LD) && a.save(); + e = this.If(); + d = this.ya.n; + h = d.length; + for (f = 0; f < h; f++) k = d[f], c && k === e && (a.Ft = !0), k.We(a, b), c && k === e && (a.Ft = !1); + c && (a.restore(), $i(b, a, !1)) + } + }; + + function Jm(a, b, c, d) { + for (var e = d.length, f = a.ba, h = c ? a.fd(0) : a.ed(0), k = 0; k < e; k++) { + var l = d[k]; + if (void 0 !== l && l !== h && 0 !== l.Qa) { + var m = l.ep; + isNaN(m) && (m = c ? a.th : a.sh); + var n = l.dp; + null === n && (n = c ? a.ai : a.rh); + if (0 !== m && null !== n) { + yl(a, b, n, !1, !1); + var n = !1, p = !0, q = l.gI; + null !== q && (n = !0, void 0 !== b.setLineDash ? (b.setLineDash(q), b.lineDashOffset = a.cd) : void 0 !== b.webkitLineDash ? (b.webkitLineDash = q, b.webkitLineDashOffset = a.cd) : void 0 !== b.mozDash ? (b.mozDash = q, b.mozDashOffset = a.cd) : p = !1); + b.beginPath(); + var r = l.position + m; + c ? r > f.height && (m -= r - f.height) : r > f.width && (m -= r - f.width); + l = l.position + m / 2; + b.lineWidth = m; + r = a.padding; + c ? (l += r.top, m = r.left, r = f.width - r.right, n && !p ? kl(b, m, l, r, l, q, 0) : (b.moveTo(m, l), b.lineTo(r, l))) : (l += r.left, m = r.top, r = f.height - r.bottom, n && !p ? kl(b, l, m, l, r, q, 0) : (b.moveTo(l, m), b.lineTo(l, r))); + b.stroke(); + n && (void 0 !== b.setLineDash ? (b.setLineDash(u.mh), b.lineDashOffset = 0) : void 0 !== b.webkitLineDash ? (b.webkitLineDash = u.mh, b.webkitLineDashOffset = 0) : void 0 !== b.mozDash && (b.mozDash = null, b.mozDashOffset = 0)) + } + } + } + } + + function Im(a, b, c, d, e) { + for (var f = d.length, h = a.ba, k = 0; k < f; k++) { + var l = d[k]; + if (void 0 !== l && null !== l.background && l.Zy !== e && 0 !== l.Qa) { + var m = c ? h.height : h.width; + if (!(l.position > m)) { + var n = l.lg(), p = l.ep; + isNaN(p) && (p = c ? a.th : a.sh); + var q = l.dp; + null === q && (q = c ? a.ai : a.rh); + null === q && (p = 0); + n -= p; + p = l.position + p; + n += l.Qa; + p + n > m && (n = m - p); + 0 >= n || (m = a.padding, yl(a, b, l.background, !0, !1), c ? b.fillRect(m.left, p + m.top, h.width - (m.left + m.right), n) : b.fillRect(p + m.left, m.top, n, h.height - (m.top + m.bottom))) + } + } + } + } + + function Hm(a, b, c) { + if (0 !== a % b) return !1; + b = c.length; + for (var d = 0; d < b; d++) if (0 === a % c[d]) return !1; + return !0 + } + + function hk(a) { + return "LineV" === a || "BarV" === a + } + + g.Co = function (a, b, c, d, e) { + var f = this.Tf(), h = this.transform, k = 1 / (h.m11 * h.m22 - h.m12 * h.m21), l = h.m22 * k, m = -h.m12 * k, + n = -h.m21 * k, p = h.m11 * k, q = k * (h.m21 * h.dy - h.m22 * h.dx), r = k * (h.m12 * h.dx - h.m11 * h.dy); + if (null !== this.nm) return h = this.ba, K.bl(h.left, h.top, h.right, h.bottom, a, b, c, d, e); + if (null !== this.background) f = a * l + b * n + q, k = a * m + b * p + r, a = c * l + d * n + q, c = c * m + d * p + r, e.m(0, 0), d = this.Ha, c = K.bl(0, 0, d.width, d.height, f, k, a, c, e), e.transform(h); else { + f || (l = 1, n = m = 0, p = 1, r = q = 0); + k = a * l + b * n + q; + a = a * m + b * p + r; + l = c * l + d * n + q; + d = c * m + d * p + r; + e.m(l, d); + m = (l - k) * (l - k) + (d - a) * (d - a); + c = !1; + p = this.ya.n; + r = p.length; + n = u.K(); + for (q = 0; q < r; q++) b = p[q], b.visible && b.Co(k, a, l, d, n) && (c = !0, b = (k - n.x) * (k - n.x) + (a - n.y) * (a - n.y), b < m && (m = b, e.set(n))); + u.v(n); + f && e.transform(h) + } + return c + }; + g.R = function (a) { + S.prototype.R.call(this, a); + this.oa === Yi && (a = this.If(), null !== a && a.R(!0)); + a = this.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + !0 !== Aj(d) && (d.xa.J() || (d instanceof ph || d instanceof A || d instanceof qa || pl(d, !1) !== qh) && d.R(!0)) + } + }; + g.Fo = function () { + if (!1 === Aj(this)) { + uj(this, !0); + rl(this, !0); + for (var a = this.ya.n, b = a.length, c = 0; c < b; c++) a[c].Fo() + } + }; + g.Jg = function () { + if (0 !== (this.ea & 2048) === !1) { + Cl(this, !0); + Dl(this, !0); + for (var a = this.ya.n, b = a.length, c = 0; c < b; c++) a[c].mz() + } + }; + g.mz = function () { + Dl(this, !0); + for (var a = this.ya.n, b = a.length, c = 0; c < b; c++) a[c].mz() + }; + g.Oo = function (a, b, c, d) { + var e = this.vi; + e.width = 0; + e.height = 0; + var f = this.xa, h = this.vg; + void 0 === c && (c = h.width, d = h.height); + c = Math.max(c, h.width); + d = Math.max(d, h.height); + var k = this.af; + isNaN(f.width) || (a = Math.min(f.width, k.width)); + isNaN(f.height) || (b = Math.min(f.height, k.height)); + a = Math.max(c, a); + b = Math.max(d, b); + var l = this.padding; + a = Math.max(a - l.left - l.right, 0); + b = Math.max(b - l.top - l.bottom, 0); + var m = this.ya.n; + if (0 !== m.length) { + var n = this.oa.Ub; + switch (n) { + case "Position": + var p = a, q = b, r = c, s = d, t = m.length; + e.x = 0; + e.y = + 0; + e.width = 0; + for (var v = e.height = 0; v < t; v++) { + var x = m[v]; + if (x.visible || x === this.ec) { + var B = x.margin, y = B.right + B.left, C = B.top + B.bottom; + Ph(x, p, q, r, s); + var I = x.Ba, H = Math.max(I.width + y, 0), T = Math.max(I.height + C, 0), + aa = x.position.x, R = x.position.y; + isFinite(aa) || (aa = 0); + isFinite(R) || (R = 0); + if (x instanceof X) { + var N = x; + if (N.rz) var Z = N.hb / 2, aa = aa - Z, R = R - Z + } + kb(e, aa, R, H, T) + } + } + break; + case "Vertical": + for (var Ea = a, ua = c, Oa = m.length, na = u.eb(), Ca = 0; Ca < Oa; Ca++) { + var ra = m[Ca]; + if (ra.visible || ra === this.ec) { + var dc = pl(ra, !1); + if (dc !== qh && + dc !== el) na.push(ra); else { + var ed = ra.margin, Lf = ed.right + ed.left, ec = ed.top + ed.bottom; + Ph(ra, Ea, Infinity, ua, 0); + var Ve = ra.Ba, Mf = Math.max(Ve.width + Lf, 0), Ta = Math.max(Ve.height + ec, 0); + e.width = Math.max(e.width, Mf); + e.height += Ta + } + } + } + var db = na.length; + if (0 !== db) { + this.xa.width ? Ea = Math.min(this.xa.width, this.af.width) : 0 !== e.width && (Ea = Math.min(e.width, this.af.width)); + for (Ca = 0; Ca < db; Ca++) if (ra = na[Ca], ra.visible || ra === this.ec) ed = ra.margin, Lf = ed.right + ed.left, ec = ed.top + ed.bottom, Ph(ra, Ea, Infinity, ua, 0), Ve = ra.Ba, Mf = Math.max(Ve.width + + Lf, 0), Ta = Math.max(Ve.height + ec, 0), e.width = Math.max(e.width, Mf), e.height += Ta; + u.ra(na) + } + break; + case "Horizontal": + for (var wa = b, za = d, lb = m.length, Eb = u.eb(), $a = 0; $a < lb; $a++) { + var jc = m[$a]; + if (jc.visible || jc === this.ec) { + var ge = pl(jc, !1); + if (ge !== qh && ge !== fl) Eb.push(jc); else { + var nc = jc.margin, Od = nc.right + nc.left, he = nc.top + nc.bottom; + Ph(jc, Infinity, wa, 0, za); + var We = jc.Ba, pf = Math.max(We.width + Od, 0), Pd = Math.max(We.height + he, 0); + e.width += pf; + e.height = Math.max(e.height, Pd) + } + } + } + var Fb = Eb.length; + if (0 !== Fb) { + this.xa.height ? wa = + Math.min(this.xa.height, this.af.height) : 0 !== e.height && (wa = Math.min(e.height, this.af.height)); + for ($a = 0; $a < Fb; $a++) if (jc = Eb[$a], jc.visible || jc === this.ec) nc = jc.margin, Od = nc.right + nc.left, he = nc.top + nc.bottom, Ph(jc, Infinity, wa, 0, za), We = jc.Ba, pf = Math.max(We.width + Od, 0), Pd = Math.max(We.height + he, 0), e.width += pf, e.height = Math.max(e.height, Pd); + u.ra(Eb) + } + break; + case "Spot": + a:{ + var Lb = a, Ec = b, Mg = c, Mb = d, yb = m.length, fc = this.If(), mb = fc.margin, ye = 0, + Qd = 0, og = mb.right + mb.left, Nf = mb.top + mb.bottom; + Ph(fc, Lb, Ec, Mg, Mb); + var zb = + fc.Ba, fd = zb.width, oc = zb.height, wb = Math.max(fd + og, 0), Fc = Math.max(oc + Nf, 0); + e.x = -mb.left; + e.y = -mb.top; + e.width = wb; + e.height = Fc; + for (var Nb = 0; Nb < yb; Nb++) { + var Na = m[Nb]; + if (Na !== fc && (Na.visible || Na === this.ec)) { + mb = Na.margin; + ye = mb.right + mb.left; + Qd = mb.top + mb.bottom; + Ph(Na, Lb, Ec, 0, 0); + var zb = Na.Ba, wb = Math.max(zb.width + ye, 0), Fc = Math.max(zb.height + Qd, 0), + eb = Na.alignment; + eb.Lc() && (eb = this.Tk); + eb.pd() || (eb = Ib); + var Ab = Na.Hj; + Ab.Lc() && (Ab = Ib); + kb(e, eb.x * fd + eb.offsetX - (Ab.x * zb.width - Ab.offsetX) - mb.left, eb.y * oc + eb.offsetY - (Ab.y * + zb.height - Ab.offsetY) - mb.top, wb, Fc) + } + } + var gc = fc.stretch; + gc === dl && (gc = pl(fc, !1)); + switch (gc) { + case qh: + break a; + case cd: + if (!isFinite(Lb) && !isFinite(Ec)) break a; + break; + case fl: + if (!isFinite(Lb)) break a; + break; + case el: + if (!isFinite(Ec)) break a + } + zb = fc.Ba; + fd = zb.width; + oc = zb.height; + wb = Math.max(fd + og, 0); + Fc = Math.max(oc + Nf, 0); + mb = fc.margin; + e.x = -mb.left; + e.y = -mb.top; + e.width = wb; + e.height = Fc; + for (Nb = 0; Nb < yb; Nb++) Na = m[Nb], Na === fc || !Na.visible && Na !== this.ec || (mb = Na.margin, ye = mb.right + mb.left, Qd = mb.top + mb.bottom, zb = Na.Ba, wb = Math.max(zb.width + + ye, 0), Fc = Math.max(zb.height + Qd, 0), eb = Na.alignment, eb.Lc() && (eb = this.Tk), eb.pd() || (eb = Ib), Ab = Na.Hj, Ab.Lc() && (Ab = Ib), kb(e, eb.x * fd + eb.offsetX - (Ab.x * zb.width - Ab.offsetX) - mb.left, eb.y * oc + eb.offsetY - (Ab.y * zb.height - Ab.offsetY) - mb.top, wb, Fc)) + } + break; + case "Auto": + var Rd = a, Sd = b, qf = c, ze = d, rf = m.length, Rb = this.If(), cb = Rb.margin, + pc = cb.right + cb.left, Pc = cb.top + cb.bottom; + Ph(Rb, Rd, Sd, qf, ze); + var gd = Rb.Ba, ab = Math.max(gd.width + pc, 0), ub = Math.max(gd.height + Pc, 0), kc = Km(Rb), + hd = kc.x * ab + kc.offsetX, Ng = kc.y * ub + kc.offsetY, kc = Lm(Rb), + Og = kc.x * ab + kc.offsetX, Pg = kc.y * ub + kc.offsetY, Of = Rd, Gc = Sd; + isFinite(Rd) && (Of = Math.abs(hd - Og)); + isFinite(Sd) && (Gc = Math.abs(Ng - Pg)); + var Qc = u.ul(); + Qc.m(0, 0); + for (var Hc = 0; Hc < rf; Hc++) { + var nb = m[Hc]; + if (nb !== Rb && (nb.visible || nb === this.ec)) { + var cb = nb.margin, ie = cb.right + cb.left, ob = cb.top + cb.bottom; + Ph(nb, Of, Gc, 0, 0); + gd = nb.Ba; + ab = Math.max(gd.width + ie, 0); + ub = Math.max(gd.height + ob, 0); + Qc.m(Math.max(ab, Qc.width), Math.max(ub, Qc.height)) + } + } + if (1 === rf) e.width = ab, e.height = ub, u.Oj(Qc); else { + var yc = Km(Rb), Ae = Lm(Rb), Bb = 0, Cb = 0; + Ae.x !== + yc.x && Ae.y !== yc.y && (Bb = Qc.width / Math.abs(Ae.x - yc.x), Cb = Qc.height / Math.abs(Ae.y - yc.y)); + u.Oj(Qc); + var id = 0; + if (Rb instanceof X) { + var Rc = Rb, id = Rc.hb * Rc.scale; + rh(Rc) === sh && (Bb = Cb = Math.max(Bb, Cb)) + } + var Bb = Bb + (Math.abs(yc.offsetX) + Math.abs(Ae.offsetX) + id), + Cb = Cb + (Math.abs(yc.offsetY) + Math.abs(Ae.offsetY) + id), Td = Rb.stretch; + Td === dl && (Td = pl(Rb, !1)); + switch (Td) { + case qh: + ze = qf = 0; + break; + case cd: + isFinite(Rd) && (Bb = Rd); + isFinite(Sd) && (Cb = Sd); + break; + case fl: + isFinite(Rd) && (Bb = Rd); + ze = 0; + break; + case el: + qf = 0, isFinite(Sd) && (Cb = Sd) + } + Rb instanceof + X && !Rb.xa.J() && (Rc = Rb, Rc.Rg ? Rc.jk = null : Rc.Pa = null); + Rb.Fo(); + Ph(Rb, Bb, Cb, qf, ze); + e.width = Rb.Ba.width + pc; + e.height = Rb.Ba.height + Pc + } + break; + case "Table": + for (var Ud = a, Xe = b, pm = c, zi = d, Fa = m.length, Be = u.eb(), Vd = u.eb(), ca = 0; ca < Fa; ca++) { + var ha = m[ca], pg = ha instanceof A ? ha : null; + if (null === pg || pg.type !== tl && pg.type !== ul || !ha.visible) Be.push(ha); else { + Vd.push(ha); + for (var Qg = pg.ya.n, yh = Qg.length, Sc = 0; Sc < yh; Sc++) { + var zh = Qg[Sc]; + pg.type === tl ? zh.rc = ha.rc : pg.type === ul && (zh.column = ha.column); + Be.push(zh) + } + } + } + Fa = Be.length; + 0 === Fa && + (this.fd(0), this.ed(0)); + for (var Sb = [], ca = 0; ca < Fa; ca++) ha = Be[ca], uj(ha, !0), rl(ha, !0), Sb[ha.rc] || (Sb[ha.rc] = []), Sb[ha.rc][ha.column] || (Sb[ha.rc][ha.column] = []), Sb[ha.rc][ha.column].push(ha); + u.ra(Be); + for (var Rg = u.eb(), Tc = u.eb(), je = u.eb(), Ic = {count: 0}, jd = {count: 0}, zc = Ud, kd = Xe, Pf = this.yd, Fa = Pf.length, ca = 0; ca < Fa; ca++) { + var ba = Pf[ca]; + void 0 !== ba && (ba.Qa = 0) + } + Pf = this.rd; + Fa = Pf.length; + for (ca = 0; ca < Fa; ca++) ba = Pf[ca], void 0 !== ba && (ba.Qa = 0); + for (var ke = Sb.length, Ce = 0, ca = 0; ca < ke; ca++) Sb[ca] && (Ce = Math.max(Ce, Sb[ca].length)); + for (var Tj = Math.min(this.ui, ke - 1), Uj = Math.min(this.hi, Ce - 1), Ac = 0, ke = Sb.length, ca = Tj; ca < ke; ca++) if (Sb[ca]) { + var Ce = Sb[ca].length, fb = this.fd(ca); + fb.Qa = 0; + for (Sc = Uj; Sc < Ce; Sc++) if (Sb[ca][Sc]) { + var gb = this.ed(Sc); + void 0 === Rg[Sc] && (gb.Qa = 0, Rg[Sc] = !0); + for (var Vj = Sb[ca][Sc], Qf = Vj.length, qg = 0; qg < Qf; qg++) if (ha = Vj[qg], ha.visible || ha === this.ec) { + var rg = 1 < ha.tj || 1 < ha.Wi; + rg && Tc.push(ha); + var Ob = ha.margin, Rf = Ob.right + Ob.left, Sf = Ob.top + Ob.bottom, + Wd = Gl(ha, fb, gb, !1), le = ha.xa, qm = !isNaN(le.height), + Ah = !isNaN(le.width) && qm; + rg || Wd === qh || Ah || (void 0 === Ic[Sc] && (Ic[Sc] = -1, Ic.count++), void 0 === jd[ca] && (jd[ca] = -1, jd.count++), je.push(ha)); + Ph(ha, Infinity, Infinity, 0, 0); + var De = ha.Ba, Ye = Math.max(De.width + Rf, 0), Cd = Math.max(De.height + Sf, 0); + 1 !== ha.tj || Wd !== qh && Wd !== fl || (ba = this.fd(ca), Ac = Math.max(Cd - ba.Qa, 0), Ac > kd && (Ac = kd), ba.Qa += Ac, kd = Math.max(kd - Ac, 0)); + 1 !== ha.Wi || Wd !== qh && Wd !== el || (ba = this.ed(Sc), Ac = Math.max(Ye - ba.Qa, 0), Ac > zc && (Ac = zc), ba.Qa += Ac, zc = Math.max(zc - Ac, 0)); + rg && ha.Fo() + } + } + } + u.ra(Rg); + for (var qc = 0, Xd = 0, Fa = this.ps, ca = 0; ca < Fa; ca++) void 0 !== + this.rd[ca] && (qc += this.ed(ca).yb); + Fa = this.kt; + for (ca = 0; ca < Fa; ca++) void 0 !== this.yd[ca] && (Xd += this.fd(ca).yb); + for (var zc = Math.max(Ud - qc, 0), Wj = kd = Math.max(Xe - Xd, 0), Xj = zc, Fa = je.length, ca = 0; ca < Fa; ca++) { + var ha = je[ca], fb = this.fd(ha.rc), gb = this.ed(ha.column), Ai = ha.Ba, Ob = ha.margin, + Rf = Ob.right + Ob.left, Sf = Ob.top + Ob.bottom; + Ic[ha.column] = 0 === gb.Qa ? Math.max(Ai.width + Rf, Ic[ha.column]) : null; + jd[ha.rc] = 0 === fb.Qa ? Math.max(Ai.height + Sf, jd[ha.rc]) : null + } + var Sg = 0, Bc = 0; + for (ca in jd) "count" !== ca && (Sg += jd[ca]); + for (ca in Ic) "count" !== + ca && (Bc += Ic[ca]); + for (var pb = u.ul(), ca = 0; ca < Fa; ca++) if (ha = je[ca], ha.visible || ha === this.ec) { + var fb = this.fd(ha.rc), gb = this.ed(ha.column), me = 0; + isFinite(gb.width) ? me = gb.width : (me = isFinite(zc) && null !== Ic[ha.column] ? 0 === Bc ? gb.Qa + zc : Ic[ha.column] / Bc * Xj : null !== Ic[ha.column] ? zc : gb.Qa || zc, me = Math.max(0, me - gb.lg())); + var Jc = 0; + isFinite(fb.height) ? Jc = fb.height : (Jc = isFinite(kd) && null !== jd[ha.rc] ? 0 === Sg ? fb.Qa + kd : jd[ha.rc] / Sg * Wj : null !== jd[ha.rc] ? kd : fb.Qa || kd, Jc = Math.max(0, Jc - fb.lg())); + pb.m(Math.max(gb.Ki, Math.min(me, + gb.Kf)), Math.max(fb.Ki, Math.min(Jc, fb.Kf))); + Wd = Gl(ha, fb, gb, !1); + switch (Wd) { + case fl: + pb.height = Infinity; + break; + case el: + pb.width = Infinity + } + Ob = ha.margin; + Rf = Ob.right + Ob.left; + Sf = Ob.top + Ob.bottom; + ha.Fo(); + Ph(ha, pb.width, pb.height, gb.Ki, fb.Ki); + De = ha.Ba; + Ye = Math.max(De.width + Rf, 0); + Cd = Math.max(De.height + Sf, 0); + isFinite(zc) && (Ye = Math.min(Ye, pb.width)); + isFinite(kd) && (Cd = Math.min(Cd, pb.height)); + var Tg = 0, Tg = fb.Qa; + fb.Qa = Math.max(fb.Qa, Cd); + Ac = fb.Qa - Tg; + kd = Math.max(kd - Ac, 0); + Tg = gb.Qa; + gb.Qa = Math.max(gb.Qa, Ye); + Ac = gb.Qa - Tg; + zc = Math.max(zc - Ac, 0) + } + u.ra(je); + for (var Ee = u.ul(), Fa = Tc.length, ca = 0; ca < Fa; ca++) if (ha = Tc[ca], ha.visible || ha === this.ec) { + fb = this.fd(ha.rc); + gb = this.ed(ha.column); + pb.m(Math.max(gb.Ki, Math.min(Ud, gb.Kf)), Math.max(fb.Ki, Math.min(Xe, fb.Kf))); + Wd = Gl(ha, fb, gb, !1); + switch (Wd) { + case cd: + 0 !== gb.Qa && (pb.width = Math.min(pb.width, gb.Qa)); + 0 !== fb.Qa && (pb.height = Math.min(pb.height, fb.Qa)); + break; + case fl: + 0 !== gb.Qa && (pb.width = Math.min(pb.width, gb.Qa)); + break; + case el: + 0 !== fb.Qa && (pb.height = Math.min(pb.height, fb.Qa)) + } + isFinite(gb.width) && + (pb.width = gb.width); + isFinite(fb.height) && (pb.height = fb.height); + Ee.m(0, 0); + for (var Pb = 1; Pb < ha.tj && !(ha.rc + Pb >= this.kt); Pb++) ba = this.fd(ha.rc + Pb), Ee.height += Math.max(ba.Ki, isNaN(ba.Qe) ? ba.Kf : Math.min(ba.Qe, ba.Kf)); + for (Pb = 1; Pb < ha.Wi && !(ha.column + Pb >= this.ps); Pb++) ba = this.ed(ha.column + Pb), Ee.width += Math.max(ba.Ki, isNaN(ba.Qe) ? ba.Kf : Math.min(ba.Qe, ba.Kf)); + pb.width += Ee.width; + pb.height += Ee.height; + Ob = ha.margin; + Rf = Ob.right + Ob.left; + Sf = Ob.top + Ob.bottom; + Ph(ha, pb.width, pb.height, pm, zi); + for (var De = ha.Ba, Ye = Math.max(De.width + + Rf, 0), Cd = Math.max(De.height + Sf, 0), Bh = 0, Pb = 0; Pb < ha.tj && !(ha.rc + Pb >= this.kt); Pb++) ba = this.fd(ha.rc + Pb), Bh += ba.total || 0; + if (Bh < Cd) for (var Dd = Cd - Bh; 0 < Dd;) { + var Ed = ba.yb || 0; + isNaN(ba.height) && ba.Kf > Ed && (ba.Qa = Math.min(ba.Kf, Ed + Dd), ba.yb !== Ed && (Dd -= ba.yb - Ed)); + if (-1 === ba.index - 1) break; + ba = this.fd(ba.index - 1) + } + for (var Tf = 0, Pb = 0; Pb < ha.Wi && !(ha.column + Pb >= this.ps); Pb++) ba = this.ed(ha.column + Pb), Tf += ba.total || 0; + if (Tf < Ye) for (Dd = Ye - Tf; 0 < Dd;) { + Ed = ba.yb || 0; + isNaN(ba.width) && ba.Kf > Ed && (ba.Qa = Math.min(ba.Kf, Ed + Dd), ba.yb !== + Ed && (Dd -= ba.yb - Ed)); + if (-1 === ba.index - 1) break; + ba = this.ed(ba.index - 1) + } + } + u.ra(Tc); + u.Oj(Ee); + u.Oj(pb); + for (var Uf = 0, Ze = 0, Wd = pl(this, !0), Fd = this.xa, Vf = this.af, ne = Xd = qc = 0, ld = 0, Fa = this.ps, ca = 0; ca < Fa; ca++) void 0 !== this.rd[ca] && (ba = this.ed(ca), isFinite(ba.width) ? (ne += ba.width, ne += ba.lg()) : Mm(ba) === Nm ? (ne += ba.yb, ne += ba.lg()) : 0 !== ba.yb && (qc += ba.yb, qc += ba.lg())); + var Uf = isFinite(Fd.width) ? Math.min(Fd.width, Vf.width) : Wd !== qh && isFinite(Ud) ? Ud : qc, + Uf = Math.max(Uf, this.vg.width), Uf = Math.max(Uf - ne, 0), Ch = Math.max(Uf / qc, + 1); + isFinite(Ch) || (Ch = 1); + for (ca = 0; ca < Fa; ca++) void 0 !== this.rd[ca] && (ba = this.ed(ca), isFinite(ba.width) || Mm(ba) === Nm || (ba.Qa = ba.yb * Ch), ba.position = e.width, 0 !== ba.yb && (e.width += ba.yb, e.width += ba.lg())); + Fa = this.kt; + for (ca = 0; ca < Fa; ca++) void 0 !== this.yd[ca] && (ba = this.fd(ca), isFinite(ba.height) ? (ld += ba.height, ld += ba.lg()) : Mm(ba) === Nm ? (ld += ba.yb, ld += ba.lg()) : 0 !== ba.yb && (Xd += ba.yb, Xd += ba.lg())); + var Ze = isFinite(Fd.height) ? Math.min(Fd.height, Vf.height) : Wd !== qh && isFinite(Xe) ? Xe : Xd, + Ze = Math.max(Ze, this.vg.height), + Ze = Math.max(Ze - ld, 0), Wf = Math.max(Ze / Xd, 1); + isFinite(Wf) || (Wf = 1); + for (ca = 0; ca < Fa; ca++) void 0 !== this.yd[ca] && (ba = this.fd(ca), isFinite(ba.height) || Mm(ba) === Nm || (ba.Qa = ba.yb * Wf), ba.position = e.height, 0 !== ba.yb && (e.height += ba.yb, e.height += ba.lg())); + Fa = Vd.length; + for (ca = 0; ca < Fa; ca++) { + var Tb = Vd[ca]; + Tb.type === tl ? (me = e.width, ba = this.fd(Tb.rc), Jc = ba.Qa) : (ba = this.ed(Tb.column), me = ba.Qa, Jc = e.height); + Tb.Pc.m(0, 0, me, Jc); + uj(Tb, !1); + Sb[Tb.rc] || (Sb[Tb.rc] = []); + Sb[Tb.rc][Tb.column] || (Sb[Tb.rc][Tb.column] = []); + Sb[Tb.rc][Tb.column].push(Tb) + } + u.ra(Vd); + this.xr = Sb; + break; + case "Viewbox": + var sg = a, tg = b, sf = c, Bi = d; + 1 < m.length && u.k("Viewbox Panel cannot contain more than one GraphObject."); + var Fe = m[0]; + Fe.$b = 1; + Fe.Fo(); + Ph(Fe, Infinity, Infinity, sf, Bi); + var Ci = Fe.Ba, Zj = Fe.margin, Jp = Zj.right + Zj.left, Kp = Zj.top + Zj.bottom; + if (isFinite(sg) || isFinite(tg)) { + var Rr = Fe.scale, ak = Ci.width, bk = Ci.height, Lp = Math.max(sg - Jp, 0), + Mp = Math.max(tg - Kp, 0), Di = 1; + this.jo === sh ? 0 !== ak && 0 !== bk && (Di = Math.min(Lp / ak, Mp / bk)) : 0 !== ak && 0 !== bk && (Di = Math.max(Lp / ak, Mp / bk)); + 0 === Di && (Di = 1E-4); + Fe.$b *= Di; + Rr !== Fe.scale && (uj(Fe, !0), Ph(Fe, Infinity, Infinity, sf, Bi)) + } + Ci = Fe.Ba; + e.width = isFinite(sg) ? sg : Math.max(Ci.width + Jp, 0); + e.height = isFinite(tg) ? tg : Math.max(Ci.height + Kp, 0); + break; + case "Link": + var Np = m.length, ug = this instanceof lf ? this.Kh : this; + if (ug instanceof W) if (0 === Np) { + var ck = this.Hc; + bb(ck, 0, 0); + var Yd = this.Ba; + Yd.m(0, 0, 0, 0) + } else { + var dk = this instanceof lf ? null : ug.path, $e = ug.Mm, Ge = this.vi; + Ge.assign($e); + Ge.x = 0; + var Dh = Ge.y = 0, Ei = ug.points, Dh = void 0 !== this.ka ? this.ka : Ei.count; + this.Mg.m($e.x, $e.y); + this.Vi.clear(); + null !== dk && (Om(dk, $e.width, $e.height), Yd = dk.Ba, Ge.Sh(Yd), this.Vi.add(Yd)); + for (var Eh = u.jh(), Fi = u.K(), Xf = u.K(), rm = 0; rm < Np; rm++) { + var Qb = m[rm]; + if (Qb !== dk) if (Qb.tg && Qb instanceof X) Om(Qb, $e.width, $e.height), Yd = Qb.Ba, Ge.Sh(Yd), this.Vi.add(Yd); else if (2 > Dh) Ph(Qb, Infinity, Infinity), Yd = Qb.Ba, Ge.Sh(Yd), this.Vi.add(Yd); else { + var Yf = Qb.Pf, Pp = Qb.Bw, sm = Qb.Hj; + sm.ne() && (sm = Ib); + var Gi = Qb.Cw, Sr = Qb.BE, Hi = 0, Ii = 0, ek = 0; + if (Yf < -Dh || Yf >= Dh) { + var Qp = ug.XD, Ji = ug.WD; + Gi !== dh && (ek = ug.computeAngle(Qb, Gi, Ji), Qb.angle = ek); + Hi = Qp.x - + $e.x; + Ii = Qp.y - $e.y + } else { + var tf, Fh; + if (0 <= Yf) tf = Ei.ja(Yf), Fh = Yf < Dh - 1 ? Ei.ja(Yf + 1) : tf; else { + var tm = Dh + Yf; + tf = Ei.ja(tm); + Fh = 0 < tm ? Ei.ja(tm - 1) : tf + } + Ji = 0 <= Yf ? tf.Fi(Fh) : Fh.Fi(tf); + Gi !== dh && (ek = ug.computeAngle(Qb, Gi, Ji), Qb.Ym = ek); + Hi = tf.x + (Fh.x - tf.x) * Pp - $e.x; + Ii = tf.y + (Fh.y - tf.y) * Pp - $e.y + } + Ph(Qb, Infinity, Infinity); + var Yd = Qb.Ba, ck = Qb.Ha, Ki = 0; + Qb instanceof X && (Ki = Qb.hb); + var fk = ck.width + Ki, um = ck.height + Ki; + Eh.reset(); + Eh.translate(-Yd.x, -Yd.y); + Eh.scale(Qb.scale, Qb.scale); + Eh.rotate(Gi === dh ? Qb.angle : Ji, fk / 2, um / 2); + var Gh = new z(0, + 0, fk, um); + Fi.pt(Gh, sm); + Eh.ab(Fi); + var Tr = -Fi.x + Ki / 2, Ur = -Fi.y + Ki / 2; + Xf.assign(Sr); + isNaN(Xf.x) && (Xf.x = 0 <= Yf ? fk / 2 + 3 : -(fk / 2 + 3)); + isNaN(Xf.y) && (Xf.y = -(um / 2 + 3)); + Xf.rotate(Ji); + Hi += Xf.x; + Ii += Xf.y; + Gh.set(Yd); + Gh.x = Hi + Tr; + Gh.y = Ii + Ur; + this.Vi.add(Gh); + Ge.Sh(Gh) + } + } + if (this.ue) for (var Rp = this.ug; Rp.next();) Ph(Rp.value, Infinity, Infinity); + this.vi = Ge; + var vm = this.Mg; + vm.m(vm.x + Ge.x, vm.y + Ge.y); + bb(e, Ge.width || 0, Ge.height || 0); + u.Ye(Eh); + u.v(Fi); + u.v(Xf) + } + break; + case "Grid": + break; + case "TableRow": + case "TableColumn": + u.k(this.toString() + + " is not an element of a Table Panel. TableRow and TableColumn Panels can only be elements of a Table Panel."); + break; + default: + u.k("Unknown panel type: " + n) + } + } + var He = e.width, Ie = e.height, gk = this.padding, Vr = gk.top + gk.bottom, He = He + (gk.left + gk.right), + Ie = Ie + Vr; + isFinite(f.width) && (He = f.width); + isFinite(f.height) && (Ie = f.height); + He = Math.min(k.width, He); + Ie = Math.min(k.height, Ie); + He = Math.max(h.width, He); + Ie = Math.max(h.height, Ie); + He = Math.max(c, He); + Ie = Math.max(d, Ie); + e.width = He; + e.height = Ie; + bb(this.Hc, He, Ie); + ml(this, + 0, 0, He, Ie) + }; + A.prototype.findMainElement = A.prototype.If = function () { + if (null === this.hm) { + var a = this.ya.n, b = a.length; + if (0 === b) return null; + for (var c = 0; c < b; c++) { + var d = a[c]; + if (!0 === d.tg) return this.hm = d + } + this.hm = a[0] + } + return this.hm + }; + A.prototype.xi = function (a, b, c, d) { + var e = this.vi, f = this.ya.n, h = u.Vj(0, 0, 0, 0); + if (0 === f.length) { + var k = this.ba; + k.x = a; + k.y = b; + k.width = c; + k.height = d + } else { + if (!this.xa.J()) { + var l = pl(this, !0), m = this.Pc, n = m.width, p = m.height, q = this.margin, r = q.left + q.right, + s = q.top + q.bottom; + n === c && p === d && (l = qh); + switch (l) { + case qh: + if (n > c || p > d) this.R(), Ph(this, n > c ? c : n, p > d ? d : p); + break; + case cd: + this.R(!0); + Ph(this, c + r, d + s, 0, 0); + break; + case fl: + this.R(!0); + Ph(this, c + r, p + s, 0, 0); + break; + case el: + this.R(!0), Ph(this, n + r, d + s, 0, 0) + } + } + k = this.ba; + k.x = a; + k.y = + b; + k.width = c; + k.height = d; + var t = this.oa.Ub; + switch (t) { + case "Position": + for (var v = f.length, x = e.x - this.padding.left, B = e.y - this.padding.top, y = 0; y < v; y++) { + var C = f[y], I = C.Ba, H = C.margin, T = C.position.x, aa = C.position.y; + h.x = isNaN(T) ? -x : T - x; + h.y = isNaN(aa) ? -B : aa - B; + if (C instanceof X) { + var R = C; + if (R.rz) { + var N = R.hb / 2; + h.x -= N; + h.y -= N + } + } + h.x += H.left; + h.y += H.top; + h.width = I.width; + h.height = I.height; + C.visible && C.zc(h.x, h.y, h.width, h.height) + } + break; + case "Vertical": + for (var Z = f.length, Ea = this.padding.left, ua = this.padding.top, Oa = 0; Oa < Z; Oa++) { + var na = + Ea, Ca = f[Oa]; + if (Ca.visible) { + var ra = Ca.Ba, dc = Ca.margin, ed = dc.left + dc.right, Lf = Ea + this.padding.right, + ec = ra.width, Ve = pl(Ca, !1); + if (isNaN(Ca.xa.width) && Ve === cd || Ve === fl) ec = Math.max(e.width - ed - Lf, 0); + var Mf = ec + ed + Lf, Ta = Ca.alignment; + Ta.Lc() && (Ta = this.Tk); + Ta.pd() || (Ta = Ib); + Ca.zc(na + Ta.offsetX + dc.left + (e.width * Ta.x - Mf * Ta.x), ua + Ta.offsetY + dc.top, ec, ra.height); + ua += ra.height + dc.bottom + dc.top + } + } + break; + case "Horizontal": + for (var db = f.length, wa = this.padding.top, za = this.padding.left, lb = 0; lb < db; lb++) { + var Eb = wa, $a = f[lb]; + if ($a.visible) { + var jc = $a.Ba, ge = $a.margin, nc = ge.top + ge.bottom, Od = wa + this.padding.bottom, + he = jc.height, We = pl($a, !1); + if (isNaN($a.xa.height) && We === cd || We === el) he = Math.max(e.height - nc - Od, 0); + var pf = he + nc + Od, Pd = $a.alignment; + Pd.Lc() && (Pd = this.Tk); + Pd.pd() || (Pd = Ib); + $a.zc(za + Pd.offsetX + ge.left, Eb + Pd.offsetY + ge.top + (e.height * Pd.y - pf * Pd.y), jc.width, he); + za += jc.width + ge.left + ge.right + } + } + break; + case "Spot": + var Fb = f.length, Lb = this.If(), Ec = Lb.Ba, Mg = Ec.width, Mb = Ec.height, yb = this.padding, + fc = yb.left, mb = yb.top; + h.x = fc - e.x; + h.y = mb - e.y; + Lb.zc(h.x, h.y, Mg, Mb); + for (var ye = 0; ye < Fb; ye++) { + var Qd = f[ye]; + if (Qd !== Lb) { + var og = Qd.Ba, Nf = og.width, zb = og.height, fd = Qd.alignment; + fd.Lc() && (fd = this.Tk); + fd.pd() || (fd = Ib); + var oc = Qd.Hj; + oc.Lc() && (oc = Ib); + h.x = fd.x * Mg + fd.offsetX - (oc.x * Nf - oc.offsetX); + h.y = fd.y * Mb + fd.offsetY - (oc.y * zb - oc.offsetY); + h.x -= e.x; + h.y -= e.y; + Qd.visible && Qd.zc(fc + h.x, mb + h.y, Nf, zb) + } + } + break; + case "Auto": + var wb = f.length, Fc = this.If(), Nb = Fc.Ba, Na = u.Sf(); + Na.m(0, 0, 1, 1); + var eb = Fc.margin, Ab = eb.left, gc = eb.top, Rd = this.padding, Sd = Rd.left, qf = Rd.top; + h.x = Ab; + h.y = gc; + h.width = Nb.width; + h.height = Nb.height; + Fc.zc(Sd + h.x, qf + h.y, h.width, h.height); + var ze = Km(Fc), rf = Lm(Fc), Rb = 0 + ze.y * Nb.height + ze.offsetY, + cb = 0 + rf.x * Nb.width + rf.offsetX, pc = 0 + rf.y * Nb.height + rf.offsetY; + Na.x = 0 + ze.x * Nb.width + ze.offsetX; + Na.y = Rb; + kb(Na, cb, pc, 0, 0); + Na.x += Ab + Sd; + Na.y += gc + qf; + for (var Pc = 0; Pc < wb; Pc++) { + var gd = f[Pc]; + if (gd !== Fc) { + var ab = gd.Ba, eb = gd.margin, ub = Math.max(ab.width + eb.right + eb.left, 0), + kc = Math.max(ab.height + eb.top + eb.bottom, 0), hd = gd.alignment; + hd.Lc() && (hd = this.Tk); + hd.pd() || (hd = Ib); + h.x = + Na.width * hd.x + hd.offsetX - ub * hd.x + eb.left + Na.x; + h.y = Na.height * hd.y + hd.offsetY - kc * hd.y + eb.top + Na.y; + h.width = Na.width; + h.height = Na.height; + gd.visible && (qb(Na.x, Na.y, Na.width, Na.height, h.x, h.y, ab.width, ab.height) ? gd.zc(h.x, h.y, ab.width, ab.height) : gd.zc(h.x, h.y, ab.width, ab.height, new z(Na.x, Na.y, Na.width, Na.height))) + } + } + u.ic(Na); + break; + case "Table": + for (var Ng = f.length, Og = this.padding, Pg = Og.left, Of = Og.top, Gc = this.xr, Qc = 0, Hc = 0, nb = Gc.length, ie = 0, ob = 0; ob < nb; ob++) Gc[ob] && (ie = Math.max(ie, Gc[ob].length)); + for (var yc = + Math.min(this.ui, nb - 1); yc !== nb && (void 0 === this.yd[yc] || 0 === this.yd[yc].yb);) yc++; + for (var yc = Math.min(yc, nb - 1), Ae = -this.yd[yc].Ma, Bb = Math.min(this.hi, ie - 1); Bb !== ie && (void 0 === this.rd[Bb] || 0 === this.rd[Bb].yb);) Bb++; + for (var Bb = Math.min(Bb, ie - 1), Cb = -this.rd[Bb].Ma, id = u.ul(), ob = 0; ob < nb; ob++) if (Gc[ob]) for (var ie = Gc[ob].length, Rc = this.fd(ob), Hc = Rc.Ma + Ae + Of + Rc.$C(), Td = 0; Td < ie; Td++) if (Gc[ob][Td]) for (var Ud = this.ed(Td), Qc = Ud.Ma + Cb + Pg + Ud.$C(), Xe = Gc[ob][Td], pm = Xe.length, zi = 0; zi < pm; zi++) { + var Fa = Xe[zi], Be = Fa.Ba, + Vd = Fa instanceof A ? Fa : null; + if (null === Vd || Vd.type !== tl && Vd.type !== ul) { + id.m(0, 0); + for (var ca = 1; ca < Fa.rowSpan && !(ob + ca >= this.kt); ca++) { + var ha = this.fd(ob + ca); + id.height += ha.total + } + for (ca = 1; ca < Fa.$F && !(Td + ca >= this.ps); ca++) { + var pg = this.ed(Td + ca); + id.width += pg.total + } + var Qg = Ud.yb + id.width, yh = Rc.yb + id.height; + h.x = Qc; + h.y = Hc; + h.width = Qg; + h.height = yh; + var Sc = Qc, zh = Hc, Sb = Qg, Rg = yh; + Qc + Qg > e.width && (Sb = Math.max(e.width - Qc, 0)); + Hc + yh > e.height && (Rg = Math.max(e.height - Hc, 0)); + var Tc = Fa.alignment, je = 0, Ic = 0, jd = 0, zc = 0; + if (Tc.Lc()) { + Tc = + this.Tk; + Tc.pd() || (Tc = Ib); + var je = Tc.x, Ic = Tc.y, jd = Tc.offsetX, zc = Tc.offsetY, kd = Ud.alignment, + Pf = Rc.alignment; + kd.pd() && (je = kd.x, jd = kd.offsetX); + Pf.pd() && (Ic = Pf.y, zc = Pf.offsetY) + } else je = Tc.x, Ic = Tc.y, jd = Tc.offsetX, zc = Tc.offsetY; + if (isNaN(je) || isNaN(Ic)) Ic = je = .5, zc = jd = 0; + var ba = Be.width, ke = Be.height, Ce = Fa.margin, Tj = Ce.left + Ce.right, + Uj = Ce.top + Ce.bottom, Ac = Gl(Fa, Rc, Ud, !1); + !isNaN(Fa.xa.width) || Ac !== cd && Ac !== fl || (ba = Math.max(Qg - Tj, 0)); + !isNaN(Fa.xa.height) || Ac !== cd && Ac !== el || (ke = Math.max(yh - Uj, 0)); + var fb = Fa.af, gb = + Fa.vg, ba = Math.min(fb.width, ba), ke = Math.min(fb.height, ke), + ba = Math.max(gb.width, ba), ke = Math.max(gb.height, ke), Vj = ke + Uj; + h.x += h.width * je - (ba + Tj) * je + jd + Ce.left; + h.y += h.height * Ic - Vj * Ic + zc + Ce.top; + Fa.visible && (qb(Sc, zh, Sb, Rg, h.x, h.y, Be.width, Be.height) ? Fa.zc(h.x, h.y, ba, ke) : Fa.zc(h.x, h.y, ba, ke, new z(Sc, zh, Sb, Rg))) + } else { + Fa.Jg(); + Fa.Xb.La(); + var Qf = Fa.Xb; + Qf.x = Vd.type === tl ? Pg : Qc; + Qf.y = Vd.type === ul ? Of : Hc; + Qf.width = Be.width; + Qf.height = Be.height; + Fa.Xb.freeze(); + rl(Fa, !1) + } + } + u.Oj(id); + for (ob = 0; ob < Ng; ob++) Fa = f[ob], Vd = Fa instanceof + A ? Fa : null, null === Vd || Vd.type !== tl && Vd.type !== ul || (Qf = Fa.Xb, Fa.Hc.La(), Fa.Hc.m(0, 0, Qf.width, Qf.height), Fa.Hc.freeze()); + break; + case "Viewbox": + var qg = f[0], rg = qg.Ba, Ob = qg.margin, Rf = Ob.top + Ob.bottom, + Sf = Math.max(rg.width + (Ob.right + Ob.left), 0), Wd = Math.max(rg.height + Rf, 0), + le = qg.alignment; + le.Lc() && (le = this.Tk); + le.pd() || (le = Ib); + h.x = e.width * le.x - Sf * le.x + le.offsetX; + h.y = e.height * le.y - Wd * le.y + le.offsetY; + h.width = rg.width; + h.height = rg.height; + qg.zc(h.x, h.y, h.width, h.height); + break; + case "Link": + var qm = f.length, Ah = this instanceof + lf ? this.Kh : this; + if (Ah instanceof W) { + var De = this instanceof lf ? null : Ah.path, Ye = this.Vi.n, Cd = 0; + if (null !== De && Cd < this.Vi.count) { + var qc = Ye[Cd]; + Cd++; + De.zc(qc.x - this.vi.x, qc.y - this.vi.y, qc.width, qc.height) + } + for (var Xd = 0; Xd < qm; Xd++) { + var Wj = f[Xd]; + Wj !== De && Cd < this.Vi.count && (qc = Ye[Cd], Cd++, Wj.zc(qc.x - this.vi.x, qc.y - this.vi.y, qc.width, qc.height)) + } + var Xj = Ah.points, Ai = Xj.count; + if (2 <= Ai && this.ue) for (var Sg = this.ug; Sg.next();) { + var Bc = Sg.value, pb = Ai, me = Xj, Jc = Bc.Pf, Tg = Bc.Bw, Ee = Bc.Hj; + Ee.ne() && (Ee = Ib); + var Pb = Bc.Cw, + Bh = Bc.BE, Dd = 0, Ed = 0, Tf = 0; + if (Jc < -pb || Jc >= pb) { + var Uf = this.XD, Ze = this.WD; + Pb !== dh && (Tf = this.computeAngle(Bc, Pb, Ze), Bc.angle = Tf); + Dd = Uf.x; + Ed = Uf.y + } else { + var Fd = void 0, Vf = void 0; + if (0 <= Jc) Fd = me.n[Jc], Vf = Jc < pb - 1 ? me.n[Jc + 1] : Fd; else var ne = pb + Jc, + Fd = me.n[ne], Vf = 0 < ne ? me.n[ne - 1] : Fd; + Ze = 0 <= Jc ? Fd.Fi(Vf) : Vf.Fi(Fd); + Pb !== dh && (Tf = this.computeAngle(Bc, Pb, Ze), Bc.angle = Tf); + Dd = Fd.x + (Vf.x - Fd.x) * Tg; + Ed = Fd.y + (Vf.y - Fd.y) * Tg + } + var ld = u.jh(); + ld.reset(); + ld.scale(Bc.scale, Bc.scale); + ld.rotate(Bc.angle, 0, 0); + var Ch = Bc.Ha, Wf = u.Vj(0, 0, Ch.width, + Ch.height), Tb = u.K(); + Tb.pt(Wf, Ee); + ld.ab(Tb); + var sg = -Tb.x, tg = -Tb.y, sf = Bh.copy(); + isNaN(sf.x) && (sf.x = 0 <= Jc ? Tb.x + 3 : -(Tb.x + 3)); + isNaN(sf.y) && (sf.y = -(Tb.y + 3)); + sf.rotate(Ze); + Dd += sf.x; + Ed += sf.y; + ld.WE(Wf); + var sg = sg + Wf.x, tg = tg + Wf.y, Bi = u.fc(Dd + sg, Ed + tg); + Bc.move(Bi); + u.v(Bi); + u.v(Tb); + u.ic(Wf); + u.Ye(ld) + } + this instanceof lf ? this.Xs() : Ah.Xs() + } + break; + case "Grid": + break; + case "TableRow": + case "TableColumn": + u.k(this.toString() + " is not an element of a Table Panel.TableRow and TableColumn panels can only be elements of a Table Panel."); + break; + default: + u.k("Unknown panel type: " + t) + } + u.ic(h) + } + }; + A.prototype.Jj = function (a) { + var b = this.Ha; + if (qb(0, 0, b.width, b.height, a.x, a.y)) { + for (var b = this.ya.n, c = b.length, d = u.fc(0, 0); c--;) { + var e = b[c]; + if (e.visible || e === this.ec) if (Wa(d.set(a), e.transform), e.Aa(d)) return u.v(d), !0 + } + u.v(d); + return null === this.Ib && null === this.lc ? !1 : !0 + } + return !1 + }; + A.prototype.Vv = function (a) { + if (this.$m === a) return this; + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d].Vv(a); + if (null !== e) return e + } + return null + }; + + function Pm(a, b, c) { + c(a, b); + if (b instanceof A) { + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) Pm(a, b[e], c) + } + } + + function Kj(a, b) { + Qm(a, a, b) + } + + function Qm(a, b, c) { + c(b); + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) { + var f = b[e]; + f instanceof A && Qm(a, f, c) + } + } + + A.prototype.walkVisualTree = function (a) { + Rm(this, this, a) + }; + + function Rm(a, b, c) { + c(b); + if (b instanceof A) { + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) Rm(a, b[e], c) + } + } + + A.prototype.findInVisualTree = A.prototype.vs = function (a) { + return Sm(this, this, a) + }; + + function Sm(a, b, c) { + if (c(b)) return b; + if (b instanceof A) { + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) { + var f = Sm(a, b[e], c); + if (null !== f) return f + } + } + return null + } + + A.prototype.findObject = A.prototype.je = function (a) { + if (this.name === a) return this; + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d]; + if (e.name === a) return e; + if (e instanceof A) if (null === e.gi && null === e.Zf) { + if (e = e.je(a), null !== e) return e + } else if (sk(e) && (e = e.ya.first(), null !== e && (e = e.je(a), null !== e))) return e + } + return null + }; + + function Tm(a) { + a = a.ya.n; + for (var b = a.length, c = 0, d = 0; d < b; d++) { + var e = a[d]; + if (e instanceof A) c = Math.max(c, Tm(e)); else if (e instanceof X) { + a:{ + if (!e.Rg) switch (e.tn) { + case "None": + case "Square": + case "Ellipse": + case "Circle": + case "LineH": + case "LineV": + case "FramedRectangle": + case "RoundedRectangle": + case "Line1": + case "Line2": + case "Border": + case "Cube1": + case "Cube2": + case "Junction": + case "Cylinder1": + case "Cylinder2": + case "Cylinder3": + case "Cylinder4": + case "PlusLine": + case "XLine": + case "ThinCross": + case "ThickCross": + e = + 0; + break a + } + e = e.Sg / 2 * e.gm * e.Hi() + } + c = Math.max(c, e) + } + } + return c + } + + g = A.prototype; + g.Tf = function () { + return !(this.type === tl || this.type === ul) + }; + g.ke = function (a, b, c) { + if (!1 === this.Ag) return null; + void 0 === b && (b = null); + void 0 === c && (c = null); + if (Bj(this)) return null; + var d = this.Ha, e = 1 / this.Hi(), f = this.Tf(), h = f ? a : Wa(u.fc(a.x, a.y), this.transform), k = this.g, + l = 10, m = 5; + null !== k && (l = k.gz("extraTouchArea"), m = l / 2); + if (qb(-(m * e), -(m * e), d.width + l * e, d.height + l * e, h.x, h.y)) { + if (!this.Kg) { + var e = this.ya.n, n = e.length, k = u.K(), m = (l = this.LD) ? this.If() : null; + if (l && (m.Tf() ? Wa(k.set(a), m.transform) : k.set(a), !m.Aa(k))) return u.v(k), f || u.v(h), null; + for (; n--;) { + var p = e[n]; + if (p.visible || + p === this.ec) if (p.Tf() ? Wa(k.set(a), p.transform) : k.set(a), !l || p !== m) { + var q = null; + p instanceof A ? q = p.ke(k, b, c) : !0 === p.Ag && p.Aa(k) && (q = p); + if (null !== q && (null !== b && (q = b(q)), null !== q && (null === c || c(q)))) return u.v(k), f || u.v(h), q + } + } + u.v(k) + } + if (null === this.background && null === this.nm) return f || u.v(h), null; + a = qb(0, 0, d.width, d.height, h.x, h.y) ? this : null; + f || u.v(h); + return a + } + f || u.v(h); + return null + }; + g.ys = function (a, b, c, d) { + if (!1 === this.Ag) return !1; + void 0 === b && (b = null); + void 0 === c && (c = null); + d instanceof E || d instanceof F || (d = new E(S)); + var e = this.Ha, f = this.Tf(), h = f ? a : Wa(u.fc(a.x, a.y), this.transform); + if (qb(0, 0, e.width, e.height, h.x, h.y)) { + if (!this.Kg) { + for (var e = this.ya.n, k = e.length, l = u.K(); k--;) { + var m = e[k]; + if (m.visible || m === this.ec) { + m.Tf() ? Wa(l.set(a), m.transform) : l.set(a); + var n = m, m = m instanceof A ? m : null; + (null !== m ? m.ys(l, b, c, d) : n.Aa(l)) && !1 !== n.Ag && (null !== b && (n = b(n)), null === n || null !== c && !c(n) || d.add(n)) + } + } + u.v(l) + } + f || + u.v(h); + return null !== this.background || null !== this.nm + } + f || u.v(h); + return !1 + }; + g.Nj = function (a, b, c, d, e, f) { + if (!1 === this.Ag) return !1; + void 0 === b && (b = null); + void 0 === c && (c = null); + var h = f; + void 0 === f && (h = u.jh(), h.reset()); + h.multiply(this.transform); + if (this.sm(a, h)) return Um(this, b, c, e), void 0 === f && u.Ye(h), !0; + if (this.sg(a, h)) { + if (!this.Kg) for (var k = this.ya.n, l = k.length; l--;) { + var m = k[l]; + if (m.visible || m === this.ec) { + var n = m.ba, p = this.Ha; + if (!(n.x > p.width || n.y > p.height || 0 > n.x + n.width || 0 > n.y + n.height)) { + n = m; + m = m instanceof A ? m : null; + p = u.jh(); + p.set(h); + if (null !== m ? m.Nj(a, b, c, d, e, p) : ol(n, a, d, p)) null !== + b && (n = b(n)), null === n || null !== c && !c(n) || e.add(n); + u.Ye(p) + } + } + } + void 0 === f && u.Ye(h); + return d + } + void 0 === f && u.Ye(h); + return !1 + }; + + function Um(a, b, c, d) { + for (var e = a.ya.n, f = e.length; f--;) { + var h = e[f]; + if (h.visible) { + var k = h.ba, l = a.Ha; + k.x > l.width || k.y > l.height || 0 > k.x + k.width || 0 > k.y + k.height || (h instanceof A && Um(h, b, c, d), null !== b && (h = b(h)), null === h || null !== c && !c(h) || d.add(h)) + } + } + } + + g.ym = function (a, b, c, d, e, f) { + if (!1 === this.Ag) return !1; + void 0 === c && (c = null); + void 0 === d && (d = null); + var h = this.Ha, k = this.Tf(), l = k ? a : Wa(u.fc(a.x, a.y), this.transform), + m = k ? b : Wa(u.fc(b.x, b.y), this.transform), n = l.Lj(m), + p = 0 < l.x && l.x < h.width && 0 < l.y && l.y < h.height || Xa(l.x, l.y, 0, 0, 0, h.height) < n || Xa(l.x, l.y, 0, h.height, h.width, h.height) < n || Xa(l.x, l.y, h.width, h.height, h.width, 0) < n || Xa(l.x, l.y, h.width, 0, 0, 0) < n, + h = 0 < l.x && l.x < h.width && 0 < l.y && l.y < h.height && Xa(l.x, l.y, 0, 0, 0, h.height) < n && Xa(l.x, l.y, 0, h.height, h.width, h.height) < + n && Xa(l.x, l.y, h.width, h.height, h.width, 0) < n && Xa(l.x, l.y, h.width, 0, 0, 0) < n; + k || (u.v(l), u.v(m)); + if (p) { + if (!this.Kg) { + k = u.K(); + l = u.K(); + m = this.ya.n; + for (n = m.length; n--;) { + var q = m[n]; + if (q.visible || q === this.ec) { + var r = q.ba, s = this.Ha; + r.x > s.width || r.y > s.height || 0 > r.x + r.width || 0 > r.y + r.height || (q.Tf() ? (r = q.transform, Wa(k.set(a), r), Wa(l.set(b), r)) : (k.set(a), l.set(b)), r = q, q = q instanceof A ? q : null, null !== q ? !q.ym(k, l, c, d, e, f) : !r.sD(k, l, e)) || (null !== c && (r = c(r)), null === r || null !== d && !d(r) || f.add(r)) + } + } + u.v(k); + u.v(l) + } + return e ? + p : h + } + return !1 + }; + + function Km(a) { + var b = a.A; + if (void 0 === b || b === uc) b = null; + null === b && a instanceof X && (a = a.Pa, null !== a && (b = a.A)); + null === b && (b = xb); + return b + } + + function Lm(a) { + var b = a.B; + if (void 0 === b || b === uc) b = null; + null === b && a instanceof X && (a = a.Pa, null !== a && (b = a.B)); + null === b && (b = Vb); + return b + } + + A.prototype.add = A.prototype.add = function (a) { + u.C(a, S, A, "add:element"); + this.Yd(this.ya.count, a) + }; + A.prototype.elt = A.prototype.ja = function (a) { + return this.ya.ja(a) + }; + A.prototype.insertAt = A.prototype.Yd = function (a, b) { + b instanceof G && u.k("Cannot add a Part to a Panel: " + b); + if (this === b || this.gl(b)) this === b && u.k("Cannot make a Panel contain itself: " + this.toString()), u.k("Cannot make a Panel indirectly contain itself: " + this.toString() + " already contains " + b.toString()); + var c = b.S; + null !== c && c !== this && u.k("Cannot add a GraphObject that already belongs to another Panel to this Panel: " + b.toString() + ", already contained by " + c.toString() + ", cannot be shared by this Panel: " + + this.toString()); + this.oa !== bj || b instanceof X || u.k("Can only add Shapes to a Grid Panel, not: " + b); + b.ql(this); + b.Wl = null; + if (null !== this.QD) { + var d = b.data; + null !== d && "object" === typeof d && (null === this.Yf && (this.Yf = new la(Object, A)), this.Yf.add(d, b)) + } + var e = this.ya, d = -1; + if (c === this) { + for (var f = -1, h = this.ya.n, k = h.length, l = 0; l < k; l++) if (h[l] === b) { + f = l; + break + } + if (-1 !== f) { + if (f === a || f + 1 >= e.count && a >= e.count) return; + e.hd(f); + d = f + } else u.k("element " + b.toString() + " has panel " + c.toString() + " but is not contained by it.") + } + if (0 > + a || a > e.count) a = e.count; + e.Yd(a, b); + this.R(); + b.R(); + null !== b.Jd ? this.xh = !0 : b instanceof A && !0 === b.xh && (this.xh = !0); + c = this.T; + null !== c && (c.Bk = null, c.kj = NaN, this.xh && c instanceof U && (c.xh = !0), c.xh && (c.Qd = null), e = this.g, null !== e && e.ha.gb || (-1 !== d && c.Dc(ce, "elements", this, b, null, d, null), c.Dc(be, "elements", this, null, b, null, a))) + }; + A.prototype.remove = A.prototype.remove = function (a) { + u.C(a, S, A, "remove:element"); + for (var b = this.ya.n, c = b.length, d = -1, e = 0; e < c; e++) if (b[e] === a) { + d = e; + break + } + -1 !== d && this.Fe(d) + }; + A.prototype.removeAt = A.prototype.hd = function (a) { + 0 <= a && this.Fe(a) + }; + A.prototype.Fe = function (a) { + var b = this.ya, c = b.ja(a); + c.Wl = null; + c.ql(null); + if (null !== this.Yf) { + var d = c.data; + "object" === typeof d && this.Yf.remove(d) + } + b.hd(a); + uj(this, !1); + this.R(); + this.hm === c && (this.hm = null); + b = this.T; + null !== b && (b.Bk = null, b.kj = NaN, d = this.g, null !== d && d.ha.gb || b.Dc(ce, "elements", this, c, null, a, null)) + }; + u.u(A, {kt: "rowCount"}, function () { + return void 0 === this.yd ? 0 : this.yd.length + }); + A.prototype.getRowDefinition = A.prototype.fd = function (a) { + 0 > a && u.wa(a, ">= 0", A, "getRowDefinition:idx"); + a = Math.round(a); + var b = this.yd; + if (void 0 === b[a]) { + var c = new Se; + c.ql(this); + c.ae = !0; + c.index = a; + b[a] = c + } + return b[a] + }; + A.prototype.removeRowDefinition = A.prototype.oE = function (a) { + 0 > a && u.wa(a, ">= 0", A, "removeRowDefinition:idx"); + a = Math.round(a); + var b = this.yd; + this.Dc(ce, "coldefs", this, b[a], null, a, null); + b[a] && delete b[a]; + this.R() + }; + u.u(A, {ps: "columnCount"}, function () { + return void 0 === this.rd ? 0 : this.rd.length + }); + A.prototype.getColumnDefinition = A.prototype.ed = function (a) { + 0 > a && u.wa(a, ">= 0", A, "getColumnDefinition:idx"); + a = Math.round(a); + var b = this.rd; + if (void 0 === b[a]) { + var c = new Se; + c.ql(this); + c.ae = !1; + c.index = a; + b[a] = c + } + return b[a] + }; + A.prototype.removeColumnDefinition = A.prototype.kE = function (a) { + 0 > a && u.wa(a, ">= 0", A, "removeColumnDefinition:idx"); + a = Math.round(a); + var b = this.rd; + this.Dc(ce, "coldefs", this, b[a], null, a, null); + b[a] && delete b[a]; + this.R() + }; + u.defineProperty(A, {bI: "rowSizing"}, function () { + return void 0 === this.am ? Gm : this.am + }, function (a) { + if (void 0 !== this.am) { + var b = this.am; + b !== a && (a !== Gm && a !== Nm && u.k("rowSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"), this.am = a, this.R(), this.h("rowSizing", b, a)) + } + }); + u.defineProperty(A, {ZF: "columnSizing"}, function () { + return void 0 === this.Al ? Gm : this.Al + }, function (a) { + if (void 0 !== this.Al) { + var b = this.Al; + b !== a && (a !== Gm && a !== Nm && u.k("columnSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"), this.Al = a, this.R(), this.h("columnSizing", b, a)) + } + }); + u.defineProperty(A, {CK: "topIndex"}, function () { + return void 0 === this.ui ? 0 : this.ui + }, function (a) { + if (void 0 !== this.ui) { + var b = this.ui; + b !== a && ((!isFinite(a) || 0 > a) && u.k("topIndex must be greater than zero and a real number. Was " + a), this.ui = a, this.R(), this.h("topIndex", b, a)) + } + }); + u.defineProperty(A, {OJ: "leftIndex"}, function () { + return void 0 === this.hi ? 0 : this.hi + }, function (a) { + if (void 0 !== this.hi) { + var b = this.hi; + b !== a && ((!isFinite(a) || 0 > a) && u.k("leftIndex must be greater than zero and a real number. Was " + a), this.hi = a, this.R(), this.h("leftIndex", b, a)) + } + }); + A.prototype.findRowForLocalY = function (a) { + if (0 > a) return -1; + if (this.type !== Fl) return NaN; + for (var b = 0, c = this.yd, d = c.length, e = this.ui; e < d; e++) { + var f = c[e]; + if (void 0 !== f && (b += f.total, a < b)) return e + } + return -1 + }; + A.prototype.findColumnForLocalX = function (a) { + if (0 > a) return -1; + if (this.type !== Fl) return NaN; + for (var b = 0, c = this.rd, d = c.length, e = this.hi; e < d; e++) { + var f = c[e]; + if (void 0 !== f && (b += f.total, a < b)) return e + } + return -1 + }; + u.defineProperty(A, {data: "data"}, function () { + return this.qh + }, function (a) { + var b = this.qh; + if (b !== a) { + var c = this instanceof G && !(this instanceof lf); + c && u.j(a, "object", A, "data"); + nf(this); + this.qh = a; + var d = this.g; + null !== d && (c ? this instanceof W ? (null !== b && d.lk.remove(b), null !== a && d.lk.add(a, this)) : (null !== b && d.$h.remove(b), null !== a && d.$h.add(a, this)) : (c = this.S, null !== c && null !== c.Yf && (null !== b && c.Yf.remove(b), null !== a && c.Yf.add(a, this)))); + this.h("data", b, a); + null !== d && d.ha.gb || null !== a && this.Nb() + } + }); + u.defineProperty(A, {iH: "itemIndex"}, function () { + return this.uq + }, function (a) { + var b = this.uq; + b !== a && (this.uq = a, this.h("itemIndex", b, a)) + }); + + function Pl(a) { + a = a.yl; + return null !== a && a.Ca + } + + function nf(a) { + var b = a.yl; + if (null === b) null !== a.data && u.k("Template cannot have .data be non-null: " + a), a.yl = b = new E(bf); else if (b.Ca) return; + var c = new E(S); + Pm(a, a, function (a, d) { + var e = d.Gc; + if (null !== e) for (Jl(d, !1), e = e.i; e.next();) { + var f = e.value; + f.mode === df && Jl(d, !0); + if (null !== f.Nm) { + var h = ef(f, a, d); + null !== h && (c.add(h), null === h.$n && (h.$n = new E(bf)), h.$n.add(f)) + } + b.add(f) + } + if (d instanceof A && d.type === Fl) { + if (0 < d.yd.length) for (e = d.yd, f = e.length, h = 0; h < f; h++) { + var k = e[h]; + if (void 0 !== k && null !== k.Gc) for (var l = + k.Gc.i; l.next();) { + var v = l.value; + v.fg = k; + v.Ay = 2; + v.mv = k.index; + b.add(v) + } + } + if (0 < d.rd.length) for (e = d.rd, f = e.length, h = 0; h < f; h++) if (k = e[h], void 0 !== k && null !== k.Gc) for (l = k.Gc.i; l.next();) v = l.value, v.fg = k, v.Ay = 1, v.mv = k.index, b.add(v) + } + }); + for (var d = c.i; d.next();) { + var e = d.value; + if (null !== e.$n) { + Jl(e, !0); + for (var f = e.$n.i; f.next();) { + var h = f.value; + null === e.Gc && (e.Gc = new E(bf)); + e.Gc.add(h) + } + } + e.$n = null + } + for (d = b.i; d.next();) if (e = d.value, f = e.fg, null !== f) { + e.fg = null; + var k = e.Lw, l = k.indexOf("."); + 0 < l && f instanceof A && (h = k.substring(0, + l), k = k.substr(l + 1), l = f.je(h), null !== l ? (f = l, e.Lw = k) : u.trace('Warning: unable to find GraphObject named "' + h + '" for Binding: ' + e.toString())); + f instanceof Se ? (e.tl = u.Uc(f.S), f.S.$m = e.tl) : (e.tl = u.Uc(f), f.$m = e.tl) + } + b.freeze(); + a instanceof G && a.Fd() && (Ph(a, Infinity, Infinity), a.zc()) + } + + A.prototype.updateTargetBindings = A.prototype.Nb = function (a) { + var b = this.yl; + if (null !== b) for (void 0 === a && (a = ""), b = b.i; b.next();) { + var c = b.value, d = c.LE; + if ("" === a || "" === d || d === a) if (d = c.Lw, null !== c.eG || "" !== d) { + var d = this.data, e = c.Nm; + if (null !== e) d = "" === e ? this : "." === e ? this : ".." === e ? this : this.je(e); else { + var f = this.g; + null !== f && c.xt && (d = f.ga.Zs) + } + if (null !== d) { + var f = this, h = c.tl; + if (-1 !== h) { + if (f = this.Vv(h), null === f) continue + } else null !== c.fg && (f = c.fg); + "." === e ? d = f : ".." === e && (d = f.S); + e = c.Ay; + if (0 !== e) { + if (!(f instanceof + A)) continue; + h = f; + 1 === e ? f = h.ed(c.mv) : 2 === e && (f = h.fd(c.mv)) + } + void 0 !== f && c.ZE(f, d) + } + } + } + }; + u.defineProperty(A, {QD: "itemArray"}, function () { + return this.gi + }, function (a) { + var b = this.gi; + if (b !== a) { + var c = this.g; + null !== c && null !== b && Qj(c, this); + this.gi = a; + null !== c && null !== a && Mj(c, this); + this.h("itemArray", b, a); + null !== c && c.ha.gb || this.Rz() + } + }); + + function sk(a) { + return a.type === oh || a.type === Yi || a.type === ah || a.type === Fl && 0 < a.ya.length && (a = a.ya.ja(0), a.tg && a instanceof A && (a.type === tl || a.type === ul)) ? !0 : !1 + } + + A.prototype.rebuildItemElements = A.prototype.Rz = function () { + var a = 0; + for (sk(this) && (a = 1); this.ya.length > a;) this.Fe(a); + a = this.QD; + if (null !== a) for (var b = u.qb(a), c = 0; c < b; c++) rk(this, u.fb(a, c), c) + }; + + function rk(a, b, c) { + if (!(void 0 === b || null === b || 0 > c)) { + var d = a.getCategoryForItemData(b, c), d = a.findTemplateForItemData(b, c, d); + if (null !== d) { + nf(d); + d = d.copy(); + "object" === typeof b && (null === a.Yf && (a.Yf = new la(Object, A)), a.Yf.add(b, d)); + var e = c; + sk(a) && e++; + a.Yd(e, d); + tk(a, e, c); + d.data = b + } + } + } + + function tk(a, b, c) { + for (a = a.ya; b < a.length;) { + var d = a.ja(b); + if (d instanceof A) { + var e = b, f = c; + d.type === tl ? d.rc = e : d.type === ul && (d.column = e); + d.iH = f + } + b++; + c++ + } + } + + function vi(a) { + a = a.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + if (d instanceof Vm || d instanceof A && vi(d)) return !0 + } + return !1 + } + + u.defineProperty(A, {LJ: "itemTemplate"}, function () { + return null === this.Zf ? null : this.Zf.ta("") + }, function (a) { + if (null === this.Zf) { + if (null === a) return; + this.Zf = new la("string", A) + } + var b = this.Zf.ta(""); + b !== a && (u.C(a, A, A, "itemTemplate"), (a instanceof G || a.tg) && u.k("itemTemplate must not be a Part or be Panel.isPanelMain: " + a), this.Zf.add("", a), this.h("itemTemplate", b, a), a = this.g, null !== a && a.ha.gb || this.Rz()) + }); + u.defineProperty(A, {jH: "itemTemplateMap"}, function () { + return this.Zf + }, function (a) { + var b = this.Zf; + if (b !== a) { + u.C(a, la, A, "itemTemplateMap"); + for (var c = a.i; c.next();) { + var d = c.value; + (d instanceof G || d.tg) && u.k("Template in itemTemplateMap must not be a Part or be Panel.isPanelMain: " + d) + } + this.Zf = a; + this.h("itemTemplateMap", b, a); + a = this.g; + null !== a && a.ha.gb || this.Rz() + } + }); + u.defineProperty(A, {KJ: "itemCategoryProperty"}, function () { + return this.Hn + }, function (a) { + var b = this.Hn; + b !== a && ("string" !== typeof a && "function" !== typeof a && u.Kd(a, "string or function", A, "itemCategoryProperty"), this.Hn = a, this.h("itemCategoryProperty", b, a)) + }); + A.prototype.getCategoryForItemData = function (a) { + if (null === a) return ""; + var b = this.Hn, c = ""; + if ("function" === typeof b) c = b(a); else if ("string" === typeof b && "object" === typeof a) { + if ("" === b) return ""; + c = u.sb(a, b) + } else return ""; + if (void 0 === c) return ""; + if ("string" === typeof c) return c; + u.k("Panel.getCategoryForItemData found a non-string category for " + a + ": " + c); + return "" + }; + var Wm = !1, Xm = null; + A.prototype.findTemplateForItemData = function (a, b, c) { + a = this.jH; + b = null; + null !== a && (b = a.ta(c)); + null === b && (Wm || (Wm = !0, u.trace('No item template Panel found for category "' + c + '" on ' + this), u.trace(" Using default item template."), c = new A, a = new qa, a.bind(new bf("text", "", de)), c.add(a), Xm = c), b = Xm); + return b + }; + u.defineProperty(A, {DJ: "isAtomic"}, function () { + return this.Kg + }, function (a) { + var b = this.Kg; + b !== a && (u.j(a, "boolean", A, "isAtomic"), this.Kg = a, this.h("isAtomic", b, a)) + }); + u.defineProperty(A, {LD: "isClipping"}, function () { + return this.gq + }, function (a) { + var b = this.gq; + b !== a && (u.j(a, "boolean", A, "isClipping"), this.gq = a, this.h("isClipping", b, a)) + }); + + function Se() { + u.gc(this); + this.Pg = null; + this.xu = !0; + this.ud = 0; + this.Qe = NaN; + this.oj = 0; + this.mj = Infinity; + this.se = uc; + this.Ma = this.yb = 0; + this.Gc = null; + this.Jr = Ym; + this.Hh = dl; + this.Gr = this.wj = null; + this.Hr = NaN; + this.Ib = this.Dh = null; + this.Ip = !1 + } + + u.fa("RowColumnDefinition", Se); + Se.prototype.copy = function () { + var a = new Se; + a.xu = this.xu; + a.ud = this.ud; + a.Qe = this.Qe; + a.oj = this.oj; + a.mj = this.mj; + a.se = this.se; + a.yb = this.yb; + a.Ma = this.Ma; + a.Hh = this.Hh; + a.Jr = this.Jr; + a.wj = null === this.wj ? null : this.wj.Z(); + a.Gr = this.Gr; + a.Hr = this.Hr; + a.Dh = null; + null !== this.Dh && (a.Dh = u.Pk(this.Dh)); + a.Ib = this.Ib; + a.Ip = this.Ip; + a.Gc = this.Gc; + return a + }; + Se.prototype.qs = function (a) { + u.C(a, Se, Se, "copyFrom:pd"); + a.ae ? this.height = a.height : this.width = a.width; + this.Ki = a.Ki; + this.Kf = a.Kf; + this.alignment = a.alignment; + this.stretch = a.stretch; + this.st = a.st; + this.wj = null === a.wj ? null : a.wj.Z(); + this.dp = a.dp; + this.ep = a.ep; + this.Dh = null; + a.Dh && (this.Dh = u.Pk(a.Dh)); + this.background = a.background; + this.Zy = a.Zy; + this.Gc = a.Gc + }; + Se.prototype.toString = function () { + return "RowColumnDefinition " + (this.ae ? "(Row " : "(Column ") + this.index + ") #" + u.Uc(this) + }; + var Ym; + Se.Default = Ym = u.s(Se, "Default", 0); + var Nm; + Se.None = Nm = u.s(Se, "None", 1); + var Gm; + Se.ProportionalExtra = Gm = u.s(Se, "ProportionalExtra", 2); + Se.prototype.ql = function (a) { + this.Pg = a + }; + Se.prototype.computeEffectiveSpacingTop = Se.prototype.$C = function () { + var a = 0; + if (0 !== this.index) { + var b = this.Pg, c = this.dp; + null === c && null !== b && (c = this.ae ? b.ai : b.rh); + null !== c && (a = this.ep, isNaN(a) && (a = null !== b ? this.ae ? b.th : b.sh : 0)) + } + b = this.DE; + if (null === b) if (b = this.Pg, null !== b) b = b.Xi; else return a; + return a + (this.ae ? b.top : b.left) + }; + Se.prototype.computeEffectiveSpacing = Se.prototype.lg = function () { + var a = 0; + if (0 !== this.index) { + var b = this.Pg, c = this.dp; + null === c && null !== b && (c = this.ae ? b.ai : b.rh); + null !== c && (a = this.ep, isNaN(a) && (a = null !== b ? this.ae ? b.th : b.sh : 0)) + } + b = this.DE; + if (null === b) if (b = this.Pg, null !== b) b = b.Xi; else return a; + return a + (this.ae ? b.top + b.bottom : b.left + b.right) + }; + Se.prototype.Rc = function (a, b, c, d, e) { + var f = this.Pg; + if (null !== f && (f.Dc($d, a, this, b, c, d, e), null !== this.Gc && (b = f.zo(), null !== b && (b = b.data, null !== b)))) for (c = this.Gc.i; c.next();) c.value.Mw(this, b, a, null) + }; + u.u(Se, {S: "panel"}, function () { + return this.Pg + }); + u.defineProperty(Se, {ae: "isRow"}, function () { + return this.xu + }, function (a) { + this.xu = a + }); + u.defineProperty(Se, {index: "index"}, function () { + return this.ud + }, function (a) { + this.ud = a + }); + u.defineProperty(Se, {height: "height"}, function () { + return this.Qe + }, function (a) { + var b = this.Qe; + b !== a && (0 > a && u.wa(a, ">= 0", Se, "height"), this.Qe = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("height", b, a)) + }); + u.defineProperty(Se, {width: "width"}, function () { + return this.Qe + }, function (a) { + var b = this.Qe; + b !== a && (0 > a && u.wa(a, ">= 0", Se, "width"), this.Qe = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("width", b, a)) + }); + u.defineProperty(Se, {Ki: "minimum"}, function () { + return this.oj + }, function (a) { + var b = this.oj; + b !== a && ((0 > a || !isFinite(a)) && u.wa(a, ">= 0", Se, "minimum"), this.oj = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("minimum", b, a)) + }); + u.defineProperty(Se, {Kf: "maximum"}, function () { + return this.mj + }, function (a) { + var b = this.mj; + b !== a && (0 > a && u.wa(a, ">= 0", Se, "maximum"), this.mj = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("maximum", b, a)) + }); + u.defineProperty(Se, {alignment: "alignment"}, function () { + return this.se + }, function (a) { + var b = this.se; + b.L(a) || (this.se = a.Z(), null !== this.S && this.S.R(), this.Rc("alignment", b, a)) + }); + u.defineProperty(Se, {stretch: "stretch"}, function () { + return this.Hh + }, function (a) { + var b = this.Hh; + b !== a && (this.Hh = a, null !== this.S && this.S.R(), this.Rc("stretch", b, a)) + }); + u.defineProperty(Se, {DE: "separatorPadding"}, function () { + return this.wj + }, function (a) { + "number" === typeof a && (a = new rb(a)); + var b = this.wj; + null !== a && null !== b && b.L(a) || (null !== a && (a = a.Z()), this.wj = a, null !== this.S && this.S.R(), this.Rc("separatorPadding", b, a)) + }); + u.defineProperty(Se, {dp: "separatorStroke"}, function () { + return this.Gr + }, function (a) { + var b = this.Gr; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.Gr = a, null !== this.S && this.S.R(), this.Rc("separatorStroke", b, a)) + }); + u.defineProperty(Se, {ep: "separatorStrokeWidth"}, function () { + return this.Hr + }, function (a) { + var b = this.Hr; + b !== a && (this.Hr = a, null !== this.S && this.S.R(), this.Rc("separatorStrokeWidth", b, a)) + }); + u.defineProperty(Se, {gI: "separatorDashArray"}, function () { + return this.Dh + }, function (a) { + var b = this.Dh; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", Se, "separatorDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("separatorDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.Dh = a; + null !== this.S && this.S.ma(); + this.Rc("separatorDashArray", b, a) + } + }); + u.defineProperty(Se, {background: "background"}, function () { + return this.Ib + }, function (a) { + var b = this.Ib; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.Ib = a, null !== this.S && this.S.ma(), this.Rc("background", b, a)) + }); + u.defineProperty(Se, {Zy: "coversSeparators"}, function () { + return this.Ip + }, function (a) { + var b = this.Ip; + b !== a && (u.j(a, "boolean", Se, "coversSeparators"), this.Ip = a, null !== this.S && this.S.ma(), this.Rc("coversSeparators", b, a)) + }); + u.defineProperty(Se, {st: "sizing"}, function () { + return this.Jr + }, function (a) { + var b = this.Jr; + b !== a && (this.Jr = a, null !== this.S && this.S.R(), this.Rc("sizing", b, a)) + }); + + function Mm(a) { + if (a.st === Ym) { + var b = a.Pg; + return a.ae ? b.bI : b.ZF + } + return a.st + } + + u.defineProperty(Se, {Qa: "actual"}, function () { + return this.yb + }, function (a) { + this.yb = isNaN(this.Qe) ? Math.max(Math.min(this.mj, a), this.oj) : Math.max(Math.min(this.mj, this.Qe), this.oj) + }); + u.defineProperty(Se, {total: "total"}, function () { + return this.yb + this.lg() + }, function (a) { + this.yb = isNaN(this.Qe) ? Math.max(Math.min(this.mj, a), this.oj) : Math.max(Math.min(this.mj, this.Qe), this.oj); + this.yb = Math.max(0, this.yb - this.lg()) + }); + u.defineProperty(Se, {position: "position"}, function () { + return this.Ma + }, function (a) { + this.Ma = a + }); + Se.prototype.bind = Se.prototype.bind = function (a) { + a.fg = this; + var b = this.S; + null !== b && (b = b.zo(), null !== b && Pl(b) && u.k("Cannot add a Binding to a RowColumnDefinition that is already frozen: " + a)); + null === this.Gc && (this.Gc = new E(bf)); + this.Gc.add(a) + }; + + function X() { + S.call(this); + this.Pa = null; + this.tn = "None"; + this.Rg = !1; + this.Zp = dl; + this.jk = null; + this.yc = this.jd = "black"; + this.Sg = 1; + this.co = "butt"; + this.eo = "miter"; + this.gm = 10; + this.fm = null; + this.cd = 0; + this.si = this.ri = uc; + this.dr = this.cr = NaN; + this.hq = !1; + this.nq = !0; + this.gr = null; + this.wn = this.fo = "None"; + this.eq = 1 + } + + u.Ga(X, S); + u.fa("Shape", X); + X.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.Pa = this.Pa; + a.tn = this.tn; + a.Rg = this.Rg; + a.Zp = this.Zp; + a.jk = this.jk; + a.jd = this.jd; + a.yc = this.yc; + a.Sg = this.Sg; + a.co = this.co; + a.eo = this.eo; + a.gm = this.gm; + a.fm = null; + null !== this.fm && (a.fm = u.Pk(this.fm)); + a.cd = this.cd; + a.ri = this.ri.Z(); + a.si = this.si.Z(); + a.cr = this.cr; + a.dr = this.dr; + a.hq = this.hq; + a.nq = this.nq; + a.gr = this.gr; + a.fo = this.fo; + a.wn = this.wn; + a.eq = this.eq + }; + X.prototype.toString = function () { + return "Shape(" + ("None" !== this.Fb ? this.Fb : "None" !== this.jp ? this.jp : this.ez) + ")#" + u.Uc(this) + }; + + function Zm(a, b, c, d) { + var e = .001, f = d.Ba, h = f.width, f = f.height, k = 0, l = 0, m = 0, n = 0, e = c.length; + if (!(4 > e)) { + for (var k = c[0], l = c[1], p = 0, q = 0, r = 0, s = m = 0, t = q = 0, v = u.eb(), x = 2; x < e; x += 2) m = c[x], n = c[x + 1], p = m - k, q = n - l, 0 === p && (p = .001), r = q / p, s = Math.atan2(q, p), q = Math.sqrt(p * p + q * q), k = [], k[0] = p, k[1] = s, k[2] = r, k[3] = q, v.push(k), t += q, k = m, l = n; + k = c[0]; + l = c[1]; + c = 0; + for (var e = h, n = h / 2, x = 0 === n ? !1 : !0, q = 0, m = v[q], p = m[0], s = m[1], r = m[2], m = m[3], B = 0; .1 <= t;) { + 0 === B && (x ? (e = h, c++, e -= n, t -= n, x = !1) : (e = h, c++), 0 === e && (e = 1)); + if (e > t) { + u.ra(v); + return + } + e > m ? (B = + e - m, e = m) : B = 0; + var y = Math.sqrt(e * e / (1 + r * r)); + 0 > p && (y = -y); + k += y; + l += r * y; + a.translate(k, l); + a.rotate(s); + a.translate(-(h / 2), -(f / 2)); + 0 === B && d.Mj(a, b); + a.translate(h / 2, f / 2); + a.rotate(-s); + a.translate(-k, -l); + t -= e; + m -= e; + if (0 !== B) { + q++; + if (q === v.length) { + u.ra(v); + return + } + m = v[q]; + p = m[0]; + s = m[1]; + r = m[2]; + m = m[3]; + e = B + } + } + u.ra(v) + } + } + + X.prototype.Mj = function (a, b) { + if (null !== this.yc || null !== this.jd) { + null !== this.jd && yl(this, a, this.jd, !0, !1); + null !== this.yc && yl(this, a, this.yc, !1, !1); + var c = this.Sg; + if (0 === c) { + var d = this.T; + d instanceof lf && d.type === ah && d.vc instanceof X && (c = d.vc.hb) + } + a.lineWidth = c; + a.lineJoin = this.eo; + a.lineCap = this.co; + a.miterLimit = this.gm; + var e = !1; + this.T && b.Qg.drawShadows && (e = this.T.il); + var f = !0; + null !== this.yc && null === this.jd && (f = !1); + var d = !1, h = !0, k = this.gA; + null !== k && (d = !0, void 0 !== a.setLineDash ? (a.setLineDash(k), a.lineDashOffset = + this.cd) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = k, a.webkitLineDashOffset = this.cd) : void 0 !== a.mozDash ? (a.mozDash = k, a.mozDashOffset = this.cd) : h = !1); + var l = this.Pa; + if (null !== l) { + if (l.oa === dd) a.beginPath(), d && !h ? kl(a, l.nc, l.uc, l.pb, l.Bb, k, this.cd) : (a.moveTo(l.nc, l.uc), a.lineTo(l.pb, l.Bb)), null !== this.jd && zl(a, this.jd), 0 !== c && null !== this.yc && Bl(a); else if (l.oa === md) { + var m = l.nc, n = l.uc, p = l.pb, q = l.Bb, l = Math.min(m, p), r = Math.min(n, q), + m = Math.abs(p - m), n = Math.abs(q - n); + null !== this.jd && (a.beginPath(), a.rect(l, + r, m, n), zl(a, this.jd)); + if (null !== this.yc) { + var s = p = 0, t = 0; + f && e && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0); + d && !h ? (h = u.eb(), h.push(l), h.push(r), h.push(l + m), h.push(r), h.push(l + m), h.push(r + n), h.push(l), h.push(r + n), h.push(l), h.push(r), a.beginPath(), $m(a, h, k, this.cd), Bl(a), u.ra(h)) : 0 !== c && (a.beginPath(), a.rect(l, r, m, n), Bl(a)); + f && e && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t) + } + } else if (l.oa === nd) m = l.nc, n = l.uc, p = l.pb, q = l.Bb, l = Math.abs(p - m) / + 2, r = Math.abs(q - n) / 2, m = Math.min(m, p) + l, n = Math.min(n, q) + r, a.beginPath(), a.moveTo(m, n - r), a.bezierCurveTo(m + K.sa * l, n - r, m + l, n - K.sa * r, m + l, n), a.bezierCurveTo(m + l, n + K.sa * r, m + K.sa * l, n + r, m, n + r), a.bezierCurveTo(m - K.sa * l, n + r, m - l, n + K.sa * r, m - l, n), a.bezierCurveTo(m - l, n - K.sa * r, m - K.sa * l, n - r, m, n - r), a.closePath(), null !== this.jd && zl(a, this.jd), d && !h && (h = u.eb(), K.ye(m, n - r, m + K.sa * l, n - r, m + l, n - K.sa * r, m + l, n, .5, h), K.ye(m + l, n, m + l, n + K.sa * r, m + K.sa * l, n + r, m, n + r, .5, h), K.ye(m, n + r, m - K.sa * l, n + r, m - l, n + K.sa * r, m - l, n, .5, h), K.ye(m - l, n, + m - l, n - K.sa * r, m - K.sa * l, n - r, m, n - r, .5, h), a.beginPath(), $m(a, h, k, this.cd), u.ra(h)), 0 !== c && null !== this.yc && (t = s = p = 0, f && e && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0), Bl(a), f && e && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t)); else if (l.oa === ad) { + r = l.Zi; + n = r.length; + for (q = 0; q < n; q++) { + m = r.n[q]; + a.beginPath(); + a.moveTo(m.ua, m.va); + for (var p = m.Fa.n, s = p.length, v = null, t = 0; t < s; t++) { + var x = p[t]; + switch (x.oa) { + case yd: + a.moveTo(x.F, x.G); + break; + case pd: + a.lineTo(x.F, + x.G); + break; + case zd: + a.bezierCurveTo(x.bd, x.xe, x.dg, x.eg, x.pb, x.Bb); + break; + case Ad: + a.quadraticCurveTo(x.bd, x.xe, x.pb, x.Bb); + break; + case Bd: + if (x.radiusX === x.radiusY) v = Math.PI / 180, a.arc(x.bd, x.xe, x.radiusX, x.Je * v, (x.Je + x.Qf) * v, 0 > x.Qf); else for (var v = Hd(x, m), B = v.length, y = 0; y < B; y++) { + var C = v[y]; + 0 === y && a.lineTo(C[0], C[1]); + a.bezierCurveTo(C[2], C[3], C[4], C[5], C[6], C[7]) + } + break; + case Gd: + y = B = 0; + null !== v && v.type === Bd ? (v = Hd(v, m), v = v[v.length - 1] || null, null !== v && (B = v[6], y = v[7])) : (B = null !== v ? v.F : m.ua, y = null !== v ? v.G : m.va); + v = Id(x, m, B, y); + B = v.length; + for (y = 0; y < B; y++) C = v[y], a.bezierCurveTo(C[2], C[3], C[4], C[5], C[6], C[7]); + break; + default: + u.k("Segment not of valid type") + } + x.zh && a.closePath(); + v = x + } + e ? (t = s = p = 0, m.En ? (!0 === m.Il && null !== this.jd ? (zl(a, this.jd), f = !0) : f = !1, 0 !== c && null !== this.yc && (f && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0), d && !h || Bl(a), f && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t))) : (f && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = + 0, a.shadowOffsetY = 0, a.shadowBlur = 0), !0 === m.Il && null !== this.jd && zl(a, this.jd), 0 !== c && null !== this.yc && (d && !h || Bl(a)), f && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t))) : (!0 === m.Il && null !== this.jd && zl(a, this.jd), 0 === c || null === this.yc || d && !h || Bl(a)) + } + if (d && !h) for (c = f, f = l.Zi, h = f.length, l = 0; l < h; l++) { + r = f.n[l]; + a.beginPath(); + n = u.eb(); + n.push(r.ua); + n.push(r.va); + q = r.ua; + m = r.va; + p = q; + s = m; + t = r.Fa.n; + x = t.length; + for (v = 0; v < x; v++) { + B = t[v]; + switch (B.oa) { + case yd: + $m(a, n, k, this.cd); + n.length = 0; + n.push(B.F); + n.push(B.G); + q = B.F; + m = B.G; + p = q; + s = m; + break; + case pd: + n.push(B.F); + n.push(B.G); + q = B.F; + m = B.G; + break; + case zd: + K.ye(q, m, B.bd, B.xe, B.dg, B.eg, B.pb, B.Bb, .5, n); + q = B.F; + m = B.G; + break; + case Ad: + K.Xo(q, m, B.bd, B.xe, B.pb, B.Bb, .5, n); + q = B.F; + m = B.G; + break; + case Bd: + for (var y = Hd(B, r), C = y.length, I = 0; I < C; I++) { + var H = y[I]; + K.ye(q, m, H[2], H[3], H[4], H[5], H[6], H[7], .5, n); + q = H[6]; + m = H[7] + } + break; + case Gd: + y = Id(B, r, q, m); + C = y.length; + for (I = 0; I < C; I++) H = y[I], K.ye(q, m, H[2], H[3], H[4], H[5], H[6], H[7], .5, n), q = H[6], m = H[7]; + break; + default: + u.k("Segment not of valid type") + } + B.zh && (n.push(p), + n.push(s), $m(a, n, k, this.cd)) + } + $m(a, n, k, this.cd); + u.ra(n); + null !== this.yc && (q = n = r = 0, c && e && (r = a.shadowOffsetX, n = a.shadowOffsetY, q = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0), Bl(a), c && e && (a.shadowOffsetX = r, a.shadowOffsetY = n, a.shadowBlur = q)) + } + } + d && (void 0 !== a.setLineDash ? (a.setLineDash(u.mh), a.lineDashOffset = 0) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = u.mh, a.webkitLineDashOffset = 0) : void 0 !== a.mozDash && (a.mozDash = null, a.mozDashOffset = 0)); + if (null !== this.eE) { + d = this.eE; + Ph(d, Infinity, Infinity); + k = d.Ba; + d.zc(0, 0, k.width, k.height); + a.save(); + k = this.dd.ub.first(); + a.beginPath(); + c = u.eb(); + c.push(k.ua); + c.push(k.va); + e = k.ua; + f = k.va; + h = e; + l = f; + r = k.Fa.n; + n = r.length; + for (q = 0; q < n; q++) { + m = r[q]; + switch (m.oa) { + case yd: + Zm(a, b, c, d); + c.length = 0; + c.push(m.F); + c.push(m.G); + e = m.F; + f = m.G; + h = e; + l = f; + break; + case pd: + c.push(m.F); + c.push(m.G); + e = m.F; + f = m.G; + break; + case zd: + K.ye(e, f, m.bd, m.xe, m.dg, m.eg, m.pb, m.Bb, .5, c); + e = m.F; + f = m.G; + break; + case Ad: + K.Xo(e, f, m.bd, m.xe, m.pb, m.Bb, .5, c); + e = m.F; + f = m.G; + break; + case Bd: + p = Hd(m, k); + s = p.length; + for (t = 0; t < s; t++) x = + p[t], K.ye(e, f, x[2], x[3], x[4], x[5], x[6], x[7], .5, c), e = x[6], f = x[7]; + break; + case Gd: + p = Id(m, k, e, f); + s = p.length; + for (t = 0; t < s; t++) x = p[t], K.ye(e, f, x[2], x[3], x[4], x[5], x[6], x[7], .5, c), e = x[6], f = x[7]; + break; + default: + u.k("Segment not of valid type") + } + m.zh && (c.push(h), c.push(l), Zm(a, b, c, d)) + } + Zm(a, b, c, d); + u.ra(c); + a.restore() + } + } + } + }; + + function $m(a, b, c, d) { + var e = .001, f = c.length, h = 0, k = 0, l = 0, m = 0, e = b.length; + if (!(4 > e)) if (h = b[0], k = b[1], 4 === e) kl(a, h, k, b[2], b[3], c, d); else { + a.moveTo(h, k); + for (var n = 0, p = 0, q = 0, r = p = l = 0, s = u.eb(), t = 2; t < e; t += 2) l = b[t], m = b[t + 1], n = l - h, p = m - k, 0 === n && (n = .001), q = p / n, p = Math.sqrt(n * n + p * p), h = [], h[0] = n, h[1] = q, h[2] = p, s.push(h), r += p, h = l, k = m; + h = b[0]; + k = b[1]; + b = 0; + for (var m = !0, e = c[b % f], t = 0 !== d, p = 0, l = s[p], n = l[0], q = l[1], l = l[2], v = 0; .1 <= r;) { + 0 === v && (e = c[b % f], b++, t && (d %= e, e -= d, t = !1)); + e > r && (e = r); + e > l ? (v = e - l, e = l) : v = 0; + var x = Math.sqrt(e * e / + (1 + q * q)); + 0 > n && (x = -x); + h += x; + k += q * x; + m ? a.lineTo(h, k) : a.moveTo(h, k); + r -= e; + l -= e; + if (0 !== v) { + p++; + if (p === s.length) { + u.ra(s); + return + } + l = s[p]; + n = l[0]; + q = l[1]; + l = l[2]; + e = v + } else m = !m + } + u.ra(s) + } + } + + X.prototype.getDocumentPoint = X.prototype.lb = function (a, b) { + void 0 === b && (b = new w); + a.ne() && u.k("getDocumentPoint:s Spot must be real: " + a.toString()); + var c = this.Ha, d = this.hb; + b.m(a.x * (c.width + d) - d / 2 + c.x + a.offsetX, a.y * (c.height + d) - d / 2 + c.y + a.offsetY); + this.Ff.ab(b); + return b + }; + X.prototype.Jj = function (a, b) { + var c = this.Pa; + if (null === c || null === this.fill && null === this.stroke) return !1; + var d = c.kb, e = this.hb / 2; + c.type !== dd || b || (e += 2); + var f = u.Sf(); + f.assign(d); + f.Jf(e + 2, e + 2); + if (!f.Aa(a)) return u.ic(f), !1; + d = e + 1E-4; + if (c.type === dd) { + if (null === this.stroke) return !1; + d = (c.F - c.ua) * (a.x - c.ua) + (c.G - c.va) * (a.y - c.va); + if (0 > (c.ua - c.F) * (a.x - c.F) + (c.va - c.G) * (a.y - c.G) || 0 > d) return !1; + u.ic(f); + return K.Hd(c.ua, c.va, c.F, c.G, e, a.x, a.y) + } + if (c.type === md) { + var h = c.ua, k = c.va, l = c.F, m = c.G, c = Math.min(h, l), n = Math.min(k, + m), h = Math.abs(l - h), k = Math.abs(m - k); + f.x = c; + f.y = n; + f.width = h; + f.height = k; + if (null === this.fill) { + f.Jf(-d, -d); + if (f.Aa(a)) return u.ic(f), !1; + f.Jf(d, d) + } + null !== this.stroke && f.Jf(e, e); + e = f.Aa(a); + u.ic(f); + return e + } + if (c.type === nd) { + h = c.ua; + k = c.va; + l = c.F; + m = c.G; + c = Math.min(h, l); + n = Math.min(k, m); + h = Math.abs(l - h); + k = Math.abs(m - k); + h /= 2; + k /= 2; + c = a.x - (c + h); + n = a.y - (n + k); + if (null === this.fill) { + h -= d; + k -= d; + if (0 >= h || 0 >= k || 1 >= c * c / (h * h) + n * n / (k * k)) return u.ic(f), !1; + h += d; + k += d + } + null !== this.stroke && (h += e, k += e); + u.ic(f); + return 0 >= h || 0 >= k ? !1 : 1 >= c * c / + (h * h) + n * n / (k * k) + } + if (c.type === ad) return u.ic(f), null === this.fill ? Ld(c, a.x, a.y, e) : c.Aa(a, e, 1 < this.hb, b); + u.k("Unknown Geometry type"); + return !1 + }; + X.prototype.Oo = function (a, b, c, d) { + var e = this.xa, f = this.Sg; + a = Math.max(a, 0); + b = Math.max(b, 0); + var h; + if (this.Rg) h = this.Pa.kb; else { + var k = this.Fb, l = K.Uw[k]; + if (void 0 === l) { + var m = K.qg[k]; + "string" === typeof m && (m = K.qg[m]); + "function" === typeof m ? (l = m(null, 100, 100), K.Uw[k] = l) : u.k("Unsupported Figure:" + k) + } + h = l.kb + } + var k = h.width, l = h.height, m = h.width, n = h.height; + switch (pl(this, !0)) { + case qh: + d = c = 0; + break; + case cd: + m = Math.max(a - f, 0); + n = Math.max(b - f, 0); + break; + case fl: + m = Math.max(a - f, 0); + d = 0; + break; + case el: + c = 0, n = Math.max(b - f, 0) + } + isFinite(e.width) && + (m = e.width); + isFinite(e.height) && (n = e.height); + e = this.af; + h = this.vg; + c = Math.max(c, h.width) - f; + d = Math.max(d, h.height) - f; + m = Math.min(e.width, m); + n = Math.min(e.height, n); + m = isFinite(m) ? Math.max(c, m) : Math.max(k, c); + n = isFinite(n) ? Math.max(d, n) : Math.max(l, d); + c = rh(this); + switch (c) { + case qh: + break; + case cd: + k = m; + l = n; + break; + case sh: + c = Math.min(m / k, n / l); + isFinite(c) || (c = 1); + k *= c; + l *= c; + break; + default: + u.k(c + " is not a valid geometryStretch.") + } + if (this.Rg) h = this.dd, e = k, d = l, c = h.copy(), h = h.kb, e /= h.width, d /= h.height, isFinite(e) || (e = 1), + isFinite(d) || (d = 1), 1 === e && 1 === d || c.scale(e, d), this.Pa = c; else if (null === this.Pa || this.Pa.Dn !== a - f || this.Pa.Cn !== b - f) this.Pa = K.makeGeometry(this, k, l); + h = this.Pa.kb; + Infinity === a || Infinity === b ? ml(this, h.x - f / 2, h.y - f / 2, 0 === a && 0 === k ? 0 : h.width + f, 0 === b && 0 === l ? 0 : h.height + f) : ml(this, -(f / 2), -(f / 2), m + f, n + f) + }; + + function Om(a, b, c) { + if (!1 !== Aj(a)) { + a.Pc.La(); + var d = a.Sg; + if (0 === d) { + var e = a.T; + e instanceof lf && e.type === ah && e.vc instanceof X && (d = e.vc.hb) + } + d *= a.$b; + ml(a, -(d / 2), -(d / 2), b + d, c + d); + b = a.Pc; + c = a.af; + d = a.vg; + b.width = Math.min(c.width, b.width); + b.height = Math.min(c.height, b.height); + b.width = Math.max(d.width, b.width); + b.height = Math.max(d.height, b.height); + a.Pc.freeze(); + a.Pc.J() || u.k("Non-real measuredBounds has been set. Object " + a + ", measuredBounds: " + a.Pc.toString()); + uj(a, !1) + } + } + + function rh(a) { + var b = a.yD; + return a.Rg ? b === dl ? cd : b : b === dl ? K.Uw[a.Fb].Bd : b + } + + X.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + X.prototype.getNearestIntersectionPoint = X.prototype.bl = function (a, b, c) { + return this.Co(a.x, a.y, b.x, b.y, c) + }; + X.prototype.Co = function (a, b, c, d, e) { + var f = this.transform, h = 1 / (f.m11 * f.m22 - f.m12 * f.m21), k = f.m22 * h, l = -f.m12 * h, m = -f.m21 * h, + n = f.m11 * h, p = h * (f.m21 * f.dy - f.m22 * f.dx), q = h * (f.m12 * f.dx - f.m11 * f.dy), + f = a * k + b * m + p, h = a * l + b * n + q, k = c * k + d * m + p, l = c * l + d * n + q, m = this.hb / 2, + p = this.Pa; + null === p && (Ph(this, Infinity, Infinity), p = this.Pa); + q = p.kb; + n = !1; + if (p.type === dd) if (1.5 >= this.hb) n = K.$g(p.nc, p.uc, p.pb, p.Bb, f, h, k, l, e); else { + var r = 0, s = 0; + p.nc === p.pb ? (r = m, s = 0) : (b = (p.Bb - p.uc) / (p.pb - p.nc), s = m / Math.sqrt(1 + b * b), r = s * b); + d = u.eb(); + b = new w; + K.$g(p.nc + + r, p.uc + s, p.pb + r, p.Bb + s, f, h, k, l, b) && d.push(b); + b = new w; + K.$g(p.nc - r, p.uc - s, p.pb - r, p.Bb - s, f, h, k, l, b) && d.push(b); + b = new w; + K.$g(p.nc + r, p.uc + s, p.nc - r, p.uc - s, f, h, k, l, b) && d.push(b); + b = new w; + K.$g(p.pb + r, p.Bb + s, p.pb - r, p.Bb - s, f, h, k, l, b) && d.push(b); + b = d.length; + if (0 === b) return u.ra(d), !1; + n = !0; + s = Infinity; + for (r = 0; r < b; r++) { + var k = d[r], t = (k.x - f) * (k.x - f) + (k.y - h) * (k.y - h); + t < s && (s = t, e.x = k.x, e.y = k.y) + } + u.ra(d) + } else if (p.type === md) b = q.x - m, n = K.bl(b, q.y - m, q.x + q.width + m, q.y + q.height + m, f, h, k, l, e); else if (p.type === nd) a:if (b = q.copy().Jf(m, + m), 0 === b.width) n = K.$g(b.x, b.y, b.x, b.y + b.height, f, h, k, l, e); else if (0 === b.height) n = K.$g(b.x, b.y, b.x + b.width, b.y, f, h, k, l, e); else { + a = b.width / 2; + var v = b.height / 2; + d = b.x + a; + b = b.y + v; + c = 9999; + f !== k && (c = (h - l) / (f - k)); + if (9999 > Math.abs(c)) { + n = h - b - c * (f - d); + if (0 > a * a * c * c + v * v - n * n) { + e.x = NaN; + e.y = NaN; + n = !1; + break a + } + m = Math.sqrt(a * a * c * c + v * v - n * n); + k = (-(a * a * c * n) + a * v * m) / (v * v + a * a * c * c) + d; + a = (-(a * a * c * n) - a * v * m) / (v * v + a * a * c * c) + d; + l = c * (k - d) + n + b; + b = c * (a - d) + n + b; + d = Math.abs((f - k) * (f - k)) + Math.abs((h - l) * (h - l)); + h = Math.abs((f - a) * (f - a)) + Math.abs((h - b) * + (h - b)); + d < h ? (e.x = k, e.y = l) : (e.x = a, e.y = b) + } else { + k = v * v; + l = f - d; + k -= k / (a * a) * l * l; + if (0 > k) { + e.x = NaN; + e.y = NaN; + n = !1; + break a + } + m = Math.sqrt(k); + l = b + m; + b -= m; + d = Math.abs(l - h); + h = Math.abs(b - h); + d < h ? (e.x = f, e.y = l) : (e.x = f, e.y = b) + } + n = !0 + } else if (p.type === ad) { + var x = 0, B = 0, y = t = 0, q = u.K(), r = k - f, s = l - h, s = r * r + s * s; + e.x = k; + e.y = l; + for (r = 0; r < p.ub.count; r++) for (var C = p.ub.n[r], I = C.Fa, x = C.ua, B = C.va, H = x, T = B, aa = 0; aa < I.count; aa++) { + var R = I.n[aa], N = R.type, t = R.F, y = R.G, Z = !1; + switch (N) { + case yd: + H = t; + T = y; + break; + case pd: + Z = an(x, B, t, y, f, h, k, l, q); + break; + case zd: + var Z = + R.Rb, N = R.jc, Ea = R.df, ua = R.ef, Z = K.js(x, B, Z, N, Ea, ua, t, y, f, h, k, l, .5, q); + break; + case Ad: + Z = (x + 2 * R.Rb) / 3; + N = (B + 2 * R.jc) / 3; + Ea = (2 * R.Rb + t) / 3; + ua = (2 * R.Rb + t) / 3; + Z = K.js(x, B, Z, N, Ea, ua, t, y, f, h, k, l, .5, q); + break; + case Bd: + case Gd: + y = R.type === Bd ? Hd(R, C) : Id(R, C, x, B); + N = y.length; + for (Ea = 0; Ea < N; Ea++) v = y[Ea], 0 === Ea && an(x, B, v[0], v[1], f, h, k, l, q) && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0)), K.js(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], f, h, k, l, .5, q) && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0)); + t = v[6]; + y = v[7]; + break; + default: + u.k("Unknown Segment type: " + R.type) + } + x = + t; + B = y; + Z && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0)); + R.ew && (t = H, y = T, an(x, B, t, y, f, h, k, l, q) && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0))) + } + f = c - a; + h = d - b; + b = Math.sqrt(f * f + h * h); + 0 !== b && (f /= b, h /= b); + e.x -= f * m; + e.y -= h * m; + u.v(q) + } else u.k("Invalid Geometry type"); + if (!n) return !1; + this.transform.ab(e); + return !0 + }; + + function bn(a, b, c, d, e) { + a = c.x - a; + b = c.y - b; + b = a * a + b * b; + return b < d ? (e.x = c.x, e.y = c.y, b) : d + } + + function an(a, b, c, d, e, f, h, k, l) { + var m = !1, n = (e - h) * (b - d) - (f - k) * (a - c); + if (0 === n) return !1; + l.x = ((e * k - f * h) * (a - c) - (e - h) * (a * d - b * c)) / n; + l.y = ((e * k - f * h) * (b - d) - (f - k) * (a * d - b * c)) / n; + (a > c ? a - c : c - a) < (b > d ? b - d : d - b) ? (e = b < d ? b : d, a = b < d ? d : b, (l.y > e || K.mb(l.y, e)) && (l.y < a || K.mb(l.y, a)) && (m = !0)) : (e = a < c ? a : c, a = a < c ? c : a, (l.x > e || K.mb(l.x, e)) && (l.x < a || K.mb(l.x, a)) && (m = !0)); + return m + } + + X.prototype.containedInRect = X.prototype.sm = function (a, b) { + if (void 0 === b) return a.Kj(this.ba); + var c = this.Pa; + null === c && (Ph(this, Infinity, Infinity), c = this.Pa); + var c = c.kb, d = this.hb / 2, e = !1, f = u.K(); + f.m(c.x - d, c.y - d); + a.Aa(b.ab(f)) && (f.m(c.x - d, c.bottom + d), a.Aa(b.ab(f)) && (f.m(c.right + d, c.bottom + d), a.Aa(b.ab(f)) && (f.m(c.right + d, c.y - d), a.Aa(b.ab(f)) && (e = !0)))); + u.v(f); + return e + }; + X.prototype.intersectsRect = X.prototype.sg = function (a, b) { + if (this.sm(a, b) || void 0 === b && (b = this.transform, a.Kj(this.ba))) return !0; + var c = u.jh(); + c.set(b); + c.oz(); + var d = a.left, e = a.right, f = a.top, h = a.bottom, k = u.K(); + k.m(d, f); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + k.m(e, f); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + k.m(d, h); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + k.m(e, h); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + var l = u.K(), m = u.K(); + c.set(b); + c.aE(this.transform); + c.oz(); + l.x = e; + l.y = f; + l.transform(c); + k.x = d; + k.y = + f; + k.transform(c); + var n = !1; + cn(this, k, l, m) ? n = !0 : (k.x = e, k.y = h, k.transform(c), cn(this, k, l, m) ? n = !0 : (l.x = d, l.y = h, l.transform(c), cn(this, k, l, m) ? n = !0 : (k.x = d, k.y = f, k.transform(c), cn(this, k, l, m) && (n = !0)))); + u.v(k); + u.Ye(c); + u.v(l); + u.v(m); + return n + }; + + function cn(a, b, c, d) { + if (!a.bl(b, c, d)) return !1; + a = b.x; + b = b.y; + var e = c.x; + c = c.y; + var f = d.x; + d = d.y; + if (a === e) { + var h = 0; + a = 0; + b < c ? (h = b, a = c) : (h = c, a = b); + return d >= h && d <= a + } + a < e ? (h = a, a = e) : h = e; + return f >= h && f <= a + } + + X.prototype.sD = function (a, b, c) { + function d(a, b) { + for (var c = a.length, d = 0; d < c; d += 2) if (b.ss(a[d], a[d + 1]) > e) return !0; + return !1 + } + + if (c && null !== this.fill && this.Jj(a, !0)) return !0; + var e = a.Lj(b); + b = e; + 1.5 < this.hb && (e = this.hb / 2 + Math.sqrt(e), e *= e); + var f = this.Pa; + null === f && (Ph(this, Infinity, Infinity), f = this.Pa); + if (!c) { + var h = f.kb, k = h.x, l = h.y, m = h.x + h.width, h = h.y + h.height; + if (Ya(a.x, a.y, k, l) <= e && Ya(a.x, a.y, m, l) <= e && Ya(a.x, a.y, k, h) <= e && Ya(a.x, a.y, m, h) <= e) return !0 + } + k = f.nc; + l = f.uc; + m = f.pb; + h = f.Bb; + if (f.type === dd) { + if (c = Xa(a.x, a.y, + k, l, m, h), f = (k - m) * (a.x - m) + (l - h) * (a.y - h), c <= (0 <= (m - k) * (a.x - k) + (h - l) * (a.y - l) && 0 <= f ? e : b)) return !0 + } else { + if (f.type === md) return b = !1, c && (b = Xa(a.x, a.y, k, l, k, h) <= e || Xa(a.x, a.y, k, l, m, l) <= e || Xa(a.x, a.y, m, l, m, h) <= e || Xa(a.x, a.y, k, h, m, h) <= e), b; + if (f.type === nd) { + b = a.x - (k + m) / 2; + var f = a.y - (l + h) / 2, n = Math.abs(m - k) / 2, p = Math.abs(h - l) / 2; + if (0 === n || 0 === p) return c = Xa(a.x, a.y, k, l, m, h), c <= e ? !0 : !1; + if (c) { + if (a = K.sG(n, p, b, f), a * a <= e) return !0 + } else return Ya(b, f, -n, 0) >= e || Ya(b, f, 0, -p) >= e || Ya(b, f, 0, p) >= e || Ya(b, f, n, 0) >= e ? !1 : !0 + } else if (f.type === + ad) { + h = f.kb; + k = h.x; + l = h.y; + m = h.x + h.width; + h = h.y + h.height; + if (a.x > m && a.x < k && a.y > h && a.y < l && Xa(a.x, a.y, k, l, k, h) > e && Xa(a.x, a.y, k, l, m, l) > e && Xa(a.x, a.y, m, h, k, h) > e && Xa(a.x, a.y, m, h, m, l) > e) return !1; + b = Math.sqrt(e); + if (c) { + if (null === this.fill ? Ld(f, a.x, a.y, b) : f.Aa(a, b, !0)) return !0 + } else { + c = f.ub; + for (b = 0; b < c.count; b++) { + k = c.n[b]; + n = k.ua; + p = k.va; + if (a.ss(n, p) > e) return !1; + l = k.Fa.n; + m = l.length; + for (h = 0; h < m; h++) { + var q = l[h]; + switch (q.type) { + case yd: + case pd: + n = q.F; + p = q.G; + if (a.ss(n, p) > e) return !1; + break; + case zd: + f = u.eb(); + K.ye(n, p, q.Rb, q.jc, + q.df, q.ef, q.F, q.G, .8, f); + n = d(f, a); + u.ra(f); + if (n) return !1; + n = q.F; + p = q.G; + if (a.ss(n, p) > e) return !1; + break; + case Ad: + f = u.eb(); + K.Xo(n, p, q.Rb, q.jc, q.F, q.G, .8, f); + n = d(f, a); + u.ra(f); + if (n) return !1; + n = q.F; + p = q.G; + if (a.ss(n, p) > e) return !1; + break; + case Bd: + case Gd: + var q = q.type === Bd ? Hd(q, k) : Id(q, k, n, p), r = q.length, s = null, + f = u.eb(); + for (b = 0; b < r; b++) if (s = q[b], f.length = 0, K.ye(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], .8, f), d(f, a)) return u.ra(f), !1; + u.ra(f); + null !== s && (n = s[6], p = s[7]); + break; + default: + u.k("Unknown Segment type: " + q.type) + } + } + } + return !0 + } + } + } + return !1 + }; + u.defineProperty(X, {dd: "geometry"}, function () { + return this.jk ? this.jk : this.Pa + }, function (a) { + var b = this.Pa; + if (b !== a) { + this.jk = null !== a ? this.Pa = a.freeze() : this.Pa = null; + var c = this.T; + null !== c && (c.kj = NaN); + this.Rg = !0; + this.R(); + this.h("geometry", b, a); + a = this.T; + null !== a && 0 !== (this.ea & 1024) && ll(this, a, "geometryString") + } + }); + u.defineProperty(X, {EG: "geometryString"}, function () { + return null === this.dd ? "" : this.dd.toString() + }, function (a) { + var b = sd(a); + a = b.normalize(); + this.dd = b; + var b = u.K(), c = this.position; + c.J() ? b.m(c.x - a.x, c.y - a.y) : b.m(-a.x, -a.y); + this.position = b; + u.v(b) + }); + u.defineProperty(X, {rz: "isGeometryPositioned"}, function () { + return this.hq + }, function (a) { + var b = this.hq; + b !== a && (this.hq = a, this.R(), this.h("isGeometryPositioned", b, a)) + }); + X.prototype.le = function () { + this.Rg ? this.jk = null : this.Pa = null; + this.R() + }; + u.defineProperty(X, {fill: "fill"}, function () { + return this.jd + }, function (a) { + var b = this.jd; + b !== a && (a instanceof ga && a.freeze(), this.jd = a, this.ma(), this.h("fill", b, a)) + }); + u.defineProperty(X, {stroke: "stroke"}, function () { + return this.yc + }, function (a) { + var b = this.yc; + b !== a && (a instanceof ga && a.freeze(), this.yc = a, this.ma(), this.h("stroke", b, a)) + }); + u.defineProperty(X, {hb: "strokeWidth"}, function () { + return this.Sg + }, function (a) { + var b = this.Sg; + if (b !== a) if (0 <= a) { + this.Sg = a; + this.R(); + var c = this.T; + null !== c && (c.kj = NaN); + this.h("strokeWidth", b, a) + } else u.wa(a, "value >= 0", X, "strokeWidth:value") + }); + u.defineProperty(X, {qI: "strokeCap"}, function () { + return this.co + }, function (a) { + var b = this.co; + b !== a && ("string" !== typeof a || "butt" !== a && "round" !== a && "square" !== a ? u.wa(a, '"butt", "round", or "square"', X, "strokeCap") : (this.co = a, this.ma(), this.h("strokeCap", b, a))) + }); + u.defineProperty(X, {wK: "strokeJoin"}, function () { + return this.eo + }, function (a) { + var b = this.eo; + b !== a && ("string" !== typeof a || "miter" !== a && "bevel" !== a && "round" !== a ? u.wa(a, '"miter", "bevel", or "round"', X, "strokeJoin") : (this.eo = a, this.ma(), this.h("strokeJoin", b, a))) + }); + u.defineProperty(X, {xK: "strokeMiterLimit"}, function () { + return this.gm + }, function (a) { + var b = this.gm; + if (b !== a) if (0 < a) { + this.gm = a; + this.ma(); + var c = this.T; + null !== c && (c.kj = NaN); + this.h("strokeMiterLimit", b, a) + } else u.wa(a, "value > 0", X, "strokeWidth:value") + }); + u.defineProperty(X, {gA: "strokeDashArray"}, function () { + return this.fm + }, function (a) { + var b = this.fm; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", X, "strokeDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("strokeDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.fm = a; + this.ma(); + this.h("strokeDashArray", b, a) + } + }); + u.defineProperty(X, {rI: "strokeDashOffset"}, function () { + return this.cd + }, function (a) { + var b = this.cd; + b !== a && 0 <= a && (this.cd = a, this.ma(), this.h("strokeDashOffset", b, a)) + }); + u.defineProperty(X, {Fb: "figure"}, function () { + return this.tn + }, function (a) { + var b = this.tn; + if (b !== a) { + var c = K.qg[a]; + "function" === typeof c ? c = a : (c = K.qg[a.toLowerCase()]) || u.k("Unknown Shape.figure: " + a); + b !== c && (a = this.T, null !== a && (a.kj = NaN), this.tn = c, this.Rg = !1, this.le(), this.h("figure", b, c)) + } + }); + u.defineProperty(X, {jp: "toArrow"}, function () { + return this.fo + }, function (a) { + var b = this.fo; + !0 === a ? a = "Standard" : !1 === a && (a = ""); + if (b !== a) { + var c = K.UC(a); + null === c ? u.k("Unknown Shape.toArrow: " + a) : b !== c && (this.fo = c, this.Rg = !1, this.le(), dn(this), this.h("toArrow", b, c)) + } + }); + u.defineProperty(X, {ez: "fromArrow"}, function () { + return this.wn + }, function (a) { + var b = this.wn; + !0 === a ? a = "Standard" : !1 === a && (a = ""); + if (b !== a) { + var c = K.UC(a); + null === c ? u.k("Unknown Shape.fromArrow: " + a) : b !== c && (this.wn = c, this.Rg = !1, this.le(), dn(this), this.h("fromArrow", b, c)) + } + }); + + function dn(a) { + var b = a.g; + null !== b && b.ha.gb || (a.Cw = en, "None" !== a.fo ? (a.Pf = -1, a.Hj = xc) : "None" !== a.wn && (a.Pf = 0, a.Hj = new L(1 - xc.x, xc.y))) + } + + u.defineProperty(X, {A: "spot1"}, function () { + return this.ri + }, function (a) { + u.C(a, L, X, "spot1"); + var b = this.ri; + b.L(a) || (this.ri = a = a.Z(), this.R(), this.h("spot1", b, a)) + }); + u.defineProperty(X, {B: "spot2"}, function () { + return this.si + }, function (a) { + u.C(a, L, X, "spot2"); + var b = this.si; + b.L(a) || (this.si = a = a.Z(), this.R(), this.h("spot2", b, a)) + }); + u.defineProperty(X, {xc: "parameter1"}, function () { + return this.cr + }, function (a) { + var b = this.cr; + b !== a && (this.cr = a, this.le(), this.h("parameter1", b, a)) + }); + u.defineProperty(X, {et: "parameter2"}, function () { + return this.dr + }, function (a) { + var b = this.dr; + b !== a && (this.dr = a, this.le(), this.h("parameter2", b, a)) + }); + u.u(X, {Ha: "naturalBounds"}, function () { + if (null !== this.Pa) return this.Hc.assign(this.Pa.kb), this.Hc; + var a = this.xa; + return new z(0, 0, a.width, a.height) + }); + u.defineProperty(X, {FJ: "isRectangular"}, function () { + return this.nq + }, function (a) { + var b = this.nq; + b !== a && (this.nq = a, this.R(), this.h("isRectangular", b, a)) + }); + u.defineProperty(X, {eE: "pathObject"}, function () { + return this.gr + }, function (a) { + var b = this.gr; + b !== a && (this.gr = a, this.ma(), this.h("pathObject", b, a)) + }); + u.defineProperty(X, {yD: "geometryStretch"}, function () { + return this.Zp + }, function (a) { + var b = this.Zp; + b !== a && (u.rb(a, S, X, "geometryStretch"), this.Zp = a, this.h("geometryStretch", b, a)) + }); + u.defineProperty(X, {interval: "interval"}, function () { + return this.eq + }, function (a) { + var b = this.eq; + a = Math.floor(a); + b !== a && 0 <= a && (this.eq = a, null !== this.g && vj(this.g), this.R(), this.h("interval", b, a)) + }); + X.getFigureGenerators = function () { + var a = new la("string", "function"), b; + for (b in K.qg) if (b !== b.toLowerCase()) { + var c = K.qg[b]; + "function" === typeof c && a.add(b, c) + } + a.freeze(); + return a + }; + X.defineFigureGenerator = function (a, b) { + u.j(a, "string", X, "defineFigureGenerator:name"); + "string" === typeof b ? "" !== b && K.qg[b] || u.k("Shape.defineFigureGenerator synonym must not be empty or None or not a defined figure name: " + b) : u.j(b, "function", X, "defineFigureGenerator:func"); + var c = a.toLowerCase(); + "" !== a && "none" !== c && a !== c || u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: " + a); + var d = K.qg; + d[a] = b; + d[c] = a + }; + X.getArrowheadGeometries = function () { + var a = new la("string", $c), b; + for (b in K.Qi) if (b !== b.toLowerCase()) { + var c = K.Qi[b]; + c instanceof $c && a.add(b, c) + } + a.freeze(); + return a + }; + X.defineArrowheadGeometry = function (a, b) { + u.j(a, "string", X, "defineArrowheadGeometry:name"); + var c = null; + "string" === typeof b ? (u.j(b, "string", X, "defineArrowheadGeometry:pathstr"), c = sd(b, !1)) : (u.C(b, $c, X, "defineArrowheadGeometry:pathstr"), c = b); + var d = a.toLowerCase(); + "" !== a && "none" !== d && a !== d || u.k("Shape.defineArrowheadGeometry name must not be empty or None or all-lower-case: " + a); + var e = K.Qi; + e[a] = c; + e[d] = a + }; + + function qa() { + S.call(this); + this.ie = ""; + this.yc = "black"; + this.Hg = "13px sans-serif"; + this.Rd = "start"; + this.kq = !0; + this.Kl = this.Ll = !1; + this.Ek = fn; + this.jm = gn; + this.Gu = this.ve = 0; + this.vn = this.ay = this.by = null; + this.ej = new hn; + this.Tp = !1; + this.kf = this.Hk = this.Rr = null; + this.zj = this.yj = 0; + this.ii = Infinity + } + + u.Ga(qa, S); + u.fa("TextBlock", qa); + var jn = new pa, kn = 0, ln = new pa, mn = 0, nn = "...", on = "", pn = u.createElement("canvas").getContext("2d"); + qa.getEllipsis = function () { + return nn + }; + qa.setEllipsis = function (a) { + nn = a; + ln = new pa; + mn = 0 + }; + qa.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.ie = this.ie; + a.yc = this.yc; + a.Hg = this.Hg; + a.Rd = this.Rd; + a.kq = this.kq; + a.Ll = this.Ll; + a.Kl = this.Kl; + a.jm = this.jm; + a.Ek = this.Ek; + a.ve = this.ve; + a.Gu = this.Gu; + a.by = this.by; + a.ay = this.ay; + a.vn = this.vn; + a.ej.qs(this.ej); + a.Tp = this.Tp; + a.Rr = this.Rr; + a.Hk = this.Hk; + a.kf = this.kf; + a.yj = this.yj; + a.zj = this.zj; + a.ii = this.ii + }; + qa.prototype.toString = function () { + return 22 < this.ie.length ? 'TextBlock("' + this.ie.substring(0, 20) + '"...)' : 'TextBlock("' + this.ie + '")' + }; + var qn; + qa.None = qn = u.s(qa, "None", 0); + var rn; + qa.WrapFit = rn = u.s(qa, "WrapFit", 1); + var gn; + qa.WrapDesiredSize = gn = u.s(qa, "WrapDesiredSize", 2); + var fn; + qa.OverflowClip = fn = u.s(qa, "OverflowClip", 0); + var sn; + qa.OverflowEllipsis = sn = u.s(qa, "OverflowEllipsis", 1); + qa.prototype.R = function () { + S.prototype.R.call(this); + this.ay = this.by = null + }; + u.defineProperty(qa, {font: "font"}, function () { + return this.Hg + }, function (a) { + var b = this.Hg; + b !== a && (this.Hg = a, this.vn = null, this.R(), this.h("font", b, a)) + }); + qa.isValidFont = function (a) { + var b = pn.font; + if (a === b || "10px sans-serif" === a) return !0; + pn.font = "10px sans-serif"; + var c; + pn.font = a; + var d = pn.font; + if ("10px sans-serif" !== d) return pn.font = b, !0; + pn.font = "19px serif"; + c = pn.font; + pn.font = a; + d = pn.font; + pn.font = b; + return d !== c + }; + u.defineProperty(qa, {text: "text"}, function () { + return this.ie + }, function (a) { + var b = this.ie; + a = null !== a && void 0 !== a ? a.toString() : ""; + b !== a && (this.ie = a, this.R(), this.h("text", b, a)) + }); + u.defineProperty(qa, {textAlign: "textAlign"}, function () { + return this.Rd + }, function (a) { + var b = this.Rd; + b !== a && ("start" === a || "end" === a || "left" === a || "right" === a || "center" === a ? (this.Rd = a, this.ma(), this.h("textAlign", b, a)) : u.wa(a, '"start", "end", "left", "right", or "center"', qa, "textAlign")) + }); + u.u(qa, {Ha: "naturalBounds"}, function () { + if (!this.Hc.J()) { + var a = tn(this, this.ie, this.ej, 999999).width, b = un(this, a, this.ej), c = this.xa; + isNaN(c.width) || (a = c.width); + isNaN(c.height) || (b = c.height); + bb(this.Hc, a, b) + } + return this.Hc + }); + u.defineProperty(qa, {iw: "isMultiline"}, function () { + return this.kq + }, function (a) { + var b = this.kq; + b !== a && (this.kq = a, this.R(), this.h("isMultiline", b, a)) + }); + u.defineProperty(qa, {JJ: "isUnderline"}, function () { + return this.Ll + }, function (a) { + var b = this.Ll; + b !== a && (this.Ll = a, this.ma(), this.h("isUnderline", b, a)) + }); + u.defineProperty(qa, {GJ: "isStrikethrough"}, function () { + return this.Kl + }, function (a) { + var b = this.Kl; + b !== a && (this.Kl = a, this.ma(), this.h("isStrikethrough", b, a)) + }); + u.defineProperty(qa, {bF: "wrap"}, function () { + return this.jm + }, function (a) { + var b = this.jm; + b !== a && (this.jm = a, this.R(), this.h("wrap", b, a)) + }); + u.defineProperty(qa, {overflow: "overflow"}, function () { + return this.Ek + }, function (a) { + var b = this.Ek; + b !== a && (this.Ek = a, this.R(), this.h("overflow", b, a)) + }); + u.defineProperty(qa, {stroke: "stroke"}, function () { + return this.yc + }, function (a) { + var b = this.yc; + b !== a && (a instanceof ga && a.freeze(), this.yc = a, this.ma(), this.h("stroke", b, a)) + }); + u.u(qa, {oH: "lineCount"}, function () { + return this.ve + }); + u.defineProperty(qa, {bz: "editable"}, function () { + return this.Tp + }, function (a) { + var b = this.Tp; + b !== a && (this.Tp = a, this.h("editable", b, a)) + }); + u.defineProperty(qa, {NE: "textEditor"}, function () { + return this.Rr + }, function (a) { + var b = this.Rr; + b !== a && (a instanceof HTMLElement || u.k("textEditor must be an HTMLElement"), this.Rr = a, this.h("textEditor", b, a)) + }); + u.defineProperty(qa, {cz: "errorFunction"}, function () { + return this.kf + }, function (a) { + var b = this.kf; + b !== a && (null !== a && u.j(a, "function", qa, "errorFunction"), this.kf = a, this.h("errorFunction", b, a)) + }); + + function xl(a, b) { + var c = a.Hg; + null !== c && b.Et !== c && (b.font = c, b.Et = c) + } + + qa.prototype.Mj = function (a, b) { + if (null !== this.yc && 0 !== this.ie.length && null !== this.Hg) { + var c = this.Ha.width, d = vn(this); + a.textAlign = this.Rd; + yl(this, a, this.yc, !0, !1); + (this.Ll || this.Kl) && yl(this, a, this.yc, !1, !1); + var e = this.ej, f = 0, h = !1, k = u.fc(0, 0); + this.Ff.ab(k); + var l = u.fc(0, d); + this.Ff.ab(l); + var m = k.Lj(l); + u.v(k); + u.v(l); + k = b.scale; + 8 > m * k * k && (h = !0); + b.Gg !== a && (h = !1); + !1 === b.$v("textGreeking") && (h = !1); + for (var m = this.yj, k = this.zj, l = this.ve, n = 0; n < l; n++) { + var p = e.gf[n], q = e.te[n]; + p > c && (p = c); + var f = f + m, r = q, q = a, s = f, t = c, + v = d, x = 0; + h ? ("start" === this.Rd || "left" === this.Rd ? x = 0 : "end" === this.Rd || "right" === this.Rd ? x = t - p : "center" === this.Rd ? x = (t - p) / 2 : u.k("textAlign must be start, end, left, right, or center"), q.fillRect(0 + x, s + .25 * v, p, 1)) : ("start" === this.Rd || "left" === this.Rd ? x = 0 : "end" === this.Rd || "right" === this.Rd ? x = t : "center" === this.Rd ? x = t / 2 : u.k("textAlign must be start, end, left, right, or center"), q.fillText(r, 0 + x, s + v - .25 * v), r = v / 20 | 0, 0 === r && (r = 1), "end" === this.Rd || "right" === this.Rd ? x -= p : "center" === this.Rd && (x -= p / 2), this.Ll && + (q.beginPath(), q.lineWidth = r, q.moveTo(0 + x, s + v - .2 * v), q.lineTo(0 + x + p, s + v - .2 * v), q.stroke()), this.Kl && (q.beginPath(), q.lineWidth = r, s = s + v - v / 2.2 | 0, 0 !== r % 2 && (s += .5), q.moveTo(0 + x, s), q.lineTo(0 + x + p, s), q.stroke())); + f += d + k + } + } + }; + qa.prototype.Oo = function (a, b, c, d) { + var e = this.ej; + e.reset(); + var f = 0, h = 0; + if (isNaN(this.xa.width)) { + f = this.ie.replace(/\r\n/g, "\n").replace(/\r/g, "\n"); + if (0 === f.length) f = 0; else if (this.iw) { + for (var k = h = 0, l = !1; !l;) { + var m = f.indexOf("\n", k); + -1 === m && (m = f.length, l = !0); + k = wn(f.substr(k, m - k).replace(/^\s+|\s+$/g, ""), this.Hg); + k > h && (h = k); + k = m + 1 + } + f = h + } else h = f.indexOf("\n", 0), 0 <= h && (f = f.substr(0, h)), f = k = wn(f, this.Hg); + f = Math.min(f, a / this.scale); + f = Math.max(8, f) + } else f = this.xa.width; + null !== this.S && (f = Math.min(f, this.S.af.width), + f = Math.max(f, this.S.vg.width)); + h = un(this, f, e); + m = h = isNaN(this.xa.height) ? Math.min(h, b / this.scale) : this.xa.height; + if (0 !== e.Oe && 1 !== e.te.length && this.Ek === sn && (b = this.Hg, l = this.Ek === sn ? xn(b) : 0, k = this.yj + this.zj, k = Math.max(0, vn(this) + k), m = Math.max(Math.floor(m / k) - 1, 0), !(m + 1 >= e.te.length))) { + k = e.te[m]; + for (a = Math.max(1, a - l); wn(k, b) > a && 1 < k.length;) k = k.substr(0, k.length - 1); + k += nn; + a = wn(k, b); + e.te[m] = k; + e.te = e.te.slice(0, m + 1); + e.gf[m] = a; + e.gf = e.gf.slice(0, m + 1); + e.wi = e.te.length; + e.Oe = Math.max(e.Oe, a); + this.ve = e.wi + } + if (this.bF === + rn || isNaN(this.xa.width)) f = e.Oe, isNaN(this.xa.width) && (f = Math.max(8, f)); + f = Math.max(c, f); + h = Math.max(d, h); + bb(this.Hc, f, h); + ml(this, 0, 0, f, h) + }; + qa.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + + function tn(a, b, c, d) { + b = b.replace(/^\s+|\s+$/g, ""); + var e = 0, f = 0, h = 0, k = a.Hg, f = a.yj + a.zj, l = Math.max(0, vn(a) + f), h = a.Ek === sn ? xn(k) : 0; + if (a.ve >= a.ii) return new ia(0, l); + if (a.jm === qn) { + c.wi = 1; + f = wn(b, k); + if (0 === h || f <= d) return c.Oe = f, c.gf.push(c.Oe), c.te.push(b), new ia(f, l); + var m = yn(b); + b = b.substr(m.length); + for (var n = yn(b), f = wn(m + n, k); 0 < n.length && f <= d;) m += n, b = b.substr(n.length), n = yn(b), f = wn((m + n).replace(/^\s+|\s+$/g, ""), k); + m += n.replace(/^\s+|\s+$/g, ""); + for (d = Math.max(1, d - h); wn(m, k) > d && 1 < m.length;) m = m.substr(0, + m.length - 1); + m += nn; + h = wn(m, k); + c.gf.push(h); + c.Oe = h; + c.te.push(m); + return new ia(h, l) + } + var p = 0; + 0 === b.length && (p = 1, c.gf.push(0), c.te.push(b)); + for (; 0 < b.length;) { + m = yn(b); + for (b = b.substr(m.length); wn(m, k) > d;) { + n = 1; + f = wn(m.substr(0, n), k); + for (h = 0; f <= d;) n++, h = f, f = wn(m.substr(0, n), k); + 1 === n ? (c.gf[a.ve + p] = f, e = Math.max(e, f)) : (c.gf[a.ve + p] = h, e = Math.max(e, h)); + n--; + 1 > n && (n = 1); + c.te[a.ve + p] = m.substr(0, n); + p++; + m = m.substr(n); + if (a.ve + p > a.ii) break + } + n = yn(b); + for (f = wn(m + n, k); 0 < n.length && f <= d;) m += n, b = b.substr(n.length), n = yn(b), f = wn((m + + n).replace(/^\s+|\s+$/g, ""), k); + m = m.replace(/^\s+|\s+$/g, ""); + if ("" !== m && (0 === n.length ? (c.gf.push(f), e = Math.max(e, f)) : (h = wn(m, k), c.gf.push(h), e = Math.max(e, h)), c.te.push(m), p++, a.ve + p > a.ii)) break + } + c.wi = Math.min(a.ii, p); + c.Oe = Math.max(c.Oe, e); + return new ia(c.Oe, l * c.wi) + } + + function yn(a) { + for (var b = a.length, c = 0; c < b && " " !== a.charAt(c);) c++; + for (; c < b && " " === a.charAt(c);) c++; + return c >= b ? a : a.substr(0, c) + } + + function wn(a, b) { + on !== b && (on = pn.font = b); + return pn.measureText(a).width + } + + function vn(a) { + if (null !== a.vn) return a.vn; + var b = a.Hg; + on !== b && (on = pn.font = b); + var c = 0; + void 0 !== jn[b] && 5E3 > kn ? c = jn[b] : (c = 1.3 * pn.measureText("M").width, jn[b] = c, kn++); + return a.vn = c + } + + function xn(a) { + on !== a && (on = pn.font = a); + var b = 0; + void 0 !== ln[a] && 5E3 > mn ? b = ln[a] : (b = pn.measureText(nn).width, ln[a] = b, mn++); + return b + } + + function un(a, b, c) { + var d = a.ie.replace(/\r\n/g, "\n").replace(/\r/g, "\n"), e = a.yj + a.zj, e = Math.max(0, vn(a) + e); + if (0 === d.length) return c.Oe = 0, a.ve = 1, e; + if (!a.iw) { + var f = d.indexOf("\n", 0); + 0 <= f && (d = d.substr(0, f)) + } + for (var f = 0, h = a.ve = 0, k = -1, l = !1; !l;) k = d.indexOf("\n", h), -1 === k && (k = d.length, l = !0), h <= k && (h = d.substr(h, k - h), a.jm !== qn ? (c.wi = 0, h = tn(a, h, c, b), f += h.height, a.ve += c.wi) : (tn(a, h, c, b), f += e, a.ve++), a.ve === a.ii && (l = !0)), h = k + 1; + return a.Gu = f + } + + u.defineProperty(qa, {jA: "textValidation"}, function () { + return this.Hk + }, function (a) { + var b = this.Hk; + b !== a && (null !== a && u.j(a, "function", qa, "textValidation"), this.Hk = a, this.h("textValidation", b, a)) + }); + u.defineProperty(qa, {tK: "spacingAbove"}, function () { + return this.yj + }, function (a) { + var b = this.yj; + b !== a && (this.yj = a, this.h("spacingAbove", b, a)) + }); + u.defineProperty(qa, {uK: "spacingBelow"}, function () { + return this.zj + }, function (a) { + var b = this.zj; + b !== a && (this.zj = a, this.h("spacingBelow", b, a)) + }); + u.defineProperty(qa, {WJ: "maxLines"}, function () { + return this.ii + }, function (a) { + var b = this.ii; + b !== a && (a = Math.floor(a), 0 >= a && u.wa(a, "> 0", qa, "maxLines"), this.ii = a, this.h("maxLines", b, a), this.R()) + }); + u.u(qa, {XJ: "metrics"}, function () { + return this.ej + }); + + function hn() { + this.Oe = this.wi = 0; + this.gf = []; + this.te = [] + } + + hn.prototype.reset = function () { + this.Oe = this.wi = 0; + this.gf = []; + this.te = [] + }; + hn.prototype.qs = function (a) { + this.wi = a.wi; + this.Oe = a.Oe; + this.gf = u.Pk(a.gf); + this.te = u.Pk(a.te) + }; + u.u(hn, {aJ: "arrSize"}, function () { + return this.gf + }); + u.u(hn, {bJ: "arrText"}, function () { + return this.te + }); + u.u(hn, {VJ: "maxLineWidth"}, function () { + return this.Oe + }); + + function Ri() { + S.call(this); + this.Me = null; + this.Lr = ""; + this.xj = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.zn = cd; + this.Qr = this.Aj = this.kf = null; + this.Sx = !1; + this.Zn = null; + this.JB = 0 + } + + u.Ga(Ri, S); + u.fa("Picture", Ri); + var zn = new pa, An = 0, Mi = []; + + function Bn() { + var a = Mi; + if (0 === a.length) for (var b = window.document.getElementsByTagName("canvas"), c = b.length, d = 0; d < c; d++) { + var e = b[d]; + e.parentElement && e.parentElement.Y && a.push(e.parentElement.Y) + } + return a + } + + var Cn; + Ri.clearCache = Cn = function (a) { + void 0 === a && (a = ""); + u.j(a, "string", Ri, "clearCache:url"); + "" !== a ? zn[a] && (delete zn[a], An--) : (zn = new pa, An = 0) + }; + Ri.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.element = this.Me; + a.Lr = this.Lr; + a.xj.assign(this.xj); + a.zn = this.zn; + a.kf = this.kf; + a.Aj = this.Aj; + a.Zn = this.Zn + }; + Ri.prototype.toString = function () { + return "Picture(" + this.source + ")#" + u.Uc(this) + }; + u.defineProperty(Ri, {element: "element"}, function () { + return this.Me + }, function (a) { + var b = this.Me; + b !== a && (a instanceof HTMLImageElement || a instanceof HTMLVideoElement || a instanceof HTMLCanvasElement || u.k("Picture.element must be an instance of Image, Canvas, or Video."), this.Sx = a instanceof HTMLCanvasElement, this.Me = a, !0 === a.complete || void 0 === a.complete ? (a.ou instanceof Event && null !== this.kf && this.kf(this, a.ou), !0 === a.Ux && null !== this.Aj && this.Aj(this, null), a.Ux = !0, this.xa.J() || (uj(this, !1), this.R())) : + a.iB || (a.addEventListener("load", function (b) { + Dn(a, b) + }), a.addEventListener("error", function (b) { + En(a, b) + }), a.iB = !0), this.h("element", b, a), this.ma()) + }); + u.defineProperty(Ri, {source: "source"}, function () { + return this.Lr + }, function (a) { + var b = this.Lr; + if (b !== a) { + u.j(a, "string", Ri, "source"); + this.Lr = a; + var c = zn, d = this.g; + if (void 0 !== c[a]) var e = c[a].mo[0].source; else { + 30 < An && (Cn(), c = zn); + e = u.createElement("img"); + e.addEventListener("load", function (a) { + Dn(e, a) + }); + e.addEventListener("error", function (a) { + En(e, a) + }); + e.iB = !0; + e.src = a; + var f = this.Zn; + null !== f && (e.crossOrigin = f(this)); + c[a] = new Fn(e); + An++ + } + null !== d && vk(d, this); + this.element = e; + null !== d && uk(d, this); + this.ma(); + this.h("source", + b, a) + } + }); + + function Dn(a, b) { + a.Ux = !0; + a.ou = !1; + for (var c = null, d = Bn(), e = d.length, f = 0; f < e; f++) { + var h = d[f], k = h.Tn.ta(a.src); + if (null !== k) { + e = k.length; + for (f = 0; f < e; f++) c = k[f], c.xa.J() || (h.VB.add(c), h.de()), null !== c.Aj && c.Aj(c, b); + h.ma() + } + } + } + + function En(a, b) { + a.ou = b; + for (var c = null, d = Bn(), e = d.length, f = 0; f < e; f++) if (c = d[f].Tn.ta(a.src), null !== c) { + for (var e = c.length, h = u.eb(), f = 0; f < e; f++) h.push(c[f]); + for (f = 0; f < e; f++) c = h[f], null !== c.kf && c.kf(c, b); + u.ra(h) + } + } + + u.defineProperty(Ri, {sK: "sourceCrossOrigin"}, function () { + return this.Zn + }, function (a) { + if (this.Zn !== a && (null !== a && u.j(a, "function", Ri, "sourceCrossOrigin"), this.Zn = a, null !== this.element)) { + var b = this.element.src; + null === a && "string" === typeof b ? this.element.crossOrigin = null : null !== a && (this.element.crossOrigin = a(this)) + } + }); + u.defineProperty(Ri, {Li: "sourceRect"}, function () { + return this.xj + }, function (a) { + var b = this.xj; + b.L(a) || (u.C(a, z, Ri, "sourceRect"), this.xj = a = a.Z(), this.ma(), this.h("sourceRect", b, a)) + }); + u.defineProperty(Ri, {RG: "imageStretch"}, function () { + return this.zn + }, function (a) { + var b = this.zn; + b !== a && (u.rb(a, S, Ri, "imageStretch"), this.zn = a, this.ma(), this.h("imageStretch", b, a)) + }); + u.defineProperty(Ri, {cz: "errorFunction"}, function () { + return this.kf + }, function (a) { + var b = this.kf; + b !== a && (null !== a && u.j(a, "function", Ri, "errorFunction"), this.kf = a, this.h("errorFunction", b, a)) + }); + u.defineProperty(Ri, {AK: "successFunction"}, function () { + return this.Aj + }, function (a) { + var b = this.Aj; + b !== a && (null !== a && u.j(a, "function", Ri, "successFunction"), this.Aj = a, this.h("successFunction", b, a)) + }); + Ri.prototype.Mj = function (a, b) { + var c = this.Me; + if (null !== c) { + var d = c.src; + null !== d && "" !== d || u.k("Element has no source attribute: " + c); + if (!(c.ou instanceof Event) && !0 === c.Ux) { + var d = this.Ha, e = 0, f = 0, h = this.Sx, k = h ? +c.width : c.naturalWidth, + h = h ? +c.height : c.naturalHeight; + void 0 === k && c.videoWidth && (k = c.videoWidth); + void 0 === h && c.videoHeight && (h = c.videoHeight); + k = k || d.width; + h = h || d.height; + if (0 !== k && 0 !== h) { + var l = k, m = h; + this.Li.J() && (e = this.xj.x, f = this.xj.y, k = this.xj.width, h = this.xj.height); + var n = k, p = h, q = this.zn; + switch (q) { + case qh: + if (this.Li.J()) break; + e += Math.max((n - d.width) / 2, 0); + f += Math.max((p - d.height) / 2, 0); + k = Math.min(d.width, n); + h = Math.min(d.height, p); + break; + case cd: + n = d.width; + p = d.height; + break; + case sh: + case th: + var r = 0; + q === sh ? (r = Math.min(d.height / p, d.width / n), n *= r, p *= r) : q === th && (r = Math.max(d.height / p, d.width / n), n *= r, p *= r, e += (n - d.width) / 2, f += (p - d.height) / 2, k *= 1 / (n / d.width), h *= 1 / (p / d.height), n = d.width, p = d.height) + } + this.JB = k * h; + var q = this.Hi() * b.scale, s = this.JB / (n * q * p * q), r = zn[this.source], q = null; + if (void 0 !== r && 16 < s) { + 2 > r.mo.length && (Gn(r, 4, l, m), Gn(r, 16, + l, m)); + for (var l = r.mo, m = l.length, q = l[0], t = 0; t < m; t++) if (l[t].Yo * l[t].Yo < s) q = l[t]; else break + } + if (!b.qn) { + if (null === this.Qr) if (null === this.Me) this.Qr = !1; else { + l = u.createElement("canvas").getContext("2d"); + l.drawImage(this.Me, 0, 0); + try { + l.getImageData(0, 0, 1, 1), this.Qr = !1 + } catch (v) { + this.Qr = !0 + } + } + if (this.Qr) return + } + if (b.$v("pictureRatioOptimization") && !b.Tx && void 0 !== r && null !== q && 1 !== q.Yo) { + a.save(); + r = q.Yo; + try { + a.drawImage(q.source, e / r, f / r, Math.min(q.source.width, k / r), Math.min(q.source.height, h / r), Math.max((d.width - + n) / 2, 0), Math.max((d.height - p) / 2, 0), Math.min(d.width, n), Math.min(d.height, p)) + } catch (x) { + } + a.restore() + } else try { + a.drawImage(c, e, f, k, h, Math.max((d.width - n) / 2, 0), Math.max((d.height - p) / 2, 0), Math.min(d.width, n), Math.min(d.height, p)) + } catch (B) { + } + } + } + } + }; + u.u(Ri, {Ha: "naturalBounds"}, function () { + return this.Hc + }); + Ri.prototype.Oo = function (a, b, c, d) { + var e = this.xa, f = pl(this, !0), h = this.Me, k = this.Sx; + if (k || !this.$x && h && h.complete) this.$x = !0; + null === h && (isFinite(a) || (a = 0), isFinite(b) || (b = 0)); + isFinite(e.width) || f === cd || f === fl ? (isFinite(a) || (a = this.Li.J() ? this.Li.width : k ? +h.width : h.naturalWidth), c = 0) : null !== h && !1 !== this.$x && (a = this.Li.J() ? this.Li.width : k ? +h.width : h.naturalWidth); + isFinite(e.height) || f === cd || f === el ? (isFinite(b) || (b = this.Li.J() ? this.Li.height : k ? +h.height : h.naturalHeight), d = 0) : null !== h && !1 !== this.$x && (b = + this.Li.J() ? this.Li.height : k ? +h.height : h.naturalHeight); + isFinite(e.width) && (a = e.width); + isFinite(e.height) && (b = e.height); + e = this.af; + f = this.vg; + c = Math.max(c, f.width); + d = Math.max(d, f.height); + a = Math.min(e.width, a); + b = Math.min(e.height, b); + a = Math.max(c, a); + b = Math.max(d, b); + null === h || h.complete || (isFinite(a) || (a = 0), isFinite(b) || (b = 0)); + bb(this.Hc, a, b); + ml(this, 0, 0, a, b) + }; + Ri.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + + function Fn(a) { + this.mo = [new Hn(a, 1)] + } + + function Gn(a, b, c, d) { + var e = new oa(null), f = e.getContext("2d"), h = 1 / b; + e.width = c / b; + e.height = d / b; + b = new Hn(e.Dd, b); + c = a.mo[a.mo.length - 1]; + f.setTransform(h * c.Yo, 0, 0, h * c.Yo, 0, 0); + f.drawImage(c.source, 0, 0); + a.mo.push(b) + } + + function Hn(a, b) { + this.source = a; + this.Yo = b + } + + function ka() { + this.o = new $c; + this.Tb = null + } + + g = ka.prototype; + g.reset = function () { + this.o = new $c; + this.Tb = null + }; + + function M(a, b, c, d, e, f) { + null === a.o && u.k("StreamGeometryContext has been closed"); + void 0 !== e && !0 === e ? (null === a.Tb && u.k("Need to call beginFigure first"), d = new Jd(yd), d.F = b, d.G = c, a.Tb.Fa.add(d)) : (a.Tb = new bd, a.Tb.ua = b, a.Tb.va = c, a.Tb.Ns = d, a.o.ub.add(a.Tb)); + void 0 !== f && (a.Tb.En = f) + } + + function P(a) { + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + var b = a.Tb.Fa.length; + 0 < b && a.Tb.Fa.ja(b - 1).close() + } + + function vd(a) { + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + 0 < a.Tb.Fa.length && (a.Tb.Ns = !0) + } + + g.$a = function (a) { + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + this.Tb.il = a + }; + g.moveTo = function (a, b, c) { + void 0 === c && (c = !1); + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + var d = new Jd(yd); + d.F = a; + d.G = b; + c && d.close(); + this.Tb.Fa.add(d) + }; + g.lineTo = function (a, b, c) { + void 0 === c && (c = !1); + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + var d = new Jd(pd); + d.F = a; + d.G = b; + c && d.close(); + this.Tb.Fa.add(d) + }; + + function O(a, b, c, d, e, f, h, k) { + void 0 === k && (k = !1); + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + var l = new Jd(zd); + l.Rb = b; + l.jc = c; + l.df = d; + l.ef = e; + l.F = f; + l.G = h; + k && l.close(); + a.Tb.Fa.add(l) + } + + function td(a, b, c, d, e) { + var f; + void 0 === f && (f = !1); + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + var h = new Jd(Ad); + h.Rb = b; + h.jc = c; + h.F = d; + h.G = e; + f && h.close(); + a.Tb.Fa.add(h) + } + + g.arcTo = function (a, b, c, d, e, f, h) { + void 0 === f && (f = 0); + void 0 === h && (h = !1); + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + var k = new Jd(Bd); + k.Je = a; + k.Qf = b; + k.Ja = c; + k.Ua = d; + k.radiusX = e; + k.radiusY = 0 !== f ? f : e; + h && k.close(); + this.Tb.Fa.add(k) + }; + + function ud(a, b, c, d, e, f, h, k) { + var l; + void 0 === l && (l = !1); + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + b = new Jd(Gd, h, k, b, c, d, e, f); + l && b.close(); + a.Tb.Fa.add(b) + } + + K.makeGeometry = function (a, b, c) { + var d = a.xa, e = d.width, d = d.height; + void 0 !== b && !isNaN(b) && isFinite(b) && (e = b); + void 0 !== c && !isNaN(c) && isFinite(c) && (d = c); + isFinite(e) || (e = 100); + isFinite(d) || (d = 100); + b = null; + "None" !== a.jp ? b = K.Qi[a.jp] : "None" !== a.ez ? b = K.Qi[a.ez] : (c = K.qg[a.Fb], "string" === typeof c && (c = K.qg[c]), void 0 === c && u.k("Unknown Shape.figure: " + a.Fb), b = c(a, e, d), b.Dn = e, b.Cn = d); + null === b && (c = K.qg.Rectangle, "function" === typeof c && (b = c(a, e, d))); + return b + }; + K.Ai = function (a, b, c, d, e, f, h, k, l, m, n, p, q, r) { + var s = 1 - l; + a = a * s + c * l; + b = b * s + d * l; + c = c * s + e * l; + d = d * s + f * l; + e = e * s + h * l; + f = f * s + k * l; + k = a * s + c * l; + h = b * s + d * l; + c = c * s + e * l; + d = d * s + f * l; + m.x = a; + m.y = b; + n.x = k; + n.y = h; + p.x = k * s + c * l; + p.y = h * s + d * l; + q.x = c; + q.y = d; + r.x = e; + r.y = f + }; + K.uo = function (a) { + a = K.wm(a); + var b = u.eb(); + b[0] = a[0]; + for (var c = 1, d = 1; d < a.length;) b[c] = a[d], b[c + 1] = a[d], b[c + 2] = a[d + 1], d += 2, c += 3; + u.ra(a); + return b + }; + K.wm = function (a) { + var b = K.Qk(a), c = u.eb(), d = Math.floor(b.length / 2), e = b.length - 1; + a = 0 === a % 2 ? 2 : 1; + for (var f = 0; f < e; f++) { + var h = b[f], k = b[f + 1], l = b[(d + f - 1) % e], m = b[(d + f + a) % e]; + c[2 * f] = h; + c[2 * f + 1] = K.al(h.x, h.y, l.x, l.y, k.x, k.y, m.x, m.y, new w) + } + c[c.length] = c[0]; + u.ra(b); + return c + }; + K.al = function (a, b, c, d, e, f, h, k, l) { + c = a - c; + var m = e - h, n = h = 0; + 0 === c || 0 === m ? 0 === c ? (k = (f - k) / m, h = a, n = k * h + (f - k * e)) : (d = (b - d) / c, h = e, n = d * h + (b - d * a)) : (d = (b - d) / c, k = (f - k) / m, a = b - d * a, h = (f - k * e - a) / (d - k), n = d * h + a); + l.m(h, n); + return l + }; + K.Qk = function (a) { + for (var b = u.eb(), c = 1.5 * Math.PI, d = 0, e = 0; e < a; e++) d = 2 * Math.PI / a * e + c, b[e] = new w(.5 + .5 * Math.cos(d), .5 + .5 * Math.sin(d)); + b.push(b[0]); + return b + }; + K.sA = (new L(.156, .156)).Ka(); + K.tA = (new L(.844, .844)).Ka(); + K.qg = { + None: "Rectangle", Rectangle: function (a, b, c) { + a = new $c; + a.type = md; + a.ua = 0; + a.va = 0; + a.F = b; + a.G = c; + return a + }, Square: function (a, b, c) { + a = new $c; + a.Bd = sh; + a.type = md; + a.ua = 0; + a.va = 0; + a.F = Math.min(b, c); + a.G = Math.min(b, c); + return a + }, Ellipse: function (a, b, c) { + a = new $c; + a.type = nd; + a.ua = 0; + a.va = 0; + a.F = b; + a.G = c; + a.A = K.sA; + a.B = K.tA; + return a + }, Circle: function (a, b, c) { + a = new $c; + a.Bd = sh; + a.type = nd; + a.ua = 0; + a.va = 0; + a.F = Math.min(b, c); + a.G = Math.min(b, c); + a.A = K.sA; + a.B = K.tA; + return a + }, Connector: "Ellipse", TriangleRight: function (a, b, c) { + a = new $c; + var d = + new bd, e = new Jd; + e.F = b; + e.G = .5 * c; + d.Fa.add(e); + b = new Jd; + b.F = 0; + b.G = c; + d.Fa.add(b.close()); + a.ub.add(d); + a.A = new L(0, .25); + a.B = new L(.5, .75); + return a + }, TriangleDown: function (a, b, c) { + a = new $c; + var d = new bd, e = new Jd; + e.F = b; + e.G = 0; + d.Fa.add(e); + e = new Jd; + e.F = .5 * b; + e.G = c; + d.Fa.add(e.close()); + a.ub.add(d); + a.A = new L(.25, 0); + a.B = new L(.75, .5); + return a + }, TriangleLeft: function (a, b, c) { + a = new $c; + var d = new bd; + d.ua = b; + d.va = c; + var e = new Jd; + e.F = 0; + e.G = .5 * c; + d.Fa.add(e); + c = new Jd; + c.F = b; + c.G = 0; + d.Fa.add(c.close()); + a.ub.add(d); + a.A = new L(.5, .25); + a.B = new L(1, .75); + return a + }, TriangleUp: function (a, b, c) { + a = new $c; + var d = new bd; + d.ua = b; + d.va = c; + var e = new Jd; + e.F = 0; + e.G = c; + d.Fa.add(e); + c = new Jd; + c.F = .5 * b; + c.G = 0; + d.Fa.add(c.close()); + a.ub.add(d); + a.A = new L(.25, .5); + a.B = new L(.75, 1); + return a + }, Line1: function (a, b, c) { + a = new $c; + a.type = dd; + a.ua = 0; + a.va = 0; + a.F = b; + a.G = c; + return a + }, Line2: function (a, b, c) { + a = new $c; + a.type = dd; + a.ua = b; + a.va = 0; + a.F = 0; + a.G = c; + return a + }, MinusLine: "LineH", LineH: function (a, b, c) { + a = new $c; + a.type = dd; + a.ua = 0; + a.va = c / 2; + a.F = b; + a.G = c / 2; + return a + }, LineV: function (a, b, c) { + a = + new $c; + a.type = dd; + a.ua = b / 2; + a.va = 0; + a.F = b / 2; + a.G = c; + return a + }, BarH: "Rectangle", BarV: "Rectangle", Curve1: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 0, 0, !1); + O(a, d * b, 0, 1 * b, (1 - d) * c, b, c); + b = a.o; + u.q(a); + return b + }, Curve2: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 0, 0, !1); + O(a, 0, d * c, (1 - d) * b, c, b, c); + b = a.o; + u.q(a); + return b + }, Curve3: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 1 * b, 0, !1); + O(a, 1 * b, d * c, d * b, 1 * c, 0, 1 * c); + b = a.o; + u.q(a); + return b + }, Curve4: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 1 * b, 0, !1); + O(a, (1 - d) * b, 0, 0, (1 - d) * c, 0, 1 * c); + b = a.o; + u.q(a); + return b + }, Alternative: "Triangle", Merge: "Triangle", Triangle: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0 * c, !0); + a.lineTo(0 * b, 1 * c); + a.lineTo(1 * b, 1 * c, !0); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, 1); + u.q(a); + return b + }, Decision: "Diamond", Diamond: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(0, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(1 * b, .5 * c, !0); + b = a.o; + b.A = new L(.25, .25); + b.B = new L(.75, .75); + u.q(a); + return b + }, Pentagon: function (a, b, c) { + var d = K.Qk(5); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 5 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.2, .22); + b.B = new L(.8, .9); + u.q(a); + return b + }, DataTransmission: "Hexagon", Hexagon: function (a, b, c) { + var d = K.Qk(6); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 6 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.07, .25); + b.B = new L(.93, .75); + u.q(a); + return b + }, Heptagon: function (a, b, c) { + var d = K.Qk(7); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 7 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.2, .15); + b.B = new L(.8, .85); + u.q(a); + return b + }, Octagon: function (a, + b, c) { + var d = K.Qk(8); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 8 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.15, .15); + b.B = new L(.85, .85); + u.q(a); + return b + }, Nonagon: function (a, b, c) { + var d = K.Qk(9); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 9 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.17, .13); + b.B = new L(.82, .82); + u.q(a); + return b + }, Decagon: function (a, b, c) { + var d = K.Qk(10); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 10 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.16, .16); + b.B = new L(.84, .84); + u.q(a); + return b + }, Dodecagon: function (a, b, c) { + var d = K.Qk(12); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 12 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.16, .16); + b.B = new L(.84, .84); + u.q(a); + return b + }, FivePointedStar: function (a, b, c) { + var d = K.wm(5); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 10 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.312, .383); + b.B = new L(.693, .765); + u.q(a); + return b + }, SixPointedStar: function (a, b, c) { + var d = + K.wm(6); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 12 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.17, .251); + b.B = new L(.833, .755); + u.q(a); + return b + }, SevenPointedStar: function (a, b, c) { + var d = K.wm(7); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 14 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.363, .361); + b.B = new L(.641, .709); + u.q(a); + return b + }, EightPointedStar: function (a, b, c) { + var d = K.wm(8); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 16 > e; e++) a.lineTo(d[e].x * b, d[e].y * + c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.252, .255); + b.B = new L(.75, .75); + u.q(a); + return b + }, NinePointedStar: function (a, b, c) { + var d = K.wm(9); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 18 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.355, .361); + b.B = new L(.645, .651); + u.q(a); + return b + }, TenPointedStar: function (a, b, c) { + var d = K.wm(10); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 20 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.281, .261); + b.B = new L(.723, .748); + u.q(a); + return b + }, FivePointedBurst: function (a, + b, c) { + var d = K.uo(5); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.312, .383); + b.B = new L(.693, .765); + u.q(a); + return b + }, SixPointedBurst: function (a, b, c) { + var d = K.uo(6); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.17, .251); + b.B = new L(.833, .755); + u.q(a); + return b + }, SevenPointedBurst: function (a, + b, c) { + var d = K.uo(7); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.363, .361); + b.B = new L(.641, .709); + u.q(a); + return b + }, EightPointedBurst: function (a, b, c) { + var d = K.uo(8); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.252, .255); + b.B = new L(.75, .75); + u.q(a); + return b + }, NinePointedBurst: function (a, + b, c) { + var d = K.uo(9); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.355, .361); + b.B = new L(.645, .651); + u.q(a); + return b + }, TenPointedBurst: function (a, b, c) { + var d = K.uo(10); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.281, .261); + b.B = new L(.723, .748); + u.q(a); + return b + }, Cloud: function (a, b, c) { + a = + u.p(); + M(a, .08034461 * b, .1944299 * c, !0); + O(a, -.09239631 * b, .07836421 * c, .1406031 * b, -.0542823 * c, .2008615 * b, .05349299 * c); + O(a, .2450511 * b, -.00697547 * c, .3776197 * b, -.01112067 * c, .4338609 * b, .074219 * c); + O(a, .4539471 * b, 0, .6066018 * b, -.02526587 * c, .6558228 * b, .07004196 * c); + O(a, .6914277 * b, -.01904177 * c, .8921095 * b, -.01220843 * c, .8921095 * b, .08370865 * c); + O(a, 1.036446 * b, .04105738 * c, 1.020377 * b, .3022052 * c, .9147671 * b, .3194596 * c); + O(a, 1.04448 * b, .360238 * c, .992256 * b, .5219009 * c, .9082935 * b, .562044 * c); + O(a, 1.032337 * b, .5771781 * c, 1.018411 * + b, .8120651 * c, .9212406 * b, .8217117 * c); + O(a, 1.028411 * b, .9571472 * c, .8556702 * b, 1.052487 * c, .7592566 * b, .9156953 * c); + O(a, .7431877 * b, 1.009325 * c, .5624123 * b, 1.021761 * c, .5101666 * b, .9310455 * c); + O(a, .4820677 * b, 1.031761 * c, .3030112 * b, 1.002796 * c, .2609328 * b, .9344623 * c); + O(a, .2329994 * b, 1.01518 * c, .03213784 * b, 1.01518 * c, .08034461 * b, .870098 * c); + O(a, -.02812061 * b, .9032597 * c, -.01205169 * b, .6835638 * c, .06829292 * b, .6545475 * c); + O(a, -.01812061 * b, .6089503 * c, -.00606892 * b, .4555777 * c, .06427569 * b, .4265613 * c); + O(a, -.01606892 * b, .3892545 * c, -.01205169 * + b, .1944299 * c, .08034461 * b, .1944299 * c); + P(a); + b = a.o; + b.A = new L(.1, .1); + b.B = new L(.9, .9); + u.q(a); + return b + }, Gate: "Crescent", Crescent: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + O(a, 1 * b, 0, 1 * b, 1 * c, 0, 1 * c); + O(a, .5 * b, .75 * c, .5 * b, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.511, .19); + b.B = new L(.776, .76); + u.q(a); + return b + }, FramedRectangle: function (a, b, c) { + var d = u.p(), e = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(e) && (e = .1); + isNaN(a) && (a = .1); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c, !0); + M(d, e * b, a * c, !1, !0); + d.lineTo(e * b, (1 - a) * c); + d.lineTo((1 - + e) * b, (1 - a) * c); + d.lineTo((1 - e) * b, a * c, !0); + b = d.o; + b.A = new L(e, a); + b.B = new L(1 - e, 1 - a); + u.q(d); + return b + }, Delay: "HalfEllipse", HalfEllipse: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 0, 0, !0); + O(a, d * b, 0, 1 * b, (.5 - d / 2) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d / 2) * c, d * b, 1 * c, 0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .2); + b.B = new L(.75, .8); + u.q(a); + return b + }, Heart: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 1 * c, !0); + O(a, .1 * b, .8 * c, 0, .5 * c, 0 * b, .3 * c); + O(a, 0 * b, 0, .45 * b, 0, .5 * b, .3 * c); + O(a, .55 * b, 0, 1 * b, 0, 1 * b, .3 * c); + O(a, b, .5 * c, .9 * b, .8 * c, .5 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.15, .29); + b.B = new L(.86, .68); + u.q(a); + return b + }, Spade: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(.51 * b, .01 * c); + O(a, .6 * b, .2 * c, b, .25 * c, b, .5 * c); + O(a, b, .8 * c, .6 * b, .8 * c, .55 * b, .7 * c); + O(a, .5 * b, .75 * c, .55 * b, .95 * c, .75 * b, c); + a.lineTo(.25 * b, c); + O(a, .45 * b, .95 * c, .5 * b, .75 * c, .45 * b, .7 * c); + O(a, .4 * b, .8 * c, 0, .8 * c, 0, .5 * c); + O(a, 0, .25 * c, .4 * b, .2 * c, .49 * b, .01 * c); + P(a); + b = a.o; + b.A = new L(.19, .26); + b.B = new L(.8, .68); + u.q(a); + return b + }, Club: function (a, b, c) { + a = u.p(); + M(a, .4 * b, .6 * c, !0); + O(a, .5 * b, .75 * c, .45 * b, .95 * c, .15 * b, 1 * c); + a.lineTo(.85 * b, c); + O(a, .55 * b, + .95 * c, .5 * b, .75 * c, .6 * b, .6 * c); + var d = .2, e = .3, f = 0, h = 4 * (Math.SQRT2 - 1) / 3 * d; + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e + .05) * b, (.5 - h + f - .02) * c, .65 * b, .36771243 * c); + d = .2; + e = 0; + f = -.3; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, .35 * b, .36771243 * c); + d = .2; + e = -.3; + f = 0; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + O(a, (.5 + d + e - .05) * b, (.5 - h + f - .02) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, .4 * b, .6 * c); + P(a); + b = a.o; + b.A = new L(.06, .39); + b.B = new L(.93, .58); + u.q(a); + return b + }, Ring: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, b, .5 * c, !0); + O(a, b, (.5 - d) * c, (.5 + d) * b, 0, .5 * b, 0); + O(a, (.5 - d) * b, 0, 0, (.5 - d) * c, 0, .5 * c); + O(a, 0, (.5 + d) * c, (.5 - d) * b, c, .5 * b, c); + O(a, (.5 + d) * b, c, b, (.5 + d) * c, b, .5 * c); + d = 4 * (Math.SQRT2 - 1) / 3 * .4; + M(a, .5 * b, .1 * c, !0, !0); + O(a, (.5 + d) * b, .1 * c, .9 * b, (.5 - d) * c, .9 * b, .5 * c); + O(a, .9 * b, (.5 + d) * c, (.5 + d) * b, .9 * c, .5 * b, .9 * c); + O(a, (.5 - d) * b, .9 * c, .1 * b, (.5 + d) * c, .1 * b, .5 * c); + O(a, .1 * b, (.5 - d) * c, (.5 - d) * b, .1 * c, .5 * b, .1 * c); + b = a.o; + b.A = new L(.146, .146); + b.B = new L(.853, + .853); + b.Bd = sh; + u.q(a); + return b + }, YinYang: function (a, b, c) { + var d = .5; + a = u.p(); + d = .5; + M(a, .5 * b, 0, !0); + a.arcTo(270, 180, .5 * b, .5 * b, .5 * b); + O(a, 1 * b, d * c, 0, d * c, d * b, 0, !0); + var d = .1, e = .25; + M(a, (.5 + d) * b, e * c, !0, !0); + a.arcTo(0, -360, .5 * b, c * e, d * b); + P(a); + M(a, .5 * b, 0, !1); + a.arcTo(270, -180, .5 * b, .5 * b, .5 * b); + a.$a(!1); + e = .75; + M(a, (.5 + d) * b, e * c, !0); + a.arcTo(0, 360, .5 * b, c * e, d * b); + P(a); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, Peace: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, b, .5 * c, !0); + O(a, b, (.5 - d) * c, (.5 + d) * b, 0, .5 * b, 0); + O(a, (.5 - d) * b, 0, 0, (.5 - + d) * c, 0, .5 * c); + O(a, 0, (.5 + d) * c, (.5 - d) * b, c, .5 * b, c); + O(a, (.5 + d) * b, c, b, (.5 + d) * c, b, .5 * c); + d = 4 * (Math.SQRT2 - 1) / 3 * .4; + M(a, .5 * b, .1 * c, !0, !0); + O(a, (.5 + d) * b, .1 * c, .9 * b, (.5 - d) * c, .9 * b, .5 * c); + O(a, .9 * b, (.5 + d) * c, (.5 + d) * b, .9 * c, .5 * b, .9 * c); + O(a, (.5 - d) * b, .9 * c, .1 * b, (.5 + d) * c, .1 * b, .5 * c); + O(a, .1 * b, (.5 - d) * c, (.5 - d) * b, .1 * c, .5 * b, .1 * c); + var d = .07, e = 0, f = -.707 * .11, h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * + b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + d = .07; + e = -.707 * .11; + f = .707 * .11; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * + c); + d = .07; + e = .707 * .11; + f = .707 * .11; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + b = a.o; + b.A = new L(.146, .146); + b.B = new L(.853, .853); + b.Bd = sh; + u.q(a); + return b + }, NotAllowed: function (a, b, c) { + var d = K.sa, e = .5 * d, f = .5; + a = u.p(); + M(a, .5 * b, (.5 - + f) * c, !0); + O(a, (.5 - e) * b, (.5 - f) * c, (.5 - f) * b, (.5 - e) * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 + e) * c, (.5 - e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 + e) * b, (.5 + f) * c, (.5 + f) * b, (.5 + e) * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 - e) * c, (.5 + e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + var f = .4, e = .4 * d, d = u.K(), h = u.K(), k = u.K(), l = u.K(); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .42, d, h, k, l, l); + var m = u.K(), n = u.K(), p = u.K(); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .58, l, l, p, m, n); + var q = u.K(), r = u.K(), s = u.K(); + K.Ai(.5, .5 + f, .5 - e, .5 + f, .5 - f, .5 + e, .5 - f, .5, .42, q, r, s, l, l); + var t = u.K(), v = u.K(), x = u.K(); + K.Ai(.5, .5 + f, .5 - e, .5 + f, .5 - f, .5 + e, .5 - f, .5, .58, l, l, x, t, v); + M(a, x.x * b, x.y * c, !0, !0); + O(a, t.x * b, t.y * c, v.x * b, v.y * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 - e) * c, (.5 - e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + O(a, d.x * b, d.y * c, h.x * b, h.y * c, k.x * b, k.y * c); + a.lineTo(x.x * b, x.y * c); + P(a); + M(a, s.x * b, s.y * c, !0, !0); + a.lineTo(p.x * b, p.y * c); + O(a, m.x * b, m.y * c, n.x * b, n.y * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 + e) * c, (.5 + e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, q.x * b, q.y * c, r.x * b, r.y * c, s.x * b, s.y * c); + P(a); + u.v(d); + u.v(h); + u.v(k); + u.v(l); + u.v(m); + u.v(n); + u.v(p); + u.v(q); + u.v(r); + u.v(s); + u.v(t); + u.v(v); + u.v(x); + b = a.o; + u.q(a); + b.Bd = sh; + return b + }, Fragile: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.25 * b, 0); + a.lineTo(.2 * b, .15 * c); + a.lineTo(.3 * b, .25 * c); + a.lineTo(.29 * b, .33 * c); + a.lineTo(.35 * b, .25 * c); + a.lineTo(.3 * b, .15 * c); + a.lineTo(.4 * b, 0); + a.lineTo(1 * b, 0); + O(a, 1 * b, .25 * c, .75 * b, .5 * c, .55 * b, .5 * c); + a.lineTo(.55 * b, .9 * c); + a.lineTo(.7 * b, .9 * c); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.3 * b, 1 * c); + a.lineTo(.3 * b, .9 * c); + a.lineTo(.45 * b, .9 * c); + a.lineTo(.45 * b, .5 * c); + O(a, .25 * b, .5 * c, 0, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = + new L(.25, 0); + b.B = new L(.75, .4); + u.q(a); + return b + }, HourGlass: function (a, b, c) { + a = u.p(); + M(a, .65 * b, .5 * c, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(.35 * b, .5 * c); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + P(a); + b = a.o; + u.q(a); + return b + }, Lightning: function (a, b, c) { + a = u.p(); + M(a, 0 * b, .55 * c, !0); + a.lineTo(.75 * b, 0); + a.lineTo(.25 * b, .45 * c); + a.lineTo(.9 * b, .48 * c); + a.lineTo(.4 * b, 1 * c); + a.lineTo(.65 * b, .55 * c); + P(a); + b = a.o; + u.q(a); + return b + }, Parallelogram1: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo((1 - + a) * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, Input: "Output", Output: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !0); + a.lineTo(.1 * b, 0); + a.lineTo(1 * b, 0); + a.lineTo(.9 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.1, 0); + b.B = new L(.9, 1); + u.q(a); + return b + }, Parallelogram2: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .25); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo((1 - a) * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, ThickCross: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && + (a = .25); + var d = u.p(); + M(d, (.5 - a / 2) * b, 0, !0); + d.lineTo((.5 + a / 2) * b, 0); + d.lineTo((.5 + a / 2) * b, (.5 - a / 2) * c); + d.lineTo(1 * b, (.5 - a / 2) * c); + d.lineTo(1 * b, (.5 + a / 2) * c); + d.lineTo((.5 + a / 2) * b, (.5 + a / 2) * c); + d.lineTo((.5 + a / 2) * b, 1 * c); + d.lineTo((.5 - a / 2) * b, 1 * c); + d.lineTo((.5 - a / 2) * b, (.5 + a / 2) * c); + d.lineTo(0, (.5 + a / 2) * c); + d.lineTo(0, (.5 - a / 2) * c); + d.lineTo((.5 - a / 2) * b, (.5 - a / 2) * c); + P(d); + b = d.o; + b.A = new L(.5 - a / 2, .5 - a / 2); + b.B = new L(.5 + a / 2, .5 + a / 2); + u.q(d); + return b + }, ThickX: function (a, b, c) { + a = .25 / Math.SQRT2; + var d = u.p(); + M(d, .3 * b, 0, !0); + d.lineTo(.5 * b, .2 * c); + d.lineTo(.7 * b, 0); + d.lineTo(1 * b, .3 * c); + d.lineTo(.8 * b, .5 * c); + d.lineTo(1 * b, .7 * c); + d.lineTo(.7 * b, 1 * c); + d.lineTo(.5 * b, .8 * c); + d.lineTo(.3 * b, 1 * c); + d.lineTo(0, .7 * c); + d.lineTo(.2 * b, .5 * c); + d.lineTo(0, .3 * c); + P(d); + b = d.o; + b.A = new L(.5 - a, .5 - a); + b.B = new L(.5 + a, .5 + a); + u.q(d); + return b + }, ThinCross: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .1); + a = u.p(); + M(a, (.5 - d / 2) * b, 0, !0); + a.lineTo((.5 + d / 2) * b, 0); + a.lineTo((.5 + d / 2) * b, (.5 - d / 2) * c); + a.lineTo(1 * b, (.5 - d / 2) * c); + a.lineTo(1 * b, (.5 + d / 2) * c); + a.lineTo((.5 + d / 2) * b, (.5 + d / 2) * c); + a.lineTo((.5 + d / 2) * + b, 1 * c); + a.lineTo((.5 - d / 2) * b, 1 * c); + a.lineTo((.5 - d / 2) * b, (.5 + d / 2) * c); + a.lineTo(0, (.5 + d / 2) * c); + a.lineTo(0, (.5 - d / 2) * c); + a.lineTo((.5 - d / 2) * b, (.5 - d / 2) * c); + P(a); + b = a.o; + u.q(a); + return b + }, ThinX: function (a, b, c) { + a = u.p(); + M(a, .1 * b, 0, !0); + a.lineTo(.5 * b, .4 * c); + a.lineTo(.9 * b, 0); + a.lineTo(1 * b, .1 * c); + a.lineTo(.6 * b, .5 * c); + a.lineTo(1 * b, .9 * c); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.5 * b, .6 * c); + a.lineTo(.1 * b, 1 * c); + a.lineTo(0, .9 * c); + a.lineTo(.4 * b, .5 * c); + a.lineTo(0, .1 * c); + P(a); + return a.o + }, RightTriangle: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, + 1 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .5); + b.B = new L(.5, 1); + u.q(a); + return b + }, RoundedIBeam: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, 0); + O(a, .5 * b, .25 * c, .5 * b, .75 * c, 1 * b, 1 * c); + a.lineTo(0, 1 * c); + O(a, .5 * b, .75 * c, .5 * b, .25 * c, 0, 0); + P(a); + b = a.o; + u.q(a); + return b + }, RoundedRectangle: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = 5); + d = Math.min(d, b / 3); + d = Math.min(d, c / 3); + a = d * K.sa; + var e = u.p(); + M(e, d, 0, !0); + e.lineTo(b - d, 0); + O(e, b - a, 0, b, a, b, d); + e.lineTo(b, c - d); + O(e, b, c - a, b - a, c, b - d, c); + e.lineTo(d, c); + O(e, a, c, 0, c - a, 0, c - d); + e.lineTo(0, + d); + O(e, 0, a, a, 0, d, 0); + P(e); + b = e.o; + 1 < a ? (b.A = new L(0, 0, a, a), b.B = new L(1, 1, -a, -a)) : (b.A = xb, b.B = Vb); + u.q(e); + return b + }, Border: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = 5); + d = Math.min(d, b / 3); + d = Math.min(d, c / 3); + a = u.p(); + M(a, d, 0, !0); + a.lineTo(b - d, 0); + O(a, b - 0, 0, b, 0, b, d); + a.lineTo(b, c - d); + O(a, b, c - 0, b - 0, c, b - d, c); + a.lineTo(d, c); + O(a, 0, c, 0, c - 0, 0, c - d); + a.lineTo(0, d); + O(a, 0, 0, 0, 0, d, 0); + P(a); + b = a.o; + b.A = xb; + b.B = Vb; + u.q(a); + return b + }, SquareIBeam: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .2); + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, d * c); + a.lineTo((.5 + d / 2) * b, d * c); + a.lineTo((.5 + d / 2) * b, (1 - d) * c); + a.lineTo(1 * b, (1 - d) * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, (1 - d) * c); + a.lineTo((.5 - d / 2) * b, (1 - d) * c); + a.lineTo((.5 - d / 2) * b, d * c); + a.lineTo(0, d * c); + P(a); + b = a.o; + u.q(a); + return b + }, Trapezoid: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .2); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo((1 - a) * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, ManualLoop: "ManualOperation", ManualOperation: function (a, b, c) { + var d = + a ? a.xc : NaN; + isNaN(d) && (d = 0); + a = u.p(); + M(a, d, 0, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.1 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.1, 0); + b.B = new L(.9, 1); + u.q(a); + return b + }, GenderMale: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .4 * d, f = .4, h = u.K(), k = u.K(), l = u.K(), m = u.K(); + M(a, (.5 - f) * b, .5 * c, !0); + O(a, (.5 - f) * b, (.5 - e) * c, (.5 - e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .44, l, m, k, h, h); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, k.x * b, k.y * c); + var n = u.fc(k.x, k.y); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .56, + h, h, k, l, m); + var p = u.fc(k.x, k.y); + a.lineTo((.1 * n.x + .855) * b, .1 * n.y * c); + a.lineTo(.85 * b, .1 * n.y * c); + a.lineTo(.85 * b, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .15 * c); + a.lineTo((.1 * p.x + .9) * b, .15 * c); + a.lineTo((.1 * p.x + .9) * b, (.1 * p.y + .05 * .9) * c); + a.lineTo(p.x * b, p.y * c); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 + e) * c, (.5 + e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 - e) * b, (.5 + f) * c, (.5 - f) * b, (.5 + e) * c, (.5 - f) * b, .5 * c); + f = .35; + e = .35 * d; + M(a, .5 * b, (.5 - f) * c, !0, !0); + O(a, (.5 - e) * b, (.5 - f) * c, (.5 - f) * b, (.5 - e) * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 + + e) * c, (.5 - e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 + e) * b, (.5 + f) * c, (.5 + f) * b, (.5 + e) * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 - e) * c, (.5 + e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + M(a, (.5 - f) * b, .5 * c, !0); + u.v(h); + u.v(k); + u.v(l); + u.v(m); + u.v(n); + u.v(p); + b = a.o; + b.A = new L(.202, .257); + b.B = new L(.692, .839); + b.Bd = sh; + u.q(a); + return b + }, GenderFemale: function (a, b, c) { + a = u.p(); + var d = .375, e = 0, f = -.125, h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.525 + e) * b, (.5 + d + f) * c, !0); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * + b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.475 + e) * b, (.5 + d + f) * c); + a.lineTo(.475 * b, .85 * c); + a.lineTo(.425 * b, .85 * c); + a.lineTo(.425 * b, .9 * c); + a.lineTo(.475 * b, .9 * c); + a.lineTo(.475 * b, 1 * c); + a.lineTo(.525 * b, 1 * c); + a.lineTo(.525 * b, .9 * c); + a.lineTo(.575 * b, .9 * c); + a.lineTo(.575 * b, .85 * c); + a.lineTo(.525 * b, .85 * c); + P(a); + d = .325; + e = 0; + f = -.125; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0, !0); + O(a, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + + h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 - h + e) * b, (.5 + d + f) * c, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + M(a, (.525 + e) * b, (.5 + d + f) * c, !0); + b = a.o; + b.A = new L(.232, .136); + b.B = new L(.782, .611); + b.Bd = sh; + u.q(a); + return b + }, PlusLine: function (a, b, c) { + a = u.p(); + M(a, 0, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + a.moveTo(.5 * b, 0); + a.lineTo(.5 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, XLine: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(1 * b, 0); + a.moveTo(0, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, AsteriskLine: function (a, b, c) { + a = u.p(); + var d = .2 / Math.SQRT2; + M(a, d * b, (1 - d) * c, !1); + a.lineTo((1 - d) * b, d * c); + a.moveTo(d * b, d * c); + a.lineTo((1 - d) * b, (1 - d) * c); + a.moveTo(0 * b, .5 * c); + a.lineTo(1 * b, .5 * c); + a.moveTo(.5 * b, 0 * c); + a.lineTo(.5 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, CircleLine: function (a, b, c) { + var d = .5 * K.sa; + a = u.p(); + M(a, 1 * b, .5 * c, !1); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.A = new L(.146, .146); + b.B = new L(.853, .853); + b.Bd = sh; + u.q(a); + return b + }, Pie: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, (.5 * Math.SQRT2 / 2 + .5) * b, (.5 - .5 * Math.SQRT2 / 2) * c, !0); + O(a, .7 * b, 0 * c, .5 * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 - d + 0) * b, 0 * c, 0 * b, (.5 - d + 0) * c, 0 * b, .5 * c); + O(a, 0 * b, (.5 + d + 0) * c, (.5 - d + 0) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 + d + 0) * b, 1 * c, 1 * b, (.5 + d + 0) * c, 1 * b, .5 * c); + a.lineTo(.5 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, PiePiece: function (a, b, c) { + var d = K.sa / Math.SQRT2 * .5, e = Math.SQRT2 / 2, f = 1 - + Math.SQRT2 / 2; + a = u.p(); + M(a, b, c, !0); + O(a, b, (1 - d) * c, (e + d) * b, (f + d) * c, e * b, f * c); + a.lineTo(0, c); + P(a); + b = a.o; + u.q(a); + return b + }, StopSign: function (a, b, c) { + a = 1 / (Math.SQRT2 + 2); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo((1 - a) * b, 0); + d.lineTo(1 * b, a * c); + d.lineTo(1 * b, (1 - a) * c); + d.lineTo((1 - a) * b, 1 * c); + d.lineTo(a * b, 1 * c); + d.lineTo(0, (1 - a) * c); + d.lineTo(0, a * c); + P(d); + b = d.o; + b.A = new L(a / 2, a / 2); + b.B = new L(1 - a / 2, 1 - a / 2); + u.q(d); + return b + }, LogicImplies: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .2); + a = u.p(); + M(a, (1 - d) * b, 0 * c, !1); + a.lineTo(1 * b, .5 * c); + a.lineTo((1 - + d) * b, c); + a.moveTo(0, .5 * c); + a.lineTo(b, .5 * c); + b = a.o; + b.A = xb; + b.B = new L(.8, .5); + u.q(a); + return b + }, LogicIff: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .2); + a = u.p(); + M(a, (1 - d) * b, 0 * c, !1); + a.lineTo(1 * b, .5 * c); + a.lineTo((1 - d) * b, c); + a.moveTo(0, .5 * c); + a.lineTo(b, .5 * c); + a.moveTo(d * b, 0); + a.lineTo(0, .5 * c); + a.lineTo(d * b, c); + b = a.o; + b.A = new L(.2, 0); + b.B = new L(.8, .5); + u.q(a); + return b + }, LogicNot: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, LogicAnd: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(.5 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, 1); + u.q(a); + return b + }, LogicOr: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.lineTo(1 * b, 0); + b = a.o; + b.A = new L(.219, 0); + b.B = new L(.78, .409); + u.q(a); + return b + }, LogicXor: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.moveTo(0, .5 * c); + a.lineTo(1 * b, .5 * c); + var d = .5 * K.sa; + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, LogicTruth: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.moveTo(.5 * b, 0); + a.lineTo(.5 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, LogicFalsity: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(1 * b, 1 * c); + a.moveTo(.5 * b, 1 * c); + a.lineTo(.5 * b, 0); + b = a.o; + u.q(a); + return b + }, LogicThereExists: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(0, .5 * c); + a.moveTo(1 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + b = a.o; + u.q(a); + return b + }, LogicForAll: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.lineTo(1 * b, 0); + a.moveTo(.25 * b, .5 * c); + a.lineTo(.75 * b, .5 * c); + b = a.o; + b.A = new L(.25, 0); + b.B = new L(.75, .5); + u.q(a); + return b + }, LogicIsDefinedAs: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(b, 0); + a.moveTo(0, .5 * c); + a.lineTo(b, .5 * c); + a.moveTo(0, c); + a.lineTo(b, c); + b = a.o; + b.A = new L(.01, .01); + b.B = new L(.99, .49); + u.q(a); + return b + }, LogicIntersect: function (a, b, c) { + var d = .5 * K.sa; + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + b = + a.o; + b.A = new L(0, .5); + b.B = Vb; + u.q(a); + return b + }, LogicUnion: function (a, b, c) { + var d = .5 * K.sa; + a = u.p(); + M(a, 1 * b, 0, !1); + a.lineTo(1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + a.lineTo(0, 0); + b = a.o; + b.A = xb; + b.B = new L(1, .5); + u.q(a); + return b + }, Arrow: function (a, b, c) { + var d = a ? a.xc : NaN, e = a ? a.et : NaN; + isNaN(d) && (d = .3); + isNaN(e) && (e = .3); + a = u.p(); + M(a, 0, (.5 - e / 2) * c, !0); + a.lineTo((1 - d) * b, (.5 - e / 2) * c); + a.lineTo((1 - d) * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo((1 - d) * b, 1 * c); + a.lineTo((1 - d) * b, (.5 + e / 2) * c); + a.lineTo(0, + (.5 + e / 2) * c); + P(a); + b = a.o; + b.A = new L(0, .5 - e / 2); + d = K.al(0, .5 + e / 2, 1, .5 + e / 2, 1 - d, 1, 1, .5, u.K()); + b.B = new L(d.x, d.y); + u.v(d); + u.q(a); + return b + }, ISOProcess: "Chevron", Chevron: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.5 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(.5 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, DoubleArrow: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.3 * b, .214 * c); + a.lineTo(.3 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.3 * b, 1 * c); + a.lineTo(.3 * b, .786 * c); + a.lineTo(0, 1 * c); + P(a); + M(a, .3 * b, .214 * c, !1); + a.lineTo(.3 * b, .786 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, DoubleEndArrow: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.7 * b, .7 * c); + a.lineTo(.3 * b, .7 * c); + a.lineTo(.3 * b, 1 * c); + a.lineTo(0, .5 * c); + a.lineTo(.3 * b, 0); + a.lineTo(.3 * b, .3 * c); + a.lineTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + c = K.al(0, .5, .3, 0, 0, .3, .3, .3, u.K()); + b.A = new L(c.x, c.y); + c = K.al(.7, 1, 1, .5, .7, .7, 1, .7, c); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, IBeamArrow: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.7 * + b, .7 * c); + a.lineTo(.2 * b, .7 * c); + a.lineTo(.2 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.2 * b, 0); + a.lineTo(.2 * b, .3 * c); + a.lineTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + b.A = new L(0, .3); + c = K.al(.7, 1, 1, .5, .7, .7, 1, .7, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, Pointer: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(0, 1 * c); + a.lineTo(.2 * b, .5 * c); + a.lineTo(0, 0); + P(a); + b = a.o; + b.A = new L(.2, .35); + c = K.al(.2, .65, 1, .65, 0, 1, 1, .5, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, RoundedPointer: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(0, 1 * c); + O(a, .5 * b, .75 * c, .5 * b, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.4, .35); + c = K.al(.2, .65, 1, .65, 0, 1, 1, .5, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, SplitEndArrow: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.7 * b, .7 * c); + a.lineTo(0, .7 * c); + a.lineTo(.2 * b, .5 * c); + a.lineTo(0, .3 * c); + a.lineTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + b.A = new L(.2, .3); + c = K.al(.7, 1, 1, .5, .7, .7, 1, .7, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, MessageToUser: "SquareArrow", SquareArrow: function (a, + b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + b.A = xb; + b.B = new L(.7, 1); + u.q(a); + return b + }, Cone1: function (a, b, c) { + var d = K.sa; + a = .5 * d; + var e = .1 * d, d = u.p(); + M(d, 0, .9 * c, !0); + d.lineTo(.5 * b, 0); + d.lineTo(1 * b, .9 * c); + O(d, 1 * b, (.9 + e) * c, (.5 + a) * b, 1 * c, .5 * b, 1 * c); + O(d, (.5 - a) * b, 1 * c, 0, (.9 + e) * c, 0, .9 * c); + P(d); + b = d.o; + b.A = new L(.25, .5); + b.B = new L(.75, .97); + u.q(d); + return b + }, Cone2: function (a, b, c) { + a = u.p(); + M(a, 0, .9 * c, !0); + O(a, (1 - .85 / .9) * b, 1 * c, .85 / .9 * b, 1 * c, 1 * b, .9 * c); + a.lineTo(.5 * b, + 0); + a.lineTo(0, .9 * c); + P(a); + M(a, 0, .9 * c, !1); + O(a, (1 - .85 / .9) * b, .8 * c, .85 / .9 * b, .8 * c, 1 * b, .9 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, .82); + u.q(a); + return b + }, Cube1: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 1 * c, !0); + a.lineTo(1 * b, .85 * c); + a.lineTo(1 * b, .15 * c); + a.lineTo(.5 * b, 0 * c); + a.lineTo(0 * b, .15 * c); + a.lineTo(0 * b, .85 * c); + P(a); + M(a, .5 * b, 1 * c, !1); + a.lineTo(.5 * b, .3 * c); + a.lineTo(0, .15 * c); + a.moveTo(.5 * b, .3 * c); + a.lineTo(1 * b, .15 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .3); + b.B = new L(.5, .85); + u.q(a); + return b + }, Cube2: function (a, b, c) { + a = u.p(); + M(a, + 0, .3 * c, !0); + a.lineTo(0 * b, 1 * c); + a.lineTo(.7 * b, c); + a.lineTo(1 * b, .7 * c); + a.lineTo(1 * b, 0 * c); + a.lineTo(.3 * b, 0 * c); + P(a); + M(a, 0, .3 * c, !1); + a.lineTo(.7 * b, .3 * c); + a.lineTo(1 * b, 0 * c); + a.moveTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 1 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .3); + b.B = new L(.7, 1); + u.q(a); + return b + }, MagneticData: "Cylinder1", Cylinder1: function (a, b, c) { + var d = K.sa; + a = .5 * d; + var e = .1 * d, d = u.p(); + M(d, 0, .1 * c, !0); + O(d, 0, (.1 - e) * c, (.5 - a) * b, 0, .5 * b, 0); + O(d, (.5 + a) * b, 0, 1 * b, (.1 - e) * c, 1 * b, .1 * c); + d.lineTo(b, .9 * c); + O(d, 1 * b, (.9 + e) * c, (.5 + a) * b, 1 * c, .5 * b, 1 * c); + O(d, (.5 - + a) * b, 1 * c, 0, (.9 + e) * c, 0, .9 * c); + d.lineTo(0, .1 * c); + M(d, 0, .1 * c, !1); + O(d, 0, (.1 + e) * c, (.5 - a) * b, .2 * c, .5 * b, .2 * c); + O(d, (.5 + a) * b, .2 * c, 1 * b, (.1 + e) * c, 1 * b, .1 * c); + d.$a(!1); + b = d.o; + b.A = new L(0, .2); + b.B = new L(1, .9); + u.q(d); + return b + }, Cylinder2: function (a, b, c) { + var d = K.sa; + a = .5 * d; + var e = .1 * d, d = u.p(); + M(d, 0, .9 * c, !0); + d.lineTo(0, .1 * c); + O(d, 0, (.1 - e) * c, (.5 - a) * b, 0, .5 * b, 0); + O(d, (.5 + a) * b, 0, 1 * b, (.1 - e) * c, 1 * b, .1 * c); + d.lineTo(1 * b, .9 * c); + O(d, 1 * b, (.9 + e) * c, (.5 + a) * b, 1 * c, .5 * b, 1 * c); + O(d, (.5 - a) * b, 1 * c, 0, (.9 + e) * c, 0, .9 * c); + M(d, 0, .9 * c, !1); + O(d, 0, (.9 - e) * c, (.5 - + a) * b, .8 * c, .5 * b, .8 * c); + O(d, (.5 + a) * b, .8 * c, 1 * b, (.9 - e) * c, 1 * b, .9 * c); + d.$a(!1); + b = d.o; + b.A = new L(0, .1); + b.B = new L(1, .8); + u.q(d); + return b + }, Cylinder3: function (a, b, c) { + var d = K.sa; + a = .1 * d; + var e = .5 * d, d = u.p(); + M(d, .1 * b, 0, !0); + d.lineTo(.9 * b, 0); + O(d, (.9 + a) * b, 0, 1 * b, (.5 - e) * c, 1 * b, .5 * c); + O(d, 1 * b, (.5 + e) * c, (.9 + a) * b, 1 * c, .9 * b, 1 * c); + d.lineTo(.1 * b, 1 * c); + O(d, (.1 - a) * b, 1 * c, 0, (.5 + e) * c, 0, .5 * c); + O(d, 0, (.5 - e) * c, (.1 - a) * b, 0, .1 * b, 0); + M(d, .1 * b, 0, !1); + O(d, (.1 + a) * b, 0, .2 * b, (.5 - e) * c, .2 * b, .5 * c); + O(d, .2 * b, (.5 + e) * c, (.1 + a) * b, 1 * c, .1 * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = + new L(.2, 0); + b.B = new L(.9, 1); + u.q(d); + return b + }, DirectData: "Cylinder4", Cylinder4: function (a, b, c) { + var d = K.sa; + a = .1 * d; + var e = .5 * d, d = u.p(); + M(d, .9 * b, 0, !0); + O(d, (.9 + a) * b, 0, 1 * b, (.5 - e) * c, 1 * b, .5 * c); + O(d, 1 * b, (.5 + e) * c, (.9 + a) * b, 1 * c, .9 * b, 1 * c); + d.lineTo(.1 * b, 1 * c); + O(d, (.1 - a) * b, 1 * c, 0, (.5 + e) * c, 0, .5 * c); + O(d, 0, (.5 - e) * c, (.1 - a) * b, 0, .1 * b, 0); + d.lineTo(.9 * b, 0); + M(d, .9 * b, 0, !1); + O(d, (.9 - a) * b, 0, .8 * b, (.5 - e) * c, .8 * b, .5 * c); + O(d, .8 * b, (.5 + e) * c, (.9 - a) * b, 1 * c, .9 * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = new L(.1, 0); + b.B = new L(.8, 1); + u.q(d); + return b + }, Prism1: function (a, + b, c) { + a = u.p(); + M(a, .25 * b, .25 * c, !0); + a.lineTo(.75 * b, 0); + a.lineTo(b, .5 * c); + a.lineTo(.5 * b, c); + a.lineTo(0, c); + P(a); + M(a, .25 * b, .25 * c, !1); + a.lineTo(.5 * b, c); + a.$a(!1); + b = a.o; + b.A = new L(.408, .172); + b.B = new L(.833, .662); + u.q(a); + return b + }, Prism2: function (a, b, c) { + a = u.p(); + M(a, 0, .25 * c, !0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .25 * c); + a.lineTo(.75 * b, .75 * c); + a.lineTo(0, 1 * c); + P(a); + M(a, 0, c, !1); + a.lineTo(.25 * b, .5 * c); + a.lineTo(b, .25 * c); + a.moveTo(0, .25 * c); + a.lineTo(.25 * b, .5 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, .75); + u.q(a); + return b + }, + Pyramid1: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(b, .75 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .75 * c); + P(a); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .367); + b.B = new L(.75, .875); + u.q(a); + return b + }, Pyramid2: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(b, .85 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .85 * c); + P(a); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, .7 * c); + a.lineTo(0, .85 * c); + a.moveTo(.5 * b, .7 * c); + a.lineTo(1 * b, .85 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .367); + b.B = new L(.75, .875); + u.q(a); + return b + }, Actor: function (a, + b, c) { + var d = K.sa, e = .2 * d, f = .1 * d, h = .5, k = .1; + a = u.p(); + M(a, h * b, (k + .1) * c, !0); + O(a, (h - e) * b, (k + .1) * c, (h - .2) * b, (k + f) * c, (h - .2) * b, k * c); + O(a, (h - .2) * b, (k - f) * c, (h - e) * b, (k - .1) * c, h * b, (k - .1) * c); + O(a, (h + e) * b, (k - .1) * c, (h + .2) * b, (k - f) * c, (h + .2) * b, k * c); + O(a, (h + .2) * b, (k + f) * c, (h + e) * b, (k + .1) * c, h * b, (k + .1) * c); + e = .05; + f = d * e; + M(a, .5 * b, .2 * c, !0); + a.lineTo(.95 * b, .2 * c); + h = .95; + k = .25; + O(a, (h + f) * b, (k - e) * c, (h + e) * b, (k - f) * c, (h + e) * b, k * c); + a.lineTo(1 * b, .6 * c); + a.lineTo(.85 * b, .6 * c); + a.lineTo(.85 * b, .35 * c); + e = .025; + f = d * e; + h = .825; + k = .35; + O(a, (h + e) * b, (k - f) * c, (h + f) * + b, (k - e) * c, h * b, (k - e) * c); + O(a, (h - f) * b, (k - e) * c, (h - e) * b, (k - f) * c, (h - e) * b, k * c); + a.lineTo(.8 * b, 1 * c); + a.lineTo(.55 * b, 1 * c); + a.lineTo(.55 * b, .7 * c); + e = .05; + f = d * e; + h = .5; + k = .7; + O(a, (h + e) * b, (k - f) * c, (h + f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h - f) * b, (k - e) * c, (h - e) * b, (k - f) * c, (h - e) * b, k * c); + a.lineTo(.45 * b, 1 * c); + a.lineTo(.2 * b, 1 * c); + a.lineTo(.2 * b, .35 * c); + e = .025; + f = d * e; + h = .175; + k = .35; + O(a, (h + e) * b, (k - f) * c, (h + f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h - f) * b, (k - e) * c, (h - e) * b, (k - f) * c, (h - e) * b, k * c); + a.lineTo(.15 * b, .6 * c); + a.lineTo(0 * b, .6 * c); + a.lineTo(0 * b, .25 * c); + e = .05; + f = d * e; + h = .05; + k = .25; + O(a, (h - e) * b, (k - f) * c, (h - f) * b, (k - e) * c, h * b, (k - e) * c); + a.lineTo(.5 * b, .2 * c); + b = a.o; + b.A = new L(.2, .2); + b.B = new L(.8, .65); + u.q(a); + return b + }, Card: function (a, b, c) { + a = u.p(); + M(a, 1 * b, 0 * c, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0 * b, 1 * c); + a.lineTo(0 * b, .2 * c); + a.lineTo(.2 * b, 0 * c); + P(a); + b = a.o; + b.A = new L(0, .2); + b.B = Vb; + u.q(a); + return b + }, Collate: function (a, b, c) { + a = u.p(); + M(a, .5 * b, .5 * c, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(.5 * b, .5 * c); + M(a, .5 * b, .5 * c, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(.5 * b, .5 * c); + b = a.o; + b.A = new L(.25, + 0); + b.B = new L(.75, .25); + u.q(a); + return b + }, CreateRequest: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, 0, a * c, !1); + d.lineTo(1 * b, a * c); + d.moveTo(0, (1 - a) * c); + d.lineTo(1 * b, (1 - a) * c); + d.$a(!1); + b = d.o; + b.A = new L(0, a); + b.B = new L(1, 1 - a); + u.q(d); + return b + }, Database: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5 * d, d = .1 * d; + M(a, 1 * b, .1 * c, !0); + a.lineTo(1 * b, .9 * c); + O(a, 1 * b, (.9 + d) * c, (.5 + e) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - e) * b, 1 * c, 0, (.9 + d) * c, 0, .9 * c); + a.lineTo(0, .1 * c); + O(a, 0, (.1 - d) * c, (.5 - e) * b, 0, .5 * b, 0); + O(a, (.5 + e) * b, 0, 1 * b, (.1 - d) * c, 1 * b, .1 * c); + M(a, 1 * b, .1 * c, !1); + O(a, 1 * b, (.1 + d) * c, (.5 + e) * b, .2 * c, .5 * b, .2 * c); + O(a, (.5 - e) * b, .2 * c, 0, (.1 + d) * c, 0, .1 * c); + a.moveTo(1 * b, .2 * c); + O(a, 1 * b, (.2 + d) * c, (.5 + e) * b, .3 * c, .5 * b, .3 * c); + O(a, (.5 - e) * b, .3 * c, 0, (.2 + d) * c, 0, .2 * c); + a.moveTo(1 * b, .3 * c); + O(a, 1 * b, (.3 + d) * c, (.5 + e) * b, .4 * c, .5 * b, .4 * c); + O(a, (.5 - e) * b, .4 * c, 0, (.3 + d) * c, 0, .3 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .4); + b.B = new L(1, .9); + u.q(a); + return b + }, StoredData: "DataStorage", DataStorage: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, 0); + O(a, 1 * b, 0, 1 * b, 1 * c, .75 * b, 1 * c); + a.lineTo(0, 1 * c); + O(a, .25 * b, .9 * c, .25 * b, .1 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.226, 0); + b.B = new L(.81, 1); + u.q(a); + return b + }, DiskStorage: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5 * d, d = .1 * d; + M(a, 1 * b, .1 * c, !0); + a.lineTo(1 * b, .9 * c); + O(a, 1 * b, (.9 + d) * c, (.5 + e) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - e) * b, 1 * c, 0, (.9 + d) * c, 0, .9 * c); + a.lineTo(0, .1 * c); + O(a, 0, (.1 - d) * c, (.5 - e) * b, 0, .5 * b, 0); + O(a, (.5 + e) * b, 0, 1 * b, (.1 - d) * c, 1 * b, .1 * c); + M(a, 1 * b, .1 * c, !1); + O(a, 1 * b, (.1 + d) * c, (.5 + e) * b, .2 * c, .5 * b, .2 * c); + O(a, (.5 - e) * b, .2 * c, 0, (.1 + + d) * c, 0, .1 * c); + a.moveTo(1 * b, .2 * c); + O(a, 1 * b, (.2 + d) * c, (.5 + e) * b, .3 * c, .5 * b, .3 * c); + O(a, (.5 - e) * b, .3 * c, 0, (.2 + d) * c, 0, .2 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .3); + b.B = new L(1, .9); + u.q(a); + return b + }, Display: function (a, b, c) { + a = u.p(); + M(a, .25 * b, 0, !0); + a.lineTo(.75 * b, 0); + O(a, 1 * b, 0, 1 * b, 1 * c, .75 * b, 1 * c); + a.lineTo(.25 * b, 1 * c); + a.lineTo(0, .5 * c); + P(a); + b = a.o; + b.A = new L(.25, 0); + b.B = new L(.75, 1); + u.q(a); + return b + }, DividedEvent: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) ? a = .2 : .15 > a && (a = .15); + var d = u.p(), e = .2 * K.sa; + M(d, 0, .2 * c, !0); + O(d, 0, (.2 - e) * c, (.2 - e) * b, + 0, .2 * b, 0); + d.lineTo(.8 * b, 0); + O(d, (.8 + e) * b, 0, 1 * b, (.2 - e) * c, 1 * b, .2 * c); + d.lineTo(1 * b, .8 * c); + O(d, 1 * b, (.8 + e) * c, (.8 + e) * b, 1 * c, .8 * b, 1 * c); + d.lineTo(.2 * b, 1 * c); + O(d, (.2 - e) * b, 1 * c, 0, (.8 + e) * c, 0, .8 * c); + d.lineTo(0, .2 * c); + M(d, 0, a * c, !1); + d.lineTo(1 * b, a * c); + d.$a(!1); + b = d.o; + b.A = new L(0, a); + b.B = new L(1, 1 - a); + u.q(d); + return b + }, DividedProcess: function (a, b, c) { + a = a ? a.xc : NaN; + if (isNaN(a) || .1 > a) a = .1; + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, 0, a * c, !1); + d.lineTo(1 * b, a * c); + d.$a(!1); + b = d.o; + b.A = new L(0, a); + b.B = + Vb; + u.q(d); + return b + }, Document: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, 0, .7 * c, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .7 * c); + O(a, .5 * b, .4 * c, .5 * b, 1 * c, 0, .7 * c); + P(a); + b = a.o; + b.A = xb; + b.B = new L(1, .6); + u.q(a); + return b + }, ExternalOrganization: function (a, b, c) { + a = a ? a.xc : NaN; + if (isNaN(a) || .2 > a) a = .2; + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, a * b, 0, !1); + d.lineTo(0, a * c); + d.moveTo(1 * b, a * c); + d.lineTo((1 - a) * b, 0); + d.moveTo(0, (1 - a) * c); + d.lineTo(a * b, 1 * c); + d.moveTo((1 - a) * b, 1 * c); + d.lineTo(1 * b, (1 - + a) * c); + d.$a(!1); + b = d.o; + b.A = new L(a / 2, a / 2); + b.B = new L(1 - a / 2, 1 - a / 2); + u.q(d); + return b + }, ExternalProcess: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .5 * c); + P(a); + M(a, .1 * b, .4 * c, !1); + a.lineTo(.1 * b, .6 * c); + a.moveTo(.9 * b, .6 * c); + a.lineTo(.9 * b, .4 * c); + a.moveTo(.6 * b, .1 * c); + a.lineTo(.4 * b, .1 * c); + a.moveTo(.4 * b, .9 * c); + a.lineTo(.6 * b, .9 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .25); + b.B = new L(.75, .75); + u.q(a); + return b + }, File: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .25 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + P(a); + M(a, .75 * b, 0, !1); + a.lineTo(.75 * b, .25 * c); + a.lineTo(1 * b, .25 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .25); + b.B = Vb; + u.q(a); + return b + }, Interrupt: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(1 * b, .5 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(1 * b, 1 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(1 * b, 0); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.5, .75); + u.q(a); + return b + }, InternalStorage: function (a, b, c) { + var d = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(d) && (d = .1); + isNaN(a) && (a = .1); + var e = u.p(); + M(e, 0, 0, !0); + e.lineTo(1 * + b, 0); + e.lineTo(1 * b, 1 * c); + e.lineTo(0, 1 * c); + P(e); + M(e, d * b, 0, !1); + e.lineTo(d * b, 1 * c); + e.moveTo(0, a * c); + e.lineTo(1 * b, a * c); + e.$a(!1); + b = e.o; + b.A = new L(d, a); + b.B = Vb; + u.q(e); + return b + }, Junction: function (a, b, c) { + a = u.p(); + var d = 1 / Math.SQRT2, e = (1 - 1 / Math.SQRT2) / 2, f = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + f) * c, (.5 + f) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - f) * b, 1 * c, 0, (.5 + f) * c, 0, .5 * c); + O(a, 0, (.5 - f) * c, (.5 - f) * b, 0, .5 * b, 0); + O(a, (.5 + f) * b, 0, 1 * b, (.5 - f) * c, 1 * b, .5 * c); + M(a, (e + d) * b, (e + d) * c, !1); + a.lineTo(e * b, e * c); + a.moveTo(e * b, (e + d) * c); + a.lineTo((e + d) * b, e * c); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, LinedDocument: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, 0, .7 * c, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .7 * c); + O(a, .5 * b, .4 * c, .5 * b, 1 * c, 0, .7 * c); + P(a); + M(a, .1 * b, 0, !1); + a.lineTo(.1 * b, .75 * c); + a.$a(!1); + b = a.o; + b.A = new L(.1, 0); + b.B = new L(1, .6); + u.q(a); + return b + }, LoopLimit: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !0); + a.lineTo(0, .25 * c); + a.lineTo(.25 * b, 0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .25 * c); + a.lineTo(1 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = Vb; + u.q(a); + return b + }, SequentialData: "MagneticTape", MagneticTape: function (a, + b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, .5 * b, 1 * c, !0); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, .9 * c, .6 * b, .9 * c); + a.lineTo(1 * b, .9 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(.5 * b, 1 * c); + b = a.o; + b.A = new L(.15, .15); + b.B = new L(.85, .8); + u.q(a); + return b + }, ManualInput: function (a, b, c) { + a = u.p(); + M(a, 1 * b, 0, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, .25 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = Vb; + u.q(a); + return b + }, MessageFromUser: function (a, b, c) { + a = a ? a.xc : + NaN; + isNaN(a) && (a = .7); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(a * b, .5 * c); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = xb; + b.B = new L(a, 1); + u.q(d); + return b + }, MicroformProcessing: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .25); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(.5 * b, a * c); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(.5 * b, (1 - a) * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(0, a); + b.B = new L(1, 1 - a); + u.q(d); + return b + }, MicroformRecording: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, .25 * c); + a.lineTo(1 * b, .15 * + c); + a.lineTo(1 * b, .85 * c); + a.lineTo(.75 * b, .75 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = new L(1, .75); + u.q(a); + return b + }, MultiDocument: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, b, 0, !0); + a.lineTo(b, .5 * c); + O(a, .96 * b, .47 * c, .93 * b, .45 * c, .9 * b, .44 * c); + a.lineTo(.9 * b, .6 * c); + O(a, .86 * b, .57 * c, .83 * b, .55 * c, .8 * b, .54 * c); + a.lineTo(.8 * b, .7 * c); + O(a, .4 * b, .4 * c, .4 * b, 1 * c, 0, .7 * c); + a.lineTo(0, .2 * c); + a.lineTo(.1 * b, .2 * c); + a.lineTo(.1 * b, .1 * c); + a.lineTo(.2 * b, .1 * c); + a.lineTo(.2 * b, 0); + P(a); + M(a, .1 * b, .2 * c, !1); + a.lineTo(.8 * b, .2 * c); + a.lineTo(.8 * b, .54 * + c); + a.moveTo(.2 * b, .1 * c); + a.lineTo(.9 * b, .1 * c); + a.lineTo(.9 * b, .44 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.8, .77); + u.q(a); + return b + }, MultiProcess: function (a, b, c) { + a = u.p(); + M(a, .1 * b, .1 * c, !0); + a.lineTo(.2 * b, .1 * c); + a.lineTo(.2 * b, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .8 * c); + a.lineTo(.9 * b, .8 * c); + a.lineTo(.9 * b, .9 * c); + a.lineTo(.8 * b, .9 * c); + a.lineTo(.8 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, .2 * c); + a.lineTo(.1 * b, .2 * c); + P(a); + M(a, .2 * b, .1 * c, !1); + a.lineTo(.9 * b, .1 * c); + a.lineTo(.9 * b, .8 * c); + a.moveTo(.1 * b, .2 * c); + a.lineTo(.8 * b, .2 * c); + a.lineTo(.8 * + b, .9 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .2); + b.B = new L(.8, 1); + u.q(a); + return b + }, OfflineStorage: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = 1 - a, e = u.p(); + M(e, 0, 0, !0); + e.lineTo(1 * b, 0); + e.lineTo(.5 * b, 1 * c); + P(e); + M(e, .5 * a * b, a * c, !1); + e.lineTo((1 - .5 * a) * b, a * c); + e.$a(!1); + b = e.o; + b.A = new L(d / 4 + .5 * a, a); + b.B = new L(3 * d / 4 + .5 * a, a + .5 * d); + u.q(e); + return b + }, OffPageConnector: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.75 * b, 1 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = xb; + b.B = new L(.75, 1); + u.q(a); + return b + }, + Or: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(0, .5 * c); + a.moveTo(.5 * b, 1 * c); + a.lineTo(.5 * b, 0); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, PaperTape: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, 0, .7 * c, !0); + a.lineTo(0, .3 * c); + O(a, .5 * b, .6 * c, .5 * b, 0, 1 * b, .3 * c); + a.lineTo(1 * b, .7 * c); + O(a, .5 * b, .4 * c, .5 * b, 1 * c, 0, .7 * c); + P(a); + b = a.o; + b.A = new L(0, .49); + b.B = + new L(1, .75); + u.q(a); + return b + }, PrimitiveFromCall: function (a, b, c) { + var d = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(d) && (d = .1); + isNaN(a) && (a = .3); + var e = u.p(); + M(e, 0, 0, !0); + e.lineTo(1 * b, 0); + e.lineTo((1 - a) * b, .5 * c); + e.lineTo(1 * b, 1 * c); + e.lineTo(0, 1 * c); + P(e); + b = e.o; + b.A = new L(d, 0); + b.B = new L(1 - a, 1); + u.q(e); + return b + }, PrimitiveToCall: function (a, b, c) { + var d = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(d) && (d = .1); + isNaN(a) && (a = .3); + var e = u.p(); + M(e, 0, 0, !0); + e.lineTo((1 - a) * b, 0); + e.lineTo(1 * b, .5 * c); + e.lineTo((1 - a) * b, 1 * c); + e.lineTo(0, 1 * c); + P(e); + b = e.o; + b.A = new L(d, + 0); + b.B = new L(1 - a, 1); + u.q(e); + return b + }, Subroutine: "Procedure", Procedure: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, (1 - a) * b, 0, !1); + d.lineTo((1 - a) * b, 1 * c); + d.moveTo(a * b, 0); + d.lineTo(a * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, Process: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, a * b, 0, !1); + d.lineTo(a * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = new L(a, 0); + b.B = Vb; + u.q(d); + return b + }, Sort: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .5 * c); + P(a); + M(a, 0, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .25); + b.B = new L(.75, .5); + u.q(a); + return b + }, Start: function (a, b, c) { + a = u.p(); + M(a, .25 * b, 0, !0); + M(a, .25 * b, 0, !0); + a.arcTo(270, 180, .75 * b, .5 * c, .25 * b, .5 * c); + a.arcTo(90, 180, .25 * b, .5 * c, .25 * b, .5 * c); + M(a, .25 * b, 0, !1); + a.lineTo(.25 * b, 1 * c); + a.moveTo(.75 * b, 0); + a.lineTo(.75 * b, 1 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, 0); + b.B = + new L(.75, 1); + u.q(a); + return b + }, Terminator: function (a, b, c) { + a = u.p(); + M(a, .25 * b, 0, !0); + a.arcTo(270, 180, .75 * b, .5 * c, .25 * b, .5 * c); + a.arcTo(90, 180, .25 * b, .5 * c, .25 * b, .5 * c); + b = a.o; + b.A = new L(.23, 0); + b.B = new L(.77, 1); + u.q(a); + return b + }, TransmittalTape: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(.75 * b, (1 - a) * c); + d.lineTo(0, (1 - a) * c); + P(d); + b = d.o; + b.A = xb; + b.B = new L(1, 1 - a); + u.q(d); + return b + }, AndGate: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0, 0, !0); + a.lineTo(.5 * + b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = xb; + b.B = new L(.55, 1); + u.q(a); + return b + }, Buffer: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, .5 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.5, .75); + u.q(a); + return b + }, Clock: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + M(a, .8 * b, .75 * c, !1); + a.lineTo(.8 * b, .25 * c); + a.lineTo(.6 * b, .25 * c); + a.lineTo(.6 * b, .75 * c); + a.lineTo(.4 * b, .75 * c); + a.lineTo(.4 * b, .25 * c); + a.lineTo(.2 * b, .25 * c); + a.lineTo(.2 * b, .75 * c); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, Ground: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, .4 * c); + a.moveTo(.2 * b, .6 * c); + a.lineTo(.8 * b, .6 * c); + a.moveTo(.3 * b, .8 * c); + a.lineTo(.7 * b, .8 * c); + a.moveTo(.4 * b, 1 * c); + a.lineTo(.6 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, Inverter: function (a, b, c) { + a = u.p(); + var d = .1 * K.sa; + M(a, .8 * + b, .5 * c, !0); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.8 * b, .5 * c); + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.9 + d) * b, .6 * c, .9 * b, .6 * c); + O(a, (.9 - d) * b, .6 * c, .8 * b, (.5 + d) * c, .8 * b, .5 * c); + O(a, .8 * b, (.5 - d) * c, (.9 - d) * b, .4 * c, .9 * b, .4 * c); + O(a, (.9 + d) * b, .4 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.4, .75); + u.q(a); + return b + }, NandGate: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5 * d, f = .4 * d, d = .1 * d; + M(a, .8 * b, .5 * c, !0); + O(a, .8 * b, (.5 + f) * c, (.4 + e) * b, 1 * c, .4 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.4 * b, 0); + O(a, (.4 + e) * b, 0, .8 * b, (.5 - f) * + c, .8 * b, .5 * c); + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.9 + d) * b, .6 * c, .9 * b, .6 * c); + O(a, (.9 - d) * b, .6 * c, .8 * b, (.5 + d) * c, .8 * b, .5 * c); + O(a, .8 * b, (.5 - d) * c, (.9 - d) * b, .4 * c, .9 * b, .4 * c); + O(a, (.9 + d) * b, .4 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.A = new L(0, .05); + b.B = new L(.55, .95); + u.q(a); + return b + }, NorGate: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5, f = d * e, h = 0, k = .5; + M(a, .8 * b, .5 * c, !0); + O(a, .7 * b, (k + f) * c, (h + f) * b, (k + e) * c, 0, 1 * c); + O(a, .25 * b, .75 * c, .25 * b, .25 * c, 0, 0); + O(a, (h + f) * b, (k - e) * c, .7 * b, (k - f) * c, .8 * b, .5 * c); + e = .1; + f = .1 * d; + h = .9; + k = .5; + M(a, (h - e) * b, k * c, !0); + O(a, + (h - e) * b, (k - f) * c, (h - f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h + f) * b, (k - e) * c, (h + e) * b, (k - f) * c, (h + e) * b, k * c); + O(a, (h + e) * b, (k + f) * c, (h + f) * b, (k + e) * c, h * b, (k + e) * c); + O(a, (h - f) * b, (k + e) * c, (h - e) * b, (k + f) * c, (h - e) * b, k * c); + b = a.o; + b.A = new L(.2, .25); + b.B = new L(.6, .75); + u.q(a); + return b + }, OrGate: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0, 0, !0); + O(a, (0 + d + d) * b, 0 * c, .8 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, .8 * b, (.5 + d) * c, (0 + d + d) * b, 1 * c, 0, 1 * c); + O(a, .25 * b, .75 * c, .25 * b, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.2, .25); + b.B = new L(.75, .75); + u.q(a); + return b + }, XnorGate: function (a, + b, c) { + a = u.p(); + var d = K.sa, e = .5, f = d * e, h = .2, k = .5; + M(a, .1 * b, 0, !1); + O(a, .35 * b, .25 * c, .35 * b, .75 * c, .1 * b, 1 * c); + M(a, .8 * b, .5 * c, !0); + O(a, .7 * b, (k + f) * c, (h + f) * b, (k + e) * c, .2 * b, 1 * c); + O(a, .45 * b, .75 * c, .45 * b, .25 * c, .2 * b, 0); + O(a, (h + f) * b, (k - e) * c, .7 * b, (k - f) * c, .8 * b, .5 * c); + e = .1; + f = .1 * d; + h = .9; + k = .5; + M(a, (h - e) * b, k * c, !0); + O(a, (h - e) * b, (k - f) * c, (h - f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h + f) * b, (k - e) * c, (h + e) * b, (k - f) * c, (h + e) * b, k * c); + O(a, (h + e) * b, (k + f) * c, (h + f) * b, (k + e) * c, h * b, (k + e) * c); + O(a, (h - f) * b, (k + e) * c, (h - e) * b, (k + f) * c, (h - e) * b, k * c); + b = a.o; + b.A = new L(.4, .25); + b.B = new L(.65, .75); + u.q(a); + return b + }, XorGate: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, .1 * b, 0, !1); + O(a, .35 * b, .25 * c, .35 * b, .75 * c, .1 * b, 1 * c); + M(a, .2 * b, 0, !0); + O(a, (.2 + d) * b, 0 * c, .9 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, .9 * b, (.5 + d) * c, (.2 + d) * b, 1 * c, .2 * b, 1 * c); + O(a, .45 * b, .75 * c, .45 * b, .25 * c, .2 * b, 0); + P(a); + b = a.o; + b.A = new L(.4, .25); + b.B = new L(.8, .75); + u.q(a); + return b + }, Capacitor: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(0, 1 * c); + a.moveTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, Resistor: function (a, b, c) { + a = u.p(); + M(a, 0, .5 * c, !1); + a.lineTo(.1 * + b, 0); + a.lineTo(.2 * b, 1 * c); + a.lineTo(.3 * b, 0); + a.lineTo(.4 * b, 1 * c); + a.lineTo(.5 * b, 0); + a.lineTo(.6 * b, 1 * c); + a.lineTo(.7 * b, .5 * c); + b = a.o; + u.q(a); + return b + }, Inductor: function (a, b, c) { + a = u.p(); + var d = .1 * K.sa, e = .1; + M(a, (e - .5 * d) * b, c, !1); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .3; + O(a, (e + .1) * b, 0, (e + d) * b, c, e * b, c); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .5; + O(a, (e + .1) * b, 0, (e + d) * b, c, e * b, c); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .7; + O(a, (e + .1) * b, 0, (e + d) * b, c, e * b, c); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .9; + O(a, (e + .1) * b, 0, (e + d) * b, c, + (e + .5 * d) * b, c); + b = a.o; + u.q(a); + return b + }, ACvoltageSource: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0 * b, .5 * c, !1); + O(a, 0 * b, (.5 - d) * c, (.5 - d) * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 + d) * b, 0 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0 * b, (.5 + d) * c, 0 * b, .5 * c); + a.moveTo(.1 * b, .5 * c); + O(a, .5 * b, 0 * c, .5 * b, 1 * c, .9 * b, .5 * c); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, DCvoltageSource: function (a, b, c) { + a = u.p(); + M(a, 0, .75 * c, !1); + a.lineTo(0, .25 * c); + a.moveTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, Diode: function (a, b, + c) { + a = u.p(); + M(a, 1 * b, 0, !1); + a.lineTo(1 * b, .5 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.5, .75); + u.q(a); + return b + }, Wifi: function (a, b, c) { + var d = b, e = c; + b *= .38; + c *= .6; + a = u.p(); + var f = K.sa, h = .8 * f, k = .8, l = 0, m = .5, d = (d - b) / 2, e = (e - c) / 2; + M(a, l * b + d, (m + k) * c + e, !0); + O(a, (l - h) * b + d, (m + k) * c + e, (l - k) * b + d, (m + h) * c + e, (l - k) * b + d, m * c + e); + O(a, (l - k) * b + d, (m - h) * c + e, (l - h) * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + O(a, l * b + d, (m - k) * c + e, (l - k + .5 * h) * b + d, (m - h) * c + e, (l - k + .5 * h) * b + d, m * c + e); + O(a, (l - k + .5 * h) * + b + d, (m + h) * c + e, l * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + P(a); + h = .4 * f; + k = .4; + l = .2; + m = .5; + M(a, l * b + d, (m + k) * c + e, !0); + O(a, (l - h) * b + d, (m + k) * c + e, (l - k) * b + d, (m + h) * c + e, (l - k) * b + d, m * c + e); + O(a, (l - k) * b + d, (m - h) * c + e, (l - h) * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + O(a, l * b + d, (m - k) * c + e, (l - k + .5 * h) * b + d, (m - h) * c + e, (l - k + .5 * h) * b + d, m * c + e); + O(a, (l - k + .5 * h) * b + d, (m + h) * c + e, l * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + P(a); + h = .2 * f; + k = .2; + m = l = .5; + M(a, (l - k) * b + d, m * c + e, !0); + O(a, (l - k) * b + d, (m - h) * c + e, (l - h) * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + O(a, (l + h) * b + d, (m - k) * c + e, (l + k) * b + d, (m - h) * c + e, + (l + k) * b + d, m * c + e); + O(a, (l + k) * b + d, (m + h) * c + e, (l + h) * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + O(a, (l - h) * b + d, (m + k) * c + e, (l - k) * b + d, (m + h) * c + e, (l - k) * b + d, m * c + e); + h = .4 * f; + k = .4; + l = .8; + m = .5; + M(a, l * b + d, (m - k) * c + e, !0); + O(a, (l + h) * b + d, (m - k) * c + e, (l + k) * b + d, (m - h) * c + e, (l + k) * b + d, m * c + e); + O(a, (l + k) * b + d, (m + h) * c + e, (l + h) * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + O(a, l * b + d, (m + k) * c + e, (l + k - .5 * h) * b + d, (m + h) * c + e, (l + k - .5 * h) * b + d, m * c + e); + O(a, (l + k - .5 * h) * b + d, (m - h) * c + e, l * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + P(a); + h = .8 * f; + k = .8; + l = 1; + m = .5; + M(a, l * b + d, (m - k) * c + e, !0); + O(a, (l + h) * b + d, (m - + k) * c + e, (l + k) * b + d, (m - h) * c + e, (l + k) * b + d, m * c + e); + O(a, (l + k) * b + d, (m + h) * c + e, (l + h) * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + O(a, l * b + d, (m + k) * c + e, (l + k - .5 * h) * b + d, (m + h) * c + e, (l + k - .5 * h) * b + d, m * c + e); + O(a, (l + k - .5 * h) * b + d, (m - h) * c + e, l * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + P(a); + b = a.o; + u.q(a); + return b + }, Email: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + P(a); + M(a, 0, 0, !1); + a.lineTo(.5 * b, .6 * c); + a.lineTo(1 * b, 0); + a.moveTo(0, 1 * c); + a.lineTo(.45 * b, .54 * c); + a.moveTo(1 * b, 1 * c); + a.lineTo(.55 * b, .54 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, Ethernet: function (a, b, c) { + a = u.p(); + M(a, .35 * b, 0, !0); + a.lineTo(.65 * b, 0); + a.lineTo(.65 * b, .4 * c); + a.lineTo(.35 * b, .4 * c); + a.lineTo(.35 * b, 0); + P(a); + M(a, .1 * b, 1 * c, !0, !0); + a.lineTo(.4 * b, 1 * c); + a.lineTo(.4 * b, .6 * c); + a.lineTo(.1 * b, .6 * c); + a.lineTo(.1 * b, 1 * c); + P(a); + M(a, .6 * b, 1 * c, !0, !0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.9 * b, .6 * c); + a.lineTo(.6 * b, .6 * c); + a.lineTo(.6 * b, 1 * c); + P(a); + M(a, 0, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + a.moveTo(.5 * b, .5 * c); + a.lineTo(.5 * b, .4 * c); + a.moveTo(.75 * b, .5 * c); + a.lineTo(.75 * b, .6 * c); + a.moveTo(.25 * b, .5 * c); + a.lineTo(.25 * + b, .6 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, Power: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .4 * d, f = .4, h = u.K(), k = u.K(), l = u.K(), m = u.K(); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .5, h, h, k, l, m); + var n = u.fc(k.x, k.y); + M(a, k.x * b, k.y * c, !0); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 + e) * c, (.5 + e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 - e) * b, (.5 + f) * c, (.5 - f) * b, (.5 + e) * c, (.5 - f) * b, .5 * c); + K.Ai(.5 - f, .5, .5 - f, .5 - e, .5 - e, .5 - f, .5, .5 - f, .5, l, m, k, h, h); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, k.x * b, k.y * c); + e = .3 * d; + f = .3; + K.Ai(.5 - f, .5, .5 - f, .5 - + e, .5 - e, .5 - f, .5, .5 - f, .5, l, m, k, h, h); + a.lineTo(k.x * b, k.y * c); + O(a, m.x * b, m.y * c, l.x * b, l.y * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 + e) * c, (.5 - e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 + e) * b, (.5 + f) * c, (.5 + f) * b, (.5 + e) * c, (.5 + f) * b, .5 * c); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .5, h, h, k, l, m); + O(a, m.x * b, m.y * c, l.x * b, l.y * c, k.x * b, k.y * c); + P(a); + M(a, .45 * b, 0, !0); + a.lineTo(.45 * b, .5 * c); + a.lineTo(.55 * b, .5 * c); + a.lineTo(.55 * b, 0); + P(a); + u.v(h); + u.v(k); + u.v(l); + u.v(m); + u.v(n); + b = a.o; + b.A = new L(.25, .55); + b.B = new L(.75, .8); + u.q(a); + return b + }, Fallout: function (a, + b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0 * b, .5 * c, !0); + O(a, 0 * b, (.5 - d) * c, (.5 - d) * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 + d) * b, 0 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0 * b, (.5 + d) * c, 0 * b, .5 * c); + var e = d = 0; + M(a, (.3 + d) * b, (.8 + e) * c, !0, !0); + a.lineTo((.5 + d) * b, (.5 + e) * c); + a.lineTo((.1 + d) * b, (.5 + e) * c); + a.lineTo((.3 + d) * b, (.8 + e) * c); + d = .4; + e = 0; + P(a); + M(a, (.3 + d) * b, (.8 + e) * c, !0, !0); + a.lineTo((.5 + d) * b, (.5 + e) * c); + a.lineTo((.1 + d) * b, (.5 + e) * c); + a.lineTo((.3 + d) * b, (.8 + e) * c); + d = .2; + e = -.3; + P(a); + M(a, (.3 + d) * b, (.8 + e) * c, !0, !0); + a.lineTo((.5 + + d) * b, (.5 + e) * c); + a.lineTo((.1 + d) * b, (.5 + e) * c); + a.lineTo((.3 + d) * b, (.8 + e) * c); + P(a); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, IrritationHazard: function (a, b, c) { + a = u.p(); + M(a, .2 * b, 0 * c, !0); + a.lineTo(.5 * b, .3 * c); + a.lineTo(.8 * b, 0 * c); + a.lineTo(1 * b, .2 * c); + a.lineTo(.7 * b, .5 * c); + a.lineTo(1 * b, .8 * c); + a.lineTo(.8 * b, 1 * c); + a.lineTo(.5 * b, .7 * c); + a.lineTo(.2 * b, 1 * c); + a.lineTo(0 * b, .8 * c); + a.lineTo(.3 * b, .5 * c); + a.lineTo(0 * b, .2 * c); + P(a); + b = a.o; + b.A = new L(.3, .3); + b.B = new L(.7, .7); + u.q(a); + return b + }, ElectricalHazard: function (a, b, c) { + a = u.p(); + M(a, .37 * b, 0 * c, !0); + a.lineTo(.5 * + b, .11 * c); + a.lineTo(.77 * b, .04 * c); + a.lineTo(.33 * b, .49 * c); + a.lineTo(1 * b, .37 * c); + a.lineTo(.63 * b, .86 * c); + a.lineTo(.77 * b, .91 * c); + a.lineTo(.34 * b, 1 * c); + a.lineTo(.34 * b, .78 * c); + a.lineTo(.44 * b, .8 * c); + a.lineTo(.65 * b, .56 * c); + a.lineTo(0 * b, .68 * c); + P(a); + b = a.o; + u.q(a); + return b + }, FireHazard: function (a, b, c) { + a = u.p(); + M(a, .1 * b, 1 * c, !0); + O(a, -.25 * b, .63 * c, .45 * b, .44 * c, .29 * b, 0 * c); + O(a, .48 * b, .17 * c, .54 * b, .35 * c, .51 * b, .42 * c); + O(a, .59 * b, .29 * c, .58 * b, .28 * c, .59 * b, .18 * c); + O(a, .8 * b, .34 * c, .88 * b, .43 * c, .75 * b, .6 * c); + O(a, .87 * b, .48 * c, .88 * b, .43 * c, .88 * b, .31 * + c); + O(a, 1.17 * b, .76 * c, .82 * b, .8 * c, .9 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.05, .645); + b.B = new L(.884, .908); + u.q(a); + return b + }, BpmnActivityLoop: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, .65 * b, 1 * c, !1); + O(a, (1 - d + 0) * b, 1 * c, 1 * b, (.5 + d + 0) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 - d + 0) * c, (.5 + d + 0) * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 - d + 0) * b, 0 * c, 0 * b, (.5 - d + 0) * c, 0 * b, .5 * c); + O(a, 0 * b, (.5 + d + 0) * c, (.5 - d + 0) * b, 1 * c, .35 * b, .98 * c); + a.moveTo(.25 * b, .8 * c); + a.lineTo(.35 * b, 1 * c); + a.lineTo(.1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivityParallel: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(0, 1 * c); + a.moveTo(.5 * b, 0); + a.lineTo(.5 * b, 1 * c); + a.moveTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivitySequential: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.moveTo(0, .5 * c); + a.lineTo(1 * b, .5 * c); + a.moveTo(0, 1 * c); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivityAdHoc: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + M(a, 1 * b, 1 * c, !1); + M(a, 0, .5 * c, !1); + O(a, .2 * b, .35 * c, .3 * b, .35 * c, .5 * b, .5 * c); + O(a, .7 * b, .65 * c, .8 * b, .65 * c, 1 * b, .5 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivityCompensation: function (a, + b, c) { + a = u.p(); + M(a, 0, .5 * c, !0); + a.lineTo(.5 * b, 0); + a.lineTo(.5 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(1 * b, 0); + a.lineTo(.5 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + P(a); + b = a.o; + u.q(a); + return b + }, BpmnTaskMessage: function (a, b, c) { + a = u.p(); + M(a, 0, .2 * c, !0); + a.lineTo(1 * b, .2 * c); + a.lineTo(1 * b, .8 * c); + a.lineTo(0, .8 * c); + a.lineTo(0, .8 * c); + P(a); + M(a, 0, .2 * c, !1); + a.lineTo(.5 * b, .5 * c); + a.lineTo(1 * b, .2 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, BpmnTaskScript: function (a, b, c) { + a = u.p(); + M(a, .7 * b, 1 * c, !0); + a.lineTo(.3 * b, 1 * c); + O(a, .6 * b, .5 * c, 0, .5 * c, .3 * b, 0); + a.lineTo(.7 * b, + 0); + O(a, .4 * b, .5 * c, 1 * b, .5 * c, .7 * b, 1 * c); + P(a); + M(a, .45 * b, .73 * c, !1); + a.lineTo(.7 * b, .73 * c); + a.moveTo(.38 * b, .5 * c); + a.lineTo(.63 * b, .5 * c); + a.moveTo(.31 * b, .27 * c); + a.lineTo(.56 * b, .27 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, BpmnTaskUser: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + M(a, .335 * b, (1 - .555) * c, !0); + a.lineTo(.335 * b, .595 * c); + a.lineTo(.665 * b, .595 * c); + a.lineTo(.665 * b, (1 - .555) * c); + O(a, .88 * b, .46 * c, .98 * b, .54 * c, 1 * b, .68 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, .68 * c); + O(a, .02 * b, .54 * c, .12 * b, .46 * c, .335 * b, (1 - .555) * c); + a.lineTo(.365 * + b, .405 * c); + var d = .5 - .285, e = Math.PI / 4, f = 4 * (1 - Math.cos(e)) / (3 * Math.sin(e)), e = f * d, f = f * d; + O(a, (.5 - (e + d) / 2) * b, (d + (d + f) / 2) * c, (.5 - d) * b, (d + f) * c, (.5 - d) * b, d * c); + O(a, (.5 - d) * b, (d - f) * c, (.5 - e) * b, (d - d) * c, .5 * b, (d - d) * c); + O(a, (.5 + e) * b, (d - d) * c, (.5 + d) * b, (d - f) * c, (.5 + d) * b, d * c); + O(a, (.5 + d) * b, (d + f) * c, (.5 + (e + d) / 2) * b, (d + (d + f) / 2) * c, .635 * b, .405 * c); + a.lineTo(.635 * b, .405 * c); + a.lineTo(.665 * b, (1 - .555) * c); + a.lineTo(.665 * b, .595 * c); + a.lineTo(.335 * b, .595 * c); + M(a, .2 * b, 1 * c, !1); + a.lineTo(.2 * b, .8 * c); + M(a, .8 * b, 1 * c, !1); + a.lineTo(.8 * b, .8 * c); + b = a.o; + u.q(a); + return b + }, BpmnEventConditional: function (a, b, c) { + a = u.p(); + M(a, .1 * b, 0, !0); + a.lineTo(.9 * b, 0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.1 * b, 1 * c); + P(a); + M(a, .2 * b, .2 * c, !1); + a.lineTo(.8 * b, .2 * c); + a.moveTo(.2 * b, .4 * c); + a.lineTo(.8 * b, .4 * c); + a.moveTo(.2 * b, .6 * c); + a.lineTo(.8 * b, .6 * c); + a.moveTo(.2 * b, .8 * c); + a.lineTo(.8 * b, .8 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, BpmnEventError: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !0); + a.lineTo(.33 * b, 0); + a.lineTo(.66 * b, .5 * c); + a.lineTo(1 * b, 0); + a.lineTo(.66 * b, 1 * c); + a.lineTo(.33 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, BpmnEventEscalation: function (a, + b, c) { + a = u.p(); + M(a, 0, 0, !1); + M(a, 1 * b, 1 * c, !1); + M(a, .1 * b, 1 * c, !0); + a.lineTo(.5 * b, 0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.5 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, BpmnEventTimer: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, .15 * c); + a.moveTo(.5 * b, 1 * c); + a.lineTo(.5 * b, .85 * c); + a.moveTo(0, .5 * c); + a.lineTo(.15 * b, .5 * c); + a.moveTo(1 * b, .5 * c); + a.lineTo(.85 * + b, .5 * c); + a.moveTo(.5 * b, .5 * c); + a.lineTo(.58 * b, .1 * c); + a.moveTo(.5 * b, .5 * c); + a.lineTo(.78 * b, .54 * c); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + } + }; + for (var In in K.qg) K.qg[In.toLowerCase()] = In; + K.Hv = { + "": "", + Standard: "F1 m 0,0 l 8,4 -8,4 2,-4 z", + Backward: "F1 m 8,0 l -2,4 2,4 -8,-4 z", + Triangle: "F1 m 0,0 l 8,4.62 -8,4.62 z", + BackwardTriangle: "F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z", + Boomerang: "F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z", + BackwardBoomerang: "F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z", + SidewaysV: "m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z", + BackwardV: "m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z", + OpenTriangle: "m 0,0 l 8,4 -8,4", + BackwardOpenTriangle: "m 8,0 l -8,4 8,4", + OpenTriangleLine: "m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8", + BackwardOpenTriangleLine: "m 8,0 l -8,4 8,4 m -8.5,0 l 0,-8", + OpenTriangleTop: "m 0,0 l 8,4 m 0,4", + BackwardOpenTriangleTop: "m 8,0 l -8,4 m 0,4", + OpenTriangleBottom: "m 0,8 l 8,-4", + BackwardOpenTriangleBottom: "m 0,4 l 8,4", + HalfTriangleTop: "F1 m 0,0 l 0,4 8,0 z m 0,8", + BackwardHalfTriangleTop: "F1 m 8,0 l 0,4 -8,0 z m 0,8", + HalfTriangleBottom: "F1 m 0,4 l 0,4 8,-4 z", + BackwardHalfTriangleBottom: "F1 m 8,4 l 0,4 -8,-4 z", + ForwardSemiCircle: "m 4,0 b 270 180 0 4 4", + BackwardSemiCircle: "m 4,8 b 90 180 0 -4 4", + Feather: "m 0,0 l 3,4 -3,4", + BackwardFeather: "m 3,0 l -3,4 3,4", + DoubleFeathers: "m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4", + BackwardDoubleFeathers: "m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4", + TripleFeathers: "m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4", + BackwardTripleFeathers: "m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4", + ForwardSlash: "m 0,8 l 5,-8", + BackSlash: "m 0,0 l 5,8", + DoubleForwardSlash: "m 0,8 l 4,-8 m -2,8 l 4,-8", + DoubleBackSlash: "m 0,0 l 4,8 m -2,-8 l 4,8", + TripleForwardSlash: "m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8", + TripleBackSlash: "m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8", + Fork: "m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4", + BackwardFork: "m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4", + LineFork: "m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4", + BackwardLineFork: "m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8", + CircleFork: "F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", + BackwardCircleFork: "F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3", + CircleLineFork: "F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", + BackwardCircleLineFork: "F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3", + Circle: "F1 m 8,4 b 0 360 -4 0 4 z", + Block: "F1 m 0,0 l 0,8 8,0 0,-8 z", + StretchedDiamond: "F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z", + Diamond: "F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z", + Chevron: "F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z", + StretchedChevron: "F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z", + NormalArrow: "F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z", + X: "m 0,0 l 8,8 m 0,-8 l -8,8", + TailedNormalArrow: "F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z", + DoubleTriangle: "F1 m 0,0 l 4,4 -4,4 0,-8 z m 4,0 l 4,4 -4,4 0,-8 z", + BigEndArrow: "F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z", + ConcaveTailArrow: "F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z", + RoundedTriangle: "F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z", + SimpleArrow: "F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z", + AccelerationArrow: "F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z", + BoxArrow: "F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z", + TriangleLine: "F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8", + CircleEndedArrow: "F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z", + DynamicWidthArrow: "F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z", + EquilibriumArrow: "m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3", + FastForward: "F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z", + Kite: "F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z", + HalfArrowTop: "F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8", + HalfArrowBottom: "F1 m 0,8 l 4,-4 4,0 -8,4 z", + OpposingDirectionDoubleArrow: "F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z", + PartialDoubleTriangle: "F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z", + LineCircle: "F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z", + DoubleLineCircle: "F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z", + TripleLineCircle: "F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z", + CircleLine: "F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8", + DiamondCircle: "F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z", + PlusCircle: "F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8", + OpenRightTriangleTop: "m 8,0 l 0,4 -8,0 m 0,4", + OpenRightTriangleBottom: "m 8,8 l 0,-4 -8,0", + Line: "m 0,0 l 0,8", + DoubleLine: "m 0,0 l 0,8 m 2,0 l 0,-8", + TripleLine: "m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8", + PentagonArrow: "F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z" + }; + K.jI = function () { + if (null !== K.Hv) { + for (var a in K.Hv) { + var b = sd(K.Hv[a], !1); + K.Qi[a] = b; + a.toLowerCase() !== a && (K.Qi[a.toLowerCase()] = a) + } + K.Hv = null + } + }; + K.UC = function (a) { + K.jI(); + var b = K.Qi[a]; + if (void 0 === b) { + b = a.toLowerCase(); + if ("none" === b) return "None"; + b = K.Qi[b] + } + return "string" === typeof b ? b : b instanceof $c ? a : null + }; + + function G(a) { + 0 === arguments.length ? A.call(this) : A.call(this, a); + this.O = 311807; + this.wk = this.Vh = ""; + this.ur = this.rr = this.Dr = this.xq = null; + this.Fr = ""; + this.Th = this.Er = this.bm = null; + this.tr = ""; + this.Vn = null; + this.sr = (new ia(NaN, NaN)).freeze(); + this.vr = ""; + this.Wn = null; + this.ie = ""; + this.Bu = this.Gp = this.kk = null; + this.Mg = (new w(NaN, NaN)).freeze(); + this.Eq = ""; + this.zk = null; + this.Fq = xb; + this.Oq = K.fF; + this.Hq = K.eF; + this.Qp = null; + this.yq = Jn; + this.em = (new w(6, 6)).freeze(); + this.dm = "gray"; + this.cm = 4; + this.BB = -1; + this.qF = new z; + this.Bk = + null; + this.kj = NaN + } + + u.Ga(G, A); + u.fa("Part", G); + G.prototype.cloneProtected = function (a) { + A.prototype.cloneProtected.call(this, a); + a.O = this.O & -4097 | 49152; + a.Vh = this.Vh; + a.wk = this.wk; + a.xq = this.xq; + a.Dr = this.Dr; + a.rr = this.rr; + a.ur = this.ur; + a.Fr = this.Fr; + a.Er = this.Er; + a.Th = null; + a.tr = this.tr; + a.sr.assign(this.sr); + a.vr = this.vr; + a.ie = this.ie; + a.Gp = this.Gp; + a.Mg.assign(this.Mg); + a.Eq = this.Eq; + a.Fq = this.Fq.Z(); + a.Oq = this.Oq.Z(); + a.Hq = this.Hq.Z(); + a.Qp = this.Qp; + a.yq = this.yq; + a.em.assign(this.em); + a.dm = this.dm; + a.cm = this.cm + }; + G.prototype.Mh = function (a) { + A.prototype.Mh.call(this, a); + a.dl(); + a.bm = null; + a.Vn = null; + a.Wn = null; + a.zk = null; + a.Bk = null + }; + G.prototype.toString = function () { + var a = u.rg(Object.getPrototypeOf(this)) + "#" + u.Uc(this); + null !== this.data && (a += "(" + de(this.data) + ")"); + return a + }; + G.LayoutNone = 0; + var Jj; + G.LayoutAdded = Jj = 1; + var Rj; + G.LayoutRemoved = Rj = 2; + G.LayoutShown = 4; + G.LayoutHidden = 8; + G.LayoutNodeSized = 16; + var Ik; + G.LayoutGroupLayout = Ik = 32; + G.LayoutNodeReplaced = 64; + var Jn; + G.LayoutStandard = Jn = Jj | Rj | 28 | Ik | 64; + G.LayoutAll = 16777215; + G.prototype.Lm = function (a, b, c, d, e, f, h) { + var k = this.g; + null !== k && (a === be && "elements" === b ? e instanceof A ? Kj(e, function (a) { + Mj(k, a); + Lj(k, a) + }) : e instanceof Ri && uk(k, e) : a === ce && "elements" === b && (e instanceof A ? Kj(e, function (a) { + Qj(k, a); + Pj(k, a) + }) : e instanceof Ri && vk(k, e)), k.Dc(a, b, c, d, e, f, h)) + }; + G.prototype.updateTargetBindings = G.prototype.Nb = function (a) { + A.prototype.Nb.call(this, a); + if (null !== this.data) { + a = this.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + d instanceof A && Kj(d, function (a) { + null !== a.data && a.Nb() + }) + } + } + }; + G.prototype.updateRelationshipsFromData = function () { + var a = this.data; + if (null !== a) { + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof Q) { + var d = c.Bm(a), b = b.zG(d), e = this.Ra; + b !== e && (b = null !== e ? c.wb(e.data) : void 0, e = c.Vo, "function" === typeof e ? e(a, b) : a[e] = b, c.Fw(a, d)) + } + } + } + }; + u.u(G, {zv: "adornments"}, function () { + return null === this.Th ? Ia : this.Th.RD + }); + G.prototype.findAdornment = G.prototype.xo = function (a) { + var b = this.Th; + return null === b ? null : b.ta(a) + }; + G.prototype.addAdornment = G.prototype.Kk = function (a, b) { + if (null !== b) { + var c = null, d = this.Th; + null !== d && (c = d.ta(a)); + if (c !== b) { + if (null !== c) { + var e = c.g; + null !== e && e.remove(c) + } + null === d && (this.Th = d = new la("string", lf)); + b.Vh !== a && (b.Kc = a); + d.add(a, b); + c = this.g; + null !== c && (c.add(b), b.data = this.data) + } + } + }; + G.prototype.removeAdornment = G.prototype.ol = function (a) { + var b = this.Th; + if (null !== b) { + var c = b.ta(a); + if (null !== c) { + var d = c.g; + null !== d && d.remove(c) + } + b.remove(a); + 0 === b.count && (this.Th = null) + } + }; + G.prototype.clearAdornments = G.prototype.ls = function () { + var a = this.Th; + if (null !== a) { + for (var b = u.eb(), a = a.i; a.next();) b.push(a.key); + for (var a = b.length, c = 0; c < a; c++) this.ol(b[c]); + u.ra(b) + } + }; + G.prototype.updateAdornments = function () { + var a = this.g; + if (null !== a) { + a:{ + if (this.Za && this.dI) { + var b = this.nt; + if (!(null !== b && this.ba.J() && this.Ea() && b.kl() && b.ba.J())) break a; + var c = this.xo("Selection"); + if (null === c) { + c = this.eI; + null === c && (c = this instanceof W ? a.sH : this instanceof V ? a.MG : a.HH); + if (!(c instanceof lf)) break a; + nf(c); + c = c.copy(); + null !== c && (c.Kc = "Selection", c.vc = b) + } + if (null !== c) { + var d = c.placeholder; + if (null !== d) { + var e = b.Hi(), f = 0; + b instanceof X && (f = b.hb); + var h = u.ul(); + h.m((b.Ha.width + f) * e, (b.Ha.height + + f) * e); + d.xa = h; + u.Oj(h) + } + c.angle = b.Zk(); + c.type !== ah && (d = u.K(), c.location = b.lb(xb, d), u.v(d)); + this.Kk("Selection", c); + break a + } + } + this.ol("Selection") + } + Kn(this, a); + for (a = this.zv; a.next();) b = a.value, b.Nb(), b.R() + } + }; + + function Kn(a, b) { + b.tb.cf.each(function (b) { + b.isEnabled && b.updateAdornments(a) + }) + } + + u.u(G, {layer: "layer"}, function () { + return this.Bu + }); + u.u(G, {g: "diagram"}, function () { + var a = this.Bu; + return null !== a ? a.g : null + }); + u.defineProperty(G, {wf: "layerName"}, function () { + return this.wk + }, function (a) { + var b = this.wk; + if (b !== a) { + u.j(a, "string", G, "layerName"); + var c = this.g; + if (null === c || null !== c.ws(a) && !c.Vm) if (this.wk = a, null !== c && c.pc(), this.h("layerName", b, a), b = this.layer, null !== b && b.name !== a && (c = b.g, null !== c && (a = c.ws(a), null !== a && a !== b))) { + var d = b.Fe(-1, this, !0); + 0 <= d && c.Dc(ce, "parts", b, this, null, d, !0); + d = a.Eo(99999999, this, !0); + 0 <= d && c.Dc(be, "parts", a, null, this, !0, d); + d = this.Rs; + if (null !== d) { + var e = c.Na; + c.Na = !0; + d(this, b, a); + c.Na = e + } + } + } + }); + u.defineProperty(G, {Rs: "layerChanged"}, function () { + return this.xq + }, function (a) { + var b = this.xq; + b !== a && (null !== a && u.j(a, "function", G, "layerChanged"), this.xq = a, this.h("layerChanged", b, a)) + }); + G.prototype.invalidateAdornments = G.prototype.Zd = function () { + var a = this.g; + null !== a && (cj(a), 0 !== (this.O & 16384) !== !0 && (this.O |= 16384, a.de())) + }; + + function ui(a) { + 0 !== (a.O & 16384) !== !1 && (a.updateAdornments(), a.O &= -16385, a = a.g, null !== a && (a.Md = !0)) + } + + u.defineProperty(G, {location: "location"}, function () { + return this.Mg + }, function (a) { + var b = this.Mg; + if (!(b.L(a) || this instanceof W)) { + a = a.Z(); + var c = this.g; + this.Mg = a; + if (!1 === Bj(this)) { + var d = this.Ma, e = a.x - b.x, f = a.y - b.y, h = d.copy(); + d.m(h.x + e, h.y + f); + Kl(this, !1); + !d.L(h) && c && this.h("position", h, d) + } + this.h("location", b, a) + } + }); + + function Kl(a, b) { + if (!1 === Cj(a)) { + var c = a.g; + null !== c && (c.Xf.add(a), a instanceof U && !c.ha.gb && a.sf(), b || c.de()); + Ln(a, !0) + } + } + + function Mn(a) { + if (!1 !== Cj(a)) { + var b = a.position, c = a.location; + c.J() && b.J() || (Nn(a, b, c), a.Jg()); + var b = a.Ma, c = a.Xb, d = c.copy(); + c.La(); + c.x = b.x; + c.y = b.y; + c.freeze(); + a.sw(d, c); + Ln(a, !1) + } + } + + u.u(G, {ec: "locationObject"}, function () { + if (null === this.zk) { + var a = this.zz; + "" !== a ? (a = this.je(a), this.zk = null !== a ? a : this) : this.zk = this instanceof lf ? this.type !== ah && null !== this.placeholder ? this.placeholder : this : this + } + return this.zk.visible ? this.zk : this + }); + u.defineProperty(G, {AH: "minLocation"}, function () { + return this.Oq + }, function (a) { + var b = this.Oq; + b.L(a) || (this.Oq = a = a.Z(), this.h("minLocation", b, a)) + }); + u.defineProperty(G, {vH: "maxLocation"}, function () { + return this.Hq + }, function (a) { + var b = this.Hq; + b.L(a) || (this.Hq = a = a.Z(), this.h("maxLocation", b, a)) + }); + u.defineProperty(G, {zz: "locationObjectName"}, function () { + return this.Eq + }, function (a) { + var b = this.Eq; + b !== a && (this.Eq = a, this.zk = null, El(this), this.h("locationObjectName", b, a)) + }); + u.defineProperty(G, {Ze: "locationSpot"}, function () { + return this.Fq + }, function (a) { + var b = this.Fq; + b.L(a) || (this.Fq = a = a.Z(), El(this), this.h("locationSpot", b, a)) + }); + G.prototype.move = G.prototype.move = function (a) { + this.position = a + }; + G.prototype.moveTo = G.prototype.moveTo = function (a, b) { + var c = u.fc(a, b); + this.move(c); + u.v(c) + }; + G.prototype.isVisible = G.prototype.Ea = function () { + if (!this.visible) return !1; + var a = this.layer; + if (null !== a && !a.visible) return !1; + a = this.Ra; + if (!(null === a || a.be && a.Ea())) return !1; + if (this instanceof U) { + a = this.zm(); + if (null !== a && !a.Vc) return !1; + a = this.ce; + if (null !== a) return a.Ea() + } else if (this instanceof W) { + var b = !0, c = this.g; + null !== c && (b = c.qd); + c = this.W; + if (null !== c) { + if (this.Bc && b && !c.Vc) return !1; + if (c === a) return !0; + c = c.findVisibleNode(); + if (null === c || c === a) return !1 + } + c = this.ca; + if (null !== c) { + if (this.Bc && !b && !c.Vc) return !1; + if (c === a) return !0; + b = c.findVisibleNode(); + if (null === b || b === a) return !1 + } + } + return !0 + }; + G.prototype.He = function (a) { + var b = this.g; + a ? (this.H(4), this.Zd(), null !== b && b.Xf.add(this)) : (this.H(8), this.ls()); + null !== b && (b.pc(), b.ma()) + }; + G.prototype.findObject = G.prototype.je = function (a) { + if (this.name === a) return this; + var b = this.Bk; + null === b && (this.Bk = b = new pa); + if (void 0 !== b[a]) return b[a]; + for (var c = this.ya.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + if (f.name === a) return b[a] = f; + if (f instanceof A) if (null === f.gi && null === f.Zf) { + if (f = f.je(a), null !== f) return b[a] = f + } else if (sk(f) && (f = f.ya.first(), null !== f && f.name === a)) return b[a] = f + } + return b[a] = null + }; + + function On(a, b, c, d) { + void 0 === d && (d = new w); + c.ne() && (c = Ib); + var e = b.Ha; + d.m(e.width * c.x + c.offsetX, e.height * c.y + c.offsetY); + if (null === b || b === a) return d; + b.transform.ab(d); + for (b = b.S; null !== b && b !== a;) b.transform.ab(d), b = b.S; + a.yk.ab(d); + d.offset(-a.Pc.x, -a.Pc.y); + return d + } + + G.prototype.ensureBounds = G.prototype.pf = function () { + Ph(this, Infinity, Infinity); + this.zc() + }; + + function yi(a, b) { + var c; + c = a.qF; + var d; + isNaN(a.kj) && (a.kj = Tm(a)); + d = a.kj; + var e = 2 * d; + if (!a.il) return c.m(b.x - 1 - d, b.y - 1 - d, b.width + 2 + e, b.height + 2 + e), c; + d = b.x; + var e = b.y, f = b.width, h = b.height, k = a.shadowBlur, l = a.kI, f = f + k, h = h + k; + d -= k / 2; + e -= k / 2; + 0 < l.x ? f += l.x : (d += l.x, f -= l.x); + 0 < l.y ? h += l.y : (e += l.y, h -= l.y); + c.m(d - 1, e - 1, f + 2, h + 2); + return c + } + + g = G.prototype; + g.zc = function () { + this.Jg(); + if (!1 === Bj(this)) Mn(this); else { + var a = u.Sf(); + a.assign(this.Xb); + wl(this); + this.Xb.La(); + var b = ti(this); + this.xi(0, 0, this.Pc.width, this.Pc.height); + var c = this.position; + Nn(this, c, this.location); + var d = this.Xb; + d.x = c.x; + d.y = c.y; + d.freeze(); + this.Jg(); + this.sw(a, d); + a.L(d) ? this.xf(b) : !this.Fd() || K.D(a.width, d.width) && K.D(a.height, d.height) || 0 <= this.BB && this.H(16); + u.ic(a); + Ln(this, !1) + } + }; + g.sw = function (a, b) { + rl(this, !1); + var c = this.g; + if (null !== c) { + this.dl(); + var d = !1, e = a.J(); + if (!1 === c.ei) { + var f = c.Cd, h = c.padding, k = f.x + h.left, l = f.y + h.top, m = f.width - 2 * h.right, + f = f.height - 2 * h.bottom; + e && a.x > k && a.y > l && a.right < m && a.bottom < f && b.x > k && b.y > l && b.right < m && b.bottom < f && (d = !0) + } + 0 !== (this.O & 65536) !== !0 && a.L(b) || Nj(this, d, c); + c.ma() + } + }; + g.dA = function (a, b) { + if (!a.J() || this instanceof W) return !1; + var c = this.g; + if (null !== c && !(this instanceof lf)) { + var d = this.g.Uh; + d.ld && ii(d, this, "position", b.copy(), a.copy()) + } + if (null !== c && !0 === c.ha.gb) return !0; + c = this.Mg; + d = c.copy(); + c.m(c.x + (a.x - b.x), c.y + (a.y - b.y)); + this.Ma = a; + !1 === Cj(this) && !1 === Bj(this) && (Kl(this, !1), this.Jg(), Mn(this)); + c.L(d) || this.h("location", d, c); + return !0 + }; + g.GE = function (a, b) { + var c = this.Mg; + !1 === Cj(this) && !1 === Bj(this) ? (this.Mg.m(c.x + a - this.Ma.x, c.y + b - this.Ma.y), this.Ma.m(a, b), Kl(this, !0), this.Jg()) : (c.m(NaN, NaN), this.Ma.m(a, b)) + }; + + function Nn(a, b, c) { + var d = NaN, e = NaN, f = u.K(), h = a.Ze, k = a.ec; + h.ne() && u.k("determineOffset: Part's locationSpot must be real: " + h.toString()); + var l = k.Ha, d = 0; + k.hb && (d = k.Sg); + f.rt(0, 0, l.width + d, l.height + d, h); + if (k !== a) for (k.hb && f.offset(-d / 2, -d / 2), k.transform.ab(f), h = k.S; null !== h && h !== a;) h.transform.ab(f), h = h.S; + a.yk.ab(f); + f.offset(-a.Pc.x, -a.Pc.y); + h = a.g; + c.J() ? (k = b.x, l = b.y, d = c.x - f.x, e = c.y - f.y, b.m(d, e), c = !1, null !== h && (d = h.Uh, d.dj ? c = !0 : !d.ld || a instanceof lf || ii(d, a, "position", new w(k, l), b), c || b.x === k && b.y === + l || (d = h.cb, h.cb = !0, a.h("position", new w(k, l), b), h.cb = d))) : b.J() && (d = b.x, e = b.y, b = c.copy(), c.m(d + f.x, e + f.y), c.L(b) || null === h || (d = h.cb, h.cb = !0, a.h("location", b, c), h.cb = d)); + u.v(f) + } + + function Nj(a, b, c) { + sl(a, !1); + a instanceof U && Qk(c, a); + a.layer.Ac || b || c.pc(); + b = a.Xb; + var d = c.ob; + d.J() ? (ti(a) ? jb(b, d) || a.xf(!1) : b.sg(d) && a.xf(!0), a.updateAdornments()) : c.uk = !0 + } + + g.hl = function () { + return !0 + }; + + function wi(a, b) { + var c = a.Xb; + if (0 !== c.width && 0 !== c.height && !isNaN(c.x) && !isNaN(c.y) && a.Ea()) { + var d = a.transform, e = a.S, f = a.Xm; + f.reset(); + null !== e && (e.Tf() ? f.multiply(e.Ff) : null !== e.S && f.multiply(e.S.Ff)); + f.multiply(a.Sd); + null !== a.lc && (yl(a, b, a.lc, !0, !0), b.fillRect(c.x, c.y, c.width, c.height)); + null === a.lc && null === a.Ib && (yl(a, b, "rgba(0,0,0,0.4)", !0, !1), b.fillRect(c.x, c.y, c.width, c.height)); + null !== a.Ib && (d.Os() || b.transform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy), e = a.Ha, c = e.width, e = e.height, yl(a, b, a.Ib, !0, !1), + b.fillRect(0, 0, c + 0, e + 0), d.Os() || (c = 1 / (d.m11 * d.m22 - d.m12 * d.m21), b.transform(d.m22 * c, -d.m12 * c, -d.m21 * c, d.m11 * c, c * (d.m21 * d.dy - d.m22 * d.dx), c * (d.m12 * d.dx - d.m11 * d.dy)))) + } + } + + g.Fd = function () { + return !0 + }; + u.defineProperty(G, {Kc: "category"}, function () { + return this.Vh + }, function (a) { + var b = this.Vh; + if (b !== a) { + u.j(a, "string", G, "category"); + var c = this.g, d = this.data, e = null; + if (null !== c && null !== d && !(this instanceof lf)) { + var f = c.ga.ha; + f.isEnabled && !f.gb && (e = this.clone(), e.ya.Td(this.ya)) + } + this.Vh = a; + this.h("category", b, a); + null === c || null === d || this instanceof lf ? (e = this.Kh, null !== e && (a = e.Th, null !== a && a.remove(b), e.Kk(this.Kc, this))) : (f = c.ga, f.ha.gb || (this instanceof W ? (f instanceof Q ? f.EE(d, a) : f instanceof qe && f.hI(d, + a), c = Ck(c, a), null !== c && (nf(c), c = c.copy(), null !== c && Pn(this, c, b, a))) : (null !== f && f.Dw(d, a), c = zk(c, d, a), null !== c && (nf(c), c = c.copy(), null === c || c instanceof W || (c.location = this.location, Pn(this, c, b, a)))), null !== e && (b = this.clone(), b.ya.Td(this.ya), this.h("self", e, b)))) + } + }); + u.defineProperty(G, {self: "self"}, function () { + return this + }, function (a) { + Pn(this, a, this.Kc, a.Kc) + }); + var Qn = !1; + + function Pn(a, b, c, d) { + b.constructor === a.constructor || Qn || (Qn = !0, u.trace('Should not change the class of the Part when changing category from "' + c + '" to "' + d + '"'), u.trace(" Old class: " + u.rg(a) + ", new class: " + u.rg(b) + ", part: " + a.toString())); + a.ls(); + var e = a.data; + c = a.wf; + var f = a.Za, h = a.Wg, k = !0, l = !0, m = !1; + if (a instanceof U) var n = a, k = n.Ji, l = n.Vc, m = n.kp; + b.Mh(a); + b.cloneProtected(a); + a.Vh = d; + a.R(); + a.ma(); + b = a.g; + d = !0; + null !== b && (d = b.cb, b.cb = !0); + a.qh = e; + null !== e && a.Nb(); + null !== b && (b.cb = d); + e = a.wf; + e !== c && (a.wk = c, + a.wf = e); + a instanceof U && (n = a, n.Ji = k, n.Vc = l, n.kp = m, n.Fd() && n.H(64)); + a.Za = f; + a.Wg = h + } + + G.prototype.canCopy = function () { + if (!this.iG) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Ij) return !1; + a = a.g; + return null === a ? !0 : a.Ij ? !0 : !1 + }; + G.prototype.canDelete = function () { + if (!this.pG) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.lm) return !1; + a = a.g; + return null === a ? !0 : a.lm ? !0 : !1 + }; + G.prototype.canEdit = function () { + if (!this.uI) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Ev) return !1; + a = a.g; + return null === a ? !0 : a.Ev ? !0 : !1 + }; + G.prototype.canGroup = function () { + if (!this.NG) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Bv) return !1; + a = a.g; + return null === a ? !0 : a.Bv ? !0 : !1 + }; + G.prototype.canMove = function () { + if (!this.FH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Nk) return !1; + a = a.g; + return null === a ? !0 : a.Nk ? !0 : !1 + }; + G.prototype.canReshape = function () { + if (!this.TH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Cv) return !1; + a = a.g; + return null === a ? !0 : a.Cv ? !0 : !1 + }; + G.prototype.canResize = function () { + if (!this.UH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.hs) return !1; + a = a.g; + return null === a ? !0 : a.hs ? !0 : !1 + }; + G.prototype.canRotate = function () { + if (!this.XH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Dv) return !1; + a = a.g; + return null === a ? !0 : a.Dv ? !0 : !1 + }; + G.prototype.canSelect = function () { + if (!this.pl) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.of) return !1; + a = a.g; + return null === a ? !0 : a.of ? !0 : !1 + }; + u.defineProperty(G, {iG: "copyable"}, function () { + return 0 !== (this.O & 1) + }, function (a) { + var b = 0 !== (this.O & 1); + b !== a && (this.O ^= 1, this.h("copyable", b, a)) + }); + u.defineProperty(G, {pG: "deletable"}, function () { + return 0 !== (this.O & 2) + }, function (a) { + var b = 0 !== (this.O & 2); + b !== a && (this.O ^= 2, this.h("deletable", b, a)) + }); + u.defineProperty(G, {uI: "textEditable"}, function () { + return 0 !== (this.O & 4) + }, function (a) { + var b = 0 !== (this.O & 4); + b !== a && (this.O ^= 4, this.h("textEditable", b, a), this.Zd()) + }); + u.defineProperty(G, {NG: "groupable"}, function () { + return 0 !== (this.O & 8) + }, function (a) { + var b = 0 !== (this.O & 8); + b !== a && (this.O ^= 8, this.h("groupable", b, a)) + }); + u.defineProperty(G, {FH: "movable"}, function () { + return 0 !== (this.O & 16) + }, function (a) { + var b = 0 !== (this.O & 16); + b !== a && (this.O ^= 16, this.h("movable", b, a)) + }); + u.defineProperty(G, {dI: "selectionAdorned"}, function () { + return 0 !== (this.O & 32) + }, function (a) { + var b = 0 !== (this.O & 32); + b !== a && (this.O ^= 32, this.h("selectionAdorned", b, a), this.Zd()) + }); + u.defineProperty(G, {uz: "isInDocumentBounds"}, function () { + return 0 !== (this.O & 64) + }, function (a) { + var b = 0 !== (this.O & 64); + if (b !== a) { + this.O ^= 64; + var c = this.g; + null !== c && c.pc(); + this.h("isInDocumentBounds", b, a) + } + }); + u.defineProperty(G, {OD: "isLayoutPositioned"}, function () { + return 0 !== (this.O & 128) + }, function (a) { + var b = 0 !== (this.O & 128); + b !== a && (this.O ^= 128, this.h("isLayoutPositioned", b, a), this.H(a ? 4 : 8)) + }); + u.defineProperty(G, {pl: "selectable"}, function () { + return 0 !== (this.O & 256) + }, function (a) { + var b = 0 !== (this.O & 256); + b !== a && (this.O ^= 256, this.h("selectable", b, a), this.Zd()) + }); + u.defineProperty(G, {TH: "reshapable"}, function () { + return 0 !== (this.O & 512) + }, function (a) { + var b = 0 !== (this.O & 512); + b !== a && (this.O ^= 512, this.h("reshapable", b, a), this.Zd()) + }); + u.defineProperty(G, {UH: "resizable"}, function () { + return 0 !== (this.O & 1024) + }, function (a) { + var b = 0 !== (this.O & 1024); + b !== a && (this.O ^= 1024, this.h("resizable", b, a), this.Zd()) + }); + u.defineProperty(G, {XH: "rotatable"}, function () { + return 0 !== (this.O & 2048) + }, function (a) { + var b = 0 !== (this.O & 2048); + b !== a && (this.O ^= 2048, this.h("rotatable", b, a), this.Zd()) + }); + u.defineProperty(G, {Za: "isSelected"}, function () { + return 0 !== (this.O & 4096) + }, function (a) { + var b = 0 !== (this.O & 4096); + if (b !== a) { + var c = this.g; + if (!a || this.canSelect() && !(null !== c && c.selection.count >= c.wH)) { + this.O ^= 4096; + var d = !1; + if (null !== c) { + d = c.cb; + c.cb = !0; + var e = c.selection; + e.La(); + a ? e.add(this) : e.remove(this); + e.freeze() + } + this.h("isSelected", b, a); + this.Zd(); + a = this.fI; + null !== a && a(this); + null !== c && (c.de(), c.cb = d) + } + } + }); + u.defineProperty(G, {Wg: "isHighlighted"}, function () { + return 0 !== (this.O & 524288) + }, function (a) { + var b = 0 !== (this.O & 524288); + if (b !== a) { + this.O ^= 524288; + var c = this.g; + null !== c && (c = c.bw, c.La(), a ? c.add(this) : c.remove(this), c.freeze()); + this.h("isHighlighted", b, a); + this.ma() + } + }); + u.defineProperty(G, {il: "isShadowed"}, function () { + return 0 !== (this.O & 8192) + }, function (a) { + var b = 0 !== (this.O & 8192); + b !== a && (this.O ^= 8192, this.h("isShadowed", b, a), this.ma()) + }); + + function Cj(a) { + return 0 !== (a.O & 32768) + } + + function Ln(a, b) { + a.O = b ? a.O | 32768 : a.O & -32769 + } + + function sl(a, b) { + a.O = b ? a.O | 65536 : a.O & -65537 + } + + function ti(a) { + return 0 !== (a.O & 131072) + } + + G.prototype.xf = function (a) { + this.O = a ? this.O | 131072 : this.O & -131073 + }; + + function Rn(a, b) { + a.O = b ? a.O | 1048576 : a.O & -1048577 + } + + u.defineProperty(G, {JD: "isAnimated"}, function () { + return 0 !== (this.O & 262144) + }, function (a) { + var b = 0 !== (this.O & 262144); + b !== a && (this.O ^= 262144, this.h("isAnimated", b, a)) + }); + u.defineProperty(G, {Zz: "selectionObjectName"}, function () { + return this.Fr + }, function (a) { + var b = this.Fr; + b !== a && (this.Fr = a, this.bm = null, this.h("selectionObjectName", b, a)) + }); + u.defineProperty(G, {eI: "selectionAdornmentTemplate"}, function () { + return this.Dr + }, function (a) { + var b = this.Dr; + b !== a && (this instanceof W && (a.type = ah), this.Dr = a, this.h("selectionAdornmentTemplate", b, a)) + }); + u.u(G, {nt: "selectionObject"}, function () { + if (null === this.bm) { + var a = this.Zz; + null !== a && "" !== a ? (a = this.je(a), this.bm = null !== a ? a : this) : this instanceof W ? (a = this.path, this.bm = null !== a ? a : this) : this.bm = this + } + return this.bm + }); + u.defineProperty(G, {fI: "selectionChanged"}, function () { + return this.Er + }, function (a) { + var b = this.Er; + b !== a && (null !== a && u.j(a, "function", G, "selectionChanged"), this.Er = a, this.h("selectionChanged", b, a)) + }); + u.defineProperty(G, {rE: "resizeAdornmentTemplate"}, function () { + return this.rr + }, function (a) { + var b = this.rr; + b !== a && (this.rr = a, this.h("resizeAdornmentTemplate", b, a)) + }); + u.defineProperty(G, {tE: "resizeObjectName"}, function () { + return this.tr + }, function (a) { + var b = this.tr; + b !== a && (this.tr = a, this.Vn = null, this.h("resizeObjectName", b, a)) + }); + u.u(G, {sE: "resizeObject"}, function () { + if (null === this.Vn) { + var a = this.tE; + null !== a && "" !== a ? (a = this.je(a), this.Vn = null !== a ? a : this) : this.Vn = this + } + return this.Vn + }); + u.defineProperty(G, {VH: "resizeCellSize"}, function () { + return this.sr + }, function (a) { + var b = this.sr; + b.L(a) || (this.sr = a = a.Z(), this.h("resizeCellSize", b, a)) + }); + u.defineProperty(G, {YH: "rotateAdornmentTemplate"}, function () { + return this.ur + }, function (a) { + var b = this.ur; + b !== a && (this.ur = a, this.h("rotateAdornmentTemplate", b, a)) + }); + u.defineProperty(G, {ZH: "rotateObjectName"}, function () { + return this.vr + }, function (a) { + var b = this.vr; + b !== a && (this.vr = a, this.Wn = null, this.h("rotateObjectName", b, a)) + }); + u.u(G, {vE: "rotateObject"}, function () { + if (null === this.Wn) { + var a = this.ZH; + null !== a && "" !== a ? (a = this.je(a), this.Wn = null !== a ? a : this) : this.Wn = this + } + return this.Wn + }); + u.defineProperty(G, {text: "text"}, function () { + return this.ie + }, function (a) { + var b = this.ie; + b !== a && (this.ie = a, this.h("text", b, a)) + }); + u.defineProperty(G, {Ra: "containingGroup"}, function () { + return this.kk + }, function (a) { + if (this.Fd()) { + var b = this.kk; + if (b !== a) { + null === a || this !== a && !a.Ph(this) || (this === a && u.k("Cannot make a Group a member of itself: " + this.toString()), u.k("Cannot make a Group indirectly contain itself: " + this.toString() + " already contains " + a.toString())); + this.H(Rj); + var c = this.g; + null !== b ? Sn(b, this) : this instanceof V && null !== c && c.Ik.remove(this); + this.kk = a; + null !== a ? Tn(a, this) : this instanceof V && null !== c && c.Ik.add(this); + this.H(Jj); + if (null !== c) { + var d = this.data, e = c.ga; + null !== d && e instanceof Q && e.Fw(d, e.wb(null !== a ? a.data : null)) + } + d = this.bD; + null !== d && (e = !0, null !== c && (e = c.Na, c.Na = !0), d(this, b, a), null !== c && (c.Na = e)); + if (this instanceof V) for (c = new F(G), kf(c, this, !0, 0, !0), c = c.i; c.next();) if (d = c.value, d instanceof U) for (d = d.oe; d.next();) xk(d.value); + if (this instanceof U) for (d = this.oe; d.next();) xk(d.value); + this.h("containingGroup", b, a); + null !== a && a.Jw() + } + } else u.k("cannot set the Part.containingGroup of a Link or Adornment") + }); + g = G.prototype; + g.dl = function () { + var a = this.Ra; + null !== a && (a.R(), null !== a.Pb && a.Pb.R(), a.sf()) + }; + g.ma = function () { + var a = this.g; + null !== a && !Bj(this) && !Cj(this) && this.Ea() && this.Xb.J() && a.ma(yi(this, this.Xb)) + }; + g.Js = function (a) { + var b = this.kk; + null === b || a || Tn(b, this) + }; + g.Ks = function (a) { + var b = this.kk; + null === b || a || Sn(b, this) + }; + g.xm = function () { + var a = this.data; + if (null !== a) { + var b = this.g; + null !== b && (b = b.ga, null !== b && b.Vz(a)) + } + }; + u.defineProperty(G, {bD: "containingGroupChanged"}, function () { + return this.Gp + }, function (a) { + var b = this.Gp; + b !== a && (null !== a && u.j(a, "function", G, "containingGroupChanged"), this.Gp = a, this.h("containingGroupChanged", b, a)) + }); + G.prototype.findSubGraphLevel = function () { + return Un(this, this) + }; + + function Un(a, b) { + var c = b.Ra; + return null !== c ? 1 + Un(a, c) : b instanceof U && (c = b.ce, null !== c) ? Un(a, c) : 0 + } + + G.prototype.findTopLevelPart = function () { + return Vn(this, this) + }; + + function Vn(a, b) { + var c = b.Ra; + return null !== c ? Vn(a, c) : b instanceof U && (c = b.ce, null !== c) ? Vn(a, c) : b + } + + u.u(G, {Ho: "isTopLevel"}, function () { + return null !== this.Ra || this instanceof U && this.tf ? !1 : !0 + }); + G.prototype.isMemberOf = G.prototype.Ph = function (a) { + return a instanceof V ? Wn(this, this, a) : !1 + }; + + function Wn(a, b, c) { + if (b === c || null === c) return !1; + var d = b.Ra; + return null === d || d !== c && !Wn(a, d, c) ? b instanceof U && (b = b.ce, null !== b) ? Wn(a, b, c) : !1 : !0 + } + + G.prototype.findCommonContainingGroup = G.prototype.yG = function (a) { + if (null === a) return null; + if (this === a) return this instanceof V ? this : null; + for (var b = this; null !== b;) b instanceof V && Rn(b, !0), b = b.Ra; + for (var c = null, b = a; null !== b;) { + if (0 !== (b.O & 1048576)) { + c = b; + break + } + b = b.Ra + } + for (b = this; null !== b;) b instanceof V && Rn(b, !1), b = b.Ra; + return c + }; + u.defineProperty(G, {nH: "layoutConditions"}, function () { + return this.yq + }, function (a) { + var b = this.yq; + b !== a && (this.yq = a, this.h("layoutConditions", b, a)) + }); + G.prototype.canLayout = function () { + if (!this.OD || !this.Ea()) return !1; + var a = this.layer; + return null !== a && a.Ac || this instanceof U && this.tf ? !1 : !0 + }; + G.prototype.invalidateLayout = G.prototype.H = function (a) { + void 0 === a && (a = 16777215); + var b; + this.OD && 0 !== (a & this.nH) ? (b = this.layer, null !== b && b.Ac || this instanceof U && this.tf ? b = !1 : (b = this.g, b = null !== b && b.ha.gb ? !1 : !0)) : b = !1; + if (b) if (b = this.kk, null !== b) { + var c = b.Qb; + null !== c ? c.H() : b.H(a) + } else a = this.g, null !== a && (c = a.Qb, null !== c && c.H()) + }; + + function Oj(a) { + if (!a.Ea()) return !1; + a = a.layer; + return null !== a && a.Ac ? !1 : !0 + } + + u.defineProperty(G, {mD: "dragComputation"}, function () { + return this.Qp + }, function (a) { + var b = this.Qp; + b !== a && (null !== a && u.j(a, "function", G, "dragComputation"), this.Qp = a, this.h("dragComputation", b, a)) + }); + u.defineProperty(G, {kI: "shadowOffset"}, function () { + return this.em + }, function (a) { + var b = this.em; + b.L(a) || (this.em = a = a.Z(), this.ma(), this.h("shadowOffset", b, a)) + }); + u.defineProperty(G, {shadowColor: "shadowColor"}, function () { + return this.dm + }, function (a) { + var b = this.dm; + b !== a && (this.dm = a, this.ma(), this.h("shadowColor", b, a)) + }); + u.defineProperty(G, {shadowBlur: "shadowBlur"}, function () { + return this.cm + }, function (a) { + var b = this.cm; + b !== a && (this.cm = a, this.ma(), this.h("shadowBlur", b, a)) + }); + + function lf(a) { + 0 === arguments.length ? G.call(this, vh) : G.call(this, a); + this.wf = "Adornment"; + this.Gb = null; + this.O &= -257; + this.Mg = new w(NaN, NaN); + this.Vi = new E(z); + this.Pb = null + } + + u.Ga(lf, G); + u.fa("Adornment", lf); + lf.prototype.toString = function () { + var a = this.Kh; + return "Adornment(" + this.Kc + ")" + (null !== a ? a.toString() : "") + }; + lf.prototype.updateRelationshipsFromData = function () { + }; + lf.prototype.Xs = function () { + var a = this.vc.T, b = this.vc; + if (a instanceof W && b instanceof X) { + var c = a.path, b = c.Pa; + a.Xs(); + for (var b = c.Pa, a = this.ya.n, c = a.length, d = 0; d < c; d++) { + var e = a[d]; + e.tg && e instanceof X && (e.Pa = b) + } + } + }; + u.u(lf, {placeholder: "placeholder"}, function () { + return this.Pb + }); + u.defineProperty(lf, {vc: "adornedObject"}, function () { + return this.Gb + }, function (a) { + var b = this.Kh, c = null; + null !== a && (c = a.T); + null === b || null !== a && b === c || b.ol(this.Kc); + this.Gb = a; + null !== c && c.Kk(this.Kc, this) + }); + u.u(lf, {Kh: "adornedPart"}, function () { + var a = this.Gb; + return null !== a ? a.T : null + }); + lf.prototype.hl = function () { + var a = this.Gb; + if (null === a) return !0; + a = a.T; + return null === a || !Bj(a) + }; + lf.prototype.Fd = function () { + return !1 + }; + u.u(lf, {Ra: "containingGroup"}, function () { + return null + }); + lf.prototype.Lm = function (a, b, c, d, e, f, h) { + if (a === be && "elements" === b) if (e instanceof ph) { + var k = e; + null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of an Adornment.") + } else e instanceof A && (k = e.vs(function (a) { + return a instanceof ph + }), k instanceof ph && (null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of an Adornment."))); else a === ce && "elements" === b && null !== this.Pb && (d === this.Pb ? this.Pb = null : d instanceof A && + this.Pb.gl(d) && (this.Pb = null)); + G.prototype.Lm.call(this, a, b, c, d, e, f, h) + }; + lf.prototype.updateAdornments = function () { + }; + lf.prototype.xm = function () { + }; + + function U(a) { + 0 === arguments.length ? G.call(this, vh) : G.call(this, a); + this.hc = new E(W); + this.Kn = this.xk = this.Bq = this.Aq = null; + this.qq = !0; + this.$r = !1; + this.Vr = null; + this.zp = this.rq = !0; + this.Ap = K.iF; + this.Qd = this.nh = null; + this.kr = Xn; + this.Fj = !1 + } + + u.Ga(U, G); + u.fa("Node", U); + U.prototype.cloneProtected = function (a) { + G.prototype.cloneProtected.call(this, a); + a.Aq = this.Aq; + a.Bq = this.Bq; + a.xk = this.xk; + a.qq = this.qq; + a.$r = this.$r; + a.Vr = this.Vr; + a.rq = this.rq; + a.zp = this.zp; + a.Ap = this.Ap.Z(); + a.kr = this.kr + }; + U.prototype.Mh = function (a) { + G.prototype.Mh.call(this, a); + a.sf(); + a.nh = this.nh; + a.Qd = null + }; + var Yn; + U.DirectionDefault = Yn = u.s(U, "DirectionDefault", 0); + U.DirectionAbsolute = u.s(U, "DirectionAbsolute", 1); + var Zn; + U.DirectionRotatedNode = Zn = u.s(U, "DirectionRotatedNode", 2); + var jl; + U.DirectionRotatedNodeOrthogonal = jl = u.s(U, "DirectionRotatedNodeOrthogonal", 3); + U.SpreadingNone = u.s(U, "SpreadingNone", 10); + var Xn; + U.SpreadingEvenly = Xn = u.s(U, "SpreadingEvenly", 11); + var $n; + U.SpreadingPacked = $n = u.s(U, "SpreadingPacked", 12); + + function ao(a, b) { + null !== b && (null === a.nh && (a.nh = new F(bo)), a.nh.add(b)) + } + + U.prototype.Lm = function (a, b, c, d, e, f, h) { + a === be && "elements" === b ? this.Qd = null : a === ce && "elements" === b && (null === this.g ? this.Qd = null : d instanceof S && Pm(this, d, function (a, b) { + Ll(a, b, !0) + })); + G.prototype.Lm.call(this, a, b, c, d, e, f, h) + }; + U.prototype.invalidateConnectedLinks = U.prototype.sf = function (a) { + void 0 === a && (a = null); + for (var b = this.oe; b.next();) { + var c = b.value; + null !== a && a.contains(c) || (co(this, c.od), co(this, c.fe), c.Vb()) + } + }; + + function co(a, b) { + if (null !== b) { + b.jr = null; + var c = a.Ra; + null === c || c.be || co(c, c.Xk("")) + } + } + + U.prototype.hl = function () { + return !0 + }; + u.defineProperty(U, {NH: "portSpreading"}, function () { + return this.kr + }, function (a) { + var b = this.kr; + b !== a && (this.kr = a, this.h("portSpreading", b, a), a = this.g, null !== a && a.ha.gb || this.sf()) + }); + u.defineProperty(U, {TC: "avoidable"}, function () { + return this.zp + }, function (a) { + var b = this.zp; + if (b !== a) { + this.zp = a; + var c = this.g; + null !== c && Qk(c, this); + this.h("avoidable", b, a) + } + }); + u.defineProperty(U, {RF: "avoidableMargin"}, function () { + return this.Ap + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, U, "avoidableMargin"); + var b = this.Ap; + if (!b.L(a)) { + this.Ap = a = a.Z(); + var c = this.g; + null !== c && Qk(c, this); + this.h("avoidableMargin", b, a) + } + }); + U.prototype.canAvoid = function () { + return this.TC && !this.tf + }; + U.prototype.getAvoidableRect = function (a) { + a.set(this.ba); + a.yv(this.RF); + return a + }; + U.prototype.findVisibleNode = function () { + for (var a = this; null !== a && !a.Ea();) a = a.Ra; + return a + }; + U.prototype.He = function (a) { + G.prototype.He.call(this, a); + for (var b = this.oe; b.next();) b.value.He(a) + }; + u.u(U, {oe: "linksConnected"}, function () { + return this.hc.i + }); + U.prototype.findLinksConnected = U.prototype.qD = function (a) { + void 0 === a && (a = null); + if (null === a) return this.hc.i; + var b = new Ka(this.hc), c = this; + b.Km = function (b) { + return b.W === c && b.pg === a || b.ca === c && b.lh === a + }; + return b + }; + U.prototype.findLinksOutOf = U.prototype.Wv = function (a) { + void 0 === a && (a = null); + var b = new Ka(this.hc), c = this; + b.Km = function (b) { + return b.W !== c ? !1 : null === a ? !0 : b.pg === a + }; + return b + }; + U.prototype.findLinksInto = U.prototype.og = function (a) { + void 0 === a && (a = null); + var b = new Ka(this.hc), c = this; + b.Km = function (b) { + return b.ca !== c ? !1 : null === a ? !0 : b.lh === a + }; + return b + }; + U.prototype.findNodesConnected = U.prototype.rD = function (a) { + void 0 === a && (a = null); + for (var b = null, c = null, d = this.hc.i; d.next();) { + var e = d.value; + if (e.W === this) { + if (null === a || e.pg === a) e = e.ca, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e + } else e.ca !== this || null !== a && e.lh !== a || (e = e.W, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e) + } + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findNodesOutOf = function (a) { + void 0 === a && (a = null); + for (var b = null, c = null, d = this.hc.i; d.next();) { + var e = d.value; + e.W !== this || null !== a && e.pg !== a || (e = e.ca, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e) + } + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findNodesInto = function (a) { + void 0 === a && (a = null); + for (var b = null, c = null, d = this.hc.i; d.next();) { + var e = d.value; + e.ca !== this || null !== a && e.lh !== a || (e = e.W, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e) + } + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findLinksBetween = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + var d = new Ka(this.hc), e = this; + d.Km = function (d) { + return (d.W !== e || d.ca !== a || null !== b && d.pg !== b || null !== c && d.lh !== c) && (d.W !== a || d.ca !== e || null !== c && d.pg !== c || null !== b && d.lh !== b) ? !1 : !0 + }; + return d + }; + U.prototype.findLinksTo = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + var d = new Ka(this.hc), e = this; + d.Km = function (d) { + return d.W !== e || d.ca !== a || null !== b && d.pg !== b || null !== c && d.lh === c ? !1 : !0 + }; + return d + }; + u.defineProperty(U, {pH: "linkConnected"}, function () { + return this.Aq + }, function (a) { + var b = this.Aq; + b !== a && (null !== a && u.j(a, "function", U, "linkConnected"), this.Aq = a, this.h("linkConnected", b, a)) + }); + u.defineProperty(U, {qH: "linkDisconnected"}, function () { + return this.Bq + }, function (a) { + var b = this.Bq; + b !== a && (null !== a && u.j(a, "function", U, "linkDisconnected"), this.Bq = a, this.h("linkDisconnected", b, a)) + }); + u.defineProperty(U, {pw: "linkValidation"}, function () { + return this.xk + }, function (a) { + var b = this.xk; + b !== a && (null !== a && u.j(a, "function", U, "linkValidation"), this.xk = a, this.h("linkValidation", b, a)) + }); + + function eo(a, b, c) { + co(a, c); + if (!a.hc.contains(b)) { + a.hc.add(b); + var d = a.pH; + if (null !== d) { + var e = !0, f = a.g; + null !== f && (e = f.Na, f.Na = !0); + d(a, b, c); + null !== f && (f.Na = e) + } + b.Bc && (c = b.W, b = b.ca, null !== c && null !== b && c !== b && (d = !0, f = a.g, null !== f && (d = f.qd), a = d ? b : c, e = d ? c : b, a.Fj || (a.Fj = e), !e.Ji || null !== f && f.ha.gb || (d ? c === e && (e.Ji = !1) : b === e && (e.Ji = !1)))) + } + } + + function fo(a, b, c) { + co(a, c); + if (a.hc.remove(b)) { + var d = a.qH, e = a.g; + if (null !== d) { + var f = !0; + null !== e && (f = e.Na, e.Na = !0); + d(a, b, c); + null !== e && (e.Na = f) + } + b.Bc && (c = !0, null !== e && (c = e.qd), a = c ? b.ca : b.W, b = c ? b.W : b.ca, null !== a && (a.Fj = !1), null === b || b.Ji || (0 === b.hc.count ? (b.Fj = null, null !== e && e.ha.gb || (b.Ji = !0)) : Jk(b))) + } + } + + function Jk(a) { + a.Fj = !1; + if (0 !== a.hc.count) { + var b = !0, c = a.g; + if (null === c || !c.ha.gb) { + null !== c && (b = c.qd); + for (c = a.hc.i; c.next();) { + var d = c.value; + if (d.Bc) if (b) { + if (d.W === a) { + a.Ji = !1; + return + } + } else if (d.ca === a) { + a.Ji = !1; + return + } + } + a.Ji = !0 + } + } + } + + U.prototype.updateRelationshipsFromData = function () { + G.prototype.updateRelationshipsFromData.call(this); + var a = this.data; + if (null !== a) { + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof qe) { + var d = c.Cm(a), b = b.Xe(d), e = this.zm(); + b !== e && (b = null !== e ? c.wb(e.data) : void 0, e = c.Wo, "function" === typeof e ? e(a, b) : a[e] = b, c.ih(a, d)) + } + } + } + }; + U.prototype.Js = function (a) { + G.prototype.Js.call(this, a); + a || Jk(this); + var b = this.Kn; + null === b || a || ho(b, this) + }; + U.prototype.Ks = function (a) { + G.prototype.Ks.call(this, a); + var b = this.Kn; + null === b || a || null === b.ue || (b.ue.remove(this), b.R()) + }; + U.prototype.xm = function () { + if (0 < this.hc.count) { + var a = this.g; + if (null === a) return; + for (var b = this.hc.copy().i; b.next();) a.remove(b.value) + } + this.ce = null; + G.prototype.xm.call(this) + }; + u.u(U, {tf: "isLinkLabel"}, function () { + return null !== this.Kn + }); + u.defineProperty(U, {ce: "labeledLink"}, function () { + return this.Kn + }, function (a) { + var b = this.Kn; + if (b !== a) { + var c = this.g, d = this.data; + if (null !== b && (null !== b.ue && (b.ue.remove(this), b.R()), null !== c && null !== d && !c.ha.gb)) { + var e = b.data, f = c.ga; + if (null !== e && f instanceof Q) { + var h = f.wb(d); + void 0 !== h && f.mE(e, h) + } + } + this.Kn = a; + null !== a && (ho(a, this), null === c || null === d || c.ha.gb || (e = a.data, f = c.ga, null !== e && f instanceof Q && (h = f.wb(d), void 0 !== h && f.Ly(e, h)))); + El(this); + this.h("labeledLink", b, a) + } + }); + U.prototype.findPort = U.prototype.Xk = function (a) { + if (null === this.Qd) { + if ("" === a && !1 === this.xh) return this; + Ml(this) + } + var b = this.Qd.ta(a); + return null !== b || "" !== a && (b = this.Qd.ta(""), null !== b) ? b : this + }; + u.u(U, {port: "port"}, function () { + return this.Xk("") + }); + u.u(U, {ports: "ports"}, function () { + null === this.Qd && Ml(this); + return this.Qd.RD + }); + + function Ml(a) { + null === a.Qd ? a.Qd = new la("string", S) : a.Qd.clear(); + Pm(a, a, function (a, c) { + var d = c.Jd; + null !== d && a.Qd.add(d, c) + }); + 0 === a.Qd.count && a.Qd.add("", a) + } + + function Ll(a, b, c) { + var d = b.Jd; + if (null !== d && (null !== a.Qd && a.Qd.remove(d), b = a.g, null !== b && c)) { + c = null; + for (d = a.qD(d); d.next();) a = d.value, null === c && (c = u.eb()), c.push(a); + if (null !== c) { + for (d = 0; d < c.length; d++) a = c[d], b.remove(a); + u.ra(c) + } + } + } + + U.prototype.isInTreeOf = function (a) { + if (null === a || a === this) return !1; + var b = !0, c = this.g; + null !== c && (b = c.qd); + c = this; + if (b) for (; c !== a;) { + for (var b = null, d = c.hc.i; d.next();) { + var e = d.value; + if (e.Bc && (b = e.W, b !== c && b !== this)) break + } + if (b === this || null === b || b === c) return !1; + c = b + } else for (; c !== a;) { + b = null; + for (d = c.hc.i; d.next() && (e = d.value, !e.Bc || (b = e.ca, b === c || b === this));) ; + if (b === this || null === b || b === c) return !1; + c = b + } + return !0 + }; + U.prototype.findTreeRoot = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + b = this; + if (a) for (; ;) { + for (var a = null, c = b.hc.i; c.next();) { + var d = c.value; + if (d.Bc && (a = d.W, a !== b && a !== this)) break + } + if (a === this) return this; + if (null === a || a === b) return b; + b = a + } else for (; ;) { + a = null; + for (c = b.hc.i; c.next() && (d = c.value, !d.Bc || (a = d.ca, a === b || a === this));) ; + if (a === this) return this; + if (null === a || a === b) return b; + b = a + } + }; + U.prototype.findCommonTreeParent = function (a) { + if (null === a) return null; + if (this === a) return this; + for (var b = this; null !== b;) Rn(b, !0), b = b.zm(); + for (var c = null, b = a; null !== b;) { + if (0 !== (b.O & 1048576)) { + c = b; + break + } + b = b.zm() + } + for (b = this; null !== b;) Rn(b, !1), b = b.zm(); + return c + }; + U.prototype.findTreeParentLink = U.prototype.As = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + b = this.hc.i; + if (a) for (; b.next();) { + if (a = b.value, a.Bc && a.W !== this) return a + } else for (; b.next();) if (a = b.value, a.Bc && a.ca !== this) return a; + return null + }; + U.prototype.findTreeParentNode = U.prototype.zm = function () { + var a = this.Fj; + if (null === a) return null; + if (a instanceof U) return a; + var b = !0, a = this.g; + null !== a && (b = a.qd); + a = this.hc.i; + if (b) for (; a.next();) { + if (b = a.value, b.Bc && (b = b.W, b !== this)) return this.Fj = b + } else for (; a.next();) if (b = a.value, b.Bc && (b = b.ca, b !== this)) return this.Fj = b; + return this.Fj = null + }; + U.prototype.findTreeLevel = function () { + return io(this, this) + }; + + function io(a, b) { + var c = b.zm(); + return null === c ? 0 : 1 + io(a, c) + } + + U.prototype.findTreeChildrenLinks = U.prototype.Yv = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + if (a) { + var a = new Ka(this.hc), c = this; + a.Km = function (a) { + return a.Bc && a.W === c ? !0 : !1 + } + } else a = new Ka(this.hc), c = this, a.Km = function (a) { + return a.Bc && a.ca === c ? !0 : !1 + }; + return a + }; + U.prototype.findTreeChildrenNodes = U.prototype.tD = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + var c = b = null, d = this.hc.i; + if (a) for (; d.next();) a = d.value, a.Bc && a.W === this && (a = a.ca, null !== b ? b.add(a) : null !== c && c !== a ? (b = new E(U), b.add(c), b.add(a)) : c = a); else for (; d.next();) a = d.value, a.Bc && a.ca === this && (a = a.W, null !== b ? b.add(a) : null !== c && c !== a ? (b = new E(U), b.add(c), b.add(a)) : c = a); + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findTreeParts = function (a) { + void 0 === a && (a = Infinity); + u.j(a, "number", U, "collapseTree:level"); + var b = new F(G); + kf(b, this, !1, a, !0); + return b + }; + U.prototype.collapseTree = U.prototype.collapseTree = function (a) { + void 0 === a && (a = 1); + u.ze(a, U, "collapseTree:level"); + 1 > a && (a = 1); + var b = this.g; + if (null !== b && !b.me) { + var c = b.Lb; + 0 !== b.ha.Le && c.ml(); + b.me = !0; + var c = b.qd, d = new F(U); + d.add(this); + jo(this, d, c, a, this.Vc); + b.me = !1 + } + }; + + function jo(a, b, c, d, e) { + if (1 < d) for (e = c ? a.Wv() : a.og(); e.next();) { + var f = e.value; + f.Bc && (f = f.hz(a), null === f || f === a || b.contains(f) || (b.add(f), jo(f, b, c, d - 1, f.Vc))) + } else ko(a, b, c, e) + } + + function ko(a, b, c, d) { + for (var e = c ? a.Wv() : a.og(); e.next();) { + var f = e.value; + f.Bc && (f = f.hz(a), null === f || f === a || b.contains(f) || (b.add(f), d && (f.dl(), f.He(!1)), f.Vc && (f.kp = f.Vc, ko(f, b, c, f.kp)))) + } + a.Vc = !1 + } + + U.prototype.expandTree = U.prototype.expandTree = function (a) { + void 0 === a && (a = 2); + u.ze(a, U, "expandTree:level"); + 2 > a && (a = 2); + var b = this.g; + if (null !== b && !b.me) { + var c = b.Lb; + 0 !== b.ha.Le && c.ml(); + b.me = !0; + var d = b.qd, e = new F(U); + e.add(this); + lo(this, e, d, a, this.Vc, c, this); + b.me = !1 + } + }; + + function lo(a, b, c, d, e, f, h) { + for (var k = c ? a.Wv() : a.og(); k.next();) { + var l = k.value; + l.Bc && (e || l.hg || l.Vb(), l = l.hz(a), null !== l && l !== a && !b.contains(l) && (b.add(l), e || (l.He(!0), l.dl(), ri(f, l, h)), 2 < d || l.kp)) && (l.kp = !1, lo(l, b, c, d - 1, l.Vc, f, h)) + } + a.Vc = !0 + } + + u.defineProperty(U, {Vc: "isTreeExpanded"}, function () { + return this.qq + }, function (a) { + var b = this.qq; + if (b !== a) { + this.qq = a; + var c = this.g; + this.h("isTreeExpanded", b, a); + b = this.zI; + if (null !== b) { + var d = !0; + null !== c && (d = c.Na, c.Na = !0); + b(this); + null !== c && (c.Na = d) + } + a ? null === c || c.me || (0 !== c.ha.Le && c.Lb.ml(), c.me = !0, a = c.qd, b = new F(U), b.add(this), lo(this, b, a, 2, !1, c.Lb, this), c.me = !1) : null === c || c.me || (0 !== c.ha.Le && c.Lb.ml(), c.me = !0, a = c.qd, b = new F(U), b.add(this), ko(this, b, a, !0), c.me = !1) + } + }); + u.defineProperty(U, {kp: "wasTreeExpanded"}, function () { + return this.$r + }, function (a) { + var b = this.$r; + b !== a && (this.$r = a, this.h("wasTreeExpanded", b, a)) + }); + u.defineProperty(U, {zI: "treeExpandedChanged"}, function () { + return this.Vr + }, function (a) { + var b = this.Vr; + b !== a && (null !== a && u.j(a, "function", U, "treeExpandedChanged"), this.Vr = a, this.h("treeExpandedChanged", b, a)) + }); + u.defineProperty(U, {Ji: "isTreeLeaf"}, function () { + return this.rq + }, function (a) { + var b = this.rq; + b !== a && (this.rq = a, this.h("isTreeLeaf", b, a)) + }); + + function W() { + G.call(this, ah); + this.Wf = null; + this.wh = ""; + this.gg = this.Yp = null; + this.Ih = ""; + this.Ur = null; + this.qr = this.pr = this.or = !1; + this.sq = !0; + this.tp = dh; + this.Hp = 0; + this.Kp = dh; + this.Lp = NaN; + this.Yl = Xl; + this.Kr = .5; + this.ue = null; + this.Qc = (new E(w)).freeze(); + this.Xn = this.we = null; + this.hg = !1; + this.py = null; + this.zy = !1; + this.an = this.di = this.Pa = null; + this.hf = 0; + this.nn = this.jn = null; + this.Vi = new E(z); + this.Dy = new w; + this.qC = this.oC = null; + this.jx = !1; + this.Q = null + } + + u.Ga(W, G); + u.fa("Link", W); + W.prototype.cloneProtected = function (a) { + G.prototype.cloneProtected.call(this, a); + a.wh = this.wh; + a.Yp = this.Yp; + a.Ih = this.Ih; + a.Ur = this.Ur; + a.or = this.or; + a.pr = this.pr; + a.qr = this.qr; + a.sq = this.sq; + a.tp = this.tp; + a.Hp = this.Hp; + a.Kp = this.Kp; + a.Lp = this.Lp; + a.Yl = this.Yl; + a.Kr = this.Kr; + a.Q = null !== this.Q ? this.Q.copy() : null + }; + W.prototype.Mh = function (a) { + G.prototype.Mh.call(this, a); + this.wh = a.wh; + this.Ih = a.Ih; + a.we = null; + a.Vb(); + a.an = this.an; + a.hf = this.hf + }; + var Xl; + W.Normal = Xl = u.s(W, "Normal", 1); + W.Orthogonal = u.s(W, "Orthogonal", 2); + W.AvoidsNodes = u.s(W, "AvoidsNodes", 6); + var mo; + W.AvoidsNodesStraight = mo = u.s(W, "AvoidsNodesStraight", 7); + var dh; + W.None = dh = u.s(W, "None", 0); + var kh; + W.Bezier = kh = u.s(W, "Bezier", 9); + var ch; + W.JumpGap = ch = u.s(W, "JumpGap", 10); + var bh; + W.JumpOver = bh = u.s(W, "JumpOver", 11); + var Ul; + W.End = Ul = u.s(W, "End", 17); + var Vl; + W.Scale = Vl = u.s(W, "Scale", 18); + var Wl; + W.Stretch = Wl = u.s(W, "Stretch", 19); + var en; + W.OrientAlong = en = u.s(W, "OrientAlong", 21); + var no; + W.OrientPlus90 = no = u.s(W, "OrientPlus90", 22); + var oo; + W.OrientMinus90 = oo = u.s(W, "OrientMinus90", 23); + var po; + W.OrientOpposite = po = u.s(W, "OrientOpposite", 24); + var qo; + W.OrientUpright = qo = u.s(W, "OrientUpright", 25); + var ro; + W.OrientPlus90Upright = ro = u.s(W, "OrientPlus90Upright", 26); + var so; + W.OrientMinus90Upright = so = u.s(W, "OrientMinus90Upright", 27); + var to; + W.OrientUpright45 = to = u.s(W, "OrientUpright45", 28); + W.prototype.Ee = function () { + this.Q = new il + }; + W.prototype.hl = function () { + var a = this.W; + if (null !== a) { + var b = a.findVisibleNode(); + null !== b && (a = b); + if (Bj(a) || Cj(a)) return !1 + } + a = this.ca; + return null !== a && (b = a.findVisibleNode(), null !== b && (a = b), Bj(a) || Cj(a)) ? !1 : !0 + }; + W.prototype.dA = function () { + return !1 + }; + W.prototype.Fd = function () { + return !1 + }; + W.prototype.computeAngle = function (a, b, c) { + a = 0; + switch (b) { + default: + case dh: + a = 0; + break; + case en: + a = c; + break; + case no: + a = c + 90; + break; + case oo: + a = c - 90; + break; + case po: + a = c + 180; + break; + case qo: + a = K.ct(c); + 90 < a && 270 > a && (a -= 180); + break; + case ro: + a = K.ct(c + 90); + 90 < a && 270 > a && (a -= 180); + break; + case so: + a = K.ct(c - 90); + 90 < a && 270 > a && (a -= 180); + break; + case to: + a = K.ct(c); + if (45 < a && 135 > a || 225 < a && 315 > a) return 0; + 90 < a && 270 > a && (a -= 180) + } + return K.ct(a) + }; + u.defineProperty(W, {W: "fromNode"}, function () { + return this.Wf + }, function (a) { + var b = this.Wf; + if (b !== a) { + var c = this.od; + null !== b && (this.gg !== b && fo(b, this, c), uo(this), this.H(Rj)); + this.Wf = a; + this.di = null; + this.Vb(); + var d = this.g; + if (null !== d) { + var e = this.data, f = d.ga; + if (null !== e) if (f instanceof Q) { + var h = null !== a ? a.data : null; + f.Ew(e, f.wb(h)) + } else f instanceof qe && (h = null !== a ? a.data : null, d.qd ? f.ih(e, f.wb(h)) : (null !== b && f.ih(b.data, void 0), f.ih(h, f.wb(null !== this.gg ? this.gg.data : null)))) + } + e = this.od; + f = this.wD; + null !== f && + (h = !0, null !== d && (h = d.Na, d.Na = !0), f(this, c, e), null !== d && (d.Na = h)); + null !== a && (this.gg !== a && eo(a, this, e), vo(this), this.H(Jj)); + this.h("fromNode", b, a); + xk(this) + } + }); + u.defineProperty(W, {pg: "fromPortId"}, function () { + return this.wh + }, function (a) { + var b = this.wh; + if (b !== a) { + var c = this.od; + null !== c && co(this.W, c); + uo(this); + this.wh = a; + var d = this.od; + null !== d && co(this.W, d); + var e = this.g; + if (null !== e) { + var f = this.data, h = e.ga; + null !== f && h instanceof Q && h.aA(f, a) + } + c !== d && (this.di = null, this.Vb(), f = this.wD, null !== f && (h = !0, null !== e && (h = e.Na, e.Na = !0), f(this, c, d), null !== e && (e.Na = h))); + vo(this); + this.h("fromPortId", b, a) + } + }); + u.u(W, {od: "fromPort"}, function () { + var a = this.Wf; + return null === a ? null : a.Xk(this.wh) + }); + u.defineProperty(W, {wD: "fromPortChanged"}, function () { + return this.Yp + }, function (a) { + var b = this.Yp; + b !== a && (null !== a && u.j(a, "function", W, "fromPortChanged"), this.Yp = a, this.h("fromPortChanged", b, a)) + }); + u.defineProperty(W, {ca: "toNode"}, function () { + return this.gg + }, function (a) { + var b = this.gg; + if (b !== a) { + var c = this.fe; + null !== b && (this.Wf !== b && fo(b, this, c), uo(this), this.H(Rj)); + this.gg = a; + this.di = null; + this.Vb(); + var d = this.g; + if (null !== d) { + var e = this.data, f = d.ga; + if (null !== e) if (f instanceof Q) { + var h = null !== a ? a.data : null; + f.Gw(e, f.wb(h)) + } else f instanceof qe && (h = null !== a ? a.data : null, d.qd ? (null !== b && f.ih(b.data, void 0), f.ih(h, f.wb(null !== this.Wf ? this.Wf.data : null))) : f.ih(e, f.wb(h))) + } + e = this.fe; + f = this.PE; + null !== f && + (h = !0, null !== d && (h = d.Na, d.Na = !0), f(this, c, e), null !== d && (d.Na = h)); + null !== a && (this.Wf !== a && eo(a, this, e), vo(this), this.H(Jj)); + this.h("toNode", b, a); + xk(this) + } + }); + u.defineProperty(W, {lh: "toPortId"}, function () { + return this.Ih + }, function (a) { + var b = this.Ih; + if (b !== a) { + var c = this.fe; + null !== c && co(this.ca, c); + uo(this); + this.Ih = a; + var d = this.fe; + null !== d && co(this.ca, d); + var e = this.g; + if (null !== e) { + var f = this.data, h = e.ga; + null !== f && h instanceof Q && h.eA(f, a) + } + c !== d && (this.di = null, this.Vb(), f = this.PE, null !== f && (h = !0, null !== e && (h = e.Na, e.Na = !0), f(this, c, d), null !== e && (e.Na = h))); + vo(this); + this.h("toPortId", b, a) + } + }); + u.u(W, {fe: "toPort"}, function () { + var a = this.gg; + return null === a ? null : a.Xk(this.Ih) + }); + u.defineProperty(W, {PE: "toPortChanged"}, function () { + return this.Ur + }, function (a) { + var b = this.Ur; + b !== a && (null !== a && u.j(a, "function", W, "toPortChanged"), this.Ur = a, this.h("toPortChanged", b, a)) + }); + u.defineProperty(W, {vb: "fromSpot"}, function () { + return null !== this.Q ? this.Q.cj : uc + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.cj; + b.L(a) || (a = a.Z(), this.Q.cj = a, this.h("fromSpot", b, a), this.Vb()) + }); + u.defineProperty(W, {Yk: "fromEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.aj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.aj; + b !== a && (0 > a && u.wa(a, ">= 0", W, "fromEndSegmentLength"), this.Q.aj = a, this.h("fromEndSegmentLength", b, a), this.Vb()) + }); + u.defineProperty(W, {Es: "fromEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.$i : Yn + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.$i; + b !== a && (this.Q.$i = a, this.h("fromEndSegmentDirection", b, a), this.Vb()) + }); + u.defineProperty(W, {Fs: "fromShortLength"}, function () { + return null !== this.Q ? this.Q.bj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.bj; + b !== a && (this.Q.bj = a, this.h("fromShortLength", b, a), this.Vb()) + }); + u.defineProperty(W, {xb: "toSpot"}, function () { + return null !== this.Q ? this.Q.Ej : uc + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Ej; + b.L(a) || (a = a.Z(), this.Q.Ej = a, this.h("toSpot", b, a), this.Vb()) + }); + u.defineProperty(W, {vl: "toEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.Cj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Cj; + b !== a && (0 > a && u.wa(a, ">= 0", W, "toEndSegmentLength"), this.Q.Cj = a, this.h("toEndSegmentLength", b, a), this.Vb()) + }); + u.defineProperty(W, {wt: "toEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.Bj : Yn + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Bj; + b !== a && (this.Q.Bj = a, this.h("toEndSegmentDirection", b, a), this.Vb()) + }); + u.defineProperty(W, {yt: "toShortLength"}, function () { + return null !== this.Q ? this.Q.Dj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Dj; + b !== a && (this.Q.Dj = a, this.h("toShortLength", b, a), this.Vb()) + }); + + function xk(a) { + var b = a.W, c = a.ca; + null !== b ? null !== c ? wo(a, b.yG(c)) : wo(a, null) : wo(a, null) + } + + function wo(a, b) { + var c = a.kk; + if (c !== b) { + null !== c && Sn(c, a); + a.kk = b; + null !== b && Tn(b, a); + var d = a.bD; + if (null !== d) { + var e = !0, f = a.g; + null !== f && (e = f.Na, f.Na = !0); + d(a, c, b); + null !== f && (f.Na = e) + } + !a.hg || a.oC !== c && a.qC !== c || a.Vb() + } + } + + W.prototype.dl = function () { + var a = this.Ra; + null !== a && this.W !== a && this.ca !== a && G.prototype.dl.call(this) + }; + W.prototype.getOtherNode = W.prototype.hz = function (a) { + var b = this.W; + return a === b ? this.ca : b + }; + W.prototype.getOtherPort = function (a) { + var b = this.od; + return a === b ? this.fe : b + }; + u.u(W, {EJ: "isLabeledLink"}, function () { + return null === this.ue ? !1 : 0 < this.ue.count + }); + u.u(W, {ug: "labelNodes"}, function () { + return null === this.ue ? Ia : this.ue.i + }); + + function ho(a, b) { + null === a.ue && (a.ue = new F(U)); + a.ue.add(b); + a.R() + } + + W.prototype.Js = function (a) { + G.prototype.Js.call(this, a); + xo(this) && eh(this, this.ba); + if (!a) { + a = this.Wf; + var b = this.gg; + null !== a && (eo(a, this, this.od), vo(this)); + null !== b && (eo(b, this, this.fe), vo(this)) + } + }; + W.prototype.Ks = function (a) { + G.prototype.Ks.call(this, a); + xo(this) && eh(this, this.ba); + if (!a) { + a = this.Wf; + var b = this.gg; + null !== a && (fo(a, this, this.od), uo(this)); + null !== b && (fo(b, this, this.fe), uo(this)) + } + }; + W.prototype.xm = function () { + this.hg = !0; + if (null !== this.ue) { + var a = this.g; + if (null === a) return; + for (var b = this.ue.copy().i; b.next();) a.remove(b.value) + } + b = this.data; + null !== b && (a = this.g, null !== a && (a = a.ga, a instanceof Q ? a.Uz(b) : a instanceof qe && a.ih(b, void 0))) + }; + W.prototype.updateRelationshipsFromData = function () { + var a = this.data; + if (null !== a) { + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof Q) { + var d = c.$k(a), e = b.Xe(d), f = this.W; + e !== f && (e = null !== f ? c.wb(f.data) : void 0, f = c.Ko, "function" === typeof f ? f(a, e) : a[f] = e, c.Ew(a, d)); + d = c.cl(a); + e = b.Xe(d); + f = this.ca; + e !== f && (e = null !== f ? c.wb(f.data) : void 0, f = c.Mo, "function" === typeof f ? f(a, e) : a[f] = e, c.Gw(a, d)); + var h = c.Pj(a); + if (0 < h.length || 0 < this.ug.count) { + if (1 === h.length && 1 === this.ug.count && (b = h[0], d = this.ug.first(), c.wb(d.data) === + b)) return; + var d = (new F).Td(h), k = new F; + this.ug.each(function (a) { + null !== a.data && (a = c.wb(a.data), void 0 !== a && k.add(a)) + }); + b = k.copy(); + b.jE(d); + d = d.copy(); + d.jE(k); + if (0 < b.count || 0 < d.count) h.length = 0, k.each(function (a) { + h.push(a) + }), b.each(function (b) { + c.mE(a, b) + }), d.each(function (b) { + c.Ly(a, b) + }) + } + } + } + } + }; + W.prototype.move = W.prototype.move = function (a) { + var b = this.position, c = b.x; + isNaN(c) && (c = 0); + b = b.y; + isNaN(b) && (b = 0); + c = a.x - c; + b = a.y - b; + G.prototype.move.call(this, a); + this.ll(c, b); + for (a = this.ug; a.next();) { + var d = a.value, e = d.position; + d.moveTo(e.x + c, e.y + b) + } + }; + u.defineProperty(W, {QH: "relinkableFrom"}, function () { + return this.or + }, function (a) { + var b = this.or; + b !== a && (this.or = a, this.h("relinkableFrom", b, a), this.Zd()) + }); + u.defineProperty(W, {RH: "relinkableTo"}, function () { + return this.pr + }, function (a) { + var b = this.pr; + b !== a && (this.pr = a, this.h("relinkableTo", b, a), this.Zd()) + }); + W.prototype.canRelinkFrom = function () { + if (!this.QH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.mm) return !1; + a = a.g; + return null === a || a.mm ? !0 : !1 + }; + W.prototype.canRelinkTo = function () { + if (!this.RH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.mm) return !1; + a = a.g; + return null === a || a.mm ? !0 : !1 + }; + u.defineProperty(W, {it: "resegmentable"}, function () { + return this.qr + }, function (a) { + var b = this.qr; + b !== a && (this.qr = a, this.h("resegmentable", b, a), this.Zd()) + }); + u.defineProperty(W, {Bc: "isTreeLink"}, function () { + return this.sq + }, function (a) { + var b = this.sq; + b !== a && (this.sq = a, this.h("isTreeLink", b, a), null !== this.W && Jk(this.W), null !== this.ca && Jk(this.ca)) + }); + u.u(W, {path: "path"}, function () { + var a = this.If(); + return a instanceof X ? a : null + }); + u.u(W, {Mm: "routeBounds"}, function () { + this.updateRoute(); + var a = new z; + var b = Infinity, c = Infinity, d = this.ka; + if (0 === d) a.m(NaN, NaN, 0, 0); else { + if (1 === d) d = this.l(0), b = Math.min(d.x, b), c = Math.min(d.y, c), a.m(d.x, d.y, 0, 0); else if (2 === d) { + var e = this.l(0), f = this.l(1), b = Math.min(e.x, f.x), c = Math.min(e.y, f.y); + a.m(e.x, e.y, 0, 0); + a.Oi(f) + } else if (this.computeCurve() === kh && 3 <= d && !this.dc) if (e = this.l(0), b = e.x, c = e.y, a.m(b, c, 0, 0), 3 === d) d = this.l(1), b = Math.min(d.x, b), c = Math.min(d.y, c), f = this.l(2), b = Math.min(f.x, b), c = Math.min(f.y, + c), K.oo(e.x, e.y, d.x, d.y, d.x, d.y, f.x, f.y, .5, a); else for (var h = 3; h < d; h += 3) { + var k = this.l(h - 2); + h + 3 >= d && (h = d - 1); + var l = this.l(h - 1), f = this.l(h); + K.oo(e.x, e.y, k.x, k.y, l.x, l.y, f.x, f.y, .5, a); + b = Math.min(f.x, b); + c = Math.min(f.y, c); + e = f + } else for (e = this.l(0), f = this.l(1), b = Math.min(e.x, f.x), c = Math.min(e.y, f.y), a.m(e.x, e.y, 0, 0), a.Oi(f), h = 2; h < d; h++) e = this.l(h), b = Math.min(e.x, b), c = Math.min(e.y, c), a.Oi(e); + this.Dy.m(b - a.x, c - a.y) + } + return this.py = a + }); + u.u(W, {XD: "midPoint"}, function () { + this.updateRoute(); + return this.computeMidPoint(new w) + }); + W.prototype.computeMidPoint = function (a) { + var b = this.ka; + if (0 === b) return a.assign(K.gF), a; + if (1 === b) return a.assign(this.l(0)), a; + if (2 === b) { + var c = this.l(0), d = this.l(1); + a.m((c.x + d.x) / 2, (c.y + d.y) / 2); + return a + } + if (this.computeCurve() === kh && 3 <= b && !this.dc) { + if (3 === b) return this.l(1); + var b = (b - 1) / 3 | 0, e = 3 * (b / 2 | 0); + 1 === b % 2 ? (c = this.l(e), d = this.l(e + 1), b = this.l(e + 2), e = this.l(e + 3), K.UF(c.x, c.y, d.x, d.y, b.x, b.y, e.x, e.y, a)) : a.assign(this.l(e)); + return a + } + for (var e = 0, f = u.eb(), h = 0; h < b - 1; h++) c = 0, c = this.l(h), d = this.l(h + 1), K.mb(c.x, + d.x) ? (c = d.y - c.y, 0 > c && (c = -c)) : K.mb(c.y, d.y) ? (c = d.x - c.x, 0 > c && (c = -c)) : c = Math.sqrt(c.Lj(d)), f.push(c), e += c; + for (d = h = c = 0; c < e / 2 && h < b;) { + d = f[h]; + if (c + d > e / 2) break; + c += d; + h++ + } + u.ra(f); + b = this.l(h); + f = this.l(h + 1); + b.x === f.x ? b.y > f.y ? a.m(b.x, b.y - (e / 2 - c)) : a.m(b.x, b.y + (e / 2 - c)) : b.y === f.y ? b.x > f.x ? a.m(b.x - (e / 2 - c), b.y) : a.m(b.x + (e / 2 - c), b.y) : (e = (e / 2 - c) / d, a.m(b.x + e * (f.x - b.x), b.y + e * (f.y - b.y))); + return a + }; + u.u(W, {WD: "midAngle"}, function () { + this.updateRoute(); + return this.computeMidAngle() + }); + W.prototype.computeMidAngle = function () { + var a = this.ka; + if (2 > a) return NaN; + if (this.computeCurve() === kh && 4 <= a && !this.dc) { + var b = (a - 1) / 3 | 0, c = 3 * (b / 2 | 0); + if (1 === b % 2) { + var c = Math.floor(c), a = this.l(c), b = this.l(c + 1), d = this.l(c + 2), c = this.l(c + 3); + return K.TF(a.x, a.y, b.x, b.y, d.x, d.y, c.x, c.y) + } + if (0 < c && c + 1 < a) return a = this.l(c - 1), b = this.l(c + 1), a.Fi(b) + } + d = a / 2 | 0; + if (0 === a % 2) return a = this.l(d - 1), b = this.l(d), a.Fi(b); + var a = this.l(d - 1), b = this.l(d), d = this.l(d + 1), c = a.Lj(b), e = b.Lj(d); + return c > e ? a.Fi(b) : b.Fi(d) + }; + u.defineProperty(W, {points: "points"}, function () { + return this.Qc + }, function (a) { + var b = this.Qc; + if (b !== a) { + var c = null; + if (Array.isArray(a)) { + var d = 0 === a.length % 2; + if (d) for (var e = 0; e < a.length; e++) if ("number" !== typeof a[e] || isNaN(a[e])) { + d = !1; + break + } + if (d) for (c = new E(w), d = 0; d < a.length / 2; d++) e = (new w(a[2 * d], a[2 * d + 1])).freeze(), c.add(e); else { + for (var f = !0, d = 0; d < a.length; d++) if (e = a[d], !u.Sa(e) || "number" !== typeof e.x || isNaN(e.x) || "number" !== typeof e.y || isNaN(e.y)) { + f = !1; + break + } + if (f) for (c = new E(w), d = 0; d < a.length; d++) e = + a[d], c.add((new w(e.x, e.y)).freeze()); else u.k("Link.points array must contain only an even number of numbers or objects with x and y properties, not: " + a) + } + } else if (a instanceof E) for (c = a.copy(), a = c.i; a.next();) a.value.freeze(); else u.k("Link.points value is not an instance of List or Array: " + a); + c.freeze(); + this.Qc = c; + this.le(); + yo(this); + this.g && this.g.Lb.ld && (this.Xn = c); + this.h("points", b, c) + } + }); + u.u(W, {ka: "pointsCount"}, function () { + return this.Qc.count + }); + W.prototype.getPoint = W.prototype.l = function (a) { + return this.Qc.n[a] + }; + W.prototype.setPoint = W.prototype.yf = function (a, b) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Bg(a, b) + }; + W.prototype.setPointAt = W.prototype.V = function (a, b, c) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Bg(a, new w(b, c)) + }; + W.prototype.insertPoint = function (a, b) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Yd(a, b) + }; + W.prototype.insertPointAt = W.prototype.w = function (a, b, c) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Yd(a, new w(b, c)) + }; + W.prototype.addPoint = W.prototype.Jh = function (a) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.add(a) + }; + W.prototype.addPointAt = W.prototype.Lk = function (a, b) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.add(new w(a, b)) + }; + W.prototype.removePoint = W.prototype.nE = function (a) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.hd(a) + }; + W.prototype.clearPoints = W.prototype.so = function () { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.clear() + }; + W.prototype.movePoints = W.prototype.ll = function (a, b) { + for (var c = new E(w), d = this.Qc.i; d.next();) { + var e = d.value; + c.add((new w(e.x + a, e.y + b)).freeze()) + } + c.freeze(); + d = this.Qc; + this.Qc = c; + this.le(); + yo(this); + this.g && this.g.Lb.ld && (this.Xn = c); + this.h("points", d, c) + }; + W.prototype.startRoute = W.prototype.rl = function () { + null === this.we && (this.we = this.Qc, this.Qc = this.Qc.copy()) + }; + W.prototype.commitRoute = W.prototype.Bi = function () { + if (null !== this.we) { + for (var a = this.we, b = this.Qc, c = Infinity, d = Infinity, e = a.n, f = e.length, h = 0; h < f; h++) var k = e[h], c = Math.min(k.x, c), d = Math.min(k.y, d); + for (var l = Infinity, m = Infinity, n = b.n, p = n.length, h = 0; h < p; h++) k = n[h], l = Math.min(k.x, l), m = Math.min(k.y, m), k.freeze(); + b.freeze(); + if (p === f) for (h = 0; h < p; h++) { + if (f = e[h], k = n[h], f.x - c !== k.x - l || f.y - d !== k.y - m) { + this.le(); + break + } + } else this.le(); + this.we = null; + this.g && this.g.Lb.ld && (this.Xn = b); + yo(this); + this.h("points", a, b) + } + }; + W.prototype.rollbackRoute = W.prototype.WH = function () { + null !== this.we && (this.Qc = this.we, this.we = null) + }; + + function yo(a) { + 0 === a.Qc.count ? a.hg = !1 : (a.hg = !0, a.jn = a.l(0).copy(), a.nn = a.l(a.ka - 1).copy(), zo(a, !1)) + } + + W.prototype.invalidateRoute = W.prototype.Vb = function () { + if (!(this.zy || this.g && this.g.ha.gb)) { + var a = this.path; + null !== a && (this.hg = !1, this.le(), a.R()) + } + }; + u.defineProperty(W, {ip: null}, function () { + return this.zy + }, function (a) { + this.zy = a + }); + W.prototype.updateRoute = function () { + if (!this.hg && !this.jx) { + var a = !0; + try { + this.jx = !0, this.rl(), a = this.computePoints() + } finally { + this.jx = !1, a ? this.Bi() : this.WH() + } + } + }; + W.prototype.computePoints = function () { + var a = this.g; + if (null === a) return !1; + var b = this.W, c = null; + null === b ? (a.Zl || (a.Xu = new X, a.Xu.xa = K.op, a.Xu.hb = 0, a.Zl = new U, a.Zl.add(a.Xu), a.Zl.pf()), this.jn && (a.Zl.position = a.Zl.location = this.jn, a.Zl.pf(), b = a.Zl, c = a.Xu)) : c = this.od; + if (null !== c) { + var d = Nl(c); + d !== b && b.Ea() ? c = d : (d = b.findVisibleNode(), null !== d && d !== b ? (b = d, c = d.Xk("")) : b = d) + } + this.oC = b; + if (null === b || null === c || !b.location.J()) return !1; + var d = this.ca, e = null; + null === d ? (a.$l || (a.Yu = new X, a.Yu.xa = K.op, a.Yu.hb = 0, a.$l = new U, + a.$l.add(a.Yu), a.$l.pf()), this.nn && (a.$l.position = a.$l.location = this.nn, a.$l.pf(), d = a.$l, e = a.Yu)) : e = this.fe; + null !== e && (a = Nl(e), a !== d && d.Ea() ? e = a : (a = d.findVisibleNode(), null !== a && a !== d ? (d = a, e = a.Xk("")) : d = a)); + this.qC = d; + if (null === d || null === e || !d.location.J()) return !1; + var a = this.ka, f = Ao(this, c), h = Bo(this, e), k = c === e && null !== c, l = this.dc, m = this.Ve === kh; + this.di = k && !l ? m = !0 : !1; + var n = this.es === dh || k; + if (l || f !== vb || h !== vb || k) { + m = this.el; + n && (l && m || k) && this.so(); + var p = k ? this.computeCurviness() : 0, q = this.getLinkPoint(b, + c, f, !0, l, d, e), r = 0, s = 0, t = 0; + if (l || f !== vb || k) { + var v = this.computeEndSegmentLength(b, c, f, !0), t = this.getLinkDirection(b, c, q, f, !0, l, d, e); + k && (t -= l ? 90 : 30, 0 > p && (t -= 180)); + 0 > t ? t += 360 : 360 <= t && (t -= 360); + k && (v += Math.abs(p)); + 0 === t ? r = v : 90 === t ? s = v : 180 === t ? r = -v : 270 === t ? s = -v : (r = v * Math.cos(t * Math.PI / 180), s = v * Math.sin(t * Math.PI / 180)); + if (f.ne() && k) { + var x = c.lb(Ib, u.K()), B = u.fc(x.x + 1E3 * r, x.y + 1E3 * s); + this.getLinkPointFromPoint(b, c, x, B, !0, q); + u.v(x); + u.v(B) + } + } + var v = this.getLinkPoint(d, e, h, !1, l, b, c), y = 0, C = 0, I = 0; + if (l || h !== vb || k) x = + this.computeEndSegmentLength(d, e, h, !1), I = this.getLinkDirection(d, e, v, h, !1, l, b, c), k && (I += l ? 0 : 30, 0 > p && (I += 180)), 0 > I ? I += 360 : 360 <= I && (I -= 360), k && (x += Math.abs(p)), 0 === I ? y = x : 90 === I ? C = x : 180 === I ? y = -x : 270 === I ? C = -x : (y = x * Math.cos(I * Math.PI / 180), C = x * Math.sin(I * Math.PI / 180)), h.ne() && k && (x = e.lb(Ib, u.K()), B = u.fc(x.x + 1E3 * y, x.y + 1E3 * C), this.getLinkPointFromPoint(d, e, x, B, !1, v), u.v(x), u.v(B)); + e = q; + if (l || f !== vb || k) e = new w(q.x + r, q.y + s); + c = v; + if (l || h !== vb || k) c = new w(v.x + y, v.y + C); + !n && !l && f === vb && 3 < a && this.adjustPoints(0, q, + a - 2, c) ? this.yf(a - 1, v) : !n && !l && h === vb && 3 < a && this.adjustPoints(1, e, a - 1, v) ? this.yf(0, q) : !n && !l && 4 < a && this.adjustPoints(1, e, a - 2, c) ? (this.yf(0, q), this.yf(a - 1, v)) : !n && l && 6 <= a && !m && this.adjustPoints(1, e, a - 2, c) ? (this.yf(0, q), this.yf(a - 1, v)) : (this.so(), this.Jh(q), (l || f !== vb || k) && this.Jh(e), l && this.addOrthoPoints(e, t, c, I, b, d), (l || h !== vb || k) && this.Jh(c), this.Jh(v)) + } else f = !1, !n && 3 <= a && (n = this.getLinkPoint(b, c, vb, !0, !1, d, e), h = this.getLinkPoint(d, e, vb, !1, !1, b, c), f = this.adjustPoints(0, n, a - 1, h)) && (n = this.getLinkPoint(b, + c, vb, !0, !1, d, e), h = this.getLinkPoint(d, e, vb, !1, !1, b, c), this.adjustPoints(0, n, a - 1, h)), f || (this.so(), m ? (a = this.getLinkPoint(b, c, vb, !0, !1, d, e), n = this.getLinkPoint(d, e, vb, !1, !1, b, c), f = n.x - a.x, h = n.y - a.y, k = this.computeCurviness(), m = l = 0, q = a.x + f / 3, t = a.y + h / 3, r = q, s = t, K.D(h, 0) ? s = 0 < f ? s - k : s + k : (l = -f / h, m = Math.sqrt(k * k / (l * l + 1)), 0 > k && (m = -m), r = (0 > h ? -1 : 1) * m + q, s = l * (r - q) + t), q = a.x + 2 * f / 3, t = a.y + 2 * h / 3, v = q, y = t, K.D(h, 0) ? y = 0 < f ? y - k : y + k : (v = (0 > h ? -1 : 1) * m + q, y = l * (v - q) + t), this.so(), this.Jh(a), this.Lk(r, s), this.Lk(v, y), this.Jh(n), this.yf(0, + this.getLinkPoint(b, c, vb, !0, !1, d, e)), this.yf(3, this.getLinkPoint(d, e, vb, !1, !1, b, c))) : (a = d, d = this.getLinkPoint(b, c, vb, !0, !1, a, e), e = this.getLinkPoint(a, e, vb, !1, !1, b, c), this.hasCurviness() ? (h = e.x - d.x, b = e.y - d.y, c = this.computeCurviness(), a = d.x + h / 2, n = d.y + b / 2, f = a, k = n, K.D(b, 0) ? k = 0 < h ? k - c : k + c : (h = -h / b, f = Math.sqrt(c * c / (h * h + 1)), 0 > c && (f = -f), f = (0 > b ? -1 : 1) * f + a, k = h * (f - a) + n), this.Jh(d), this.Lk(f, k)) : this.Jh(d), this.Jh(e))); + return !0 + }; + + function Co(a, b) { + Math.abs(b.x - a.x) > Math.abs(b.y - a.y) ? (b.x = b.x >= a.x ? a.x + 9E9 : a.x - 9E9, b.y = a.y) : (b.y = b.y >= a.y ? a.y + 9E9 : a.y - 9E9, b.x = a.x); + return b + } + + W.prototype.getLinkPointFromPoint = function (a, b, c, d, e, f) { + void 0 === f && (f = new w); + if (null === a || null === b) return f.assign(c), f; + a.Ea() || (e = a.findVisibleNode(), null !== e && e !== a && (b = e.port)); + var h = e = 0, k = 0, l = 0; + a = null; + e = b.S; + null === e || e.Tf() || (e = e.S); + if (null === e) e = d.x, h = d.y, k = c.x, l = c.y; else { + a = e.Ff; + e = 1 / (a.m11 * a.m22 - a.m12 * a.m21); + var k = a.m22 * e, l = -a.m12 * e, m = -a.m21 * e, n = a.m11 * e, p = e * (a.m21 * a.dy - a.m22 * a.dx), + q = e * (a.m12 * a.dx - a.m11 * a.dy); + e = d.x * k + d.y * m + p; + h = d.x * l + d.y * n + q; + k = c.x * k + c.y * m + p; + l = c.x * l + c.y * n + q + } + b.Co(e, h, k, l, f); + null !== + a && f.transform(a); + return f + }; + + function Do(a, b) { + var c = b.jr; + null === c && (c = new Eo, c.port = b, c.Cc = b.T, b.jr = c); + return Fo(c, a) + } + + W.prototype.getLinkPoint = function (a, b, c, d, e, f, h, k) { + void 0 === k && (k = new w); + if (c.pd()) return b.lb(c, k), k; + if (c.Go() && (c = Do(this, b), null !== c)) { + k.assign(c.Lo); + if (e && this.zw === mo) { + var l = Do(this, h); + if (c.vm < l.vm) { + c = u.K(); + var l = u.K(), m = new z(b.lb(xb, c), b.lb(Vb, l)), n = this.computeSpot(!d); + a = this.getLinkPoint(f, h, n, !d, e, a, b, l); + a.x >= m.x && a.x <= m.x + m.width ? k.x = a.x : a.y >= m.y && a.y <= m.y + m.height && (k.y = a.y); + u.v(c); + u.v(l) + } + } + return k + } + f = b.lb(Ib, u.K()); + l = c = null; + this.ka > (e ? 6 : 2) ? (l = d ? this.l(1) : this.l(this.ka - 2), e && (l = Co(f, l.copy()))) : + (c = u.K(), l = h.lb(Ib, c), e && (l = Co(f, l))); + this.getLinkPointFromPoint(a, b, f, l, d, k); + u.v(f); + null !== c && u.v(c); + return k + }; + W.prototype.getLinkDirection = function (a, b, c, d, e, f, h, k) { + a:if (d.pd()) c = d.x > d.y ? d.x > 1 - d.y ? 0 : d.x < 1 - d.y ? 270 : 315 : d.x < d.y ? d.x > 1 - d.y ? 90 : d.x < 1 - d.y ? 180 : 135 : .5 > d.x ? 225 : .5 < d.x ? 45 : 0; else { + if (d.Go()) { + var l = Do(this, b); + if (null !== l) switch (l.ee) { + case u.Xc: + c = 270; + break a; + case u.Fc: + c = 180; + break a; + default: + case u.Oc: + c = 0; + break a; + case u.Nc: + c = 90; + break a + } + } + var l = b.lb(Ib, u.K()), m = null, n = null; + this.ka > (f ? 6 : 2) ? (n = e ? this.l(1) : this.l(this.ka - 2), n = f ? Co(l, n.copy()) : c) : (m = u.K(), n = k.lb(Ib, m)); + c = 0; + c = Math.abs(n.x - l.x) > Math.abs(n.y - l.y) ? n.x >= + l.x ? 0 : 180 : n.y >= l.y ? 90 : 270; + u.v(l); + null !== m && u.v(m) + } + d.ne() && h.Ph(a) && (c += 180, 360 <= c && (c -= 360)); + a = Yn; + a = e ? this.Es : this.wt; + a === Yn && (a = e ? b.Es : b.wt); + switch (a) { + case Zn: + b = b.Zk(); + c += b; + 360 <= c && (c -= 360); + break; + case Yn: + case jl: + b = b.Zk(); + if (0 === b) break; + 45 <= b && 135 > b ? c += 90 : 135 <= b && 225 > b ? c += 180 : 225 <= b && 315 > b && (c += 270); + 360 <= c && (c -= 360) + } + return c + }; + W.prototype.computeEndSegmentLength = function (a, b, c, d) { + if (null !== b && c.Go() && (a = Do(this, b), null !== a)) return a.Sv; + a = NaN; + a = d ? this.Yk : this.vl; + null !== b && isNaN(a) && (a = d ? b.Yk : b.vl); + isNaN(a) && (a = 10); + return a + }; + W.prototype.computeSpot = function (a) { + return a ? Ao(this, this.od) : Bo(this, this.fe) + }; + + function Ao(a, b) { + if (null === b) return Ib; + var c = a.vb; + c.Lc() && (void 0 === b && (b = a.od), null !== b && (c = b.vb)); + return c === uc ? vb : c + } + + function Bo(a, b) { + if (null === b) return Ib; + var c = a.xb; + c.Lc() && (void 0 === b && (b = a.fe), null !== b && (c = b.xb)); + return c === uc ? vb : c + } + + W.prototype.computeOtherPoint = function (a, b) { + var c = b.lb(Ib), d; + d = b.jr; + d = null !== d ? Fo(d, this) : null; + null !== d && (c = d.Lo); + return c + }; + W.prototype.computeShortLength = function (a) { + return a ? Go(this) : Ho(this) + }; + + function Go(a) { + var b = a.Fs; + isNaN(b) && (a = a.od, null !== a && (b = a.Fs)); + return isNaN(b) ? 0 : b + } + + function Ho(a) { + var b = a.yt; + isNaN(b) && (a = a.fe, null !== a && (b = a.yt)); + return isNaN(b) ? 0 : b + } + + W.prototype.Nj = function (a, b, c, d, e, f) { + if (!1 === this.Ag) return !1; + void 0 === b && (b = null); + void 0 === c && (c = null); + var h = f; + void 0 === f && (h = u.jh(), h.reset()); + h.multiply(this.transform); + if (this.sm(a, h)) return Um(this, b, c, e), void 0 === f && u.Ye(h), !0; + if (this.sg(a, h)) { + var k = !1; + if (!this.Kg) for (var l = this.ya.n, m = l.length; m--;) { + var n = l[m]; + if (n.visible || n === this.ec) { + var p = n.ba, q = this.Ha; + if (!(p.x > q.width || p.y > q.height || 0 > p.x + p.width || 0 > p.y + p.height)) { + p = u.jh(); + p.set(h); + if (n instanceof A) k = n.Nj(a, b, c, d, e, p); else if (this.path === + n) { + var k = n, r = a, s = d, q = p; + if (!1 === k.Ag) k = !1; else if (q.multiply(k.transform), s) b:{ + var t = r, v = q; + if (k.sm(t, v)) k = !0; else { + if (void 0 === v && (v = k.transform, t.Kj(k.ba))) { + k = !0; + break b + } + var q = t.left, r = t.right, s = t.top, t = t.bottom, x = u.K(), B = u.K(), + y = u.K(), C = u.jh(); + C.set(v); + C.aE(k.transform); + C.oz(); + B.x = r; + B.y = s; + B.transform(C); + x.x = q; + x.y = s; + x.transform(C); + v = !1; + cn(k, x, B, y) ? v = !0 : (x.x = r, x.y = t, x.transform(C), cn(k, x, B, y) ? v = !0 : (B.x = q, B.y = t, B.transform(C), cn(k, x, B, y) ? v = !0 : (x.x = q, x.y = s, x.transform(C), cn(k, x, B, y) && (v = !0)))); + u.Ye(C); + u.v(x); + u.v(B); + u.v(y); + k = v + } + } else k = k.sm(r, q) + } else k = ol(n, a, d, p); + k && (null !== b && (n = b(n)), n && (null === c || c(n)) && e.add(n)); + u.Ye(p) + } + } + } + void 0 === f && u.Ye(h); + return k || null !== this.background || null !== this.nm + } + void 0 === f && u.Ye(h); + return !1 + }; + u.u(W, {dc: "isOrthogonal"}, function () { + return 2 === (this.Yl.value & 2) + }); + u.u(W, {el: "isAvoiding"}, function () { + return 4 === (this.Yl.value & 4) + }); + W.prototype.computeCurve = function () { + if (null === this.di) { + var a = this.od, b = this.dc; + this.di = null !== a && a === this.fe && !b + } + return this.di ? kh : this.Ve + }; + W.prototype.computeCorner = function () { + if (this.Ve === kh) return 0; + var a = this.Yy; + if (isNaN(a) || 0 > a) a = 10; + return a + }; + W.prototype.computeCurviness = function () { + var a = this.Ov; + if (isNaN(a)) { + var b = this.hf; + if (0 !== b) { + var a = 10, c = this.g; + null !== c && (a = c.ow); + c = Math.abs(b); + a = a / 2 + ((c - 1) / 2 | 0) * a; + 0 === c % 2 && (a = -a); + 0 > b && (a = -a) + } else a = 10 + } + return a + }; + W.prototype.computeThickness = function () { + var a = this.path; + return null !== a ? Math.max(a.hb, 1) : 1 + }; + W.prototype.hasCurviness = function () { + return !isNaN(this.Ov) || 0 !== this.hf && !this.dc + }; + W.prototype.adjustPoints = function (a, b, c, d) { + var e = this.es; + if (this.dc) { + if (e === Vl) return !1; + e === Wl && (e = Ul) + } + switch (e) { + case Vl: + var f = this.l(a), h = this.l(c); + if (!f.L(b) || !h.L(d)) { + var e = f.x, f = f.y, k = h.x - e, l = h.y - f, m = Math.sqrt(k * k + l * l); + if (!K.D(m, 0)) { + var n = 0; + K.D(k, 0) ? n = 0 > l ? -Math.PI / 2 : Math.PI / 2 : (n = Math.atan(l / Math.abs(k)), 0 > k && (n = Math.PI - n)); + var h = b.x, p = b.y, l = d.x - h, q = d.y - p, r = Math.sqrt(l * l + q * q), k = 0; + K.D(l, 0) ? k = 0 > q ? -Math.PI / 2 : Math.PI / 2 : (k = Math.atan(q / Math.abs(l)), 0 > l && (k = Math.PI - k)); + m = r / m; + n = k - n; + this.yf(a, b); + for (a += + 1; a < c; a++) b = this.l(a), k = b.x - e, l = b.y - f, b = Math.sqrt(k * k + l * l), K.D(b, 0) || (q = 0, K.D(k, 0) ? q = 0 > l ? -Math.PI / 2 : Math.PI / 2 : (q = Math.atan(l / Math.abs(k)), 0 > k && (q = Math.PI - q)), k = q + n, b *= m, this.V(a, h + b * Math.cos(k), p + b * Math.sin(k))); + this.yf(c, d) + } + } + return !0; + case Wl: + f = this.l(a); + p = this.l(c); + if (!f.L(b) || !p.L(d)) { + var e = f.x, f = f.y, h = p.x, p = p.y, m = (h - e) * (h - e) + (p - f) * (p - f), k = b.x, n = b.y, + l = d.x, q = d.y, r = 0, s = 1, r = 0 !== l - k ? (q - n) / (l - k) : 9E9; + 0 !== r && (s = Math.sqrt(1 + 1 / (r * r))); + this.yf(a, b); + for (a += 1; a < c; a++) { + b = this.l(a); + var t = b.x, v = b.y, x = .5; + 0 !== m && + (x = ((e - t) * (e - h) + (f - v) * (f - p)) / m); + var B = e + x * (h - e), y = f + x * (p - f); + b = Math.sqrt((t - B) * (t - B) + (v - y) * (v - y)); + v < r * (t - B) + y && (b = -b); + 0 < r && (b = -b); + t = k + x * (l - k); + x = n + x * (q - n); + 0 !== r ? (b = t + b / s, this.V(a, b, x - (b - t) / r)) : this.V(a, t, x + b) + } + this.yf(c, d) + } + return !0; + case Ul: + return this.dc && (e = this.l(a), f = this.l(a + 1), h = this.l(a + 2), K.D(e.y, f.y) ? K.D(f.x, h.x) ? this.V(a + 1, f.x, b.y) : K.D(f.y, h.y) && this.V(a + 1, b.x, f.y) : K.D(e.x, f.x) && (K.D(f.y, h.y) ? this.V(a + 1, b.x, f.y) : K.D(f.x, h.x) && this.V(a + 1, f.x, b.y)), e = this.l(c), f = this.l(c - 1), h = this.l(c - 2), K.D(e.y, + f.y) ? K.D(f.x, h.x) ? this.V(c - 1, f.x, d.y) : K.D(f.y, h.y) && this.V(c - 1, d.x, f.y) : K.D(e.x, f.x) && (K.D(f.y, h.y) ? this.V(c - 1, d.x, f.y) : K.D(f.x, h.x) && this.V(c - 1, f.x, d.y))), this.yf(a, b), this.yf(c, d), !0; + default: + return !1 + } + }; + W.prototype.addOrthoPoints = function (a, b, c, d, e, f) { + b = -45 <= b && 45 > b ? 0 : 45 <= b && 135 > b ? 90 : 135 <= b && 225 > b ? 180 : 270; + d = -45 <= d && 45 > d ? 0 : 45 <= d && 135 > d ? 90 : 135 <= d && 225 > d ? 180 : 270; + var h = e.ba.copy(), k = f.ba.copy(); + if (h.J() && k.J()) { + h.Jf(8, 8); + k.Jf(8, 8); + h.Oi(a); + k.Oi(c); + var l, m; + if (0 === b) if (c.x > a.x || 270 === d && c.y < a.y && k.right > a.x || 90 === d && c.y > a.y && k.right > a.x) l = new w(c.x, a.y), m = new w(c.x, (a.y + c.y) / 2), 180 === d ? (l.x = this.computeMidOrthoPosition(a.x, c.x, !1), m.x = l.x, m.y = c.y) : 270 === d && c.y < a.y || 90 === d && c.y > a.y ? (l.x = a.x < k.left ? this.computeMidOrthoPosition(a.x, + k.left, !1) : a.x < k.right && (270 === d && a.y < k.top || 90 === d && a.y > k.bottom) ? this.computeMidOrthoPosition(a.x, c.x, !1) : k.right, m.x = l.x, m.y = c.y) : 0 === d && a.x < k.left && a.y > k.top && a.y < k.bottom && (l.x = a.x, l.y = a.y < c.y ? Math.min(c.y, k.top) : Math.max(c.y, k.bottom), m.y = l.y); else { + l = new w(a.x, c.y); + m = new w((a.x + c.x) / 2, c.y); + if (180 === d || 90 === d && c.y < h.top || 270 === d && c.y > h.bottom) 180 === d && (k.Aa(a) || h.Aa(c)) ? l.y = this.computeMidOrthoPosition(a.y, c.y, !0) : c.y < a.y && (180 === d || 90 === d) ? l.y = this.computeMidOrthoPosition(h.top, Math.max(c.y, + k.bottom), !0) : c.y > a.y && (180 === d || 270 === d) && (l.y = this.computeMidOrthoPosition(h.bottom, Math.min(c.y, k.top), !0)), m.x = c.x, m.y = l.y; + if (l.y > h.top && l.y < h.bottom) if (c.x >= h.left && c.x <= a.x || a.x <= k.right && a.x >= c.x) { + if (90 === d || 270 === d) l = new w(Math.max((a.x + c.x) / 2, a.x), a.y), m = new w(l.x, c.y) + } else l.y = 270 === d || (0 === d || 180 === d) && c.y < a.y ? Math.min(c.y, 0 === d ? h.top : Math.min(h.top, k.top)) : Math.max(c.y, 0 === d ? h.bottom : Math.max(h.bottom, k.bottom)), m.x = c.x, m.y = l.y + } else if (180 === b) if (c.x < a.x || 270 === d && c.y < a.y && k.left < a.x || + 90 === d && c.y > a.y && k.left < a.x) l = new w(c.x, a.y), m = new w(c.x, (a.y + c.y) / 2), 0 === d ? (l.x = this.computeMidOrthoPosition(a.x, c.x, !1), m.x = l.x, m.y = c.y) : 270 === d && c.y < a.y || 90 === d && c.y > a.y ? (l.x = a.x > k.right ? this.computeMidOrthoPosition(a.x, k.right, !1) : a.x > k.left && (270 === d && a.y < k.top || 90 === d && a.y > k.bottom) ? this.computeMidOrthoPosition(a.x, c.x, !1) : k.left, m.x = l.x, m.y = c.y) : 180 === d && a.x > k.right && a.y > k.top && a.y < k.bottom && (l.x = a.x, l.y = a.y < c.y ? Math.min(c.y, k.top) : Math.max(c.y, k.bottom), m.y = l.y); else { + l = new w(a.x, c.y); + m = new w((a.x + + c.x) / 2, c.y); + if (0 === d || 90 === d && c.y < h.top || 270 === d && c.y > h.bottom) 0 === d && (k.Aa(a) || h.Aa(c)) ? l.y = this.computeMidOrthoPosition(a.y, c.y, !0) : c.y < a.y && (0 === d || 90 === d) ? l.y = this.computeMidOrthoPosition(h.top, Math.max(c.y, k.bottom), !0) : c.y > a.y && (0 === d || 270 === d) && (l.y = this.computeMidOrthoPosition(h.bottom, Math.min(c.y, k.top), !0)), m.x = c.x, m.y = l.y; + if (l.y > h.top && l.y < h.bottom) if (c.x <= h.right && c.x >= a.x || a.x >= k.left && a.x <= c.x) { + if (90 === d || 270 === d) l = new w(Math.min((a.x + c.x) / 2, a.x), a.y), m = new w(l.x, c.y) + } else l.y = 270 === + d || (0 === d || 180 === d) && c.y < a.y ? Math.min(c.y, 180 === d ? h.top : Math.min(h.top, k.top)) : Math.max(c.y, 180 === d ? h.bottom : Math.max(h.bottom, k.bottom)), m.x = c.x, m.y = l.y + } else if (90 === b) if (c.y > a.y || 180 === d && c.x < a.x && k.bottom > a.y || 0 === d && c.x > a.x && k.bottom > a.y) l = new w(a.x, c.y), m = new w((a.x + c.x) / 2, c.y), 270 === d ? (l.y = this.computeMidOrthoPosition(a.y, c.y, !0), m.x = c.x, m.y = l.y) : 180 === d && c.x < a.x || 0 === d && c.x > a.x ? (l.y = a.y < k.top ? this.computeMidOrthoPosition(a.y, k.top, !0) : a.y < k.bottom && (180 === d && a.x < k.left || 0 === d && a.x > k.right) ? + this.computeMidOrthoPosition(a.y, c.y, !0) : k.bottom, m.x = c.x, m.y = l.y) : 90 === d && a.y < k.top && a.x > k.left && a.x < k.right && (l.x = a.x < c.x ? Math.min(c.x, k.left) : Math.max(c.x, k.right), l.y = a.y, m.x = l.x); else { + l = new w(c.x, a.y); + m = new w(c.x, (a.y + c.y) / 2); + if (270 === d || 0 === d && c.x < h.left || 180 === d && c.x > h.right) 270 === d && (k.Aa(a) || h.Aa(c)) ? l.x = this.computeMidOrthoPosition(a.x, c.x, !1) : c.x < a.x && (270 === d || 0 === d) ? l.x = this.computeMidOrthoPosition(h.left, Math.max(c.x, k.right), !1) : c.x > a.x && (270 === d || 180 === d) && (l.x = this.computeMidOrthoPosition(h.right, + Math.min(c.x, k.left), !1)), m.x = l.x, m.y = c.y; + if (l.x > h.left && l.x < h.right) if (c.y >= h.top && c.y <= a.y || a.y <= k.bottom && a.y >= c.y) { + if (0 === d || 180 === d) l = new w(a.x, Math.max((a.y + c.y) / 2, a.y)), m = new w(c.x, l.y) + } else l.x = 180 === d || (90 === d || 270 === d) && c.x < a.x ? Math.min(c.x, 90 === d ? h.left : Math.min(h.left, k.left)) : Math.max(c.x, 90 === d ? h.right : Math.max(h.right, k.right)), m.x = l.x, m.y = c.y + } else if (c.y < a.y || 180 === d && c.x < a.x && k.top < a.y || 0 === d && c.x > a.x && k.top < a.y) l = new w(a.x, c.y), m = new w((a.x + c.x) / 2, c.y), 90 === d ? (l.y = this.computeMidOrthoPosition(a.y, + c.y, !0), m.x = c.x, m.y = l.y) : 180 === d && c.x < a.x || 0 === d && c.x >= a.x ? (l.y = a.y > k.bottom ? this.computeMidOrthoPosition(a.y, k.bottom, !0) : a.y > k.top && (180 === d && a.x < k.left || 0 === d && a.x > k.right) ? this.computeMidOrthoPosition(a.y, c.y, !0) : k.top, m.x = c.x, m.y = l.y) : 270 === d && a.y > k.bottom && a.x > k.left && a.x < k.right && (l.x = a.x < c.x ? Math.min(c.x, k.left) : Math.max(c.x, k.right), l.y = a.y, m.x = l.x); else { + l = new w(c.x, a.y); + m = new w(c.x, (a.y + c.y) / 2); + if (90 === d || 0 === d && c.x < h.left || 180 === d && c.x > h.right) 90 === d && (k.Aa(a) || h.Aa(c)) ? l.x = this.computeMidOrthoPosition(a.x, + c.x, !1) : c.x < a.x && (90 === d || 0 === d) ? l.x = this.computeMidOrthoPosition(h.left, Math.max(c.x, k.right), !1) : c.x > a.x && (90 === d || 180 === d) && (l.x = this.computeMidOrthoPosition(h.right, Math.min(c.x, k.left), !1)), m.x = l.x, m.y = c.y; + if (l.x > h.left && l.x < h.right) if (c.y <= h.bottom && c.y >= a.y || a.y >= k.top && a.y <= c.y) { + if (0 === d || 180 === d) l = new w(a.x, Math.min((a.y + c.y) / 2, a.y)), m = new w(c.x, l.y) + } else l.x = 180 === d || (90 === d || 270 === d) && c.x < a.x ? Math.min(c.x, 270 === d ? h.left : Math.min(h.left, k.left)) : Math.max(c.x, 270 === d ? h.right : Math.max(h.right, + k.right)), m.x = l.x, m.y = c.y + } + var n = l, p = m; + if (this.el) { + var q = this.g, r; + (r = null === q) || (q.Lb.Vg ? r = !1 : (r = q.Va, r = r instanceof uf ? !r.jv || r.YG : !0), r = !r); + if (r || h.Aa(c) && !f.Ph(e) || k.Aa(a) && !e.Ph(f) || e === f || this.layer.Ac) a = !1; else if (e = Lk(q, !0, this.Ra, null), e.Jo(Math.min(a.x, n.x), Math.min(a.y, n.y), Math.abs(a.x - n.x), Math.abs(a.y - n.y)) && e.Jo(Math.min(n.x, p.x), Math.min(n.y, p.y), Math.abs(n.x - p.x), Math.abs(n.y - p.y)) && e.Jo(Math.min(p.x, c.x), Math.min(p.y, c.y), Math.abs(p.x - c.x), Math.abs(p.y - c.y))) a = !1; else if (h = h.copy().Sh(k), + h.Jf(2 * e.ro, 2 * e.po), Io(e, a, b, c, d, h), k = Jo(e, c.x, c.y), e.abort || 999999 !== k || (Ok(e), k = e.KE, h.Jf(e.ro * k, e.po * k), Io(e, a, b, c, d, h), k = Jo(e, c.x, c.y)), e.abort || 999999 !== k || (Ok(e), k = e.SD, h.Jf(e.ro * k, e.po * k), Io(e, a, b, c, d, h), k = Jo(e, c.x, c.y)), !e.abort && 999999 === k && e.$E && (Ok(e), Io(e, a, b, c, d, e.kb), k = Jo(e, c.x, c.y)), !e.abort && 999999 > k && 0 !== Jo(e, c.x, c.y)) { + Ko(this, e, c.x, c.y, d, !0); + d = this.l(2); + if (4 > this.ka) 0 === b || 180 === b ? (d.x = a.x, d.y = c.y) : (d.x = c.x, d.y = a.y), this.V(2, d.x, d.y), this.w(3, d.x, d.y); else if (c = this.l(3), 0 === b || + 180 === b) K.D(d.x, c.x) ? (b = 0 === b ? Math.max(d.x, a.x) : Math.min(d.x, a.x), this.V(2, b, a.y), this.V(3, b, c.y)) : K.D(d.y, c.y) ? (Math.abs(a.y - d.y) <= e.po / 2 && (this.V(2, d.x, a.y), this.V(3, c.x, a.y)), this.w(2, d.x, a.y)) : this.V(2, a.x, d.y); else if (90 === b || 270 === b) K.D(d.y, c.y) ? (b = 90 === b ? Math.max(d.y, a.y) : Math.min(d.y, a.y), this.V(2, a.x, b), this.V(3, c.x, b)) : K.D(d.x, c.x) ? (Math.abs(a.x - d.x) <= e.ro / 2 && (this.V(2, a.x, d.y), this.V(3, a.x, c.y)), this.w(2, a.x, d.y)) : this.V(2, d.x, a.y); + a = !0 + } else a = !1 + } else a = !1; + a || (this.Jh(l), this.Jh(m)) + } + }; + W.prototype.computeMidOrthoPosition = function (a, b) { + if (this.hasCurviness()) { + var c = this.computeCurviness(); + return (a + b) / 2 + c + } + return (a + b) / 2 + }; + + function gg(a) { + if (!a.el) return !1; + var b = a.points.n, c = b.length; + if (4 > c) return !1; + a = Lk(a.g, !0, a.Ra, null); + for (var d = 1; d < c - 2; d++) { + var e = b[d], f = b[d + 1]; + if (!a.Jo(Math.min(e.x, f.x), Math.min(e.y, f.y), Math.abs(e.x - f.x), Math.abs(e.y - f.y))) return !0 + } + return !1 + } + + function Ko(a, b, c, d, e, f) { + var h = b.ro, k = b.po, l = Jo(b, c, d), m = c, n = d; + for (0 === e ? m += h : 90 === e ? n += k : 180 === e ? m -= h : n -= k; 1 < l && Jo(b, m, n) === l - 1;) c = m, d = n, 0 === e ? m += h : 90 === e ? n += k : 180 === e ? m -= h : n -= k, l -= 1; + if (f) { + if (1 < l) if (180 === e || 0 === e) c = Math.floor(c / h) * h + h / 2; else if (90 === e || 270 === e) d = Math.floor(d / k) * k + k / 2 + } else c = Math.floor(c / h) * h + h / 2, d = Math.floor(d / k) * k + k / 2; + 1 < l && (f = e, m = c, n = d, 0 === e ? (f = 90, n += k) : 90 === e ? (f = 180, m -= h) : 180 === e ? (f = 270, n -= k) : 270 === e && (f = 0, m += h), Jo(b, m, n) === l - 1 ? Ko(a, b, m, n, f, !1) : (m = c, n = d, 0 === e ? (f = 270, n -= k) : 90 === + e ? (f = 0, m += h) : 180 === e ? (f = 90, n += k) : 270 === e && (f = 180, m -= h), Jo(b, m, n) === l - 1 && Ko(a, b, m, n, f, !1))); + a.Lk(c, d) + } + + W.prototype.findClosestSegment = function (a) { + var b = a.x; + a = a.y; + for (var c = this.l(0), d = this.l(1), e = Xa(b, a, c.x, c.y, d.x, d.y), f = 0, h = 1; h < this.ka - 1; h++) { + var c = this.l(h + 1), k = Xa(b, a, d.x, d.y, c.x, c.y), d = c; + k < e && (f = h, e = k) + } + return f + }; + W.prototype.invalidateGeometry = W.prototype.le = function () { + this.Pa = null; + this.R() + }; + u.u(W, {dd: "geometry"}, function () { + null === this.Pa && (this.updateRoute(), this.Pa = this.makeGeometry()); + return this.Pa + }); + W.prototype.Xs = function () { + if (null === this.Pa && !1 !== this.hg) { + this.Pa = this.makeGeometry(); + var a = this.path; + if (null !== a) { + a.Pa = this.Pa; + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d]; + e !== a && e.tg && e instanceof X && (e.Pa = this.Pa) + } + } + } + }; + W.prototype.makeGeometry = function () { + var a = this.ka; + if (2 > a) { + var b = new $c(ad), c = new bd(0, 0); + b.ub.add(c); + return b + } + var d = !1, b = this.g; + null !== b && 0 !== b.ha.Le && xo(this) && (d = !0); + var c = b = 0, e = this.l(0).copy(), f = e.copy(), b = this.Qc.n, h = this.computeCurve(); + if (h === kh && 3 <= a && !K.mb(this.gp, 0)) if (3 === a) var k = this.l(1), b = Math.min(e.x, k.x), + c = Math.min(e.y, k.y), k = this.l(2), b = Math.min(b, k.x), c = Math.min(c, k.y); else { + if (this.dc) for (k = 0; k < a; k++) c = b[k], f.x = Math.min(c.x, f.x), f.y = Math.min(c.y, f.y); else for (k = 3; k < a; k += 3) k + 3 >= a && + (k = a - 1), b = this.l(k), f.x = Math.min(b.x, f.x), f.y = Math.min(b.y, f.y); + b = f.x; + c = f.y + } else { + for (k = 0; k < a; k++) c = b[k], f.x = Math.min(c.x, f.x), f.y = Math.min(c.y, f.y); + b = f.x; + c = f.y + } + b -= this.Dy.x; + c -= this.Dy.y; + e.x -= b; + e.y -= c; + if (2 === a) { + var l = this.l(1).copy(); + l.x -= b; + l.y -= c; + 0 !== Go(this) && Lo(this, e, !0, f); + 0 !== Ho(this) && Lo(this, l, !1, f); + b = new $c(dd); + b.ua = e.x; + b.va = e.y; + b.F = l.x; + b.G = l.y + } else { + l = u.p(); + 0 !== Go(this) && Lo(this, e, !0, f); + M(l, e.x, e.y, !1, !1); + if (h === kh && 3 <= a && !K.mb(this.gp, 0)) if (3 === a) k = this.l(1), a = k.x - b, d = k.y - c, k = this.l(2).copy(), + k.x -= b, k.y -= c, 0 !== Ho(this) && Lo(this, k, !1, f), O(l, a, d, a, d, k.x, k.y); else if (this.dc) { + for (var f = new w(b, c), e = this.l(1).copy(), h = new w(b, c), a = new w(b, c), d = this.l(0), m = null, n = this.gp / 3, k = 1; k < this.ka - 1; k++) { + var m = this.l(k), p = d, q = m, r = this.l(Mo(this, m, k, !1)); + if (!K.mb(p.x, q.x) || !K.mb(q.x, r.x)) if (!K.mb(p.y, q.y) || !K.mb(q.y, r.y)) { + var s = n, t = h, v = a; + isNaN(s) && (s = this.gp / 3); + var x = p.x, p = p.y, B = q.x, q = q.y, y = r.x, r = r.y, C = s * No(x, p, B, q), + s = s * No(B, q, y, r); + K.mb(p, q) && K.mb(B, y) && (B > x ? r > q ? (t.x = B - C, t.y = q - C, v.x = B + s, v.y = q + s) : (t.x = + B - C, t.y = q + C, v.x = B + s, v.y = q - s) : r > q ? (t.x = B + C, t.y = q - C, v.x = B - s, v.y = q + s) : (t.x = B + C, t.y = q + C, v.x = B - s, v.y = q - s)); + K.mb(x, B) && K.mb(q, r) && (q > p ? (y > B ? (t.x = B - C, t.y = q - C, v.x = B + s) : (t.x = B + C, t.y = q - C, v.x = B - s), v.y = q + s) : (y > B ? (t.x = B - C, t.y = q + C, v.x = B + s) : (t.x = B + C, t.y = q + C, v.x = B - s), v.y = q - s)); + if (K.mb(x, B) && K.mb(B, y) || K.mb(p, q) && K.mb(q, r)) x = .5 * (x + y), p = .5 * (p + r), t.x = x, t.y = p, v.x = x, v.y = p; + 1 === k ? (e.x = .5 * (d.x + m.x), e.y = .5 * (d.y + m.y)) : 2 === k && K.mb(d.x, this.l(0).x) && K.mb(d.y, this.l(0).y) && (e.x = .5 * (d.x + m.x), e.y = .5 * (d.y + m.y)); + O(l, e.x - b, e.y - c, + h.x - b, h.y - c, m.x - b, m.y - c); + f.set(h); + e.set(a); + d = m + } + } + k = d.x; + d = d.y; + f = this.l(this.ka - 1); + k = .5 * (k + f.x); + d = .5 * (d + f.y); + O(l, a.x - b, a.y - c, k - b, d - c, f.x - b, f.y - c) + } else for (k = 3; k < a; k += 3) d = this.l(k - 2), k + 3 >= a && (k = a - 1), f = this.l(k - 1), e = this.l(k), k === a - 1 && 0 !== Ho(this) && (e = e.copy(), Lo(this, e, !1, K.Wj)), O(l, d.x - b, d.y - c, f.x - b, f.y - c, e.x - b, e.y - c); else { + f = u.K(); + f.assign(this.l(0)); + for (k = 1; k < a;) { + k = Mo(this, f, k, 1 < k); + t = this.l(k); + if (k >= a - 1) { + f !== t && (0 !== Ho(this) && (t = t.copy(), Lo(this, t, !1, K.Wj)), Oo(this, l, -b, -c, f, t, d)); + break + } + k = Mo(this, t, + k + 1, k < a - 3); + e = l; + h = -b; + m = -c; + n = f; + v = this.l(k); + x = f; + p = d; + K.D(n.y, t.y) && K.D(t.x, v.x) ? (s = this.computeCorner(), s = Math.min(s, Math.abs(t.x - n.x) / 2), s = B = Math.min(s, Math.abs(v.y - t.y) / 2), K.D(s, 0) ? (Oo(this, e, h, m, n, t, p), x.assign(t)) : (q = t.x, y = t.y, r = q, C = y, q = t.x > n.x ? t.x - s : t.x + s, C = v.y > t.y ? t.y + B : t.y - B, Oo(this, e, h, m, n, new w(q, y), p), td(e, t.x + h, t.y + m, r + h, C + m), x.m(r, C))) : K.D(n.x, t.x) && K.D(t.y, v.y) ? (s = this.computeCorner(), B = Math.min(s, Math.abs(t.y - n.y) / 2), B = s = Math.min(B, Math.abs(v.x - t.x) / 2), K.D(s, 0) ? (Oo(this, e, h, m, n, t, p), x.assign(t)) : + (q = t.x, C = y = t.y, y = t.y > n.y ? t.y - B : t.y + B, r = v.x > t.x ? t.x + s : t.x - s, Oo(this, e, h, m, n, new w(q, y), p), td(e, t.x + h, t.y + m, r + h, C + m), x.m(r, C))) : (Oo(this, e, h, m, n, t, p), x.assign(t)) + } + u.v(f) + } + b = l.o; + u.q(l) + } + return b + }; + + function No(a, b, c, d) { + a = c - a; + if (isNaN(a) || Infinity === a || -Infinity === a) return NaN; + 0 > a && (a = -a); + b = d - b; + if (isNaN(b) || Infinity === b || -Infinity === b) return NaN; + 0 > b && (b = -b); + return K.mb(a, 0) ? b : K.mb(b, 0) ? a : Math.sqrt(a * a + b * b) + } + + function Lo(a, b, c, d) { + var e = a.ka; + if (!(2 > e)) if (c) { + var f = a.l(1); + c = f.x - d.x; + d = f.y - d.y; + f = No(b.x, b.y, c, d); + 0 !== f && (e = 2 === e ? .5 * f : f, a = Go(a), a > e && (a = e), c = a * (c - b.x) / f, a = a * (d - b.y) / f, b.x += c, b.y += a) + } else f = a.l(e - 2), c = f.x - d.x, d = f.y - d.y, f = No(b.x, b.y, c, d), 0 !== f && (e = 2 === e ? .5 * f : f, a = Ho(a), a > e && (a = e), c = a * (b.x - c) / f, a = a * (b.y - d) / f, b.x -= c, b.y -= a) + } + + function Mo(a, b, c, d) { + for (var e = a.ka, f = b; K.mb(b.x, f.x) && K.mb(b.y, f.y);) { + if (c >= e) return e - 1; + f = a.l(c++) + } + if (!K.mb(b.x, f.x) && !K.mb(b.y, f.y)) return c - 1; + for (var h = f; K.mb(b.x, f.x) && K.mb(f.x, h.x) && (!d || (b.y >= f.y ? f.y >= h.y : f.y <= h.y)) || K.mb(b.y, f.y) && K.mb(f.y, h.y) && (!d || (b.x >= f.x ? f.x >= h.x : f.x <= h.x));) { + if (c >= e) return e - 1; + h = a.l(c++) + } + return c - 2 + } + + function Oo(a, b, c, d, e, f, h) { + if (!h && xo(a)) { + h = []; + var k = 0; + a.Ea() && (k = Po(a, e, f, h)); + var l = e.x, l = e.y; + if (0 < k) if (K.D(e.y, f.y)) if (e.x < f.x) for (var m = 0; m < k;) { + var n = Math.max(e.x, Math.min(h[m++] - 5, f.x - 10)); + b.lineTo(n + c, f.y + d); + for (var l = n + c, p = Math.min(n + 10, f.x); m < k;) { + var q = h[m]; + if (q < p + 10) m++, p = Math.min(q + 5, f.x); else break + } + q = (n + p) / 2 + c; + q = f.y - 10 + d; + n = p + c; + p = f.y + d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, l, q, n, q, n, p) + } else for (m = k - 1; 0 <= m;) { + n = Math.min(e.x, Math.max(h[m--] + 5, f.x + 10)); + b.lineTo(n + c, f.y + d); + l = n + c; + for (p = Math.max(n - 10, f.x); 0 <= + m;) if (q = h[m], q > p - 10) m--, p = Math.max(q - 5, f.x); else break; + q = f.y - 10 + d; + n = p + c; + p = f.y + d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, l, q, n, q, n, p) + } else if (K.D(e.x, f.x)) if (e.y < f.y) for (m = 0; m < k;) { + n = Math.max(e.y, Math.min(h[m++] - 5, f.y - 10)); + b.lineTo(f.x + c, n + d); + l = n + d; + for (p = Math.min(n + 10, f.y); m < k;) if (q = h[m], q < p + 10) m++, p = Math.min(q + 5, f.y); else break; + q = f.x - 10 + c; + n = f.x + c; + p += d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, q, l, q, p, n, p) + } else for (m = k - 1; 0 <= m;) { + n = Math.min(e.y, Math.max(h[m--] + 5, f.y + 10)); + b.lineTo(f.x + c, n + d); + l = n + d; + for (p = Math.max(n - 10, f.y); 0 <= + m;) if (q = h[m], q > p - 10) m--, p = Math.max(q - 5, f.y); else break; + q = f.x - 10 + c; + n = f.x + c; + p += d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, q, l, q, p, n, p) + } + } + b.lineTo(f.x + c, f.y + d) + } + + function Po(a, b, c, d) { + var e = a.g; + if (null === e || b.L(c)) return 0; + for (e = e.mw; e.next();) { + var f = e.value; + if (null !== f && f.visible) for (var f = f.Db.n, h = f.length, k = 0; k < h; k++) { + var l = f[k]; + if (l instanceof W) { + if (l === a) return 0 < d.length && d.sort(function (a, b) { + return a - b + }), d.length; + if (l.Ea() && xo(l)) { + var m = l.Mm; + m.J() && a.Mm.sg(m) && !a.usesSamePort(l) && (m = l.path, null !== m && m.kl() && Qo(b, c, d, l)) + } + } + } + } + 0 < d.length && d.sort(function (a, b) { + return a - b + }); + return d.length + } + + function Qo(a, b, c, d) { + for (var e = K.D(a.y, b.y), f = d.ka, h = d.l(0), k = u.K(), l = 1; l < f; l++) { + var m = d.l(l); + if (l < f - 1) { + var n = d.l(l + 1); + if (h.y === m.y && m.y === n.y) { + if (m.x > h.x && n.x > m.x || m.x < h.x && n.x < m.x) m = n, l++ + } else h.x === m.x && m.x === n.x && (m.y > h.y && n.y > m.y || m.y < h.y && n.y < m.y) && (m = n, l++) + } + a:{ + var n = k, p = a.x, q = a.y, r = b.x, s = b.y, t = h.x, h = h.y, v = m.x, x = m.y; + if (!K.D(p, r)) { + if (K.D(q, s) && K.D(t, v) && Math.min(p, r) < t && Math.max(p, r) > t && Math.min(h, x) < q && Math.max(h, x) > q && !K.D(h, x)) { + n.x = t; + n.y = q; + n = !0; + break a + } + } else if (!K.D(q, s) && K.D(h, x) && Math.min(q, + s) < h && Math.max(q, s) > h && Math.min(t, v) < p && Math.max(t, v) > p && !K.D(t, v)) { + n.x = p; + n.y = h; + n = !0; + break a + } + n.x = 0; + n.y = 0; + n = !1 + } + n && (e ? c.push(k.x) : c.push(k.y)); + h = m + } + u.v(k) + } + + u.u(W, {Bs: "firstPickIndex"}, function () { + return 2 >= this.ka ? 0 : this.dc || Ao(this) !== vb ? 1 : 0 + }); + u.u(W, {lw: "lastPickIndex"}, function () { + var a = this.ka; + return 0 === a ? 0 : 2 >= a ? a - 1 : this.dc || Bo(this) !== vb ? a - 2 : a - 1 + }); + + function xo(a) { + a = a.Ve; + return a === bh || a === ch + } + + function zo(a, b) { + if (b || xo(a)) { + var c = a.g; + null === c || c.El.contains(a) || null === a.py || c.El.add(a, a.py) + } + } + + function eh(a, b) { + var c = a.layer; + if (null !== c && c.visible && !c.Ac) { + var d = c.g; + if (null !== d) for (var e = !1, d = d.mw; d.next();) { + var f = d.value; + if (f.visible) if (f === c) for (var e = !0, h = !1, f = f.Db.n, k = f.length, l = 0; l < k; l++) { + var m = f[l]; + m instanceof W && (m === a ? h = !0 : h && Ro(a, m, b)) + } else if (e) for (f = f.Db.n, k = f.length, l = 0; l < k; l++) m = f[l], m instanceof W && Ro(a, m, b) + } + } + } + + function Ro(a, b, c) { + if (null !== b && null !== b.Pa && xo(b)) { + var d = b.Mm; + d.J() && (a.Mm.sg(d) || c.sg(d)) && (a.usesSamePort(b) || b.le()) + } + } + + W.prototype.usesSamePort = function (a) { + var b = this.ka, c = a.ka; + if (0 < b && 0 < c) { + var d = this.l(0), e = a.l(0); + if (d.De(e)) return !0; + b = this.l(b - 1); + a = a.l(c - 1); + if (b.De(a) || d.De(a) || b.De(e)) return !0 + } else if (this.W === a.W || this.ca === a.ca || this.W == a.ca || this.ca == a.W) return !0; + return !1 + }; + W.prototype.He = function (a) { + G.prototype.He.call(this, a); + if (null !== this.ue) for (var b = this.ue.i; b.next();) b.value.He(a) + }; + u.defineProperty(W, {es: "adjusting"}, function () { + return this.tp + }, function (a) { + var b = this.tp; + b !== a && (this.tp = a, this.h("adjusting", b, a)) + }); + u.defineProperty(W, {Yy: "corner"}, function () { + return this.Hp + }, function (a) { + var b = this.Hp; + b !== a && (this.Hp = a, this.le(), this.h("corner", b, a)) + }); + u.defineProperty(W, {Ve: "curve"}, function () { + return this.Kp + }, function (a) { + var b = this.Kp; + b !== a && (this.Kp = a, this.Vb(), zo(this, b === ch || b === bh || a === ch || a === bh), this.h("curve", b, a)) + }); + u.defineProperty(W, {Ov: "curviness"}, function () { + return this.Lp + }, function (a) { + var b = this.Lp; + b !== a && (this.Lp = a, this.Vb(), this.h("curviness", b, a)) + }); + u.defineProperty(W, {zw: "routing"}, function () { + return this.Yl + }, function (a) { + var b = this.Yl; + b !== a && (this.Yl = a, this.di = null, this.Vb(), zo(this, 2 === (b.value & 2) || 2 === (a.value & 2)), this.h("routing", b, a)) + }); + u.defineProperty(W, {gp: "smoothness"}, function () { + return this.Kr + }, function (a) { + var b = this.Kr; + b !== a && (this.Kr = a, this.le(), this.h("smoothness", b, a)) + }); + + function vo(a) { + var b = a.Wf; + if (null !== b) { + var c = a.gg; + if (null !== c) { + var d = a.wh, e = a.Ih; + a:{ + if (null !== c && null !== b.nh) for (a = b.nh.i; a.next();) { + var f = a.value; + if (f.Uo === b && f.at === c && f.uw === d && f.vw === e || f.Uo === c && f.at === b && f.uw === e && f.vw === d) { + a = f; + break a + } + } + a = null + } + for (var h = null, k = null, l = b.hc.n, m = l.length, f = 0; f < m; f++) { + var n = l[f]; + if (n.Wf === b && n.wh === d && n.gg === c && n.Ih === e || n.Wf === c && n.wh === e && n.gg === b && n.Ih === d) null === k ? k = n : (null === h && (h = new E(W), h.add(k)), h.add(n)) + } + if (null !== h) for (null === a && (a = new bo, a.Uo = b, a.uw = + d, a.at = c, a.vw = e, ao(b, a), ao(c, a)), a.links = h, b = h.n, f = 0; f < b.length; f++) if (n = b[f], 0 === n.hf) { + c = 1; + for (d = 0; d < b.length; d++) Math.abs(b[d].hf) === c && (c++, d = -1); + n.an = a; + n.hf = n.W === a.Uo ? c : -c; + c = n.g; + (null === c || c.lf) && n.Vb() + } + } + } + } + + function uo(a) { + var b = a.an; + if (null !== b) { + var c = a.hf; + a.an = null; + a.hf = 0; + b.links.remove(a); + if (2 > b.links.count) 1 === b.links.count && (c = b.links.n[0], c.an = null, c.hf = 0, c.Vb()), c = b.Uo, null !== b && null !== c.nh && c.nh.remove(b), c = b.at, null !== b && null !== c.nh && c.nh.remove(b); else for (c = Math.abs(c), a = 0 === c % 2, b = b.links.i; b.next();) { + var d = b.value, e = Math.abs(d.hf), f = 0 === e % 2; + e > c && a === f && (d.hf = 0 < d.hf ? d.hf - 2 : d.hf + 2, d.Vb()) + } + } + } + + function bo() { + u.gc(this); + this.links = this.vw = this.at = this.uw = this.Uo = null + } + + u.Xd(bo, {Uo: !0, uw: !0, at: !0, vw: !0, links: !0, spacing: !0}); + + function Mk() { + u.gc(this); + this.fA = this.group = null; + this.Ls = !0; + this.abort = !1; + this.bg = this.ag = 1; + this.Jq = this.Iq = -1; + this.he = this.ge = 8; + this.mc = null; + this.$E = !1; + this.KE = 22; + this.SD = 111 + } + + u.Xd(Mk, {group: !0, fA: !0, Ls: !0, abort: !0, $E: !0, KE: !0, SD: !0}); + Mk.prototype.initialize = function (a) { + if (!(0 >= a.width || 0 >= a.height)) { + var b = a.y, c = a.x + a.width, d = a.y + a.height; + this.ag = Math.floor((a.x - this.ge) / this.ge) * this.ge; + this.bg = Math.floor((b - this.he) / this.he) * this.he; + this.Iq = Math.ceil((c + 2 * this.ge) / this.ge) * this.ge; + this.Jq = Math.ceil((d + 2 * this.he) / this.he) * this.he; + a = 1 + (Math.ceil((this.Iq - this.ag) / this.ge) | 0); + b = 1 + (Math.ceil((this.Jq - this.bg) / this.he) | 0); + if (null === this.mc || this.ho < a - 1 || this.io < b - 1) { + c = []; + for (d = 0; d <= a; d++) { + for (var e = [], f = 0; f <= b; f++) e[f] = 0; + c[d] = e + } + this.mc = + c; + this.ho = a - 1; + this.io = b - 1 + } + if (null !== this.mc) for (a = 0; a <= this.ho; a++) for (b = 0; b <= this.io; b++) this.mc[a][b] = 999999 + } + }; + u.u(Mk, {kb: null}, function () { + return new z(this.ag, this.bg, this.Iq - this.ag, this.Jq - this.bg) + }); + u.defineProperty(Mk, {ro: null}, function () { + return this.ge + }, function (a) { + 0 < a && a !== this.ge && (this.ge = a, this.initialize(this.kb)) + }); + u.defineProperty(Mk, {po: null}, function () { + return this.he + }, function (a) { + 0 < a && a !== this.he && (this.he = a, this.initialize(this.kb)) + }); + + function So(a, b, c) { + return a.ag <= b && b <= a.Iq && a.bg <= c && c <= a.Jq + } + + function Jo(a, b, c) { + if (!So(a, b, c)) return 0; + b -= a.ag; + b /= a.ge; + c -= a.bg; + c /= a.he; + return a.mc[b | 0][c | 0] + } + + function Pk(a, b, c) { + So(a, b, c) && (b -= a.ag, b /= a.ge, c -= a.bg, c /= a.he, a.mc[b | 0][c | 0] = 0) + } + + function Ok(a) { + if (null !== a.mc) for (var b = 0; b <= a.ho; b++) for (var c = 0; c <= a.io; c++) 1 <= a.mc[b][c] && (a.mc[b][c] |= 999999) + } + + Mk.prototype.Jo = function (a, b, c, d) { + if (a > this.Iq || a + c < this.ag || b > this.Jq || b + d < this.bg) return !0; + a = (a - this.ag) / this.ge | 0; + b = (b - this.bg) / this.he | 0; + c = Math.max(0, c) / this.ge + 1 | 0; + var e = Math.max(0, d) / this.he + 1 | 0; + 0 > a && (c += a, a = 0); + 0 > b && (e += b, b = 0); + if (0 > c || 0 > e) return !0; + d = Math.min(a + c - 1, this.ho) | 0; + for (c = Math.min(b + e - 1, this.io) | 0; a <= d; a++) for (e = b; e <= c; e++) if (0 === this.mc[a][e]) return !1; + return !0 + }; + + function To(a, b, c, d, e, f, h, k, l) { + if (!(b < f || b > h || c < k || c > l)) { + var m, n; + m = b | 0; + n = c | 0; + var p = a.mc[m][n]; + if (1 <= p && 999999 > p) for (e ? n += d : m += d, p += 1; f <= m && m <= h && k <= n && n <= l && !(p >= a.mc[m][n]);) a.mc[m][n] = p, p += 1, e ? n += d : m += d; + m = e ? n : m; + if (e) if (0 < d) for (c += d; c < m; c += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, k, l); else for (c += d; c > m; c += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, k, l); else if (0 < d) for (b += d; b < m; b += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, k, l); else for (b += d; b > m; b += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, + k, l) + } + } + + function Uo(a, b, c, d, e, f, h, k, l, m, n) { + for (var p = b | 0, q = c | 0, r = a.mc[p][q]; 0 === r && p > k && p < l && q > m && q < n;) if (h ? q += f : p += f, r = a.mc[p][q], 1 >= Math.abs(p - d) && 1 >= Math.abs(q - e)) return a.abort = !0, 0; + p = b | 0; + q = c | 0; + r = a.mc[p][q]; + b = 1; + for (a.mc[p][q] = b; 0 === r && p > k && p < l && q > m && q < n;) h ? q += f : p += f, r = a.mc[p][q], a.mc[p][q] = b, b += 1; + return h ? q : p + } + + function Io(a, b, c, d, e, f) { + if (null !== a.mc) { + a.abort = !1; + var h = b.x, k = b.y; + if (So(a, h, k)) { + var h = h - a.ag, h = h / a.ge, k = k - a.bg, k = k / a.he, l = d.x, m = d.y; + if (So(a, l, m)) if (l -= a.ag, l /= a.ge, m -= a.bg, m /= a.he, 1 >= Math.abs(h - l) && 1 >= Math.abs(k - m)) a.abort = !0; else { + var n = f.x; + b = f.y; + d = f.x + f.width; + var p = f.y + f.height, n = n - a.ag, n = n / a.ge; + b -= a.bg; + b /= a.he; + d -= a.ag; + d /= a.ge; + p -= a.bg; + p /= a.he; + f = Math.max(0, Math.min(a.ho, n | 0)); + d = Math.min(a.ho, Math.max(0, d | 0)); + b = Math.max(0, Math.min(a.io, b | 0)); + var p = Math.min(a.io, Math.max(0, p | 0)), h = h | 0, k = k | 0, l = l | 0, + m = m | 0, n = h, q = k, r = 0 === c || 90 === c ? 1 : -1; + (c = 90 === c || 270 === c) ? q = Uo(a, h, k, l, m, r, c, f, d, b, p) : n = Uo(a, h, k, l, m, r, c, f, d, b, p); + if (!a.abort) { + a:{ + c = 0 === e || 90 === e ? 1 : -1; + e = 90 === e || 270 === e; + for (var r = l | 0, s = m | 0, t = a.mc[r][s]; 0 === t && r > f && r < d && s > b && s < p;) if (e ? s += c : r += c, t = a.mc[r][s], 1 >= Math.abs(r - h) && 1 >= Math.abs(s - k)) { + a.abort = !0; + break a + } + r = l | 0; + s = m | 0; + t = a.mc[r][s]; + for (a.mc[r][s] = 999999; 0 === t && r > f && r < d && s > b && s < p;) e ? s += c : r += c, t = a.mc[r][s], a.mc[r][s] = 999999 + } + a.abort || (To(a, n, q, 1, !1, f, d, b, p), To(a, n, q, -1, !1, f, d, b, p), To(a, n, q, 1, !0, f, d, + b, p), To(a, n, q, -1, !0, f, d, b, p)) + } + } + } + } + } + + function Eo() { + u.gc(this); + this.port = this.Cc = null; + this.wg = []; + this.To = !1 + } + + u.Xd(Eo, {Cc: !0, port: !0, wg: !0, To: !0}); + Eo.prototype.toString = function () { + for (var a = this.wg, b = this.Cc.toString() + " " + a.length.toString() + ":", c = 0; c < a.length; c++) { + var d = a[c]; + null !== d && (b += "\n " + d.toString()) + } + return b + }; + + function Vo(a, b, c, d) { + b = b.offsetY; + switch (b) { + case u.Nc: + return 90; + case u.Fc: + return 180; + case u.Xc: + return 270; + case u.Oc: + return 0 + } + switch (b) { + case u.Nc | u.Xc: + return 180 < c ? 270 : 90; + case u.Fc | u.Oc: + return 90 < c && 270 >= c ? 180 : 0 + } + a = 180 * Math.atan2(a.height, a.width) / Math.PI; + switch (b) { + case u.Fc | u.Xc: + return c > a && c <= 180 + a ? 180 : 270; + case u.Xc | u.Oc: + return c > 180 - a && c <= 360 - a ? 270 : 0; + case u.Oc | u.Nc: + return c > a && c <= 180 + a ? 90 : 0; + case u.Nc | u.Fc: + return c > 180 - a && c <= 360 - a ? 180 : 90; + case u.Fc | u.Xc | u.Oc: + return 90 < c && c <= 180 + a ? 180 : c > 180 + a && c <= 360 - + a ? 270 : 0; + case u.Xc | u.Oc | u.Nc: + return 180 < c && c <= 360 - a ? 270 : c > a && 180 >= c ? 90 : 0; + case u.Oc | u.Nc | u.Fc: + return c > a && c <= 180 - a ? 90 : c > 180 - a && 270 >= c ? 180 : 0; + case u.Nc | u.Fc | u.Xc: + return c > 180 - a && c <= 180 + a ? 180 : c > 180 + a ? 270 : 90 + } + d && b !== (u.Fc | u.Xc | u.Oc | u.Nc) && (c -= 15, 0 > c && (c += 360)); + return c > a && c < 180 - a ? 90 : c >= 180 - a && c <= 180 + a ? 180 : c > 180 + a && c < 360 - a ? 270 : 0 + } + + function Fo(a, b) { + var c = a.wg; + if (0 === c.length) { + a:if (!a.To) { + c = a.To; + a.To = !0; + var d, e = null, f = a.Cc, f = f instanceof V ? f : null; + if (null === f || f.be) d = a.Cc.qD(a.port.Jd); else { + if (!f.ba.J()) { + a.To = c; + break a + } + e = f; + d = e.pD() + } + var h = a.wg.length = 0, k = a.port.lb(xb, u.K()), l = a.port.lb(Vb, u.K()), f = u.Vj(k.x, k.y, 0, 0); + f.Oi(l); + u.v(k); + u.v(l); + k = u.fc(f.x + f.width / 2, f.y + f.height / 2); + for (d = d.i; d.next();) if (l = d.value, l.Ea()) { + var m = vb, n = l.od === a.port || l.W.Ph(e), m = n ? Ao(l, a.port) : Bo(l, a.port); + if (m.Go() && (n = n ? l.fe : l.od, null !== n)) { + var p = n.T; + if (null !== + p) { + var n = l.computeOtherPoint(p, n), p = k.Fi(n), m = Vo(f, m, p, l.dc), q = 0; + 0 === m ? (q = u.Oc, 180 < p && (p -= 360)) : q = 90 === m ? u.Nc : 180 === m ? u.Fc : u.Xc; + m = a.wg[h]; + void 0 === m ? (m = new Wo(l, p, q), a.wg[h] = m) : (m.link = l, m.angle = p, m.ee = q); + m.tw.set(n); + h++ + } + } + } + u.v(k); + a.wg.sort(Eo.prototype.GH); + e = a.wg.length; + k = -1; + for (h = d = 0; h < e; h++) m = a.wg[h], void 0 !== m && (m.ee !== k && (k = m.ee, d = 0), m.Do = d, d++); + k = -1; + d = 0; + for (h = e - 1; 0 <= h; h--) m = a.wg[h], void 0 !== m && (m.ee !== k && (k = m.ee, d = m.Do + 1), m.vm = d); + h = a.wg; + n = a.port; + e = a.Cc.NH; + k = u.K(); + d = u.K(); + l = u.K(); + m = u.K(); + n.lb(xb, + k); + n.lb(Gb, d); + n.lb(Vb, l); + n.lb(Kb, m); + var r = q = p = n = 0; + if (e === $n) for (var s = 0; s < h.length; s++) { + var t = h[s]; + if (null !== t) { + var v = t.link.computeThickness(); + switch (t.ee) { + case u.Nc: + q += v; + break; + case u.Fc: + r += v; + break; + case u.Xc: + n += v; + break; + default: + case u.Oc: + p += v + } + } + } + for (var x = 0, B = 0, y = 1, s = 0; s < h.length; s++) if (t = h[s], null !== t) { + var C, I; + if (x != t.ee) { + x = t.ee; + switch (x) { + case u.Nc: + C = l; + I = m; + break; + case u.Fc: + C = m; + I = k; + break; + case u.Xc: + C = k; + I = d; + break; + default: + case u.Oc: + C = d, I = l + } + var H = I.x - C.x; + I = I.y - C.y; + switch (x) { + case u.Nc: + q > Math.abs(H) ? (y = Math.abs(H) / + q, q = Math.abs(H)) : y = 1; + break; + case u.Fc: + r > Math.abs(I) ? (y = Math.abs(I) / r, r = Math.abs(I)) : y = 1; + break; + case u.Xc: + n > Math.abs(H) ? (y = Math.abs(H) / n, n = Math.abs(H)) : y = 1; + break; + default: + case u.Oc: + p > Math.abs(I) ? (y = Math.abs(I) / p, p = Math.abs(I)) : y = 1 + } + B = 0 + } + var T = t.Lo; + if (e === $n) { + v = t.link.computeThickness(); + v *= y; + T.set(C); + switch (x) { + case u.Nc: + T.x = C.x + H / 2 + q / 2 - B - v / 2; + break; + case u.Fc: + T.y = C.y + I / 2 + r / 2 - B - v / 2; + break; + case u.Xc: + T.x = C.x + H / 2 - n / 2 + B + v / 2; + break; + default: + case u.Oc: + T.y = C.y + I / 2 - p / 2 + B + v / 2 + } + B += v + } else v = .5, e === Xn && (v = (t.Do + 1) / (t.vm + 1)), + T.x = C.x + H * v, T.y = C.y + I * v + } + u.v(k); + u.v(d); + u.v(l); + u.v(m); + C = a.wg; + for (H = 0; H < C.length; H++) I = C[H], null !== I && (I.Sv = a.computeEndSegmentLength(I)); + a.To = c; + u.ic(f) + } + c = a.wg + } + for (f = 0; f < c.length; f++) if (C = c[f], null !== C && C.link === b) return C; + return null + } + + Eo.prototype.GH = function (a, b) { + return a === b ? 0 : null === a ? -1 : null === b ? 1 : a.ee < b.ee ? -1 : a.ee > b.ee ? 1 : a.angle < b.angle ? -1 : a.angle > b.angle ? 1 : 0 + }; + Eo.prototype.computeEndSegmentLength = function (a) { + var b = a.link, c = b.computeEndSegmentLength(this.Cc, this.port, vb, b.od === this.port), d = a.Do; + if (0 > d) return c; + var e = a.vm; + if (1 >= e || !b.dc) return c; + var b = a.tw, f = a.Lo; + if (a.ee === u.Fc || a.ee === u.Nc) d = e - 1 - d; + return ((a = a.ee === u.Fc || a.ee === u.Oc) ? b.y < f.y : b.x < f.x) ? c + 8 * d : (a ? b.y === f.y : b.x === f.x) ? c : c + 8 * (e - 1 - d) + }; + + function Wo(a, b, c) { + this.link = a; + this.angle = b; + this.ee = c; + this.tw = new w; + this.vm = this.Do = 0; + this.Lo = new w; + this.Sv = 0 + } + + u.Xd(Wo, {link: !0, angle: !0, ee: !0, tw: !0, Do: !0, vm: !0, Lo: !0, Sv: !0}); + Wo.prototype.toString = function () { + return this.link.toString() + " " + this.angle.toString() + " " + this.ee.toString() + ":" + this.Do.toString() + "/" + this.vm.toString() + " " + this.Lo.toString() + " " + this.Sv.toString() + " " + this.tw.toString() + }; + + function il() { + this.Ej = this.cj = uc; + this.Cj = this.aj = NaN; + this.Bj = this.$i = Yn; + this.Dj = this.bj = NaN + } + + il.prototype.copy = function () { + var a = new il; + a.cj = this.cj.Z(); + a.Ej = this.Ej.Z(); + a.aj = this.aj; + a.Cj = this.Cj; + a.$i = this.$i; + a.Bj = this.Bj; + a.bj = this.bj; + a.Dj = this.Dj; + return a + }; + + function V(a) { + 0 === arguments.length ? U.call(this, vh) : U.call(this, a); + this.Lq = new F(G); + this.Pn = new F(V); + this.Ak = this.Mq = this.Kq = null; + this.Yr = !1; + this.pq = !0; + this.Zr = !1; + this.Pb = this.Nr = null; + this.Dp = !1; + this.Ep = !0; + this.cq = this.Fp = !1; + this.Nd = new Je; + this.Nd.group = this; + this.jy = !1 + } + + u.Ga(V, U); + u.fa("Group", V); + V.prototype.cloneProtected = function (a) { + U.prototype.cloneProtected.call(this, a); + a.Kq = this.Kq; + a.Mq = this.Mq; + a.Ak = this.Ak; + a.Yr = this.Yr; + a.pq = this.pq; + a.Zr = this.Zr; + a.Nr = this.Nr; + var b = a.vs(function (a) { + return a instanceof ph + }); + a.Pb = b instanceof ph ? b : null; + a.Dp = this.Dp; + a.Ep = this.Ep; + a.Fp = this.Fp; + a.cq = this.cq; + null !== this.Nd ? (a.Nd = this.Nd.copy(), a.Nd.group = a) : (null !== a.Nd && (a.Nd.group = null), a.Nd = null) + }; + V.prototype.Mh = function (a) { + U.prototype.Mh.call(this, a); + var b = a.yo(); + for (a = a.Mc; a.next();) { + var c = a.value; + c.R(); + c.H(8); + c.ls(); + if (c instanceof U) c.sf(b); else if (c instanceof W) for (c = c.ug; c.next();) c.value.sf(b) + } + }; + V.prototype.Lm = function (a, b, c, d, e, f, h) { + if (a === be && "elements" === b) if (e instanceof ph) { + var k = e; + null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of a Group.") + } else e instanceof A && (k = e.vs(function (a) { + return a instanceof ph + }), k instanceof ph && (null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of a Group."))); else a === ce && "elements" === b && null !== this.Pb && (d === this.Pb ? this.Pb = null : d instanceof A && this.Pb.gl(d) && + (this.Pb = null)); + U.prototype.Lm.call(this, a, b, c, d, e, f, h) + }; + V.prototype.xi = function (a, b, c, d) { + this.zk = this.Pb; + A.prototype.xi.call(this, a, b, c, d) + }; + V.prototype.hl = function () { + if (!U.prototype.hl.call(this)) return !1; + for (var a = this.Mc; a.next();) { + var b = a.value; + if (b instanceof U) { + if (b.Ea() && Bj(b)) return !1 + } else if (b instanceof W && b.Ea() && Bj(b) && b.W !== this && b.ca !== this) return !1 + } + return !0 + }; + u.u(V, {placeholder: "placeholder"}, function () { + return this.Pb + }); + u.defineProperty(V, {aD: "computesBoundsAfterDrag"}, function () { + return this.Dp + }, function (a) { + var b = this.Dp; + b !== a && (u.j(a, "boolean", V, "computesBoundsAfterDrag"), this.Dp = a, this.h("computesBoundsAfterDrag", b, a)) + }); + u.defineProperty(V, {bG: "computesBoundsIncludingLinks"}, function () { + return this.Ep + }, function (a) { + u.j(a, "boolean", V, "computesBoundsIncludingLinks"); + var b = this.Ep; + b !== a && (this.Ep = a, this.h("computesBoundsIncludingLinks", b, a)) + }); + u.defineProperty(V, {cG: "computesBoundsIncludingLocation"}, function () { + return this.Fp + }, function (a) { + u.j(a, "boolean", V, "computesBoundsIncludingLocation"); + var b = this.Fp; + b !== a && (this.Fp = a, this.h("computesBoundsIncludingLocation", b, a)) + }); + u.defineProperty(V, {OG: "handlesDragDropForMembers"}, function () { + return this.cq + }, function (a) { + u.j(a, "boolean", V, "handlesDragDropForMembers"); + var b = this.cq; + b !== a && (this.cq = a, this.h("handlesDragDropForMembers", b, a)) + }); + u.u(V, {Mc: "memberParts"}, function () { + return this.Lq.i + }); + + function Tn(a, b) { + if (a.Lq.add(b)) { + b instanceof V && a.Pn.add(b); + var c = a.xH; + if (null !== c) { + var d = !0, e = a.g; + null !== e && (d = e.Na, e.Na = !0); + c(a, b); + null !== e && (e.Na = d) + } + a.Ea() && a.be || b.He(!1) + } + c = a.Pb; + null === c && (c = a); + c.R() + } + + function Sn(a, b) { + if (a.Lq.remove(b)) { + b instanceof V && a.Pn.remove(b); + var c = a.yH; + if (null !== c) { + var d = !0, e = a.g; + null !== e && (d = e.Na, e.Na = !0); + c(a, b); + null !== e && (e.Na = d) + } + a.Ea() && a.be || b.He(!0) + } + c = a.Pb; + null === c && (c = a); + c.R() + } + + V.prototype.xm = function () { + if (0 < this.Lq.count) { + var a = this.g; + if (null === a) return; + for (var b = this.Lq.copy().i; b.next();) a.remove(b.value) + } + U.prototype.xm.call(this) + }; + V.prototype.Jw = function () { + var a = this.layer; + null !== a && a.Jw(this) + }; + u.defineProperty(V, {Qb: "layout"}, function () { + return this.Nd + }, function (a) { + var b = this.Nd; + b !== a && (null !== a && u.C(a, Je, V, "layout"), null !== b && (b.g = null, b.group = null), this.Nd = a, null !== a && (a.g = this.g, a.group = this), this.h("layout", b, a)) + }); + u.defineProperty(V, {xH: "memberAdded"}, function () { + return this.Kq + }, function (a) { + var b = this.Kq; + b !== a && (null !== a && u.j(a, "function", V, "memberAdded"), this.Kq = a, this.h("memberAdded", b, a)) + }); + u.defineProperty(V, {yH: "memberRemoved"}, function () { + return this.Mq + }, function (a) { + var b = this.Mq; + b !== a && (null !== a && u.j(a, "function", V, "memberRemoved"), this.Mq = a, this.h("memberRemoved", b, a)) + }); + u.defineProperty(V, {Bz: "memberValidation"}, function () { + return this.Ak + }, function (a) { + var b = this.Ak; + b !== a && (null !== a && u.j(a, "function", V, "memberValidation"), this.Ak = a, this.h("memberValidation", b, a)) + }); + V.prototype.canAddMembers = function (a) { + var b = this.g; + if (null === b) return !1; + b = b.Eb; + for (a = wf(a).i; a.next();) if (!b.isValidMember(this, a.value)) return !1; + return !0 + }; + V.prototype.addMembers = function (a, b) { + var c = this.g; + if (null === c) return !1; + for (var c = c.Eb, d = !0, e = wf(a).i; e.next();) { + var f = e.value; + !b || c.isValidMember(this, f) ? f.Ra = this : d = !1 + } + return d + }; + u.defineProperty(V, {BI: "ungroupable"}, function () { + return this.Yr + }, function (a) { + var b = this.Yr; + b !== a && (u.j(a, "boolean", V, "ungroupable"), this.Yr = a, this.h("ungroupable", b, a)) + }); + V.prototype.canUngroup = function () { + if (!this.BI) return !1; + var a = this.layer; + if (null !== a && !a.Fv) return !1; + a = a.g; + return null === a || a.Fv ? !0 : !1 + }; + V.prototype.invalidateConnectedLinks = V.prototype.sf = function (a) { + void 0 === a && (a = null); + U.prototype.sf.call(this, a); + for (var b = this.pD(); b.next();) { + var c = b.value; + if (null === a || !a.contains(c)) { + var d = c.W; + null !== d && d.Ph(this) && !d.Ea() ? c.Vb() : (d = c.ca, null !== d && d.Ph(this) && !d.Ea() && c.Vb()) + } + } + }; + V.prototype.findExternalLinksConnected = V.prototype.pD = function () { + var a = this.yo(); + a.add(this); + for (var b = new F(W), c = a.i; c.next();) { + var d = c.value; + if (d instanceof U) for (d = d.oe; d.next();) { + var e = d.value; + a.contains(e) || b.add(e) + } + } + return b.i + }; + V.prototype.findExternalNodesConnected = function () { + var a = this.yo(); + a.add(this); + for (var b = new F(U), c = a.i; c.next();) { + var d = c.value; + if (d instanceof U) for (d = d.oe; d.next();) { + var e = d.value, f = e.W; + a.contains(f) && f !== this || b.add(f); + e = e.ca; + a.contains(e) && e !== this || b.add(e) + } + } + return b.i + }; + V.prototype.findSubGraphParts = V.prototype.yo = function () { + var a = new F(G); + kf(a, this, !0, 0, !0); + a.remove(this); + return a + }; + V.prototype.He = function (a) { + U.prototype.He.call(this, a); + for (var b = this.Mc; b.next();) b.value.He(a) + }; + V.prototype.collapseSubGraph = V.prototype.collapseSubGraph = function () { + var a = this.g; + if (null !== a && !a.me) { + a.me = !0; + var b = this.yo(); + Xo(this, b); + a.me = !1 + } + }; + + function Xo(a, b) { + for (var c = a.Mc; c.next();) { + var d = c.value; + d.He(!1); + if (d instanceof V) { + var e = d; + e.be && (e.oA = e.be, Xo(e, b)) + } + if (d instanceof U) d.sf(b); else if (d instanceof W) for (d = d.ug; d.next();) d.value.sf(b) + } + a.be = !1 + } + + V.prototype.expandSubGraph = V.prototype.expandSubGraph = function () { + var a = this.g; + if (null !== a && !a.me) { + var b = a.Lb; + 0 !== a.ha.Le && b.ml(); + a.me = !0; + var c = this.yo(); + Yo(this, c, b, this); + a.me = !1 + } + }; + + function Yo(a, b, c, d) { + for (var e = a.Mc; e.next();) { + var f = e.value; + f.He(!0); + if (f instanceof V) { + var h = f; + h.oA && (h.oA = !1, Yo(h, b, c, d)) + } + if (f instanceof U) f.sf(b), ri(c, f, d); else if (f instanceof W) for (f = f.ug; f.next();) f.value.sf(b) + } + a.be = !0 + } + + u.defineProperty(V, {be: "isSubGraphExpanded"}, function () { + return this.pq + }, function (a) { + var b = this.pq; + if (b !== a) { + u.j(a, "boolean", V, "isSubGraphExpanded"); + this.pq = a; + var c = this.g; + this.h("isSubGraphExpanded", b, a); + b = this.sI; + if (null !== b) { + var d = !0; + null !== c && (d = c.Na, c.Na = !0); + b(this); + null !== c && (c.Na = d) + } + null !== c && c.ha.gb || (a ? this.expandSubGraph() : this.collapseSubGraph()) + } + }); + u.defineProperty(V, {oA: "wasSubGraphExpanded"}, function () { + return this.Zr + }, function (a) { + var b = this.Zr; + b !== a && (u.j(a, "boolean", V, "wasSubGraphExpanded"), this.Zr = a, this.h("wasSubGraphExpanded", b, a)) + }); + u.defineProperty(V, {sI: "subGraphExpandedChanged"}, function () { + return this.Nr + }, function (a) { + var b = this.Nr; + b !== a && (null !== a && u.j(a, "function", V, "subGraphExpandedChanged"), this.Nr = a, this.h("subGraphExpandedChanged", b, a)) + }); + V.prototype.move = V.prototype.move = function (a) { + var b = this.position, c = b.x; + isNaN(c) && (c = 0); + b = b.y; + isNaN(b) && (b = 0); + var c = a.x - c, b = a.y - b, d = u.fc(c, b); + U.prototype.move.call(this, a); + for (a = this.yo().i; a.next();) { + var e = a.value; + if (!(e instanceof W || e instanceof U && e.tf)) { + var f = e.position, h = e.location; + f.J() ? (d.x = f.x + c, d.y = f.y + b, e.position = d) : h.J() && (d.x = h.x + c, d.y = h.y + b, e.location = d) + } + } + for (a.reset(); a.next();) e = a.value, e instanceof W && (f = e.position, d.x = f.x + c, d.y = f.y + b, e.move(d)); + u.v(d) + }; + + function ph() { + S.call(this); + this.Pe = K.np; + this.yr = new z(NaN, NaN, NaN, NaN) + } + + u.Ga(ph, S); + u.fa("Placeholder", ph); + ph.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.Pe = this.Pe.Z(); + a.yr = this.yr.copy() + }; + ph.prototype.Jj = function (a) { + if (null === this.background && null === this.nm) return !1; + var b = this.Ha; + return qb(0, 0, b.width, b.height, a.x, a.y) + }; + ph.prototype.Oo = function () { + var a = this.T; + null !== a && (a instanceof V || a instanceof lf) || u.k("Placeholder is not inside a Group or Adornment."); + if (a instanceof V) { + var b = this.computeBorder(this.yr), c = this.Hc; + bb(c, b.width || 0, b.height || 0); + ml(this, 0, 0, c.width, c.height); + for (var c = a.Mc, d = !1; c.next();) if (c.value.Ea()) { + d = !0; + break + } + !d || isNaN(b.x) || isNaN(b.y) || (c = new w, c.pt(b, a.Ze), a.location = new w(c.x, c.y)) + } else { + var b = this.xa, c = this.Hc, d = this.padding, e = d.left + d.right, f = d.top + d.bottom; + if (b.J()) bb(c, b.width + e || 0, + b.height + f || 0), ml(this, -d.left, -d.top, c.width, c.height); else { + var h = a.vc, k = h.lb(xb, u.K()), b = u.Vj(k.x, k.y, 0, 0); + b.Oi(h.lb(Vb, k)); + b.Oi(h.lb(Gb, k)); + b.Oi(h.lb(Kb, k)); + a.Mg.m(b.x, b.y); + bb(c, b.width + e || 0, b.height + f || 0); + ml(this, -d.left, -d.top, c.width, c.height); + u.v(k); + u.ic(b) + } + } + }; + ph.prototype.xi = function (a, b, c, d) { + var e = this.ba; + e.x = a; + e.y = b; + e.width = c; + e.height = d + }; + ph.prototype.computeBorder = function (a) { + var b = this.T; + if (b instanceof V) { + var c = b; + if (c.aD && this.yr.J()) { + var d = c.g; + if (null !== d && (d = d.Va, d instanceof uf && !d.Rp && null !== d.cc && !d.cc.contains(c))) return a.assign(this.yr), a + } + } + var c = u.Sf(), d = this.computeMemberBounds(c), e = this.padding; + a.m(d.x - e.left, d.y - e.top, d.width + e.left + e.right, d.height + e.top + e.bottom); + u.ic(c); + b instanceof V && (c = b, c.cG && c.location.J() && a.Oi(c.location)); + return a + }; + ph.prototype.computeMemberBounds = function (a) { + if (!(this.T instanceof V)) return a.m(0, 0, 0, 0), a; + for (var b = this.T, c = Infinity, d = Infinity, e = -Infinity, f = -Infinity, h = b.Mc; h.next();) { + var k = h.value; + if (k.Ea()) { + if (k instanceof W) { + var l = k; + if (!b.bG) continue; + if (Aj(l)) continue; + if (l.W === b || l.ca === b) continue + } + k = k.ba; + k.left < c && (c = k.left); + k.top < d && (d = k.top); + k.right > e && (e = k.right); + k.bottom > f && (f = k.bottom) + } + } + isFinite(c) && isFinite(d) ? a.m(c, d, e - c, f - d) : (b = b.location, c = this.padding, a.m(b.x + c.left, b.y + c.top, 0, 0)); + return a + }; + u.defineProperty(ph, {padding: "padding"}, function () { + return this.Pe + }, function (a) { + "number" === typeof a ? ((isNaN(a) || 0 > a) && u.wa(a, ">= 0", ph, "padding"), a = new rb(a)) : (u.C(a, rb, ph, "padding"), (isNaN(a.left) || 0 > a.left) && u.wa(a.left, ">= 0", ph, "padding:value.left"), (isNaN(a.right) || 0 > a.right) && u.wa(a.right, ">= 0", ph, "padding:value.right"), (isNaN(a.top) || 0 > a.top) && u.wa(a.top, ">= 0", ph, "padding:value.top"), (isNaN(a.bottom) || 0 > a.bottom) && u.wa(a.bottom, ">= 0", ph, "padding:value.bottom")); + var b = this.Pe; + b.L(a) || (this.Pe = + a = a.Z(), this.h("padding", b, a)) + }); + + function Je() { + 0 < arguments.length && u.Wc(Je); + u.gc(this); + this.Px = this.Y = null; + this.jq = this.lq = !0; + this.tq = !1; + this.wp = (new w(0, 0)).freeze(); + this.mq = this.oq = !0; + this.YA = ""; + this.Gn = !1; + this.ky = null + } + + u.fa("Layout", Je); + Je.prototype.cloneProtected = function (a) { + a.lq = this.lq; + a.jq = this.jq; + a.tq = this.tq; + a.wp.assign(this.wp); + a.oq = this.oq; + a.mq = this.mq; + a.YA = this.YA; + this.jq || (a.Gn = !0) + }; + Je.prototype.copy = function () { + var a = new this.constructor; + this.cloneProtected(a); + return a + }; + Je.prototype.toString = function () { + var a = u.rg(Object.getPrototypeOf(this)), a = a + "("; + null !== this.group && (a += " in " + this.group); + null !== this.g && (a += " for " + this.g); + return a + ")" + }; + u.defineProperty(Je, {g: "diagram"}, function () { + return this.Y + }, function (a) { + null !== a && u.C(a, D, Je, "diagram"); + this.Y = a + }); + u.defineProperty(Je, {group: "group"}, function () { + return this.Px + }, function (a) { + this.Px !== a && (null !== a && u.C(a, V, Je, "group"), this.Px = a, null !== a && (this.Y = a.g)) + }); + u.defineProperty(Je, {gH: "isOngoing"}, function () { + return this.lq + }, function (a) { + this.lq !== a && (u.j(a, "boolean", Je, "isOngoing"), this.lq = a) + }); + u.defineProperty(Je, {dH: "isInitial"}, function () { + return this.jq + }, function (a) { + u.j(a, "boolean", Je, "isInitial"); + this.jq = a; + a || (this.Gn = !0) + }); + u.defineProperty(Je, {jw: "isViewportSized"}, function () { + return this.tq + }, function (a) { + this.tq !== a && (u.j(a, "boolean", Je, "isViewportSized"), (this.tq = a) && this.H()) + }); + u.defineProperty(Je, {Qs: "isRouting"}, function () { + return this.oq + }, function (a) { + this.oq !== a && (u.j(a, "boolean", Je, "isRouting"), this.oq = a) + }); + u.defineProperty(Je, {PD: "isRealtime"}, function () { + return this.mq + }, function (a) { + this.mq !== a && (u.j(a, "boolean", Je, "isRealtime"), this.mq = a) + }); + u.defineProperty(Je, {vf: "isValidLayout"}, function () { + return this.Gn + }, function (a) { + this.Gn !== a && (u.j(a, "boolean", Je, "isValidLayout"), this.Gn = a, a || (a = this.g, null !== a && (a.Ot = !0))) + }); + Je.prototype.invalidateLayout = Je.prototype.H = function () { + if (this.Gn) { + var a = this.g; + if (null !== a && !a.ha.gb) { + var b = a.Lb; + !b.Fn && (b.Vg && b.Mi(), this.gH && a.lf || this.dH && !a.lf) && (this.vf = !1, a.de()) + } + } + }; + u.defineProperty(Je, {network: "network"}, function () { + return this.ky + }, function (a) { + var b = this.ky; + b !== a && (null !== a && u.C(a, xa, Je, "network"), null !== b && (b.Qb = null), this.ky = a, null !== a && (a.Qb = this)) + }); + Je.prototype.createNetwork = function () { + return new xa + }; + Je.prototype.makeNetwork = function (a) { + var b = this.createNetwork(); + b.Qb = this; + a instanceof D ? (b.Gj(a.yg, !0), b.Gj(a.links, !0)) : a instanceof V ? b.Gj(a.Mc) : b.Gj(a.i); + return b + }; + Je.prototype.updateParts = function () { + var a = this.g; + if (null === a && null !== this.network) for (var b = this.network.vertexes.i; b.next();) { + var c = b.value.Cc; + if (null !== c && (a = c.g, null !== a)) break + } + this.vf = !0; + try { + null !== a && a.Wb("Layout"), this.commitLayout() + } finally { + null !== a && a.Wd("Layout") + } + }; + Je.prototype.commitLayout = function () { + for (var a = this.network.vertexes.i; a.next();) a.value.commit(); + if (this.Qs) for (a = this.network.edges.i; a.next();) a.value.commit() + }; + Je.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + var b = new F(G); + a instanceof D ? (Zo(this, b, a.yg, !0, this.Gz, !0, !1, !0), Zo(this, b, a.Sj, !0, this.Gz, !0, !1, !0)) : a instanceof V ? Zo(this, b, a.Mc, !1, this.Gz, !0, !1, !0) : b.Td(a.i); + var c = b.count; + if (0 < c) { + a = this.g; + null !== a && a.Wb("Layout"); + for (var c = Math.ceil(Math.sqrt(c)), d = this.Ud.x, e = d, f = this.Ud.y, h = 0, k = 0, b = b.i; b.next();) { + var l = b.value; + l.pf(); + var m = l.Ba, n = m.width, + m = m.height; + l.moveTo(e, f); + l.jy = !1; + e += Math.max(n, 50) + 20; + k = Math.max(k, Math.max(m, 50)); + h >= c - 1 ? (h = 0, e = d, f += k + 20, k = 0) : h++ + } + null !== a && a.Wd("Layout") + } + this.vf = !0 + }; + Je.prototype.Gz = function (a) { + return !a.location.J() || a instanceof V && a.jy ? !0 : !1 + }; + + function Zo(a, b, c, d, e, f, h, k) { + for (c = c.i; c.next();) { + var l = c.value; + d && !l.Ho || null !== e && !e(l) || !l.canLayout() || (f && l instanceof U ? l.tf || (l instanceof V ? null === l.Qb ? Zo(a, b, l.Mc, !1, e, f, h, k) : b.add(l) : b.add(l)) : h && l instanceof W ? b.add(l) : !k || !l.Fd() || l instanceof U || b.add(l)) + } + } + + Je.prototype.collectParts = function (a) { + var b = new F(G); + a instanceof D ? (Zo(this, b, a.yg, !0, null, !0, !0, !0), Zo(this, b, a.links, !0, null, !0, !0, !0), Zo(this, b, a.Sj, !0, null, !0, !0, !0)) : a instanceof V ? Zo(this, b, a.Mc, !1, null, !0, !0, !0) : Zo(this, b, a.i, !1, null, !0, !0, !0); + return b + }; + u.defineProperty(Je, {Ud: "arrangementOrigin"}, function () { + return this.wp + }, function (a) { + u.C(a, w, Je, "arrangementOrigin"); + this.wp.L(a) || (this.wp.assign(a), this.H()) + }); + Je.prototype.initialOrigin = function (a) { + var b = this.group; + if (null !== b) { + var c = b.position.copy(); + (isNaN(c.x) || isNaN(c.y)) && c.set(a); + b = b.placeholder; + null !== b && (c = b.lb(xb), (isNaN(c.x) || isNaN(c.y)) && c.set(a), c.x += b.padding.left, c.y += b.padding.top); + return c + } + return a + }; + + function xa() { + u.gc(this); + this.Nd = null; + this.clear() + } + + u.fa("LayoutNetwork", xa); + xa.prototype.clear = function () { + if (this.vertexes) for (var a = this.vertexes.i; a.next();) { + var b = a.value; + b.clear(); + b.network = null + } + if (this.edges) for (a = this.edges.i; a.next();) b = a.value, b.clear(), b.network = null; + this.vertexes = new F(ya); + this.edges = new F(Aa); + this.Kz = new la(U, ya); + this.yz = new la(W, Aa) + }; + xa.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = "LayoutNetwork" + (null !== this.Qb ? "(" + this.Qb.toString() + ")" : ""); + if (0 >= a) return b; + b += " vertexes: " + this.vertexes.count + " edges: " + this.edges.count; + if (1 < a) { + for (var c = this.vertexes.i; c.next();) b += "\n " + c.value.toString(a - 1); + for (c = this.edges.i; c.next();) b += "\n " + c.value.toString(a - 1) + } + return b + }; + u.defineProperty(xa, {Qb: "layout"}, function () { + return this.Nd + }, function (a) { + this.Nd = a + }); + xa.prototype.createVertex = function () { + return new ya + }; + xa.prototype.createEdge = function () { + return new Aa + }; + xa.prototype.addParts = xa.prototype.Gj = function (a, b, c) { + if (null !== a) { + void 0 === b && (b = !1); + u.j(b, "boolean", xa, "addParts:toplevelonly"); + void 0 === c && (c = null); + null === c && (c = function (a) { + if (a instanceof U) return !a.tf; + if (a instanceof W) { + var b = a.W; + if (null === b || b.tf) return !1; + a = a.ca; + return null === a || a.tf ? !1 : !0 + } + return !1 + }); + for (a = a.i; a.next();) { + var d = a.value; + if (d instanceof U && (!b || d.Ho) && d.canLayout() && c(d)) if (d instanceof V && null === d.Qb) this.Gj(d.Mc, !1); else if (null === this.Am(d)) { + var e = this.createVertex(); + e.Cc = d; + this.Mk(e) + } + } + for (a.reset(); a.next();) if (d = a.value, d instanceof W && (!b || d.Ho) && d.canLayout() && c(d) && null === this.Uv(d)) { + var f = d.W, e = d.ca; + null !== f && null !== e && f !== e && (f = this.findGroupVertex(f), e = this.findGroupVertex(e), null !== f && null !== e && this.No(f, e, d)) + } + } + }; + xa.prototype.findGroupVertex = function (a) { + if (null === a) return null; + var b = a.findVisibleNode(); + if (null === b) return null; + a = this.Am(b); + if (null !== a) return a; + for (b = b.Ra; null !== b;) { + a = this.Am(b); + if (null !== a) return a; + b = b.Ra + } + return null + }; + xa.prototype.addVertex = xa.prototype.Mk = function (a) { + if (null !== a) { + this.vertexes.add(a); + var b = a.Cc; + null !== b && this.Kz.add(b, a); + a.network = this + } + }; + xa.prototype.addNode = xa.prototype.ds = function (a) { + if (null === a) return null; + var b = this.Am(a); + null === b && (b = this.createVertex(), b.Cc = a, this.Mk(b)); + return b + }; + xa.prototype.deleteVertex = xa.prototype.lD = function (a) { + if (null !== a && $o(this, a)) { + for (var b = a.Ie, c = b.count - 1; 0 <= c; c--) { + var d = b.ja(c); + this.vo(d) + } + b = a.Ce; + for (c = b.count - 1; 0 <= c; c--) d = b.ja(c), this.vo(d) + } + }; + + function $o(a, b) { + if (null === b) return !1; + var c = a.vertexes.remove(b); + c && (a.Kz.remove(b.Cc), b.network = null); + return c + } + + xa.prototype.deleteNode = function (a) { + null !== a && (a = this.Am(a), null !== a && this.lD(a)) + }; + xa.prototype.findVertex = xa.prototype.Am = function (a) { + return null === a ? null : this.Kz.ta(a) + }; + xa.prototype.addEdge = xa.prototype.ko = function (a) { + if (null !== a) { + this.edges.add(a); + var b = a.link; + null !== b && null === this.Uv(b) && this.yz.add(b, a); + b = a.toVertex; + null !== b && b.LC(a); + b = a.fromVertex; + null !== b && b.KC(a); + a.network = this + } + }; + xa.prototype.addLink = function (a) { + if (null === a) return null; + var b = a.W, c = a.ca, d = this.Uv(a); + null === d ? (d = this.createEdge(), d.link = a, null !== b && (d.fromVertex = this.ds(b)), null !== c && (d.toVertex = this.ds(c)), this.ko(d)) : (d.fromVertex = null !== b ? this.ds(b) : null, d.toVertex = null !== c ? this.ds(c) : null); + return d + }; + xa.prototype.deleteEdge = xa.prototype.vo = function (a) { + if (null !== a) { + var b = a.toVertex; + null !== b && b.kD(a); + b = a.fromVertex; + null !== b && b.jD(a); + ap(this, a) + } + }; + + function ap(a, b) { + null !== b && a.edges.remove(b) && (a.yz.remove(b.link), b.network = null) + } + + xa.prototype.deleteLink = function (a) { + null !== a && (a = this.Uv(a), null !== a && this.vo(a)) + }; + xa.prototype.findEdge = xa.prototype.Uv = function (a) { + return null === a ? null : this.yz.ta(a) + }; + xa.prototype.linkVertexes = xa.prototype.No = function (a, b, c) { + if (null === a || null === b) return null; + if (a.network === this && b.network === this) { + var d = this.createEdge(); + d.link = c; + d.fromVertex = a; + d.toVertex = b; + this.ko(d); + return d + } + return null + }; + xa.prototype.reverseEdge = xa.prototype.yw = function (a) { + if (null !== a) { + var b = a.fromVertex, c = a.toVertex; + null !== b && null !== c && (b.jD(a), c.kD(a), a.yw(), b.LC(a), c.KC(a)) + } + }; + xa.prototype.deleteSelfEdges = xa.prototype.Qv = function () { + for (var a = u.eb(), b = this.edges.i; b.next();) { + var c = b.value; + c.fromVertex === c.toVertex && a.push(c) + } + b = a.length; + for (c = 0; c < b; c++) this.vo(a[c]); + u.ra(a) + }; + xa.prototype.deleteArtificialVertexes = function () { + for (var a = u.eb(), b = this.vertexes.i; b.next();) { + var c = b.value; + null === c.Cc && a.push(c) + } + c = a.length; + for (b = 0; b < c; b++) this.lD(a[b]); + c = u.eb(); + for (b = this.edges.i; b.next();) { + var d = b.value; + null === d.link && c.push(d) + } + d = c.length; + for (b = 0; b < d; b++) this.vo(c[b]); + u.ra(a); + u.ra(c) + }; + + function bp(a) { + for (var b = u.eb(), c = a.edges.i; c.next();) { + var d = c.value; + null !== d.fromVertex && null !== d.toVertex || b.push(d) + } + c = b.length; + for (d = 0; d < c; d++) a.vo(b[d]); + u.ra(b) + } + + xa.prototype.splitIntoSubNetworks = xa.prototype.oI = function () { + this.deleteArtificialVertexes(); + bp(this); + this.Qv(); + for (var a = new E(xa), b = !0; b;) for (var b = !1, c = this.vertexes.i; c.next();) { + var d = c.value; + if (0 < d.Ie.count || 0 < d.Ce.count) { + b = this.Qb.createNetwork(); + a.add(b); + cp(this, b, d); + b = !0; + break + } + } + a.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.vertexes.count - a.vertexes.count + }); + return a + }; + + function cp(a, b, c) { + if (null !== c && c.network !== b) { + $o(a, c); + b.Mk(c); + for (var d = c.kc; d.next();) { + var e = d.value; + e.network !== b && (ap(a, e), b.ko(e), cp(a, b, e.fromVertex)) + } + for (d = c.bc; d.next();) c = d.value, c.network !== b && (ap(a, c), b.ko(c), cp(a, b, c.toVertex)) + } + } + + xa.prototype.findAllParts = function () { + for (var a = new F(G), b = this.vertexes.i; b.next();) a.add(b.value.Cc); + for (b = this.edges.i; b.next();) a.add(b.value.link); + return a + }; + + function ya() { + u.gc(this); + this.network = null; + this.aa = (new z(0, 0, 10, 10)).freeze(); + this.M = (new w(5, 5)).freeze(); + this.clear() + } + + u.fa("LayoutVertex", ya); + ya.prototype.clear = function () { + this.kd = this.qh = null; + this.Ie = new E(Aa); + this.Ce = new E(Aa) + }; + ya.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = "LayoutVertex#" + u.Uc(this); + if (0 < a && (b += null !== this.Cc ? "(" + this.Cc.toString() + ")" : "", 1 < a)) { + a = ""; + for (var c = !0, d = this.Ie.i; d.next();) { + var e = d.value; + c ? c = !1 : a += ","; + a += e.toString(0) + } + e = ""; + c = !0; + for (d = this.Ce.i; d.next();) { + var f = d.value; + c ? c = !1 : e += ","; + e += f.toString(0) + } + b += " sources: " + a + " destinations: " + e + } + return b + }; + u.defineProperty(ya, {data: "data"}, function () { + return this.qh + }, function (a) { + this.qh = a; + if (null !== a) { + var b = a.bounds; + a = b.x; + var c = b.y, d = b.width, b = b.height; + this.M.m(d / 2, b / 2); + this.aa.m(a, c, d, b) + } + }); + u.defineProperty(ya, {Cc: "node"}, function () { + return this.kd + }, function (a) { + if (this.kd !== a) { + this.kd = a; + a.pf(); + var b = a.ba, c = b.x, d = b.y, e = b.width, b = b.height; + isNaN(c) && (c = 0); + isNaN(d) && (d = 0); + this.aa.m(c, d, e, b); + if (!(a instanceof V) && (a = a.ec.lb(Ib), a.J())) { + this.M.m(a.x - c, a.y - d); + return + } + this.M.m(e / 2, b / 2) + } + }); + u.defineProperty(ya, {kb: "bounds"}, function () { + return this.aa + }, function (a) { + this.aa.L(a) || this.aa.assign(a) + }); + u.defineProperty(ya, {focus: "focus"}, function () { + return this.M + }, function (a) { + this.M.L(a) || this.M.assign(a) + }); + u.defineProperty(ya, {Ja: "centerX"}, function () { + return this.aa.x + this.M.x + }, function (a) { + var b = this.aa; + b.x + this.M.x !== a && (b.La(), b.x = a - this.M.x, b.freeze()) + }); + u.defineProperty(ya, {Ua: "centerY"}, function () { + return this.aa.y + this.M.y + }, function (a) { + var b = this.aa; + b.y + this.M.y !== a && (b.La(), b.y = a - this.M.y, b.freeze()) + }); + u.defineProperty(ya, {Cs: "focusX"}, function () { + return this.M.x + }, function (a) { + var b = this.M; + b.x !== a && (b.La(), b.x = a, b.freeze()) + }); + u.defineProperty(ya, {Ds: "focusY"}, function () { + return this.M.y + }, function (a) { + var b = this.M; + b.y !== a && (b.La(), b.y = a, b.freeze()) + }); + u.defineProperty(ya, {x: "x"}, function () { + return this.aa.x + }, function (a) { + var b = this.aa; + b.x !== a && (b.La(), b.x = a, b.freeze()) + }); + u.defineProperty(ya, {y: "y"}, function () { + return this.aa.y + }, function (a) { + var b = this.aa; + b.y !== a && (b.La(), b.y = a, b.freeze()) + }); + u.defineProperty(ya, {width: "width"}, function () { + return this.aa.width + }, function (a) { + var b = this.aa; + b.width !== a && (b.La(), b.width = a, b.freeze()) + }); + u.defineProperty(ya, {height: "height"}, function () { + return this.aa.height + }, function (a) { + var b = this.aa; + b.height !== a && (b.La(), b.height = a, b.freeze()) + }); + ya.prototype.commit = function () { + var a = this.qh; + if (null !== a) { + var b = this.kb, c = a.bounds; + u.Sa(c) ? (c.x = b.x, c.y = b.y, c.width = b.width, c.height = b.height) : a.bounds = b.copy() + } else if (a = this.Cc, null !== a) { + b = this.kb; + if (!(a instanceof V)) { + var c = a.ba, d = a.ec.lb(Ib); + if (c.J() && d.J()) { + a.moveTo(b.x + this.Cs - (d.x - c.x), b.y + this.Ds - (d.y - c.y)); + return + } + } + a.moveTo(b.x, b.y) + } + }; + ya.prototype.addSourceEdge = ya.prototype.LC = function (a) { + null !== a && (this.Ie.contains(a) || this.Ie.add(a)) + }; + ya.prototype.deleteSourceEdge = ya.prototype.kD = function (a) { + null !== a && this.Ie.remove(a) + }; + ya.prototype.addDestinationEdge = ya.prototype.KC = function (a) { + null !== a && (this.Ce.contains(a) || this.Ce.add(a)) + }; + ya.prototype.deleteDestinationEdge = ya.prototype.jD = function (a) { + null !== a && this.Ce.remove(a) + }; + u.u(ya, {nI: "sourceVertexes"}, function () { + for (var a = new F(ya), b = this.kc; b.next();) a.add(b.value.fromVertex); + return a.i + }); + u.u(ya, {rG: "destinationVertexes"}, function () { + for (var a = new F(ya), b = this.bc; b.next();) a.add(b.value.toVertex); + return a.i + }); + u.u(ya, {vertexes: "vertexes"}, function () { + for (var a = new F(ya), b = this.kc; b.next();) a.add(b.value.fromVertex); + for (b = this.bc; b.next();) a.add(b.value.toVertex); + return a.i + }); + u.u(ya, {kc: "sourceEdges"}, function () { + return this.Ie.i + }); + u.u(ya, {bc: "destinationEdges"}, function () { + return this.Ce.i + }); + u.u(ya, {edges: "edges"}, function () { + for (var a = new E(Aa), b = this.kc; b.next();) a.add(b.value); + for (b = this.bc; b.next();) a.add(b.value); + return a.i + }); + u.u(ya, {xG: "edgesCount"}, function () { + return this.Ie.count + this.Ce.count + }); + var dp; + ya.standardComparer = dp = function (a, b) { + var c = a.kd, d = b.kd; + return c ? d ? (c = c.text, d = d.text, c < d ? -1 : c > d ? 1 : 0) : 1 : null !== d ? -1 : 0 + }; + ya.smartComparer = function (a, b) { + if (null !== a) { + if (null !== b) { + var c = a.kd, d = b.kd; + if (null !== c) { + if (null !== d) { + for (var c = c.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), d = d.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), e = 0; e < c.length; e++) if ("" !== d[e] && void 0 !== d[e]) { + var f = parseFloat(c[e]), h = parseFloat(d[e]); + if (isNaN(f)) { + if (!isNaN(h)) return 1; + if (0 !== c[e].localeCompare(d[e])) return c[e].localeCompare(d[e]) + } else { + if (isNaN(h)) return -1; + if (0 !== f - h) return f - + h + } + } else if ("" !== c[e]) return 1; + return "" !== d[e] && void 0 !== d[e] ? -1 : 0 + } + return 1 + } + return null !== d ? -1 : 0 + } + return 1 + } + return null !== b ? -1 : 0 + }; + + function Aa() { + u.gc(this); + this.network = null; + this.clear() + } + + u.fa("LayoutEdge", Aa); + Aa.prototype.clear = function () { + this.toVertex = this.fromVertex = this.link = this.data = null + }; + Aa.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = "LayoutEdge#" + u.Uc(this); + 0 < a && (b += null !== this.link ? "(" + this.link.toString() + ")" : "", 1 < a && (b += " " + (this.fromVertex ? this.fromVertex.toString() : "null") + " --\x3e " + (this.toVertex ? this.toVertex.toString() : "null"))); + return b + }; + Aa.prototype.yw = function () { + var a = this.fromVertex; + this.fromVertex = this.toVertex; + this.toVertex = a + }; + Aa.prototype.commit = function () { + }; + Aa.prototype.getOtherVertex = Aa.prototype.GG = function (a) { + return this.toVertex === a ? this.fromVertex : this.fromVertex === a ? this.toVertex : null + }; + + function Xk() { + 0 < arguments.length && u.Wc(Xk); + Je.call(this); + this.jw = !0; + this.as = this.bs = NaN; + this.Ti = (new ia(NaN, NaN)).freeze(); + this.Gh = (new ia(10, 10)).freeze(); + this.se = em; + this.Yc = cm; + this.Fh = Zl; + this.ph = ep + } + + u.Ga(Xk, Je); + u.fa("GridLayout", Xk); + Xk.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.bs = this.bs; + a.as = this.as; + a.Ti.assign(this.Ti); + a.Gh.assign(this.Gh); + a.se = this.se; + a.Yc = this.Yc; + a.Fh = this.Fh; + a.ph = this.ph + }; + Xk.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + this.Ud = this.initialOrigin(this.Ud); + var b = this.g, c = new F(G); + a instanceof D ? (b = a, Zo(this, c, a.yg, !0, null, !0, !0, !0), Zo(this, c, a.links, !0, null, !0, !0, !0), Zo(this, c, a.Sj, !0, null, !0, !0, !0)) : a instanceof V ? (b = a.g, Zo(this, c, a.Mc, !1, null, !0, !0, !0)) : c.Td(a.i); + for (a = c.copy().i; a.next();) { + var d = a.value; + if (d instanceof W) { + var e = d; + if (null !== e.W || null !== e.ca) { + c.remove(e); + continue + } + } + d.pf(); + if (d instanceof V) for (d = d.Mc; d.next();) c.remove(d.value) + } + e = c.Ke(); + if (0 !== e.length) { + switch (this.sorting) { + case bm: + e.reverse(); + break; + case Zl: + e.sort(this.comparer); + break; + case $l: + e.sort(this.comparer), e.reverse() + } + var f = this.EI; + isNaN(f) && (f = 0); + var h = this.cF, + h = isNaN(h) && null !== b ? Math.max(b.ob.width - b.padding.left - b.padding.right, 0) : Math.max(this.cF, 0); + 0 >= f && 0 >= h && (f = 1); + c = this.spacing.width; + isFinite(c) || (c = 0); + a = this.spacing.height; + isFinite(a) || (a = 0); + null !== b && b.Wb("Layout"); + d = []; + switch (this.alignment) { + case fm: + var k = + c, l = a, m = Math.max(this.qo.width, 1); + if (!isFinite(m)) for (var n = m = 0; n < e.length; n++) var p = e[n], q = p.Ba, m = Math.max(m, q.width); + var m = Math.max(m + k, 1), r = Math.max(this.qo.height, 1); + if (!isFinite(r)) for (n = r = 0; n < e.length; n++) p = e[n], q = p.Ba, r = Math.max(r, q.height); + for (var r = Math.max(r + l, 1), s = this.Gf, t = this.Ud.x, v = t, x = this.Ud.y, B = 0, y = 0, n = 0; n < e.length; n++) { + var p = e[n], q = p.Ba, C = Math.ceil((q.width + k) / m) * m, + I = Math.ceil((q.height + l) / r) * r, H = 0; + switch (s) { + case dm: + H = Math.abs(v - q.width); + break; + default: + H = v + q.width + } + if (0 < f && B > f - 1 || + 0 < h && 0 < B && H > h) d.push(new z(0, x, h + k, y)), B = 0, v = t, x += y, y = 0; + y = Math.max(y, I); + I = 0; + switch (s) { + case dm: + I = -q.width; + break; + default: + I = 0 + } + p.moveTo(v + I, x); + switch (s) { + case dm: + v -= C; + break; + default: + v += C + } + B++ + } + d.push(new z(0, x, h + k, y)); + break; + case em: + k = f; + l = c; + m = a; + n = Math.max(this.qo.width, 1); + p = x = C = 0; + q = u.K(); + for (f = 0; f < e.length; f++) r = e[f], s = r.Ba, t = On(r, r.ec, r.Ze, q), C = Math.max(C, t.x), x = Math.max(x, s.width - t.x), p = Math.max(p, t.y); + v = this.Gf; + switch (v) { + case dm: + C += l; + break; + default: + x += l + } + var n = isFinite(n) ? Math.max(n + l, 1) : Math.max(C + x, 1), + T = x = this.Ud.x, B = this.Ud.y, y = 0; + h >= C && (h -= C); + for (var C = I = 0, H = Math.max(this.qo.height, 1), aa = p = 0, R = !0, N = u.K(), f = 0; f < e.length; f++) { + r = e[f]; + s = r.Ba; + t = On(r, r.ec, r.Ze, q); + if (0 < y) switch (v) { + case dm: + T = Math.floor((T - x - (s.width - t.x)) / n) * n + x; + break; + default: + T = Math.ceil((T - x + t.x) / n) * n + x + } else switch (v) { + case dm: + I = T + t.x + s.width; + break; + default: + I = T - t.x + } + var Z = 0; + switch (v) { + case dm: + Z = -(T + t.x) + I; + break; + default: + Z = T + s.width - t.x - I + } + if (0 < k && y > k - 1 || 0 < h && 0 < y && Z > h) { + d.push(new z(0, R ? B - p : B, h + l, aa + p + m)); + for (T = 0; T < y && f !== y; T++) { + var Z = e[f - y + + T], Ea = On(Z, Z.ec, Z.Ze, N); + Z.moveTo(Z.position.x, Z.position.y + p - Ea.y) + } + aa += m; + B = R ? B + aa : B + (aa + p); + y = aa = p = 0; + T = x; + R = !1 + } + T === x && (C = v === dm ? Math.max(C, s.width - t.x) : Math.min(C, -t.x)); + p = Math.max(p, t.y); + aa = Math.max(aa, s.height - t.y); + isFinite(H) && (aa = Math.max(aa, Math.max(s.height, H) - t.y)); + R ? r.moveTo(T - t.x, B - t.y) : r.moveTo(T - t.x, B); + switch (v) { + case dm: + T -= t.x + l; + break; + default: + T += s.width - t.x + l + } + y++ + } + d.push(new z(0, B, h + l, (R ? aa : aa + p) + m)); + for (T = 0; T < y && f !== y; T++) Z = e[f - y + T], Ea = On(Z, Z.ec, Z.Ze, q), Z.moveTo(Z.position.x, Z.position.y + + p - Ea.y); + u.v(q); + u.v(N); + if (v === dm) for (f = 0; f < d.length; f++) e = d[f], e.width += C, e.x -= C; else for (f = 0; f < d.length; f++) e = d[f], e.x > C && (e.width += e.x - C, e.x = C) + } + for (k = f = h = e = 0; k < d.length; k++) l = d[k], e = Math.min(e, l.x), h = Math.min(h, l.y), f = Math.max(f, l.x + l.width); + this.Gf === dm ? this.commitLayers(d, new w(e + c / 2 - (f + e), h - a / 2)) : this.commitLayers(d, new w(e - c / 2, h - a / 2)); + null !== b && b.Wd("Layout"); + this.vf = !0 + } + }; + Xk.prototype.commitLayers = function () { + }; + u.defineProperty(Xk, {cF: "wrappingWidth"}, function () { + return this.bs + }, function (a) { + this.bs !== a && (u.j(a, "number", Xk, "wrappingWidth"), 0 < a || isNaN(a)) && (this.bs = a, this.jw = isNaN(a), this.H()) + }); + u.defineProperty(Xk, {EI: "wrappingColumn"}, function () { + return this.as + }, function (a) { + this.as !== a && (u.j(a, "number", Xk, "wrappingColumn"), 0 < a || isNaN(a)) && (this.as = a, this.H()) + }); + u.defineProperty(Xk, {qo: "cellSize"}, function () { + return this.Ti + }, function (a) { + u.C(a, ia, Xk, "cellSize"); + this.Ti.L(a) || (this.Ti.assign(a), this.H()) + }); + u.defineProperty(Xk, {spacing: "spacing"}, function () { + return this.Gh + }, function (a) { + u.C(a, ia, Xk, "spacing"); + this.Gh.L(a) || (this.Gh.assign(a), this.H()) + }); + u.defineProperty(Xk, {alignment: "alignment"}, function () { + return this.se + }, function (a) { + this.se !== a && (u.rb(a, Xk, Xk, "alignment"), a === em || a === fm) && (this.se = a, this.H()) + }); + u.defineProperty(Xk, {Gf: "arrangement"}, function () { + return this.Yc + }, function (a) { + this.Yc !== a && (u.rb(a, Xk, Xk, "arrangement"), a === cm || a === dm) && (this.Yc = a, this.H()) + }); + u.defineProperty(Xk, {sorting: "sorting"}, function () { + return this.Fh + }, function (a) { + this.Fh !== a && (u.rb(a, Xk, Xk, "sorting"), a === am || a === bm || a === Zl || a === $l) && (this.Fh = a, this.H()) + }); + u.defineProperty(Xk, {comparer: "comparer"}, function () { + return this.ph + }, function (a) { + this.ph !== a && (u.j(a, "function", Xk, "comparer"), this.ph = a, this.H()) + }); + var ep; + Xk.standardComparer = ep = function (a, b) { + var c = a.text, d = b.text; + return c < d ? -1 : c > d ? 1 : 0 + }; + Xk.smartComparer = function (a, b) { + if (null !== a) { + if (null !== b) { + for (var c = a.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), d = b.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), e = 0; e < c.length; e++) if ("" !== d[e] && void 0 !== d[e]) { + var f = parseFloat(c[e]), h = parseFloat(d[e]); + if (isNaN(f)) { + if (!isNaN(h)) return 1; + if (0 !== c[e].localeCompare(d[e])) return c[e].localeCompare(d[e]) + } else { + if (isNaN(h)) return -1; + if (0 !== f - h) return f - h + } + } else if ("" !== c[e]) return 1; + return "" !== + d[e] && void 0 !== d[e] ? -1 : 0 + } + return 1 + } + return null !== b ? -1 : 0 + }; + var fm; + Xk.Position = fm = u.s(Xk, "Position", 0); + var em; + Xk.Location = em = u.s(Xk, "Location", 1); + var cm; + Xk.LeftToRight = cm = u.s(Xk, "LeftToRight", 2); + var dm; + Xk.RightToLeft = dm = u.s(Xk, "RightToLeft", 3); + var am; + Xk.Forward = am = u.s(Xk, "Forward", 4); + var bm; + Xk.Reverse = bm = u.s(Xk, "Reverse", 5); + var Zl; + Xk.Ascending = Zl = u.s(Xk, "Ascending", 6); + var $l; + Xk.Descending = $l = u.s(Xk, "Descending", 7); + + function gm() { + 0 < arguments.length && u.Wc(gm); + Je.call(this); + this.Gx = this.rn = this.td = 0; + this.Sp = 360; + this.Fx = zm; + this.mk = 0; + this.eB = zm; + this.Vt = this.jg = this.yC = 0; + this.uv = new fp; + this.Yt = this.Vl = 0; + this.zF = 600; + this.lr = NaN; + this.yp = 1; + this.Mr = 0; + this.Pr = 360; + this.Yc = zm; + this.la = om; + this.Fh = lm; + this.ph = dp; + this.Gh = 6; + this.Zq = Cm + } + + u.Ga(gm, Je); + u.fa("CircularLayout", gm); + gm.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.lr = this.lr; + a.yp = this.yp; + a.Mr = this.Mr; + a.Pr = this.Pr; + a.Yc = this.Yc; + a.la = this.la; + a.Fh = this.Fh; + a.ph = this.ph; + a.Gh = this.Gh; + a.Zq = this.Zq + }; + gm.prototype.createNetwork = function () { + return new gp + }; + gm.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + a = this.network.vertexes; + if (1 >= a.count) 1 === a.count && (a = a.first(), a.Ja = 0, a.Ua = 0); else { + var b = new E(hp); + b.Td(a.i); + a = new E(hp); + var c = new E(hp), d; + d = this.sort(b); + var e = this.Fx, f = this.eB, h = this.td, k = this.rn, l = this.Gx, m = this.Sp, b = this.mk, n = this.yC, + p = this.jg, q = this.Vt, e = this.Gf, f = this.qw, h = this.OH; + if (!isFinite(h) || + 0 >= h) h = NaN; + k = this.QF; + if (!isFinite(k) || 0 >= k) k = 1; + l = this.Je; + isFinite(l) || (l = 0); + m = this.Qf; + if (!isFinite(m) || 360 < m || 1 > m) m = 360; + b = this.spacing; + isFinite(b) || (b = NaN); + e === Am && f === Bm ? e = zm : e === Am && f !== Bm && (f = Bm, e = this.Gf); + if ((this.direction === mm || this.direction === nm) && this.sorting !== lm) { + for (var r = 0; !(r >= d.length); r += 2) { + a.add(d.ja(r)); + if (r + 1 >= d.length) break; + c.add(d.ja(r + 1)) + } + this.direction === mm ? (this.Gf === Am && a.reverse(), d = new E(hp), d.Td(a), d.Td(c)) : (this.Gf === Am && c.reverse(), d = new E(hp), d.Td(c), d.Td(a)) + } + for (var s = + d.length, t = n = 0, r = 0; r < d.length; r++) { + var p = l + m * t * (this.direction === om ? 1 : -1) / s, v = d.ja(r).diameter; + isNaN(v) && (v = ip(d.ja(r), p)); + 360 > m && (0 === r || r === d.length - 1) && (v /= 2); + n += v; + t++ + } + if (isNaN(h) || e === Am) { + isNaN(b) && (b = 6); + if (e !== zm && e !== Am) { + v = -Infinity; + for (r = 0; r < s; r++) { + var q = d.ja(r), x = d.ja(r === s - 1 ? 0 : r + 1); + isNaN(q.diameter) && ip(q, 0); + isNaN(x.diameter) && ip(x, 0); + v = Math.max(v, (q.diameter + x.diameter) / 2) + } + q = v + b; + e === xm ? (p = 2 * Math.PI / s, h = (v + b) / p) : h = jp(this, q * (360 <= m ? s : s - 1), k, l * Math.PI / 180, m * Math.PI / 180) + } else h = jp(this, n + (360 <= + m ? s : s - 1) * (e !== Am ? b : 1.6 * b), k, l * Math.PI / 180, m * Math.PI / 180); + p = h * k + } else if (p = h * k, t = kp(this, h, p, l * Math.PI / 180, m * Math.PI / 180), isNaN(b)) { + if (e === zm || e === Am) b = (t - n) / (360 <= m ? s : s - 1) + } else if (e === zm || e === Am) r = (t - n) / (360 <= m ? s : s - 1), r < b ? (h = jp(this, n + b * (360 <= m ? s : s - 1), k, l * Math.PI / 180, m * Math.PI / 180), p = h * k) : b = r; else { + v = -Infinity; + for (r = 0; r < s; r++) q = d.ja(r), x = d.ja(r === s - 1 ? 0 : r + 1), isNaN(q.diameter) && ip(q, 0), isNaN(x.diameter) && ip(x, 0), v = Math.max(v, (q.diameter + x.diameter) / 2); + q = v + b; + r = jp(this, q * (360 <= m ? s : s - 1), k, l * Math.PI / 180, + m * Math.PI / 180); + r > h ? (h = r, p = h * k) : q = t / (360 <= m ? s : s - 1) + } + this.Fx = e; + this.eB = f; + this.td = h; + this.rn = k; + this.Gx = l; + this.Sp = m; + this.mk = b; + this.yC = n; + this.jg = p; + this.Vt = q; + b = d; + d = this.Fx; + e = this.td; + f = this.Gx; + k = this.Sp; + l = this.mk; + m = this.jg; + n = this.Vt; + if (this.direction !== mm && this.direction !== nm || d !== Am) if (this.direction === mm || this.direction === nm) { + h = 0; + switch (d) { + case ym: + h = 180 * lp(this, e, m, f, n) / Math.PI; + break; + case zm: + n = b = 0; + h = a.first(); + null !== h && (b = ip(h, Math.PI / 2)); + h = c.first(); + null !== h && (n = ip(h, Math.PI / 2)); + h = 180 * lp(this, e, m, f, l + (b + + n) / 2) / Math.PI; + break; + case xm: + h = k / b.length + } + if (this.direction === mm) { + switch (d) { + case ym: + mp(this, a, f, wm); + break; + case zm: + np(this, a, f, wm); + break; + case xm: + op(this, a, k / 2, f, wm) + } + switch (d) { + case ym: + mp(this, c, f + h, om); + break; + case zm: + np(this, c, f + h, om); + break; + case xm: + op(this, c, k / 2, f + h, om) + } + } else { + switch (d) { + case ym: + mp(this, c, f, wm); + break; + case zm: + np(this, c, f, wm); + break; + case xm: + op(this, c, k / 2, f, wm) + } + switch (d) { + case ym: + mp(this, a, f + h, om); + break; + case zm: + np(this, a, f + h, om); + break; + case xm: + op(this, a, k / 2, f + h, om) + } + } + } else switch (d) { + case ym: + mp(this, + b, f, this.direction); + break; + case zm: + np(this, b, f, this.direction); + break; + case xm: + op(this, b, k, f, this.direction); + break; + case Am: + pp(this, b, k, f, this.direction) + } else pp(this, b, k, f - k / 2, om) + } + this.updateParts(); + this.network = null; + this.vf = !0 + }; + + function op(a, b, c, d, e) { + var f = a.Sp, h = a.td; + a = a.jg; + d = d * Math.PI / 180; + c = c * Math.PI / 180; + for (var k = b.length, l = 0; l < k; l++) { + var m = d + (e === om ? l * c / (360 <= f ? k : k - 1) : -(l * c) / k), n = b.ja(l), + p = h * Math.tan(m) / a, p = Math.sqrt((h * h + a * a * p * p) / (1 + p * p)); + n.Ja = p * Math.cos(m); + n.Ua = p * Math.sin(m); + n.actualAngle = 180 * m / Math.PI + } + } + + function np(a, b, c, d) { + var e = a.td, f = a.jg, h = a.mk; + c = c * Math.PI / 180; + for (var k = b.length, l = 0; l < k; l++) { + var m = b.ja(l), n = b.ja(l === k - 1 ? 0 : l + 1), p = f * Math.sin(c); + m.Ja = e * Math.cos(c); + m.Ua = p; + m.actualAngle = 180 * c / Math.PI; + isNaN(m.diameter) && ip(m, 0); + isNaN(n.diameter) && ip(n, 0); + m = lp(a, e, f, d === om ? c : -c, (m.diameter + n.diameter) / 2 + h); + c += d === om ? m : -m + } + } + + function mp(a, b, c, d) { + var e = a.td, f = a.jg, h = a.Vt; + c = c * Math.PI / 180; + for (var k = b.length, l = 0; l < k; l++) { + var m = b.ja(l); + m.Ja = e * Math.cos(c); + m.Ua = f * Math.sin(c); + m.actualAngle = 180 * c / Math.PI; + m = lp(a, e, f, d === om ? c : -c, h); + c += d === om ? m : -m + } + } + + function pp(a, b, c, d, e) { + var f = a.Yt, f = a.Sp; + a.Vl = 0; + a.uv = new fp; + if (360 > c) { + for (f = d + (e === om ? f : -f); 0 > f;) f += 360; + f %= 360; + 180 < f && (f -= 360); + f *= Math.PI / 180; + a.Yt = f; + qp(a, b, c, d, e) + } else rp(a, b, c, d, e); + a.uv.commit(b) + } + + function rp(a, b, c, d, e) { + var f = a.td, h = a.mk, k = a.rn, l = f * Math.cos(d * Math.PI / 180), m = a.jg * Math.sin(d * Math.PI / 180), + n = b.Ke(); + if (3 === n.length) n[0].Ja = f, n[0].Ua = 0, n[1].Ja = n[0].Ja - n[0].width / 2 - n[1].width / 2 - h, n[1].y = n[0].y, n[2].Ja = (n[0].Ja + n[1].Ja) / 2, n[2].y = n[0].y - n[2].height - h; else if (4 === n.length) n[0].Ja = f, n[0].Ua = 0, n[2].Ja = -n[0].Ja, n[2].Ua = n[0].Ua, n[1].Ja = 0, n[1].y = Math.min(n[0].y, n[2].y) - n[1].height - h, n[3].Ja = 0, n[3].y = Math.max(n[0].y + n[0].height + h, n[2].y + n[2].height + h); else { + for (var f = u.K(), p = 0; p < n.length; p++) { + n[p].Ja = + l; + n[p].Ua = m; + if (p >= n.length - 1) break; + sp(a, l, m, n, p, e, f) || tp(a, l, m, n, p, e, f); + l = f.x; + m = f.y + } + u.v(f); + a.Vl++; + if (!(23 < a.Vl)) { + var l = n[0].Ja, m = n[0].Ua, f = n[n.length - 1].Ja, p = n[n.length - 1].Ua, + q = Math.abs(l - f) - ((n[0].width + n[n.length - 1].width) / 2 + h), + r = Math.abs(m - p) - ((n[0].height + n[n.length - 1].height) / 2 + h), h = 0; + 1 > Math.abs(r) ? Math.abs(l - f) < (n[0].width + n[n.length - 1].width) / 2 && (h = 0) : h = 0 < r ? r : 1 > Math.abs(q) ? 0 : q; + q = !1; + q = Math.abs(f) > Math.abs(p) ? 0 < f !== m > p : 0 < p !== l < f; + if (q = e === om ? q : !q) h = -Math.abs(h), h = Math.min(h, -n[n.length - 1].width), + h = Math.min(h, -n[n.length - 1].height); + a.uv.compare(h, n); + 1 < Math.abs(h) && (a.td = 8 > a.Vl ? a.td - h / (2 * Math.PI) : 5 > n.length && 10 < h ? a.td / 2 : a.td - (0 < h ? 1.7 : -2.3), a.jg = a.td * k, rp(a, b, c, d, e)) + } + } + } + + function qp(a, b, c, d, e) { + for (var f = a.td, h = a.jg, k = a.rn, l = f * Math.cos(d * Math.PI / 180), m = h * Math.sin(d * Math.PI / 180), n = u.K(), p = b.Ke(), q = 0; q < p.length; q++) { + p[q].Ja = l; + p[q].Ua = m; + if (q >= p.length - 1) break; + sp(a, l, m, p, q, e, n) || tp(a, l, m, p, q, e, n); + l = n.x; + m = n.y + } + u.v(n); + a.Vl++; + if (!(23 < a.Vl)) { + l = Math.atan2(m, l); + l = e === om ? a.Yt - l : l - a.Yt; + l = Math.abs(l) < Math.abs(l - 2 * Math.PI) ? l : l - 2 * Math.PI; + f = l * (f + h) / 2; + h = a.uv; + if (Math.abs(f) < Math.abs(h.Ao)) for (h.Ao = f, h.Qm = [], h.lp = [], l = 0; l < p.length; l++) h.Qm[l] = p[l].kb.x, h.lp[l] = p[l].kb.y; + 1 < Math.abs(f) && + (a.td = 8 > a.Vl ? a.td - f / (2 * Math.PI) : a.td - (0 < f ? 1.7 : -2.3), a.jg = a.td * k, qp(a, b, c, d, e)) + } + } + + function sp(a, b, c, d, e, f, h) { + var k = a.td, l = a.jg, m = 0, n = 0; + a = (d[e].width + d[e + 1].width) / 2 + a.mk; + var p = !1; + if (0 <= c !== (f === om)) { + if (m = b + a, m > k) { + m = b - a; + if (m < -k) return h.x = m, h.y = n, !1; + p = !0 + } + } else if (m = b - a, m < -k) { + m = b + a; + if (m > k) return h.x = m, h.y = n, !1; + p = !0 + } + n = Math.sqrt(1 - Math.min(1, m * m / (k * k))) * l; + 0 > c !== p && (n = -n); + if (Math.abs(c - n) > (d[e].height + d[e + 1].height) / 2) return h.x = m, h.y = n, !1; + h.x = m; + h.y = n; + return !0 + } + + function tp(a, b, c, d, e, f, h) { + var k = a.td, l = a.jg, m = 0, n = 0; + a = (d[e].height + d[e + 1].height) / 2 + a.mk; + d = !1; + if (0 <= b !== (f === om)) { + if (n = c - a, n < -l) { + n = c + a; + if (n > l) { + h.x = m; + h.y = n; + return + } + d = !0 + } + } else if (n = c + a, n > l) { + n = c - a; + if (n < -l) { + h.x = m; + h.y = n; + return + } + d = !0 + } + m = Math.sqrt(1 - Math.min(1, n * n / (l * l))) * k; + 0 > b !== d && (m = -m); + h.x = m; + h.y = n + } + + gm.prototype.commitLayout = function () { + this.commitNodes(); + this.Qs && this.commitLinks() + }; + gm.prototype.commitNodes = function () { + for (var a = this.IF, b = this.network.vertexes.i; b.next();) { + var c = b.value; + c.x += a.x; + c.y += a.y; + c.commit() + } + }; + gm.prototype.commitLinks = function () { + for (var a = this.network.edges.i; a.next();) a.value.commit() + }; + + function kp(a, b, c, d, e) { + var f = a.zF; + if (.001 > Math.abs(a.rn - 1)) return void 0 !== d && void 0 !== e ? e * b : 2 * Math.PI * b; + a = b > c ? Math.sqrt(b * b - c * c) / b : Math.sqrt(c * c - b * b) / c; + for (var h = 0, k = 0, k = void 0 !== d && void 0 !== e ? e / (f + 1) : Math.PI / (2 * (f + 1)), l = 0, m = 0; m <= f; m++) l = void 0 !== d && void 0 !== e ? d + m * e / f : m * Math.PI / (2 * f), l = Math.sin(l), h += Math.sqrt(1 - a * a * l * l) * k; + return void 0 !== d && void 0 !== e ? (b > c ? b : c) * h : 4 * (b > c ? b : c) * h + } + + function jp(a, b, c, d, e) { + var f = 0, f = void 0 !== d && void 0 !== e ? kp(a, 1, c, d, e) : kp(a, 1, c); + return b / f + } + + function lp(a, b, c, d, e) { + if (.001 > Math.abs(a.rn - 1)) return e / b; + var f = b > c ? Math.sqrt(b * b - c * c) / b : Math.sqrt(c * c - b * b) / c, h = 0; + a = 2 * Math.PI / (700 * a.network.vertexes.count); + b > c && (d += Math.PI / 2); + for (var k = 0; ; k++) { + var l = Math.sin(d + k * a), h = h + (b > c ? b : c) * Math.sqrt(1 - f * f * l * l) * a; + if (h >= e) return k * a + } + } + + gm.prototype.sort = function (a) { + switch (this.sorting) { + case jm: + break; + case km: + a.reverse(); + break; + case hm: + a.sort(this.comparer); + break; + case im: + a.sort(this.comparer); + a.reverse(); + break; + case lm: + for (var b = [], c = 0; c < a.length; c++) b.push(0); + for (var d = new E(hp), c = 0; c < a.length; c++) { + var e = -1, f = -1; + if (0 === c) for (var h = 0; h < a.length; h++) { + var k = a.ja(h).xG; + k > e && (e = k, f = h) + } else for (h = 0; h < a.length; h++) k = b[h], k > e && (e = k, f = h); + d.add(a.ja(f)); + b[f] = -1; + f = a.ja(f); + e = 0; + for (h = f.kc; h.next();) e = a.indexOf(h.value.fromVertex), 0 > e || 0 <= b[e] && + b[e]++; + for (f = f.bc; f.next();) e = a.indexOf(f.value.toVertex), 0 > e || 0 <= b[e] && b[e]++ + } + a = []; + for (b = 0; b < d.length; b++) { + h = d.ja(b); + a[b] = []; + for (var l = 0, c = h.bc; c.next();) l = d.indexOf(c.value.toVertex), l !== b && 0 > a[b].indexOf(l) && a[b].push(l); + for (c = h.kc; c.next();) l = d.indexOf(c.value.fromVertex), l !== b && 0 > a[b].indexOf(l) && a[b].push(l) + } + h = []; + for (b = 0; b < a.length; b++) h[b] = 0; + for (var c = [], k = [], m = [], e = [], f = new E(hp), n = 0, b = 0; b < a.length; b++) { + var p = a[b].length; + if (1 === p) e.push(b); else if (0 === p) f.add(d.ja(b)); else { + if (0 === n) c.push(b); + else { + for (var q = Infinity, r = Infinity, s = -1, t = [], p = 0; p < c.length; p++) 0 > a[c[p]].indexOf(c[p === c.length - 1 ? 0 : p + 1]) && t.push(p === c.length - 1 ? 0 : p + 1); + if (0 === t.length) for (p = 0; p < c.length; p++) t.push(p); + for (p = 0; p < t.length; p++) { + var v = t[p], x, l = a[b]; + x = k; + for (var B = m, y = h, C = v, I = c, H = 0, T = 0; T < x.length; T++) { + var aa = y[x[T]], R = y[B[T]], N = 0, Z = 0; + aa < R ? (N = aa, Z = R) : (N = R, Z = aa); + if (N < C && C <= Z) for (aa = 0; aa < l.length; aa++) R = l[aa], 0 > I.indexOf(R) || N < y[R] && y[R] < Z || N === y[R] || Z === y[R] || H++; else for (aa = 0; aa < l.length; aa++) R = l[aa], 0 > I.indexOf(R) || N < + y[R] && y[R] < Z && N !== y[R] && Z !== y[R] && H++ + } + x = H; + for (y = B = 0; y < a[b].length; y++) l = c.indexOf(a[b][y]), 0 <= l && (l = Math.abs(v - (l >= v ? l + 1 : l)), B += l < c.length + 1 - l ? l : c.length + 1 - l); + for (y = 0; y < k.length; y++) l = h[k[y]], C = h[m[y]], l >= v && l++, C >= v && C++, l > C && (I = C, C = l, l = I), C - l < (c.length + 2) / 2 === (l < v && v <= C) && B++; + if (x < q || x === q && B < r) q = x, r = B, s = v + } + c.splice(s, 0, b); + for (p = 0; p < c.length; p++) h[c[p]] = p; + for (p = 0; p < a[b].length; p++) q = a[b][p], 0 <= c.indexOf(q) && (k.push(b), m.push(q)) + } + n++ + } + } + k = !1; + for (m = c.length; ;) { + k = !0; + for (h = 0; h < e.length; h++) if (b = e[h], n = + a[b][0], l = c.indexOf(n), 0 <= l) { + for (r = p = 0; r < a[n].length; r++) q = a[n][r], q = c.indexOf(q), 0 > q || q === l || (s = q > l ? q - l : l - q, p += q < l !== s > m - s ? 1 : -1); + c.splice(0 > p ? l : l + 1, 0, b); + e.splice(h, 1); + h-- + } else k = !1; + if (k) break; else c.push(e[0]), e.splice(0, 1) + } + for (b = 0; b < c.length; b++) l = c[b], f.add(d.ja(l)); + return f; + default: + u.k("Invalid sorting type.") + } + return a + }; + u.defineProperty(gm, {OH: "radius"}, function () { + return this.lr + }, function (a) { + this.lr !== a && (u.j(a, "number", gm, "radius"), 0 < a || isNaN(a)) && (this.lr = a, this.H()) + }); + u.defineProperty(gm, {QF: "aspectRatio"}, function () { + return this.yp + }, function (a) { + this.yp !== a && (u.j(a, "number", gm, "aspectRatio"), 0 < a && (this.yp = a, this.H())) + }); + u.defineProperty(gm, {Je: "startAngle"}, function () { + return this.Mr + }, function (a) { + this.Mr !== a && (u.j(a, "number", gm, "startAngle"), this.Mr = a, this.H()) + }); + u.defineProperty(gm, {Qf: "sweepAngle"}, function () { + return this.Pr + }, function (a) { + this.Pr !== a && (u.j(a, "number", gm, "sweepAngle"), this.Pr = 0 < a && 360 >= a ? a : 360, this.H()) + }); + u.defineProperty(gm, {Gf: "arrangement"}, function () { + return this.Yc + }, function (a) { + this.Yc !== a && (u.rb(a, gm, gm, "arrangement"), a === Am || a === zm || a === ym || a === xm) && (this.Yc = a, this.H()) + }); + u.defineProperty(gm, {direction: "direction"}, function () { + return this.la + }, function (a) { + this.la !== a && (u.rb(a, gm, gm, "direction"), a === om || a === wm || a === mm || a === nm) && (this.la = a, this.H()) + }); + u.defineProperty(gm, {sorting: "sorting"}, function () { + return this.Fh + }, function (a) { + this.Fh !== a && (u.rb(a, gm, gm, "sorting"), a === jm || a === km || a === hm || im || a === lm) && (this.Fh = a, this.H()) + }); + u.defineProperty(gm, {comparer: "comparer"}, function () { + return this.ph + }, function (a) { + this.ph !== a && (u.j(a, "function", gm, "comparer"), this.ph = a, this.H()) + }); + u.defineProperty(gm, {spacing: "spacing"}, function () { + return this.Gh + }, function (a) { + this.Gh !== a && (u.j(a, "number", gm, "spacing"), this.Gh = a, this.H()) + }); + u.defineProperty(gm, {qw: "nodeDiameterFormula"}, function () { + return this.Zq + }, function (a) { + this.Zq !== a && (u.rb(a, gm, gm, "nodeDiameterFormula"), a === Cm || a === Bm) && (this.Zq = a, this.H()) + }); + u.u(gm, {JF: "actualXRadius"}, function () { + return this.td + }); + u.u(gm, {KF: "actualYRadius"}, function () { + return this.jg + }); + u.u(gm, {FI: "actualSpacing"}, function () { + return this.mk + }); + u.u(gm, {IF: "actualCenter"}, function () { + return isNaN(this.Ud.x) || isNaN(this.Ud.y) ? new w(0, 0) : new w(this.Ud.x + this.JF, this.Ud.y + this.KF) + }); + var zm; + gm.ConstantSpacing = zm = u.s(gm, "ConstantSpacing", 0); + var ym; + gm.ConstantDistance = ym = u.s(gm, "ConstantDistance", 1); + var xm; + gm.ConstantAngle = xm = u.s(gm, "ConstantAngle", 2); + var Am; + gm.Packed = Am = u.s(gm, "Packed", 3); + var om; + gm.Clockwise = om = u.s(gm, "Clockwise", 4); + var wm; + gm.Counterclockwise = wm = u.s(gm, "Counterclockwise", 5); + var mm; + gm.BidirectionalLeft = mm = u.s(gm, "BidirectionalLeft", 6); + var nm; + gm.BidirectionalRight = nm = u.s(gm, "BidirectionalRight", 7); + var jm; + gm.Forwards = jm = u.s(gm, "Forwards", 8); + var km; + gm.Reverse = km = u.s(gm, "Reverse", 9); + var hm; + gm.Ascending = hm = u.s(gm, "Ascending", 10); + var im; + gm.Descending = im = u.s(gm, "Descending", 11); + var lm; + gm.Optimized = lm = u.s(gm, "Optimized", 12); + var Cm; + gm.Pythagorean = Cm = u.s(gm, "Pythagorean", 13); + var Bm; + gm.Circular = Bm = u.s(gm, "Circular", 14); + + function fp() { + this.Ao = -Infinity; + this.lp = this.Qm = null + } + + fp.prototype.compare = function (a, b) { + if (0 < a && 0 > this.Ao || Math.abs(a) < Math.abs(this.Ao) && !(0 > a && 0 < this.Ao)) { + this.Ao = a; + this.Qm = []; + this.lp = []; + for (var c = 0; c < b.length; c++) this.Qm[c] = b[c].kb.x, this.lp[c] = b[c].kb.y + } + }; + fp.prototype.commit = function (a) { + if (null !== this.Qm && null !== this.lp) for (var b = 0; b < this.Qm.length; b++) { + var c = a.ja(b); + c.x = this.Qm[b]; + c.y = this.lp[b] + } + }; + + function gp() { + xa.call(this) + } + + u.Ga(gp, xa); + u.fa("CircularNetwork", gp); + gp.prototype.createVertex = function () { + return new hp + }; + gp.prototype.createEdge = function () { + return new up + }; + + function hp() { + ya.call(this); + this.actualAngle = this.diameter = NaN + } + + u.Ga(hp, ya); + u.fa("CircularVertex", hp); + + function ip(a, b) { + var c = a.network; + if (null === c) return NaN; + c = c.Qb; + if (null === c) return NaN; + if (c.Gf === Am) if (c.qw === Bm) a.diameter = Math.max(a.width, a.height); else { + var c = Math.abs(Math.sin(b)), d = Math.abs(Math.cos(b)); + if (0 === c) return a.width; + if (0 === d) return a.height; + a.diameter = Math.min(a.height / c, a.width / d) + } else a.diameter = c.qw === Bm ? Math.max(a.width, a.height) : Math.sqrt(a.width * a.width + a.height * a.height); + return a.diameter + } + + function up() { + Aa.call(this) + } + + u.Ga(up, Aa); + u.fa("CircularEdge", up); + + function vp() { + 0 < arguments.length && u.Wc(vp); + Je.call(this); + this.ig = null; + this.vq = 0; + this.Uf = (new ia(100, 100)).freeze(); + this.xp = !1; + this.Eh = !0; + this.oh = !1; + this.On = 100; + this.Up = 1; + this.yh = 1E3; + this.mr = Math; + this.mn = .05; + this.ln = 50; + this.hn = 150; + this.kn = 0; + this.Op = 10; + this.Np = 5 + } + + u.Ga(vp, Je); + u.fa("ForceDirectedLayout", vp); + vp.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.Uf.assign(this.Uf); + a.xp = this.xp; + a.Eh = this.Eh; + a.oh = this.oh; + a.On = this.On; + a.Up = this.Up; + a.yh = this.yh; + a.mr = this.mr; + a.mn = this.mn; + a.ln = this.ln; + a.hn = this.hn; + a.kn = this.kn; + a.Op = this.Op; + a.Np = this.Np + }; + vp.prototype.createNetwork = function () { + return new wp + }; + vp.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + a = this.Az; + if (0 < this.network.vertexes.count) { + this.network.Qv(); + for (var b = this.network.vertexes.i; b.next();) { + var c = b.value; + c.charge = this.electricalCharge(c); + c.mass = this.gravitationalMass(c) + } + for (b = this.network.edges.i; b.next();) c = b.value, c.stiffness = this.springStiffness(c), c.length = this.springLength(c); + this.Ny(); + this.vq = 0; + if (this.needsClusterLayout()) { + b = this.network; + for (c = b.oI().i; c.next();) { + this.network = c.value; + for (var d = this.network.vertexes.i; d.next();) { + var e = d.value; + e.Of = e.vertexes.count; + e.Rj = 1; + e.rm = null; + e.hh = null + } + xp(this, 0, a) + } + this.network = b; + c.reset(); + for (var d = this.QC, f = c.count, h = !0, k = e = 0, l = u.eb(), m = 0; m < f + b.vertexes.count + 2; m++) l[m] = null; + f = 0; + c.reset(); + for (var n = u.Sf(); c.next();) if (m = c.value, this.kg(m, n), h) h = !1, e = n.x + n.width / 2, k = n.y + n.height / 2, l[0] = new w(n.x + n.width + d.width, n.y), l[1] = new w(n.x, + n.y + n.height + d.height), f = 2; else { + var p = yp(l, f, e, k, n.width, n.height, d), q = l[p], r = new w(q.x + n.width + d.width, q.y), + s = new w(q.x, q.y + n.height + d.height); + p + 1 < f && l.splice(p + 1, 0, null); + l[p] = r; + l[p + 1] = s; + f++; + p = q.x - n.x; + q = q.y - n.y; + for (m = m.vertexes.i; m.next();) r = m.value, r.Ja += p, r.Ua += q + } + u.ic(n); + for (m = b.vertexes.i; m.next();) h = m.value, n = h.kb, 2 > f ? (e = n.x + n.width / 2, k = n.y + n.height / 2, l[0] = new w(n.x + n.width + d.width, n.y), l[1] = new w(n.x, n.y + n.height + d.height), f = 2) : (p = yp(l, f, e, k, n.width, n.height, d), q = l[p], r = new w(q.x + n.width + d.width, + q.y), s = new w(q.x, q.y + n.height + d.height), p + 1 < f && l.splice(p + 1, 0, null), l[p] = r, l[p + 1] = s, f++, h.Ja = q.x + h.width / 2, h.Ua = q.y + h.height / 2); + u.ra(l); + for (c.reset(); c.next();) { + d = c.value; + for (e = d.vertexes.i; e.next();) b.Mk(e.value); + for (d = d.edges.i; d.next();) b.ko(d.value) + } + } + zp(this, a); + this.updateParts() + } + this.On = a; + this.network = null; + this.vf = !0 + }; + vp.prototype.needsClusterLayout = function () { + if (3 > this.network.vertexes.count) return !1; + for (var a = 0, b = 0, c = this.network.vertexes.first().kb, d = this.network.vertexes.i; d.next();) { + if (d.value.kb.sg(c) && (a++, 2 < a)) return !0; + if (10 < b) break; + b++ + } + return !1 + }; + vp.prototype.kg = function (a, b) { + for (var c = !0, d = a.vertexes.i; d.next();) { + var e = d.value; + c ? (c = !1, b.set(e.kb)) : b.Sh(e.kb) + } + return b + }; + + function xp(a, b, c) { + if (Ap(a, b)) { + var d = a.yh; + a.yh *= 1 + 1 / (b + 1); + var e = Bp(a, b), f = Math.max(0, Math.max(Math.min(a.network.vertexes.count, c * (b + 1) / 11), 10)); + a.Az += f; + xp(a, b + 1, c); + zp(a, f); + Cp(a, e); + b = a.ig; + null === b ? b = new E(Dp) : b.clear(); + b.Td(e.vertexes); + b.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.Of - a.Of + }); + for (e = b.i; e.next();) Ep(a, e.value); + a.yh = d + } + } + + function Ap(a, b) { + if (10 < b || 3 > a.network.vertexes.count) return !1; + null === a.ig ? a.ig = new E(Dp) : a.ig.clear(); + a.ig.Td(a.network.vertexes); + var c = a.ig; + c.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.Of - a.Of + }); + for (var d = c.count - 1; 0 <= d && 1 >= c.ja(d).Of;) d--; + return 1 < c.count - d + } + + function Bp(a, b) { + for (var c = a.network, d = new wp, e = a.ig.i; e.next();) { + var f = e.value; + if (1 < f.Of) { + d.Mk(f); + var h = new Fp; + h.Sw = f.Of; + h.Vw = f.width; + h.Rw = f.height; + h.qA = f.M.x; + h.rA = f.M.y; + null === f.hh && (f.hh = new E(Fp)); + f.hh.add(h); + f.Yz = f.hh.count - 1 + } else break + } + for (var k = c.edges.i; k.next();) if (e = k.value, e.fromVertex.network === d && e.toVertex.network === d) d.ko(e); else if (e.fromVertex.network === d) { + var l = e.fromVertex.rm; + null === l && (l = new E(Dp), e.fromVertex.rm = l); + l.add(e.toVertex); + e.fromVertex.Of--; + e.fromVertex.Rj += e.toVertex.Rj + } else e.toVertex.network === + d && (l = e.toVertex.rm, null === l && (l = new E(Dp), e.toVertex.rm = l), l.add(e.fromVertex), e.toVertex.Of--, e.toVertex.Rj += e.fromVertex.Rj); + for (e = d.edges.i; e.next();) f = e.value, f.length *= Math.max(1, K.sqrt((f.fromVertex.Rj + f.toVertex.Rj) / (4 * b + 1))); + for (e = d.vertexes.i; e.next();) if (f = e.value, l = f.rm, null !== l && 0 < l.count && (h = f.hh.ja(f.hh.count - 1), h = h.Sw - f.Of, !(0 >= h))) { + for (var m = 0, n = 0, p = l.count - h; p < l.count; p++) { + for (var q = l.ja(p), r = null, k = q.edges.i; k.next();) { + var s = k.value; + if (s.GG(q) === f) { + r = s; + break + } + } + null !== r && (n += r.length, + m += q.width * q.height) + } + l = f.Ja; + k = f.Ua; + p = f.width; + q = f.height; + r = f.M; + s = p * q; + 1 > s && (s = 1); + m = K.sqrt((m + s + n * n * 4 / (h * h)) / s); + h = (m - 1) * p / 2; + m = (m - 1) * q / 2; + f.kb = new z(l - r.x - h, k - r.y - m, p + 2 * h, q + 2 * m); + f.focus = new w(r.x + h, r.y + m) + } + a.network = d; + return c + } + + function Cp(a, b) { + for (var c = a.network.vertexes.i; c.next();) { + var d = c.value; + d.network = b; + if (null !== d.hh) { + var e = d.hh.ja(d.Yz); + d.Of = e.Sw; + var f = e.qA, h = e.rA; + d.kb = new z(d.Ja - f, d.Ua - h, e.Vw, e.Rw); + d.focus = new w(f, h); + d.Yz-- + } + } + for (c = a.network.edges.i; c.next();) c.value.network = b; + a.network = b + } + + function Ep(a, b) { + var c = b.rm; + if (null !== c && 0 !== c.count) { + var d = b.Ja, e = b.Ua, f = b.width, h = b.height; + null !== b.hh && 0 < b.hh.count && (h = b.hh.ja(0), f = h.Vw, h = h.Rw); + for (var f = K.sqrt(f * f + h * h) / 2, k = !1, l = h = 0, m = 0, n = b.vertexes.i; n.next();) { + var p = n.value; + 1 >= p.Of ? l++ : (k = !0, m++, h += Math.atan2(b.Ua - p.Ua, b.Ja - p.Ja)) + } + if (0 !== l) for (0 < m && (h /= m), n = m = 0, m = k ? 2 * Math.PI / (l + 1) : 2 * Math.PI / l, 0 === l % 2 && (n = m / 2), 1 < c.count && c.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.width * b.height - a.width * a.height + }), k = 0 === l % 2 ? 0 : 1, c = c.i; c.next();) if (l = + c.value, !(1 < l.Of || a.isFixed(l))) { + for (var p = null, q = l.edges.i; q.next();) { + p = q.value; + break + } + var q = l.width, r = l.height, q = K.sqrt(q * q + r * r) / 2, p = f + p.length + q, + q = h + (m * (k / 2 >> 1) + n) * (0 === k % 2 ? 1 : -1); + l.Ja = d + p * Math.cos(q); + l.Ua = e + p * Math.sin(q); + k++ + } + } + } + + function yp(a, b, c, d, e, f, h) { + var k = 9E19, l = -1, m = 0; + a:for (; m < b; m++) { + var n = a[m], p = n.x - c, q = n.y - d, p = p * p + q * q; + if (p < k) { + for (q = m - 1; 0 <= q; q--) if (a[q].y > n.y && a[q].x - n.x < e + h.width) continue a; + for (q = m + 1; q < b; q++) if (a[q].x > n.x && a[q].y - n.y < f + h.height) continue a; + l = m; + k = p + } + } + return l + } + + vp.prototype.Ny = function () { + if (this.comments) for (var a = this.network.vertexes.i; a.next();) this.addComments(a.value) + }; + vp.prototype.addComments = function (a) { + var b = a.Cc; + if (null !== b) for (b = b.rD(); b.next();) { + var c = b.value; + if ("Comment" === c.Kc && c.Ea()) { + var d = this.network.Am(c); + null === d && (d = this.network.ds(c)); + d.charge = this.lG; + for (var c = null, e = d.bc; e.next();) { + var f = e.value; + if (f.toVertex === a) { + c = f; + break + } + } + if (null === c) for (e = d.kc; e.next();) if (f = e.value, f.fromVertex === a) { + c = f; + break + } + null === c && (c = this.network.No(a, d, null)); + c.length = this.mG + } + } + }; + + function Gp(a, b) { + var c = a.aa, d = c.x, e = c.y, f = c.width, c = c.height, h = b.aa, k = h.x, l = h.y, m = h.width, + h = h.height; + return d + f < k ? e > l + h ? (d = d + f - k, e = e - l - h, K.sqrt(d * d + e * e)) : e + c < l ? (d = d + f - k, e = e + c - l, K.sqrt(d * d + e * e)) : k - (d + f) : d > k + m ? e > l + h ? (d = d - k - m, e = e - l - h, K.sqrt(d * d + e * e)) : e + c < l ? (d = d - k - m, e = e + c - l, K.sqrt(d * d + e * e)) : d - (k + m) : e > l + h ? e - (l + h) : e + c < l ? l - (e + c) : .1 + } + + function zp(a, b) { + a.ig = null; + for (var c = a.vq + b; a.vq < c && (a.vq++, Hp(a));) ; + a.ig = null + } + + function Hp(a) { + null === a.ig && (a.ig = new E(Dp), a.ig.Td(a.network.vertexes)); + var b = a.ig.n; + if (0 >= b.length) return !1; + var c = b[0]; + c.forceX = 0; + c.forceY = 0; + for (var d = c.Ja, e = d, f = c.Ua, h = f, c = 1; c < b.length; c++) { + var k = b[c]; + k.forceX = 0; + k.forceY = 0; + var l = k.Ja, k = k.Ua, d = Math.min(d, l), e = Math.max(e, l), f = Math.min(f, k), h = Math.max(h, k) + } + (f = e - d > h - f) ? b.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : a.Ja - b.Ja + }) : b.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : a.Ua - b.Ua + }); + for (var h = a.yh, m = 0, n = 0, p = 0, c = 0; c < b.length; c++) { + var k = + b[c], l = k.aa, q = k.M, d = l.x + q.x, l = l.y + q.y, n = k.charge * a.electricalFieldX(d, l), + p = k.charge * a.electricalFieldY(d, l), n = n + k.mass * a.gravitationalFieldX(d, l), + p = p + k.mass * a.gravitationalFieldY(d, l); + k.forceX += n; + k.forceY += p; + for (q = c + 1; q < b.length; q++) if (e = b[q], e !== k) { + var r = e.aa, n = e.M, p = r.x + n.x, r = r.y + n.y; + if (d - p > h || p - d > h) { + if (f) break + } else if (l - r > h || r - l > h) { + if (!f) break + } else { + var s = Gp(k, e); + 1 > s ? (n = a.xw, null === n && (a.xw = n = new Ga(0)), m = n.random(), s = n.random(), d > p ? (n = Math.abs(e.aa.right - k.aa.x), n = (1 + n) * m) : d < p ? (n = Math.abs(e.aa.x - + k.aa.right), n = -(1 + n) * m) : (n = Math.max(e.width, k.width), n = (1 + n) * m - n / 2), l > r ? (p = Math.abs(e.aa.bottom - k.aa.y), p = (1 + p) * s) : d < p ? (p = Math.abs(e.aa.y - k.aa.bottom), p = -(1 + p) * s) : (p = Math.max(e.height, k.height), p = (1 + p) * s - p / 2)) : (m = -(k.charge * e.charge) / (s * s), n = (p - d) / s * m, p = (r - l) / s * m); + k.forceX += n; + k.forceY += p; + e.forceX -= n; + e.forceY -= p + } + } + } + for (c = a.network.edges.i; c.next();) f = c.value, k = f.fromVertex, e = f.toVertex, l = k.aa, q = k.M, d = l.x + q.x, l = l.y + q.y, r = e.aa, n = e.M, p = r.x + n.x, r = r.y + n.y, s = Gp(k, e), 1 > s ? (n = a.xw, null === n && (a.xw = n = new Ga(0)), + m = n.random(), s = n.random(), n = (d > p ? 1 : -1) * (1 + (e.width > k.width) ? e.width : k.width) * m, p = (l > r ? 1 : -1) * (1 + (e.height > k.height) ? e.height : k.height) * s) : (m = f.stiffness * (s - f.length), n = (p - d) / s * m, p = (r - l) / s * m), k.forceX += n, k.forceY += p, e.forceX -= n, e.forceY -= p; + c = 0; + d = Math.max(a.yh / 20, 50); + for (e = 0; e < b.length; e++) k = b[e], a.isFixed(k) ? a.moveFixedVertex(k) : (f = k.forceX, h = k.forceY, f < -d ? f = -d : f > d && (f = d), h < -d ? h = -d : h > d && (h = d), k.Ja += f, k.Ua += h, c = Math.max(c, f * f + h * h)); + return c > a.oD * a.oD + } + + vp.prototype.moveFixedVertex = function () { + }; + vp.prototype.commitLayout = function () { + this.cA(); + this.commitNodes(); + this.Qs && this.commitLinks() + }; + vp.prototype.cA = function () { + if (this.fp) for (var a = this.network.edges.i; a.next();) { + var b = a.value.link; + null !== b && (b.vb = uc, b.xb = uc) + } + }; + vp.prototype.commitNodes = function () { + var a = 0, b = 0; + if (this.PF) { + var c = u.Sf(); + this.kg(this.network, c); + b = this.Ud; + a = b.x - c.x; + b = b.y - c.y; + u.ic(c) + } + for (var c = u.Sf(), d = this.network.vertexes.i; d.next();) { + var e = d.value; + if (0 !== a || 0 !== b) c.assign(e.kb), c.x += a, c.y += b, e.kb = c; + e.commit() + } + u.ic(c) + }; + vp.prototype.commitLinks = function () { + for (var a = this.network.edges.i; a.next();) a.value.commit() + }; + vp.prototype.springStiffness = function (a) { + a = a.stiffness; + return isNaN(a) ? this.mn : a + }; + vp.prototype.springLength = function (a) { + a = a.length; + return isNaN(a) ? this.ln : a + }; + vp.prototype.electricalCharge = function (a) { + a = a.charge; + return isNaN(a) ? this.hn : a + }; + vp.prototype.electricalFieldX = function () { + return 0 + }; + vp.prototype.electricalFieldY = function () { + return 0 + }; + vp.prototype.gravitationalMass = function (a) { + a = a.mass; + return isNaN(a) ? this.kn : a + }; + vp.prototype.gravitationalFieldX = function () { + return 0 + }; + vp.prototype.gravitationalFieldY = function () { + return 0 + }; + vp.prototype.isFixed = function (a) { + return a.isFixed + }; + u.u(vp, {gJ: "currentIteration"}, function () { + return this.vq + }); + u.defineProperty(vp, {QC: "arrangementSpacing"}, function () { + return this.Uf + }, function (a) { + u.C(a, ia, vp, "arrangementSpacing"); + this.Uf.L(a) || (this.Uf.assign(a), this.H()) + }); + u.defineProperty(vp, {PF: "arrangesToOrigin"}, function () { + return this.xp + }, function (a) { + this.xp !== a && (u.j(a, "boolean", vp, "arrangesToOrigin"), this.xp = a, this.H()) + }); + u.defineProperty(vp, {fp: "setsPortSpots"}, function () { + return this.Eh + }, function (a) { + this.Eh !== a && (u.j(a, "boolean", vp, "setsPortSpots"), this.Eh = a, this.H()) + }); + u.defineProperty(vp, {comments: "comments"}, function () { + return this.oh + }, function (a) { + this.oh !== a && (u.j(a, "boolean", vp, "comments"), this.oh = a, this.H()) + }); + u.defineProperty(vp, {Az: "maxIterations"}, function () { + return this.On + }, function (a) { + this.On !== a && (u.j(a, "number", vp, "maxIterations"), 0 <= a && (this.On = a, this.H())) + }); + u.defineProperty(vp, {oD: "epsilonDistance"}, function () { + return this.Up + }, function (a) { + this.Up !== a && (u.j(a, "number", vp, "epsilonDistance"), 0 < a && (this.Up = a, this.H())) + }); + u.defineProperty(vp, {AJ: "infinityDistance"}, function () { + return this.yh + }, function (a) { + this.yh !== a && (u.j(a, "number", vp, "infinityDistance"), 1 < a && (this.yh = a, this.H())) + }); + u.defineProperty(vp, {xw: "randomNumberGenerator"}, function () { + return this.mr + }, function (a) { + this.mr !== a && (null !== a && "function" !== typeof a.random && u.k('ForceDirectedLayout.randomNumberGenerator must have a "random()" function on it: ' + a), this.mr = a) + }); + u.defineProperty(vp, {tJ: "defaultSpringStiffness"}, function () { + return this.mn + }, function (a) { + this.mn !== a && (u.j(a, "number", vp, "defaultSpringStiffness"), this.mn = a, this.H()) + }); + u.defineProperty(vp, {sJ: "defaultSpringLength"}, function () { + return this.ln + }, function (a) { + this.ln !== a && (u.j(a, "number", vp, "defaultSpringLength"), this.ln = a, this.H()) + }); + u.defineProperty(vp, {mJ: "defaultElectricalCharge"}, function () { + return this.hn + }, function (a) { + this.hn !== a && (u.j(a, "number", vp, "defaultElectricalCharge"), this.hn = a, this.H()) + }); + u.defineProperty(vp, {nJ: "defaultGravitationalMass"}, function () { + return this.kn + }, function (a) { + this.kn !== a && (u.j(a, "number", vp, "defaultGravitationalMass"), this.kn = a, this.H()) + }); + u.defineProperty(vp, {mG: "defaultCommentSpringLength"}, function () { + return this.Op + }, function (a) { + this.Op !== a && (u.j(a, "number", vp, "defaultCommentSpringLength"), this.Op = a, this.H()) + }); + u.defineProperty(vp, {lG: "defaultCommentElectricalCharge"}, function () { + return this.Np + }, function (a) { + this.Np !== a && (u.j(a, "number", vp, "defaultCommentElectricalCharge"), this.Np = a, this.H()) + }); + + function Fp() { + this.rA = this.qA = this.Rw = this.Vw = this.Sw = 0 + } + + function wp() { + xa.call(this) + } + + u.Ga(wp, xa); + u.fa("ForceDirectedNetwork", wp); + wp.prototype.createVertex = function () { + return new Dp + }; + wp.prototype.createEdge = function () { + return new Ip + }; + + function Dp() { + ya.call(this); + this.isFixed = !1; + this.mass = this.charge = NaN; + this.Rj = this.Of = this.forceY = this.forceX = 0; + this.hh = this.rm = null; + this.Yz = 0 + } + + u.Ga(Dp, ya); + u.fa("ForceDirectedVertex", Dp); + + function Ip() { + Aa.call(this); + this.length = this.stiffness = NaN + } + + u.Ga(Ip, Aa); + u.fa("ForceDirectedEdge", Ip); + + function Yl() { + 0 < arguments.length && u.Wc(Yl); + Je.call(this); + this.sd = this.Ql = 25; + this.la = 0; + this.gn = Op; + this.Mn = Sp; + this.Bn = Tp; + this.Nl = 4; + this.Wm = Up; + this.oi = Vp; + this.Eh = !0; + this.gj = 4; + this.Hb = this.Fu = this.jb = -1; + this.Cf = this.Nq = 0; + this.Kb = this.Bf = this.$f = this.Lg = this.Ld = null; + this.Uq = 0; + this.Tq = this.Sl = null; + this.cg = 0; + this.Vq = null; + this.Ng = []; + this.Ng.length = 100 + } + + u.Ga(Yl, Je); + u.fa("LayeredDigraphLayout", Yl); + Yl.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.Ql = this.Ql; + a.sd = this.sd; + a.la = this.la; + a.gn = this.gn; + a.Mn = this.Mn; + a.Bn = this.Bn; + a.Nl = this.Nl; + a.Wm = this.Wm; + a.oi = this.oi; + a.Eh = this.Eh; + a.gj = this.gj + }; + Yl.prototype.createNetwork = function () { + return new Wp + }; + Yl.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + this.Ud = this.initialOrigin(this.Ud); + this.Fu = -1; + this.Cf = this.Nq = 0; + this.Vq = this.Tq = this.Sl = null; + for (a = 0; a < this.Ng.length; a++) this.Ng[a] = null; + if (0 < this.network.vertexes.count) { + this.network.Qv(); + for (a = this.network.edges.i; a.next();) a.value.rev = !1; + switch (this.gn) { + default: + case Xp: + var b = 0, c = this.network.vertexes.count - + 1; + a = []; + a.length = c + 1; + for (var d = this.network.vertexes.i; d.next();) d.value.valid = !0; + for (; null !== Yp(this.network);) { + for (d = Zp(this.network); null !== d;) a[c] = d, c--, d.valid = !1, d = Zp(this.network); + for (d = $p(this.network); null !== d;) a[b] = d, b++, d.valid = !1, d = $p(this.network); + for (var d = null, e = 0, f = this.network.vertexes.i; f.next();) { + var h = f.value; + if (h.valid) { + for (var k = 0, l = h.bc; l.next();) l.value.toVertex.valid && k++; + for (var l = 0, m = h.kc; m.next();) m.value.fromVertex.valid && l++; + if (null === d || e < k - l) d = h, e = k - l + } + } + null !== d && (a[b] = + d, b++, d.valid = !1) + } + for (b = 0; b < this.network.vertexes.count; b++) a[b].index = b; + for (a = this.network.edges.i; a.next();) b = a.value, b.fromVertex.index > b.toVertex.index && (this.network.yw(b), b.rev = !0); + break; + case Op: + for (b = this.network.vertexes.i; b.next();) a = b.value, a.wo = -1, a.finish = -1; + for (a = this.network.edges.i; a.next();) a.value.forest = !1; + this.Uq = 0; + for (b.reset(); b.next();) c = b.value, 0 === c.kc.count && aq(this, c); + for (b.reset(); b.next();) c = b.value, -1 === c.wo && aq(this, c); + for (a.reset(); a.next();) b = a.value, b.forest || (c = b.fromVertex, + d = c.finish, e = b.toVertex, f = e.finish, e.wo < c.wo && d < f && (this.network.yw(b), b.rev = !0)) + } + for (a = this.network.vertexes.i; a.next();) a.value.layer = -1; + this.jb = -1; + this.assignLayers(); + for (a.reset(); a.next();) this.jb = Math.max(this.jb, a.value.layer); + a = []; + for (c = this.network.edges.i; c.next();) b = c.value, b.valid = !1, a.push(b); + for (c = 0; c < a.length; c++) if (b = a[c], !b.valid && (null !== b.fromVertex.kd && null !== b.toVertex.kd || b.fromVertex.layer !== b.toVertex.layer)) { + l = h = k = f = 0; + e = b.fromVertex; + d = b.toVertex; + if (null !== b.link) { + k = b.link; + if (null === k) continue; + var n = e.kd, f = d.kd; + if (null === n || null === f) continue; + var p = k.W, h = k.ca, q = k.od, l = k.fe; + b.rev && (k = p, m = q, p = h, q = l, h = k, l = m); + var r = e.M, k = b.toVertex.M, s = b.rev ? d.aa : e.aa, m = u.K(); + s.J() ? (On(p, q, Ib, m), m.J() || m.assign(r)) : m.assign(r); + n !== p && s.J() && p.Ea() && (n = e.aa, n.J() && (m.x += s.x - n.x, m.y += s.y - n.y)); + p = b.rev ? e.aa : d.aa; + n = u.K(); + p.J() ? (On(h, l, Ib, n), n.J() || n.assign(k)) : n.assign(k); + f !== h && p.J() && h.Ea() && (f = d.aa, f.J() && (n.x += p.x - f.x, n.y += p.y - f.y)); + 90 === this.la || 270 === this.la ? (f = Math.round((m.x - r.x) / this.sd), + h = m.x, k = Math.round((n.x - k.x) / this.sd), l = n.x) : (f = Math.round((m.y - r.y) / this.sd), h = m.y, k = Math.round((n.y - k.y) / this.sd), l = n.y); + u.v(m); + u.v(n); + b.portFromColOffset = f; + b.portFromPos = h; + b.portToColOffset = k; + b.portToPos = l + } else b.portFromColOffset = 0, b.portFromPos = 0, b.portToColOffset = 0, b.portToPos = 0; + m = e.layer; + r = d.layer; + n = b; + p = 0; + s = n.link; + if (null !== s) { + var t = s.od, v = s.fe; + if (null !== t && null !== v) { + var x = s.W, q = s.ca; + if (null !== x && null !== q) { + var B = t.vb, y = v.xb; + this.fp || (s.vb.Lc() || (B = s.vb), s.xb.Lc() || (y = s.xb)); + if (B.Lc() || B === + vb) B = bq(this, !0); + if (y.Lc() || y === vb) y = bq(this, !1); + var C = s.dc, I = s.getLinkPoint(x, t, B, !0, C, q, v, u.K()), + B = s.getLinkDirection(x, t, I, B, !0, C, q, v); + u.v(I); + B === cq(this, n, !0) ? p += 1 : this.fp && null !== x && 1 === x.ports.count && n.rev && (p += 1); + I = s.getLinkPoint(q, v, y, !1, C, x, t, u.K()); + s = s.getLinkDirection(q, v, I, y, !1, C, x, t); + u.v(I); + s === cq(this, n, !1) ? p += 2 : this.fp && null !== q && 1 === q.ports.count && n.rev && (p += 2) + } + } + } + n = 1 === p || 3 === p ? !0 : !1; + if (p = 2 === p || 3 === p ? !0 : !1) q = this.network.createVertex(), q.kd = null, q.om = 1, q.layer = m, q.near = e, this.network.Mk(q), + e = this.network.No(e, q, b.link), e.valid = !1, e.rev = b.rev, e.portFromColOffset = f, e.portToColOffset = 0, e.portFromPos = h, e.portToPos = 0, e = q; + s = 1; + n && s--; + if (m - r > s && 0 < m) { + b.valid = !1; + q = this.network.createVertex(); + q.kd = null; + q.om = 2; + q.layer = m - 1; + this.network.Mk(q); + e = this.network.No(e, q, b.link); + e.valid = !0; + e.rev = b.rev; + e.portFromColOffset = p ? 0 : f; + e.portToColOffset = 0; + e.portFromPos = p ? 0 : h; + e.portToPos = 0; + e = q; + for (m--; m - r > s && 0 < m;) q = this.network.createVertex(), q.kd = null, q.om = 3, q.layer = m - 1, this.network.Mk(q), e = this.network.No(e, q, + b.link), e.valid = !0, e.rev = b.rev, e.portFromColOffset = 0, e.portToColOffset = 0, e.portFromPos = 0, e.portToPos = 0, e = q, m--; + e = this.network.No(q, d, b.link); + e.valid = !n; + n && (q.near = d); + e.rev = b.rev; + e.portFromColOffset = 0; + e.portToColOffset = k; + e.portFromPos = 0; + e.portToPos = l + } else b.valid = !0 + } + b = this.Ld = []; + for (c = 0; c <= this.jb; c++) b[c] = 0; + for (a = this.network.vertexes.i; a.next();) c = a.value, c.index = -1; + this.initializeIndices(); + this.Fu = -1; + for (c = this.Cf = this.Nq = 0; c <= this.jb; c++) b[c] > b[this.Cf] && (this.Fu = b[c] - 1, this.Cf = c), b[c] < b[this.Nq] && + (this.Nq = c); + this.Vq = []; + for (c = 0; c < b.length; c++) this.Vq[c] = []; + for (a.reset(); a.next();) b = a.value, c = this.Vq[b.layer], c[b.index] = b; + this.Hb = -1; + for (a = 0; a <= this.jb; a++) { + b = dq(this, a); + c = 0; + d = this.Ld[a]; + for (e = 0; e < d; e++) f = b[e], c += this.nodeMinColumnSpace(f, !0), f.column = c, c += 1, c += this.nodeMinColumnSpace(f, !1); + this.Hb = Math.max(this.Hb, c - 1); + eq(this, a, b) + } + this.reduceCrossings(); + this.straightenAndPack(); + this.updateParts() + } + this.network = null; + this.vf = !0 + }; + Yl.prototype.linkMinLength = function (a) { + var b = a.toVertex, c = 0; + for (a = a.fromVertex.bc; a.next();) a.value.toVertex === b && c++; + return 1 < c ? 2 : 1 + }; + + function fq(a) { + var b = a.fromVertex.kd; + a = a.toVertex.kd; + return null === b && null === a ? 8 : null === b || null === a ? 4 : 1 + } + + Yl.prototype.nodeMinLayerSpace = function (a, b) { + return null === a.kd ? 0 : 90 === this.la || 270 === this.la ? b ? a.M.y + 10 : a.aa.height - a.M.y + 10 : b ? a.M.x + 10 : a.aa.width - a.M.x + 10 + }; + Yl.prototype.nodeMinColumnSpace = function (a, b) { + if (null === a.kd) return 0; + var c = b ? a.Iz : a.Hz; + if (null !== c) return c; + c = this.la; + return 90 === c || 270 === c ? b ? a.Iz = a.M.x / this.sd + 1 | 0 : a.Hz = (a.aa.width - a.M.x) / this.sd + 1 | 0 : b ? a.Iz = a.M.y / this.sd + 1 | 0 : a.Hz = (a.aa.height - a.M.y) / this.sd + 1 | 0 + }; + + function gq(a) { + null === a.Sl && (a.Sl = []); + for (var b = 0, c = a.network.vertexes.i; c.next();) { + var d = c.value; + a.Sl[b] = d.layer; + b++; + a.Sl[b] = d.column; + b++; + a.Sl[b] = d.index; + b++ + } + return a.Sl + } + + function hq(a, b) { + for (var c = 0, d = a.network.vertexes.i; d.next();) { + var e = d.value; + e.layer = b[c]; + c++; + e.column = b[c]; + c++; + e.index = b[c]; + c++ + } + } + + function iq(a, b, c) { + var d = dq(a, b), e = a.Ld[b]; + if (null === a.Tq || a.Tq.length < e * e) a.Tq = []; + for (var f = a.Tq, h = 0; h < e; h++) { + var k = 0, l = d[h], m = l.near, n = 0; + if (null !== m && m.layer === l.layer) if (n = m.index, n > h) for (var p = h + 1; p < n; p++) l = d[p], l.near === m && l.om === m.om || k++; else for (p = h - 1; p > n; p--) l = d[p], l.near === m && l.om === m.om || k++; + var m = 0, q, r = q = p = l = 0, s, t = 0, v = 0; + s = 0; + var x; + if (0 <= c) for (n = d[h].Ie, m = 0; m < n.count; m++) if (q = n.n[m], q.valid && q.fromVertex.layer !== b) for (l = q.fromVertex.index, p = q.portToPos, q = q.portFromPos, r = m + 1; r < n.count; r++) s = + n.n[r], s.valid && s.fromVertex.layer !== b && (t = s.fromVertex.index, v = s.portToPos, s = s.portFromPos, p < v && (l > t || l === t && q > s) && k++, v < p && (t > l || t === l && s > q) && k++); + if (0 >= c) for (n = d[h].Ce, m = 0; m < n.count; m++) if (q = n.n[m], q.valid && q.toVertex.layer !== b) for (l = q.toVertex.index, p = q.portToPos, q = q.portFromPos, r = m + 1; r < n.count; r++) s = n.n[r], s.valid && s.toVertex.layer !== b && (t = s.toVertex.index, v = s.portToPos, s = s.portFromPos, q < s && (l > t || l === t && p > v) && k++, s < q && (t > l || t === l && v > p) && k++); + f[h * e + h] = k; + for (n = h + 1; n < e; n++) { + var B = 0, y = 0; + if (0 <= c) for (k = + d[h].Ie, x = d[n].Ie, m = 0; m < k.count; m++) if (q = k.n[m], q.valid && q.fromVertex.layer !== b) for (l = q.fromVertex.index, q = q.portFromPos, r = 0; r < x.count; r++) s = x.n[r], s.valid && s.fromVertex.layer !== b && (t = s.fromVertex.index, s = s.portFromPos, (l < t || l === t && q < s) && y++, (t < l || t === l && s < q) && B++); + if (0 >= c) for (k = d[h].Ce, x = d[n].Ce, m = 0; m < k.count; m++) if (q = k.n[m], q.valid && q.toVertex.layer !== b) for (l = q.toVertex.index, p = q.portToPos, r = 0; r < x.count; r++) s = x.n[r], s.valid && s.toVertex.layer !== b && (t = s.toVertex.index, v = s.portToPos, (l < t || l === t && p < + v) && y++, (t < l || t === l && v < p) && B++); + f[h * e + n] = B; + f[n * e + h] = y + } + } + eq(a, b, d); + return f + } + + Yl.prototype.countCrossings = function () { + for (var a = 0, b = 0; b <= this.jb; b++) for (var c = iq(this, b, 1), d = this.Ld[b], e = 0; e < d; e++) for (var f = e; f < d; f++) a += c[e * d + f]; + return a + }; + + function jq(a) { + for (var b = 0, c = 0; c <= a.jb; c++) { + for (var d = a, e = c, f = dq(d, e), h = d.Ld[e], k = 0, l = 0; l < h; l++) { + var m = null, m = f[l].Ce, n, p = 0, q = 0; + if (null !== m) for (var r = 0; r < m.count; r++) n = m.n[r], n.valid && n.toVertex.layer !== e && (p = n.fromVertex.column + n.portFromColOffset, q = n.toVertex.column + n.portToColOffset, k += (Math.abs(p - q) + 1) * fq(n)) + } + eq(d, e, f); + b += k + } + return b + } + + Yl.prototype.normalize = function () { + var a = Infinity; + this.Hb = -1; + for (var b = this.network.vertexes.i; b.next();) { + var c = b.value, a = Math.min(a, c.column - this.nodeMinColumnSpace(c, !0)); + this.Hb = Math.max(this.Hb, c.column + this.nodeMinColumnSpace(c, !1)) + } + for (b.reset(); b.next();) b.value.column -= a; + this.Hb -= a + }; + + function kq(a, b, c) { + for (var d = dq(a, b), e = a.Ld[b], f = [], h = 0; h < e; h++) { + var k = d[h], l = null; + 0 >= c && (l = k.Ie); + var m = null; + 0 <= c && (m = k.Ce); + var n = 0, p = 0, q = k.near; + null !== q && q.layer === k.layer && (n += q.column - 1, p++); + if (null !== l) for (q = 0; q < l.count; q++) { + var k = l.n[q], r = k.fromVertex; + k.valid && !k.rev && r.layer !== b && (n += r.column + k.portFromColOffset, p++) + } + if (null !== m) for (l = 0; l < m.count; l++) k = m.n[l], q = k.toVertex, k.valid && !k.rev && q.layer !== b && (n += q.column + k.portToColOffset, p++); + f[h] = 0 === p ? -1 : n / p + } + eq(a, b, d); + return f + } + + function lq(a, b, c) { + for (var d = dq(a, b), e = a.Ld[b], f = [], h = 0; h < e; h++) { + var k = d[h], l = null; + 0 >= c && (l = k.Ie); + var m = null; + 0 <= c && (m = k.Ce); + var n = 0, p = [], q = k.near; + null !== q && q.layer === k.layer && (p[n] = q.column - 1, n++); + if (null !== l) for (q = 0; q < l.count; q++) { + var k = l.n[q], r = k.fromVertex; + k.valid && !k.rev && r.layer !== b && (p[n] = r.column + k.portFromColOffset, n++) + } + if (null !== m) for (l = 0; l < m.count; l++) k = m.n[l], q = k.toVertex, k.valid && !k.rev && q.layer !== b && (p[n] = q.column + k.portToColOffset, n++); + 0 === n ? f[h] = -1 : (p.sort(function (a, b) { + return a - b + }), + m = n >> 1, f[h] = n & 1 ? p[m] : p[m - 1] + p[m] >> 1) + } + eq(a, b, d); + return f + } + + function mq(a, b, c, d, e, f) { + if (b.component === d) { + b.component = c; + var h = 0, k = 0; + if (e) for (var l = b.bc; l.next();) { + var k = l.value, m = k.toVertex, h = b.layer - m.layer, k = a.linkMinLength(k); + h === k && mq(a, m, c, d, e, f) + } + if (f) for (l = b.kc; l.next();) k = l.value, m = k.fromVertex, h = m.layer - b.layer, k = a.linkMinLength(k), h === k && mq(a, m, c, d, e, f) + } + } + + function nq(a, b, c, d, e, f) { + if (b.component === d) { + b.component = c; + if (e) for (var h = b.bc; h.next();) nq(a, h.value.toVertex, c, d, e, f); + if (f) for (b = b.kc; b.next();) nq(a, b.value.fromVertex, c, d, e, f) + } + } + + function Yp(a) { + for (a = a.vertexes.i; a.next();) { + var b = a.value; + if (b.valid) return b + } + return null + } + + function Zp(a) { + for (a = a.vertexes.i; a.next();) { + var b = a.value; + if (b.valid) { + for (var c = !0, d = b.bc; d.next();) if (d.value.toVertex.valid) { + c = !1; + break + } + if (c) return b + } + } + return null + } + + function $p(a) { + for (a = a.vertexes.i; a.next();) { + var b = a.value; + if (b.valid) { + for (var c = !0, d = b.kc; d.next();) if (d.value.fromVertex.valid) { + c = !1; + break + } + if (c) return b + } + } + return null + } + + function aq(a, b) { + b.wo = a.Uq; + a.Uq++; + for (var c = b.bc; c.next();) { + var d = c.value, e = d.toVertex; + -1 === e.wo && (d.forest = !0, aq(a, e)) + } + b.finish = a.Uq; + a.Uq++ + } + + Yl.prototype.assignLayers = function () { + switch (this.Mn) { + case oq: + pq(this); + break; + case qq: + for (var a = 0, b = this.network.vertexes.i; b.next();) a = rq(this, b.value), this.jb = Math.max(a, this.jb); + for (b.reset(); b.next();) a = b.value, a.layer = this.jb - a.layer; + break; + default: + case Sp: + pq(this); + for (b = this.network.vertexes.i; b.next();) b.value.valid = !1; + for (b.reset(); b.next();) a = b.value, 0 === a.kc.count && sq(this, a); + a = Infinity; + for (b.reset(); b.next();) a = Math.min(a, b.value.layer); + this.jb = -1; + for (b.reset(); b.next();) { + var c = b.value; + c.layer -= + a; + this.jb = Math.max(this.jb, c.layer) + } + } + }; + + function pq(a) { + for (var b = a.network.vertexes.i; b.next();) { + var c = tq(a, b.value); + a.jb = Math.max(c, a.jb) + } + } + + function tq(a, b) { + var c = 0; + if (-1 === b.layer) { + for (var d = b.bc; d.next();) var e = d.value, f = e.toVertex, e = a.linkMinLength(e), c = Math.max(c, tq(a, f) + e); + b.layer = c + } else c = b.layer; + return c + } + + function rq(a, b) { + var c = 0; + if (-1 === b.layer) { + for (var d = b.kc; d.next();) var e = d.value, f = e.fromVertex, e = a.linkMinLength(e), c = Math.max(c, rq(a, f) + e); + b.layer = c + } else c = b.layer; + return c + } + + function sq(a, b) { + if (!b.valid) { + b.valid = !0; + for (var c = b.bc; c.next();) sq(a, c.value.toVertex); + for (c = a.network.vertexes.i; c.next();) c.value.component = -1; + for (var d = b.Ie.n, e = d.length, f = 0; f < e; f++) { + var h = d[f], k = a.linkMinLength(h); + h.fromVertex.layer - h.toVertex.layer > k && mq(a, h.fromVertex, 0, -1, !0, !1) + } + for (mq(a, b, 1, -1, !0, !0); 0 !== b.component;) { + for (var k = 0, d = Infinity, l = 0, m = null, n = a.network.vertexes.i; n.next();) { + var p = n.value; + if (1 === p.component) { + for (var q = 0, r = !1, s = p.Ie.n, e = s.length, f = 0; f < e; f++) { + var h = s[f], t = h.fromVertex, + q = q + 1; + 1 !== t.component && (k += 1, t = t.layer - p.layer, h = a.linkMinLength(h), d = Math.min(d, t - h)) + } + h = p.Ce.n; + e = h.length; + for (f = 0; f < e; f++) s = h[f].toVertex, q -= 1, 1 !== s.component ? k -= 1 : r = !0; + (null === m || q < l) && !r && (m = p, l = q) + } + } + if (0 < k) { + for (c.reset(); c.next();) e = c.value, 1 === e.component && (e.layer += d); + b.component = 0 + } else m.component = 0 + } + for (c = a.network.vertexes.i; c.next();) c.value.component = -1; + for (mq(a, b, 1, -1, !0, !1); 0 !== b.component;) { + f = 0; + e = Infinity; + d = 0; + k = null; + for (l = a.network.vertexes.i; l.next();) if (m = l.value, 1 === m.component) { + n = + 0; + p = !1; + h = m.Ie.n; + q = h.length; + for (r = 0; r < q; r++) s = h[r].fromVertex, n += 1, 1 !== s.component ? f += 1 : p = !0; + h = m.Ce.n; + q = h.length; + for (r = 0; r < q; r++) s = h[r], t = s.toVertex, n -= 1, 1 !== t.component && (f -= 1, t = m.layer - t.layer, s = a.linkMinLength(s), e = Math.min(e, t - s)); + (null === k || n > d) && !p && (k = m, d = n) + } + if (0 > f) { + for (c.reset(); c.next();) f = c.value, 1 === f.component && (f.layer -= e); + b.component = 0 + } else k.component = 0 + } + } + } + + function cq(a, b, c) { + return 90 === a.la ? c && !b.rev || !c && b.rev ? 270 : 90 : 180 === a.la ? c && !b.rev || !c && b.rev ? 0 : 180 : 270 === a.la ? c && !b.rev || !c && b.rev ? 90 : 270 : c && !b.rev || !c && b.rev ? 180 : 0 + } + + Yl.prototype.initializeIndices = function () { + switch (this.Bn) { + default: + case uq: + for (var a = this.network.vertexes.i; a.next();) { + var b = a.value, c = b.layer; + b.index = this.Ld[c]; + this.Ld[c]++ + } + break; + case Tp: + a = this.network.vertexes.i; + for (b = this.jb; 0 <= b; b--) for (a.reset(); a.next();) c = a.value, c.layer === b && -1 === c.index && vq(this, c); + break; + case wq: + for (a = this.network.vertexes.i, b = 0; b <= this.jb; b++) for (a.reset(); a.next();) c = a.value, c.layer === b && -1 === c.index && xq(this, c) + } + }; + + function vq(a, b) { + var c = b.layer; + b.index = a.Ld[c]; + a.Ld[c]++; + for (var c = b.Ce.Ke(), d = !0; d;) for (var d = !1, e = 0; e < c.length - 1; e++) { + var f = c[e], h = c[e + 1]; + f.portFromColOffset > h.portFromColOffset && (d = !0, c[e] = h, c[e + 1] = f) + } + for (e = 0; e < c.length; e++) d = c[e], d.valid && (d = d.toVertex, -1 === d.index && vq(a, d)) + } + + function xq(a, b) { + var c = b.layer; + b.index = a.Ld[c]; + a.Ld[c]++; + for (var c = b.Ie.Ke(), d = !0, e = 0; d;) for (d = !1, e = 0; e < c.length - 1; e++) { + var f = c[e], h = c[e + 1]; + f.portToColOffset > h.portToColOffset && (d = !0, c[e] = h, c[e + 1] = f) + } + for (e = 0; e < c.length; e++) d = c[e], d.valid && (d = d.fromVertex, -1 === d.index && xq(a, d)) + } + + Yl.prototype.reduceCrossings = function () { + for (var a = this.countCrossings(), b = gq(this), c = 0, d = 0, e = 0, c = 0; c < this.Nl; c++) { + for (d = 0; d <= this.jb; d++) yq(this, d, 1), zq(this, d, 1); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)); + for (d = this.jb; 0 <= d; d--) yq(this, d, -1), zq(this, d, -1); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)) + } + hq(this, b); + for (c = 0; c < this.Nl; c++) { + for (d = 0; d <= this.jb; d++) yq(this, d, 0), zq(this, d, 0); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)); + for (d = this.jb; 0 <= d; d--) yq(this, d, 0), zq(this, d, 0); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)) + } + hq(this, b); + var f = !1, h = c = 0, k = 0, d = 0; + switch (this.Wm) { + case Aq: + break; + case Bq: + for (k = a + 1; (d = this.countCrossings()) < k;) for (k = d, c = this.jb; 0 <= c; c--) for (h = 0; h <= c; h++) { + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, -1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, + d = h; d <= c; d++) f = zq(this, d, -1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)) + } + break; + default: + case Up: + for (c = this.jb, h = 0, k = a + 1; (d = this.countCrossings()) < k;) { + k = d; + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, -1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, -1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)) + } + } + hq(this, b) + }; + + function yq(a, b, c) { + var d = 0, e = dq(a, b), f = a.Ld[b], h = lq(a, b, c); + c = kq(a, b, c); + for (d = 0; d < f; d++) -1 === c[d] && (c[d] = e[d].column), -1 === h[d] && (h[d] = e[d].column); + for (var k = !0, l; k;) for (k = !1, d = 0; d < f - 1; d++) if (h[d + 1] < h[d] || h[d + 1] === h[d] && c[d + 1] < c[d]) k = !0, l = h[d], h[d] = h[d + 1], h[d + 1] = l, l = c[d], c[d] = c[d + 1], c[d + 1] = l, l = e[d], e[d] = e[d + 1], e[d + 1] = l; + for (d = h = 0; d < f; d++) l = e[d], l.index = d, h += a.nodeMinColumnSpace(l, !0), l.column = h, h += 1, h += a.nodeMinColumnSpace(l, !1); + eq(a, b, e) + } + + function zq(a, b, c) { + var d = dq(a, b), e = a.Ld[b]; + c = iq(a, b, c); + var f = 0, h; + h = []; + for (f = 0; f < e; f++) h[f] = -1; + var k; + k = []; + for (f = 0; f < e; f++) k[f] = -1; + for (var l = !1, m = !0; m;) for (m = !1, f = 0; f < e - 1; f++) { + var n = c[d[f].index * e + d[f + 1].index], p = c[d[f + 1].index * e + d[f].index], q = 0, r = 0, + s = d[f].column, t = d[f + 1].column, v = a.nodeMinColumnSpace(d[f], !0), + x = a.nodeMinColumnSpace(d[f], !1), B = a.nodeMinColumnSpace(d[f + 1], !0), + y = a.nodeMinColumnSpace(d[f + 1], !1), v = s - v + B, x = t - x + y, B = B = 0, C = d[f].kc.i; + for (C.reset(); C.next();) if (y = C.value, y.valid && y.fromVertex.layer === + b) { + y = y.fromVertex; + for (B = 0; d[B] !== y;) B++; + B < f && (q += 2 * (f - B), r += 2 * (f + 1 - B)); + B === f + 1 && (q += 1); + B > f + 1 && (q += 4 * (B - f), r += 4 * (B - (f + 1))) + } + C = d[f].bc.i; + for (C.reset(); C.next();) if (y = C.value, y.valid && y.toVertex.layer === b) { + y = y.toVertex; + for (B = 0; d[B] !== y;) B++; + B === f + 1 && (r += 1) + } + C = d[f + 1].kc.i; + for (C.reset(); C.next();) if (y = C.value, y.valid && y.fromVertex.layer === b) { + y = y.fromVertex; + for (B = 0; d[B] !== y;) B++; + B < f && (q += 2 * (f + 1 - B), r += 2 * (f - B)); + B === f && (r += 1); + B > f + 1 && (q += 4 * (B - (f + 1)), r += 4 * (B - f)) + } + C = d[f + 1].bc.i; + for (C.reset(); C.next();) if (y = C.value, + y.valid && y.toVertex.layer === b) { + y = y.toVertex; + for (B = 0; d[B] !== y;) B++; + B === f && (q += 1) + } + var B = y = 0, C = h[d[f].index], I = k[d[f].index], H = h[d[f + 1].index], T = k[d[f + 1].index]; + -1 !== C && (y += Math.abs(C - s), B += Math.abs(C - x)); + -1 !== I && (y += Math.abs(I - s), B += Math.abs(I - x)); + -1 !== H && (y += Math.abs(H - t), B += Math.abs(H - v)); + -1 !== T && (y += Math.abs(T - t), B += Math.abs(T - v)); + if (r < q - .5 || r === q && p < n - .5 || r === q && p === n && B < y - .5) m = l = !0, d[f].column = x, d[f + 1].column = v, n = d[f], d[f] = d[f + 1], d[f + 1] = n + } + for (f = 0; f < e; f++) d[f].index = f; + eq(a, b, d); + return l + } + + Yl.prototype.straightenAndPack = function () { + var a = 0, b = !1, c = 0 !== (this.oi & Cq), a = this.oi === Vp; + 1E3 < this.network.edges.count && !a && (c = !1); + if (c) { + b = []; + for (a = a = 0; a <= this.jb; a++) b[a] = 0; + for (var d = 0, e = this.network.vertexes.i; e.next();) { + var f = e.value, a = f.layer, d = f.column, f = this.nodeMinColumnSpace(f, !1); + b[a] = Math.max(b[a], d + f) + } + for (e.reset(); e.next();) f = e.value, a = f.layer, d = f.column, f.column = (8 * (this.Hb - b[a]) >> 1) + 8 * d; + this.Hb *= 8 + } + if (0 !== (this.oi & Dq)) for (b = !0; b;) { + b = !1; + for (a = this.Cf + 1; a <= this.jb; a++) b = Eq(this, a, 1) || b; + for (a = this.Cf - 1; 0 <= a; a--) b = Eq(this, a, -1) || b; + b = Eq(this, this.Cf, 0) || b + } + if (0 !== (this.oi & Fq)) { + for (a = this.Cf + 1; a <= this.jb; a++) Gq(this, a, 1); + for (a = this.Cf - 1; 0 <= a; a--) Gq(this, a, -1); + Gq(this, this.Cf, 0) + } + c && (Hq(this, -1), Hq(this, 1)); + if (0 !== (this.oi & Dq)) for (b = !0; b;) { + b = !1; + b = Eq(this, this.Cf, 0) || b; + for (a = this.Cf + 1; a <= this.jb; a++) b = Eq(this, a, 0) || b; + for (a = this.Cf - 1; 0 <= a; a--) b = Eq(this, a, 0) || b + } + }; + + function Eq(a, b, c) { + for (var d = !1; Iq(a, b, c);) d = !0; + return d + } + + function Iq(a, b, c) { + var d = 0, e = dq(a, b), f = a.Ld[b], h = kq(a, b, -1); + if (0 < c) for (d = 0; d < f; d++) h[d] = -1; + var k = kq(a, b, 1); + if (0 > c) for (d = 0; d < f; d++) k[d] = -1; + for (var l = !1, m = !0; m;) for (m = !1, d = 0; d < f; d++) { + var n = e[d].column, p = a.nodeMinColumnSpace(e[d], !0), q = a.nodeMinColumnSpace(e[d], !1), r = 0, + r = 0 > d - 1 || n - e[d - 1].column - 1 > p + a.nodeMinColumnSpace(e[d - 1], !1) ? n - 1 : n, p = 0, + p = d + 1 >= f || e[d + 1].column - n - 1 > q + a.nodeMinColumnSpace(e[d + 1], !0) ? n + 1 : n, + s = q = 0, t = 0, v = 0, x = 0, B = 0; + if (0 >= c) for (var y = e[d].kc.i; y.next();) { + var C = y.value; + C.valid && C.fromVertex.layer !== + b && (v = fq(C), x = C.portFromColOffset, B = C.portToColOffset, C = C.fromVertex.column, q += (Math.abs(n + B - (C + x)) + 1) * v, s += (Math.abs(r + B - (C + x)) + 1) * v, t += (Math.abs(p + B - (C + x)) + 1) * v) + } + if (0 <= c) for (y = e[d].bc.i; y.next();) C = y.value, C.valid && C.toVertex.layer !== b && (v = fq(C), x = C.portFromColOffset, B = C.portToColOffset, C = C.toVertex.column, q += (Math.abs(n + x - (C + B)) + 1) * v, s += (Math.abs(r + x - (C + B)) + 1) * v, t += (Math.abs(p + x - (C + B)) + 1) * v); + B = x = v = 0; + y = h[e[d].index]; + C = k[e[d].index]; + -1 !== y && (v += Math.abs(y - n), x += Math.abs(y - r), B += Math.abs(y - p)); + -1 !== + C && (v += Math.abs(C - n), x += Math.abs(C - r), B += Math.abs(C - p)); + if (s < q || s === q && x < v) m = l = !0, e[d].column = r; + if (t < q || t === q && B < v) m = l = !0, e[d].column = p + } + eq(a, b, e); + a.normalize(); + return l + } + + function Gq(a, b, c) { + var d = 0, e = dq(a, b), f = a.Ld[b], h = lq(a, b, c); + c = []; + for (d = 0; d < f; d++) c[d] = h[d]; + for (h = !0; h;) for (h = !1, d = 0; d < f; d++) { + var k = e[d].column, l = a.nodeMinColumnSpace(e[d], !0), m = a.nodeMinColumnSpace(e[d], !1), n = 0, p = 0, + q = 0, q = p = 0; + -1 === c[d] ? 0 === d && d === f - 1 ? n = k : 0 === d ? (p = e[d + 1].column, n = p - k === m + a.nodeMinColumnSpace(e[d + 1], !0) ? k - 1 : k) : d === f - 1 ? (q = e[d - 1].column, n = k - q === l + a.nodeMinColumnSpace(e[d - 1], !1) ? k + 1 : k) : (q = e[d - 1].column, q = q + a.nodeMinColumnSpace(e[d - 1], !1) + l + 1, p = e[d + 1].column, p = p - a.nodeMinColumnSpace(e[d + + 1], !0) - m - 1, n = (q + p) / 2 | 0) : 0 === d && d === f - 1 ? n = c[d] : 0 === d ? (p = e[d + 1].column, p = p - a.nodeMinColumnSpace(e[d + 1], !0) - m - 1, n = Math.min(c[d], p)) : d === f - 1 ? (q = e[d - 1].column, q = q + a.nodeMinColumnSpace(e[d - 1], !1) + l + 1, n = Math.max(c[d], q)) : (q = e[d - 1].column, q = q + a.nodeMinColumnSpace(e[d - 1], !1) + l + 1, p = e[d + 1].column, p = p - a.nodeMinColumnSpace(e[d + 1], !0) - m - 1, q < c[d] && c[d] < p ? n = c[d] : q >= c[d] ? n = q : p <= c[d] && (n = p)); + n !== k && (h = !0, e[d].column = n) + } + eq(a, b, e); + a.normalize() + } + + function Jq(a, b) { + for (var c = !0, d = a.network.vertexes.i; d.next();) { + var e = d.value, f = a.nodeMinColumnSpace(e, !0), h = a.nodeMinColumnSpace(e, !1); + if (e.column - f <= b && e.column + h >= b) { + c = !1; + break + } + } + e = !1; + if (c) for (d.reset(); d.next();) c = d.value, c.column > b && (c.column -= 1, e = !0); + return e + } + + function Kq(a, b) { + for (var c = b, c = b + 1, d = 0, e = [], f = [], d = 0; d <= a.jb; d++) e[d] = !1, f[d] = !1; + for (var h = a.network.vertexes.i; h.next();) { + var d = h.value, k = d.column - a.nodeMinColumnSpace(d, !0), l = d.column + a.nodeMinColumnSpace(d, !1); + k <= b && l >= b && (e[d.layer] = !0); + k <= c && l >= c && (f[d.layer] = !0) + } + k = !0; + c = !1; + for (d = 0; d <= a.jb; d++) k = k && !(e[d] && f[d]); + if (k) for (h.reset(); h.next();) e = h.value, e.column > b && (e.column -= 1, c = !0); + return c + } + + function Hq(a, b) { + for (var c = 0; c <= a.Hb; c++) for (; Jq(a, c);) ; + a.normalize(); + for (c = 0; c < a.Hb; c++) for (; Kq(a, c);) ; + a.normalize(); + var c = 0, d, e = 0, f = 0, h = 0; + if (0 < b) for (c = 0; c <= a.Hb; c++) for (d = gq(a), e = jq(a), f = e + 1; e < f;) f = e, Lq(a, c, 1), h = jq(a), h > e ? hq(a, d) : h < e && (e = h, d = gq(a)); + if (0 > b) for (c = a.Hb; 0 <= c; c--) for (d = gq(a), e = jq(a), f = e + 1; e < f;) f = e, Lq(a, c, -1), h = jq(a), h > e ? hq(a, d) : h < e && (e = h, d = gq(a)); + a.normalize() + } + + function Lq(a, b, c) { + a.cg = 0; + for (var d = a.network.vertexes.i; d.next();) d.value.component = -1; + if (0 < c) for (d.reset(); d.next();) { + var e = d.value; + e.column - a.nodeMinColumnSpace(e, !0) <= b && (e.component = a.cg) + } + if (0 > c) for (d.reset(); d.next();) e = d.value, e.column + a.nodeMinColumnSpace(e, !1) >= b && (e.component = a.cg); + a.cg++; + for (d.reset(); d.next();) b = d.value, -1 === b.component && (nq(a, b, a.cg, -1, !0, !0), a.cg++); + var f = 0; + b = []; + for (f = 0; f < a.cg * a.cg; f++) b[f] = !1; + e = []; + for (f = 0; f < (a.jb + 1) * (a.Hb + 1); f++) e[f] = -1; + for (d.reset(); d.next();) for (var f = + d.value, h = f.layer, k = Math.max(0, f.column - a.nodeMinColumnSpace(f, !0)), l = Math.min(a.Hb, f.column + a.nodeMinColumnSpace(f, !1)); k <= l; k++) e[h * (a.Hb + 1) + k] = f.component; + for (f = 0; f <= a.jb; f++) { + if (0 < c) for (k = 0; k < a.Hb; k++) -1 !== e[f * (a.Hb + 1) + k] && -1 !== e[f * (a.Hb + 1) + k + 1] && e[f * (a.Hb + 1) + k] !== e[f * (a.Hb + 1) + k + 1] && (b[e[f * (a.Hb + 1) + k] * a.cg + e[f * (a.Hb + 1) + k + 1]] = !0); + if (0 > c) for (k = a.Hb; 0 < k; k--) -1 !== e[f * (a.Hb + 1) + k] && -1 !== e[f * (a.Hb + 1) + k - 1] && e[f * (a.Hb + 1) + k] !== e[f * (a.Hb + 1) + k - 1] && (b[e[f * (a.Hb + 1) + k] * a.cg + e[f * (a.Hb + 1) + k - 1]] = !0) + } + e = []; + for (f = + 0; f < a.cg; f++) e[f] = !0; + h = new E("number"); + h.add(0); + for (l = 0; 0 !== h.count;) if (l = h.n[h.count - 1], h.hd(h.count - 1), e[l]) for (e[l] = !1, f = 0; f < a.cg; f++) b[l * a.cg + f] && h.Yd(0, f); + if (0 < c) for (d.reset(); d.next();) a = d.value, e[a.component] && (a.column -= 1); + if (0 > c) for (d.reset(); d.next();) c = d.value, e[c.component] && (c.column += 1) + } + + Yl.prototype.commitLayout = function () { + if (this.fp) for (var a = bq(this, !0), b = bq(this, !1), c = this.network.edges.i; c.next();) { + var d = c.value.link; + null !== d && (d.vb = a, d.xb = b) + } + this.commitNodes(); + this.Sy(); + this.Qs && this.commitLinks() + }; + + function bq(a, b) { + return 270 === a.la ? b ? vc : Cc : 90 === a.la ? b ? Cc : vc : 180 === a.la ? b ? wc : xc : b ? xc : wc + } + + Yl.prototype.commitNodes = function () { + this.Lg = []; + this.$f = []; + this.Bf = []; + this.Kb = []; + for (var a = 0; a <= this.jb; a++) this.Lg[a] = 0, this.$f[a] = 0, this.Bf[a] = 0, this.Kb[a] = 0; + for (a = this.network.vertexes.i; a.next();) { + var b = a.value, c = b.layer; + this.Lg[c] = Math.max(this.Lg[c], this.nodeMinLayerSpace(b, !0)); + this.$f[c] = Math.max(this.$f[c], this.nodeMinLayerSpace(b, !1)) + } + for (var b = 0, d = this.Ql, c = 0; c <= this.jb; c++) { + var e = d; + 0 >= this.Lg[c] + this.$f[c] && (e = 0); + 0 < c && (b += e / 2); + 90 === this.la || 0 === this.la ? (b += this.$f[c], this.Bf[c] = b, b += this.Lg[c]) : + (b += this.Lg[c], this.Bf[c] = b, b += this.$f[c]); + c < this.jb && (b += e / 2); + this.Kb[c] = b + } + d = b; + b = this.Ud; + for (c = 0; c <= this.jb; c++) 270 === this.la ? this.Bf[c] = b.y + this.Bf[c] : 90 === this.la ? (this.Bf[c] = b.y + d - this.Bf[c], this.Kb[c] = d - this.Kb[c]) : 180 === this.la ? this.Bf[c] = b.x + this.Bf[c] : (this.Bf[c] = b.x + d - this.Bf[c], this.Kb[c] = d - this.Kb[c]); + for (a.reset(); a.next();) { + var c = a.value, d = c.layer, e = c.column | 0, f = 0, h = 0; + 270 === this.la || 90 === this.la ? (f = b.x + this.sd * e, h = this.Bf[d]) : (f = this.Bf[d], h = b.y + this.sd * e); + c.Ja = f; + c.Ua = h; + c.commit() + } + }; + Yl.prototype.Sy = function () { + for (var a = 0, b = this.Ql, c = 0; c <= this.jb; c++) a += this.Lg[c], a += this.$f[c]; + for (var a = a + this.jb * b, b = [], c = this.sd * this.Hb, d = this.uH; 0 <= d; d--) 270 === this.la ? 0 === d ? b.push(new z(0, 0, c, Math.abs(this.Kb[0]))) : b.push(new z(0, this.Kb[d - 1], c, Math.abs(this.Kb[d - 1] - this.Kb[d]))) : 90 === this.la ? 0 === d ? b.push(new z(0, this.Kb[0], c, Math.abs(this.Kb[0] - a))) : b.push(new z(0, this.Kb[d], c, Math.abs(this.Kb[d - 1] - this.Kb[d]))) : 180 === this.la ? 0 === d ? b.push(new z(0, 0, Math.abs(this.Kb[0]), c)) : b.push(new z(this.Kb[d - + 1], 0, Math.abs(this.Kb[d - 1] - this.Kb[d]), c)) : 0 === d ? b.push(new z(this.Kb[0], 0, Math.abs(this.Kb[0] - a), c)) : b.push(new z(this.Kb[d], 0, Math.abs(this.Kb[d - 1] - this.Kb[d]), c)); + this.commitLayers(b, K.Wj) + }; + Yl.prototype.commitLayers = function () { + }; + Yl.prototype.commitLinks = function () { + for (var a = this.network.edges.i, b; a.next();) b = a.value.link, null !== b && (b.rl(), b.so(), b.Bi()); + for (a.reset(); a.next();) b = a.value.link, null !== b && b.updateRoute(); + for (a.reset(); a.next();) { + var c = a.value; + b = c.link; + if (null !== b) { + b.rl(); + var d = b, e = d.W, f = d.ca, h = d.od, k = d.fe; + if (c.valid) { + if (b.Ve === kh && 4 === b.ka) { + if (c.rev) var l = e, e = f, f = l, m = h, h = k, k = m; + if (c.fromVertex.column === c.toVertex.column) { + var n = b.getLinkPoint(e, h, b.computeSpot(!0), !0, !1, f, k), + p = b.getLinkPoint(f, k, b.computeSpot(!1), + !1, !1, e, h); + n.J() || n.set(e.ba.Ok); + p.J() || p.set(f.ba.Ok); + b.so(); + b.Lk(n.x, n.y); + b.Lk((2 * n.x + p.x) / 3, (2 * n.y + p.y) / 3); + b.Lk((n.x + 2 * p.x) / 3, (n.y + 2 * p.y) / 3); + b.Lk(p.x, p.y) + } else { + var q = !1, r = !1; + null !== h && b.computeSpot(!0) === vb && (q = !0); + null !== k && b.computeSpot(!1) === vb && (r = !0); + if (q || r) { + var s = b.l(0).x, t = b.l(0).y, v = b.l(1).x, x = b.l(1).y, B = b.l(2).x, y = b.l(2).y, + C = b.l(3).x, I = b.l(3).y; + if (q) { + 90 === this.la || 270 === this.la ? (v = s, x = (t + I) / 2) : (v = (s + C) / 2, x = t); + b.V(1, v, x); + var H = b.getLinkPoint(e, h, b.computeSpot(!0), !0, !1, f, k); + H.J() || H.set(e.ba.Ok); + b.V(0, H.x, H.y) + } + r && (90 === this.la || 270 === this.la ? (B = C, y = (t + I) / 2) : (B = (s + C) / 2, y = I), b.V(2, B, y), H = b.getLinkPoint(f, k, b.computeSpot(!1), !1, !1, e, h), H.J() || H.set(f.ba.Ok), b.V(3, H.x, H.y)) + } + } + } + b.Bi() + } else if (c.fromVertex.layer === c.toVertex.layer) b.Bi(); else { + var T = !1, aa = !1, R = 0, N = b.Bs + 1; + if (b.dc) aa = !0, R = b.ka, 4 < R && b.points.removeRange(2, R - 3); else if (b.Ve === kh) T = !0, R = b.ka, 4 < R && b.points.removeRange(2, R - 3), N = 2; else { + var R = b.ka, Z = b.computeSpot(!0) === vb, Ea = b.computeSpot(!1) === vb; + 2 < R && Z && Ea ? b.points.removeRange(1, R - 2) : 3 < + R && Z && !Ea ? b.points.removeRange(1, R - 3) : 3 < R && !Z && Ea ? b.points.removeRange(2, R - 2) : 4 < R && !Z && !Ea && b.points.removeRange(2, R - 3) + } + var ua = c.fromVertex, Oa = c.toVertex, na, Ca; + if (c.rev) { + for (var ra = 0; null !== Oa && ua !== Oa;) { + Ca = na = null; + for (var dc = Oa.kc.i; dc.next();) { + var ed = dc.value; + if (ed.link === c.link && (na = ed.fromVertex, Ca = ed.toVertex, null === na.kd)) break + } + na !== ua && (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = na.Ja, za = na.Ua, aa ? 180 === this.la || 0 === this.la ? 2 === N ? (b.w(N++, Ta, db), b.w(N++, Ta, za)) : (jc = null !== Ca ? Ca.Ua : db, jc !== za && (lb = this.Kb[na.layer - + 1], b.w(N++, lb, db), b.w(N++, lb, za))) : 2 === N ? (b.w(N++, Ta, db), b.w(N++, wa, db)) : (ge = null !== Ca ? Ca.Ja : Ta, ge !== wa && (lb = this.Kb[na.layer - 1], b.w(N++, Ta, lb), b.w(N++, wa, lb))) : 2 === N ? T ? (Eb = Math.max(10, this.Lg[Oa.layer]), $a = Math.max(10, this.$f[Oa.layer]), 180 === this.la ? (ra = Oa.aa.x, b.w(N++, ra - Eb, za), b.w(N++, ra, za), b.w(N++, ra + $a, za)) : 90 === this.la ? (ra = Oa.aa.y + Oa.aa.height, b.w(N++, wa, ra + $a), b.w(N++, wa, ra), b.w(N++, wa, ra - Eb)) : 270 === this.la ? (ra = Oa.aa.y, b.w(N++, wa, ra - Eb), b.w(N++, wa, ra), b.w(N++, wa, ra + $a)) : (ra = Oa.aa.x + Oa.aa.width, + b.w(N++, ra + $a, za), b.w(N++, ra, za), b.w(N++, ra - Eb, za))) : (b.w(N++, Ta, db), 180 === this.la || 0 === this.la ? b.w(N++, Ta, za) : b.w(N++, wa, db), b.w(N++, wa, za)) : (Eb = Math.max(10, this.Lg[na.layer]), $a = Math.max(10, this.$f[na.layer]), 180 === this.la ? (T && b.w(N++, wa - Eb, za), b.w(N++, wa, za), T && b.w(N++, wa + $a, za)) : 90 === this.la ? (T && b.w(N++, wa, za + $a), b.w(N++, wa, za), T && b.w(N++, wa, za - Eb)) : 270 === this.la ? (T && b.w(N++, wa, za - Eb), b.w(N++, wa, za), T && b.w(N++, wa, za + $a)) : (T && b.w(N++, wa + $a, za), b.w(N++, wa, za), T && b.w(N++, wa - Eb, za)))); + Oa = na + } + if (null === + k || b.computeSpot(!1) !== vb) if (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = b.l(N).x, za = b.l(N).y, aa) { + var Lf = this.$f[ua.layer], ec = 0; + 180 === this.la || 0 === this.la ? (ec = db, ec >= ua.aa.y && ec <= ua.aa.bottom && (ra = ua.Ja + Lf, ec = ec < ua.aa.y + ua.aa.height / 2 ? ua.aa.y - this.sd / 2 : ua.aa.bottom + this.sd / 2, b.w(N++, ra, db), b.w(N++, ra, ec)), b.w(N++, wa, ec)) : (ec = Ta, ec >= ua.aa.x && ec <= ua.aa.right && (ra = ua.Ua + Lf, ec = ec < ua.aa.x + ua.aa.width / 2 ? ua.aa.x - this.sd / 2 : ua.aa.right + this.sd / 2, b.w(N++, Ta, ra), b.w(N++, ec, ra)), b.w(N++, ec, za)); + b.w(N++, wa, za) + } else T ? (Eb = + Math.max(10, this.Lg[ua.layer]), $a = Math.max(10, this.$f[ua.layer]), 180 === this.la ? (ra = ua.aa.x + ua.aa.width, b.V(N - 2, ra, db), b.V(N - 1, ra + $a, db)) : 90 === this.la ? (ra = ua.aa.y, b.V(N - 2, Ta, ra), b.V(N - 1, Ta, ra - Eb)) : 270 === this.la ? (ra = ua.aa.y + ua.aa.height, b.V(N - 2, Ta, ra), b.V(N - 1, Ta, ra + $a)) : (ra = ua.aa.x, b.V(N - 2, ra, db), b.V(N - 1, ra - Eb, db))) : (180 === this.la || 0 === this.la ? b.w(N++, wa, db) : b.w(N++, Ta, za), b.w(N++, wa, za)) + } else { + for (; null !== ua && ua !== Oa;) { + Ca = na = null; + for (var Ve = ua.bc.i; Ve.next();) { + var Mf = Ve.value; + if (Mf.link === c.link && (na = + Mf.toVertex, Ca = Mf.fromVertex, null !== Ca.kd && (Ca = null), null === na.kd)) break + } + var Ta = 0, db = 0, wa = 0, za = 0, lb = 0, Eb = 0, $a = 0; + if (na !== Oa) if (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = na.Ja, za = na.Ua, aa) if (180 === this.la || 0 === this.la) { + var jc = null !== Ca ? Ca.Ua : db; + jc !== za && (lb = this.Kb[na.layer], 2 === N && (lb = 0 === this.la ? Math.max(lb, Ta) : Math.min(lb, Ta)), b.w(N++, lb, db), b.w(N++, lb, za)) + } else { + var ge = null !== Ca ? Ca.Ja : Ta; + ge !== wa && (lb = this.Kb[na.layer], 2 === N && (lb = 90 === this.la ? Math.max(lb, db) : Math.min(lb, db)), b.w(N++, Ta, lb), b.w(N++, wa, lb)) + } else Eb = + Math.max(10, this.Lg[na.layer]), $a = Math.max(10, this.$f[na.layer]), 180 === this.la ? (b.w(N++, wa + $a, za), T && b.w(N++, wa, za), b.w(N++, wa - Eb, za)) : 90 === this.la ? (b.w(N++, wa, za - Eb), T && b.w(N++, wa, za), b.w(N++, wa, za + $a)) : 270 === this.la ? (b.w(N++, wa, za + $a), T && b.w(N++, wa, za), b.w(N++, wa, za - Eb)) : (b.w(N++, wa - Eb, za), T && b.w(N++, wa, za), b.w(N++, wa + $a, za)); + ua = na + } + aa && (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = b.l(N).x, za = b.l(N).y, 180 === this.la || 0 === this.la ? db !== za && (lb = 0 === this.la ? Math.min(Math.max((wa + Ta) / 2, this.Kb[Oa.layer]), wa) : Math.max(Math.min((wa + + Ta) / 2, this.Kb[Oa.layer]), wa), b.w(N++, lb, db), b.w(N++, lb, za)) : Ta !== wa && (lb = 90 === this.la ? Math.min(Math.max((za + db) / 2, this.Kb[Oa.layer]), za) : Math.max(Math.min((za + db) / 2, this.Kb[Oa.layer]), za), b.w(N++, Ta, lb), b.w(N++, wa, lb))) + } + if (null !== d && T) { + if (null !== h) { + if (b.computeSpot(!0) === vb) { + var nc = b.l(0), Od = b.l(2); + nc.L(Od) || b.V(1, (nc.x + Od.x) / 2, (nc.y + Od.y) / 2) + } + H = b.getLinkPoint(e, h, vb, !0, !1, f, k); + H.J() || H.set(e.ba.Ok); + b.V(0, H.x, H.y) + } + null !== k && (b.computeSpot(!1) === vb && (nc = b.l(b.ka - 1), Od = b.l(b.ka - 3), nc.L(Od) || b.V(b.ka - + 2, (nc.x + Od.x) / 2, (nc.y + Od.y) / 2)), H = b.getLinkPoint(f, k, vb, !1, !1, e, h), H.J() || H.set(f.ba.Ok), b.V(b.ka - 1, H.x, H.y)) + } + b.Bi(); + c.commit() + } + } + } + for (var he = new E(W), We = this.network.edges.i; We.next();) { + var pf = We.value.link; + null !== pf && pf.dc && !he.contains(pf) && he.add(pf) + } + if (0 < he.count) if (90 === this.la || 270 === this.la) { + for (var Pd = 0, Fb = new E(Mq), Lb, Ec, Mg = he.i; Mg.next();) { + var Mb = Mg.value; + if (null !== Mb && Mb.dc) for (var yb = 2; yb < Mb.ka - 3; yb++) if (Lb = Mb.l(yb), Ec = Mb.l(yb + 1), this.D(Lb.y, Ec.y) && !this.D(Lb.x, Ec.x)) { + var fc = new Mq; + fc.layer = + Math.floor(Lb.y / 2); + var mb = Mb.l(0), ye = Mb.l(Mb.ka - 1); + fc.first = mb.x * mb.x + mb.y; + fc.Gd = ye.x * ye.x + ye.y; + fc.Be = Math.min(Lb.x, Ec.x); + fc.Vd = Math.max(Lb.x, Ec.x); + fc.index = yb; + fc.link = Mb; + if (yb + 2 < Mb.ka) { + var Qd = Mb.l(yb - 1), og = Mb.l(yb + 2), Nf = 0; + Qd.y < Lb.y ? Nf = og.y < Lb.y ? 3 : Lb.x < Ec.x ? 2 : 1 : Qd.y > Lb.y && (Nf = og.y > Lb.y ? 0 : Ec.x < Lb.x ? 2 : 1); + fc.Rh = Nf + } + Fb.add(fc) + } + } + if (1 < Fb.count) { + Fb.sort(this.AE); + for (var zb = 0; zb < Fb.count;) { + for (var fd = Fb.n[zb].layer, oc = zb + 1; oc < Fb.count && Fb.n[oc].layer === fd;) oc++; + if (1 < oc - zb) for (var wb = zb; wb < oc;) { + for (var Fc = + Fb.n[wb].Vd, Nb = zb + 1; Nb < oc && Fb.n[Nb].Be < Fc;) Fc = Math.max(Fc, Fb.n[Nb].Vd), Nb++; + var Na = Nb - wb; + if (1 < Na) { + Fb.hp(this.Aw, wb, wb + Na); + for (var eb = 1, Ab = Fb.n[wb].Gd, yb = wb; yb < Nb; yb++) { + var gc = Fb.n[yb]; + gc.Gd !== Ab && (eb++, Ab = gc.Gd) + } + Fb.hp(this.zE, wb, wb + Na); + for (var Rd = 1, Ab = Fb.n[wb].first, yb = wb; yb < Nb; yb++) gc = Fb.n[yb], gc.first !== Ab && (Rd++, Ab = gc.first); + var Sd = !0, qf = Rd; + eb < Rd ? (Sd = !1, qf = eb, Ab = Fb.n[wb].Gd, Fb.hp(this.Aw, wb, wb + Na)) : Ab = Fb.n[wb].first; + for (var ze = 0, yb = wb; yb < Nb; yb++) { + gc = Fb.n[yb]; + (Sd ? gc.first : gc.Gd) !== Ab && (ze++, Ab = + Sd ? gc.first : gc.Gd); + Mb = gc.link; + Lb = Mb.l(gc.index); + Ec = Mb.l(gc.index + 1); + var rf = this.ow * (ze - (qf - 1) / 2); + Pd++; + Mb.rl(); + Mb.V(gc.index, Lb.x, Lb.y + rf); + Mb.V(gc.index + 1, Ec.x, Ec.y + rf); + Mb.Bi() + } + } + wb = Nb + } + zb = oc + } + } + } else { + for (var Rb = 0, cb = new E(Mq), pc, Pc, gd = he.i; gd.next();) { + var ab = gd.value; + if (null !== ab && ab.dc) for (var ub = 2; ub < ab.ka - 3; ub++) if (pc = ab.l(ub), Pc = ab.l(ub + 1), this.D(pc.x, Pc.x) && !this.D(pc.y, Pc.y)) { + var kc = new Mq; + kc.layer = Math.floor(pc.x / 2); + var hd = ab.l(0), Ng = ab.l(ab.ka - 1); + kc.first = hd.x + hd.y * hd.y; + kc.Gd = Ng.x + Ng.y * Ng.y; + kc.Be = + Math.min(pc.y, Pc.y); + kc.Vd = Math.max(pc.y, Pc.y); + kc.index = ub; + kc.link = ab; + if (ub + 2 < ab.ka) { + var Og = ab.l(ub - 1), Pg = ab.l(ub + 2), Of = 0; + Og.x < pc.x ? Of = Pg.x < pc.x ? 3 : pc.y < Pc.y ? 2 : 1 : Og.x > pc.x && (Of = Pg.x > pc.x ? 0 : Pc.y < pc.y ? 2 : 1); + kc.Rh = Of + } + cb.add(kc) + } + } + if (1 < cb.count) { + cb.sort(this.AE); + for (var Gc = 0; Gc < cb.count;) { + for (var Qc = cb.n[Gc].layer, Hc = Gc + 1; Hc < cb.count && cb.n[Hc].layer === Qc;) Hc++; + if (1 < Hc - Gc) for (var nb = Gc; nb < Hc;) { + for (var ie = cb.n[nb].Vd, ob = Gc + 1; ob < Hc && cb.n[ob].Be < ie;) ie = Math.max(ie, cb.n[ob].Vd), ob++; + var yc = ob - nb; + if (1 < yc) { + cb.hp(this.Aw, + nb, nb + yc); + for (var Ae = 1, Bb = cb.n[nb].Gd, ub = nb; ub < ob; ub++) { + var Cb = cb.n[ub]; + Cb.Gd !== Bb && (Ae++, Bb = Cb.Gd) + } + cb.hp(this.zE, nb, nb + yc); + for (var id = 1, Bb = cb.n[nb].first, ub = nb; ub < ob; ub++) Cb = cb.n[ub], Cb.first !== Bb && (id++, Bb = Cb.first); + var Rc = !0, Td = id; + Ae < id ? (Rc = !1, Td = Ae, Bb = cb.n[nb].Gd, cb.hp(this.Aw, nb, nb + yc)) : Bb = cb.n[nb].first; + for (var Ud = 0, ub = nb; ub < ob; ub++) { + Cb = cb.n[ub]; + (Rc ? Cb.first : Cb.Gd) !== Bb && (Ud++, Bb = Rc ? Cb.first : Cb.Gd); + ab = Cb.link; + pc = ab.l(Cb.index); + Pc = ab.l(Cb.index + 1); + var Xe = this.ow * (Ud - (Td - 1) / 2); + Rb++; + ab.rl(); + ab.V(Cb.index, + pc.x + Xe, pc.y); + ab.V(Cb.index + 1, Pc.x + Xe, Pc.y); + ab.Bi() + } + } + nb = ob + } + Gc = Hc + } + } + } + }; + Yl.prototype.AE = function (a, b) { + return a instanceof Mq && b instanceof Mq && a !== b ? a.layer < b.layer ? -1 : a.layer > b.layer ? 1 : a.Be < b.Be ? -1 : a.Be > b.Be ? 1 : a.Vd < b.Vd ? -1 : a.Vd > b.Vd ? 1 : 0 : 0 + }; + Yl.prototype.zE = function (a, b) { + return a instanceof Mq && b instanceof Mq && a !== b ? a.first < b.first ? -1 : a.first > b.first || a.Rh < b.Rh ? 1 : a.Rh > b.Rh || a.Be < b.Be ? -1 : a.Be > b.Be ? 1 : a.Vd < b.Vd ? -1 : a.Vd > b.Vd ? 1 : 0 : 0 + }; + Yl.prototype.Aw = function (a, b) { + return a instanceof Mq && b instanceof Mq && a !== b ? a.Gd < b.Gd ? -1 : a.Gd > b.Gd || a.Rh < b.Rh ? 1 : a.Rh > b.Rh || a.Be < b.Be ? -1 : a.Be > b.Be ? 1 : a.Vd < b.Vd ? -1 : a.Vd > b.Vd ? 1 : 0 : 0 + }; + Yl.prototype.D = function (a, b) { + var c = a - b; + return -1 < c && 1 > c + }; + + function dq(a, b) { + var c, d = a.Ld[b]; + if (d >= a.Ng.length) { + c = []; + for (var e = 0; e < a.Ng.length; e++) c[e] = a.Ng[e]; + a.Ng = c + } + void 0 === a.Ng[d] || null === a.Ng[d] ? c = [] : (c = a.Ng[d], a.Ng[d] = null); + d = a.Vq[b]; + for (e = 0; e < d.length; e++) { + var f = d[e]; + c[f.index] = f + } + return c + } + + function eq(a, b, c) { + a.Ng[a.Ld[b]] = c + } + + u.defineProperty(Yl, {layerSpacing: "layerSpacing"}, function () { + return this.Ql + }, function (a) { + this.Ql !== a && (u.j(a, "number", Yl, "layerSpacing"), 0 <= a && (this.Ql = a, this.H())) + }); + u.defineProperty(Yl, {dJ: "columnSpacing"}, function () { + return this.sd + }, function (a) { + this.sd !== a && (u.j(a, "number", Yl, "columnSpacing"), 0 <= a && (this.sd = a, this.H())) + }); + u.defineProperty(Yl, {direction: "direction"}, function () { + return this.la + }, function (a) { + this.la !== a && (u.j(a, "number", Yl, "direction"), this.la = a, this.H()) + }); + u.defineProperty(Yl, {kG: "cycleRemoveOption"}, function () { + return this.gn + }, function (a) { + this.gn !== a && (u.rb(a, Yl, Yl, "cycleRemoveOption"), a === Xp || a === Op) && (this.gn = a, this.H()) + }); + u.defineProperty(Yl, {mH: "layeringOption"}, function () { + return this.Mn + }, function (a) { + this.Mn !== a && (u.rb(a, Yl, Yl, "layeringOption"), a === Sp || a === oq || a === qq) && (this.Mn = a, this.H()) + }); + u.defineProperty(Yl, {WG: "initializeOption"}, function () { + return this.Bn + }, function (a) { + this.Bn !== a && (u.rb(a, Yl, Yl, "initializeOption"), a === Tp || a === wq || a === uq) && (this.Bn = a, this.H()) + }); + u.defineProperty(Yl, {MJ: "iterations"}, function () { + return this.Nl + }, function (a) { + this.Nl !== a && (u.ze(a, Wp, "iterations"), 0 <= a && (this.Nl = a, this.H())) + }); + u.defineProperty(Yl, {NF: "aggressiveOption"}, function () { + return this.Wm + }, function (a) { + this.Wm !== a && (u.rb(a, Yl, Yl, "aggressiveOption"), a === Aq || a === Up || a === Bq) && (this.Wm = a, this.H()) + }); + u.defineProperty(Yl, {kK: "packOption"}, function () { + return this.oi + }, function (a) { + this.oi !== a && (u.j(a, "number", Yl, "packOption"), 0 <= a && 8 > a && (this.oi = a, this.H())) + }); + u.defineProperty(Yl, {fp: "setsPortSpots"}, function () { + return this.Eh + }, function (a) { + this.Eh !== a && (u.j(a, "boolean", Yl, "setsPortSpots"), this.Eh = a, this.H()) + }); + u.defineProperty(Yl, {ow: "linkSpacing"}, function () { + return this.gj + }, function (a) { + this.gj !== a && (u.j(a, "number", Yl, "linkSpacing"), 0 <= a && (this.gj = a, this.H())) + }); + u.u(Yl, {uH: "maxLayer"}, function () { + return this.jb + }); + u.u(Yl, {TJ: "maxIndex"}, function () { + return this.Fu + }); + u.u(Yl, {SJ: "maxColumn"}, function () { + return this.Hb + }); + u.u(Yl, {ZJ: "minIndexLayer"}, function () { + return this.Nq + }); + u.u(Yl, {UJ: "maxIndexLayer"}, function () { + return this.Cf + }); + var Op; + Yl.CycleDepthFirst = Op = u.s(Yl, "CycleDepthFirst", 0); + var Xp; + Yl.CycleGreedy = Xp = u.s(Yl, "CycleGreedy", 1); + var Sp; + Yl.LayerOptimalLinkLength = Sp = u.s(Yl, "LayerOptimalLinkLength", 0); + var oq; + Yl.LayerLongestPathSink = oq = u.s(Yl, "LayerLongestPathSink", 1); + var qq; + Yl.LayerLongestPathSource = qq = u.s(Yl, "LayerLongestPathSource", 2); + var Tp; + Yl.InitDepthFirstOut = Tp = u.s(Yl, "InitDepthFirstOut", 0); + var wq; + Yl.InitDepthFirstIn = wq = u.s(Yl, "InitDepthFirstIn", 1); + var uq; + Yl.InitNaive = uq = u.s(Yl, "InitNaive", 2); + var Aq; + Yl.AggressiveNone = Aq = u.s(Yl, "AggressiveNone", 0); + var Up; + Yl.AggressiveLess = Up = u.s(Yl, "AggressiveLess", 1); + var Bq; + Yl.AggressiveMore = Bq = u.s(Yl, "AggressiveMore", 2); + Yl.PackNone = 0; + var Cq; + Yl.PackExpand = Cq = 1; + var Dq; + Yl.PackStraighten = Dq = 2; + var Fq; + Yl.PackMedian = Fq = 4; + var Vp; + Yl.PackAll = Vp = 7; + + function Mq() { + this.index = this.Vd = this.Be = this.Gd = this.first = this.layer = 0; + this.link = null; + this.Rh = 0 + } + + u.Xd(Mq, {layer: !0, first: !0, Gd: !0, Be: !0, Vd: !0, index: !0, link: !0, Rh: !0}); + + function Wp() { + xa.call(this) + } + + u.Ga(Wp, xa); + u.fa("LayeredDigraphNetwork", Wp); + Wp.prototype.createVertex = function () { + return new Nq + }; + Wp.prototype.createEdge = function () { + return new Oq + }; + + function Nq() { + ya.call(this); + this.index = this.column = this.layer = -1; + this.component = NaN; + this.near = null; + this.valid = !1; + this.finish = this.wo = NaN; + this.om = 0; + this.Hz = this.Iz = null + } + + u.Ga(Nq, ya); + u.fa("LayeredDigraphVertex", Nq); + + function Oq() { + Aa.call(this); + this.forest = this.rev = this.valid = !1; + this.portToPos = this.portFromPos = NaN; + this.portToColOffset = this.portFromColOffset = 0 + } + + u.Ga(Oq, Aa); + u.fa("LayeredDigraphEdge", Oq); + + function Y() { + 0 < arguments.length && u.Wc(Y); + Je.call(this); + this.nd = new F(Object); + this.fr = Pq; + this.Af = Qq; + this.Wr = Rq; + this.Cu = Sq; + this.BA = null; + this.oh = !0; + this.Yc = Tq; + this.Uf = (new ia(10, 10)).freeze(); + this.qa = new Uq; + this.pa = new Uq; + this.By = [] + } + + u.Ga(Y, Je); + u.fa("TreeLayout", Y); + Y.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.fr = this.fr; + a.Wr = this.Wr; + a.Cu = this.Cu; + a.oh = this.oh; + a.Yc = this.Yc; + a.Uf.assign(this.Uf); + a.qa.copyInheritedPropertiesFrom(this.qa); + a.pa.copyInheritedPropertiesFrom(this.pa) + }; + Y.prototype.createNetwork = function () { + return new Vq + }; + Y.prototype.makeNetwork = function (a) { + function b(a) { + if (a instanceof U) return !a.tf && "Comment" !== a.Kc; + if (a instanceof W) { + var b = a.W; + if (null === b || b.tf || "Comment" === b.Kc) return !1; + a = a.ca; + return null === a || a.tf || "Comment" === a.Kc ? !1 : !0 + } + return !1 + } + + var c = this.createNetwork(); + c.Qb = this; + a instanceof D ? (c.Gj(a.yg, !0, b), c.Gj(a.links, !0, b)) : a instanceof V ? c.Gj(a.Mc, !1, b) : c.Gj(a.i, !1, b); + return c + }; + Y.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + this.Gf !== Wq && (this.Ud = this.initialOrigin(this.Ud)); + var b = this.g; + null === b && a instanceof D && (b = a); + this.Af = this.path === Pq && null !== b ? b.qd ? Qq : Xq : this.path === Pq ? Qq : this.path; + if (0 < this.network.vertexes.count) { + this.network.Qv(); + for (a = this.network.vertexes.i; a.next();) b = a.value, b.initialized = !1, b.level = + 0, b.parent = null, b.children = []; + if (0 < this.nd.count) { + a = new F(Uq); + for (b = this.nd.i; b.next();) { + var c = b.value; + c instanceof U ? (c = this.network.Am(c), null !== c && a.add(c)) : c instanceof Uq && a.add(c) + } + this.nd = a + } + 0 === this.nd.count && this.findRoots(); + for (a = this.nd.copy().i; a.next();) b = a.value, b.initialized || (b.initialized = !0, Yq(this, b)); + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && Zq(this, b); + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && $q(this, b); + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && + ar(this, b); + this.Ny(); + if (this.wz === br) { + c = []; + for (a = this.network.vertexes.i; a.next();) { + var d = a.value, b = d.parent; + null == b && (b = d); + var b = 0 === b.angle || 180 === b.angle, e = c[d.level]; + void 0 === e && (e = 0); + c[d.level] = Math.max(e, b ? d.width : d.height) + } + for (d = 0; d < c.length; d++) void 0 === c[d] && (c[d] = 0); + this.BA = c; + for (a = this.network.vertexes.i; a.next();) d = a.value, b = d.parent, null === b && (b = d), 0 === b.angle || 180 === b.angle ? (180 === b.angle && (d.Cs += c[d.level] - d.width), d.width = c[d.level]) : (270 === b.angle && (d.Ds += c[d.level] - d.height), d.height = + c[d.level]) + } else if (this.wz === cr) for (a = this.network.vertexes.i; a.next();) { + c = a.value; + b = 0 === c.angle || 180 === c.angle; + e = -1; + for (d = 0; d < c.children.length; d++) var f = c.children[d], e = Math.max(e, b ? f.width : f.height); + if (0 <= e) for (d = 0; d < c.children.length; d++) f = c.children[d], b ? (180 === c.angle && (f.Cs += e - f.width), f.width = e) : (270 === c.angle && (f.Ds += e - f.height), f.height = e) + } + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && this.layoutTree(b); + this.arrangeTrees(); + this.updateParts() + } + this.network = null; + this.nd = new F(Object); + this.vf = !0 + }; + Y.prototype.findRoots = function () { + for (var a = this.network.vertexes.i; a.next();) { + var b = a.value; + switch (this.Af) { + case Qq: + 0 === b.kc.count && this.nd.add(b); + break; + case Xq: + 0 === b.bc.count && this.nd.add(b); + break; + default: + u.k("Unhandled path value " + this.Af.toString()) + } + } + if (0 === this.nd.count) { + for (var a = 999999, b = null, c = this.network.vertexes.i; c.next();) { + var d = c.value; + switch (this.Af) { + case Qq: + d.kc.count < a && (a = d.kc.count, b = d); + break; + case Xq: + d.bc.count < a && (a = d.bc.count, b = d); + break; + default: + u.k("Unhandled path value " + this.Af.toString()) + } + } + null !== + b && this.nd.add(b) + } + }; + + function Yq(a, b) { + if (null !== b) { + switch (a.Af) { + case Qq: + if (0 < b.bc.count) { + for (var c = new E(Uq), d = b.rG; d.next();) { + var e = d.value; + dr(a, b, e) && c.add(e) + } + 0 < c.count && (b.children = c.Ke()) + } + break; + case Xq: + if (0 < b.kc.count) { + c = new E(Uq); + for (d = b.nI; d.next();) e = d.value, dr(a, b, e) && c.add(e); + 0 < c.count && (b.children = c.Ke()) + } + break; + default: + u.k("Unhandled path value" + a.Af.toString()) + } + c = b.children; + d = c.length; + for (e = 0; e < d; e++) { + var f = c[e]; + f.initialized = !0; + f.level = b.level + 1; + f.parent = b; + a.nd.remove(f) + } + for (e = 0; e < d; e++) f = c[e], Yq(a, f) + } + } + + function dr(a, b, c) { + if (c.initialized) { + var d; + if (null === b) d = !1; else { + for (d = b.parent; null !== d && d !== c;) d = d.parent; + d = d === c + } + if (d || c.level > b.level) return !1; + a.removeChild(c.parent, c) + } + return !0 + } + + Y.prototype.removeChild = function (a, b) { + if (null !== a && null !== b) { + for (var c = a.children, d = 0, e = 0; e < c.length; e++) c[e] === b && d++; + if (0 < d) { + for (var d = Array(c.length - d), f = 0, e = 0; e < c.length; e++) c[e] !== b && (d[f++] = c[e]); + a.children = d + } + } + }; + + function Zq(a, b) { + if (null !== b) { + a.initializeTreeVertexValues(b); + b.alignment === er && a.sortTreeVertexChildren(b); + for (var c = 0, d = b.qm, e = 0, f = b.children, h = f.length, k = 0; k < h; k++) { + var l = f[k]; + Zq(a, l); + c += l.descendantCount + 1; + d = Math.max(d, l.maxChildrenCount); + e = Math.max(e, l.maxGenerationCount) + } + b.descendantCount = c; + b.maxChildrenCount = d; + b.maxGenerationCount = 0 < d ? e + 1 : 0 + } + } + + function fr(a, b) { + switch (a.Wr) { + default: + case Rq: + return null !== b.parent ? b.parent : a.qa; + case gr: + return null === b.parent ? a.qa : null === b.parent.parent ? a.pa : b.parent; + case hr: + if (null !== b.parent) return null !== b.parent.parent ? b.parent.parent : a.pa; + case ir: + var c = !0; + if (0 === b.qm) c = !1; else for (var d = b.children, e = d.length, f = 0; f < e; f++) if (0 < d[f].qm) { + c = !1; + break + } + return c && null !== b.parent ? a.pa : null !== b.parent ? b.parent : a.qa + } + } + + Y.prototype.initializeTreeVertexValues = function (a) { + var b = fr(this, a); + a.copyInheritedPropertiesFrom(b); + if (null !== a.parent && a.parent.alignment === er) { + for (var b = a.angle, c = a.parent.children, d = 0; d < c.length && a !== c[d];) d++; + 0 === d % 2 ? d !== c.length - 1 && (b = 90 === b ? 180 : 180 === b ? 270 : 270 === b ? 180 : 270) : b = 90 === b ? 0 : 180 === b ? 90 : 270 === b ? 0 : 90; + a.angle = b + } + a.initialized = !0 + }; + + function $q(a, b) { + if (null !== b) { + a.assignTreeVertexValues(b); + for (var c = b.children, d = c.length, e = 0; e < d; e++) $q(a, c[e]) + } + } + + Y.prototype.assignTreeVertexValues = function () { + }; + + function ar(a, b) { + if (null !== b) { + b.alignment !== er && a.sortTreeVertexChildren(b); + for (var c = b.children, d = c.length, e = 0; e < d; e++) ar(a, c[e]) + } + } + + Y.prototype.sortTreeVertexChildren = function (a) { + switch (a.sorting) { + case jr: + break; + case kr: + a.children.reverse(); + break; + case lr: + a.children.sort(a.comparer); + break; + case mr: + a.children.sort(a.comparer); + a.children.reverse(); + break; + default: + u.k("Unhandled sorting value " + a.sorting.toString()) + } + }; + Y.prototype.Ny = function () { + if (this.comments) for (var a = this.network.vertexes.i; a.next();) this.addComments(a.value) + }; + Y.prototype.addComments = function (a) { + var b = a.angle, c = a.parent, d = 0, e = nr, e = !1; + null !== c && (d = c.angle, e = c.alignment, e = or(e)); + var b = 90 === b || 270 === b, d = 90 === d || 270 === d, c = 0 === a.qm, f = 0, h = 0, k = 0, + l = a.commentSpacing; + if (null !== a.Cc) for (var m = a.Cc.rD(); m.next();) { + var n = m.value; + "Comment" === n.Kc && n.Ea() && (null === a.comments && (a.comments = []), a.comments.push(n), n.pf(), n = n.Ba, b && !c || !e && !d && c || e && d && c ? (f = Math.max(f, n.width), h += n.height + Math.abs(k)) : (f += n.width + Math.abs(k), h = Math.max(h, n.height)), k = l) + } + null !== a.comments && + (b && !c || !e && !d && c || e && d && c ? (f += Math.abs(a.commentMargin), h = Math.max(0, h - a.height)) : (h += Math.abs(a.commentMargin), f = Math.max(0, f - a.width)), e = u.Vj(0, 0, a.aa.width + f, a.aa.height + h), a.kb = e, u.ic(e)) + }; + + function or(a) { + return a === pr || a === er || a === qr || a === rr + } + + function sr(a) { + return a === pr || a === er + } + + function tr(a) { + var b = a.parent; + if (null !== b) { + var c = b.alignment; + if (or(c)) { + if (sr(c)) { + b = b.children; + for (c = 0; c < b.length && a !== b[c];) c++; + return 0 === c % 2 + } + if (c === qr) return !0 + } + } + return !1 + } + + Y.prototype.layoutComments = function (a) { + if (null !== a.comments) { + var b = a.Cc.Ba, c = a.parent, d = a.angle, e = 0, f = nr, f = !1; + null !== c && (e = c.angle, f = c.alignment, f = or(f)); + for (var c = 90 === d || 270 === d, d = 90 === e || 270 === e, h = 0 === a.qm, k = tr(a), l = 0, m = a.comments, n = m.length, p = u.K(), q = 0; q < n; q++) { + var r = m[q], s = r.Ba; + if (c && !h || !f && !d && h || f && d && h) { + if (135 < e && !f || d && k) if (0 <= a.commentMargin) for (p.m(a.aa.x - a.commentMargin - s.width, a.aa.y + l), r.move(p), r = r.og(); r.next();) { + var t = r.value; + t.vb = wc; + t.xb = xc + } else for (p.m(a.aa.x + 2 * a.M.x - a.commentMargin, + a.aa.y + l), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = xc, t.xb = wc; else if (0 <= a.commentMargin) for (p.m(a.aa.x + 2 * a.M.x + a.commentMargin, a.aa.y + l), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = xc, t.xb = wc; else for (p.m(a.aa.x + a.commentMargin - s.width, a.aa.y + l), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = wc, t.xb = xc; + l = 0 <= a.commentSpacing ? l + (s.height + a.commentSpacing) : l + (a.commentSpacing - s.height) + } else { + if (135 < e && !f || !d && k) if (0 <= a.commentMargin) for (p.m(a.aa.x + l, a.aa.y - a.commentMargin - s.height), r.move(p), r = r.og(); r.next();) t = + r.value, t.vb = vc, t.xb = Cc; else for (p.m(a.aa.x + l, a.aa.y + 2 * a.M.y - a.commentMargin), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = Cc, t.xb = vc; else if (0 <= a.commentMargin) for (p.m(a.aa.x + l, a.aa.y + 2 * a.M.y + a.commentMargin), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = Cc, t.xb = vc; else for (p.m(a.aa.x + l, a.aa.y + a.commentMargin - s.height), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = vc, t.xb = Cc; + l = 0 <= a.commentSpacing ? l + (s.width + a.commentSpacing) : l + (a.commentSpacing - s.width) + } + } + u.v(p); + b = l - a.commentSpacing - (c ? b.height : b.width); + if (this.Af === Qq) for (e = a.bc; e.next();) a = e.value.link, null === a || a.el || (a.Yk = 0 < b ? b : NaN); else for (e = a.kc; e.next();) a = e.value.link, null === a || a.el || (a.vl = 0 < b ? b : NaN) + } + }; + Y.prototype.layoutTree = function (a) { + if (null !== a) { + for (var b = a.children, c = b.length, d = 0; d < c; d++) this.layoutTree(b[d]); + switch (a.compaction) { + case ur: + vr(this, a); + break; + case wr: + if (a.alignment === er) vr(this, a); else if (0 === a.qm) { + var d = a.parent, b = !1, c = 0, e = nr; + null !== d && (c = d.angle, e = d.alignment, b = or(e)); + d = tr(a); + a.ia.m(0, 0); + a.Ya.m(a.width, a.height); + null === a.parent || null === a.comments || (180 !== c && 270 !== c || b) && !d ? a.Ia.m(0, 0) : 180 === c && !b || (90 === c || 270 === c) && d ? a.Ia.m(a.width - 2 * a.M.x, 0) : a.Ia.m(0, a.height - 2 * a.M.y); + a.Ss = + null; + a.jt = null + } else { + for (var f = xr(a), b = 90 === f || 270 === f, h = 0, k = a.children, l = k.length, m = 0; m < l; m++) var n = k[m], h = Math.max(h, b ? n.Ya.width : n.Ya.height); + var p = a.alignment, d = p === yr, q = p === zr, r = or(p), s = Math.max(0, a.breadthLimit), + c = Ar(a), t = a.nodeSpacing, v = Br(a), x = a.rowSpacing, B = 0; + if (d || q || a.bp || a.cp && 1 === a.maxGenerationCount) B = Math.max(0, a.rowIndent); + var d = a.width, e = a.height, y = 0, C = 0, I = 0, H = null, T = null, aa = 0, R = 0, N = 0, + Z = 0, Ea = 0, ua = 0, Oa = 0, na = 0, n = 0; + r && !sr(p) && 135 < f && k.reverse(); + if (sr(p)) if (1 < l) for (m = 0; m < l; m++) 0 === m % 2 && + m !== l - 1 ? na = Math.max(na, b ? k[m].Ya.width : k[m].Ya.height) : 0 !== m % 2 && (n = Math.max(n, b ? k[m].Ya.width : k[m].Ya.height)); else 1 === l && (na = b ? k[0].Ya.width : k[0].Ya.height); + if (r) { + switch (p) { + case pr: + R = 135 > f ? Cr(a, k, na, y, C) : Dr(a, k, na, y, C); + na = R.x; + y = R.width; + C = R.height; + break; + case qr: + for (m = 0; m < l; m++) { + var n = k[m], Ca = n.Ya, H = 0 === ua ? 0 : x; + b ? (n.ia.m(h - Ca.width, Z + H), y = Math.max(y, Ca.width), C = Math.max(C, Z + H + Ca.height), Z += H + Ca.height) : (n.ia.m(N + H, h - Ca.height), y = Math.max(y, N + H + Ca.width), C = Math.max(C, Ca.height), N += H + Ca.width); + ua++ + } + break; + case rr: + for (m = 0; m < l; m++) n = k[m], Ca = n.Ya, H = 0 === ua ? 0 : x, b ? (n.ia.m(t / 2 + a.M.x, Z + H), y = Math.max(y, Ca.width), C = Math.max(C, Z + H + Ca.height), Z += H + Ca.height) : (n.ia.m(N + H, t / 2 + a.M.y), y = Math.max(y, N + H + Ca.width), C = Math.max(C, Ca.height), N += H + Ca.width), ua++ + } + H = Er(this, 2); + T = Er(this, 2); + b ? (H[0].m(0, 0), H[1].m(0, C), T[0].m(y, 0)) : (H[0].m(0, 0), H[1].m(y, 0), T[0].m(0, C)); + T[1].m(y, C) + } else for (m = 0; m < l; m++) { + n = k[m]; + Ca = n.Ya; + if (b) { + 0 < s && 0 < ua && N + t + Ca.width > s && (N < h && Fr(a, p, h - N, 0, Oa, m - 1), Ea++, ua = 0, Oa = m, I = C, N = 0, Z = 135 < f ? -C - x : C + x); + Gr(this, n, + 0, Z); + var ra = 0; + if (0 === ua) { + if (H = n.Ss, T = n.jt, aa = Ca.width, R = Ca.height, null === H || null === T || f !== xr(n)) H = Er(this, 2), T = Er(this, 2), H[0].m(0, 0), H[1].m(0, R), T[0].m(aa, 0), T[1].m(aa, R) + } else { + var dc = u.eb(), R = Hr(this, a, n, H, T, aa, R, dc), ra = R.x, H = dc[0], + T = dc[1], aa = R.width, R = R.height; + u.ra(dc); + N < Ca.width && 0 > ra && (Ir(a, -ra, 0, Oa, m - 1), Jr(H, -ra, 0), Jr(T, -ra, 0), ra = 0) + } + n.ia.m(ra, Z); + y = Math.max(y, aa); + C = Math.max(C, I + (0 === Ea ? 0 : x) + Ca.height); + N = aa + } else { + 0 < s && 0 < ua && Z + t + Ca.height > s && (Z < h && Fr(a, p, 0, h - Z, Oa, m - 1), Ea++, ua = 0, Oa = m, I = y, Z = 0, N = 135 < + f ? -y - x : y + x); + Gr(this, n, N, 0); + ra = 0; + if (0 === ua) { + if (H = n.Ss, T = n.jt, aa = Ca.width, R = Ca.height, null === H || null === T || f !== xr(n)) H = Er(this, 2), T = Er(this, 2), H[0].m(0, 0), H[1].m(aa, 0), T[0].m(0, R), T[1].m(aa, R) + } else dc = u.eb(), R = Hr(this, a, n, H, T, aa, R, dc), ra = R.x, H = dc[0], T = dc[1], aa = R.width, R = R.height, u.ra(dc), Z < Ca.height && 0 > ra && (Ir(a, 0, -ra, Oa, m - 1), Jr(H, 0, -ra), Jr(T, 0, -ra), ra = 0); + n.ia.m(N, ra); + C = Math.max(C, R); + y = Math.max(y, I + (0 === Ea ? 0 : x) + Ca.width); + Z = R + } + ua++ + } + 0 < Ea && (b ? (C += Math.max(0, c), N < y && Fr(a, p, y - N, 0, Oa, l - 1), 0 < B && (q || Ir(a, B, 0, + 0, l - 1), y += B)) : (y += Math.max(0, c), Z < C && Fr(a, p, 0, C - Z, Oa, l - 1), 0 < B && (q || Ir(a, 0, B, 0, l - 1), C += B))); + q = h = 0; + switch (p) { + case Kr: + b ? h += y / 2 - a.M.x - v / 2 : q += C / 2 - a.M.y - v / 2; + break; + case nr: + 0 < Ea ? b ? h += y / 2 - a.M.x - v / 2 : q += C / 2 - a.M.y - v / 2 : b ? (m = k[0].ia.x + k[0].Ia.x, na = k[l - 1].ia.x + k[l - 1].Ia.x + 2 * k[l - 1].M.x, h += m + (na - m) / 2 - a.M.x - v / 2) : (m = k[0].ia.y + k[0].Ia.y, na = k[l - 1].ia.y + k[l - 1].Ia.y + 2 * k[l - 1].M.y, q += m + (na - m) / 2 - a.M.y - v / 2); + break; + case yr: + b ? (h -= v, y += v) : (q -= v, C += v); + break; + case zr: + b ? (h += y - a.width + v, y += v) : (q += C - a.height + v, C += v); + break; + case pr: + b ? + h = 1 < l ? h + (na + t / 2 - a.M.x) : h + (k[0].M.x - a.M.x + k[0].Ia.x) : q = 1 < l ? q + (na + t / 2 - a.M.y) : q + (k[0].M.y - a.M.y + k[0].Ia.y); + break; + case qr: + b ? h += y + t / 2 - a.M.x : q += C + t / 2 - a.M.y; + break; + case rr: + break; + default: + u.k("Unhandled alignment value " + p.toString()) + } + for (m = 0; m < l; m++) n = k[m], b ? n.ia.m(n.ia.x + n.Ia.x - h, n.ia.y + (135 < f ? (r ? -C : -n.Ya.height) + n.Ia.y - c : e + c + n.Ia.y)) : n.ia.m(n.ia.x + (135 < f ? (r ? -y : -n.Ya.width) + n.Ia.x - c : d + c + n.Ia.x), n.ia.y + n.Ia.y - q); + l = k = 0; + r ? b ? (y = Lr(a, y, h), 0 > h && (h = 0), 135 < f && (q += C + c), C += e + c, p === rr && (k += t / 2 + a.M.x), l += e + c) : (135 < f && + (h += y + c), y += d + c, C = Mr(a, C, q), 0 > q && (q = 0), p === rr && (l += t / 2 + a.M.y), k += d + c) : b ? (null === a.comments ? d > y && (p = Nr(p, d - y, 0), k = p.x, l = p.y, y = d, h = 0) : y = Lr(a, y, h), 0 > h && (k -= h, h = 0), 135 < f && (q += C + c), C = Math.max(Math.max(C, e), C + e + c), l += e + c) : (135 < f && (h += y + c), y = Math.max(Math.max(y, d), y + d + c), null === a.comments ? e > C && (p = Nr(p, 0, e - C), k = p.x, l = p.y, C = e, q = 0) : C = Mr(a, C, q), 0 > q && (l -= q, q = 0), k += d + c); + if (0 < Ea) f = Er(this, 4), p = Er(this, 4), b ? (f[2].m(0, e + c), f[3].m(f[2].x, C), p[2].m(y, f[2].y), p[3].m(p[2].x, f[3].y)) : (f[2].m(d + c, 0), f[3].m(y, f[2].y), p[2].m(f[2].x, + C), p[3].m(f[3].x, p[2].y)); else { + f = Er(this, H.length + 2); + p = Er(this, T.length + 2); + for (m = 0; m < H.length; m++) r = H[m], f[m + 2].m(r.x + k, r.y + l); + for (m = 0; m < T.length; m++) r = T[m], p[m + 2].m(r.x + k, r.y + l) + } + b ? (f[0].m(h, 0), f[1].m(f[0].x, e), f[2].y < f[1].y && (f[2].x > f[0].x ? f[2].assign(f[1]) : f[1].assign(f[2])), f[3].y < f[2].y && (f[3].x > f[0].x ? f[3].assign(f[2]) : f[2].assign(f[3])), p[0].m(h + d, 0), p[1].m(p[0].x, e), p[2].y < p[1].y && (p[2].x < p[0].x ? p[2].assign(p[1]) : p[1].assign(p[2])), p[3].y < p[2].y && (p[3].x < p[0].x ? p[3].assign(p[2]) : p[2].assign(p[3])), + f[2].y -= c / 2, p[2].y -= c / 2) : (f[0].m(0, q), f[1].m(d, f[0].y), f[2].x < f[1].x && (f[2].y > f[0].y ? f[2].assign(f[1]) : f[1].assign(f[2])), f[3].x < f[2].x && (f[3].y > f[0].y ? f[3].assign(f[2]) : f[2].assign(f[3])), p[0].m(0, q + e), p[1].m(d, p[0].y), p[2].x < p[1].x && (p[2].y < p[0].y ? p[2].assign(p[1]) : p[1].assign(p[2])), p[3].x < p[2].x && (p[3].y < p[0].y ? p[3].assign(p[2]) : p[2].assign(p[3])), f[2].x -= c / 2, p[2].x -= c / 2); + Or(this, H); + Or(this, T); + a.Ss = f; + a.jt = p; + a.Ia.m(h, q); + a.Ya.m(y, C) + } + break; + default: + u.k("Unhandled compaction value " + a.compaction.toString()) + } + } + }; + + function vr(a, b) { + if (0 === b.qm) { + var c = !1, d = 0, e = nr; + null !== b.parent && (d = b.parent.angle, e = b.parent.alignment, c = or(e)); + e = tr(b); + b.ia.m(0, 0); + b.Ya.m(b.width, b.height); + null === b.parent || null === b.comments || (180 !== d && 270 !== d || c) && !e ? b.Ia.m(0, 0) : 180 === d && !c || (90 === d || 270 === d) && e ? b.Ia.m(b.width - 2 * b.M.x, 0) : b.Ia.m(0, b.height - 2 * b.M.y) + } else { + for (var c = xr(b), d = 90 === c || 270 === c, f = 0, e = b.children, h = e.length, k = 0; k < h; k++) var l = e[k], f = Math.max(f, d ? l.Ya.width : l.Ya.height); + var m = b.alignment, n = m === yr, p = m === zr, q = or(m), r = Math.max(0, + b.breadthLimit), s = Ar(b), t = b.nodeSpacing, v = Br(b), x = n || p ? 0 : v / 2, B = b.rowSpacing, + y = 0; + if (n || p || b.bp || b.cp && 1 === b.maxGenerationCount) y = Math.max(0, b.rowIndent); + var n = b.width, C = b.height, I = 0, H = 0, T = 0, aa = 0, R = 0, N = 0, Z = 0, Ea = 0, ua = 0, Oa = 0; + q && !sr(m) && 135 < c && e.reverse(); + if (sr(m)) if (1 < h) for (k = 0; k < h; k++) { + var l = e[k], na = l.Ya; + 0 === k % 2 && k !== h - 1 ? ua = Math.max(ua, (d ? na.width : na.height) + Pr(l) - t) : 0 !== k % 2 && (Oa = Math.max(Oa, (d ? na.width : na.height) + Pr(l) - t)) + } else 1 === h && (ua = d ? e[0].Ya.width : e[0].Ya.height); + if (q) switch (m) { + case pr: + case er: + H = + 135 > c ? Cr(b, e, ua, I, H) : Dr(b, e, ua, I, H); + ua = H.x; + I = H.width; + H = H.height; + break; + case qr: + for (k = 0; k < h; k++) l = e[k], na = l.Ya, r = 0 === Z ? 0 : B, d ? (l.ia.m(f - na.width, R + r), I = Math.max(I, na.width), H = Math.max(H, R + r + na.height), R += r + na.height) : (l.ia.m(aa + r, f - na.height), I = Math.max(I, aa + r + na.width), H = Math.max(H, na.height), aa += r + na.width), Z++; + break; + case rr: + for (f = 0; f < h; f++) l = e[f], na = l.Ya, r = 0 === Z ? 0 : B, d ? (l.ia.m(t / 2 + b.M.x, R + r), I = Math.max(I, na.width), H = Math.max(H, R + r + na.height), R += r + na.height) : (l.ia.m(aa + r, t / 2 + b.M.y), I = Math.max(I, aa + + r + na.width), H = Math.max(H, na.height), aa += r + na.width), Z++ + } else for (k = 0; k < h; k++) l = e[k], na = l.Ya, d ? (0 < r && 0 < Z && aa + t + na.width > r && (aa < f && Fr(b, m, f - aa, 0, Ea, k - 1), N++, Z = 0, Ea = k, T = H, aa = 0, R = 135 < c ? -H - B : H + B), Oa = 0 === Z ? x : t, Gr(a, l, 0, R), l.ia.m(aa + Oa, R), I = Math.max(I, aa + Oa + na.width), H = Math.max(H, T + (0 === N ? 0 : B) + na.height), aa += Oa + na.width) : (0 < r && 0 < Z && R + t + na.height > r && (R < f && Fr(b, m, 0, f - R, Ea, k - 1), N++, Z = 0, Ea = k, T = I, R = 0, aa = 135 < c ? -I - B : I + B), Oa = 0 === Z ? x : t, Gr(a, l, aa, 0), l.ia.m(aa, R + Oa), H = Math.max(H, R + Oa + na.height), I = Math.max(I, T + (0 === + N ? 0 : B) + na.width), R += Oa + na.height), Z++; + 0 < N && (d ? (H += Math.max(0, s), aa < I && Fr(b, m, I - aa, 0, Ea, h - 1), 0 < y && (p || Ir(b, y, 0, 0, h - 1), I += y)) : (I += Math.max(0, s), R < H && Fr(b, m, 0, H - R, Ea, h - 1), 0 < y && (p || Ir(b, 0, y, 0, h - 1), H += y))); + y = p = 0; + switch (m) { + case Kr: + d ? p += I / 2 - b.M.x - v / 2 : y += H / 2 - b.M.y - v / 2; + break; + case nr: + 0 < N ? d ? p += I / 2 - b.M.x - v / 2 : y += H / 2 - b.M.y - v / 2 : d ? (m = e[0].ia.x + e[0].Ia.x, t = e[h - 1].ia.x + e[h - 1].Ia.x + 2 * e[h - 1].M.x, p += m + (t - m) / 2 - b.M.x - v / 2) : (m = e[0].ia.y + e[0].Ia.y, t = e[h - 1].ia.y + e[h - 1].Ia.y + 2 * e[h - 1].M.y, y += m + (t - m) / 2 - b.M.y - v / 2); + break; + case yr: + d ? + (p -= v, I += v) : (y -= v, H += v); + break; + case zr: + d ? (p += I - b.width + v, I += v) : (y += H - b.height + v, H += v); + break; + case pr: + case er: + d ? p = 1 < h ? p + (ua + t / 2 - b.M.x) : p + (e[0].M.x - b.M.x + e[0].Ia.x) : y = 1 < h ? y + (ua + t / 2 - b.M.y) : y + (e[0].M.y - b.M.y + e[0].Ia.y); + break; + case qr: + d ? p += I + t / 2 - b.M.x : y += H + t / 2 - b.M.y; + break; + case rr: + break; + default: + u.k("Unhandled alignment value " + m.toString()) + } + for (k = 0; k < h; k++) l = e[k], d ? l.ia.m(l.ia.x + l.Ia.x - p, l.ia.y + (135 < c ? (q ? -H : -l.Ya.height) + l.Ia.y - s : C + s + l.Ia.y)) : l.ia.m(l.ia.x + (135 < c ? (q ? -I : -l.Ya.width) + l.Ia.x - s : n + s + l.Ia.x), l.ia.y + + l.Ia.y - y); + d ? (I = Lr(b, I, p), 0 > p && (p = 0), 135 < c && (y += H + s), H += C + s) : (135 < c && (p += I + s), I += n + s, H = Mr(b, H, y), 0 > y && (y = 0)); + b.Ia.m(p, y); + b.Ya.m(I, H) + } + } + + function Cr(a, b, c, d, e) { + var f = b.length; + if (0 === f) return new z(c, 0, d, e); + if (1 === f) { + var h = b[0]; + d = h.Ya.width; + e = h.Ya.height; + return new z(c, 0, d, e) + } + for (var k = a.nodeSpacing, l = a.rowSpacing, m = 90 === xr(a), n = 0, p = 0, q = 0, r = 0; r < f; r++) if (!(0 !== r % 2 || 1 < f && r === f - 1)) { + var h = b[r], s = h.Ya, t = 0 === n ? 0 : l; + if (m) { + var v = Pr(h) - k; + h.ia.m(c - (s.width + v), q + t); + d = Math.max(d, s.width + v); + e = Math.max(e, q + t + s.height); + q += t + s.height + } else v = Pr(h) - k, h.ia.m(p + t, c - (s.height + v)), e = Math.max(e, s.height + v), d = Math.max(d, p + t + s.width), p += t + s.width; + n++ + } + var n = + 0, x = p, B = q; + m ? (p = c + k, q = 0) : (p = 0, q = c + k); + for (r = 0; r < f; r++) 0 !== r % 2 && (h = b[r], s = h.Ya, t = 0 === n ? 0 : l, m ? (v = Pr(h) - k, h.ia.m(p + v, q + t), d = Math.max(d, p + s.width + v), e = Math.max(e, q + t + s.height), q += t + s.height) : (v = Pr(h) - k, h.ia.m(p + t, q + v), d = Math.max(d, p + t + s.width), e = Math.max(e, q + s.height + v), p += t + s.width), n++); + 1 < f && 1 === f % 2 && (h = b[f - 1], s = h.Ya, b = Qr(h, m ? Math.max(Math.abs(B), Math.abs(q)) : Math.max(Math.abs(x), Math.abs(p))), m ? (h.ia.m(c + k / 2 - h.M.x - h.Ia.x, e + b), m = c + k / 2 - h.M.x - h.Ia.x, d = Math.max(d, m + s.width), 0 > m && (d -= m), e = Math.max(e, Math.max(B, + q) + b + s.height), 0 > h.ia.x && (c = Wr(a, h.ia.x, !1, c, k))) : (h.ia.m(d + b, c + k / 2 - h.M.y - h.Ia.y), d = Math.max(d, Math.max(x, p) + b + s.width), m = c + k / 2 - h.M.y - h.Ia.y, e = Math.max(e, m + s.height), 0 > m && (e -= m), 0 > h.ia.y && (c = Wr(a, h.ia.y, !0, c, k)))); + return new z(c, 0, d, e) + } + + function Dr(a, b, c, d, e) { + var f = b.length; + if (0 === f) return new z(c, 0, d, e); + if (1 === f) { + var h = b[0]; + d = h.Ya.width; + e = h.Ya.height; + return new z(c, 0, d, e) + } + for (var k = a.nodeSpacing, l = a.rowSpacing, m = 270 === xr(a), n = 0, p = 0, q = 0, r = 0; r < f; r++) if (!(0 !== r % 2 || 1 < f && r === f - 1)) { + var h = b[r], s = h.Ya, t = 0 === n ? 0 : l; + if (m) { + var v = Pr(h) - k, q = q - (t + s.height); + h.ia.m(c - (s.width + v), q); + d = Math.max(d, s.width + v); + e = Math.max(e, Math.abs(q)) + } else v = Pr(h) - k, p -= t + s.width, h.ia.m(p, c - (s.height + v)), e = Math.max(e, s.height + v), d = Math.max(d, Math.abs(p)); + n++ + } + var n = 0, + x = p, B = q; + m ? (p = c + k, q = 0) : (p = 0, q = c + k); + for (r = 0; r < f; r++) 0 !== r % 2 && (h = b[r], s = h.Ya, t = 0 === n ? 0 : l, m ? (v = Pr(h) - k, q -= t + s.height, h.ia.m(p + v, q), d = Math.max(d, p + s.width + v), e = Math.max(e, Math.abs(q))) : (v = Pr(h) - k, p -= t + s.width, h.ia.m(p, q + v), e = Math.max(e, q + s.height + v), d = Math.max(d, Math.abs(p))), n++); + 1 < f && 1 === f % 2 && (h = b[f - 1], s = h.Ya, l = Qr(h, m ? Math.max(Math.abs(B), Math.abs(q)) : Math.max(Math.abs(x), Math.abs(p))), m ? (h.ia.m(c + k / 2 - h.M.x - h.Ia.x, -e - s.height - l), p = c + k / 2 - h.M.x - h.Ia.x, d = Math.max(d, p + s.width), 0 > p && (d -= p), e = Math.max(e, Math.abs(Math.min(B, + q)) + l + s.height), 0 > h.ia.x && (c = Wr(a, h.ia.x, !1, c, k))) : (h.ia.m(-d - s.width - l, c + k / 2 - h.M.y - h.Ia.y), d = Math.max(d, Math.abs(Math.min(x, p)) + l + s.width), p = c + k / 2 - h.M.y - h.Ia.y, e = Math.max(e, p + s.height), 0 > p && (e -= p), 0 > h.ia.y && (c = Wr(a, h.ia.y, !0, c, k)))); + for (r = 0; r < f; r++) h = b[r], m ? h.ia.m(h.ia.x, h.ia.y + e) : h.ia.m(h.ia.x + d, h.ia.y); + return new z(c, 0, d, e) + } + + function Pr(a) { + return null === a.parent ? 0 : a.parent.nodeSpacing + } + + function Qr(a) { + return null === a.parent ? 0 : a.parent.rowSpacing + } + + function Wr(a, b, c, d, e) { + a = a.children; + for (var f = a.length, h = 0; h < f; h++) c ? a[h].ia.m(a[h].ia.x, a[h].ia.y - b) : a[h].ia.m(a[h].ia.x - b, a[h].ia.y); + b = a[f - 1]; + return Math.max(d, c ? b.Ia.y + b.M.y - e / 2 : b.Ia.x + b.M.x - e / 2) + } + + function Lr(a, b, c) { + switch (a.alignment) { + case nr: + case Kr: + var d = b; + c + a.width > d && (d = c + a.width); + 0 > c && (d -= c); + return d; + case yr: + return a.width > b ? a.width : b; + case zr: + return 2 * a.M.x > b ? a.width : b + a.width - 2 * a.M.x; + case pr: + case er: + return d = Math.min(0, c), c = Math.max(b, c + a.width), Math.max(a.width, c - d); + case qr: + return a.width - a.M.x + a.nodeSpacing / 2 + b; + case rr: + return Math.max(a.width, a.M.x + a.nodeSpacing / 2 + b); + default: + return b + } + } + + function Mr(a, b, c) { + switch (a.alignment) { + case nr: + case Kr: + var d = b; + c + a.height > d && (d = c + a.height); + 0 > c && (d -= c); + return d; + case yr: + return a.height > b ? a.height : b; + case zr: + return 2 * a.M.y > b ? a.height : b + a.height - 2 * a.M.y; + case pr: + case er: + return d = Math.min(0, c), c = Math.max(b, c + a.height), Math.max(a.height, c - d); + case qr: + return a.height - a.M.y + a.nodeSpacing / 2 + b; + case rr: + return Math.max(a.height, a.M.y + a.nodeSpacing / 2 + b); + default: + return b + } + } + + function Nr(a, b, c) { + switch (a) { + case Kr: + b /= 2; + c /= 2; + break; + case nr: + b /= 2; + c /= 2; + break; + case yr: + c = b = 0; + break; + case zr: + break; + default: + u.k("Unhandled alignment value " + a.toString()) + } + return new w(b, c) + } + + function Fr(a, b, c, d, e, f) { + b = Nr(b, c, d); + Ir(a, b.x, b.y, e, f) + } + + function Ir(a, b, c, d, e) { + if (0 !== b || 0 !== c) for (a = a.children; d <= e; d++) { + var f = a[d].ia; + f.x += b; + f.y += c + } + } + + function Gr(a, b, c, d) { + var e = b.parent; + switch (a.Af) { + case Qq: + for (a = b.kc; a.next();) b = a.value, b.fromVertex === e && b.nr.m(c, d); + break; + case Xq: + for (a = b.bc; a.next();) b = a.value, b.toVertex === e && b.nr.m(c, d); + break; + default: + u.k("Unhandled path value " + a.Af.toString()) + } + } + + function Jr(a, b, c) { + for (var d = 0; d < a.length; d++) { + var e = a[d]; + e.x += b; + e.y += c + } + } + + function Hr(a, b, c, d, e, f, h, k) { + var l = xr(b), m = 90 === l || 270 === l, n = b.nodeSpacing; + b = d; + var p = e; + d = f; + e = h; + var q = c.Ss, r = c.jt; + h = c.Ya; + var s = m ? Math.max(e, h.height) : Math.max(d, h.width); + if (null === q || l !== xr(c)) q = Er(a, 2), r = Er(a, 2), m ? (q[0].m(0, 0), q[1].m(0, h.height), r[0].m(h.width, 0), r[1].m(r[0].x, q[1].y)) : (q[0].m(0, 0), q[1].m(h.width, 0), r[0].m(0, h.height), r[1].m(q[1].x, r[0].y)); + if (m) { + c = d; + d = 9999999; + if (!(null === p || 2 > p.length || null === q || 2 > q.length)) for (m = l = 0; l < p.length && m < q.length;) { + e = p[l]; + var t = q[m]; + f = t.x; + var v = t.y; + f += + c; + var x = e; + l + 1 < p.length && (x = p[l + 1]); + var B = t, t = B.x, B = B.y; + m + 1 < q.length && (B = q[m + 1], t = B.x, B = B.y, t += c); + var y = d; + e.y === v ? y = f - e.x : e.y > v && e.y < B ? y = f + (e.y - v) / (B - v) * (t - f) - e.x : v > e.y && v < x.y && (y = f - (e.x + (v - e.y) / (x.y - e.y) * (x.x - e.x))); + y < d && (d = y); + x.y <= e.y ? l++ : B <= v ? m++ : (x.y <= B && l++, B <= x.y && m++) + } + c -= d; + c += n; + l = q; + m = c; + if (null === b || 2 > b.length || null === l || 2 > l.length) d = null; else { + n = Er(a, b.length + l.length); + for (d = f = e = 0; f < l.length && l[f].y < b[0].y;) v = l[f++], n[d++].m(v.x + m, v.y); + for (; e < b.length;) v = b[e++], n[d++].m(v.x, v.y); + for (e = b[b.length - + 1].y; f < l.length && l[f].y <= e;) f++; + for (; f < l.length && l[f].y > e;) v = l[f++], n[d++].m(v.x + m, v.y); + l = Er(a, d); + for (e = 0; e < d; e++) l[e].assign(n[e]); + Or(a, n); + d = l + } + f = r; + v = c; + if (null === p || 2 > p.length || null === f || 2 > f.length) e = null; else { + n = Er(a, p.length + f.length); + for (m = x = l = 0; l < p.length && p[l].y < f[0].y;) e = p[l++], n[m++].m(e.x, e.y); + for (; x < f.length;) e = f[x++], n[m++].m(e.x + v, e.y); + for (f = f[f.length - 1].y; l < p.length && p[l].y <= f;) l++; + for (; l < p.length && p[l].y > f;) e = p[l++], n[m++].m(e.x, e.y); + e = Er(a, m); + for (l = 0; l < m; l++) e[l].assign(n[l]); + Or(a, n) + } + f = + Math.max(0, c) + h.width; + h = s + } else { + c = e; + d = 9999999; + if (!(null === p || 2 > p.length || null === q || 2 > q.length)) for (m = l = 0; l < p.length && m < q.length;) e = p[l], t = q[m], f = t.x, v = t.y, v += c, x = e, l + 1 < p.length && (x = p[l + 1]), B = t, t = B.x, B = B.y, m + 1 < q.length && (B = q[m + 1], t = B.x, B = B.y, B += c), y = d, e.x === f ? y = v - e.y : e.x > f && e.x < t ? y = v + (e.x - f) / (t - f) * (B - v) - e.y : f > e.x && f < x.x && (y = v - (e.y + (f - e.x) / (x.x - e.x) * (x.y - e.y))), y < d && (d = y), x.x <= e.x ? l++ : t <= f ? m++ : (x.x <= t && l++, t <= x.x && m++); + c -= d; + c += n; + l = q; + m = c; + if (null === b || 2 > b.length || null === l || 2 > l.length) d = null; else { + n = Er(a, + b.length + l.length); + for (d = f = e = 0; f < l.length && l[f].x < b[0].x;) v = l[f++], n[d++].m(v.x, v.y + m); + for (; e < b.length;) v = b[e++], n[d++].m(v.x, v.y); + for (e = b[b.length - 1].x; f < l.length && l[f].x <= e;) f++; + for (; f < l.length && l[f].x > e;) v = l[f++], n[d++].m(v.x, v.y + m); + l = Er(a, d); + for (e = 0; e < d; e++) l[e].assign(n[e]); + Or(a, n); + d = l + } + f = r; + v = c; + if (null === p || 2 > p.length || null === f || 2 > f.length) e = null; else { + n = Er(a, p.length + f.length); + for (m = x = l = 0; l < p.length && p[l].x < f[0].x;) e = p[l++], n[m++].m(e.x, e.y); + for (; x < f.length;) e = f[x++], n[m++].m(e.x, e.y + v); + for (f = + f[f.length - 1].x; l < p.length && p[l].x <= f;) l++; + for (; l < p.length && p[l].x > f;) e = p[l++], n[m++].m(e.x, e.y); + e = Er(a, m); + for (l = 0; l < m; l++) e[l].assign(n[l]); + Or(a, n) + } + f = s; + h = Math.max(0, c) + h.height + } + Or(a, b); + Or(a, q); + Or(a, p); + Or(a, r); + k[0] = d; + k[1] = e; + return new z(c, 0, f, h) + } + + function Er(a, b) { + var c = a.By[b]; + if (void 0 !== c && (c = c.pop(), void 0 !== c)) return c; + for (var c = [], d = 0; d < b; d++) c[d] = new w; + return c + } + + function Or(a, b) { + var c = b.length, d = a.By[c]; + void 0 === d && (d = [], a.By[c] = d); + d.push(b) + } + + Y.prototype.arrangeTrees = function () { + if (this.Yc === Wq) for (var a = this.nd.i; a.next();) { + var b = a.value; + if (b instanceof Uq) { + var c = b.Cc; + if (null !== c) { + var d = c.position, c = d.x, d = d.y; + isFinite(c) || (c = 0); + isFinite(d) || (d = 0); + Xr(this, b, c, d) + } + } + } else for (a = this.Ud, b = a.x, c = a.y, a = this.nd.i; a.next();) if (d = a.value, d instanceof Uq) switch (Xr(this, d, b + d.Ia.x, c + d.Ia.y), this.Yc) { + case Tq: + c += d.Ya.height + this.Uf.height; + break; + case Yr: + b += d.Ya.width + this.Uf.width; + break; + default: + u.k("Unhandled arrangement value " + this.Yc.toString()) + } + }; + + function Xr(a, b, c, d) { + if (null !== b) { + b.x = c; + b.y = d; + b = b.children; + for (var e = b.length, f = 0; f < e; f++) { + var h = b[f]; + Xr(a, h, c + h.ia.x, d + h.ia.y) + } + } + } + + Y.prototype.commitLayout = function () { + this.cA(); + this.commitNodes(); + this.Sy(); + this.Qs && this.commitLinks() + }; + Y.prototype.commitNodes = function () { + for (var a = this.network.vertexes.i; a.next();) a.value.commit(); + for (a.reset(); a.next();) this.layoutComments(a.value) + }; + Y.prototype.Sy = function () { + if (this.wz === br) { + for (var a = this.BA, b = [], c = null, d = this.network.vertexes.i; d.next();) { + var e = d.value; + null === c ? c = e.kb.copy() : c.Sh(e.kb); + var f = b[e.level], f = void 0 === f ? Ar(e) : Math.max(f, Ar(e)); + b[e.level] = f + } + for (d = 0; d < b.length; d++) void 0 === b[d] && (b[d] = 0); + 90 === this.angle || 270 === this.angle ? (c.Jf(this.nodeSpacing / 2, this.layerSpacing), e = new w(-this.nodeSpacing / 2, -this.layerSpacing / 2)) : (c.Jf(this.layerSpacing, this.nodeSpacing / 2), e = new w(-this.layerSpacing / 2, -this.nodeSpacing / 2)); + var f = + [], c = 90 === this.angle || 270 === this.angle ? c.width : c.height, h = 0; + if (180 === this.angle || 270 === this.angle) for (d = 0; d < a.length; d++) h += a[d] + b[d]; + for (d = 0; d < a.length; d++) { + var k = a[d] + b[d]; + 270 === this.angle ? (h -= k, f.push(new z(0, h, c, k))) : 90 === this.angle ? (f.push(new z(0, h, c, k)), h += k) : 180 === this.angle ? (h -= k, f.push(new z(h, 0, k, c))) : (f.push(new z(h, 0, k, c)), h += k) + } + this.commitLayers(f, e) + } + }; + Y.prototype.commitLayers = function () { + }; + Y.prototype.commitLinks = function () { + for (var a = this.network.edges.i; a.next();) a.value.commit() + }; + Y.prototype.cA = function () { + for (var a = this.nd.i; a.next();) { + var b = a.value; + b instanceof Uq && Zr(this, b) + } + }; + + function Zr(a, b) { + if (null !== b) { + a.setPortSpots(b); + for (var c = b.children, d = c.length, e = 0; e < d; e++) Zr(a, c[e]) + } + } + + Y.prototype.setPortSpots = function (a) { + var b = a.alignment; + if (or(b)) { + var c = this.Af === Qq, d = xr(a), e; + switch (d) { + case 0: + e = xc; + break; + case 90: + e = Cc; + break; + case 180: + e = wc; + break; + default: + e = vc + } + var f = a.children, h = f.length; + switch (b) { + case pr: + case er: + for (b = 0; b < h; b++) { + var k = f[b], k = (c ? k.kc : k.bc).first(); + if (null !== k && (k = k.link, null !== k)) { + var l = 90 === d || 270 === d ? wc : vc; + if (1 === h || b === h - 1 && 1 === h % 2) switch (d) { + case 0: + l = wc; + break; + case 90: + l = vc; + break; + case 180: + l = xc; + break; + default: + l = Cc + } else 0 === b % 2 && (l = 90 === d || 270 === d ? xc : Cc); + c ? (a.setsPortSpot && + (k.vb = e), a.setsChildPortSpot && (k.xb = l)) : (a.setsPortSpot && (k.vb = l), a.setsChildPortSpot && (k.xb = e)) + } + } + break; + case qr: + l = 90 === d || 270 === d ? xc : Cc; + for (d = c ? a.bc : a.kc; d.next();) k = d.value.link, null !== k && (c ? (a.setsPortSpot && (k.vb = e), a.setsChildPortSpot && (k.xb = l)) : (a.setsPortSpot && (k.vb = l), a.setsChildPortSpot && (k.xb = e))); + break; + case rr: + for (l = 90 === d || 270 === d ? wc : vc, d = c ? a.bc : a.kc; d.next();) k = d.value.link, null !== k && (c ? (a.setsPortSpot && (k.vb = e), a.setsChildPortSpot && (k.xb = l)) : (a.setsPortSpot && (k.vb = l), a.setsChildPortSpot && + (k.xb = e))) + } + } else if (c = xr(a), this.Af === Qq) for (e = a.bc; e.next();) { + if (d = e.value.link, null !== d) { + if (a.setsPortSpot) if (a.portSpot.Lc()) switch (c) { + case 0: + d.vb = xc; + break; + case 90: + d.vb = Cc; + break; + case 180: + d.vb = wc; + break; + default: + d.vb = vc + } else d.vb = a.portSpot; + if (a.setsChildPortSpot) if (a.childPortSpot.Lc()) switch (c) { + case 0: + d.xb = wc; + break; + case 90: + d.xb = vc; + break; + case 180: + d.xb = xc; + break; + default: + d.xb = Cc + } else d.xb = a.childPortSpot + } + } else for (e = a.kc; e.next();) if (d = e.value.link, null !== d) { + if (a.setsPortSpot) if (a.portSpot.Lc()) switch (c) { + case 0: + d.xb = + xc; + break; + case 90: + d.xb = Cc; + break; + case 180: + d.xb = wc; + break; + default: + d.xb = vc + } else d.xb = a.portSpot; + if (a.setsChildPortSpot) if (a.childPortSpot.Lc()) switch (c) { + case 0: + d.vb = wc; + break; + case 90: + d.vb = vc; + break; + case 180: + d.vb = xc; + break; + default: + d.vb = Cc + } else d.vb = a.childPortSpot + } + }; + + function xr(a) { + a = a.angle; + return 45 >= a ? 0 : 135 >= a ? 90 : 225 >= a ? 180 : 315 >= a ? 270 : 0 + } + + function Ar(a) { + var b = xr(a), b = 90 === b || 270 === b, c = a.layerSpacing; + if (0 < a.layerSpacingParentOverlap) var d = Math.min(1, a.layerSpacingParentOverlap), + c = c - (b ? a.height * d : a.width * d); + c < (b ? -a.height : -a.width) && (c = b ? -a.height : -a.width); + return c + } + + function Br(a) { + var b = xr(a), b = 90 === b || 270 === b, c = a.nodeIndent; + if (0 < a.nodeIndentPastParent) var d = Math.min(1, a.nodeIndentPastParent), + c = c + (b ? a.width * d : a.height * d); + return c = Math.max(0, c) + } + + u.defineProperty(Y, {rK: "roots"}, function () { + return this.nd + }, function (a) { + this.nd !== a && (u.C(a, F, Y, "roots"), this.nd = a, this.H()) + }); + u.defineProperty(Y, {path: "path"}, function () { + return this.fr + }, function (a) { + this.fr !== a && (u.rb(a, Y, Y, "path"), this.fr = a, this.H()) + }); + u.defineProperty(Y, {AI: "treeStyle"}, function () { + return this.Wr + }, function (a) { + this.Yc !== a && (u.rb(a, Y, Y, "treeStyle"), a === Rq || a === hr || a === ir || a === gr) && (this.Wr = a, this.H()) + }); + u.defineProperty(Y, {wz: "layerStyle"}, function () { + return this.Cu + }, function (a) { + this.Yc !== a && (u.rb(a, Y, Y, "layerStyle"), a === Sq || a === cr || a === br) && (this.Cu = a, this.H()) + }); + u.defineProperty(Y, {comments: "comments"}, function () { + return this.oh + }, function (a) { + this.oh !== a && (u.j(a, "boolean", Y, "comments"), this.oh = a, this.H()) + }); + u.defineProperty(Y, {Gf: "arrangement"}, function () { + return this.Yc + }, function (a) { + this.Yc !== a && (u.rb(a, Y, Y, "arrangement"), a === Tq || a === Yr || a === Wq) && (this.Yc = a, this.H()) + }); + u.defineProperty(Y, {QC: "arrangementSpacing"}, function () { + return this.Uf + }, function (a) { + u.C(a, ia, Y, "arrangementSpacing"); + this.Uf.L(a) || (this.Uf.assign(a), this.H()) + }); + u.defineProperty(Y, {qK: "rootDefaults"}, function () { + return this.qa + }, function (a) { + this.qa !== a && (u.C(a, Uq, Y, "rootDefaults"), this.qa = a, this.H()) + }); + u.defineProperty(Y, {OI: "alternateDefaults"}, function () { + return this.pa + }, function (a) { + this.pa !== a && (u.C(a, Uq, Y, "alternateDefaults"), this.pa = a, this.H()) + }); + u.defineProperty(Y, {sorting: "sorting"}, function () { + return this.qa.sorting + }, function (a) { + this.qa.sorting !== a && (u.rb(a, Y, Y, "sorting"), a === jr || a === kr || a === lr || mr) && (this.qa.sorting = a, this.H()) + }); + u.defineProperty(Y, {comparer: "comparer"}, function () { + return this.qa.comparer + }, function (a) { + this.qa.comparer !== a && (u.j(a, "function", Y, "comparer"), this.qa.comparer = a, this.H()) + }); + u.defineProperty(Y, {angle: "angle"}, function () { + return this.qa.angle + }, function (a) { + this.qa.angle !== a && (u.j(a, "number", Y, "angle"), 0 === a || 90 === a || 180 === a || 270 === a) && (this.qa.angle = a, this.H()) + }); + u.defineProperty(Y, {alignment: "alignment"}, function () { + return this.qa.alignment + }, function (a) { + this.qa.alignment !== a && (u.rb(a, Y, Y, "alignment"), this.qa.alignment = a, this.H()) + }); + u.defineProperty(Y, {nodeIndent: "nodeIndent"}, function () { + return this.qa.nodeIndent + }, function (a) { + this.qa.nodeIndent !== a && (u.j(a, "number", Y, "nodeIndent"), 0 <= a && (this.qa.nodeIndent = a, this.H())) + }); + u.defineProperty(Y, {nodeIndentPastParent: "nodeIndentPastParent"}, function () { + return this.qa.nodeIndentPastParent + }, function (a) { + this.qa.nodeIndentPastParent !== a && (u.j(a, "number", Y, "nodeIndentPastParent"), 0 <= a && 1 >= a && (this.qa.nodeIndentPastParent = a, this.H())) + }); + u.defineProperty(Y, {nodeSpacing: "nodeSpacing"}, function () { + return this.qa.nodeSpacing + }, function (a) { + this.qa.nodeSpacing !== a && (u.j(a, "number", Y, "nodeSpacing"), this.qa.nodeSpacing = a, this.H()) + }); + u.defineProperty(Y, {layerSpacing: "layerSpacing"}, function () { + return this.qa.layerSpacing + }, function (a) { + this.qa.layerSpacing !== a && (u.j(a, "number", Y, "layerSpacing"), this.qa.layerSpacing = a, this.H()) + }); + u.defineProperty(Y, {layerSpacingParentOverlap: "layerSpacingParentOverlap"}, function () { + return this.qa.layerSpacingParentOverlap + }, function (a) { + this.qa.layerSpacingParentOverlap !== a && (u.j(a, "number", Y, "layerSpacingParentOverlap"), 0 <= a && 1 >= a && (this.qa.layerSpacingParentOverlap = a, this.H())) + }); + u.defineProperty(Y, {compaction: "compaction"}, function () { + return this.qa.compaction + }, function (a) { + this.qa.compaction !== a && (u.rb(a, Y, Y, "compaction"), a === ur || a === wr) && (this.qa.compaction = a, this.H()) + }); + u.defineProperty(Y, {breadthLimit: "breadthLimit"}, function () { + return this.qa.breadthLimit + }, function (a) { + this.qa.breadthLimit !== a && (u.j(a, "number", Y, "breadthLimit"), 0 <= a && (this.qa.breadthLimit = a, this.H())) + }); + u.defineProperty(Y, {rowSpacing: "rowSpacing"}, function () { + return this.qa.rowSpacing + }, function (a) { + this.qa.rowSpacing !== a && (u.j(a, "number", Y, "rowSpacing"), this.qa.rowSpacing = a, this.H()) + }); + u.defineProperty(Y, {rowIndent: "rowIndent"}, function () { + return this.qa.rowIndent + }, function (a) { + this.qa.rowIndent !== a && (u.j(a, "number", Y, "rowIndent"), 0 <= a && (this.qa.rowIndent = a, this.H())) + }); + u.defineProperty(Y, {commentSpacing: "commentSpacing"}, function () { + return this.qa.commentSpacing + }, function (a) { + this.qa.commentSpacing !== a && (u.j(a, "number", Y, "commentSpacing"), this.qa.commentSpacing = a, this.H()) + }); + u.defineProperty(Y, {commentMargin: "commentMargin"}, function () { + return this.qa.commentMargin + }, function (a) { + this.qa.commentMargin !== a && (u.j(a, "number", Y, "commentMargin"), this.qa.commentMargin = a, this.H()) + }); + u.defineProperty(Y, {setsPortSpot: "setsPortSpot"}, function () { + return this.qa.setsPortSpot + }, function (a) { + this.qa.setsPortSpot !== a && (u.j(a, "boolean", Y, "setsPortSpot"), this.qa.setsPortSpot = a, this.H()) + }); + u.defineProperty(Y, {portSpot: "portSpot"}, function () { + return this.qa.portSpot + }, function (a) { + u.C(a, L, Y, "portSpot"); + this.qa.portSpot.L(a) || (this.qa.portSpot = a, this.H()) + }); + u.defineProperty(Y, {setsChildPortSpot: "setsChildPortSpot"}, function () { + return this.qa.setsChildPortSpot + }, function (a) { + this.qa.setsChildPortSpot !== a && (u.j(a, "boolean", Y, "setsChildPortSpot"), this.qa.setsChildPortSpot = a, this.H()) + }); + u.defineProperty(Y, {childPortSpot: "childPortSpot"}, function () { + return this.qa.childPortSpot + }, function (a) { + u.C(a, L, Y, "childPortSpot"); + this.qa.childPortSpot.L(a) || (this.qa.childPortSpot = a, this.H()) + }); + u.defineProperty(Y, {$I: "alternateSorting"}, function () { + return this.pa.sorting + }, function (a) { + this.pa.sorting !== a && (u.rb(a, Y, Y, "alternateSorting"), a === jr || a === kr || a === lr || mr) && (this.pa.sorting = a, this.H()) + }); + u.defineProperty(Y, {NI: "alternateComparer"}, function () { + return this.pa.comparer + }, function (a) { + this.pa.comparer !== a && (u.j(a, "function", Y, "alternateComparer"), this.pa.comparer = a, this.H()) + }); + u.defineProperty(Y, {HI: "alternateAngle"}, function () { + return this.pa.angle + }, function (a) { + this.pa.angle !== a && (u.j(a, "number", Y, "alternateAngle"), 0 === a || 90 === a || 180 === a || 270 === a) && (this.pa.angle = a, this.H()) + }); + u.defineProperty(Y, {GI: "alternateAlignment"}, function () { + return this.pa.alignment + }, function (a) { + this.pa.alignment !== a && (u.rb(a, Y, Y, "alternateAlignment"), this.pa.alignment = a, this.H()) + }); + u.defineProperty(Y, {SI: "alternateNodeIndent"}, function () { + return this.pa.nodeIndent + }, function (a) { + this.pa.nodeIndent !== a && (u.j(a, "number", Y, "alternateNodeIndent"), 0 <= a && (this.pa.nodeIndent = a, this.H())) + }); + u.defineProperty(Y, {TI: "alternateNodeIndentPastParent"}, function () { + return this.pa.nodeIndentPastParent + }, function (a) { + this.pa.nodeIndentPastParent !== a && (u.j(a, "number", Y, "alternateNodeIndentPastParent"), 0 <= a && 1 >= a && (this.pa.nodeIndentPastParent = a, this.H())) + }); + u.defineProperty(Y, {UI: "alternateNodeSpacing"}, function () { + return this.pa.nodeSpacing + }, function (a) { + this.pa.nodeSpacing !== a && (u.j(a, "number", Y, "alternateNodeSpacing"), this.pa.nodeSpacing = a, this.H()) + }); + u.defineProperty(Y, {QI: "alternateLayerSpacing"}, function () { + return this.pa.layerSpacing + }, function (a) { + this.pa.layerSpacing !== a && (u.j(a, "number", Y, "alternateLayerSpacing"), this.pa.layerSpacing = a, this.H()) + }); + u.defineProperty(Y, {RI: "alternateLayerSpacingParentOverlap"}, function () { + return this.pa.layerSpacingParentOverlap + }, function (a) { + this.pa.layerSpacingParentOverlap !== a && (u.j(a, "number", Y, "alternateLayerSpacingParentOverlap"), 0 <= a && 1 >= a && (this.pa.layerSpacingParentOverlap = a, this.H())) + }); + u.defineProperty(Y, {MI: "alternateCompaction"}, function () { + return this.pa.compaction + }, function (a) { + this.pa.compaction !== a && (u.rb(a, Y, Y, "alternateCompaction"), a === ur || a === wr) && (this.pa.compaction = a, this.H()) + }); + u.defineProperty(Y, {II: "alternateBreadthLimit"}, function () { + return this.pa.breadthLimit + }, function (a) { + this.pa.breadthLimit !== a && (u.j(a, "number", Y, "alternateBreadthLimit"), 0 <= a && (this.pa.breadthLimit = a, this.H())) + }); + u.defineProperty(Y, {XI: "alternateRowSpacing"}, function () { + return this.pa.rowSpacing + }, function (a) { + this.pa.rowSpacing !== a && (u.j(a, "number", Y, "alternateRowSpacing"), this.pa.rowSpacing = a, this.H()) + }); + u.defineProperty(Y, {WI: "alternateRowIndent"}, function () { + return this.pa.rowIndent + }, function (a) { + this.pa.rowIndent !== a && (u.j(a, "number", Y, "alternateRowIndent"), 0 <= a && (this.pa.rowIndent = a, this.H())) + }); + u.defineProperty(Y, {LI: "alternateCommentSpacing"}, function () { + return this.pa.commentSpacing + }, function (a) { + this.pa.commentSpacing !== a && (u.j(a, "number", Y, "alternateCommentSpacing"), this.pa.commentSpacing = a, this.H()) + }); + u.defineProperty(Y, {KI: "alternateCommentMargin"}, function () { + return this.pa.commentMargin + }, function (a) { + this.pa.commentMargin !== a && (u.j(a, "number", Y, "alternateCommentMargin"), this.pa.commentMargin = a, this.H()) + }); + u.defineProperty(Y, {ZI: "alternateSetsPortSpot"}, function () { + return this.pa.setsPortSpot + }, function (a) { + this.pa.setsPortSpot !== a && (u.j(a, "boolean", Y, "alternateSetsPortSpot"), this.pa.setsPortSpot = a, this.H()) + }); + u.defineProperty(Y, {VI: "alternatePortSpot"}, function () { + return this.pa.portSpot + }, function (a) { + u.C(a, L, Y, "alternatePortSpot"); + this.pa.portSpot.L(a) || (this.pa.portSpot = a, this.H()) + }); + u.defineProperty(Y, {YI: "alternateSetsChildPortSpot"}, function () { + return this.pa.setsChildPortSpot + }, function (a) { + this.pa.setsChildPortSpot !== a && (u.j(a, "boolean", Y, "alternateSetsChildPortSpot"), this.pa.setsChildPortSpot = a, this.H()) + }); + u.defineProperty(Y, {JI: "alternateChildPortSpot"}, function () { + return this.pa.childPortSpot + }, function (a) { + u.C(a, L, Y, "alternateChildPortSpot"); + this.pa.childPortSpot.L(a) || (this.pa.childPortSpot = a, this.H()) + }); + var Pq; + Y.PathDefault = Pq = u.s(Y, "PathDefault", -1); + var Qq; + Y.PathDestination = Qq = u.s(Y, "PathDestination", 0); + var Xq; + Y.PathSource = Xq = u.s(Y, "PathSource", 1); + var jr; + Y.SortingForwards = jr = u.s(Y, "SortingForwards", 10); + var kr; + Y.SortingReverse = kr = u.s(Y, "SortingReverse", 11); + var lr; + Y.SortingAscending = lr = u.s(Y, "SortingAscending", 12); + var mr; + Y.SortingDescending = mr = u.s(Y, "SortingDescending", 13); + var Kr; + Y.AlignmentCenterSubtrees = Kr = u.s(Y, "AlignmentCenterSubtrees", 20); + var nr; + Y.AlignmentCenterChildren = nr = u.s(Y, "AlignmentCenterChildren", 21); + var yr; + Y.AlignmentStart = yr = u.s(Y, "AlignmentStart", 22); + var zr; + Y.AlignmentEnd = zr = u.s(Y, "AlignmentEnd", 23); + var pr; + Y.AlignmentBus = pr = u.s(Y, "AlignmentBus", 24); + var er; + Y.AlignmentBusBranching = er = u.s(Y, "AlignmentBusBranching", 25); + var qr; + Y.AlignmentTopLeftBus = qr = u.s(Y, "AlignmentTopLeftBus", 26); + var rr; + Y.AlignmentBottomRightBus = rr = u.s(Y, "AlignmentBottomRightBus", 27); + var ur; + Y.CompactionNone = ur = u.s(Y, "CompactionNone", 30); + var wr; + Y.CompactionBlock = wr = u.s(Y, "CompactionBlock", 31); + var Rq; + Y.StyleLayered = Rq = u.s(Y, "StyleLayered", 40); + var ir; + Y.StyleLastParents = ir = u.s(Y, "StyleLastParents", 41); + var hr; + Y.StyleAlternating = hr = u.s(Y, "StyleAlternating", 42); + var gr; + Y.StyleRootOnly = gr = u.s(Y, "StyleRootOnly", 43); + var Tq; + Y.ArrangementVertical = Tq = u.s(Y, "ArrangementVertical", 50); + var Yr; + Y.ArrangementHorizontal = Yr = u.s(Y, "ArrangementHorizontal", 51); + var Wq; + Y.ArrangementFixedRoots = Wq = u.s(Y, "ArrangementFixedRoots", 52); + var Sq; + Y.LayerIndividual = Sq = u.s(Y, "LayerIndividual", 60); + var cr; + Y.LayerSiblings = cr = u.s(Y, "LayerSiblings", 61); + var br; + Y.LayerUniform = br = u.s(Y, "LayerUniform", 62); + + function Vq() { + xa.call(this) + } + + u.Ga(Vq, xa); + u.fa("TreeNetwork", Vq); + Vq.prototype.createVertex = function () { + return new Uq + }; + Vq.prototype.createEdge = function () { + return new $r + }; + + function Uq() { + ya.call(this); + this.initialized = !1; + this.parent = null; + this.children = []; + this.maxGenerationCount = this.maxChildrenCount = this.descendantCount = this.level = 0; + this.comments = null; + this.ia = new w(0, 0); + this.Ya = new ia(0, 0); + this.Ia = new w(0, 0); + this.cp = this.bp = this.aI = !1; + this.jt = this.Ss = null; + this.sorting = jr; + this.comparer = dp; + this.angle = 0; + this.alignment = nr; + this.nodeIndentPastParent = this.nodeIndent = 0; + this.nodeSpacing = 20; + this.layerSpacing = 50; + this.layerSpacingParentOverlap = 0; + this.compaction = wr; + this.breadthLimit = + 0; + this.rowSpacing = 25; + this.commentSpacing = this.rowIndent = 10; + this.commentMargin = 20; + this.setsPortSpot = !0; + this.portSpot = uc; + this.setsChildPortSpot = !0; + this.childPortSpot = uc + } + + u.Ga(Uq, ya); + u.fa("TreeVertex", Uq); + Uq.prototype.copyInheritedPropertiesFrom = function (a) { + null !== a && (this.sorting = a.sorting, this.comparer = a.comparer, this.angle = a.angle, this.alignment = a.alignment, this.nodeIndent = a.nodeIndent, this.nodeIndentPastParent = a.nodeIndentPastParent, this.nodeSpacing = a.nodeSpacing, this.layerSpacing = a.layerSpacing, this.layerSpacingParentOverlap = a.layerSpacingParentOverlap, this.compaction = a.compaction, this.breadthLimit = a.breadthLimit, this.rowSpacing = a.rowSpacing, this.rowIndent = a.rowIndent, this.commentSpacing = a.commentSpacing, + this.commentMargin = a.commentMargin, this.setsPortSpot = a.setsPortSpot, this.portSpot = a.portSpot, this.setsChildPortSpot = a.setsChildPortSpot, this.childPortSpot = a.childPortSpot) + }; + u.u(Uq, {qm: "childrenCount"}, function () { + return this.children.length + }); + u.defineProperty(Uq, {pK: "relativePosition"}, function () { + return this.ia + }, function (a) { + this.ia.set(a) + }); + u.defineProperty(Uq, {zK: "subtreeSize"}, function () { + return this.Ya + }, function (a) { + this.Ya.set(a) + }); + u.defineProperty(Uq, {yK: "subtreeOffset"}, function () { + return this.Ia + }, function (a) { + this.Ia.set(a) + }); + + function $r() { + Aa.call(this); + this.nr = new w(0, 0) + } + + u.Ga($r, Aa); + u.fa("TreeEdge", $r); + $r.prototype.commit = function () { + var a = this.link; + if (null !== a && !a.el) { + var b = this.network.Qb, c = null, d = null; + switch (b.Af) { + case Qq: + c = this.fromVertex; + d = this.toVertex; + break; + case Xq: + c = this.toVertex; + d = this.fromVertex; + break; + default: + u.k("Unhandled path value " + b.Af.toString()) + } + if (null !== c && null !== d) if (b = this.nr, 0 !== b.x || 0 !== b.y || c.aI) { + var d = c.kb, e = xr(c), f = Ar(c), h = c.rowSpacing; + a.updateRoute(); + var k = a.Ve === kh, l = a.dc, m = 0, n, p; + a.rl(); + if (l || k) { + for (m = 2; 4 < a.ka;) a.nE(2); + n = a.l(1); + p = a.l(2) + } else { + for (m = 1; 3 < a.ka;) a.nE(1); + n = + a.l(0); + p = a.l(a.ka - 1) + } + var q = a.l(a.ka - 1), r = 0; + 0 === e ? (c.alignment === zr ? (r = d.bottom + b.y, 0 === b.y && n.y > q.y + c.rowIndent && (r = Math.min(r, Math.max(n.y, r - Br(c))))) : c.alignment === yr ? (r = d.top + b.y, 0 === b.y && n.y < q.y - c.rowIndent && (r = Math.max(r, Math.min(n.y, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.top - c.Ia.y + b.y : d.y + d.height / 2 + b.y, k ? (a.w(m, n.x, r), m++, a.w(m, d.right + f, r), m++, a.w(m, d.right + f + (b.x - h) / 3, r), m++, a.w(m, d.right + f + 2 * (b.x - h) / 3, r), m++, a.w(m, d.right + f + (b.x - h), r), m++, a.w(m, p.x, r)) : (l && (a.w(m, d.right + + f / 2, n.y), m++), a.w(m, d.right + f / 2, r), m++, a.w(m, d.right + f + b.x - (l ? h / 2 : h), r), m++, l && a.w(m, a.l(m - 1).x, p.y))) : 90 === e ? (c.alignment === zr ? (r = d.right + b.x, 0 === b.x && n.x > q.x + c.rowIndent && (r = Math.min(r, Math.max(n.x, r - Br(c))))) : c.alignment === yr ? (r = d.left + b.x, 0 === b.x && n.x < q.x - c.rowIndent && (r = Math.max(r, Math.min(n.x, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.left - c.Ia.x + b.x : d.x + d.width / 2 + b.x, k ? (a.w(m, r, n.y), m++, a.w(m, r, d.bottom + f), m++, a.w(m, r, d.bottom + f + (b.y - h) / 3), m++, a.w(m, r, d.bottom + f + 2 * (b.y - h) / 3), m++, + a.w(m, r, d.bottom + f + (b.y - h)), m++, a.w(m, r, p.y)) : (l && (a.w(m, n.x, d.bottom + f / 2), m++), a.w(m, r, d.bottom + f / 2), m++, a.w(m, r, d.bottom + f + b.y - (l ? h / 2 : h)), m++, l && a.w(m, p.x, a.l(m - 1).y))) : 180 === e ? (c.alignment === zr ? (r = d.bottom + b.y, 0 === b.y && n.y > q.y + c.rowIndent && (r = Math.min(r, Math.max(n.y, r - Br(c))))) : c.alignment === yr ? (r = d.top + b.y, 0 === b.y && n.y < q.y - c.rowIndent && (r = Math.max(r, Math.min(n.y, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.top - c.Ia.y + b.y : d.y + d.height / 2 + b.y, k ? (a.w(m, n.x, r), m++, a.w(m, d.left - f, r), m++, a.w(m, + d.left - f + (b.x + h) / 3, r), m++, a.w(m, d.left - f + 2 * (b.x + h) / 3, r), m++, a.w(m, d.left - f + (b.x + h), r), m++, a.w(m, p.x, r)) : (l && (a.w(m, d.left - f / 2, n.y), m++), a.w(m, d.left - f / 2, r), m++, a.w(m, d.left - f + b.x + (l ? h / 2 : h), r), m++, l && a.w(m, a.l(m - 1).x, p.y))) : 270 === e ? (c.alignment === zr ? (r = d.right + b.x, 0 === b.x && n.x > q.x + c.rowIndent && (r = Math.min(r, Math.max(n.x, r - Br(c))))) : c.alignment === yr ? (r = d.left + b.x, 0 === b.x && n.x < q.x - c.rowIndent && (r = Math.max(r, Math.min(n.x, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.left - c.Ia.x + b.x : d.x + d.width / + 2 + b.x, k ? (a.w(m, r, n.y), m++, a.w(m, r, d.top - f), m++, a.w(m, r, d.top - f + (b.y + h) / 3), m++, a.w(m, r, d.top - f + 2 * (b.y + h) / 3), m++, a.w(m, r, d.top - f + (b.y + h)), m++, a.w(m, r, p.y)) : (l && (a.w(m, n.x, d.top - f / 2), m++), a.w(m, r, d.top - f / 2), m++, a.w(m, r, d.top - f + b.y + (l ? h / 2 : h)), m++, l && a.w(m, p.x, a.l(m - 1).y))) : u.k("Invalid angle " + e); + a.Bi() + } else e = c, f = d, a = this.link, c = xr(e), c !== xr(f) && (b = Ar(e), d = e.kb, e = f.kb, 0 === c && e.left - d.right < b + 1 || 90 === c && e.top - d.bottom < b + 1 || 180 === c && d.left - e.right < b + 1 || 270 === c && d.top - e.bottom < b + 1 || (a.updateRoute(), e = a.Ve === + kh, f = a.dc, h = or(this.fromVertex.alignment), a.rl(), 0 === c ? (c = d.right + b / 2, e ? 4 === a.ka && (b = a.l(3).y, a.V(1, c - 20, a.l(1).y), a.w(2, c - 20, b), a.w(3, c, b), a.w(4, c + 20, b), a.V(5, a.l(5).x, b)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, c, a.l(2).y), a.V(3, c, a.l(3).y)) : 4 === a.ka ? a.w(2, c, a.l(2).y) : 3 === a.ka ? a.V(1, c, a.l(2).y) : 2 === a.ka && a.w(1, c, a.l(1).y)) : 90 === c ? (b = d.bottom + b / 2, e ? 4 === a.ka && (c = a.l(3).x, a.V(1, a.l(1).x, b - 20), a.w(2, c, b - 20), a.w(3, c, b), a.w(4, c, b + 20), a.V(5, c, a.l(5).y)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, + a.l(2).x, b), a.V(3, a.l(3).x, b)) : 4 === a.ka ? a.w(2, a.l(2).x, b) : 3 === a.ka ? a.V(1, a.l(2).x, b) : 2 === a.ka && a.w(1, a.l(1).x, b)) : 180 === c ? (c = d.left - b / 2, e ? 4 === a.ka && (b = a.l(3).y, a.V(1, c + 20, a.l(1).y), a.w(2, c + 20, b), a.w(3, c, b), a.w(4, c - 20, b), a.V(5, a.l(5).x, b)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, c, a.l(2).y), a.V(3, c, a.l(3).y)) : 4 === a.ka ? a.w(2, c, a.l(2).y) : 3 === a.ka ? a.V(1, c, a.l(2).y) : 2 === a.ka && a.w(1, c, a.l(1).y)) : 270 === c && (b = d.top - b / 2, e ? 4 === a.ka && (c = a.l(3).x, a.V(1, a.l(1).x, b + 20), a.w(2, c, b + 20), a.w(3, c, b), a.w(4, c, b - + 20), a.V(5, c, a.l(5).y)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, a.l(2).x, b), a.V(3, a.l(3).x, b)) : 4 === a.ka ? a.w(2, a.l(2).x, b) : 3 === a.ka ? a.V(1, a.l(2).x, b) : 2 === a.ka && a.w(1, a.l(1).x, b)), a.Bi())) + } + }; + u.defineProperty($r, {oK: "relativePoint"}, function () { + return this.nr + }, function (a) { + this.nr.set(a) + }); + + function as() { + this.xn = [] + } + + function Ql(a) { + var b = new as, c = null; + "string" === typeof a ? c = (new DOMParser).parseFromString(a, "text/xml") : a instanceof Document && (c = a.implementation.createDocument("http://www.w3.org/2000/svg", "svg", null), c.appendChild(c.importNode(a.documentElement, !0))); + if (null === c) return null; + a = c.getElementsByTagName("svg"); + if (0 === a.length) return null; + var d = a[0], e = c.getElementsByTagName("linearGradient"), f = c.getElementsByTagName("radialGradient"); + for (a = 0; a < e.length; a++) { + for (var h = e[a], k = Rl(ga, ue, {start: Dc, end: Kc}), + l = h.childNodes, m = 0; m < l.length; m++) if ("stop" === l[m].tagName) { + var n = bs(b, l[m], "stop-color"); + if (null !== n && "" !== n) { + var p = bs(b, l[m], "offset"); + if (null === p || "" === p) p = "0"; + var q = parseFloat(p); + isNaN(q) && (q = 0); + k.addColorStop((-1 !== p.indexOf("%") ? .01 : 1) * q, n) + } + } + h = h.getAttribute("id"); + "string" === typeof h && (b["_brush" + h] = k) + } + for (a = 0; a < f.length; a++) { + h = f[a]; + k = Rl(ga, ve, {start: Ib, end: Ib}); + l = h.childNodes; + for (m = 0; m < l.length; m++) if ("stop" === l[m].tagName && (n = bs(b, l[m], "stop-color"), null !== n && "" !== n)) { + p = bs(b, l[m], "offset"); + if (null === p || "" === p) p = "0"; + q = parseFloat(p); + isNaN(q) && (q = 0); + k.addColorStop((-1 !== p.indexOf("%") ? .01 : 1) * q, n) + } + h = h.getAttribute("id"); + "string" === typeof h && (b["_brush" + h] = k) + } + for (e = !0; e;) for (e = !1, f = c.getElementsByTagName("use"), a = 0; a < f.length; a++) k = f[a], 0 === k.childNodes.length && (h = k.href, void 0 !== h && (h = c.getElementById(h.baseVal.substring(1)), null !== h && (h = h.cloneNode(!0), h.removeAttribute("id"), l = parseFloat(k.getAttribute("x")), isNaN(l) && (l = 0), m = parseFloat(k.getAttribute("y")), isNaN(m) && (m = 0), n = k.getAttribute("transform"), + null === n && (n = ""), k.setAttribute("transform", n + " translate(" + l + "," + m + ")"), k.appendChild(h), "use" === h.tagName && (e = !0)))); + cs(b, d, null); + c = new A; + if (0 === b.xn.length) return c; + if (1 === b.xn.length) return b.xn[0]; + for (a = 0; a < b.xn.length; a++) c.add(b.xn[a]); + return c + } + + function ds(a, b) { + var c = a.getAttribute(b); + "string" !== typeof c && a.style && (c = a.style[b]); + return "string" !== typeof c ? null : c + } + + function bs(a, b, c) { + var d = b.getAttribute(c); + "string" !== typeof d && b.style && (d = b.style[c]); + return "string" !== typeof d || "" === d || "inherit" === d ? (b = b.parentNode, "g" === b.tagName || "use" === b.tagName ? bs(a, b, c) : null) : d + } + + function cs(a, b, c) { + var d = b.tagName; + if (("g" === d || "svg" === d || "use" === d || "symbol" === d) && "none" !== bs(a, b, "display")) { + for (var d = b.childNodes, e = 0; e < d.length; e++) { + var f = d[e], h = null; + if (void 0 !== f.getAttribute) { + var k = f.getAttribute("transform"); + switch (f.tagName) { + case "g": + null === k ? cs(a, f, null) : (h = new A, cs(a, f, h)); + break; + case "use": + null === k ? cs(a, f, null) : (h = new A, cs(a, f, h)); + break; + case "symbol": + if ("use" !== b.tagName) break; + h = new A; + cs(a, f, h); + var l = h, m = a, n = f; + bs(m, n, "preserveAspectRatio"); + bs(m, n, "viewBox"); + l.scale = + 1; + break; + case "path": + l = f; + h = new X; + l = l.getAttribute("d"); + "string" === typeof l && (h.EG = rd(l)); + break; + case "line": + var p = f, h = new X, l = parseFloat(p.getAttribute("x1")); + isNaN(l) && (l = 0); + m = parseFloat(p.getAttribute("y1")); + isNaN(m) && (m = 0); + n = parseFloat(p.getAttribute("x2")); + isNaN(n) && (n = 0); + p = parseFloat(p.getAttribute("y2")); + isNaN(p) && (p = 0); + var q = new $c(dd); + h.position = new w(Math.min(l, n), Math.min(m, p)); + 0 < (n - l) / (p - m) ? (q.ua = 0, q.va = 0, q.F = Math.abs(n - l), q.G = Math.abs(p - m)) : (q.ua = 0, q.va = Math.abs(p - m), q.F = Math.abs(n - l), q.G = + 0); + h.dd = q; + break; + case "circle": + n = f; + h = new X; + l = parseFloat(n.getAttribute("r")); + isNaN(l) || 0 > l ? h = null : (m = parseFloat(n.getAttribute("cx")), isNaN(m) && (m = 0), n = parseFloat(n.getAttribute("cy")), isNaN(n) && (n = 0), p = new $c(nd), p.ua = 0, p.va = 0, p.F = 2 * l, p.G = 2 * l, h.position = new w(m - l, n - l), h.dd = p); + break; + case "ellipse": + p = f; + h = new X; + l = parseFloat(p.getAttribute("rx")); + isNaN(l) || 0 > l ? h = null : (m = parseFloat(p.getAttribute("ry")), isNaN(m) || 0 > m ? h = null : (n = parseFloat(p.getAttribute("cx")), isNaN(n) && (n = 0), p = parseFloat(p.getAttribute("cy")), + isNaN(p) && (p = 0), q = new $c(nd), q.ua = 0, q.va = 0, q.F = 2 * l, q.G = 2 * m, h.position = new w(n - l, p - m), h.dd = q)); + break; + case "rect": + q = f; + h = new X; + l = parseFloat(q.getAttribute("width")); + if (isNaN(l) || 0 > l) h = null; else if (m = parseFloat(q.getAttribute("height")), isNaN(m) || 0 > m) h = null; else { + n = parseFloat(q.getAttribute("x")); + isNaN(n) && (n = 0); + p = parseFloat(q.getAttribute("y")); + isNaN(p) && (p = 0); + var r = q.getAttribute("rx"), s = q.getAttribute("ry"), q = parseFloat(r); + if (isNaN(q) || 0 > q) q = 0; + var t = parseFloat(s); + if (isNaN(t) || 0 > t) t = 0; + null !== r && "" !== + r || null === s || "" === s ? null === r || "" === r || null !== s && "" !== s || (t = q) : q = t; + q = Math.min(q, l / 2); + t = Math.min(t, m / 2); + s = void 0; + 0 === q && 0 === t ? (s = new $c(md), s.ua = 0, s.va = 0, s.F = l, s.G = m) : (s = K.sa / 2, r = u.p(), M(r, q, 0, !0), r.lineTo(l - q, 0), O(r, l - q * s, 0, l, t * s, l, t), r.lineTo(l, m - t), O(r, l, m - t * s, l - q * s, m, l - q, m), r.lineTo(q, m), O(r, q * s, m, 0, m - t * s, 0, m - t), r.lineTo(0, t), O(r, 0, t * s, q * s, 0, q, 0), P(r), s = r.o, u.q(r)); + h.position = new w(n, p); + h.dd = s + } + break; + case "polygon": + h = es(f); + break; + case "polyline": + h = es(f) + } + if (null !== h) { + if (h instanceof X) { + m = h; + l = bs(a, + f, "fill"); + null !== l && -1 !== l.indexOf("url") ? (l = l.substring(l.indexOf("#") + 1, l.length - 1), l = a["_brush" + l], m.fill = l instanceof ga ? l : "black") : m.fill = null === l ? "black" : "none" === l ? null : l; + l = bs(a, f, "stroke"); + null !== l && -1 !== l.indexOf("url") ? (l = l.substring(l.indexOf("#") + 1, l.length - 1), l = a["_brush" + l], m.stroke = l instanceof ga ? l : "black") : m.stroke = "none" === l ? null : l; + l = parseFloat(bs(a, f, "stroke-width")); + isNaN(l) || (m.hb = l); + l = bs(a, f, "stroke-linecap"); + null !== l && (m.qI = l); + l = bs(a, f, "stroke-dasharray"); + if (null !== l && "" !== + l) { + n = l.split(","); + p = []; + for (l = 0; l < n.length; l++) q = parseFloat(n[l]), !isNaN(q) && 0 < q && p.push(q); + m.gA = p + } + f = bs(a, f, "stroke-dashoffset"); + null !== f && "" !== f && (f = parseFloat(f), isNaN(f) || (m.rI = f)); + m.rz = !0 + } + if (null !== k) { + k = k.split(")"); + f = !0; + for (l = 0; l < k.length; l++) /\(.*[^0-9\.,\s-]/.test(k[l]) && (f = !1), /\(.*[0-9]-[0-9]/.test(k[l]) && (f = !1); + if (f) for (l = k.length - 1; 0 <= l; l--) if (m = k[l], "" !== m) switch (n = m.indexOf("("), f = m.substring(0, n).replace(/\s*/, ""), n = m.substring(n + 1).split(/\s*[\s,]\s*/), f) { + case "rotate": + fs(a, h, n); + break; + case "translate": + f = h; + m = parseFloat(n[0]); + isNaN(m) && (m = 0); + n = parseFloat(n[1]); + isNaN(n) && (n = 0); + if (0 !== m || 0 !== n) p = f.position.copy(), isNaN(p.x) && (p.x = 0), isNaN(p.y) && (p.y = 0), f.position = new w(m + p.x, n + p.y); + break; + case "scale": + gs(a, h, n); + break; + case "skewX": + hs(a, h, n); + break; + case "skewY": + is(a, h, n); + break; + case "matrix": + js(a, h, n) + } + } + if (h instanceof A) { + k = h; + l = f = 0; + m = k.position.copy(); + isNaN(m.x) && (m.x = 0); + isNaN(m.y) && (m.y = 0); + for (n = k.elements.i; n.next();) p = n.value.position.copy(), isNaN(p.x) && (p.x = 0), isNaN(p.y) && (p.y = 0), p.x < + f && (f = p.x), p.y < l && (l = p.y); + m.x += f; + m.y += l; + k.position = m + } + null === c ? a.xn.push(h) : c.add(h) + } + } + } + if (null !== h) { + a = ds(b, "visibility"); + if ("hidden" === a || "collapse" === a) h.visible = !1; + b = ds(b, "opacity"); + null !== b && "" !== b && (b = parseFloat(b), isNaN(b) || (h.opacity = b)) + } + } + } + + function js(a, b, c) { + var d = parseFloat(c[0]), e = parseFloat(c[1]), f = parseFloat(c[2]), h = parseFloat(c[3]), + k = parseFloat(c[4]), l = parseFloat(c[5]); + if (!isNaN(d + e + f + h + k + l)) { + var m = b.position.copy(); + isNaN(m.x) && (m.x = 0); + isNaN(m.y) && (m.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + if (c.type === md) c = a.Xr(c); else if (c.type === nd) c = ks(c); else if (c.type === dd) { + c.type = ad; + a = new bd(c.ua, c.va); + var n = new Jd(pd, c.F, c.G); + a.Fa.add(n); + c.ub.add(a) + } + c.offset(m.x, m.y); + c.transform(d, e, f, h, k - m.x, l - m.y); + a = c.normalize(); + b.dd = c; + m.x -= a.x; + m.y -= a.y; + b.position = m + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) e = b.value, d = e.position.copy(), d.x += m.x, d.y += m.y, e.position = d; + for (b.reset(); b.next();) js(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= m.x, d.y -= m.y, a.position = d + } + } + } + + function fs(a, b, c) { + var d = parseFloat(c[0]); + isNaN(d) && (d = 0); + var e = parseFloat(c[1]); + isNaN(e) && (e = 0); + var f = parseFloat(c[2]); + isNaN(f) && (f = 0); + if (0 !== d) { + var h = d * Math.PI / 180, k = b.position.copy(); + isNaN(k.x) && (k.x = 0); + isNaN(k.y) && (k.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + c.type === nd ? c = ks(c) : c.type === md && (c = a.Xr(c)); + if (c.type === ad) c.rotate(d, e - k.x, f - k.y), f = c.normalize(), b.dd = c, k.x -= f.x, k.y -= f.y, b.position = k; else { + var d = c.ua - e + k.x, l = c.va - f + k.y, m = c.F - e + k.x, n = c.G - f + k.y; + a = d * Math.cos(h) - l * Math.sin(h) + e - k.x; + d = l * Math.cos(h) + + d * Math.sin(h) + f - k.y; + e = m * Math.cos(h) - n * Math.sin(h) + e - k.x; + f = n * Math.cos(h) + m * Math.sin(h) + f - k.y; + m = Math.min(a, e); + n = Math.min(d, f); + c.ua = a - m; + c.va = d - n; + c.F = e - m; + c.G = f - n; + k.x += m; + k.y += n; + b.position = k; + b.dd = c + } + b.fill instanceof ga && (k = b.fill.copy(), c = Math.atan((.5 - k.start.y) / (.5 - k.start.x)), isNaN(c) || (c += h, k.start = new L((1 - Math.cos(c)) / 2, (1 - Math.sin(c)) / 2), k.end = new L((1 + Math.cos(c)) / 2, (1 + Math.sin(c)) / 2)), b.fill = k); + b.stroke instanceof ga && (k = b.stroke.copy(), c = Math.atan((.5 - k.start.y) / (.5 - k.start.x)), isNaN(c) || (c += + h, k.start = new L((1 - Math.cos(c)) / 2, (1 - Math.sin(c)) / 2), k.end = new L((1 + Math.cos(c)) / 2, (1 + Math.sin(c)) / 2)), b.stroke = k) + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) f = b.value, h = f.position.copy(), h.x += k.x, h.y += k.y, f.position = h; + for (b.reset(); b.next();) fs(a, b.value, c); + for (b.reset(); b.next();) c = b.value, h = c.position.copy(), h.x -= k.x, h.y -= k.y, c.position = h + } + } + } + + function gs(a, b, c) { + var d = parseFloat(c[0]); + isNaN(d) && (d = 1); + var e = parseFloat(c[1]); + isNaN(e) && (e = d); + if (1 !== d || 1 !== e) { + var f = b.position.copy(); + isNaN(f.x) && (f.x = 0); + isNaN(f.y) && (f.y = 0); + if (b instanceof X) a = b.dd.copy(), f.x *= d, f.y *= e, b.position = f, a.scale(d, e), b.dd = a; else if (b instanceof A) { + for (b = b.elements.i; b.next();) e = b.value, d = e.position.copy(), d.x += f.x, d.y += f.y, e.position = d; + for (b.reset(); b.next();) gs(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= f.x, d.y -= f.y, a.position = d + } + } + } + + function hs(a, b, c) { + var d = parseFloat(c[0]); + if (!isNaN(d)) { + var d = d * Math.PI / 180, e = b.position.copy(); + isNaN(e.x) && (e.x = 0); + isNaN(e.y) && (e.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + if (c.type === md) c = a.Xr(c); else if (c.type === nd) c = ks(c); else if (c.type === dd) { + c.type = ad; + a = new bd(c.ua, c.va); + var f = new Jd(pd, c.F, c.G); + a.Fa.add(f); + c.ub.add(a) + } + c.offset(e.x, e.y); + c.transform(1, 0, Math.tan(d), 1, -e.x, -e.y); + a = c.normalize(); + b.dd = c; + e.x -= a.x; + e.y -= a.y; + b.position = e + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) d = b.value.position.copy(), + d.x += e.x, d.y += e.y, b.value.position = d; + for (b.reset(); b.next();) hs(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= e.x, d.y -= e.y, a.position = d + } + } + } + + function is(a, b, c) { + var d = parseFloat(c[0]); + if (!isNaN(d)) { + var d = d * Math.PI / 180, e = b.position.copy(); + isNaN(e.x) && (e.x = 0); + isNaN(e.y) && (e.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + if (c.type === md) c = a.Xr(c); else if (c.type === nd) c = ks(c); else if (c.type === dd) { + c.type = ad; + a = new bd(c.ua, c.va); + var f = new Jd(pd, c.F, c.G); + a.Fa.add(f); + c.ub.add(a) + } + c.offset(e.x, e.y); + c.transform(1, Math.tan(d), 0, 1, -e.x, -e.y); + a = c.normalize(); + b.dd = c; + e.x -= a.x; + e.y -= a.y; + b.position = e + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) f = b.value, d = f.position.copy(), + d.x += e.x, d.y += e.y, f.position = d; + for (b.reset(); b.next();) is(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= e.x, d.y -= e.y, a.position = d + } + } + } + + function es(a) { + var b = !1; + if ("polygon" === a.tagName) b = !0; else if ("polyline" !== a.tagName) return null; + var c = new X, d = a.getAttribute("points"); + a = new $c; + var e = new E(bd), f = d.split(/\s*[\s,]\s*/); + if (4 > f.length) return null; + for (var d = null, h = new E(Jd), k = 1; k < f.length; k += 2) { + var l = parseFloat(f[k - 1]), m = parseFloat(f[k]); + if ("number" !== typeof l || isNaN(l) || "number" !== typeof m || isNaN(m)) return null; + 1 === k ? d = new bd(l, m) : h.add(new Jd(pd, l, m)) + } + b && (b = new Jd(pd, d.ua, d.va), b.close(), h.add(b)); + d.Fa = h; + e.add(d); + a.ub = e; + b = a.normalize(); + c.position = new w(-b.x, -b.y); + c.dd = a; + return c + } + + function ks(a) { + var b = a.ua, c = a.va, d = a.F, e = a.G, f = Math.abs(d - b) / 2, h = Math.abs(e - c) / 2, + b = Math.min(b, d) + f, c = Math.min(c, e) + h, e = new bd(b, c - h), d = new Jd(zd); + d.Rb = b + K.sa * f; + d.jc = c - h; + d.df = b + f; + d.ef = c - K.sa * h; + d.F = b + f; + d.G = c; + e.Fa.add(d); + d = new Jd(zd); + d.Rb = b + f; + d.jc = c + K.sa * h; + d.df = b + K.sa * f; + d.ef = c + h; + d.F = b; + d.G = c + h; + e.Fa.add(d); + d = new Jd(zd); + d.Rb = b - K.sa * f; + d.jc = c + h; + d.df = b - f; + d.ef = c + K.sa * h; + d.F = b - f; + d.G = c; + e.Fa.add(d); + d = new Jd(zd); + d.Rb = b - f; + d.jc = c - K.sa * h; + d.df = b - K.sa * f; + d.ef = c - h; + d.F = b; + d.G = c - h; + e.Fa.add(d); + a.type = ad; + a.ub.add(e); + return a + } + + as.prototype.Xr = function (a) { + var b = a.ua, c = a.va, d = a.F, e = a.G, f = Math.min(b, d), h = Math.min(c, e), b = Math.abs(d - b), + c = Math.abs(e - c), e = new bd(f, h); + e.Fa.add(new Jd(pd, f + b, h)); + e.Fa.add(new Jd(pd, f + b, h + c)); + e.Fa.add((new Jd(pd, f, h + c)).close()); + a.type = ad; + a.ub.add(e); + return a + }; + + function Vm() { + S.call(this); + this.Me = null + } + + u.Ga(Vm, S); + Vm.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.element = this.Me.cloneNode(!0) + }; + Vm.prototype.toString = function () { + return "HTMLHost(" + this.Me.toString() + ")#" + u.Uc(this) + }; + Vm.prototype.Mj = function (a, b) { + var c = this.Me; + if (null !== c) { + var d = this.lb(Ib); + d.x -= this.ba.width / 2; + d.y -= this.ba.height / 2; + d.x -= this.ba.x; + d.y -= this.ba.y; + var d = b.VE(d), e = b.Vk; + null === e || e.contains(c) || e.appendChild(c); + e = this.transform; + c.style.transform = "matrix(" + e.m11 + "," + e.m12 + "," + e.m21 + "," + e.m22 + "," + e.dx + "," + e.dy + ")"; + c.style.transformOrigin = "0 0"; + e = d.y; + c.style.left = d.x + "px"; + c.style.top = e + "px" + } + }; + Vm.prototype.Oo = function (a, b, c, d) { + var e = this.xa; + isFinite(e.width) && (a = e.width); + isFinite(e.height) && (b = e.height); + var e = this.af, f = this.vg; + c = Math.max(c, f.width); + d = Math.max(d, f.height); + a = Math.min(e.width, a); + b = Math.min(e.height, b); + a = Math.max(c, a); + b = Math.max(d, b); + c = this.Me; + null !== c && (b = c.getBoundingClientRect(), a = b.width, b = b.height); + bb(this.Hc, a, b); + ml(this, 0, 0, a, b) + }; + Vm.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + u.u(Vm, {Ha: "naturalBounds"}, function () { + return this.Hc + }); + u.defineProperty(Vm, {element: "element"}, function () { + return this.Me + }, function (a) { + var b = this.Me; + b !== a && (a instanceof HTMLElement || u.k("HTMLHost.element must be an instance of HTMLElement."), this.Me = a, a.className = "HTMLHost", this.h("element", b, a), this.ma()) + }); + da.version = "1.5.9"; + window && (window.module && "object" === typeof window.module && "object" === typeof window.module.exports ? window.module.exports = da : window.define && "function" === typeof window.define && window.define.amd ? (window.go = da, window.define(da)) : window.go = da); +})(window); diff --git a/daliuge-translator/dlg/dropmake/web/jquery.min.map b/daliuge-translator/dlg/dropmake/web/jquery.min.map index 1528143c0..25beb38aa 100644 --- a/daliuge-translator/dlg/dropmake/web/jquery.min.map +++ b/daliuge-translator/dlg/dropmake/web/jquery.min.map @@ -1 +1,1211 @@ -{"version":3,"file":"jquery.min.js","sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","deletedIds","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","isEmptyObject","key","nodeType","e","ownLast","globalEval","data","trim","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","makeArray","arr","results","Object","inArray","max","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","pop","push_native","list","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","childNodes","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","parentNode","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","keys","cache","cacheLength","shift","markFunction","assert","div","createElement","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","charAt","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","sibling","n","r","targets","closest","l","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","stack","once","fire","stopOnFalse","disable","remove","lock","locked","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","body","setTimeout","triggerHandler","off","detach","removeEventListener","completed","detachEvent","event","readyState","frameElement","doScroll","doScrollCheck","strundefined","inlineBlockNeedsLayout","container","style","cssText","zoom","offsetWidth","deleteExpando","acceptData","noData","rbrace","rmultiDash","dataAttr","parseJSON","isEmptyDataObject","internalData","pvt","thisCache","internalKey","isNode","toJSON","internalRemoveData","cleanData","applet ","embed ","object ","hasData","removeData","_data","_removeData","queue","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","cssExpand","isHidden","el","css","access","chainable","emptyGet","raw","bulk","rcheckableType","fragment","createDocumentFragment","leadingWhitespace","tbody","htmlSerialize","html5Clone","cloneNode","outerHTML","appendChecked","noCloneChecked","checkClone","noCloneEvent","click","eventName","change","focusin","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","trigger","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","prop","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","one","origFn","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","option","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","getAll","found","fixDefaultChecked","defaultChecked","manipulationTarget","content","disableScript","restoreScript","setGlobalEval","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultSelected","dataAndEvents","deepDataAndEvents","destElements","srcElements","inPage","buildFragment","scripts","selection","wrap","safe","nodes","createTextNode","append","domManip","prepend","insertBefore","before","after","keepData","html","replaceWith","replaceChild","hasScripts","set","iNoClone","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","actualDisplay","display","getDefaultComputedStyle","defaultDisplay","write","close","shrinkWrapBlocksVal","shrinkWrapBlocks","width","rmargin","rnumnonpx","getStyles","curCSS","rposition","getComputedStyle","opener","computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","addGetHookIf","conditionFn","hookFn","condition","pixelPositionVal","boxSizingReliableVal","reliableHiddenOffsetsVal","reliableMarginRightVal","opacity","cssFloat","backgroundClip","clearCloneStyle","boxSizing","MozBoxSizing","WebkitBoxSizing","reliableHiddenOffsets","computeStyleTests","boxSizingReliable","pixelPosition","reliableMarginRight","marginRight","offsetHeight","swap","ralpha","ropacity","rdisplayswap","rnumsplit","rrelNum","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","vendorPropName","capName","origName","showHide","show","hidden","setPositiveNumber","subtract","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","cssHooks","cssNumber","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","cssProps","float","$1","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","unit","propHooks","run","percent","eased","duration","step","tween","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","*","createTween","scale","maxIterations","createFxNow","genFx","includeWidth","height","animation","collection","opts","oldfire","checkDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","Animation","properties","stopped","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","getSetAttribute","hrefNormalized","checkOn","optSelected","enctype","optDisabled","radioValue","rreturn","valHooks","optionSet","scrollHeight","nodeHook","boolHook","ruseDefault","getSetInput","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","setAttributeNode","createAttribute","coords","contenteditable","rfocusable","rclickable","removeProp","for","class","notxml","tabindex","parseInt","rclass","addClass","classes","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","nonce","rquery","rvalidtokens","JSON","parse","requireNonComma","depth","str","comma","open","Function","parseXML","DOMParser","parseFromString","ActiveXObject","async","loadXML","ajaxLocParts","ajaxLocation","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","firstDataType","ct","finalDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","processData","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","code","status","abort","statusText","finalText","success","method","crossDomain","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serialize","serializeArray","xhr","createStandardXHR","createActiveXHR","xhrId","xhrCallbacks","xhrSupported","cors","username","xhrFields","isAbort","onreadystatechange","responseText","XMLHttpRequest","script","text script","head","scriptCharset","charset","onload","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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"} \ No newline at end of file +{ + "version": 3, + "file": "jquery.min.js", + "sources": [ + "jquery.js" + ], + "names": [ + "global", + "factory", + "module", + "exports", + "document", + "w", + "Error", + "window", + "this", + "noGlobal", + "deletedIds", + "slice", + "concat", + "push", + "indexOf", + "class2type", + "toString", + "hasOwn", + "hasOwnProperty", + "support", + "version", + "jQuery", + "selector", + "context", + "fn", + "init", + "rtrim", + "rmsPrefix", + "rdashAlpha", + "fcamelCase", + "all", + "letter", + "toUpperCase", + "prototype", + "jquery", + "constructor", + "length", + "toArray", + "call", + "get", + "num", + "pushStack", + "elems", + "ret", + "merge", + "prevObject", + "each", + "callback", + "args", + "map", + "elem", + "i", + "apply", + "arguments", + "first", + "eq", + "last", + "len", + "j", + "end", + "sort", + "splice", + "extend", + "src", + "copyIsArray", + "copy", + "name", + "options", + "clone", + "target", + "deep", + "isFunction", + "isPlainObject", + "isArray", + "undefined", + "expando", + "Math", + "random", + "replace", + "isReady", + "error", + "msg", + "noop", + "obj", + "type", + "Array", + "isWindow", + "isNumeric", + "parseFloat", + "isEmptyObject", + "key", + "nodeType", + "e", + "ownLast", + "globalEval", + "data", + "trim", + "execScript", + "camelCase", + "string", + "nodeName", + "toLowerCase", + "value", + "isArraylike", + "text", + "makeArray", + "arr", + "results", + "Object", + "inArray", + "max", + "second", + "grep", + "invert", + "callbackInverse", + "matches", + "callbackExpect", + "arg", + "guid", + "proxy", + "tmp", + "now", + "Date", + "split", + "Sizzle", + "Expr", + "getText", + "isXML", + "tokenize", + "compile", + "select", + "outermostContext", + "sortInput", + "hasDuplicate", + "setDocument", + "docElem", + "documentIsHTML", + "rbuggyQSA", + "rbuggyMatches", + "contains", + "preferredDoc", + "dirruns", + "done", + "classCache", + "createCache", + "tokenCache", + "compilerCache", + "sortOrder", + "a", + "b", + "MAX_NEGATIVE", + "pop", + "push_native", + "list", + "booleans", + "whitespace", + "characterEncoding", + "identifier", + "attributes", + "pseudos", + "rwhitespace", + "RegExp", + "rcomma", + "rcombinators", + "rattributeQuotes", + "rpseudo", + "ridentifier", + "matchExpr", + "ID", + "CLASS", + "TAG", + "ATTR", + "PSEUDO", + "CHILD", + "bool", + "needsContext", + "rinputs", + "rheader", + "rnative", + "rquickExpr", + "rsibling", + "rescape", + "runescape", + "funescape", + "_", + "escaped", + "escapedWhitespace", + "high", + "String", + "fromCharCode", + "unloadHandler", + "childNodes", + "els", + "seed", + "match", + "m", + "groups", + "old", + "nid", + "newContext", + "newSelector", + "ownerDocument", + "exec", + "getElementById", + "parentNode", + "id", + "getElementsByTagName", + "getElementsByClassName", + "qsa", + "test", + "getAttribute", + "setAttribute", + "toSelector", + "testContext", + "join", + "querySelectorAll", + "qsaError", + "removeAttribute", + "keys", + "cache", + "cacheLength", + "shift", + "markFunction", + "assert", + "div", + "createElement", + "removeChild", + "addHandle", + "attrs", + "handler", + "attrHandle", + "siblingCheck", + "cur", + "diff", + "sourceIndex", + "nextSibling", + "createInputPseudo", + "createButtonPseudo", + "createPositionalPseudo", + "argument", + "matchIndexes", + "documentElement", + "node", + "hasCompare", + "parent", + "doc", + "defaultView", + "top", + "addEventListener", + "attachEvent", + "className", + "appendChild", + "createComment", + "getById", + "getElementsByName", + "find", + "filter", + "attrId", + "getAttributeNode", + "tag", + "innerHTML", + "input", + "matchesSelector", + "webkitMatchesSelector", + "mozMatchesSelector", + "oMatchesSelector", + "msMatchesSelector", + "disconnectedMatch", + "compareDocumentPosition", + "adown", + "bup", + "compare", + "sortDetached", + "aup", + "ap", + "bp", + "unshift", + "expr", + "elements", + "attr", + "val", + "specified", + "uniqueSort", + "duplicates", + "detectDuplicates", + "sortStable", + "textContent", + "firstChild", + "nodeValue", + "selectors", + "createPseudo", + "relative", + ">", + "dir", + " ", + "+", + "~", + "preFilter", + "excess", + "unquoted", + "nodeNameSelector", + "pattern", + "operator", + "check", + "result", + "what", + "simple", + "forward", + "ofType", + "xml", + "outerCache", + "nodeIndex", + "start", + "useCache", + "lastChild", + "pseudo", + "setFilters", + "idx", + "matched", + "not", + "matcher", + "unmatched", + "has", + "innerText", + "lang", + "elemLang", + "hash", + "location", + "root", + "focus", + "activeElement", + "hasFocus", + "href", + "tabIndex", + "enabled", + "disabled", + "checked", + "selected", + "selectedIndex", + "empty", + "header", + "button", + "even", + "odd", + "lt", + "gt", + "radio", + "checkbox", + "file", + "password", + "image", + "submit", + "reset", + "filters", + "parseOnly", + "tokens", + "soFar", + "preFilters", + "cached", + "addCombinator", + "combinator", + "base", + "checkNonElements", + "doneName", + "oldCache", + "newCache", + "elementMatcher", + "matchers", + "multipleContexts", + "contexts", + "condense", + "newUnmatched", + "mapped", + "setMatcher", + "postFilter", + "postFinder", + "postSelector", + "temp", + "preMap", + "postMap", + "preexisting", + "matcherIn", + "matcherOut", + "matcherFromTokens", + "checkContext", + "leadingRelative", + "implicitRelative", + "matchContext", + "matchAnyContext", + "matcherFromGroupMatchers", + "elementMatchers", + "setMatchers", + "bySet", + "byElement", + "superMatcher", + "outermost", + "matchedCount", + "setMatched", + "contextBackup", + "dirrunsUnique", + "token", + "compiled", + "div1", + "defaultValue", + "unique", + "isXMLDoc", + "rneedsContext", + "rsingleTag", + "risSimple", + "winnow", + "qualifier", + "self", + "is", + "rootjQuery", + "charAt", + "parseHTML", + "ready", + "rparentsprev", + "guaranteedUnique", + "children", + "contents", + "next", + "prev", + "until", + "sibling", + "n", + "r", + "targets", + "closest", + "l", + "pos", + "index", + "prevAll", + "add", + "addBack", + "parents", + "parentsUntil", + "nextAll", + "nextUntil", + "prevUntil", + "siblings", + "contentDocument", + "contentWindow", + "reverse", + "rnotwhite", + "optionsCache", + "createOptions", + "object", + "flag", + "Callbacks", + "firing", + "memory", + "fired", + "firingLength", + "firingIndex", + "firingStart", + "stack", + "once", + "fire", + "stopOnFalse", + "disable", + "remove", + "lock", + "locked", + "fireWith", + "Deferred", + "func", + "tuples", + "state", + "promise", + "always", + "deferred", + "fail", + "then", + "fns", + "newDefer", + "tuple", + "returned", + "resolve", + "reject", + "progress", + "notify", + "pipe", + "stateString", + "when", + "subordinate", + "resolveValues", + "remaining", + "updateFunc", + "values", + "progressValues", + "notifyWith", + "resolveWith", + "progressContexts", + "resolveContexts", + "readyList", + "readyWait", + "holdReady", + "hold", + "wait", + "body", + "setTimeout", + "triggerHandler", + "off", + "detach", + "removeEventListener", + "completed", + "detachEvent", + "event", + "readyState", + "frameElement", + "doScroll", + "doScrollCheck", + "strundefined", + "inlineBlockNeedsLayout", + "container", + "style", + "cssText", + "zoom", + "offsetWidth", + "deleteExpando", + "acceptData", + "noData", + "rbrace", + "rmultiDash", + "dataAttr", + "parseJSON", + "isEmptyDataObject", + "internalData", + "pvt", + "thisCache", + "internalKey", + "isNode", + "toJSON", + "internalRemoveData", + "cleanData", + "applet ", + "embed ", + "object ", + "hasData", + "removeData", + "_data", + "_removeData", + "queue", + "dequeue", + "startLength", + "hooks", + "_queueHooks", + "stop", + "setter", + "clearQueue", + "count", + "defer", + "pnum", + "source", + "cssExpand", + "isHidden", + "el", + "css", + "access", + "chainable", + "emptyGet", + "raw", + "bulk", + "rcheckableType", + "fragment", + "createDocumentFragment", + "leadingWhitespace", + "tbody", + "htmlSerialize", + "html5Clone", + "cloneNode", + "outerHTML", + "appendChecked", + "noCloneChecked", + "checkClone", + "noCloneEvent", + "click", + "eventName", + "change", + "focusin", + "rformElems", + "rkeyEvent", + "rmouseEvent", + "rfocusMorph", + "rtypenamespace", + "returnTrue", + "returnFalse", + "safeActiveElement", + "err", + "types", + "events", + "t", + "handleObjIn", + "special", + "eventHandle", + "handleObj", + "handlers", + "namespaces", + "origType", + "elemData", + "handle", + "triggered", + "dispatch", + "delegateType", + "bindType", + "namespace", + "delegateCount", + "setup", + "mappedTypes", + "origCount", + "teardown", + "removeEvent", + "trigger", + "onlyHandlers", + "ontype", + "bubbleType", + "eventPath", + "Event", + "isTrigger", + "namespace_re", + "noBubble", + "parentWindow", + "isPropagationStopped", + "preventDefault", + "isDefaultPrevented", + "_default", + "fix", + "handlerQueue", + "delegateTarget", + "preDispatch", + "currentTarget", + "isImmediatePropagationStopped", + "stopPropagation", + "postDispatch", + "sel", + "prop", + "originalEvent", + "fixHook", + "fixHooks", + "mouseHooks", + "keyHooks", + "props", + "srcElement", + "metaKey", + "original", + "which", + "charCode", + "keyCode", + "eventDoc", + "fromElement", + "pageX", + "clientX", + "scrollLeft", + "clientLeft", + "pageY", + "clientY", + "scrollTop", + "clientTop", + "relatedTarget", + "toElement", + "load", + "blur", + "beforeunload", + "returnValue", + "simulate", + "bubble", + "isSimulated", + "defaultPrevented", + "timeStamp", + "cancelBubble", + "stopImmediatePropagation", + "mouseenter", + "mouseleave", + "pointerenter", + "pointerleave", + "orig", + "related", + "submitBubbles", + "form", + "_submit_bubble", + "changeBubbles", + "propertyName", + "_just_changed", + "focusinBubbles", + "attaches", + "on", + "one", + "origFn", + "createSafeFragment", + "nodeNames", + "safeFrag", + "rinlinejQuery", + "rnoshimcache", + "rleadingWhitespace", + "rxhtmlTag", + "rtagName", + "rtbody", + "rhtml", + "rnoInnerhtml", + "rchecked", + "rscriptType", + "rscriptTypeMasked", + "rcleanScript", + "wrapMap", + "option", + "legend", + "area", + "param", + "thead", + "tr", + "col", + "td", + "safeFragment", + "fragmentDiv", + "optgroup", + "tfoot", + "colgroup", + "caption", + "th", + "getAll", + "found", + "fixDefaultChecked", + "defaultChecked", + "manipulationTarget", + "content", + "disableScript", + "restoreScript", + "setGlobalEval", + "refElements", + "cloneCopyEvent", + "dest", + "oldData", + "curData", + "fixCloneNodeIssues", + "defaultSelected", + "dataAndEvents", + "deepDataAndEvents", + "destElements", + "srcElements", + "inPage", + "buildFragment", + "scripts", + "selection", + "wrap", + "safe", + "nodes", + "createTextNode", + "append", + "domManip", + "prepend", + "insertBefore", + "before", + "after", + "keepData", + "html", + "replaceWith", + "replaceChild", + "hasScripts", + "set", + "iNoClone", + "_evalUrl", + "appendTo", + "prependTo", + "insertAfter", + "replaceAll", + "insert", + "iframe", + "elemdisplay", + "actualDisplay", + "display", + "getDefaultComputedStyle", + "defaultDisplay", + "write", + "close", + "shrinkWrapBlocksVal", + "shrinkWrapBlocks", + "width", + "rmargin", + "rnumnonpx", + "getStyles", + "curCSS", + "rposition", + "getComputedStyle", + "opener", + "computed", + "minWidth", + "maxWidth", + "getPropertyValue", + "currentStyle", + "left", + "rs", + "rsLeft", + "runtimeStyle", + "pixelLeft", + "addGetHookIf", + "conditionFn", + "hookFn", + "condition", + "pixelPositionVal", + "boxSizingReliableVal", + "reliableHiddenOffsetsVal", + "reliableMarginRightVal", + "opacity", + "cssFloat", + "backgroundClip", + "clearCloneStyle", + "boxSizing", + "MozBoxSizing", + "WebkitBoxSizing", + "reliableHiddenOffsets", + "computeStyleTests", + "boxSizingReliable", + "pixelPosition", + "reliableMarginRight", + "marginRight", + "offsetHeight", + "swap", + "ralpha", + "ropacity", + "rdisplayswap", + "rnumsplit", + "rrelNum", + "cssShow", + "position", + "visibility", + "cssNormalTransform", + "letterSpacing", + "fontWeight", + "cssPrefixes", + "vendorPropName", + "capName", + "origName", + "showHide", + "show", + "hidden", + "setPositiveNumber", + "subtract", + "augmentWidthOrHeight", + "extra", + "isBorderBox", + "styles", + "getWidthOrHeight", + "valueIsBorderBox", + "cssHooks", + "cssNumber", + "columnCount", + "fillOpacity", + "flexGrow", + "flexShrink", + "lineHeight", + "order", + "orphans", + "widows", + "zIndex", + "cssProps", + "float", + "$1", + "margin", + "padding", + "border", + "prefix", + "suffix", + "expand", + "expanded", + "parts", + "hide", + "toggle", + "Tween", + "easing", + "unit", + "propHooks", + "run", + "percent", + "eased", + "duration", + "step", + "tween", + "fx", + "linear", + "p", + "swing", + "cos", + "PI", + "fxNow", + "timerId", + "rfxtypes", + "rfxnum", + "rrun", + "animationPrefilters", + "defaultPrefilter", + "tweeners", + "*", + "createTween", + "scale", + "maxIterations", + "createFxNow", + "genFx", + "includeWidth", + "height", + "animation", + "collection", + "opts", + "oldfire", + "checkDisplay", + "anim", + "dataShow", + "unqueued", + "overflow", + "overflowX", + "overflowY", + "propFilter", + "specialEasing", + "Animation", + "properties", + "stopped", + "tick", + "currentTime", + "startTime", + "tweens", + "originalProperties", + "originalOptions", + "gotoEnd", + "rejectWith", + "timer", + "complete", + "tweener", + "prefilter", + "speed", + "opt", + "speeds", + "fadeTo", + "to", + "animate", + "optall", + "doAnimation", + "finish", + "stopQueue", + "timers", + "cssFn", + "slideDown", + "slideUp", + "slideToggle", + "fadeIn", + "fadeOut", + "fadeToggle", + "interval", + "setInterval", + "clearInterval", + "slow", + "fast", + "delay", + "time", + "timeout", + "clearTimeout", + "getSetAttribute", + "hrefNormalized", + "checkOn", + "optSelected", + "enctype", + "optDisabled", + "radioValue", + "rreturn", + "valHooks", + "optionSet", + "scrollHeight", + "nodeHook", + "boolHook", + "ruseDefault", + "getSetInput", + "removeAttr", + "nType", + "attrHooks", + "propName", + "attrNames", + "propFix", + "getter", + "setAttributeNode", + "createAttribute", + "coords", + "contenteditable", + "rfocusable", + "rclickable", + "removeProp", + "for", + "class", + "notxml", + "tabindex", + "parseInt", + "rclass", + "addClass", + "classes", + "clazz", + "finalValue", + "proceed", + "removeClass", + "toggleClass", + "stateVal", + "classNames", + "hasClass", + "hover", + "fnOver", + "fnOut", + "bind", + "unbind", + "delegate", + "undelegate", + "nonce", + "rquery", + "rvalidtokens", + "JSON", + "parse", + "requireNonComma", + "depth", + "str", + "comma", + "open", + "Function", + "parseXML", + "DOMParser", + "parseFromString", + "ActiveXObject", + "async", + "loadXML", + "ajaxLocParts", + "ajaxLocation", + "rhash", + "rts", + "rheaders", + "rlocalProtocol", + "rnoContent", + "rprotocol", + "rurl", + "prefilters", + "transports", + "allTypes", + "addToPrefiltersOrTransports", + "structure", + "dataTypeExpression", + "dataType", + "dataTypes", + "inspectPrefiltersOrTransports", + "jqXHR", + "inspected", + "seekingTransport", + "inspect", + "prefilterOrFactory", + "dataTypeOrTransport", + "ajaxExtend", + "flatOptions", + "ajaxSettings", + "ajaxHandleResponses", + "s", + "responses", + "firstDataType", + "ct", + "finalDataType", + "mimeType", + "getResponseHeader", + "converters", + "ajaxConvert", + "response", + "isSuccess", + "conv2", + "current", + "conv", + "responseFields", + "dataFilter", + "active", + "lastModified", + "etag", + "url", + "isLocal", + "processData", + "contentType", + "accepts", + "json", + "* text", + "text html", + "text json", + "text xml", + "ajaxSetup", + "settings", + "ajaxPrefilter", + "ajaxTransport", + "ajax", + "cacheURL", + "responseHeadersString", + "timeoutTimer", + "fireGlobals", + "transport", + "responseHeaders", + "callbackContext", + "globalEventContext", + "completeDeferred", + "statusCode", + "requestHeaders", + "requestHeadersNames", + "strAbort", + "getAllResponseHeaders", + "setRequestHeader", + "lname", + "overrideMimeType", + "code", + "status", + "abort", + "statusText", + "finalText", + "success", + "method", + "crossDomain", + "traditional", + "hasContent", + "ifModified", + "headers", + "beforeSend", + "send", + "nativeStatusText", + "modified", + "getJSON", + "getScript", + "throws", + "wrapAll", + "wrapInner", + "unwrap", + "visible", + "r20", + "rbracket", + "rCRLF", + "rsubmitterTypes", + "rsubmittable", + "buildParams", + "v", + "encodeURIComponent", + "serialize", + "serializeArray", + "xhr", + "createStandardXHR", + "createActiveXHR", + "xhrId", + "xhrCallbacks", + "xhrSupported", + "cors", + "username", + "xhrFields", + "isAbort", + "onreadystatechange", + "responseText", + "XMLHttpRequest", + "script", + "text script", + "head", + "scriptCharset", + "charset", + "onload", + "oldCallbacks", + "rjsonp", + "jsonp", + "jsonpCallback", + "originalSettings", + "callbackName", + "overwritten", + "responseContainer", + "jsonProp", + "keepScripts", + "parsed", + "_load", + "params", + "animated", + "getWindow", + "offset", + "setOffset", + "curPosition", + "curLeft", + "curCSSTop", + "curTop", + "curOffset", + "curCSSLeft", + "calculatePosition", + "curElem", + "using", + "win", + "box", + "getBoundingClientRect", + "pageYOffset", + "pageXOffset", + "offsetParent", + "parentOffset", + "scrollTo", + "Height", + "Width", + "defaultExtra", + "funcName", + "size", + "andSelf", + "define", + "amd", + "_jQuery", + "_$", + "$", + "noConflict" + ], + "mappings": "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" +} \ No newline at end of file diff --git a/daliuge-translator/dlg/dropmake/web/jsoneditor.map b/daliuge-translator/dlg/dropmake/web/jsoneditor.map index d62ead153..19f2ab855 100644 --- a/daliuge-translator/dlg/dropmake/web/jsoneditor.map +++ b/daliuge-translator/dlg/dropmake/web/jsoneditor.map @@ -1 +1,3226 @@ -{"version":3,"file":"jsoneditor.map","sources":["./dist/jsoneditor.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","JSONEditor","container","options","json","Error","ieVersion","util","getInternetExplorerVersion","arguments","length","_create","treemode","textmode","modes","prototype","mode","setMode","_delete","set","get","setText","jsonText","parse","getText","JSON","stringify","setName","name","getName","data","extend","config","asText","clear","mixin","create","load","err","_onError","onError","log","error","registerMode","i","prop","isArray","reserved","Highlighter","History","SearchBox","Node","modeswitcher","dom","highlighter","selection","undefined","_setOptions","history","_createFrame","_createTable","frame","parentNode","removeChild","search","hasOwnProperty","focusNode","domFocus","Function","content","table","params","field","value","node","_setRoot","recurse","expand","appendChild","blur","getValue","updateField","focus","input","querySelector","menu","collapse","tbody","getDom","text","results","expandAll","collapseAll","_onAction","action","add","change","startAutoScroll","mouseY","me","top","getAbsoluteTop","height","clientHeight","bottom","margin","interval","scrollTop","autoScrollStep","scrollHeight","autoScrollTimer","setInterval","stopAutoScroll","clearTimeout","setSelection","range","setSelectionOffset","getSelection","getSelectionOffset","scrollTo","callback","editor","animateTimeout","animateCallback","finalScrollTop","Math","min","max","animate","diff","abs","setTimeout","onEvent","event","_onEvent","document","createElement","className","onclick","target","nodeName","preventDefault","oninput","onchange","onkeydown","onkeyup","oncut","onpaste","onmousedown","onmouseup","onmouseover","onmouseout","addEventListener","onfocusin","onfocusout","title","undo","_onUndo","redo","_onRedo","onChange","disabled","canUndo","canRedo","modeBox","searchBox","type","_onKeyDown","getNodeFromTarget","keynum","which","keyCode","ctrlKey","shiftKey","handled","selectContentEditable","select","previous","next","stopPropagation","contentOuter","col","colgroupContent","width","ace","indentation","Number","_ace","theme","textarea","clientWidth","buttonFormat","format","buttonCompact","compact","editorDom","style","edit","setTheme","setShowPrintMargin","setFontSize","getSession","setTabSize","setUseSoftTabs","setUseWrapMode","poweredBy","createTextNode","href","window","open","on","spellcheck","resize","force","sanitize","setValue","jsonlint","jsonString","validate","jsString","curr","charAt","prev","prevIsBrace","ii","cc","skipComment","parseString","quote","chars","push","parseKey","specialValues","key","regexp","test","indexOf","match","join","a","b","args","console","apply","object","String","Boolean","RegExp","isUrlRegex","isUrl","obj","Object","toString","getAbsoluteLeft","elem","rect","getBoundingClientRect","left","pageXOffset","scrollLeft","pageYOffset","addClassName","classes","split","removeClassName","index","splice","stripFormatting","divElement","childs","childNodes","iMax","child","removeAttribute","attributes","j","attribute","specified","setEndOfContentEditable","contentEditableElement","createRange","selectNodeContents","removeAllRanges","addRange","sel","getRangeAt","rangeCount","startContainer","endContainer","startOffset","endOffset","setStart","firstChild","setEnd","getInnerText","element","buffer","first","flush","nodeValue","hasChildNodes","innerText","prevChild","prevName","_ieVersion","rv","navigator","appName","ua","userAgent","re","exec","parseFloat","$1","isFirefox","listener","useCapture","attachEvent","f","removeEventListener","detachEvent","locked","highlight","setHighlight","_cancelUnhighlight","unhighlight","unhighlightTimer","lock","unlock","actions","editField","oldValue","newValue","editValue","updateValue","appendNode","parent","insertBeforeNode","insertBefore","beforeNode","insertAfterNode","insertAfter","afterNode","removeNode","append","duplicateNode","clone","changeType","oldType","newType","moveNode","startParent","moveTo","startIndex","endParent","endIndex","sort","hideChilds","oldSort","oldChilds","showChilds","newSort","newChilds","timestamp","Date","oldSelection","newSelection","timeout","delay","lastText","tr","td","divInput","tableInput","tbodySearch","refreshSearch","_onDelayedSearch","_onSearch","_onKeyUp","searchNext","searchPrevious","resultIndex","_setActiveResult","activeResult","prevNode","prevElem","searchFieldActive","searchValueActive","updateDom","_clearDelay","forceSearch","resultCount","innerHTML","expanded","setField","fieldEditable","ContextMenu","appendNodeFactory","_updateEditability","editable","path","unshift","setParent","getField","_getDomField","childValue","_getType","childField","arr","forEach","_getDomValue","getLevel","fieldInnerText","valueInnerText","cloneChilds","childClone","getAppend","nextTr","nextSibling","hide","_hasChilds","newTr","appendTr","updateIndexes","moveBefore","trTemp","AppendNode","currentIndex","toLowerCase","searchField","searchValue","_updateDomField","childResults","concat","_updateDomValue","offsetTop","focusElement","elementName","drag","editableDiv","_duplicate","containsNode","_move","clearDom","removedNode","_remove","lastTr","_stringCast","silent","_unescapeHTML","str","domValue","v","t","color","isEmpty","count","domField","oldField","tdDrag","domDrag","tdMenu","tdField","tree","_createDomTree","_onDragStart","mousemove","_onDrag","mouseup","_onDragEnd","oldCursor","body","cursor","mouseX","pageX","level","trThis","trPrev","trNext","trFirst","trLast","trRoot","nodePrev","nodeNext","topThis","topPrev","topFirst","heightThis","bottomNext","heightNext","pageY","moved","offsetHeight","previousSibling","diffX","diffLevel","round","levelNext","_isChildOf","n","_createDomField","domTree","marginLeft","contentEditable","_escapeHTML","_updateDomIndexes","_createDomValue","_createDomExpandButton","borderCollapse","tdExpand","tdSeparator","tdValue","srcElement","expandable","showContextMenu","_onExpand","offsetX","onKeyDown","nextNode","nextDom","nextDom2","altKey","_onDuplicate","_onRemove","_onInsertBefore","_onInsertAfter","lastNode","_lastNode","_getElementName","firstNode","_firstNode","prevElement","_previousElement","appendDom","nextNode2","_previousNode","nextElement","_nextElement","prevDom","isVisible","_nextNode","newNode","_onAppend","_onChangeType","_onSort","direction","order","firstDom","lastDom","lastChild","TYPE_TITLES","auto","array","string","anchor","onClose","titles","items","submenu","click","submenuTitle","close","show","Array","lower","num","numFloat","isNaN","htmlEscaped","replace","substring","escapedText","_escapeJSON","escaped","createModeSwitcher","current","switchMode","availableModes","code","form","view","item","currentMode","currentTitle","box","createMenuItems","list","domItems","separator","li","domItem","button","divIcon","buttonSubmenu","buttonExpand","divExpand","_onExpandItem","domSubItems","subItems","ul","eventListeners","visibleSubmenu","focusButton","overflow","maxHeight","_getVisibleButtons","buttons","expandedItem","subItem","visibleMenu","windowHeight","innerHeight","windowScroll","windowBottom","anchorHeight","menuHeight","mousedown","mousewheel","keydown","fn","alreadyVisible","padding","display","targetIndex","prevButton","nextButton","e","trAppend","tdAppend","domText","paddingLeft","parser","trace","yy","symbols_","JSONString","STRING","JSONNumber","NUMBER","JSONNullLiteral","NULL","JSONBooleanLiteral","TRUE","FALSE","JSONText","JSONValue","EOF","JSONObject","JSONArray","{","}","JSONMemberList","JSONMember",":",",","[","]","JSONElementList","$accept","$end","terminals_",2,4,6,8,10,11,14,17,18,21,22,23,24,"productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$",3,5,7,9,12,13,15,16,1,19,20,25,"defaultActions","parseError","hash","popStack","stack","vstack","lstack","lex","token","self","lexer","recovering","TERROR","setInput","yylloc","yyloc","symbol","preErrorSymbol","state","r","len","newState","expected","yyval","errStr","showPosition","line","loc","first_line","last_line","first_column","last_column","slice","_input","_more","_less","done","matched","conditionStack","ch","lines","unput","more","less","pastInput","past","substr","upcomingInput","pre","tempMatch","rules","_currentRules","flex","begin","condition","popState","pop","conditions","topState","pushState","yy_","$avoiding_name_collisions","YY_START","INITIAL","inclusive","bind","acequire","isDark","cssClass","cssText","importCssString","exportAce","ns","_acequire","global","packaged","_define","original","ACE_NAMESPACE","acequirejs","deps","payload","payloads","parentId","l","dep","lookup","normalizeModule","moduleName","chunks","base","mod","uri","req","returnValue","getNativeFlags","regex","ignoreCase","multiline","extended","sticky","from","real","compliantExecNpcg","compliantLastIndexIncrement","x","lastIndex","r2","source","_xregexp","captureNames","Empty","doesDefinePropertyWork","defineProperty","exception","toInteger","floor","that","TypeError","bound","result","defineGetter","defineSetter","lookupGetter","lookupSetter","supportsAccessors","prototypeOfArray","prototypeOfObject","_toString","owns","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","makeArray","lengthBefore","array_splice","start","deleteCount","pos","removeCount","removed","insert","remove","tailOldPos","tailNewPos","tailCount","lengthAfterRemove","boxedString","splitString","fun","toObject","thisp","map","filter","every","some","reduce","reduceRight","sought","lastIndexOf","getPrototypeOf","__proto__","constructor","getOwnPropertyDescriptor","ERR_NON_OBJECT","property","descriptor","getter","setter","enumerable","configurable","getOwnPropertyNames","keys","createEmpty","empty","propertyIsEnumerable","isPrototypeOf","toLocaleString","valueOf","properties","Type","defineProperties","definePropertyWorksOnObject","definePropertyWorksOnDom","definePropertyFallback","ERR_NON_OBJECT_DESCRIPTOR","ERR_NON_OBJECT_TARGET","ERR_ACCESSORS_NOT_SUPPORTED","seal","freeze","freezeObject","preventExtensions","isSealed","isFrozen","isExtensible","hasDontEnumBug","dontEnums","dontEnumsLength","dontEnum","now","getTime","ws","trim","trimBeginRegexp","trimEndRegexp","o","XHTML_NS","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","createElementNS","hasCssClass","el","addCssClass","removeCssClass","toggleCssClass","setCssClass","include","hasCssString","sheets","createStyleSheet","styleSheets","owningElement","importCssStylsheet","link","rel","getInnerWidth","parseInt","computedStyle","getInnerHeight","getPageScrollTop","getPageScrollLeft","getComputedStyle","currentStyle","scrollbarWidth","inner","minWidth","outer","position","noScrollbar","offsetWidth","withScrollbar","setInnerHtml","innerHtml","cloneNode","replaceChild","setInnerText","textContent","getParentWindow","defaultView","parentWindow","inherits","ctor","superCtor","super_","writable","implement","proto","oop","Keys","ret","MODIFIER_KEYS",224,"KEY_MODS","ctrl","alt","option","shift","super","meta","command","cmd","FUNCTION_KEYS",27,32,33,34,35,36,37,38,39,40,44,45,46,96,97,98,99,100,101,102,103,104,105,"-13",112,113,114,115,116,117,118,119,120,121,122,123,144,145,"PRINTABLE_KEYS",48,49,50,51,52,53,54,55,56,57,59,61,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,107,109,110,187,188,189,190,191,192,219,220,221,222,"enter","escape","esc","del","mods","pow","keyCodeToString","keyString","fromCharCode","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","os","platform","isWin","isIE","isOldIE","isGecko","isMozilla","Controllers","controllers","product","isOldGecko","isOpera","opera","isWebKit","isChrome","isAIR","isIPad","isTouchPad","isChromeOS","normalizeCommandKeys","hashId","getModifierHash","useragent","pressedKeys","altGr","location","keyLocation","ts","timeStamp","dt","defaultPrevented","addListener","wrapper","_wrapper","removeListener","stopEvent","cancelBubble","getButton","capture","eventHandler","releaseCaptureHandler","onMouseUp","addMouseWheelListener","factor","wheelDeltaX","wheelX","wheelY","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","deltaX","deltaY","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","detail","addMultiMouseDownListener","timeouts","callbackName","startX","startY","timer","clicks","eventNames","isNewClick","clientX","clientY","_clicks","metaKey","getModifierString","addCommandKeyListener","lastKeyDownKeyCode","lastDefaultPrevented","postMessage","postMessageId","nextTick","win","messageName","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","last","stringReverse","reverse","stringRepeat","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","deepCopy","cons","arrayToMap","createMap","props","arrayRemove","escapeRegExp","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","lang","BROKEN_SETDATA","USE_IE_MIME_TYPE","TextInput","host","resetSelection","inComposition","inputHandler","selectionStart","selectionEnd","setSelectionRange","resetValue","PLACEHOLDER","syncValue","onContextMenuClose","closeTimeout","tempStyle","renderer","$keepTextAreaAtCursor","$moveTextAreaToCursor","setAttribute","wrap","autocorrect","autocapitalize","opacity","copied","pasted","isSelectionEmpty","isFocused","activeElement","onBlur","onFocus","syncSelection","isAllSelected","createTextRange","moveStart","moveEnd","ownerDocument","parentElement","inPropertyChange","onPropertyChange","syncProperty","sendText","keytable","onCompositionEnd","charCodeAt","onCompositionUpdate","onCompositionStart","onSelect","selectAll","setInputHandler","cb","getInputHandler","afterContextMenu","onPaste","execCommand","onTextInput","onInput","handleClipboardData","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","onCommandKey","$readOnly","session","markUndoGroup","clearSelection","val","lastValue","getRange","setRange","syncComposition","getElement","setReadOnly","readOnly","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","borderTopWidth","borderLeftWidth","maxTop","move","textInput","scroller","DefaultHandlers","mouseHandler","$clickSelection","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","selectByLines","extendSelectionBy","selectByWords","calcDistance","ax","ay","bx","by","sqrt","calcRangeOrientation","row","end","cmp","column","DRAG_OFFSET","ev","inSelection","getDocumentPosition","mousedownEvent","selectionRange","getSelectionRange","selectionEmpty","moveToPosition","time","$focusTimout","inMultiSelectMode","captureMouse","startSelect","setState","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","setStyle","comparePoint","orientedRange","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","distance","getBracketRange","getWordRange","isMultiLine","contains","getLineRange","getAccelKey","$lastScrollTime","isScrolable","isScrollableBy","speed","scrollBy","stop","Tooltip","isOpen","$element","$parentNode","$init","setHtml","html","setPosition","setClassName","getHeight","getWidth","GutterHandler","showTooltip","mouseEvent","annotation","gutter","$annotations","hideTooltip","maxRow","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","tooltipAnnotation","tooltip","$tooltipFollowsMouse","moveTooltip","gutterElement","$cells","right","tooltipTimeout","$gutterLayer","GutterTooltip","gutterRegion","getRegion","selectTo","isMousePressed","$gutter","windowWidth","innerWidth","MouseEvent","$inSelection","propagationStopped","DragdropHandler","prevCursor","vMovement","hMovement","cursorMovedTime","$blockScrolling","moveCursorToPosition","cursorPointOnCaretMoved","SCROLL_CURSOR_HYSTERESIS","SCROLL_CURSOR_DELAY","autoScroll","lineHeight","layerConfig","characterWidth","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","autoScrollStartTime","AUTOSCROLL_DELAY","onDragInterval","dragCursor","addDragMarker","toOrientedRange","dragSelectionMarker","addMarker","getSelectionStyle","$cursorLayer","setBlinking","clearInterval","timerId","counter","onMouseMove","clearDragMarker","removeMarker","fromOrientedRange","isInternal","getReadOnly","onMouseMoveTimer","canAccept","dataTransfer","types","getDropEffect","copyAllowed","moveAllowed","copyModifierState","effectAllowed","dropEffect","blankImage","src","dragOperation","mouseTarget","onDragStart","cancelDrag","draggable","setDragImage","clearData","getTextRange","onDragEnd","setCursorStyle","onDragEnter","onDragOver","onDragLeave","onDrop","moveText","dropData","dragWait","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","dragDrop","$dragEnabled","clickCount","eventTarget","unselectable","url","xhr","XMLHttpRequest","onreadystatechange","readyState","responseText","send","loadScript","s","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","_signal","once","newCallback","handlers","_disabled_","old","removeDefaultHandler","capturing","off","removeAllListeners","init","scriptOptions","scriptUrl","currentScript","_currentScript","currentDocument","scripts","script","getAttribute","attr","deHyphenate","basePath","workerPath","modePath","themePath","m1","toUpperCase","net","suffix","$moduleUrls","all","moduleUrl","component","parts","sep","setModuleUrl","subst","$loading","loadModule","onLoad","moduleType","afterLoad","optionsProvider","setOptions","optList","setOption","getOptions","optionNames","$options","getOption","opt","warn","forwardTo","handlesSet","defaultOptions","defineOptions","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","DefaultGutterHandler","MouseHandler","focusEditor","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","gutterEl","$dragDelay","char","insideStart","$scrollSpeed","mouseMoveHandler","releaseMouse","$mouseMoved","onCaptureEnd","onCaptureInterval","$onCaptureMouseMove","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","getLine","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","commands","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","h","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","passEvent","comparePoints","p1","p2","Range","startRow","startColumn","endRow","endColumn","isEqual","compare","compareRange","containsRange","intersects","isEnd","isStart","inside","insideEnd","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","collapseRows","toScreenRange","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","Selection","getDocument","lead","selectionLead","createAnchor","selectionAnchor","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","getCursor","getPosition","getSelectionAnchor","getSelectionLead","shiftSelection","columns","moveCursorTo","isBackwards","$moveSelection","mover","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectWord","selectAWord","getAWordRange","excludeLastChar","rowEnd","rowStart","foldLine","getFoldLine","selectLine","moveCursorBy","tabSize","getTabSize","isTabStop","firstColumnPosition","screenToDocumentPosition","beforeCursor","getDisplayLine","leadingSpace","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","moveCursorLongWordRight","rightOfCursor","nonTokenRe","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","screenPos","docPos","lineWidgets","keepDesiredColumn","moveCursorToScreen","desiredColumn","getRangeOfMovements","func","toJSON","ranges","r1","fromJSON","rangeList","toSingleRange","MAX_TOKEN_COUNT","Tokenizer","states","regExps","matchMappings","ruleRegExps","matchTotal","mapping","defaultToken","flag","splitterRurles","rule","caseInsensitive","adjustedregex","matchcount","reportError","groupCount","tokenArray","onMatch","$arrayTokens","$applyToken","digit","removeCapturingGroups","splitRegex","createSplitterRegexp","$setMaxTokenCount","values","tokens","inChClass","lastCapture","parenOpen","parenClose","square","getLineTokens","startState","currentState","matchAttempts","skipped","merge","msg","TextHighlightRules","$rules","addRules","prefix","nextState","getRules","embedRules","HighlightRules","escapeRules","$embeds","getEmbeds","normalizeRules","processState","processed","stateName","includeName","toInsert","noEscape","keywordMap","createKeywordMapper","splitChar","keywords","$keywordList","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","getBehaviours","addUnicodePackage","pack","codePoint","packages","L","Ll","Lu","Lt","Lm","Lo","M","Mn","Mc","Me","N","Nd","Nl","No","P","Pd","Ps","Pe","Pi","Pf","Pc","Po","S","Sm","Sc","Sk","So","Z","Zs","Zl","Zp","C","Cc","Cf","Co","Cs","Cn","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","rowCount","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","unicode","Mode","$behaviour","getTokenizer","$tokenizer","$highlightRules","lineCommentStart","blockComment","toggleCommentLines","iter","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","removeInLine","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","minEmptyLength","indent","toggleBlockComment","colDiff","iterator","initialRange","startRange","endRange","getNextLineIndent","tab","$getIndent","checkOutdent","autoOutdent","createWorker","createModeDelegates","$modes","delegations","scope","functionName","$delegator","method","transformAction","param","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","word","score","$id","Anchor","$onChange","$clipPositionToDocument","$insertRight","delta","noClip","Document","$lines","_insertLines","getAllLines","getNewLineCharacter","$split","$detectNewLine","$autoNewLine","$newLineMode","setNewLineMode","newLineMode","getNewLineMode","isNewLine","getLines","$clipPosition","firstLine","lastLine","insertNewLine","insertLines","firstFullRow","lastFullRow","_removeLines","removeNewLine","newLine","removeLines","nl","secondLine","applyDeltas","deltas","revertDeltas","indexToPosition","newlineLength","positionToIndex","BackgroundTokenizer","tokenizer","running","currentLine","$worker","workerStart","endLine","startLine","processedLines","$tokenizeRow","fireUpdateEvent","setTokenizer","setDocument","scheduleStart","$updateOnChange","getState","SearchHighlight","clazz","setRegexp","MAX_RANGES","cache","update","markerLayer","drawSingleLineMarker","FoldLine","foldData","folds","setFoldLine","shiftRow","sameRow","containsRow","walk","lastEnd","isNewRow","placeholder","getNextFoldTo","kind","addRemoveChars","foldBefore","newFoldLine","foldLineNext","idxToPosition","idx","lastFoldEndColumn","RangeList","pointIndex","excludeEdges","addList","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","changeRange","lineDif","consumePoint","point","consumeRange","restorePoint","restoreRange","Fold","subFolds","subFold","collapseChildren","addSubFold","afterStart","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","lastFold","docRow","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$useWrapMode","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","findMatchingBracket","getCommentFoldRange","dir","depth","getFoldWidget","getFoldWidgetRange","$foldStyles","manual","markbegin","markbeginend","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","updateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","$findOpeningBracket","$brackets",")","(","bracket","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","onChangeFold","isFullWidth","bgTokenizer","resetCaches","$resetRowCache","$docRowCache","$screenRowCache","$getRowCacheIndex","cacheArray","low","hi","mid","$wrapData","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","$undoManager","ignore","$deltasDoc","$deltasFold","$informUndoManager","$deltas","setUndoManager","getUndoManager","reset","undoManager","$syncInformUndoManager","group","execute","mergeUndoDeltas","$defaultUndoManager","getTabString","$useSoftTabs","$mode","$indentWithTabs","$tabSize","$overwrite","setOverwrite","overwrite","getOverwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","markers","getMarkers","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","getScrollTop","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","w","lineWidgetWidth","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","lastUndoRange","$getUndoSelection","foldDelta","redoChanges","setUndoSelect","enable","isUndo","isInsert","lastDeltaIsInsert","fromRange","toPosition","toRange","rowDiff","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","size","$moveLines","$clipRowToDocument","MAX_VALUE","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","useWrapMode","getUseWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","wrapData","walkTokens","$getDisplayTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","$computeWrapSplits","CHAR","CHAR_EXT","PUNCTUATION","SPACE","TAB","TAB_SPACE","addSplit","displayed","lastSplit","lastDocSplit","splits","displayLength","isCode","$wrapAsCode","minSplit","getScreenTabSize","maxScreenColumn","screenColumn","getRowLength","getRowLineCount","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","rowCache","doCache","splitIndex","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","destroy","$wrap","firstLineNumber","useSoftTabs","Search","find","$matchIterator","findAll","needle","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","backwards","matchIterator","_callback","$lineIterator","$disableFakeMultiline","wholeWord","modifier","caseSensitive","$assembleMultilineRegExp","skipCurrent","HashHandler","commandKeyBinding","addCommands","$singleCommand","MultiHashHandler","addCommand","removeCommand","bindKey","_buildKeyHash","keepCommand","ckb","keyId","cmdGroup","asDefault","keyPart","chain","binding","parseKeys","_addCommandToBinding","isDefault","removeCommands","bindKeys","keyList","findKeyCommand","$keyChain","CommandManager","byName","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","prompt","gotoLine","getAllRanges","findNext","multiSelectAction","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","firstLineEndCol","selectedText","selectedCount","insertLine","curLine","endCol","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","keyBinding","$mouseHandler","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","selections","startOperation","endOperation","$opResetTimer","curOp","docChanged","selectionChanged","prevOp","commadEvent","previousCommand","scrollSelectionIntoView","animateScrolling","$mergeableCommands","$mergeUndoDeltas","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","handler","oldSession","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeTabSize","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onCursorChange","onScrollTopChange","onScrollLeftChange","onSelectionChange","updateFull","oldEditor","cursorPos","onResize","getTheme","getFontSize","$highlightBrackets","$bracketHighlight","$highlightPending","getCursorPosition","getMatching","$highlightTags","$highlightTagPending","$tagHighlight","prevToken","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","updateLines","$updateHighlightActiveLine","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","startOuter","endOuter","lineCols","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","getBehavioursEnabled","transform","$mergeNextCommand","d","lineState","shouldOutdent","lineIndent","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","setShowInvisibles","showInvisibles","getShowInvisibles","setDisplayIndentGuides","getDisplayIndentGuides","showPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","getWrapBehavioursEnabled","setShowFoldWidgets","getShowFoldWidgets","setFadeFoldWidgets","fade","getFadeFoldWidgets","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","number","amount","charRange","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","endPoint","inVirtualSelectionMode","linesMoved","rangeIndex","showComposition","setCompositionText","hideComposition","getFirstVisibleRow","getLastVisibleRow","isRowVisible","isRowFullyVisible","getFirstFullyVisibleRow","getLastFullyVisibleRow","$getVisibleRowCount","getScrollBottomRow","getScrollTopRow","$moveByPage","scrollToRow","scrollToLine","center","alignCursor","getCursorPositionScreen","matchType","bracketType","found","brackets","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","newRange","preventScroll","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","$pixelPos","$resetCursorStyle","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightActiveLine","highlightSelectedWord","behavioursEnabled","wrapBehavioursEnabled","autoScrollEditorIntoView","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","showLineNumbers","showGutter","displayIndentGuides","fontSize","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","foldStyle","UndoManager","$doc","hasUndo","dirtyCounter","$undoStack","$redoStack","NaN","undoSelectionRange","redoSelectionRange","hasRedo","markClean","isClean","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","rowInfo","annoText","gutterOffset","breakpoints","decorations","$firstLineNumber","lastLineNumber","gutterRenderer","$renderer","cell","textNode","foldWidget","minHeight","$fixedWidth","$padding","$computePadding","ceil","$showLineNumbers","setShowLineNumbers","getShowLineNumbers","paddingRight","Marker","setPadding","setMarkers","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","firstRowScreen","stringBuilder","extraStyle","lineRange","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","getLineHeight","$fontMetrics","$characterSize","getCharacterWidth","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","$tabStrings","tabStr","$indentGuideRe","spaceClass","tabClass","spaceContent","tabContent","scrollLines","lineElements","lineElementsIdx","lineElement","$renderLine","$useLineGroups","oldConfig","fragment","$renderLinesFragment","createDocumentFragment","$textToken","rparen","lparen","$renderToken","replaceReg","replaceFunc","tabIdx","idx4","classToUse","space","output","renderIndentGuide","cols","$renderWrappedLine","onlyContents","splitChars","$renderSimpleLine","$getFoldLineTokens","addTokens","to","renderTokens","$measureNode","IE8","Cursor","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateVisibility","visibility","$updateOpacity","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","blink","getPixelPosition","onScreen","cursorLeft","cursorTop","$selectionMarkers","cursorIndex","pixelPos","$setOverwrite","ScrollBar","classSuffix","setVisible","skipEvent","onScroll","VScrollBar","$scrollbarWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","CHAR_COUNT","FontMetrics","$setMeasureNodeStyles","$main","$testFractionalRect","isRoot","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","setPolling","$measureCharWidth","GutterLayer","MarkerLayer","TextLayer","CursorLayer","editorCss","VirtualRenderer","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","scrollMargin","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","$loop","$renderChanges","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_GUTTER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","$allowBoldFonts","$updatePrintMargin","onChangeNewLineMode","$changedLines","updateFontSize","$changes","$updateSizeAsync","resizing","scrollWidth","$updateCachedSize","$extraHeight","oldSize","$showGutter","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","$animatedScroll","getShowGutter","setShowGutter","$updateGutterLineHighlight","$gutterLineHighlight","$printMarginEl","containerEl","posTop","posLeft","$composition","flint","setScrollMargin","sm","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","unfreeze","st","marginTop","$highlightGutterLine","$updateLines","$autosize","desiredHeight","$gutterWidth","hideScrollbars","screenLines","longestLine","$getLongestLine","horizScroll","hScrollChanged","$vScrollBarAlwaysVisible","vScrollChanged","firstRowHeight","lineCount","charCount","$viewMargin","topMargin","bottomMargin","alignment","STEPS","$calcSteps","fromValue","toValue","steps","x_min","dx","initialScroll","oldSteps","$timer","canvasPos","textToScreenCoordinates","keepTextAreaAtCursor","$themeId","$theme","setMouseCursor","WorkerClient","topLevelNamespaces","classname","workerUrl","$sendDeltaQueue","changeListener","onMessage","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","workerSrc","Blob","blob","blobUrl","URL","webkitURL","createObjectURL","Worker","DOMException","$workerBlob","blobURL","revokeObjectURL","callbackId","callbacks","onmessage","deltaQueue","emit","ex","attachToDocument","q","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","blobBuilder","getBlob","UIWorkerClient","messageBuffer","main","emitSync","sender","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","selectionBefore","other","showOtherMarkers","othersActive","hideOtherMarkers","lengthDiff","distanceFromStart","otherPos","newPos","undosRequired","isSamePoint","accel","selectionMode","isMultiSelect","onMouseSelection","screenAnchor","screenCursor","$enableJumpToDef","addSelectionMarker","oldRange","removeSelectionMarker","tmpSel","rectSel","blockSelect","newCursor","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","onMouseSelectionEnd","onSelectionInterval","selectMoreLines","readonly","selectMore","multiSelect","splitIntoLines","alignCursors","multiSelectCommands","isAvailable","MultiSelect","$multiselectOnSessionChange","$onAddRange","$onRemoveRange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","addAltCursorListeners","altCursor","getSelectionMarkers","$blockChangeEvents","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","yBackwards","docEnd","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","forEachSelection","keepOrder","$byLines","reg","cmdResult","anim","buf","additive","skip","screenLead","toRemove","tmp","words","stopAtFirst","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","fr","lr","guessRange","$reAlignText","forceLeft","alignLeft","startW","textW","endW","alignRight","unAlign","isLeftAligned","isRightAligned","enableMultiselect","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","openingBracketBlock","closingBracketBlock","LineWidgets","widgetManager","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","$onChangeEditor","_inDocument","removeLineWidget","$updateRows","noWidgets","addLineWidget","zIndex","coverGutter","pixelHeight","onWidgetChanged","changedWidgets","fixedWidth","coverLine","binarySearch","comparator","findAnnotations","oldWidget","gutterAnno","sc","arrow","Renderer","_id","getElementById","env","tagName","oldNode","createEditSession","JsonHighlightRules","MatchingBraceOutdent","openBracePos","context","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","initContext","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","CstyleBehaviour","selected","isSaneInsertion","recordAutoInsert","recordMaybeInsert","rightChar","matching","isAutoInsertedClosing","popAutoInsertedClosing","closing","isMaybeInsertedClosing","clearMaybeInsertedClosing","next_indent","leftChar","quotepos","$matchTokenType","iterator2","BaseFoldMode","commentRegex","forceMultiline","getSectionRange","startIndent","subRange","CStyleFoldMode","$outdent","worker","searchboxCss","showReplaceForm","div","setEditor","$initElements","sb","replaceBox","searchOptions","regExpOption","caseSensitiveOption","wholeWordOption","searchInput","replaceInput","_this","activeInput","$searchBarKb","$closeSearchBarKb","Ctrl-f|Command-f|Ctrl-H|Command-Option-F","isReplace","Ctrl-G|Command-G","Ctrl-Shift-G|Command-Shift-G","findPrev","Return","Shift-Return","Alt-Return","Tab","checked","$syncOptions","noMatch","replaceAndFindNext","get_blob","Builder","MSBlobBuilder","bag","builder","endings"],"mappings":"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"} \ No newline at end of file +{ + "version": 3, + "file": "jsoneditor.map", + "sources": [ + "./dist/jsoneditor.js" + ], + "names": [ + "root", + "factory", + "exports", + "module", + "define", + "amd", + "this", + "modules", + "__webpack_require__", + "moduleId", + "installedModules", + "id", + "loaded", + "call", + "m", + "c", + "p", + "JSONEditor", + "container", + "options", + "json", + "Error", + "ieVersion", + "util", + "getInternetExplorerVersion", + "arguments", + "length", + "_create", + "treemode", + "textmode", + "modes", + "prototype", + "mode", + "setMode", + "_delete", + "set", + "get", + "setText", + "jsonText", + "parse", + "getText", + "JSON", + "stringify", + "setName", + "name", + "getName", + "data", + "extend", + "config", + "asText", + "clear", + "mixin", + "create", + "load", + "err", + "_onError", + "onError", + "log", + "error", + "registerMode", + "i", + "prop", + "isArray", + "reserved", + "Highlighter", + "History", + "SearchBox", + "Node", + "modeswitcher", + "dom", + "highlighter", + "selection", + "undefined", + "_setOptions", + "history", + "_createFrame", + "_createTable", + "frame", + "parentNode", + "removeChild", + "search", + "hasOwnProperty", + "focusNode", + "domFocus", + "Function", + "content", + "table", + "params", + "field", + "value", + "node", + "_setRoot", + "recurse", + "expand", + "appendChild", + "blur", + "getValue", + "updateField", + "focus", + "input", + "querySelector", + "menu", + "collapse", + "tbody", + "getDom", + "text", + "results", + "expandAll", + "collapseAll", + "_onAction", + "action", + "add", + "change", + "startAutoScroll", + "mouseY", + "me", + "top", + "getAbsoluteTop", + "height", + "clientHeight", + "bottom", + "margin", + "interval", + "scrollTop", + "autoScrollStep", + "scrollHeight", + "autoScrollTimer", + "setInterval", + "stopAutoScroll", + "clearTimeout", + "setSelection", + "range", + "setSelectionOffset", + "getSelection", + "getSelectionOffset", + "scrollTo", + "callback", + "editor", + "animateTimeout", + "animateCallback", + "finalScrollTop", + "Math", + "min", + "max", + "animate", + "diff", + "abs", + "setTimeout", + "onEvent", + "event", + "_onEvent", + "document", + "createElement", + "className", + "onclick", + "target", + "nodeName", + "preventDefault", + "oninput", + "onchange", + "onkeydown", + "onkeyup", + "oncut", + "onpaste", + "onmousedown", + "onmouseup", + "onmouseover", + "onmouseout", + "addEventListener", + "onfocusin", + "onfocusout", + "title", + "undo", + "_onUndo", + "redo", + "_onRedo", + "onChange", + "disabled", + "canUndo", + "canRedo", + "modeBox", + "searchBox", + "type", + "_onKeyDown", + "getNodeFromTarget", + "keynum", + "which", + "keyCode", + "ctrlKey", + "shiftKey", + "handled", + "selectContentEditable", + "select", + "previous", + "next", + "stopPropagation", + "contentOuter", + "col", + "colgroupContent", + "width", + "ace", + "indentation", + "Number", + "_ace", + "theme", + "textarea", + "clientWidth", + "buttonFormat", + "format", + "buttonCompact", + "compact", + "editorDom", + "style", + "edit", + "setTheme", + "setShowPrintMargin", + "setFontSize", + "getSession", + "setTabSize", + "setUseSoftTabs", + "setUseWrapMode", + "poweredBy", + "createTextNode", + "href", + "window", + "open", + "on", + "spellcheck", + "resize", + "force", + "sanitize", + "setValue", + "jsonlint", + "jsonString", + "validate", + "jsString", + "curr", + "charAt", + "prev", + "prevIsBrace", + "ii", + "cc", + "skipComment", + "parseString", + "quote", + "chars", + "push", + "parseKey", + "specialValues", + "key", + "regexp", + "test", + "indexOf", + "match", + "join", + "a", + "b", + "args", + "console", + "apply", + "object", + "String", + "Boolean", + "RegExp", + "isUrlRegex", + "isUrl", + "obj", + "Object", + "toString", + "getAbsoluteLeft", + "elem", + "rect", + "getBoundingClientRect", + "left", + "pageXOffset", + "scrollLeft", + "pageYOffset", + "addClassName", + "classes", + "split", + "removeClassName", + "index", + "splice", + "stripFormatting", + "divElement", + "childs", + "childNodes", + "iMax", + "child", + "removeAttribute", + "attributes", + "j", + "attribute", + "specified", + "setEndOfContentEditable", + "contentEditableElement", + "createRange", + "selectNodeContents", + "removeAllRanges", + "addRange", + "sel", + "getRangeAt", + "rangeCount", + "startContainer", + "endContainer", + "startOffset", + "endOffset", + "setStart", + "firstChild", + "setEnd", + "getInnerText", + "element", + "buffer", + "first", + "flush", + "nodeValue", + "hasChildNodes", + "innerText", + "prevChild", + "prevName", + "_ieVersion", + "rv", + "navigator", + "appName", + "ua", + "userAgent", + "re", + "exec", + "parseFloat", + "$1", + "isFirefox", + "listener", + "useCapture", + "attachEvent", + "f", + "removeEventListener", + "detachEvent", + "locked", + "highlight", + "setHighlight", + "_cancelUnhighlight", + "unhighlight", + "unhighlightTimer", + "lock", + "unlock", + "actions", + "editField", + "oldValue", + "newValue", + "editValue", + "updateValue", + "appendNode", + "parent", + "insertBeforeNode", + "insertBefore", + "beforeNode", + "insertAfterNode", + "insertAfter", + "afterNode", + "removeNode", + "append", + "duplicateNode", + "clone", + "changeType", + "oldType", + "newType", + "moveNode", + "startParent", + "moveTo", + "startIndex", + "endParent", + "endIndex", + "sort", + "hideChilds", + "oldSort", + "oldChilds", + "showChilds", + "newSort", + "newChilds", + "timestamp", + "Date", + "oldSelection", + "newSelection", + "timeout", + "delay", + "lastText", + "tr", + "td", + "divInput", + "tableInput", + "tbodySearch", + "refreshSearch", + "_onDelayedSearch", + "_onSearch", + "_onKeyUp", + "searchNext", + "searchPrevious", + "resultIndex", + "_setActiveResult", + "activeResult", + "prevNode", + "prevElem", + "searchFieldActive", + "searchValueActive", + "updateDom", + "_clearDelay", + "forceSearch", + "resultCount", + "innerHTML", + "expanded", + "setField", + "fieldEditable", + "ContextMenu", + "appendNodeFactory", + "_updateEditability", + "editable", + "path", + "unshift", + "setParent", + "getField", + "_getDomField", + "childValue", + "_getType", + "childField", + "arr", + "forEach", + "_getDomValue", + "getLevel", + "fieldInnerText", + "valueInnerText", + "cloneChilds", + "childClone", + "getAppend", + "nextTr", + "nextSibling", + "hide", + "_hasChilds", + "newTr", + "appendTr", + "updateIndexes", + "moveBefore", + "trTemp", + "AppendNode", + "currentIndex", + "toLowerCase", + "searchField", + "searchValue", + "_updateDomField", + "childResults", + "concat", + "_updateDomValue", + "offsetTop", + "focusElement", + "elementName", + "drag", + "editableDiv", + "_duplicate", + "containsNode", + "_move", + "clearDom", + "removedNode", + "_remove", + "lastTr", + "_stringCast", + "silent", + "_unescapeHTML", + "str", + "domValue", + "v", + "t", + "color", + "isEmpty", + "count", + "domField", + "oldField", + "tdDrag", + "domDrag", + "tdMenu", + "tdField", + "tree", + "_createDomTree", + "_onDragStart", + "mousemove", + "_onDrag", + "mouseup", + "_onDragEnd", + "oldCursor", + "body", + "cursor", + "mouseX", + "pageX", + "level", + "trThis", + "trPrev", + "trNext", + "trFirst", + "trLast", + "trRoot", + "nodePrev", + "nodeNext", + "topThis", + "topPrev", + "topFirst", + "heightThis", + "bottomNext", + "heightNext", + "pageY", + "moved", + "offsetHeight", + "previousSibling", + "diffX", + "diffLevel", + "round", + "levelNext", + "_isChildOf", + "n", + "_createDomField", + "domTree", + "marginLeft", + "contentEditable", + "_escapeHTML", + "_updateDomIndexes", + "_createDomValue", + "_createDomExpandButton", + "borderCollapse", + "tdExpand", + "tdSeparator", + "tdValue", + "srcElement", + "expandable", + "showContextMenu", + "_onExpand", + "offsetX", + "onKeyDown", + "nextNode", + "nextDom", + "nextDom2", + "altKey", + "_onDuplicate", + "_onRemove", + "_onInsertBefore", + "_onInsertAfter", + "lastNode", + "_lastNode", + "_getElementName", + "firstNode", + "_firstNode", + "prevElement", + "_previousElement", + "appendDom", + "nextNode2", + "_previousNode", + "nextElement", + "_nextElement", + "prevDom", + "isVisible", + "_nextNode", + "newNode", + "_onAppend", + "_onChangeType", + "_onSort", + "direction", + "order", + "firstDom", + "lastDom", + "lastChild", + "TYPE_TITLES", + "auto", + "array", + "string", + "anchor", + "onClose", + "titles", + "items", + "submenu", + "click", + "submenuTitle", + "close", + "show", + "Array", + "lower", + "num", + "numFloat", + "isNaN", + "htmlEscaped", + "replace", + "substring", + "escapedText", + "_escapeJSON", + "escaped", + "createModeSwitcher", + "current", + "switchMode", + "availableModes", + "code", + "form", + "view", + "item", + "currentMode", + "currentTitle", + "box", + "createMenuItems", + "list", + "domItems", + "separator", + "li", + "domItem", + "button", + "divIcon", + "buttonSubmenu", + "buttonExpand", + "divExpand", + "_onExpandItem", + "domSubItems", + "subItems", + "ul", + "eventListeners", + "visibleSubmenu", + "focusButton", + "overflow", + "maxHeight", + "_getVisibleButtons", + "buttons", + "expandedItem", + "subItem", + "visibleMenu", + "windowHeight", + "innerHeight", + "windowScroll", + "windowBottom", + "anchorHeight", + "menuHeight", + "mousedown", + "mousewheel", + "keydown", + "fn", + "alreadyVisible", + "padding", + "display", + "targetIndex", + "prevButton", + "nextButton", + "e", + "trAppend", + "tdAppend", + "domText", + "paddingLeft", + "parser", + "trace", + "yy", + "symbols_", + "JSONString", + "STRING", + "JSONNumber", + "NUMBER", + "JSONNullLiteral", + "NULL", + "JSONBooleanLiteral", + "TRUE", + "FALSE", + "JSONText", + "JSONValue", + "EOF", + "JSONObject", + "JSONArray", + "{", + "}", + "JSONMemberList", + "JSONMember", + ":", + ",", + "[", + "]", + "JSONElementList", + "$accept", + "$end", + "terminals_", + 2, + 4, + 6, + 8, + 10, + 11, + 14, + 17, + 18, + 21, + 22, + 23, + 24, + "productions_", + "performAction", + "yytext", + "yyleng", + "yylineno", + "yystate", + "$$", + "_$", + "$0", + "$", + 3, + 5, + 7, + 9, + 12, + 13, + 15, + 16, + 1, + 19, + 20, + 25, + "defaultActions", + "parseError", + "hash", + "popStack", + "stack", + "vstack", + "lstack", + "lex", + "token", + "self", + "lexer", + "recovering", + "TERROR", + "setInput", + "yylloc", + "yyloc", + "symbol", + "preErrorSymbol", + "state", + "r", + "len", + "newState", + "expected", + "yyval", + "errStr", + "showPosition", + "line", + "loc", + "first_line", + "last_line", + "first_column", + "last_column", + "slice", + "_input", + "_more", + "_less", + "done", + "matched", + "conditionStack", + "ch", + "lines", + "unput", + "more", + "less", + "pastInput", + "past", + "substr", + "upcomingInput", + "pre", + "tempMatch", + "rules", + "_currentRules", + "flex", + "begin", + "condition", + "popState", + "pop", + "conditions", + "topState", + "pushState", + "yy_", + "$avoiding_name_collisions", + "YY_START", + "INITIAL", + "inclusive", + "bind", + "acequire", + "isDark", + "cssClass", + "cssText", + "importCssString", + "exportAce", + "ns", + "_acequire", + "global", + "packaged", + "_define", + "original", + "ACE_NAMESPACE", + "acequirejs", + "deps", + "payload", + "payloads", + "parentId", + "l", + "dep", + "lookup", + "normalizeModule", + "moduleName", + "chunks", + "base", + "mod", + "uri", + "req", + "returnValue", + "getNativeFlags", + "regex", + "ignoreCase", + "multiline", + "extended", + "sticky", + "from", + "real", + "compliantExecNpcg", + "compliantLastIndexIncrement", + "x", + "lastIndex", + "r2", + "source", + "_xregexp", + "captureNames", + "Empty", + "doesDefinePropertyWork", + "defineProperty", + "exception", + "toInteger", + "floor", + "that", + "TypeError", + "bound", + "result", + "defineGetter", + "defineSetter", + "lookupGetter", + "lookupSetter", + "supportsAccessors", + "prototypeOfArray", + "prototypeOfObject", + "_toString", + "owns", + "__defineGetter__", + "__defineSetter__", + "__lookupGetter__", + "__lookupSetter__", + "makeArray", + "lengthBefore", + "array_splice", + "start", + "deleteCount", + "pos", + "removeCount", + "removed", + "insert", + "remove", + "tailOldPos", + "tailNewPos", + "tailCount", + "lengthAfterRemove", + "boxedString", + "splitString", + "fun", + "toObject", + "thisp", + "map", + "filter", + "every", + "some", + "reduce", + "reduceRight", + "sought", + "lastIndexOf", + "getPrototypeOf", + "__proto__", + "constructor", + "getOwnPropertyDescriptor", + "ERR_NON_OBJECT", + "property", + "descriptor", + "getter", + "setter", + "enumerable", + "configurable", + "getOwnPropertyNames", + "keys", + "createEmpty", + "empty", + "propertyIsEnumerable", + "isPrototypeOf", + "toLocaleString", + "valueOf", + "properties", + "Type", + "defineProperties", + "definePropertyWorksOnObject", + "definePropertyWorksOnDom", + "definePropertyFallback", + "ERR_NON_OBJECT_DESCRIPTOR", + "ERR_NON_OBJECT_TARGET", + "ERR_ACCESSORS_NOT_SUPPORTED", + "seal", + "freeze", + "freezeObject", + "preventExtensions", + "isSealed", + "isFrozen", + "isExtensible", + "hasDontEnumBug", + "dontEnums", + "dontEnumsLength", + "dontEnum", + "now", + "getTime", + "ws", + "trim", + "trimBeginRegexp", + "trimEndRegexp", + "o", + "XHTML_NS", + "getDocumentHead", + "doc", + "head", + "getElementsByTagName", + "documentElement", + "tag", + "createElementNS", + "hasCssClass", + "el", + "addCssClass", + "removeCssClass", + "toggleCssClass", + "setCssClass", + "include", + "hasCssString", + "sheets", + "createStyleSheet", + "styleSheets", + "owningElement", + "importCssStylsheet", + "link", + "rel", + "getInnerWidth", + "parseInt", + "computedStyle", + "getInnerHeight", + "getPageScrollTop", + "getPageScrollLeft", + "getComputedStyle", + "currentStyle", + "scrollbarWidth", + "inner", + "minWidth", + "outer", + "position", + "noScrollbar", + "offsetWidth", + "withScrollbar", + "setInnerHtml", + "innerHtml", + "cloneNode", + "replaceChild", + "setInnerText", + "textContent", + "getParentWindow", + "defaultView", + "parentWindow", + "inherits", + "ctor", + "superCtor", + "super_", + "writable", + "implement", + "proto", + "oop", + "Keys", + "ret", + "MODIFIER_KEYS", + 224, + "KEY_MODS", + "ctrl", + "alt", + "option", + "shift", + "super", + "meta", + "command", + "cmd", + "FUNCTION_KEYS", + 27, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 44, + 45, + 46, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + "-13", + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 144, + 145, + "PRINTABLE_KEYS", + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 59, + 61, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 107, + 109, + 110, + 187, + 188, + 189, + 190, + 191, + 192, + 219, + 220, + 221, + 222, + "enter", + "escape", + "esc", + "del", + "mods", + "pow", + "keyCodeToString", + "keyString", + "fromCharCode", + "OS", + "LINUX", + "MAC", + "WINDOWS", + "getOS", + "isMac", + "isLinux", + "os", + "platform", + "isWin", + "isIE", + "isOldIE", + "isGecko", + "isMozilla", + "Controllers", + "controllers", + "product", + "isOldGecko", + "isOpera", + "opera", + "isWebKit", + "isChrome", + "isAIR", + "isIPad", + "isTouchPad", + "isChromeOS", + "normalizeCommandKeys", + "hashId", + "getModifierHash", + "useragent", + "pressedKeys", + "altGr", + "location", + "keyLocation", + "ts", + "timeStamp", + "dt", + "defaultPrevented", + "addListener", + "wrapper", + "_wrapper", + "removeListener", + "stopEvent", + "cancelBubble", + "getButton", + "capture", + "eventHandler", + "releaseCaptureHandler", + "onMouseUp", + "addMouseWheelListener", + "factor", + "wheelDeltaX", + "wheelX", + "wheelY", + "wheelDeltaY", + "wheelDelta", + "deltaMode", + "DOM_DELTA_PIXEL", + "deltaX", + "deltaY", + "DOM_DELTA_LINE", + "DOM_DELTA_PAGE", + "axis", + "HORIZONTAL_AXIS", + "detail", + "addMultiMouseDownListener", + "timeouts", + "callbackName", + "startX", + "startY", + "timer", + "clicks", + "eventNames", + "isNewClick", + "clientX", + "clientY", + "_clicks", + "metaKey", + "getModifierString", + "addCommandKeyListener", + "lastKeyDownKeyCode", + "lastDefaultPrevented", + "postMessage", + "postMessageId", + "nextTick", + "win", + "messageName", + "nextFrame", + "requestAnimationFrame", + "mozRequestAnimationFrame", + "webkitRequestAnimationFrame", + "msRequestAnimationFrame", + "oRequestAnimationFrame", + "last", + "stringReverse", + "reverse", + "stringRepeat", + "stringTrimLeft", + "stringTrimRight", + "copyObject", + "copy", + "copyArray", + "deepCopy", + "cons", + "arrayToMap", + "createMap", + "props", + "arrayRemove", + "escapeRegExp", + "escapeHTML", + "getMatchOffsets", + "regExp", + "matches", + "offset", + "deferredCall", + "fcn", + "deferred", + "cancel", + "schedule", + "isPending", + "delayedCall", + "defaultTimeout", + "_self", + "lang", + "BROKEN_SETDATA", + "USE_IE_MIME_TYPE", + "TextInput", + "host", + "resetSelection", + "inComposition", + "inputHandler", + "selectionStart", + "selectionEnd", + "setSelectionRange", + "resetValue", + "PLACEHOLDER", + "syncValue", + "onContextMenuClose", + "closeTimeout", + "tempStyle", + "renderer", + "$keepTextAreaAtCursor", + "$moveTextAreaToCursor", + "setAttribute", + "wrap", + "autocorrect", + "autocapitalize", + "opacity", + "copied", + "pasted", + "isSelectionEmpty", + "isFocused", + "activeElement", + "onBlur", + "onFocus", + "syncSelection", + "isAllSelected", + "createTextRange", + "moveStart", + "moveEnd", + "ownerDocument", + "parentElement", + "inPropertyChange", + "onPropertyChange", + "syncProperty", + "sendText", + "keytable", + "onCompositionEnd", + "charCodeAt", + "onCompositionUpdate", + "onCompositionStart", + "onSelect", + "selectAll", + "setInputHandler", + "cb", + "getInputHandler", + "afterContextMenu", + "onPaste", + "execCommand", + "onTextInput", + "onInput", + "handleClipboardData", + "clipboardData", + "mime", + "setData", + "getData", + "doCopy", + "isCut", + "getCopyText", + "onCut", + "onCopy", + "onCommandKey", + "$readOnly", + "session", + "markUndoGroup", + "clearSelection", + "val", + "lastValue", + "getRange", + "setRange", + "syncComposition", + "getElement", + "setReadOnly", + "readOnly", + "onContextMenu", + "_emit", + "domEvent", + "moveToMouse", + "bringToFront", + "borderTopWidth", + "borderLeftWidth", + "maxTop", + "move", + "textInput", + "scroller", + "DefaultHandlers", + "mouseHandler", + "$clickSelection", + "setDefaultHandler", + "onMouseDown", + "onDoubleClick", + "onTripleClick", + "onQuadClick", + "onMouseWheel", + "selectByLines", + "extendSelectionBy", + "selectByWords", + "calcDistance", + "ax", + "ay", + "bx", + "by", + "sqrt", + "calcRangeOrientation", + "row", + "end", + "cmp", + "column", + "DRAG_OFFSET", + "ev", + "inSelection", + "getDocumentPosition", + "mousedownEvent", + "selectionRange", + "getSelectionRange", + "selectionEmpty", + "moveToPosition", + "time", + "$focusTimout", + "inMultiSelectMode", + "captureMouse", + "startSelect", + "setState", + "waitForClickSelection", + "screenToTextCoordinates", + "y", + "getShiftKey", + "selectToPosition", + "setCapture", + "setStyle", + "comparePoint", + "orientedRange", + "setSelectionAnchor", + "scrollCursorIntoView", + "unitName", + "cmpStart", + "cmpEnd", + "selectEnd", + "selectAllEnd", + "selectByWordsEnd", + "selectByLinesEnd", + "unsetStyle", + "releaseCapture", + "focusWait", + "distance", + "getBracketRange", + "getWordRange", + "isMultiLine", + "contains", + "getLineRange", + "getAccelKey", + "$lastScrollTime", + "isScrolable", + "isScrollableBy", + "speed", + "scrollBy", + "stop", + "Tooltip", + "isOpen", + "$element", + "$parentNode", + "$init", + "setHtml", + "html", + "setPosition", + "setClassName", + "getHeight", + "getWidth", + "GutterHandler", + "showTooltip", + "mouseEvent", + "annotation", + "gutter", + "$annotations", + "hideTooltip", + "maxRow", + "getLength", + "screenRow", + "pixelToScreenCoordinates", + "$pos", + "documentToScreenRow", + "tooltipAnnotation", + "tooltip", + "$tooltipFollowsMouse", + "moveTooltip", + "gutterElement", + "$cells", + "right", + "tooltipTimeout", + "$gutterLayer", + "GutterTooltip", + "gutterRegion", + "getRegion", + "selectTo", + "isMousePressed", + "$gutter", + "windowWidth", + "innerWidth", + "MouseEvent", + "$inSelection", + "propagationStopped", + "DragdropHandler", + "prevCursor", + "vMovement", + "hMovement", + "cursorMovedTime", + "$blockScrolling", + "moveCursorToPosition", + "cursorPointOnCaretMoved", + "SCROLL_CURSOR_HYSTERESIS", + "SCROLL_CURSOR_DELAY", + "autoScroll", + "lineHeight", + "layerConfig", + "characterWidth", + "editorRect", + "offsets", + "nearestXOffset", + "nearestYOffset", + "scrollCursor", + "vScroll", + "hScroll", + "autoScrollStartTime", + "AUTOSCROLL_DELAY", + "onDragInterval", + "dragCursor", + "addDragMarker", + "toOrientedRange", + "dragSelectionMarker", + "addMarker", + "getSelectionStyle", + "$cursorLayer", + "setBlinking", + "clearInterval", + "timerId", + "counter", + "onMouseMove", + "clearDragMarker", + "removeMarker", + "fromOrientedRange", + "isInternal", + "getReadOnly", + "onMouseMoveTimer", + "canAccept", + "dataTransfer", + "types", + "getDropEffect", + "copyAllowed", + "moveAllowed", + "copyModifierState", + "effectAllowed", + "dropEffect", + "blankImage", + "src", + "dragOperation", + "mouseTarget", + "onDragStart", + "cancelDrag", + "draggable", + "setDragImage", + "clearData", + "getTextRange", + "onDragEnd", + "setCursorStyle", + "onDragEnter", + "onDragOver", + "onDragLeave", + "onDrop", + "moveText", + "dropData", + "dragWait", + "getDragDelay", + "startDrag", + "dragWaitEnd", + "dragReadyEnd", + "cursorStyle", + "onMouseDrag", + "dragDrop", + "$dragEnabled", + "clickCount", + "eventTarget", + "unselectable", + "url", + "xhr", + "XMLHttpRequest", + "onreadystatechange", + "readyState", + "responseText", + "send", + "loadScript", + "s", + "onload", + "_", + "isAbort", + "qualifyURL", + "EventEmitter", + "_dispatchEvent", + "eventName", + "_eventRegistry", + "_defaultHandlers", + "listeners", + "defaultHandler", + "_signal", + "once", + "newCallback", + "handlers", + "_disabled_", + "old", + "removeDefaultHandler", + "capturing", + "off", + "removeAllListeners", + "init", + "scriptOptions", + "scriptUrl", + "currentScript", + "_currentScript", + "currentDocument", + "scripts", + "script", + "getAttribute", + "attr", + "deHyphenate", + "basePath", + "workerPath", + "modePath", + "themePath", + "m1", + "toUpperCase", + "net", + "suffix", + "$moduleUrls", + "all", + "moduleUrl", + "component", + "parts", + "sep", + "setModuleUrl", + "subst", + "$loading", + "loadModule", + "onLoad", + "moduleType", + "afterLoad", + "optionsProvider", + "setOptions", + "optList", + "setOption", + "getOptions", + "optionNames", + "$options", + "getOption", + "opt", + "warn", + "forwardTo", + "handlesSet", + "defaultOptions", + "defineOptions", + "initialValue", + "resetOptions", + "setDefaultValue", + "opts", + "setDefaultValues", + "optionHash", + "DefaultGutterHandler", + "MouseHandler", + "focusEditor", + "getMouseEventTarget", + "onMouseEvent", + "scrollBarV", + "scrollBarH", + "gutterEl", + "$dragDelay", + "char", + "insideStart", + "$scrollSpeed", + "mouseMoveHandler", + "releaseMouse", + "$mouseMoved", + "onCaptureEnd", + "onCaptureInterval", + "$onCaptureMouseMove", + "cancelContextMenu", + "scrollSpeed", + "dragDelay", + "dragEnabled", + "focusTimout", + "tooltipFollowsMouse", + "FoldHandler", + "fold", + "getFoldAt", + "removeFold", + "expandFold", + "foldWidgets", + "onFoldWidgetClick", + "getParentFoldRangeData", + "firstRange", + "getLine", + "addFold", + "keyUtil", + "KeyBinding", + "$editor", + "$data", + "$handlers", + "commands", + "kb", + "removeKeyboardHandler", + "$defaultHandler", + "addKeyboardHandler", + "setKeyboardHandler", + "h", + "handleKeyboard", + "attach", + "detach", + "getKeyboardHandler", + "getStatusText", + "$callKeyboardHandlers", + "toExecute", + "success", + "passEvent", + "comparePoints", + "p1", + "p2", + "Range", + "startRow", + "startColumn", + "endRow", + "endColumn", + "isEqual", + "compare", + "compareRange", + "containsRange", + "intersects", + "isEnd", + "isStart", + "inside", + "insideEnd", + "compareStart", + "compareEnd", + "compareInside", + "clipRows", + "firstRow", + "lastRow", + "fromPoints", + "collapseRows", + "toScreenRange", + "screenPosStart", + "documentToScreenPosition", + "screenPosEnd", + "moveBy", + "Selection", + "getDocument", + "lead", + "selectionLead", + "createAnchor", + "selectionAnchor", + "$isEmpty", + "$keepDesiredColumnOnChange", + "$desiredColumn", + "getCursor", + "getPosition", + "getSelectionAnchor", + "getSelectionLead", + "shiftSelection", + "columns", + "moveCursorTo", + "isBackwards", + "$moveSelection", + "mover", + "selectUp", + "moveCursorUp", + "selectDown", + "moveCursorDown", + "selectRight", + "moveCursorRight", + "selectLeft", + "moveCursorLeft", + "selectLineStart", + "moveCursorLineStart", + "selectLineEnd", + "moveCursorLineEnd", + "selectFileEnd", + "moveCursorFileEnd", + "selectFileStart", + "moveCursorFileStart", + "selectWordRight", + "moveCursorWordRight", + "selectWordLeft", + "moveCursorWordLeft", + "selectWord", + "selectAWord", + "getAWordRange", + "excludeLastChar", + "rowEnd", + "rowStart", + "foldLine", + "getFoldLine", + "selectLine", + "moveCursorBy", + "tabSize", + "getTabSize", + "isTabStop", + "firstColumnPosition", + "screenToDocumentPosition", + "beforeCursor", + "getDisplayLine", + "leadingSpace", + "$useEmacsStyleLineStart", + "lineEnd", + "getDocumentLastRowColumnPosition", + "textEnd", + "moveCursorLongWordRight", + "rightOfCursor", + "nonTokenRe", + "tokenRe", + "moveCursorLongWordLeft", + "getFoldStringAt", + "leftOfCursor", + "$shortWordEndIndex", + "whitespaceRe", + "moveCursorShortWordRight", + "moveCursorShortWordLeft", + "$selectLongWords", + "rows", + "screenPos", + "docPos", + "lineWidgets", + "keepDesiredColumn", + "moveCursorToScreen", + "desiredColumn", + "getRangeOfMovements", + "func", + "toJSON", + "ranges", + "r1", + "fromJSON", + "rangeList", + "toSingleRange", + "MAX_TOKEN_COUNT", + "Tokenizer", + "states", + "regExps", + "matchMappings", + "ruleRegExps", + "matchTotal", + "mapping", + "defaultToken", + "flag", + "splitterRurles", + "rule", + "caseInsensitive", + "adjustedregex", + "matchcount", + "reportError", + "groupCount", + "tokenArray", + "onMatch", + "$arrayTokens", + "$applyToken", + "digit", + "removeCapturingGroups", + "splitRegex", + "createSplitterRegexp", + "$setMaxTokenCount", + "values", + "tokens", + "inChClass", + "lastCapture", + "parenOpen", + "parenClose", + "square", + "getLineTokens", + "startState", + "currentState", + "matchAttempts", + "skipped", + "merge", + "msg", + "TextHighlightRules", + "$rules", + "addRules", + "prefix", + "nextState", + "getRules", + "embedRules", + "HighlightRules", + "escapeRules", + "$embeds", + "getEmbeds", + "normalizeRules", + "processState", + "processed", + "stateName", + "includeName", + "toInsert", + "noEscape", + "keywordMap", + "createKeywordMapper", + "splitChar", + "keywords", + "$keywordList", + "getKeywords", + "$keywords", + "Behaviour", + "$behaviours", + "addBehaviours", + "behaviours", + "inherit", + "getBehaviours", + "addUnicodePackage", + "pack", + "codePoint", + "packages", + "L", + "Ll", + "Lu", + "Lt", + "Lm", + "Lo", + "M", + "Mn", + "Mc", + "Me", + "N", + "Nd", + "Nl", + "No", + "P", + "Pd", + "Ps", + "Pe", + "Pi", + "Pf", + "Pc", + "Po", + "S", + "Sm", + "Sc", + "Sk", + "So", + "Z", + "Zs", + "Zl", + "Zp", + "C", + "Cc", + "Cf", + "Co", + "Cs", + "Cn", + "TokenIterator", + "initialRow", + "initialColumn", + "$session", + "$row", + "$rowTokens", + "getTokens", + "getTokenAt", + "$tokenIndex", + "stepBackward", + "stepForward", + "rowCount", + "getCurrentToken", + "getCurrentTokenRow", + "getCurrentTokenColumn", + "rowTokens", + "tokenIndex", + "unicode", + "Mode", + "$behaviour", + "getTokenizer", + "$tokenizer", + "$highlightRules", + "lineCommentStart", + "blockComment", + "toggleCommentLines", + "iter", + "ignoreBlankLines", + "shouldRemove", + "minIndent", + "Infinity", + "insertAtTabStop", + "regexpStart", + "getUseSoftTabs", + "uncomment", + "shouldInsertSpace", + "removeInLine", + "commentWithSpace", + "comment", + "insertInLine", + "testRemove", + "before", + "after", + "spaces", + "lineCommentEnd", + "regexpEnd", + "minEmptyLength", + "indent", + "toggleBlockComment", + "colDiff", + "iterator", + "initialRange", + "startRange", + "endRange", + "getNextLineIndent", + "tab", + "$getIndent", + "checkOutdent", + "autoOutdent", + "createWorker", + "createModeDelegates", + "$modes", + "delegations", + "scope", + "functionName", + "$delegator", + "method", + "transformAction", + "param", + "completionKeywords", + "ruleItr", + "aLength", + "$createKeywordList", + "getCompletions", + "word", + "score", + "$id", + "Anchor", + "$onChange", + "$clipPositionToDocument", + "$insertRight", + "delta", + "noClip", + "Document", + "$lines", + "_insertLines", + "getAllLines", + "getNewLineCharacter", + "$split", + "$detectNewLine", + "$autoNewLine", + "$newLineMode", + "setNewLineMode", + "newLineMode", + "getNewLineMode", + "isNewLine", + "getLines", + "$clipPosition", + "firstLine", + "lastLine", + "insertNewLine", + "insertLines", + "firstFullRow", + "lastFullRow", + "_removeLines", + "removeNewLine", + "newLine", + "removeLines", + "nl", + "secondLine", + "applyDeltas", + "deltas", + "revertDeltas", + "indexToPosition", + "newlineLength", + "positionToIndex", + "BackgroundTokenizer", + "tokenizer", + "running", + "currentLine", + "$worker", + "workerStart", + "endLine", + "startLine", + "processedLines", + "$tokenizeRow", + "fireUpdateEvent", + "setTokenizer", + "setDocument", + "scheduleStart", + "$updateOnChange", + "getState", + "SearchHighlight", + "clazz", + "setRegexp", + "MAX_RANGES", + "cache", + "update", + "markerLayer", + "drawSingleLineMarker", + "FoldLine", + "foldData", + "folds", + "setFoldLine", + "shiftRow", + "sameRow", + "containsRow", + "walk", + "lastEnd", + "isNewRow", + "placeholder", + "getNextFoldTo", + "kind", + "addRemoveChars", + "foldBefore", + "newFoldLine", + "foldLineNext", + "idxToPosition", + "idx", + "lastFoldEndColumn", + "RangeList", + "pointIndex", + "excludeEdges", + "addList", + "substractPoint", + "containsPoint", + "rangeAtPoint", + "clipped", + "removeAll", + "changeRange", + "lineDif", + "consumePoint", + "point", + "consumeRange", + "restorePoint", + "restoreRange", + "Fold", + "subFolds", + "subFold", + "collapseChildren", + "addSubFold", + "afterStart", + "Folding", + "side", + "getFoldsInRange", + "foldLines", + "$foldData", + "foundFolds", + "getFoldsInRangeList", + "getAllFolds", + "lastFold", + "docRow", + "startFoldLine", + "getNextFoldLine", + "getFoldedRowCount", + "$addFoldLine", + "added", + "$clipRangeToDocument", + "startFold", + "endFold", + "removeFolds", + "$useWrapMode", + "$updateWrapData", + "$updateRowLengthCache", + "$modified", + "addFolds", + "$updating", + "cloneFolds", + "foldAll", + "expandFolds", + "unfold", + "expandInner", + "isRowFolded", + "startFoldRow", + "getRowFoldEnd", + "getRowFoldStart", + "getFoldDisplayLine", + "textLine", + "lastColumn", + "$cloneFoldData", + "fd", + "toggleFold", + "tryToUnfold", + "bracketPos", + "findMatchingBracket", + "getCommentFoldRange", + "dir", + "depth", + "getFoldWidget", + "getFoldWidgetRange", + "$foldStyles", + "manual", + "markbegin", + "markbeginend", + "$foldStyle", + "setFoldStyle", + "$foldMode", + "$setFolding", + "foldMode", + "$updateFoldWidgets", + "updateFoldWidgets", + "ignoreCurrent", + "fw", + "children", + "siblings", + "$toggleFoldWidget", + "toggleFoldWidget", + "toggleParent", + "BracketMatch", + "chr", + "charBeforeCursor", + "$findClosingBracket", + "$findOpeningBracket", + "$brackets", + ")", + "(", + "bracket", + "typeRe", + "openBracket", + "valueIndex", + "closingBracket", + "valueLength", + "TextMode", + "EditSession", + "$breakpoints", + "$decorations", + "$frontMarkers", + "$backMarkers", + "$markerId", + "$undoSelect", + "onChangeFold", + "isFullWidth", + "bgTokenizer", + "resetCaches", + "$resetRowCache", + "$docRowCache", + "$screenRowCache", + "$getRowCacheIndex", + "cacheArray", + "low", + "hi", + "mid", + "$wrapData", + "$rowLengthCache", + "removedFolds", + "$updateInternalDataOnChange", + "$fromUndo", + "$undoManager", + "ignore", + "$deltasDoc", + "$deltasFold", + "$informUndoManager", + "$deltas", + "setUndoManager", + "getUndoManager", + "reset", + "undoManager", + "$syncInformUndoManager", + "group", + "execute", + "mergeUndoDeltas", + "$defaultUndoManager", + "getTabString", + "$useSoftTabs", + "$mode", + "$indentWithTabs", + "$tabSize", + "$overwrite", + "setOverwrite", + "overwrite", + "getOverwrite", + "toggleOverwrite", + "addGutterDecoration", + "removeGutterDecoration", + "getBreakpoints", + "setBreakpoints", + "clearBreakpoints", + "setBreakpoint", + "clearBreakpoint", + "inFront", + "marker", + "addDynamicMarker", + "markerId", + "markers", + "getMarkers", + "$searchHighlight", + "highlightLines", + "setAnnotations", + "annotations", + "getAnnotations", + "clearAnnotations", + "inToken", + "wordRange", + "setUseWorker", + "useWorker", + "getUseWorker", + "$useWorker", + "onReloadTokenizer", + "$modeId", + "$onChangeMode", + "$isPlaceholder", + "$stopWorker", + "$startWorker", + "attachToSession", + "wrapMethod", + "$wrapMethod", + "foldingRules", + "terminate", + "getMode", + "$scrollTop", + "setScrollTop", + "getScrollTop", + "$scrollLeft", + "setScrollLeft", + "getScrollLeft", + "getScreenWidth", + "$computeWidth", + "getLineWidgetMaxWidth", + "screenWidth", + "lineWidgetsWidth", + "w", + "lineWidgetWidth", + "$wrapLimit", + "longestScreenLine", + "foldIndex", + "foldStart", + "$getStringScreenWidth", + "undoChanges", + "dontSelect", + "lastUndoRange", + "$getUndoSelection", + "foldDelta", + "redoChanges", + "setUndoSelect", + "enable", + "isUndo", + "isInsert", + "lastDeltaIsInsert", + "fromRange", + "toPosition", + "toRange", + "rowDiff", + "collDiff", + "oldStart", + "newStart", + "indentRows", + "indentString", + "outdentRows", + "rowRange", + "deleteRange", + "size", + "$moveLines", + "$clipRowToDocument", + "MAX_VALUE", + "moveLinesUp", + "moveLinesDown", + "duplicateLines", + "$clipColumnToRow", + "$wrapLimitRange", + "useWrapMode", + "getUseWrapMode", + "setWrapLimitRange", + "adjustWrapLimit", + "desiredLimit", + "$printMargin", + "limits", + "wrapLimit", + "$constrainWrapLimit", + "getWrapLimit", + "setWrapLimit", + "limit", + "getWrapLimitRange", + "foldLineBefore", + "wrapData", + "walkTokens", + "$getDisplayTokens", + "PLACEHOLDER_START", + "PLACEHOLDER_BODY", + "$computeWrapSplits", + "CHAR", + "CHAR_EXT", + "PUNCTUATION", + "SPACE", + "TAB", + "TAB_SPACE", + "addSplit", + "displayed", + "lastSplit", + "lastDocSplit", + "splits", + "displayLength", + "isCode", + "$wrapAsCode", + "minSplit", + "getScreenTabSize", + "maxScreenColumn", + "screenColumn", + "getRowLength", + "getRowLineCount", + "getScreenLastRowColumn", + "documentToScreenColumn", + "getDocumentLastRowColumn", + "docColumn", + "getRowSplitData", + "screenToDocumentRow", + "screenToDocumentColumn", + "rowLength", + "rowCache", + "doCache", + "splitIndex", + "foldStartRow", + "wrapRow", + "screenRowOffset", + "getScreenLength", + "screenRows", + "$getWidgetScreenLength", + "$setFontMetrics", + "fm", + "destroy", + "$wrap", + "firstLineNumber", + "useSoftTabs", + "Search", + "find", + "$matchIterator", + "findAll", + "needle", + "$assembleRegExp", + "$isMultiLine", + "prevRange", + "replacement", + "preserveCase", + "backwards", + "matchIterator", + "_callback", + "$lineIterator", + "$disableFakeMultiline", + "wholeWord", + "modifier", + "caseSensitive", + "$assembleMultilineRegExp", + "skipCurrent", + "HashHandler", + "commandKeyBinding", + "addCommands", + "$singleCommand", + "MultiHashHandler", + "addCommand", + "removeCommand", + "bindKey", + "_buildKeyHash", + "keepCommand", + "ckb", + "keyId", + "cmdGroup", + "asDefault", + "keyPart", + "chain", + "binding", + "parseKeys", + "_addCommandToBinding", + "isDefault", + "removeCommands", + "bindKeys", + "keyList", + "findKeyCommand", + "$keyChain", + "CommandManager", + "byName", + "toggleRecording", + "$inReplay", + "recording", + "macro", + "$addCommandToMacro", + "oldMacro", + "replay", + "trimMacro", + "mac", + "showSettingsMenu", + "showErrorMarker", + "scrollIntoView", + "centerSelection", + "prompt", + "gotoLine", + "getAllRanges", + "findNext", + "multiSelectAction", + "findPrevious", + "aceCommandGroup", + "navigateFileStart", + "navigateUp", + "times", + "navigateFileEnd", + "navigateDown", + "navigateWordLeft", + "navigateLineStart", + "navigateLeft", + "navigateWordRight", + "navigateLineEnd", + "navigateRight", + "selectPageDown", + "scrollPageDown", + "gotoPageDown", + "selectPageUp", + "scrollPageUp", + "gotoPageUp", + "jumpToMatching", + "duplicateSelection", + "sortLines", + "modifyNumber", + "copyLinesUp", + "copyLinesDown", + "removeToLineStart", + "removeToLineEnd", + "removeWordLeft", + "removeWordRight", + "blockOutdent", + "blockIndent", + "splitLine", + "transposeLetters", + "transposeSelections", + "firstLineEndCol", + "selectedText", + "selectedCount", + "insertLine", + "curLine", + "endCol", + "newRanges", + "exitMultiSelectMode", + "defaultCommands", + "Editor", + "getContainerElement", + "getTextAreaContainer", + "keyBinding", + "$mouseHandler", + "$search", + "$historyTracker", + "$initOperationListeners", + "_$emitInputEvent", + "setSession", + "selections", + "startOperation", + "endOperation", + "$opResetTimer", + "curOp", + "docChanged", + "selectionChanged", + "prevOp", + "commadEvent", + "previousCommand", + "scrollSelectionIntoView", + "animateScrolling", + "$mergeableCommands", + "$mergeUndoDeltas", + "mergeableCommands", + "shouldMerge", + "mergeNextCommand", + "sequenceStartTime", + "keyboardHandler", + "$keybindingId", + "handler", + "oldSession", + "$onDocumentChange", + "$onTokenizerUpdate", + "$onChangeTabSize", + "$onChangeWrapLimit", + "$onChangeWrapMode", + "$onChangeFold", + "$onChangeFrontMarker", + "$onChangeBackMarker", + "$onChangeBreakpoint", + "$onChangeAnnotation", + "$onCursorChange", + "$onScrollTopChange", + "$onScrollLeftChange", + "$onSelectionChange", + "onDocumentChange", + "onChangeMode", + "onTokenizerUpdate", + "onChangeTabSize", + "onChangeWrapLimit", + "onChangeWrapMode", + "onChangeFrontMarker", + "onChangeBackMarker", + "onChangeBreakpoint", + "onChangeAnnotation", + "onCursorChange", + "onScrollTopChange", + "onScrollLeftChange", + "onSelectionChange", + "updateFull", + "oldEditor", + "cursorPos", + "onResize", + "getTheme", + "getFontSize", + "$highlightBrackets", + "$bracketHighlight", + "$highlightPending", + "getCursorPosition", + "getMatching", + "$highlightTags", + "$highlightTagPending", + "$tagHighlight", + "prevToken", + "$isFocused", + "showCursor", + "visualizeFocus", + "hideCursor", + "visualizeBlur", + "$cursorChange", + "updateCursor", + "updateLines", + "$updateHighlightActiveLine", + "scrollToY", + "scrollToX", + "$highlightActiveLine", + "$selectionStyle", + "$maxLines", + "$minLines", + "$highlightLineMarker", + "$selectionMarker", + "$highlightSelectedWord", + "$getSelectionHighLightRegexp", + "startOuter", + "endOuter", + "lineCols", + "updateFrontMarkers", + "updateBackMarkers", + "updateBreakpoints", + "updateText", + "getSelectedText", + "getBehavioursEnabled", + "transform", + "$mergeNextCommand", + "d", + "lineState", + "shouldOutdent", + "lineIndent", + "setScrollSpeed", + "getScrollSpeed", + "setDragDelay", + "setSelectionStyle", + "setHighlightActiveLine", + "shouldHighlight", + "getHighlightActiveLine", + "setHighlightGutterLine", + "getHighlightGutterLine", + "setHighlightSelectedWord", + "getHighlightSelectedWord", + "setAnimatedScroll", + "shouldAnimate", + "getAnimatedScroll", + "setShowInvisibles", + "showInvisibles", + "getShowInvisibles", + "setDisplayIndentGuides", + "getDisplayIndentGuides", + "showPrintMargin", + "getShowPrintMargin", + "setPrintMarginColumn", + "getPrintMarginColumn", + "setBehavioursEnabled", + "enabled", + "setWrapBehavioursEnabled", + "getWrapBehavioursEnabled", + "setShowFoldWidgets", + "getShowFoldWidgets", + "setFadeFoldWidgets", + "fade", + "getFadeFoldWidgets", + "new_range", + "swap", + "originalRange", + "$getSelectedRows", + "getNumberAt", + "_numberRx", + "number", + "amount", + "charRange", + "isFinite", + "nr", + "fp", + "decimals", + "nnr", + "toFixed", + "replaceRange", + "endPoint", + "inVirtualSelectionMode", + "linesMoved", + "rangeIndex", + "showComposition", + "setCompositionText", + "hideComposition", + "getFirstVisibleRow", + "getLastVisibleRow", + "isRowVisible", + "isRowFullyVisible", + "getFirstFullyVisibleRow", + "getLastFullyVisibleRow", + "$getVisibleRowCount", + "getScrollBottomRow", + "getScrollTopRow", + "$moveByPage", + "scrollToRow", + "scrollToLine", + "center", + "alignCursor", + "getCursorPositionScreen", + "matchType", + "bracketType", + "found", + "brackets", + "lineNumber", + "navigateTo", + "replaced", + "$tryReplace", + "replaceAll", + "getLastSearchOptions", + "newRange", + "preventScroll", + "revealRange", + "setAutoScrollEditorIntoView", + "shouldScroll", + "$scrollAnchor", + "scrollAnchor", + "onChangeSelection", + "onBeforeRender", + "onAfterRender", + "$pixelPos", + "$resetCursorStyle", + "$cursorStyle", + "cursorLayer", + "setSmoothBlinking", + "isBlinking", + "selectionStyle", + "highlightActiveLine", + "highlightSelectedWord", + "behavioursEnabled", + "wrapBehavioursEnabled", + "autoScrollEditorIntoView", + "hScrollBarAlwaysVisible", + "vScrollBarAlwaysVisible", + "highlightGutterLine", + "animatedScroll", + "printMarginColumn", + "printMargin", + "fadeFoldWidgets", + "showFoldWidgets", + "showLineNumbers", + "showGutter", + "displayIndentGuides", + "fontSize", + "fontFamily", + "maxLines", + "minLines", + "scrollPastEnd", + "fixedWidthGutter", + "foldStyle", + "UndoManager", + "$doc", + "hasUndo", + "dirtyCounter", + "$undoStack", + "$redoStack", + "NaN", + "undoSelectionRange", + "redoSelectionRange", + "hasRedo", + "markClean", + "isClean", + "Gutter", + "parentEl", + "$showFoldWidgets", + "gutterWidth", + "$updateAnnotations", + "rowInfo", + "annoText", + "gutterOffset", + "breakpoints", + "decorations", + "$firstLineNumber", + "lastLineNumber", + "gutterRenderer", + "$renderer", + "cell", + "textNode", + "foldWidget", + "minHeight", + "$fixedWidth", + "$padding", + "$computePadding", + "ceil", + "$showLineNumbers", + "setShowLineNumbers", + "getShowLineNumbers", + "paddingRight", + "Marker", + "setPadding", + "setMarkers", + "$getTop", + "drawFullLineMarker", + "drawScreenLineMarker", + "drawTextMarker", + "drawMultiLineMarker", + "firstRowScreen", + "stringBuilder", + "extraStyle", + "lineRange", + "extraLength", + "Text", + "$updateEolChar", + "EOF_CHAR", + "EOL_CHAR_LF", + "EOL_CHAR_CRLF", + "EOL_CHAR", + "TAB_CHAR", + "SPACE_CHAR", + "getLineHeight", + "$fontMetrics", + "$characterSize", + "getCharacterWidth", + "measure", + "$pollSizeChanges", + "checkForSizeChanges", + "$pollSizeChangesTimer", + "$computeTabString", + "$tabStrings", + "tabStr", + "$indentGuideRe", + "spaceClass", + "tabClass", + "spaceContent", + "tabContent", + "scrollLines", + "lineElements", + "lineElementsIdx", + "lineElement", + "$renderLine", + "$useLineGroups", + "oldConfig", + "fragment", + "$renderLinesFragment", + "createDocumentFragment", + "$textToken", + "rparen", + "lparen", + "$renderToken", + "replaceReg", + "replaceFunc", + "tabIdx", + "idx4", + "classToUse", + "space", + "output", + "renderIndentGuide", + "cols", + "$renderWrappedLine", + "onlyContents", + "splitChars", + "$renderSimpleLine", + "$getFoldLineTokens", + "addTokens", + "to", + "renderTokens", + "$measureNode", + "IE8", + "Cursor", + "blinkInterval", + "smoothBlinking", + "cursors", + "addCursor", + "$updateCursors", + "$updateVisibility", + "visibility", + "$updateOpacity", + "blinking", + "restartTimer", + "setBlinkInterval", + "removeCursor", + "intervalId", + "timeoutId", + "blink", + "getPixelPosition", + "onScreen", + "cursorLeft", + "cursorTop", + "$selectionMarkers", + "cursorIndex", + "pixelPos", + "$setOverwrite", + "ScrollBar", + "classSuffix", + "setVisible", + "skipEvent", + "onScroll", + "VScrollBar", + "$scrollbarWidth", + "setHeight", + "setInnerHeight", + "setScrollHeight", + "HScrollBar", + "setWidth", + "setInnerWidth", + "setScrollWidth", + "ScrollBarV", + "ScrollBarH", + "RenderLoop", + "onRender", + "pending", + "changes", + "CHAR_COUNT", + "FontMetrics", + "$setMeasureNodeStyles", + "$main", + "$testFractionalRect", + "isRoot", + "whiteSpace", + "font", + "$measureSizes", + "fontWeight", + "boldSize", + "charSizes", + "allowBoldFonts", + "setPolling", + "$measureCharWidth", + "GutterLayer", + "MarkerLayer", + "TextLayer", + "CursorLayer", + "editorCss", + "VirtualRenderer", + "onGutterResize", + "$markerBack", + "textLayer", + "$textLayer", + "canvas", + "$markerFront", + "$horizScroll", + "$vScroll", + "scrollBar", + "$scrollAnimation", + "scrollMargin", + "updateCharacterSize", + "$size", + "scrollerHeight", + "scrollerWidth", + "$dirty", + "$loop", + "$renderChanges", + "CHANGE_FULL", + "CHANGE_CURSOR", + "CHANGE_MARKER", + "CHANGE_GUTTER", + "CHANGE_SCROLL", + "CHANGE_LINES", + "CHANGE_TEXT", + "CHANGE_SIZE", + "CHANGE_MARKER_BACK", + "CHANGE_MARKER_FRONT", + "CHANGE_H_SCROLL", + "$allowBoldFonts", + "$updatePrintMargin", + "onChangeNewLineMode", + "$changedLines", + "updateFontSize", + "$changes", + "$updateSizeAsync", + "resizing", + "scrollWidth", + "$updateCachedSize", + "$extraHeight", + "oldSize", + "$showGutter", + "$computeLayerConfig", + "availableWidth", + "$showPrintMargin", + "$printMarginColumn", + "$animatedScroll", + "getShowGutter", + "setShowGutter", + "$updateGutterLineHighlight", + "$gutterLineHighlight", + "$printMarginEl", + "containerEl", + "posTop", + "posLeft", + "$composition", + "flint", + "setScrollMargin", + "sm", + "getHScrollBarAlwaysVisible", + "$hScrollBarAlwaysVisible", + "setHScrollBarAlwaysVisible", + "alwaysVisible", + "getVScrollBarAlwaysVisible", + "setVScrollBarAlwaysVisible", + "$updateScrollBarV", + "$scrollPastEnd", + "$updateScrollBarH", + "$frozen", + "unfreeze", + "st", + "marginTop", + "$highlightGutterLine", + "$updateLines", + "$autosize", + "desiredHeight", + "$gutterWidth", + "hideScrollbars", + "screenLines", + "longestLine", + "$getLongestLine", + "horizScroll", + "hScrollChanged", + "$vScrollBarAlwaysVisible", + "vScrollChanged", + "firstRowHeight", + "lineCount", + "charCount", + "$viewMargin", + "topMargin", + "bottomMargin", + "alignment", + "STEPS", + "$calcSteps", + "fromValue", + "toValue", + "steps", + "x_min", + "dx", + "initialScroll", + "oldSteps", + "$timer", + "canvasPos", + "textToScreenCoordinates", + "keepTextAreaAtCursor", + "$themeId", + "$theme", + "setMouseCursor", + "WorkerClient", + "topLevelNamespaces", + "classname", + "workerUrl", + "$sendDeltaQueue", + "changeListener", + "onMessage", + "nameToUrl", + "toUrl", + "normalizePath", + "$normalizePath", + "tlns", + "workerSrc", + "Blob", + "blob", + "blobUrl", + "URL", + "webkitURL", + "createObjectURL", + "Worker", + "DOMException", + "$workerBlob", + "blobURL", + "revokeObjectURL", + "callbackId", + "callbacks", + "onmessage", + "deltaQueue", + "emit", + "ex", + "attachToDocument", + "q", + "BlobBuilder", + "WebKitBlobBuilder", + "MozBlobBuilder", + "blobBuilder", + "getBlob", + "UIWorkerClient", + "messageBuffer", + "main", + "emitSync", + "sender", + "processNext", + "setEmitSync", + "Main", + "PlaceHolder", + "others", + "mainClass", + "othersClass", + "$onUpdate", + "onUpdate", + "$others", + "undoStack", + "$undostack", + "$undoStackDepth", + "setup", + "selectionBefore", + "other", + "showOtherMarkers", + "othersActive", + "hideOtherMarkers", + "lengthDiff", + "distanceFromStart", + "otherPos", + "newPos", + "undosRequired", + "isSamePoint", + "accel", + "selectionMode", + "isMultiSelect", + "onMouseSelection", + "screenAnchor", + "screenCursor", + "$enableJumpToDef", + "addSelectionMarker", + "oldRange", + "removeSelectionMarker", + "tmpSel", + "rectSel", + "blockSelect", + "newCursor", + "removeSelectionMarkers", + "rectangularRangeBlock", + "updateSelectionMarkers", + "onMouseSelectionEnd", + "onSelectionInterval", + "selectMoreLines", + "readonly", + "selectMore", + "multiSelect", + "splitIntoLines", + "alignCursors", + "multiSelectCommands", + "isAvailable", + "MultiSelect", + "$multiselectOnSessionChange", + "$onAddRange", + "$onRemoveRange", + "$onMultiSelect", + "$onSingleSelect", + "onSessionChange", + "$checkMultiselectChange", + "addAltCursorListeners", + "altCursor", + "getSelectionMarkers", + "$blockChangeEvents", + "mergeOverlappingRanges", + "lastRange", + "$initRangeList", + "toggleBlockSelection", + "includeEmptyLines", + "xBackwards", + "yBackwards", + "docEnd", + "selectionMarkerCount", + "markerList", + "$onMultiSelectExec", + "inVirtualMode", + "forEachSelection", + "keepOrder", + "$byLines", + "reg", + "cmdResult", + "anim", + "buf", + "additive", + "skip", + "screenLead", + "toRemove", + "tmp", + "words", + "stopAtFirst", + "sameRowRanges", + "maxCol", + "minSpace", + "spaceOffsets", + "spaceOffset", + "fr", + "lr", + "guessRange", + "$reAlignText", + "forceLeft", + "alignLeft", + "startW", + "textW", + "endW", + "alignRight", + "unAlign", + "isLeftAligned", + "isRightAligned", + "enableMultiselect", + "FoldMode", + "foldingStartMarker", + "foldingStopMarker", + "indentationBlock", + "startLevel", + "openingBracketBlock", + "closingBracketBlock", + "LineWidgets", + "widgetManager", + "updateOnChange", + "renderWidgets", + "measureWidgets", + "_changedWidgets", + "$onChangeEditor", + "_inDocument", + "removeLineWidget", + "$updateRows", + "noWidgets", + "addLineWidget", + "zIndex", + "coverGutter", + "pixelHeight", + "onWidgetChanged", + "changedWidgets", + "fixedWidth", + "coverLine", + "binarySearch", + "comparator", + "findAnnotations", + "oldWidget", + "gutterAnno", + "sc", + "arrow", + "Renderer", + "_id", + "getElementById", + "env", + "tagName", + "oldNode", + "createEditSession", + "JsonHighlightRules", + "MatchingBraceOutdent", + "openBracePos", + "context", + "SAFE_INSERT_IN_TOKENS", + "SAFE_INSERT_BEFORE_TOKENS", + "contextCache", + "initContext", + "autoInsertedBrackets", + "autoInsertedRow", + "autoInsertedLineEnd", + "maybeInsertedBrackets", + "maybeInsertedRow", + "maybeInsertedLineStart", + "maybeInsertedLineEnd", + "CstyleBehaviour", + "selected", + "isSaneInsertion", + "recordAutoInsert", + "recordMaybeInsert", + "rightChar", + "matching", + "isAutoInsertedClosing", + "popAutoInsertedClosing", + "closing", + "isMaybeInsertedClosing", + "clearMaybeInsertedClosing", + "next_indent", + "leftChar", + "quotepos", + "$matchTokenType", + "iterator2", + "BaseFoldMode", + "commentRegex", + "forceMultiline", + "getSectionRange", + "startIndent", + "subRange", + "CStyleFoldMode", + "$outdent", + "worker", + "searchboxCss", + "showReplaceForm", + "div", + "setEditor", + "$initElements", + "sb", + "replaceBox", + "searchOptions", + "regExpOption", + "caseSensitiveOption", + "wholeWordOption", + "searchInput", + "replaceInput", + "_this", + "activeInput", + "$searchBarKb", + "$closeSearchBarKb", + "Ctrl-f|Command-f|Ctrl-H|Command-Option-F", + "isReplace", + "Ctrl-G|Command-G", + "Ctrl-Shift-G|Command-Shift-G", + "findPrev", + "Return", + "Shift-Return", + "Alt-Return", + "Tab", + "checked", + "$syncOptions", + "noMatch", + "replaceAndFindNext", + "get_blob", + "Builder", + "MSBlobBuilder", + "bag", + "builder", + "endings" + ], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BA,SAA2CA,EAAMC,GAC1B,gBAAZC,UAA0C,gBAAXC,QACxCA,OAAOD,QAAUD,IACQ,kBAAXG,SAAyBA,OAAOC,IAC9CD,OAAOH,GACmB,gBAAZC,SACdA,QAAoB,WAAID,IAExBD,EAAiB,WAAIC,KACpBK,KAAM,WACT,MAAgB,UAAUC,GAKhB,QAASC,GAAoBC,GAG5B,GAAGC,EAAiBD,GACnB,MAAOC,GAAiBD,GAAUP,OAGnC,IAAIC,GAASO,EAAiBD,IAC7BP,WACAS,GAAIF,EACJG,QAAQ,EAUT,OANAL,GAAQE,GAAUI,KAAKV,EAAOD,QAASC,EAAQA,EAAOD,QAASM,GAG/DL,EAAOS,QAAS,EAGTT,EAAOD,QAvBf,GAAIQ,KAqCJ,OATAF,GAAoBM,EAAIP,EAGxBC,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,GAGjBR,EAAoB,KAK/B,SAASL,EAAQD,EAASM,GAgC/B,QAASS,GAAYC,EAAWC,EAASC,GACvC,KAAMd,eAAgBW,IACpB,KAAM,IAAII,OAAM,+CAIlB,IAAIC,GAAYC,EAAKC,4BACrB,IAAiB,IAAbF,GAA+B,EAAZA,EACrB,KAAM,IAAID,OAAM,iGAIdI,WAAUC,QACZpB,KAAKqB,QAAQT,EAAWC,EAASC,GA3CrC,GAAIQ,GAAWpB,EAAoB,GAC/BqB,EAAWrB,EAAoB,GAC/Be,EAAOf,EAAoB,EA4D/BS,GAAWa,SASXb,EAAWc,UAAUJ,QAAU,SAAUT,EAAWC,EAASC,GAC3Dd,KAAKY,UAAYA,EACjBZ,KAAKa,QAAUA,MACfb,KAAKc,KAAOA,KAEZ,IAAIY,GAAO1B,KAAKa,QAAQa,MAAQ,MAChC1B,MAAK2B,QAAQD,IAOff,EAAWc,UAAUG,QAAU,aAM/BjB,EAAWc,UAAUI,IAAM,SAAUf,GACnCd,KAAKc,KAAOA,GAOdH,EAAWc,UAAUK,IAAM,WACzB,MAAO9B,MAAKc,MAOdH,EAAWc,UAAUM,QAAU,SAAUC,GACvChC,KAAKc,KAAOG,EAAKgB,MAAMD,IAOzBrB,EAAWc,UAAUS,QAAU,WAC7B,MAAOC,MAAKC,UAAUpC,KAAKc,OAO7BH,EAAWc,UAAUY,QAAU,SAAUC,GAClCtC,KAAKa,UACRb,KAAKa,YAEPb,KAAKa,QAAQyB,KAAOA,GAOtB3B,EAAWc,UAAUc,QAAU,WAC7B,MAAOvC,MAAKa,SAAWb,KAAKa,QAAQyB,MAStC3B,EAAWc,UAAUE,QAAU,SAAUD,GACvC,GAEIc,GACAF,EAHA1B,EAAYZ,KAAKY,UACjBC,EAAUI,EAAKwB,UAAWzC,KAAKa,QAInCA,GAAQa,KAAOA,CACf,IAAIgB,GAAS/B,EAAWa,MAAME,EAC9B,KAAIgB,EA0BF,KAAM,IAAI3B,OAAM,iBAAmBF,EAAQa,KAAO,IAzBlD,KACE,GAAIiB,GAAyB,QAAfD,EAAOF,IAYrB,IAXAF,EAAOtC,KAAKuC,UACZC,EAAOxC,KAAK2C,EAAS,UAAY,SAEjC3C,KAAK4B,UACLX,EAAK2B,MAAM5C,MACXiB,EAAKwB,OAAOzC,KAAM0C,EAAOG,OACzB7C,KAAK8C,OAAOlC,EAAWC,GAEvBb,KAAKqC,QAAQC,GACbtC,KAAK2C,EAAS,UAAY,OAAOH,GAEN,kBAAhBE,GAAOK,KAChB,IACEL,EAAOK,KAAKxC,KAAKP,MAEnB,MAAOgD,KAGX,MAAOA,GACLhD,KAAKiD,SAASD,KAcpBrC,EAAWc,UAAUwB,SAAW,SAASD,GAQvC,GAN4B,kBAAjBhD,MAAKkD,UACdjC,EAAKkC,IAAI,yEAETnD,KAAKkD,QAAQF,KAGXhD,KAAKa,SAAyC,kBAAvBb,MAAKa,QAAQuC,MAItC,KAAMJ,EAHNhD,MAAKa,QAAQuC,MAAMJ,IA0BvBrC,EAAW0C,aAAe,SAAU3B,GAClC,GAAI4B,GAAGC,CAEP,IAAItC,EAAKuC,QAAQ9B,GAEf,IAAK4B,EAAI,EAAGA,EAAI5B,EAAKN,OAAQkC,IAC3B3C,EAAW0C,aAAa3B,EAAK4B,QAG5B,CAEH,KAAM,QAAU5B,IAAO,KAAM,IAAIX,OAAM,0BACvC,MAAM,SAAWW,IAAO,KAAM,IAAIX,OAAM,2BACxC,MAAM,QAAUW,IAAO,KAAM,IAAIX,OAAM,0BACvC,IAAIuB,GAAOZ,EAAKA,IAChB,IAAIY,IAAQ3B,GAAWa,MACrB,KAAM,IAAIT,OAAM,SAAWuB,EAAO,uBAIpC,IAAiC,kBAAtBZ,GAAKmB,MAAMC,OACpB,KAAM,IAAI/B,OAAM,8CAElB,IAAI0C,IAAY,UAAW,eAAgB,QAC3C,KAAKH,EAAI,EAAGA,EAAIG,EAASrC,OAAQkC,IAE/B,GADAC,EAAOE,EAASH,GACZC,IAAQ7B,GAAKmB,MACf,KAAM,IAAI9B,OAAM,sBAAwBwC,EAAO,yBAInD5C,GAAWa,MAAMc,GAAQZ,IAK7Bf,EAAW0C,aAAa/B,GACxBX,EAAW0C,aAAa9B,GAExB1B,EAAOD,QAAUe,GAKZ,SAASd,EAAQD,EAASM,GAE/B,GAAIwD,GAAcxD,EAAoB,GAClCyD,EAAUzD,EAAoB,GAC9B0D,EAAY1D,EAAoB,GAChC2D,EAAO3D,EAAoB,GAC3B4D,EAAe5D,EAAoB,GACnCe,EAAOf,EAAoB,GAG3BoB,IAkBJA,GAASwB,OAAS,SAAUlC,EAAWC,GACrC,IAAKD,EACH,KAAM,IAAIG,OAAM,iCAElBf,MAAKY,UAAYA,EACjBZ,KAAK+D,OACL/D,KAAKgE,YAAc,GAAIN,GACvB1D,KAAKiE,UAAYC,OAEjBlE,KAAKmE,YAAYtD,GAEbb,KAAKa,QAAQuD,SAAiC,SAAtBpE,KAAKa,QAAQa,OACvC1B,KAAKoE,QAAU,GAAIT,GAAQ3D,OAG7BA,KAAKqE,eACLrE,KAAKsE,gBAOPhD,EAASM,QAAU,WACb5B,KAAKuE,OAASvE,KAAKY,WAAaZ,KAAKuE,MAAMC,YAAcxE,KAAKY,WAChEZ,KAAKY,UAAU6D,YAAYzE,KAAKuE,QASpCjD,EAAS6C,YAAc,SAAUtD,GAS/B,GARAb,KAAKa,SACH6D,QAAQ,EACRN,SAAS,EACT1C,KAAM,OACNY,KAAM4B,QAIJrD,EACF,IAAK,GAAI0C,KAAQ1C,GACXA,EAAQ8D,eAAepB,KACzBvD,KAAKa,QAAQ0C,GAAQ1C,EAAQ0C,IAOrC,IAAIqB,GAAYV,OAGZW,EAAW,IAQfvD,GAASO,IAAM,SAAUf,EAAMwB,GAU7B,GARIA,IAEFrB,EAAKkC,IAAI,8EAETnD,KAAKa,QAAQyB,KAAOA,GAIlBxB,YAAgBgE,WAAsBZ,SAATpD,EAC/Bd,KAAK4C,YAEF,CACH5C,KAAK+E,QAAQN,YAAYzE,KAAKgF,MAG9B,IAAIC,IACFC,MAASlF,KAAKa,QAAQyB,KACtB6C,MAASrE,GAEPsE,EAAO,GAAIvB,GAAK7D,KAAMiF,EAC1BjF,MAAKqF,SAASD,EAGd,IAAIE,IAAU,CACdtF,MAAKoF,KAAKG,OAAOD,GAEjBtF,KAAK+E,QAAQS,YAAYxF,KAAKgF,OAI5BhF,KAAKoE,SACPpE,KAAKoE,QAAQxB,SAQjBtB,EAASQ,IAAM,WAMb,MAJI8C,IACFA,EAAUa,OAGRzF,KAAKoF,KACApF,KAAKoF,KAAKM,WAGVxB,QAQX5C,EAASY,QAAU,WACjB,MAAOC,MAAKC,UAAUpC,KAAK8B,QAO7BR,EAASS,QAAU,SAASC,GAC1BhC,KAAK6B,IAAIZ,EAAKgB,MAAMD,KAOtBV,EAASe,QAAU,SAAUC,GAC3BtC,KAAKa,QAAQyB,KAAOA,EAChBtC,KAAKoF,MACPpF,KAAKoF,KAAKO,YAAY3F,KAAKa,QAAQyB,OAQvChB,EAASiB,QAAU,WACjB,MAAOvC,MAAKa,QAAQyB,MAUtBhB,EAASsE,MAAQ,WACf,GAAIC,GAAQ7F,KAAK+E,QAAQe,cAAc,yBACnCD,GACFA,EAAMD,QAEC5F,KAAKoF,KAAKrB,IAAIwB,OACrBvF,KAAKoF,KAAKrB,IAAIwB,OAAOK,QAEd5F,KAAKoF,KAAKrB,IAAIgC,KACrB/F,KAAKoF,KAAKrB,IAAIgC,KAAKH,SAInBC,EAAQ7F,KAAKuE,MAAMuB,cAAc,UAC7BD,GACFA,EAAMD,UAQZtE,EAASsB,MAAQ,WACX5C,KAAKoF,OACPpF,KAAKoF,KAAKY,WACVhG,KAAKiG,MAAMxB,YAAYzE,KAAKoF,KAAKc,gBAC1BlG,MAAKoF,OAShB9D,EAAS+D,SAAW,SAAUD,GAC5BpF,KAAK4C,QAEL5C,KAAKoF,KAAOA,EAGZpF,KAAKiG,MAAMT,YAAYJ,EAAKc,WAe9B5E,EAASoD,OAAS,SAAUyB,GAC1B,GAAIC,EAUJ,OATIpG,MAAKoF,MACPpF,KAAK+E,QAAQN,YAAYzE,KAAKgF,OAC9BoB,EAAUpG,KAAKoF,KAAKV,OAAOyB,GAC3BnG,KAAK+E,QAAQS,YAAYxF,KAAKgF,QAG9BoB,KAGKA,GAMT9E,EAAS+E,UAAY,WACfrG,KAAKoF,OACPpF,KAAK+E,QAAQN,YAAYzE,KAAKgF,OAC9BhF,KAAKoF,KAAKG,SACVvF,KAAK+E,QAAQS,YAAYxF,KAAKgF,SAOlC1D,EAASgF,YAAc,WACjBtG,KAAKoF,OACPpF,KAAK+E,QAAQN,YAAYzE,KAAKgF,OAC9BhF,KAAKoF,KAAKY,WACVhG,KAAK+E,QAAQS,YAAYxF,KAAKgF,SAkBlC1D,EAASiF,UAAY,SAAUC,EAAQvB,GAOrC,GALIjF,KAAKoE,SACPpE,KAAKoE,QAAQqC,IAAID,EAAQvB,GAIvBjF,KAAKa,QAAQ6F,OACf,IACE1G,KAAKa,QAAQ6F,SAEf,MAAO1D,GACL/B,EAAKkC,IAAI,6BAA8BH,KAU7C1B,EAASqF,gBAAkB,SAAUC,GACnC,GAAIC,GAAK7G,KACL+E,EAAU/E,KAAK+E,QACf+B,EAAM7F,EAAK8F,eAAehC,GAC1BiC,EAASjC,EAAQkC,aACjBC,EAASJ,EAAME,EACfG,EAAS,GACTC,EAAW,EAEDN,GAAMK,EAAfP,GAA0B7B,EAAQsC,UAAY,EACjDrH,KAAKsH,gBAAmBR,EAAMK,EAAUP,GAAU,EAE3CA,EAASM,EAASC,GACvBH,EAASjC,EAAQsC,UAAYtC,EAAQwC,aACvCvH,KAAKsH,gBAAmBJ,EAASC,EAAUP,GAAU,EAGrD5G,KAAKsH,eAAiBpD,OAGpBlE,KAAKsH,eACFtH,KAAKwH,kBACRxH,KAAKwH,gBAAkBC,YAAY,WAC7BZ,EAAGS,eACLvC,EAAQsC,WAAaR,EAAGS,eAGxBT,EAAGa,kBAEJN,IAILpH,KAAK0H,kBAOTpG,EAASoG,eAAiB,WACpB1H,KAAKwH,kBACPG,aAAa3H,KAAKwH,uBACXxH,MAAKwH,iBAEVxH,KAAKsH,sBACAtH,MAAKsH,gBAchBhG,EAASsG,aAAe,SAAU3D,GAC3BA,IAID,aAAeA,IAAajE,KAAK+E,UAEnC/E,KAAK+E,QAAQsC,UAAYpD,EAAUoD,WAEjCpD,EAAU4D,OACZ5G,EAAK6G,mBAAmB7D,EAAU4D,OAEhC5D,EAAUF,KACZE,EAAUF,IAAI6B,UAYlBtE,EAASyG,aAAe,WACtB,OACEhE,IAAKc,EACLwC,UAAWrH,KAAK+E,QAAU/E,KAAK+E,QAAQsC,UAAY,EACnDQ,MAAO5G,EAAK+G,uBAahB1G,EAAS2G,SAAW,SAAUnB,EAAKoB,GACjC,GAAInD,GAAU/E,KAAK+E,OACnB,IAAIA,EAAS,CACX,GAAIoD,GAASnI,IAETmI,GAAOC,iBACTT,aAAaQ,EAAOC,sBACbD,GAAOC,gBAEZD,EAAOE,kBACTF,EAAOE,iBAAgB,SAChBF,GAAOE,gBAIhB,IAAIrB,GAASjC,EAAQkC,aACjBC,EAASnC,EAAQwC,aAAeP,EAChCsB,EAAiBC,KAAKC,IAAID,KAAKE,IAAI3B,EAAME,EAAS,EAAG,GAAIE,GAGzDwB,EAAU,WACZ,GAAIrB,GAAYtC,EAAQsC,UACpBsB,EAAQL,EAAiBjB,CACzBkB,MAAKK,IAAID,GAAQ,GACnB5D,EAAQsC,WAAasB,EAAO,EAC5BR,EAAOE,gBAAkBH,EACzBC,EAAOC,eAAiBS,WAAWH,EAAS,MAIxCR,GACFA,GAAS,GAEXnD,EAAQsC,UAAYiB,QACbH,GAAOC,qBACPD,GAAOE,iBAGlBK,SAGIR,IACFA,GAAS,IASf5G,EAAS+C,aAAe,WAQtB,QAASyE,GAAQC,GACfZ,EAAOa,SAASD,GAPlB/I,KAAKuE,MAAQ0E,SAASC,cAAc,OACpClJ,KAAKuE,MAAM4E,UAAY,aACvBnJ,KAAKY,UAAU4E,YAAYxF,KAAKuE,MAGhC,IAAI4D,GAASnI,IAIbA,MAAKuE,MAAM6E,QAAU,SAAUL,GAC7B,GAAIM,GAASN,EAAMM,MAEnBP,GAAQC,GAIe,UAAnBM,EAAOC,UACTP,EAAMQ,kBAGVvJ,KAAKuE,MAAMiF,QAAUV,EACrB9I,KAAKuE,MAAMkF,SAAWX,EACtB9I,KAAKuE,MAAMmF,UAAYZ,EACvB9I,KAAKuE,MAAMoF,QAAUb,EACrB9I,KAAKuE,MAAMqF,MAAQd,EACnB9I,KAAKuE,MAAMsF,QAAUf,EACrB9I,KAAKuE,MAAMuF,YAAchB,EACzB9I,KAAKuE,MAAMwF,UAAYjB,EACvB9I,KAAKuE,MAAMyF,YAAclB,EACzB9I,KAAKuE,MAAM0F,WAAanB,EAIxB7H,EAAKiJ,iBAAiBlK,KAAKuE,MAAO,QAASuE,GAAS,GACpD7H,EAAKiJ,iBAAiBlK,KAAKuE,MAAO,OAAQuE,GAAS,GACnD9I,KAAKuE,MAAM4F,UAAYrB,EACvB9I,KAAKuE,MAAM6F,WAAatB,EAGxB9I,KAAK+F,KAAOkD,SAASC,cAAc,OACnClJ,KAAK+F,KAAKoD,UAAY,OACtBnJ,KAAKuE,MAAMiB,YAAYxF,KAAK+F,KAG5B,IAAIM,GAAY4C,SAASC,cAAc,SACvC7C,GAAU8C,UAAY,aACtB9C,EAAUgE,MAAQ,oBAClBhE,EAAU+C,QAAU,WAClBjB,EAAO9B,aAETrG,KAAK+F,KAAKP,YAAYa,EAGtB,IAAIC,GAAc2C,SAASC,cAAc,SASzC,IARA5C,EAAY+D,MAAQ,sBACpB/D,EAAY6C,UAAY,eACxB7C,EAAY8C,QAAU,WACpBjB,EAAO7B,eAETtG,KAAK+F,KAAKP,YAAYc,GAGlBtG,KAAKoE,QAAS,CAEhB,GAAIkG,GAAOrB,SAASC,cAAc,SAClCoB,GAAKnB,UAAY,iBACjBmB,EAAKD,MAAQ,4BACbC,EAAKlB,QAAU,WACbjB,EAAOoC,WAETvK,KAAK+F,KAAKP,YAAY8E,GACtBtK,KAAK+D,IAAIuG,KAAOA,CAGhB,IAAIE,GAAOvB,SAASC,cAAc,SAClCsB,GAAKrB,UAAY,OACjBqB,EAAKH,MAAQ,sBACbG,EAAKpB,QAAU,WACbjB,EAAOsC,WAETzK,KAAK+F,KAAKP,YAAYgF,GACtBxK,KAAK+D,IAAIyG,KAAOA,EAGhBxK,KAAKoE,QAAQsG,SAAW,WACtBJ,EAAKK,UAAYxC,EAAO/D,QAAQwG,UAChCJ,EAAKG,UAAYxC,EAAO/D,QAAQyG,WAElC7K,KAAKoE,QAAQsG,WAIf,GAAI1K,KAAKa,SAAWb,KAAKa,QAAQW,OAASxB,KAAKa,QAAQW,MAAMJ,OAAQ,CACnE,GAAI0J,GAAUhH,EAAahB,OAAO9C,KAAMA,KAAKa,QAAQW,MAAOxB,KAAKa,QAAQa,KACzE1B,MAAK+F,KAAKP,YAAYsF,GACtB9K,KAAK+D,IAAI+G,QAAUA,EAIjB9K,KAAKa,QAAQ6D,SACf1E,KAAK+K,UAAY,GAAInH,GAAU5D,KAAMA,KAAK+F,QAQ9CzE,EAASiJ,QAAU,WACbvK,KAAKoE,UAEPpE,KAAKoE,QAAQkG,OAGTtK,KAAKa,QAAQ6F,QACf1G,KAAKa,QAAQ6F,WASnBpF,EAASmJ,QAAU,WACbzK,KAAKoE,UAEPpE,KAAKoE,QAAQoG,OAGTxK,KAAKa,QAAQ6F,QACf1G,KAAKa,QAAQ6F,WAUnBpF,EAAS0H,SAAW,SAAUD,GAC5B,GAAIM,GAASN,EAAMM,MAED,YAAdN,EAAMiC,MACRhL,KAAKiL,WAAWlC,GAGA,SAAdA,EAAMiC,OACRnG,EAAWwE,EAGb,IAAIjE,GAAOvB,EAAKqH,kBAAkB7B,EAC9BjE,IACFA,EAAK0D,QAAQC,IASjBzH,EAAS2J,WAAa,SAAUlC,GAC9B,GAAIoC,GAASpC,EAAMqC,OAASrC,EAAMsC,QAC9BC,EAAUvC,EAAMuC,QAChBC,EAAWxC,EAAMwC,SACjBC,GAAU,CASd,IAPc,GAAVL,GACFtC,WAAW,WAET5H,EAAKwK,sBAAsB5G,IAC1B,GAGD7E,KAAK+K,UACP,GAAIO,GAAqB,IAAVH,EACbnL,KAAK+K,UAAUhH,IAAIW,OAAOkB,QAC1B5F,KAAK+K,UAAUhH,IAAIW,OAAOgH,SAC1BF,GAAU,MAEP,IAAc,KAAVL,GAAkBG,GAAqB,IAAVH,EAAe,CACnD,GAAIvF,IAAQ,CACP2F,GAMHvL,KAAK+K,UAAUY,SAAS/F,GAJxB5F,KAAK+K,UAAUa,KAAKhG,GAOtB4F,GAAU,EAIVxL,KAAKoE,UACHkH,IAAYC,GAAsB,IAAVJ,GAE1BnL,KAAKuK,UACLiB,GAAU,GAEHF,GAAWC,GAAsB,IAAVJ,IAE9BnL,KAAKyK,UACLe,GAAU,IAIVA,IACFzC,EAAMQ,iBACNR,EAAM8C,oBAQVvK,EAASgD,aAAe,WACtB,GAAIwH,GAAe7C,SAASC,cAAc,MAC1C4C,GAAa3C,UAAY,QACzBnJ,KAAK8L,aAAeA,EAEpB9L,KAAK+E,QAAUkE,SAASC,cAAc,OACtClJ,KAAK+E,QAAQoE,UAAY,OACzB2C,EAAatG,YAAYxF,KAAK+E,SAE9B/E,KAAKgF,MAAQiE,SAASC,cAAc,SACpClJ,KAAKgF,MAAMmE,UAAY,OACvBnJ,KAAK+E,QAAQS,YAAYxF,KAAKgF,MAI9B,IAAI+G,EACJ/L,MAAKgM,gBAAkB/C,SAASC,cAAc,YACpB,SAAtBlJ,KAAKa,QAAQa,OACfqK,EAAM9C,SAASC,cAAc,OAC7B6C,EAAIE,MAAQ,OACZjM,KAAKgM,gBAAgBxG,YAAYuG,IAEnCA,EAAM9C,SAASC,cAAc,OAC7B6C,EAAIE,MAAQ,OACZjM,KAAKgM,gBAAgBxG,YAAYuG,GACjCA,EAAM9C,SAASC,cAAc,OAC7BlJ,KAAKgM,gBAAgBxG,YAAYuG,GACjC/L,KAAKgF,MAAMQ,YAAYxF,KAAKgM,iBAE5BhM,KAAKiG,MAAQgD,SAASC,cAAc,SACpClJ,KAAKgF,MAAMQ,YAAYxF,KAAKiG,OAE5BjG,KAAKuE,MAAMiB,YAAYsG,IAIzBjM,EAAOD,UAEH8B,KAAM,OACNmB,MAAOvB,EACPkB,KAAM,SAGNd,KAAM,OACNmB,MAAOvB,EACPkB,KAAM,SAGNd,KAAM,OACNmB,MAAOvB,EACPkB,KAAM,UAML,SAAS3C,EAAQD,EAASM,GAE/B,GAAIgM,EACJ,KACEA,EAAMhM,EAAoB,GAE5B,MAAO8C,IAIP,GAAIc,GAAe5D,EAAoB,GACnCe,EAAOf,EAAoB,GAG3BqB,IAiBJA,GAASuB,OAAS,SAAUlC,EAAWC,GAErCA,EAAUA,MACVb,KAAKa,QAAUA,EAGXA,EAAQsL,YACVnM,KAAKmM,YAAcC,OAAOvL,EAAQsL,aAGlCnM,KAAKmM,YAAc,CAIrB,IAAIE,GAAOxL,EAAQqL,IAAMrL,EAAQqL,IAAMA,CAGvClM,MAAK0B,KAAwB,QAAhBb,EAAQa,KAAkB,OAAS,OAC/B,QAAb1B,KAAK0B,MAEa,mBAAT2K,KACTrM,KAAK0B,KAAO,OACZT,EAAKkC,IAAI,gGAMbnD,KAAKsM,MAAQzL,EAAQyL,OAAS,sBAE9B,IAAIzF,GAAK7G,IACTA,MAAKY,UAAYA,EACjBZ,KAAK+D,OACL/D,KAAKmI,OAASjE,OACdlE,KAAKuM,SAAWrI,OAEhBlE,KAAKiM,MAAQrL,EAAU4L,YACvBxM,KAAKgH,OAASpG,EAAUqG,aAExBjH,KAAKuE,MAAQ0E,SAASC,cAAc,OACpClJ,KAAKuE,MAAM4E,UAAY,aACvBnJ,KAAKuE,MAAM6E,QAAU,SAAUL,GAE7BA,EAAMQ,kBAERvJ,KAAKuE,MAAMmF,UAAY,SAAUX,GAC/BlC,EAAGoE,WAAWlC,IAIhB/I,KAAK+F,KAAOkD,SAASC,cAAc,OACnClJ,KAAK+F,KAAKoD,UAAY,OACtBnJ,KAAKuE,MAAMiB,YAAYxF,KAAK+F,KAG5B,IAAI0G,GAAexD,SAASC,cAAc,SAC1CuD,GAAatD,UAAY,SACzBsD,EAAapC,MAAQ,qEACrBrK,KAAK+F,KAAKP,YAAYiH,GACtBA,EAAarD,QAAU,WACrB,IACEvC,EAAG6F,SAEL,MAAO1J,GACL6D,EAAG5D,SAASD,IAKhB,IAAI2J,GAAgB1D,SAASC,cAAc,SAc3C,IAbAyD,EAAcxD,UAAY,UAC1BwD,EAActC,MAAQ,4DACtBrK,KAAK+F,KAAKP,YAAYmH,GACtBA,EAAcvD,QAAU,WACtB,IACEvC,EAAG+F,UAEL,MAAO5J,GACL6D,EAAG5D,SAASD,KAKZhD,KAAKa,SAAWb,KAAKa,QAAQW,OAASxB,KAAKa,QAAQW,MAAMJ,OAAQ,CACnE,GAAI0J,GAAUhH,EAAahB,OAAO9C,KAAMA,KAAKa,QAAQW,MAAOxB,KAAKa,QAAQa,KACzE1B,MAAK+F,KAAKP,YAAYsF,GACtB9K,KAAK+D,IAAI+G,QAAUA,EASrB,GANA9K,KAAK+E,QAAUkE,SAASC,cAAc,OACtClJ,KAAK+E,QAAQoE,UAAY,QACzBnJ,KAAKuE,MAAMiB,YAAYxF,KAAK+E,SAE5B/E,KAAKY,UAAU4E,YAAYxF,KAAKuE,OAEf,QAAbvE,KAAK0B,KAAgB,CACvB1B,KAAK6M,UAAY5D,SAASC,cAAc,OACxClJ,KAAK6M,UAAUC,MAAM9F,OAAS,OAC9BhH,KAAK6M,UAAUC,MAAMb,MAAQ,OAC7BjM,KAAK+E,QAAQS,YAAYxF,KAAK6M,UAE9B,IAAI1E,GAASkE,EAAKU,KAAK/M,KAAK6M,UAC5B1E,GAAO6E,SAAShN,KAAKsM,OACrBnE,EAAO8E,oBAAmB,GAC1B9E,EAAO+E,YAAY,IACnB/E,EAAOgF,aAAaxL,QAAQ,iBAC5BwG,EAAOgF,aAAaC,WAAWpN,KAAKmM,aACpChE,EAAOgF,aAAaE,gBAAe,GACnClF,EAAOgF,aAAaG,gBAAe,GACnCtN,KAAKmI,OAASA,CAEd,IAAIoF,GAAYtE,SAASC,cAAc,IACvCqE,GAAU/H,YAAYyD,SAASuE,eAAe,mBAC9CD,EAAUE,KAAO,sBACjBF,EAAUlE,OAAS,SACnBkE,EAAUpE,UAAY,YACtBoE,EAAUnE,QAAU,WAIlBsE,OAAOC,KAAKJ,EAAUE,KAAMF,EAAUlE,SAExCrJ,KAAK+F,KAAKP,YAAY+H,GAElB1M,EAAQ6F,QAEVyB,EAAOyF,GAAG,SAAU,WAClB/M,EAAQ6F,eAIT,CAEH,GAAI6F,GAAWtD,SAASC,cAAc,WACtCqD,GAASpD,UAAY,OACrBoD,EAASsB,YAAa,EACtB7N,KAAK+E,QAAQS,YAAY+G,GACzBvM,KAAKuM,SAAWA,EAEZ1L,EAAQ6F,SAEoB,OAA1B1G,KAAKuM,SAAS/C,QAChBxJ,KAAKuM,SAAS/C,QAAU,WACtB3I,EAAQ6F,UAKV1G,KAAKuM,SAAS9C,SAAW,WACvB5I,EAAQ6F,aAYlBnF,EAAS0J,WAAa,SAAUlC,GAC9B,GAAIoC,GAASpC,EAAMqC,OAASrC,EAAMsC,QAC9BG,GAAU,CAEA,MAAVL,GAAiBpC,EAAMuC,UACrBvC,EAAMwC,SACRvL,KAAK4M,UAGL5M,KAAK0M,SAEPlB,GAAU,GAGRA,IACFzC,EAAMQ,iBACNR,EAAM8C,oBAQVtK,EAASK,QAAU,WACb5B,KAAKuE,OAASvE,KAAKY,WAAaZ,KAAKuE,MAAMC,YAAcxE,KAAKY,WAChEZ,KAAKY,UAAU6D,YAAYzE,KAAKuE,QAUpChD,EAAS0B,SAAW,SAASD,GAQ3B,GAN4B,kBAAjBhD,MAAKkD,UACdjC,EAAKkC,IAAI,yEAETnD,KAAKkD,QAAQF,KAGXhD,KAAKa,SAAyC,kBAAvBb,MAAKa,QAAQuC,MAItC,KAAMJ,EAHNhD,MAAKa,QAAQuC,MAAMJ,IAUvBzB,EAASqL,QAAU,WACjB,GAAI9L,GAAOd,KAAK8B,MACZqE,EAAOhE,KAAKC,UAAUtB,EAC1Bd,MAAK+B,QAAQoE,IAMf5E,EAASmL,OAAS,WAChB,GAAI5L,GAAOd,KAAK8B,MACZqE,EAAOhE,KAAKC,UAAUtB,EAAM,KAAMd,KAAKmM,YAC3CnM,MAAK+B,QAAQoE,IAMf5E,EAASqE,MAAQ,WACX5F,KAAKuM,UACPvM,KAAKuM,SAAS3G,QAEZ5F,KAAKmI,QACPnI,KAAKmI,OAAOvC,SAOhBrE,EAASuM,OAAS,WAChB,GAAI9N,KAAKmI,OAAQ,CACf,GAAI4F,IAAQ,CACZ/N,MAAKmI,OAAO2F,OAAOC,KAQvBxM,EAASM,IAAM,SAASf,GACtBd,KAAK+B,QAAQI,KAAKC,UAAUtB,EAAM,KAAMd,KAAKmM,eAO/C5K,EAASO,IAAM,WACb,GACIhB,GADAqF,EAAOnG,KAAKkC,SAGhB,KACEpB,EAAOG,EAAKgB,MAAMkE,GAEpB,MAAOnD,GAELmD,EAAOlF,EAAK+M,SAAS7H,GAGrBrF,EAAOG,EAAKgB,MAAMkE,GAGpB,MAAOrF,IAOTS,EAASW,QAAU,WACjB,MAAIlC,MAAKuM,SACAvM,KAAKuM,SAASpH,MAEnBnF,KAAKmI,OACAnI,KAAKmI,OAAOzC,WAEd,IAOTnE,EAASQ,QAAU,SAASC,GACtBhC,KAAKuM,WACPvM,KAAKuM,SAASpH,MAAQnD,GAEpBhC,KAAKmI,QACPnI,KAAKmI,OAAO8F,SAASjM,EAAU,KAKnCnC,EAAOD,UAEH8B,KAAM,OACNmB,MAAOtB,EACPiB,KAAM,OACNO,KAAMxB,EAASmL,SAGfhL,KAAM,OACNmB,MAAOtB,EACPiB,KAAM,OACNO,KAAMxB,EAASmL,UAOd,SAAS7M,EAAQD,EAASM,GAE/B,GAAIgO,GAAWhO,EAAoB,GAQnCN,GAAQqC,MAAQ,SAAekM,GAC7B,IACE,MAAOhM,MAAKF,MAAMkM,GAEpB,MAAOnL,GAKL,KAHApD,GAAQwO,SAASD,GAGXnL,IAYVpD,EAAQoO,SAAW,SAAUK,GAc3B,QAASC,KAAU,MAAOD,GAASE,OAAOjL,GAC1C,QAASsI,KAAU,MAAOyC,GAASE,OAAOjL,EAAI,GAC9C,QAASkL,KAAU,MAAOH,GAASE,OAAOjL,EAAI,GAG9C,QAASmL,KAEP,IADA,GAAIC,GAAKpL,EAAI,EACNoL,GAAM,GAAG,CACd,GAAIC,GAAKN,EAASE,OAAOG,EACzB,IAAW,MAAPC,EACF,OAAO,CAEJ,IAAW,MAAPA,GAAqB,OAAPA,GAAsB,OAAPA,EAIpC,OAAO,CAHPD,KAMJ,OAAO,EAIT,QAASE,KAEP,IADAtL,GAAK,EACEA,EAAI+K,EAASjN,SAAsB,MAAXkN,KAA6B,MAAX1C,MAC/CtI,GAEFA,IAAK,EAIP,QAASuL,GAAYC,GACnBC,EAAMC,KAAK,KACX1L,GAEA,KADA,GAAI7C,GAAI6N,IACDhL,EAAI+K,EAASjN,QAAUX,IAAMqO,GACxB,MAANrO,GAAwB,OAAX+N,KAEfO,EAAMC,KAAK,MAIH,OAANvO,IACF6C,IACA7C,EAAI6N,IAGM,MAAN7N,GACFsO,EAAMC,KAAK,OAGfD,EAAMC,KAAKvO,GAEX6C,IACA7C,EAAI6N,GAEF7N,KAAMqO,IACRC,EAAMC,KAAK,KACX1L,KAKJ,QAAS2L,KAMP,IALA,GAAIC,IAAiB,OAAQ,OAAQ,SACjCC,EAAM,GACN1O,EAAI6N,IAEJc,EAAS,eACNA,EAAOC,KAAK5O,IACjB0O,GAAO1O,EACP6C,IACA7C,EAAI6N,GAIJS,GAAMC,KAD2B,KAA/BE,EAAcI,QAAQH,GACb,IAAMA,EAAM,IAGZA,GA5Ff,GAAIJ,MACAzL,EAAI,EAKJiM,EAAQlB,EAASkB,MAAM,uEA0F3B,KAzFIA,IACFlB,EAAWkB,EAAM,IAwFbjM,EAAI+K,EAASjN,QAAQ,CACzB,GAAIX,GAAI6N,GAEE,OAAN7N,GAAwB,MAAXmL,IACfgD,IAEa,MAANnO,GAAoB,MAANA,EACrBoO,EAAYpO,GAEL,aAAa4O,KAAK5O,IAAMgO,IAE/BQ,KAGAF,EAAMC,KAAKvO,GACX6C,KAIJ,MAAOyL,GAAMS,KAAK,KAUpB5P,EAAQwO,SAAW,SAAkBD,GACX,mBAAd,GACRD,EAASjM,MAAMkM,GAGfhM,KAAKF,MAAMkM,IAUfvO,EAAQ6C,OAAS,SAAgBgN,EAAGC,GAClC,IAAK,GAAInM,KAAQmM,GACXA,EAAE/K,eAAepB,KACnBkM,EAAElM,GAAQmM,EAAEnM,GAGhB,OAAOkM,IAQT7P,EAAQgD,MAAQ,SAAgB6M,GAC9B,IAAK,GAAIlM,KAAQkM,GACXA,EAAE9K,eAAepB,UACZkM,GAAElM,EAGb,OAAOkM,IAOT7P,EAAQuD,IAAM,SAAcwM,GACH,mBAAZC,UAAkD,kBAAhBA,SAAQzM,KACnDyM,QAAQzM,IAAI0M,MAAMD,QAASzO,YAS/BvB,EAAQoL,KAAO,SAAe8E,GAC5B,MAAe,QAAXA,EACK,OAEM5L,SAAX4L,EACK,YAEJA,YAAkB1D,SAA8B,gBAAX0D,GACjC,SAEJA,YAAkBC,SAA8B,gBAAXD,GACjC,SAEJA,YAAkBE,UAA+B,iBAAXF,GAClC,UAEJA,YAAkBG,SAA8B,gBAAXH,GACjC,SAELlQ,EAAQ4D,QAAQsM,GACX,QAGF,SAQT,IAAII,GAAa,kBACjBtQ,GAAQuQ,MAAQ,SAAgBhK,GAC9B,OAAuB,gBAARA,IAAoBA,YAAgB4J,UAC/CG,EAAWb,KAAKlJ,IAQtBvG,EAAQ4D,QAAU,SAAU4M,GAC1B,MAA+C,mBAAxCC,OAAO5O,UAAU6O,SAAS/P,KAAK6P,IASxCxQ,EAAQ2Q,gBAAkB,SAAyBC,GACjD,GAAIC,GAAOD,EAAKE,uBAChB,OAAOD,GAAKE,KAAOjD,OAAOkD,aAAe3H,SAAS4H,YAAc,GASlEjR,EAAQmH,eAAiB,SAAwByJ,GAC/C,GAAIC,GAAOD,EAAKE,uBAChB,OAAOD,GAAK3J,IAAM4G,OAAOoD,aAAe7H,SAAS5B,WAAa,GAQhEzH,EAAQmR,aAAe,SAAsBP,EAAMrH,GACjD,GAAI6H,GAAUR,EAAKrH,UAAU8H,MAAM,IACD,KAA9BD,EAAQ1B,QAAQnG,KAClB6H,EAAQhC,KAAK7F,GACbqH,EAAKrH,UAAY6H,EAAQxB,KAAK,OASlC5P,EAAQsR,gBAAkB,SAAyBV,EAAMrH,GACvD,GAAI6H,GAAUR,EAAKrH,UAAU8H,MAAM,KAC/BE,EAAQH,EAAQ1B,QAAQnG,EACf,KAATgI,IACFH,EAAQI,OAAOD,EAAO,GACtBX,EAAKrH,UAAY6H,EAAQxB,KAAK,OASlC5P,EAAQyR,gBAAkB,SAAyBC,GAEjD,IAAK,GADDC,GAASD,EAAWE,WACflO,EAAI,EAAGmO,EAAOF,EAAOnQ,OAAYqQ,EAAJnO,EAAUA,IAAK,CACnD,GAAIoO,GAAQH,EAAOjO,EAGfoO,GAAM5E,OAER4E,EAAMC,gBAAgB,QAIxB,IAAIC,GAAaF,EAAME,UACvB,IAAIA,EACF,IAAK,GAAIC,GAAID,EAAWxQ,OAAS,EAAGyQ,GAAK,EAAGA,IAAK,CAC/C,GAAIC,GAAYF,EAAWC,EACvBC,GAAUC,aAAc,GAC1BL,EAAMC,gBAAgBG,EAAUxP,MAMtC1C,EAAQyR,gBAAgBK,KAW5B9R,EAAQoS,wBAA0B,SAAiCC,GACjE,GAAIpK,GAAO5D,CACRgF,UAASiJ,cACVrK,EAAQoB,SAASiJ,cACjBrK,EAAMsK,mBAAmBF,GACzBpK,EAAM7B,UAAS,GACf/B,EAAYyJ,OAAO3F,eACnB9D,EAAUmO,kBACVnO,EAAUoO,SAASxK,KASvBjI,EAAQ6L,sBAAwB,SAA+BwG,GAC7D,GAAKA,GAA6D,OAAnCA,EAAuB3I,SAAtD,CAIA,GAAIgJ,GAAKzK,CACL6F,QAAO3F,cAAgBkB,SAASiJ,cAClCrK,EAAQoB,SAASiJ,cACjBrK,EAAMsK,mBAAmBF,GACzBK,EAAM5E,OAAO3F,eACbuK,EAAIF,kBACJE,EAAID,SAASxK,MASjBjI,EAAQmI,aAAe,WACrB,GAAI2F,OAAO3F,aAAc,CACvB,GAAIuK,GAAM5E,OAAO3F,cACjB,IAAIuK,EAAIC,YAAcD,EAAIE,WACxB,MAAOF,GAAIC,WAAW,GAG1B,MAAO,OAQT3S,EAAQgI,aAAe,SAAsBC,GAC3C,GAAIA,GACE6F,OAAO3F,aAAc,CACvB,GAAIuK,GAAM5E,OAAO3F,cACjBuK,GAAIF,kBACJE,EAAID,SAASxK,KAcnBjI,EAAQoI,mBAAqB,WAC3B,GAAIH,GAAQjI,EAAQmI,cAEpB,OAAIF,IAAS,eAAiBA,IAAS,aAAeA,IAClDA,EAAM4K,gBAAmB5K,EAAM4K,gBAAkB5K,EAAM6K,cAEvDC,YAAa9K,EAAM8K,YACnBC,UAAW/K,EAAM+K,UACjBhS,UAAWiH,EAAM4K,eAAejO,YAI7B,MAUT5E,EAAQkI,mBAAqB,SAA4B7C,GACvD,GAAIgE,SAASiJ,aAAexE,OAAO3F,aAAc,CAC/C,GAAI9D,GAAYyJ,OAAO3F,cACvB,IAAG9D,EAAW,CACZ,GAAI4D,GAAQoB,SAASiJ,aAGrBrK,GAAMgL,SAAS5N,EAAOrE,UAAUkS,WAAY7N,EAAO0N,aACnD9K,EAAMkL,OAAO9N,EAAOrE,UAAUkS,WAAY7N,EAAO2N,WAEjDhT,EAAQgI,aAAaC,MAW3BjI,EAAQoT,aAAe,SAAsBC,EAASC,GACpD,GAAIC,GAAmBjP,QAAVgP,CAgBb,IAfIC,IACFD,GACE/M,KAAQ,GACRiN,MAAS,WACP,GAAIjN,GAAOnG,KAAKmG,IAEhB,OADAnG,MAAKmG,KAAO,GACLA,GAETtE,IAAO,SAAUsE,GACfnG,KAAKmG,KAAOA,KAMd8M,EAAQI,UACV,MAAOH,GAAOE,QAAUH,EAAQI,SAIlC,IAAIJ,EAAQK,gBAAiB,CAI3B,IAAK,GAHD9B,GAAayB,EAAQzB,WACrB+B,EAAY,GAEPjQ,EAAI,EAAGmO,EAAOD,EAAWpQ,OAAYqQ,EAAJnO,EAAUA,IAAK,CACvD,GAAIoO,GAAQF,EAAWlO,EAEvB,IAAsB,OAAlBoO,EAAMpI,UAAuC,KAAlBoI,EAAMpI,SAAiB,CACpD,GAAIkK,GAAYhC,EAAWlO,EAAI,GAC3BmQ,EAAWD,EAAYA,EAAUlK,SAAWpF,MAC5CuP,IAAwB,OAAZA,GAAiC,KAAZA,GAA+B,MAAZA,IACtDF,GAAa,KACbL,EAAOE,SAETG,GAAa3T,EAAQoT,aAAatB,EAAOwB,GACzCA,EAAOrR,IAAI,UAEc,MAAlB6P,EAAMpI,UACbiK,GAAaL,EAAOE,QACpBF,EAAOrR,IAAI,OAGX0R,GAAa3T,EAAQoT,aAAatB,EAAOwB,GAI7C,MAAOK,GAGP,MAAwB,KAApBN,EAAQ3J,UAA2D,IAAxC1J,EAAQsB,6BAM9BgS,EAAOE,QAKX,IASTxT,EAAQsB,2BAA6B,WACnC,GAAkB,IAAdwS,EAAkB,CACpB,GAAIC,GAAK,EACT,IAAyB,+BAArBC,UAAUC,QACd,CACE,GAAIC,GAAKF,UAAUG,UACfC,EAAM,GAAI/D,QAAO,6BACF,OAAf+D,EAAGC,KAAKH,KACVH,EAAKO,WAAYjE,OAAOkE,KAI5BT,EAAaC,EAGf,MAAOD,IAOT9T,EAAQwU,UAAY,WAClB,MAAkD,IAA1CR,UAAUG,UAAUzE,QAAQ,WAQtC,IAAIoE,GAAa,EAWjB9T,GAAQsK,iBAAmB,SAA0B+I,EAASzM,EAAQ6N,EAAUC,GAC9E,GAAIrB,EAAQ/I,iBASV,MARmBhG,UAAfoQ,IACFA,GAAa,GAEA,eAAX9N,GAA2B5G,EAAQwU,cACrC5N,EAAS,kBAGXyM,EAAQ/I,iBAAiB1D,EAAQ6N,EAAUC,GACpCD,CACF,IAAIpB,EAAQsB,YAAa,CAE9B,GAAIC,GAAI,WACN,MAAOH,GAAS9T,KAAK0S,EAASvF,OAAO3E,OAGvC,OADAkK,GAAQsB,YAAY,KAAO/N,EAAQgO,GAC5BA,IAWX5U,EAAQ6U,oBAAsB,SAA6BxB,EAASzM,EAAQ6N,EAAUC,GAChFrB,EAAQwB,qBACSvQ,SAAfoQ,IACFA,GAAa,GAEA,eAAX9N,GAA2B5G,EAAQwU,cACrC5N,EAAS,kBAGXyM,EAAQwB,oBAAoBjO,EAAQ6N,EAAUC,IACrCrB,EAAQyB,aAEjBzB,EAAQyB,YAAY,KAAOlO,EAAQ6N,KAOlC,SAASxU,EAAQD,EAASM,GAO/B,QAASwD,KACP1D,KAAK2U,QAAS,EAOhBjR,EAAYjC,UAAUmT,UAAY,SAAUxP,GACtCpF,KAAK2U,SAIL3U,KAAKoF,MAAQA,IAEXpF,KAAKoF,MACPpF,KAAKoF,KAAKyP,cAAa,GAIzB7U,KAAKoF,KAAOA,EACZpF,KAAKoF,KAAKyP,cAAa,IAIzB7U,KAAK8U,uBAOPpR,EAAYjC,UAAUsT,YAAc,WAClC,IAAI/U,KAAK2U,OAAT,CAIA,GAAI9N,GAAK7G,IACLA,MAAKoF,OACPpF,KAAK8U,qBAKL9U,KAAKgV,iBAAmBnM,WAAW,WACjChC,EAAGzB,KAAKyP,cAAa,GACrBhO,EAAGzB,KAAOlB,OACV2C,EAAGmO,iBAAmB9Q,QACrB,MAQPR,EAAYjC,UAAUqT,mBAAqB,WACrC9U,KAAKgV,mBACPrN,aAAa3H,KAAKgV,kBAClBhV,KAAKgV,iBAAmB9Q,SAQ5BR,EAAYjC,UAAUwT,KAAO,WAC3BjV,KAAK2U,QAAS,GAMhBjR,EAAYjC,UAAUyT,OAAS,WAC7BlV,KAAK2U,QAAS,GAGhB9U,EAAOD,QAAU8D,GAKZ,SAAS7D,EAAQD,EAASM,GAS/B,QAASyD,GAASwE,GAChBnI,KAAKmI,OAASA,EACdnI,KAAK4C,QAGL5C,KAAKmV,SACHC,WACE9K,KAAQ,SAAUrF,GAChBA,EAAOG,KAAKO,YAAYV,EAAOoQ,WAEjC7K,KAAQ,SAAUvF,GAChBA,EAAOG,KAAKO,YAAYV,EAAOqQ,YAGnCC,WACEjL,KAAQ,SAAUrF,GAChBA,EAAOG,KAAKoQ,YAAYvQ,EAAOoQ,WAEjC7K,KAAQ,SAAUvF,GAChBA,EAAOG,KAAKoQ,YAAYvQ,EAAOqQ,YAGnCG,YACEnL,KAAQ,SAAUrF,GAChBA,EAAOyQ,OAAOjR,YAAYQ,EAAOG,OAEnCoF,KAAQ,SAAUvF,GAChBA,EAAOyQ,OAAOlQ,YAAYP,EAAOG,QAGrCuQ,kBACErL,KAAQ,SAAUrF,GAChBA,EAAOyQ,OAAOjR,YAAYQ,EAAOG,OAEnCoF,KAAQ,SAAUvF,GAChBA,EAAOyQ,OAAOE,aAAa3Q,EAAOG,KAAMH,EAAO4Q,cAGnDC,iBACExL,KAAQ,SAAUrF,GAChBA,EAAOyQ,OAAOjR,YAAYQ,EAAOG,OAEnCoF,KAAQ,SAAUvF,GAChBA,EAAOyQ,OAAOK,YAAY9Q,EAAOG,KAAMH,EAAO+Q,aAGlDC,YACE3L,KAAQ,SAAUrF,GAChB,GAAIyQ,GAASzQ,EAAOyQ,OAChBG,EAAaH,EAAOnE,OAAOtM,EAAOkM,QAAUuE,EAAOQ,MACvDR,GAAOE,aAAa3Q,EAAOG,KAAMyQ,IAEnCrL,KAAQ,SAAUvF,GAChBA,EAAOyQ,OAAOjR,YAAYQ,EAAOG,QAGrC+Q,eACE7L,KAAQ,SAAUrF,GAChBA,EAAOyQ,OAAOjR,YAAYQ,EAAOmR,QAEnC5L,KAAQ,SAAUvF,GAChBA,EAAOyQ,OAAOK,YAAY9Q,EAAOmR,MAAOnR,EAAOG,QAGnDiR,YACE/L,KAAQ,SAAUrF,GAChBA,EAAOG,KAAKiR,WAAWpR,EAAOqR,UAEhC9L,KAAQ,SAAUvF,GAChBA,EAAOG,KAAKiR,WAAWpR,EAAOsR,WAGlCC,UACElM,KAAQ,SAAUrF,GAChBA,EAAOwR,YAAYC,OAAOzR,EAAOG,KAAMH,EAAO0R,aAEhDnM,KAAQ,SAAUvF,GAChBA,EAAO2R,UAAUF,OAAOzR,EAAOG,KAAMH,EAAO4R,YAGhDC,MACExM,KAAQ,SAAUrF,GAChB,GAAIG,GAAOH,EAAOG,IAClBA,GAAK2R,aACL3R,EAAK0R,KAAO7R,EAAO+R,QACnB5R,EAAKmM,OAAStM,EAAOgS,UACrB7R,EAAK8R,cAEP1M,KAAQ,SAAUvF,GAChB,GAAIG,GAAOH,EAAOG,IAClBA,GAAK2R,aACL3R,EAAK0R,KAAO7R,EAAOkS,QACnB/R,EAAKmM,OAAStM,EAAOmS,UACrBhS,EAAK8R,gBApGb,GAAIjW,GAAOf,EAAoB,EAiH/ByD,GAAQlC,UAAUiJ,SAAW,aAa7B/G,EAAQlC,UAAUgF,IAAM,SAAUD,EAAQvB,GACxCjF,KAAKmR,QACLnR,KAAKoE,QAAQpE,KAAKmR,QAChB3K,OAAUA,EACVvB,OAAUA,EACVoS,UAAa,GAAIC,OAIftX,KAAKmR,MAAQnR,KAAKoE,QAAQhD,OAAS,GACrCpB,KAAKoE,QAAQgN,OAAOpR,KAAKmR,MAAQ,EAAGnR,KAAKoE,QAAQhD,OAASpB,KAAKmR,MAAQ,GAIzEnR,KAAK0K,YAMP/G,EAAQlC,UAAUmB,MAAQ,WACxB5C,KAAKoE,WACLpE,KAAKmR,MAAQ,GAGbnR,KAAK0K,YAOP/G,EAAQlC,UAAUmJ,QAAU,WAC1B,MAAQ5K,MAAKmR,OAAS,GAOxBxN,EAAQlC,UAAUoJ,QAAU,WAC1B,MAAQ7K,MAAKmR,MAAQnR,KAAKoE,QAAQhD,OAAS,GAM7CuC,EAAQlC,UAAU6I,KAAO,WACvB,GAAItK,KAAK4K,UAAW,CAClB,GAAIwF,GAAMpQ,KAAKoE,QAAQpE,KAAKmR,MAC5B,IAAIf,EAAK,CACP,GAAI5J,GAASxG,KAAKmV,QAAQ/E,EAAI5J,OAC1BA,IAAUA,EAAO8D,MACnB9D,EAAO8D,KAAK8F,EAAInL,QACZmL,EAAInL,OAAOsS,cACbvX,KAAKmI,OAAOP,aAAawI,EAAInL,OAAOsS,eAItCtW,EAAKkC,IAAI,0BAA4BiN,EAAI5J,OAAS,KAGtDxG,KAAKmR,QAGLnR,KAAK0K,aAOT/G,EAAQlC,UAAU+I,KAAO,WACvB,GAAIxK,KAAK6K,UAAW,CAClB7K,KAAKmR,OAEL,IAAIf,GAAMpQ,KAAKoE,QAAQpE,KAAKmR,MAC5B,IAAIf,EAAK,CACP,GAAI5J,GAASxG,KAAKmV,QAAQ/E,EAAI5J,OAC1BA,IAAUA,EAAOgE,MACnBhE,EAAOgE,KAAK4F,EAAInL,QACZmL,EAAInL,OAAOuS,cACbxX,KAAKmI,OAAOP,aAAawI,EAAInL,OAAOuS,eAItCvW,EAAKkC,IAAI,0BAA4BiN,EAAI5J,OAAS,KAKtDxG,KAAK0K,aAIT7K,EAAOD,QAAU+D,GAKZ,SAAS9D,EAAQD,EAASM,GAS/B,QAAS0D,GAAWuE,EAAQvH,GAC1B,GAAImK,GAAY/K,IAEhBA,MAAKmI,OAASA,EACdnI,KAAKyX,QAAUvT,OACflE,KAAK0X,MAAQ,IACb1X,KAAK2X,SAAWzT,OAEhBlE,KAAK+D,OACL/D,KAAK+D,IAAInD,UAAYA,CAErB,IAAIoE,GAAQiE,SAASC,cAAc,QACnClJ,MAAK+D,IAAIiB,MAAQA,EACjBA,EAAMmE,UAAY,SAClBvI,EAAU4E,YAAYR,EACtB,IAAIiB,GAAQgD,SAASC,cAAc,QACnClJ,MAAK+D,IAAIkC,MAAQA,EACjBjB,EAAMQ,YAAYS,EAClB,IAAI2R,GAAK3O,SAASC,cAAc,KAChCjD,GAAMT,YAAYoS,EAElB,IAAIC,GAAK5O,SAASC,cAAc,KAChC0O,GAAGpS,YAAYqS,EACf,IAAIzR,GAAU6C,SAASC,cAAc,MACrClJ,MAAK+D,IAAIqC,QAAUA,EACnBA,EAAQ+C,UAAY,UACpB0O,EAAGrS,YAAYY,GAEfyR,EAAK5O,SAASC,cAAc,MAC5B0O,EAAGpS,YAAYqS,EACf,IAAIC,GAAW7O,SAASC,cAAc,MACtClJ,MAAK+D,IAAI8B,MAAQiS,EACjBA,EAAS3O,UAAY,QACrB2O,EAASzN,MAAQ,2BACjBwN,EAAGrS,YAAYsS,EAGf,IAAIC,GAAa9O,SAASC,cAAc,QACxC4O,GAAStS,YAAYuS,EACrB,IAAIC,GAAc/O,SAASC,cAAc,QACzC6O,GAAWvS,YAAYwS,GACvBJ,EAAK3O,SAASC,cAAc,MAC5B8O,EAAYxS,YAAYoS,EAExB,IAAIK,GAAgBhP,SAASC,cAAc,SAC3C+O,GAAc9O,UAAY,UAC1B0O,EAAK5O,SAASC,cAAc,MAC5B2O,EAAGrS,YAAYyS,GACfL,EAAGpS,YAAYqS,EAEf,IAAInT,GAASuE,SAASC,cAAc,QACpClJ,MAAK+D,IAAIW,OAASA,EAClBA,EAAO8E,QAAU,SAAUT,GACzBgC,EAAUmN,iBAAiBnP,IAE7BrE,EAAO+E,SAAW,SAAUV,GAC1BgC,EAAUoN,UAAUpP,IAEtBrE,EAAOgF,UAAY,SAAUX,GAC3BgC,EAAUE,WAAWlC,IAEvBrE,EAAOiF,QAAU,SAAUZ,GACzBgC,EAAUqN,SAASrP,IAErBkP,EAAc7O,QAAU,SAAUL,GAChCrE,EAAOgH,UAITmM,EAAK5O,SAASC,cAAc,MAC5B2O,EAAGrS,YAAYd,GACfkT,EAAGpS,YAAYqS,EAEf,IAAIQ,GAAapP,SAASC,cAAc,SACxCmP,GAAWhO,MAAQ,sBACnBgO,EAAWlP,UAAY,OACvBkP,EAAWjP,QAAU,WACnB2B,EAAUa,QAEZiM,EAAK5O,SAASC,cAAc,MAC5B2O,EAAGrS,YAAY6S,GACfT,EAAGpS,YAAYqS,EAEf,IAAIS,GAAiBrP,SAASC,cAAc,SAC5CoP,GAAejO,MAAQ,gCACvBiO,EAAenP,UAAY,WAC3BmP,EAAelP,QAAU,WACvB2B,EAAUY,YAEZkM,EAAK5O,SAASC,cAAc,MAC5B2O,EAAGrS,YAAY8S,GACfV,EAAGpS,YAAYqS,GAQjBjU,EAAUnC,UAAUmK,KAAO,SAAShG,GAClC,GAAoB1B,QAAhBlE,KAAKoG,QAAsB,CAC7B,GAAI+K,GAA6BjN,QAApBlE,KAAKuY,YAA4BvY,KAAKuY,YAAc,EAAI,CACjEpH,GAAQnR,KAAKoG,QAAQhF,OAAS,IAChC+P,EAAQ,GAEVnR,KAAKwY,iBAAiBrH,EAAOvL,KASjChC,EAAUnC,UAAUkK,SAAW,SAAS/F,GACtC,GAAoB1B,QAAhBlE,KAAKoG,QAAsB,CAC7B,GAAIqC,GAAMzI,KAAKoG,QAAQhF,OAAS,EAC5B+P,EAA6BjN,QAApBlE,KAAKuY,YAA4BvY,KAAKuY,YAAc,EAAI9P,CACzD,GAAR0I,IACFA,EAAQ1I,GAEVzI,KAAKwY,iBAAiBrH,EAAOvL,KAWjChC,EAAUnC,UAAU+W,iBAAmB,SAASrH,EAAOvL,GAErD,GAAI5F,KAAKyY,aAAc,CACrB,GAAIC,GAAW1Y,KAAKyY,aAAarT,KAC7BuT,EAAW3Y,KAAKyY,aAAajI,IACjB,UAAZmI,QACKD,GAASE,wBAGTF,GAASG,kBAElBH,EAASI,YAGX,IAAK9Y,KAAKoG,UAAYpG,KAAKoG,QAAQ+K,GAIjC,MAFAnR,MAAKuY,YAAcrU,YACnBlE,KAAKyY,aAAevU,OAItBlE,MAAKuY,YAAcpH,CAGnB,IAAI/L,GAAOpF,KAAKoG,QAAQpG,KAAKuY,aAAanT,KACtCoL,EAAOxQ,KAAKoG,QAAQpG,KAAKuY,aAAa/H,IAC9B,UAARA,EACFpL,EAAKwT,mBAAoB,EAGzBxT,EAAKyT,mBAAoB,EAE3B7Y,KAAKyY,aAAezY,KAAKoG,QAAQpG,KAAKuY,aACtCnT,EAAK0T,YAGL1T,EAAK6C,SAAS,WACRrC,GACFR,EAAKQ,MAAM4K,MASjB5M,EAAUnC,UAAUsX,YAAc,WACZ7U,QAAhBlE,KAAKyX,UACP9P,aAAa3H,KAAKyX,eACXzX,MAAKyX,UAUhB7T,EAAUnC,UAAUyW,iBAAmB,SAAUnP,GAG/C/I,KAAK+Y,aACL,IAAIhO,GAAY/K,IAChBA,MAAKyX,QAAU5O,WAAW,SAAUE,GAC9BgC,EAAUoN,UAAUpP,IAEtB/I,KAAK0X,QAWX9T,EAAUnC,UAAU0W,UAAY,SAAUpP,EAAOiQ,GAC/ChZ,KAAK+Y,aAEL,IAAI5T,GAAQnF,KAAK+D,IAAIW,OAAOS,MACxBgB,EAAQhB,EAAM/D,OAAS,EAAK+D,EAAQjB,MACxC,IAAIiC,GAAQnG,KAAK2X,UAAYqB,EAO3B,GALAhZ,KAAK2X,SAAWxR,EAChBnG,KAAKoG,QAAUpG,KAAKmI,OAAOzD,OAAOyB,GAClCnG,KAAKwY,iBAAiBtU,QAGVA,QAARiC,EAAmB,CACrB,GAAI8S,GAAcjZ,KAAKoG,QAAQhF,MAC/B,QAAQ6X,GACN,IAAK,GAAGjZ,KAAK+D,IAAIqC,QAAQ8S,UAAY,iBAAmB,MACxD,KAAK,GAAGlZ,KAAK+D,IAAIqC,QAAQ8S,UAAY,eAAiB,MACtD,SAASlZ,KAAK+D,IAAIqC,QAAQ8S,UAAYD,EAAc,qBAItDjZ,MAAK+D,IAAIqC,QAAQ8S,UAAY,IAUnCtV,EAAUnC,UAAUwJ,WAAa,SAAUlC,GACzC,GAAIoC,GAASpC,EAAMqC,KACL,KAAVD,GACFnL,KAAK+D,IAAIW,OAAOS,MAAQ,GACxBnF,KAAKmY,UAAUpP,GACfA,EAAMQ,iBACNR,EAAM8C,mBAEW,IAAVV,IACHpC,EAAMuC,QAERtL,KAAKmY,UAAUpP,GAAO,GAEfA,EAAMwC,SAEbvL,KAAK2L,WAIL3L,KAAK4L,OAEP7C,EAAMQ,iBACNR,EAAM8C,oBASVjI,EAAUnC,UAAU2W,SAAW,SAAUrP,GACvC,GAAIoC,GAASpC,EAAMsC,OACL,KAAVF,GAA0B,IAAVA,GAClBnL,KAAKkY,iBAAiBnP,IAI1BlJ,EAAOD,QAAUgE,GAKZ,SAAS/D,EAAQD,EAASM,GAiB/B,QAAS2D,GAAMsE,EAAQlD,GAErBjF,KAAKmI,OAASA,EACdnI,KAAK+D,OACL/D,KAAKmZ,UAAW,EAEblU,GAAWA,YAAkBoL,SAC9BrQ,KAAKoZ,SAASnU,EAAOC,MAAOD,EAAOoU,eACnCrZ,KAAKiO,SAAShJ,EAAOE,MAAOF,EAAO+F,QAGnChL,KAAKoZ,SAAS,IACdpZ,KAAKiO,SAAS,OA3BlB,GAAIqL,GAAcpZ,EAAoB,IAClCqZ,EAAoBrZ,EAAoB,IACxCe,EAAOf,EAAoB,EAiC/B2D,GAAKpC,UAAU+X,mBAAqB,WAMlC,GALAxZ,KAAKyZ,UACHvU,OAAO,EACPC,OAAO,GAGLnF,KAAKmI,SACPnI,KAAKyZ,SAASvU,MAAqC,SAA7BlF,KAAKmI,OAAOtH,QAAQa,KAC1C1B,KAAKyZ,SAAStU,MAAqC,SAA7BnF,KAAKmI,OAAOtH,QAAQa,KAET,SAA7B1B,KAAKmI,OAAOtH,QAAQa,MAA4D,kBAAjC1B,MAAKmI,OAAOtH,QAAQ4Y,UAA0B,CAC/F,GAAIA,GAAWzZ,KAAKmI,OAAOtH,QAAQ4Y,UACjCvU,MAAOlF,KAAKkF,MACZC,MAAOnF,KAAKmF,MACZuU,KAAM1Z,KAAK0Z,QAGW,kBAAbD,IACTzZ,KAAKyZ,SAASvU,MAAQuU,EACtBzZ,KAAKyZ,SAAStU,MAAQsU,IAGQ,iBAAnBA,GAASvU,QAAqBlF,KAAKyZ,SAASvU,MAAQuU,EAASvU,OAC1C,iBAAnBuU,GAAStU,QAAqBnF,KAAKyZ,SAAStU,MAAQsU,EAAStU,UAUhFtB,EAAKpC,UAAUiY,KAAO,WAGpB,IAFA,GAAItU,GAAOpF,KACP0Z,KACGtU,GAAM,CACX,GAAIF,GAAsBhB,QAAdkB,EAAKF,MAAqBE,EAAKF,MAAQE,EAAK+L,KAC1CjN,UAAVgB,GACFwU,EAAKC,QAAQzU,GAEfE,EAAOA,EAAKsQ,OAEd,MAAOgE,IAOT7V,EAAKpC,UAAUmY,UAAY,SAASlE,GAClC1V,KAAK0V,OAASA,GAQhB7R,EAAKpC,UAAU2X,SAAW,SAASlU,EAAOmU,GACxCrZ,KAAKkF,MAAQA,EACblF,KAAKqZ,cAAiBA,KAAkB,GAO1CxV,EAAKpC,UAAUoY,SAAW,WAKxB,MAJmB3V,UAAflE,KAAKkF,OACPlF,KAAK8Z,eAGA9Z,KAAKkF,OASdrB,EAAKpC,UAAUwM,SAAW,SAAS9I,EAAO6F,GACxC,GAAI+O,GAAYrI,EAGZH,EAASvR,KAAKuR,MAClB,IAAIA,EACF,KAAOA,EAAOnQ,QACZpB,KAAKyE,YAAY8M,EAAO,GAS5B,IAHAvR,KAAKgL,KAAOhL,KAAKga,SAAS7U,GAGtB6F,GAAQA,GAAQhL,KAAKgL,KAAM,CAC7B,GAAY,UAARA,GAAiC,QAAbhL,KAAKgL,KAI3B,KAAM,IAAIjK,OAAM,6CACoBf,KAAKgL,KACrC,2BAA6BA,EAAO,IALxChL,MAAKgL,KAAOA,EAShB,GAAiB,SAAbhL,KAAKgL,KAAiB,CAExBhL,KAAKuR,SACL,KAAK,GAAIjO,GAAI,EAAGmO,EAAOtM,EAAM/D,OAAYqQ,EAAJnO,EAAUA,IAC7CyW,EAAa5U,EAAM7B,GACAY,SAAf6V,GAA8BA,YAAsBjV,YAEtD4M,EAAQ,GAAI7N,GAAK7D,KAAKmI,QACpBhD,MAAO4U,IAET/Z,KAAKwF,YAAYkM,GAGrB1R,MAAKmF,MAAQ,OAEV,IAAiB,UAAbnF,KAAKgL,KAAkB,CAE9BhL,KAAKuR,SACL,KAAK,GAAI0I,KAAc9U,GACjBA,EAAMR,eAAesV,KACvBF,EAAa5U,EAAM8U,GACA/V,SAAf6V,GAA8BA,YAAsBjV,YAEtD4M,EAAQ,GAAI7N,GAAK7D,KAAKmI,QACpBjD,MAAO+U,EACP9U,MAAO4U,IAET/Z,KAAKwF,YAAYkM,IAIvB1R,MAAKmF,MAAQ,OAIbnF,MAAKuR,OAASrN,OACdlE,KAAKmF,MAAQA,GAkBjBtB,EAAKpC,UAAUiE,SAAW,WAGxB,GAAiB,SAAb1F,KAAKgL,KAAiB,CACxB,GAAIkP,KAIJ,OAHAla,MAAKuR,OAAO4I,QAAS,SAAUzI,GAC7BwI,EAAIlL,KAAK0C,EAAMhM,cAEVwU,EAEJ,GAAiB,UAAbla,KAAKgL,KAAkB,CAC9B,GAAIoF,KAIJ,OAHApQ,MAAKuR,OAAO4I,QAAS,SAAUzI,GAC7BtB,EAAIsB,EAAMmI,YAAcnI,EAAMhM,aAEzB0K,EAOP,MAJmBlM,UAAflE,KAAKmF,OACPnF,KAAKoa,eAGApa,KAAKmF,OAQhBtB,EAAKpC,UAAU4Y,SAAW,WACxB,MAAQra,MAAK0V,OAAS1V,KAAK0V,OAAO2E,WAAa,EAAI,GASrDxW,EAAKpC,UAAU2U,MAAQ,WACrB,GAAIA,GAAQ,GAAIvS,GAAK7D,KAAKmI,OAS1B,IARAiO,EAAMpL,KAAOhL,KAAKgL,KAClBoL,EAAMlR,MAAQlF,KAAKkF,MACnBkR,EAAMkE,eAAiBta,KAAKsa,eAC5BlE,EAAMiD,cAAgBrZ,KAAKqZ,cAC3BjD,EAAMjR,MAAQnF,KAAKmF,MACnBiR,EAAMmE,eAAiBva,KAAKua,eAC5BnE,EAAM+C,SAAWnZ,KAAKmZ,SAElBnZ,KAAKuR,OAAQ,CAEf,GAAIiJ,KACJxa,MAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5B,GAAI+I,GAAa/I,EAAM0E,OACvBqE,GAAWb,UAAUxD,GACrBoE,EAAYxL,KAAKyL,KAEnBrE,EAAM7E,OAASiJ,MAIfpE,GAAM7E,OAASrN,MAGjB,OAAOkS,IAQTvS,EAAKpC,UAAU8D,OAAS,SAASD,GAC1BtF,KAAKuR,SAKVvR,KAAKmZ,UAAW,EACZnZ,KAAK+D,IAAIwB,SACXvF,KAAK+D,IAAIwB,OAAO4D,UAAY,YAG9BnJ,KAAKkX,aAED5R,KAAY,GACdtF,KAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5BA,EAAMnM,OAAOD,OAUnBzB,EAAKpC,UAAUuE,SAAW,SAASV,GAC5BtF,KAAKuR,SAIVvR,KAAK+W,aAGDzR,KAAY,GACdtF,KAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5BA,EAAM1L,SAASV,KAMftF,KAAK+D,IAAIwB,SACXvF,KAAK+D,IAAIwB,OAAO4D,UAAY,aAE9BnJ,KAAKmZ,UAAW,IAMlBtV,EAAKpC,UAAUyV,WAAa,WAC1B,GAAI3F,GAASvR,KAAKuR,MAClB,IAAKA,GAGAvR,KAAKmZ,SAAV,CAIA,GAAIvB,GAAK5X,KAAK+D,IAAI6T,GACd5S,EAAQ4S,EAAKA,EAAGpT,WAAaN,MACjC,IAAIc,EAAO,CAET,GAAIkR,GAASlW,KAAK0a,YACdC,EAAS/C,EAAGgD,WACZD,GACF3V,EAAM4Q,aAAaM,EAAQyE,GAG3B3V,EAAMQ,YAAY0Q,GAIpBlW,KAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5B1M,EAAM4Q,aAAalE,EAAMxL,SAAUgQ,GACnCxE,EAAMwF,kBAQZrT,EAAKpC,UAAUoZ,KAAO,WACpB,GAAIjD,GAAK5X,KAAK+D,IAAI6T,GACd5S,EAAQ4S,EAAKA,EAAGpT,WAAaN,MAC7Bc,IACFA,EAAMP,YAAYmT,GAEpB5X,KAAK+W,cAOPlT,EAAKpC,UAAUsV,WAAa,WAC1B,GAAIxF,GAASvR,KAAKuR,MAClB,IAAKA,GAGAvR,KAAKmZ,SAAV,CAKA,GAAIjD,GAASlW,KAAK0a,WACdxE,GAAO1R,YACT0R,EAAO1R,WAAWC,YAAYyR,GAIhClW,KAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5BA,EAAMmJ,WAUVhX,EAAKpC,UAAU+D,YAAc,SAASJ,GACpC,GAAIpF,KAAK8a,aAAc,CASrB,GAPA1V,EAAKwU,UAAU5Z,MACfoF,EAAKiU,cAA8B,UAAbrZ,KAAKgL,KACV,SAAbhL,KAAKgL,OACP5F,EAAK+L,MAAQnR,KAAKuR,OAAOnQ,QAE3BpB,KAAKuR,OAAOvC,KAAK5J,GAEbpF,KAAKmZ,SAAU,CAEjB,GAAI4B,GAAQ3V,EAAKc,SACb8U,EAAWhb,KAAK0a,YAChB1V,EAAQgW,EAAWA,EAASxW,WAAaN,MACzC8W,IAAYhW,GACdA,EAAM4Q,aAAamF,EAAOC,GAG5B5V,EAAK8R,aAGPlX,KAAK8Y,WAAWmC,eAAiB,IACjC7V,EAAK0T,WAAWxT,SAAW,MAW/BzB,EAAKpC,UAAUyZ,WAAa,SAAS9V,EAAMyQ,GACzC,GAAI7V,KAAK8a,aAAc,CAGrB,GAAI7U,GAASjG,KAAK+D,IAAM,GAAI/D,KAAK+D,IAAI6T,GAAGpT,WAAaN,MACrD,IAAI+B,EAAO,CACT,GAAIkV,GAASlS,SAASC,cAAc,KACpCiS,GAAOrO,MAAM9F,OAASf,EAAMgB,aAAe,KAC3ChB,EAAMT,YAAY2V,GAGhB/V,EAAKsQ,QACPtQ,EAAKsQ,OAAOjR,YAAYW,GAGtByQ,YAAsBuF,GACxBpb,KAAKwF,YAAYJ,GAGjBpF,KAAK4V,aAAaxQ,EAAMyQ,GAGtB5P,GACFA,EAAMxB,YAAY0W,KAYxBtX,EAAKpC,UAAUiV,OAAS,SAAUtR,EAAM+L,GACtC,GAAI/L,EAAKsQ,QAAU1V,KAAM,CAEvB,GAAIqb,GAAerb,KAAKuR,OAAOjC,QAAQlK,EACpB+L,GAAfkK,GAEFlK,IAIJ,GAAI0E,GAAa7V,KAAKuR,OAAOJ,IAAUnR,KAAKkW,MAC5ClW,MAAKkb,WAAW9V,EAAMyQ,IASxBhS,EAAKpC,UAAUmU,aAAe,SAASxQ,EAAMyQ,GAC3C,GAAI7V,KAAK8a,aAAc,CACrB,GAAIjF,GAAc7V,KAAKkW,OAIrB9Q,EAAKwU,UAAU5Z,MACfoF,EAAKiU,cAA8B,UAAbrZ,KAAKgL,KAC3BhL,KAAKuR,OAAOvC,KAAK5J,OAEd,CAEH,GAAI+L,GAAQnR,KAAKuR,OAAOjC,QAAQuG,EAChC,IAAa,IAAT1E,EACF,KAAM,IAAIpQ,OAAM,iBAIlBqE,GAAKwU,UAAU5Z,MACfoF,EAAKiU,cAA8B,UAAbrZ,KAAKgL,KAC3BhL,KAAKuR,OAAOH,OAAOD,EAAO,EAAG/L,GAG/B,GAAIpF,KAAKmZ,SAAU,CAEjB,GAAI4B,GAAQ3V,EAAKc,SACbyU,EAAS9E,EAAW3P,SACpBlB,EAAQ2V,EAASA,EAAOnW,WAAaN,MACrCyW,IAAU3V,GACZA,EAAM4Q,aAAamF,EAAOJ,GAG5BvV,EAAK8R,aAGPlX,KAAK8Y,WAAWmC,eAAiB,IACjC7V,EAAK0T,WAAWxT,SAAW,MAU/BzB,EAAKpC,UAAUsU,YAAc,SAAS3Q,EAAM4Q,GAC1C,GAAIhW,KAAK8a,aAAc,CACrB,GAAI3J,GAAQnR,KAAKuR,OAAOjC,QAAQ0G,GAC5BH,EAAa7V,KAAKuR,OAAOJ,EAAQ,EACjC0E,GACF7V,KAAK4V,aAAaxQ,EAAMyQ,GAGxB7V,KAAKwF,YAAYJ,KAYvBvB,EAAKpC,UAAUiD,OAAS,SAASyB,GAC/B,GACIgL,GADA/K,KAEA1B,EAASyB,EAAOA,EAAKmV,cAAgBpX,MAOzC,UAJOlE,MAAKub,kBACLvb,MAAKwb,YAGMtX,QAAdlE,KAAKkF,MAAoB,CAC3B,GAAIA,GAAQ6K,OAAO/P,KAAKkF,OAAOoW,aAC/BnK,GAAQjM,EAAMoK,QAAQ5K,GACT,IAATyM,IACFnR,KAAKub,aAAc,EACnBnV,EAAQ4I,MACN5J,KAAQpF,KACRwQ,KAAQ,WAKZxQ,KAAKyb,kBAIP,GAAIzb,KAAK8a,aAAc,CAIrB,GAAI9a,KAAKuR,OAAQ,CACf,GAAImK,KACJ1b,MAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5BgK,EAAeA,EAAaC,OAAOjK,EAAMhN,OAAOyB,MAElDC,EAAUA,EAAQuV,OAAOD,GAI3B,GAAcxX,QAAVQ,EAAqB,CACvB,GAAIY,IAAU,CACa,IAAvBoW,EAAata,OACfpB,KAAKgG,SAASV,GAGdtF,KAAKuF,OAAOD,QAIb,CAEH,GAAkBpB,QAAdlE,KAAKmF,MAAqB,CAC5B,GAAIA,GAAQ4K,OAAO/P,KAAKmF,OAAOmW,aAC/BnK,GAAQhM,EAAMmK,QAAQ5K,GACT,IAATyM,IACFnR,KAAKwb,aAAc,EACnBpV,EAAQ4I,MACN5J,KAAQpF,KACRwQ,KAAQ,WAMdxQ,KAAK4b,kBAGP,MAAOxV,IAQTvC,EAAKpC,UAAUwG,SAAW,SAASC,GACjC,IAAKlI,KAAK+D,IAAI6T,KAAO5X,KAAK+D,IAAI6T,GAAGpT,WAI/B,IAFA,GAAIkR,GAAS1V,KAAK0V,OACdpQ,GAAU,EACPoQ,GACLA,EAAOnQ,OAAOD,GACdoQ,EAASA,EAAOA,MAIhB1V,MAAK+D,IAAI6T,IAAM5X,KAAK+D,IAAI6T,GAAGpT,YAC7BxE,KAAKmI,OAAOF,SAASjI,KAAK+D,IAAI6T,GAAGiE,UAAW3T,IAMhDrE,EAAKiY,aAAe5X,OAQpBL,EAAKpC,UAAUmE,MAAQ,SAASmW,GAG9B,GAFAlY,EAAKiY,aAAeC,EAEhB/b,KAAK+D,IAAI6T,IAAM5X,KAAK+D,IAAI6T,GAAGpT,WAAY,CACzC,GAAIT,GAAM/D,KAAK+D,GAEf,QAAQgY,GACN,IAAK,OACChY,EAAIiY,KACNjY,EAAIiY,KAAKpW,QAGT7B,EAAIgC,KAAKH,OAEX,MAEF,KAAK,OACH7B,EAAIgC,KAAKH,OACT,MAEF,KAAK,SACC5F,KAAK8a,aACP/W,EAAIwB,OAAOK,QAEJ7B,EAAImB,OAASlF,KAAKqZ,eACzBtV,EAAImB,MAAMU,QACV3E,EAAKwK,sBAAsB1H,EAAImB,QAExBnB,EAAIoB,QAAUnF,KAAK8a,cAC1B/W,EAAIoB,MAAMS,QACV3E,EAAKwK,sBAAsB1H,EAAIoB,QAG/BpB,EAAIgC,KAAKH;AAEX,KAEF,KAAK,QACC7B,EAAImB,OAASlF,KAAKqZ,eACpBtV,EAAImB,MAAMU,QACV3E,EAAKwK,sBAAsB1H,EAAImB,QAExBnB,EAAIoB,QAAUnF,KAAK8a,cAC1B/W,EAAIoB,MAAMS,QACV3E,EAAKwK,sBAAsB1H,EAAIoB,QAExBnF,KAAK8a,aACZ/W,EAAIwB,OAAOK,QAGX7B,EAAIgC,KAAKH,OAEX,MAEF,KAAK,QACL,QACM7B,EAAIoB,QAAUnF,KAAK8a,cACrB/W,EAAIoB,MAAMS,QACV3E,EAAKwK,sBAAsB1H,EAAIoB,QAExBpB,EAAImB,OAASlF,KAAKqZ,eACzBtV,EAAImB,MAAMU,QACV3E,EAAKwK,sBAAsB1H,EAAImB,QAExBlF,KAAK8a,aACZ/W,EAAIwB,OAAOK,QAGX7B,EAAIgC,KAAKH,WAWnB/B,EAAK6H,OAAS,SAASuQ,GACrBpT,WAAW,WACT5H,EAAKwK,sBAAsBwQ,IAC1B,IAMLpY,EAAKpC,UAAUgE,KAAO,WAEpBzF,KAAKoa,cAAa,GAClBpa,KAAK8Z,cAAa,IAUpBjW,EAAKpC,UAAUya,WAAa,SAAS9W,GACnC,GAAIgR,GAAQhR,EAAKgR,OASjB,OAFApW,MAAK+V,YAAYK,EAAOhR,GAEjBgR,GASTvS,EAAKpC,UAAU0a,aAAe,SAAS/W,GACrC,GAAIpF,MAAQoF,EACV,OAAO,CAGT,IAAImM,GAASvR,KAAKuR,MAClB,IAAIA,EAEF,IAAK,GAAIjO,GAAI,EAAGmO,EAAOF,EAAOnQ,OAAYqQ,EAAJnO,EAAUA,IAC9C,GAAIiO,EAAOjO,GAAG6Y,aAAa/W,GACzB,OAAO,CAKb,QAAO,GAWTvB,EAAKpC,UAAU2a,MAAQ,SAAShX,EAAMyQ,GACpC,GAAIzQ,GAAQyQ,EAAZ,CAMA,GAAIzQ,EAAK+W,aAAanc,MACpB,KAAM,IAAIe,OAAM,6CAIdqE,GAAKsQ,QACPtQ,EAAKsQ,OAAOjR,YAAYW,EAI1B,IAAIgR,GAAQhR,EAAKgR,OACjBhR,GAAKiX,WAGDxG,EACF7V,KAAK4V,aAAaQ,EAAOP,GAGzB7V,KAAKwF,YAAY4Q,KAgBrBvS,EAAKpC,UAAUgD,YAAc,SAASW,GACpC,GAAIpF,KAAKuR,OAAQ,CACf,GAAIJ,GAAQnR,KAAKuR,OAAOjC,QAAQlK,EAEhC,IAAa,IAAT+L,EAAa,CACf/L,EAAKyV,aAGEzV,GAAKmW,kBACLnW,GAAKoW,WAEZ,IAAIc,GAActc,KAAKuR,OAAOH,OAAOD,EAAO,GAAG,EAI/C,OAFAnR,MAAK8Y,WAAWmC,eAAiB,IAE1BqB,GAIX,MAAOpY,SAUTL,EAAKpC,UAAU8a,QAAU,SAAUnX,GACjCpF,KAAKyE,YAAYW,IAOnBvB,EAAKpC,UAAU4U,WAAa,SAAUE,GACpC,GAAID,GAAUtW,KAAKgL,IAEnB,IAAIsL,GAAWC,EAAf,CAKA,GAAgB,UAAXA,GAAkC,QAAXA,GACZ,UAAXD,GAAkC,QAAXA,EAIvB,CAEH,GACIkG,GADAxX,EAAQhF,KAAK+D,IAAI6T,GAAK5X,KAAK+D,IAAI6T,GAAGpT,WAAaN,MAGjDsY,GADExc,KAAKmZ,SACEnZ,KAAK0a,YAGL1a,KAAKkG,QAEhB,IAAIyU,GAAU6B,GAAUA,EAAOhY,WAAcgY,EAAO5B,YAAc1W,MAGlElE,MAAK6a,OACL7a,KAAKqc,WAGLrc,KAAKgL,KAAOuL,EAGG,UAAXA,GACGvW,KAAKuR,SACRvR,KAAKuR,WAGPvR,KAAKuR,OAAO4I,QAAQ,SAAUzI,EAAOP,GACnCO,EAAM2K,iBACC3K,GAAMP,MACbO,EAAM2H,eAAgB,EACHnV,QAAfwN,EAAMxM,QACRwM,EAAMxM,MAAQ,OAIH,UAAXoR,GAAkC,QAAXA,KACzBtW,KAAKmZ,UAAW,IAGA,SAAX5C,GACFvW,KAAKuR,SACRvR,KAAKuR,WAGPvR,KAAKuR,OAAO4I,QAAQ,SAAUzI,EAAOP,GACnCO,EAAM2K,WACN3K,EAAM2H,eAAgB,EACtB3H,EAAMP,MAAQA,KAGD,UAAXmF,GAAkC,QAAXA,KACzBtW,KAAKmZ,UAAW,IAIlBnZ,KAAKmZ,UAAW,EAIdnU,IACE2V,EACF3V,EAAM4Q,aAAa5V,KAAKkG,SAAUyU,GAGlC3V,EAAMQ,YAAYxF,KAAKkG,WAG3BlG,KAAKkX,iBApELlX,MAAKgL,KAAOuL,GAuEC,QAAXA,GAAgC,UAAXA,KAER,UAAXA,EACFvW,KAAKmF,MAAQ4K,OAAO/P,KAAKmF,OAGzBnF,KAAKmF,MAAQnF,KAAKyc,YAAY1M,OAAO/P,KAAKmF,QAG5CnF,KAAK4F,SAGP5F,KAAK8Y,WAAWmC,eAAiB,MASnCpX,EAAKpC,UAAU2Y,aAAe,SAASsC,GAKrC,GAJI1c,KAAK+D,IAAIoB,OAAsB,SAAbnF,KAAKgL,MAAgC,UAAbhL,KAAKgL,OACjDhL,KAAKua,eAAiBtZ,EAAK+R,aAAahT,KAAK+D,IAAIoB,QAGxBjB,QAAvBlE,KAAKua,eACP,IAEE,GAAIpV,EACJ,IAAiB,UAAbnF,KAAKgL,KACP7F,EAAQnF,KAAK2c,cAAc3c,KAAKua,oBAE7B,CACH,GAAIqC,GAAM5c,KAAK2c,cAAc3c,KAAKua,eAClCpV,GAAQnF,KAAKyc,YAAYG,GAE3B,GAAIzX,IAAUnF,KAAKmF,MAAO,CACxB,GAAIkQ,GAAWrV,KAAKmF,KACpBnF,MAAKmF,MAAQA,EACbnF,KAAKmI,OAAO5B,UAAU,aACpBnB,KAAQpF,KACRqV,SAAYA,EACZC,SAAYnQ,EACZoS,aAAgBvX,KAAKmI,OAAOlE,UAC5BuT,aAAgBxX,KAAKmI,OAAOJ,kBAIlC,MAAO/E,GAGL,GAFAhD,KAAKmF,MAAQjB,OAETwY,KAAW,EACb,KAAM1Z,KAada,EAAKpC,UAAUma,gBAAkB,WAC/B,GAAIiB,GAAW7c,KAAK+D,IAAIoB,KACxB,IAAI0X,EAAU,CAGZ,GAAIC,GAAI9c,KAAKmF,MACT4X,EAAkB,QAAb/c,KAAKgL,KAAkB/J,EAAK+J,KAAK8R,GAAK9c,KAAKgL,KAChDmF,EAAc,UAAL4M,GAAiB9b,EAAKkP,MAAM2M,GACrCE,EAAQ,EAEVA,GADE7M,IAAUnQ,KAAKyZ,SAAStU,MAClB,GAEI,UAAL4X,EACC,QAEI,UAALA,EACC,MAEI,WAALA,EACC,aAED/c,KAAK8a,aACJ,GAEK,OAANgC,EACC,UAIA,QAEVD,EAAS/P,MAAMkQ,MAAQA,CAGvB,IAAIC,GAAiC,IAAtBlN,OAAO/P,KAAKmF,QAA6B,SAAbnF,KAAKgL,MAAgC,UAAbhL,KAAKgL,IAiBxE,IAhBIiS,EACFhc,EAAK8P,aAAa8L,EAAU,SAG5B5b,EAAKiQ,gBAAgB2L,EAAU,SAI7B1M,EACFlP,EAAK8P,aAAa8L,EAAU,OAG5B5b,EAAKiQ,gBAAgB2L,EAAU,OAIxB,SAALE,GAAqB,UAALA,EAAe,CACjC,GAAIG,GAAQld,KAAKuR,OAASvR,KAAKuR,OAAOnQ,OAAS,CAC/Cyb,GAASxS,MAAQrK,KAAKgL,KAAO,eAAiBkS,EAAQ,aAE1C,UAALH,GAAiB9b,EAAKkP,MAAM2M,GAC/B9c,KAAKyZ,SAAStU,QAChB0X,EAASxS,MAAQ,sDAInBwS,EAASxS,MAAQ,EAIfrK,MAAK6Y,kBACP5X,EAAK8P,aAAa8L,EAAU,oBAG5B5b,EAAKiQ,gBAAgB2L,EAAU,oBAE7B7c,KAAKwb,YACPva,EAAK8P,aAAa8L,EAAU,aAG5B5b,EAAKiQ,gBAAgB2L,EAAU,aAIjC5b,EAAKoQ,gBAAgBwL,KAWzBhZ,EAAKpC,UAAUga,gBAAkB,WAC/B,GAAI0B,GAAWnd,KAAK+D,IAAImB,KACxB,IAAIiY,EAAU,CAEZ,GAAIF,GAAiC,IAAtBlN,OAAO/P,KAAKkF,QAAoC,SAApBlF,KAAK0V,OAAO1K,IACnDiS,GACFhc,EAAK8P,aAAaoM,EAAU,SAG5Blc,EAAKiQ,gBAAgBiM,EAAU,SAI7Bnd,KAAK4Y,kBACP3X,EAAK8P,aAAaoM,EAAU,oBAG5Blc,EAAKiQ,gBAAgBiM,EAAU,oBAE7Bnd,KAAKub,YACPta,EAAK8P,aAAaoM,EAAU,aAG5Blc,EAAKiQ,gBAAgBiM,EAAU,aAIjClc,EAAKoQ,gBAAgB8L,KAUzBtZ,EAAKpC,UAAUqY,aAAe,SAAS4C,GAKrC,GAJI1c,KAAK+D,IAAImB,OAASlF,KAAKqZ,gBACzBrZ,KAAKsa,eAAiBrZ,EAAK+R,aAAahT,KAAK+D,IAAImB,QAGxBhB,QAAvBlE,KAAKsa,eACP,IACE,GAAIpV,GAAQlF,KAAK2c,cAAc3c,KAAKsa,eAEpC,IAAIpV,IAAUlF,KAAKkF,MAAO,CACxB,GAAIkY,GAAWpd,KAAKkF,KACpBlF,MAAKkF,MAAQA,EACblF,KAAKmI,OAAO5B,UAAU,aACpBnB,KAAQpF,KACRqV,SAAY+H,EACZ9H,SAAYpQ,EACZqS,aAAgBvX,KAAKmI,OAAOlE,UAC5BuT,aAAgBxX,KAAKmI,OAAOJ,kBAIlC,MAAO/E,GAGL,GAFAhD,KAAKkF,MAAQhB,OAETwY,KAAW,EACb,KAAM1Z,KASda,EAAKpC,UAAU4a,SAAW,WAKxBrc,KAAK+D,QAQPF,EAAKpC,UAAUyE,OAAS,WACtB,GAAInC,GAAM/D,KAAK+D,GACf,IAAIA,EAAI6T,GACN,MAAO7T,GAAI6T,EASb,IANA5X,KAAKwZ,qBAGLzV,EAAI6T,GAAK3O,SAASC,cAAc,MAChCnF,EAAI6T,GAAGxS,KAAOpF,KAEmB,SAA7BA,KAAKmI,OAAOtH,QAAQa,KAAiB,CACvC,GAAI2b,GAASpU,SAASC,cAAc,KACpC,IAAIlJ,KAAKyZ,SAASvU,OAEZlF,KAAK0V,OAAQ,CACf,GAAI4H,GAAUrU,SAASC,cAAc,SACrCnF,GAAIiY,KAAOsB,EACXA,EAAQnU,UAAY,WACpBmU,EAAQjT,MAAQ,6CAChBgT,EAAO7X,YAAY8X,GAGvBvZ,EAAI6T,GAAGpS,YAAY6X,EAGnB,IAAIE,GAAStU,SAASC,cAAc,MAChCnD,EAAOkD,SAASC,cAAc,SAClCnF,GAAIgC,KAAOA,EACXA,EAAKoD,UAAY,cACjBpD,EAAKsE,MAAQ,0CACbkT,EAAO/X,YAAYzB,EAAIgC,MACvBhC,EAAI6T,GAAGpS,YAAY+X,GAIrB,GAAIC,GAAUvU,SAASC,cAAc,KAOrC,OANAnF,GAAI6T,GAAGpS,YAAYgY,GACnBzZ,EAAI0Z,KAAOzd,KAAK0d,iBAChBF,EAAQhY,YAAYzB,EAAI0Z,MAExBzd,KAAK8Y,WAAWmC,eAAiB,IAE1BlX,EAAI6T,IAQb/T,EAAKpC,UAAUkc,aAAe,SAAU5U,GACtC,GAAI3D,GAAOpF,IACNA,MAAK4d,YACR5d,KAAK4d,UAAY3c,EAAKiJ,iBAAiBjB,SAAU,YAC7C,SAAUF,GACR3D,EAAKyY,QAAQ9U,MAIhB/I,KAAK8d,UACR9d,KAAK8d,QAAU7c,EAAKiJ,iBAAiBjB,SAAU,UAC3C,SAAUF,GACR3D,EAAK2Y,WAAWhV,MAIxB/I,KAAKmI,OAAOnE,YAAYiR,OACxBjV,KAAKgc,MACHgC,UAAa/U,SAASgV,KAAKnR,MAAMoR,OACjCzH,YAAezW,KAAK0V,OACpBiB,WAAc3W,KAAK0V,OAAOnE,OAAOjC,QAAQtP,MACzCme,OAAUpV,EAAMqV,MAChBC,MAASre,KAAKqa,YAEhBpR,SAASgV,KAAKnR,MAAMoR,OAAS,OAE7BnV,EAAMQ,kBAQR1F,EAAKpC,UAAUoc,QAAU,SAAU9U,GAEjC,GAGIuV,GAAQC,EAAQC,EAAQC,EAASC,EAAQC,EACzCC,EAAUC,EACVC,EAASC,EAASC,EAAUC,EAAYC,EAAYC,EALpDvY,EAASmC,EAAMqW,MACfjB,EAASpV,EAAMqV,MAKfiB,GAAQ,CAQZ,IAHAf,EAASte,KAAK+D,IAAI6T,GAClBkH,EAAU7d,EAAK8F,eAAeuX,GAC9BW,EAAaX,EAAOgB,aACPR,EAATlY,EAAkB,CAEpB2X,EAASD,CACT,GACEC,GAASA,EAAOgB,gBAChBX,EAAW/a,EAAKqH,kBAAkBqT,GAClCQ,EAAUR,EAAStd,EAAK8F,eAAewX,GAAU,QAE5CA,GAAmBQ,EAATnY,EAEbgY,KAAaA,EAASlJ,SACxBkJ,EAAW1a,QAGR0a,IAEHD,EAASL,EAAO9Z,WAAWsO,WAC3ByL,EAASI,EAASA,EAAO/D,YAAc1W,OACvC0a,EAAW/a,EAAKqH,kBAAkBqT,GAC9BK,GAAY5e,OACd4e,EAAW1a,SAIX0a,IAEFL,EAASK,EAAS7a,IAAI6T,GACtBmH,EAAUR,EAAStd,EAAK8F,eAAewX,GAAU,EAC7C3X,EAASmY,EAAUE,IACrBL,EAAW1a,SAIX0a,IACFA,EAASlJ,OAAOwF,WAAWlb,KAAM4e,GACjCS,GAAQ,OAOV,IAFAX,EAAU1e,KAAKmZ,UAAYnZ,KAAKkW,OAAUlW,KAAKkW,OAAOhQ,SAAWlG,KAAK+D,IAAI6T,GAC1E6G,EAAUC,EAASA,EAAO9D,YAAc1W,OAC3B,CACX8a,EAAW/d,EAAK8F,eAAe0X,GAC/BD,EAASC,CACT,GACEI,GAAWhb,EAAKqH,kBAAkBsT,GAC9BA,IACFU,EAAaV,EAAO5D,YAChB3Z,EAAK8F,eAAeyX,EAAO5D,aAAe,EAC9CuE,EAAaX,EAAUU,EAAaF,EAAY,EAEX,GAAjCH,EAASnJ,OAAOnE,OAAOnQ,QAAeyd,EAASnJ,OAAOnE,OAAO,IAAMvR,OAGrE8e,GAAW,KAKfN,EAASA,EAAO5D,kBAEX4D,GAAU5X,EAASkY,EAAUK,EAEpC,IAAIN,GAAYA,EAASnJ,OAAQ,CAE/B,GAAI8J,GAASrB,EAASne,KAAKgc,KAAKmC,OAC5BsB,EAAYlX,KAAKmX,MAAMF,EAAQ,GAAK,GACpCnB,EAAQre,KAAKgc,KAAKqC,MAAQoB,EAC1BE,EAAYd,EAASxE,UAIzB,KADAkE,EAASM,EAAS9a,IAAI6T,GAAG2H,gBACNlB,EAAZsB,GAAqBpB,GAAQ,CAElC,GADAK,EAAW/a,EAAKqH,kBAAkBqT,GAC9BK,GAAY5e,MAAQ4e,EAASgB,WAAW5f,WAGvC,CAAA,KAAI4e,YAAoBxD,IAgB3B,KAfA,IAAI7J,GAASqN,EAASlJ,OAAOnE,MAC7B,MAAIA,EAAOnQ,OAAS,GACE,GAAjBmQ,EAAOnQ,QAAemQ,EAAO,IAAMvR,MAStC,KAJA6e,GAAWhb,EAAKqH,kBAAkBqT,GAClCoB,EAAYd,EAASxE,WAUzBkE,EAASA,EAAOgB,gBAIdb,EAAO9D,aAAeiE,EAAS9a,IAAI6T,KACrCiH,EAASnJ,OAAOwF,WAAWlb,KAAM6e,GACjCQ,GAAQ,IAMZA,IAEFrf,KAAKgc,KAAKmC,OAASA,EACnBne,KAAKgc,KAAKqC,MAAQre,KAAKqa,YAIzBra,KAAKmI,OAAOxB,gBAAgBC,GAE5BmC,EAAMQ,kBAQR1F,EAAKpC,UAAUsc,WAAa,SAAUhV,GACpC,GAAI9D,IACFG,KAAQpF,KACRyW,YAAezW,KAAKgc,KAAKvF,YACzBE,WAAc3W,KAAKgc,KAAKrF,WACxBC,UAAa5W,KAAK0V,OAClBmB,SAAY7W,KAAK0V,OAAOnE,OAAOjC,QAAQtP,QAEpCiF,EAAOwR,aAAexR,EAAO2R,WAC7B3R,EAAO0R,YAAc1R,EAAO4R,WAE/B7W,KAAKmI,OAAO5B,UAAU,WAAYtB,GAGpCgE,SAASgV,KAAKnR,MAAMoR,OAASle,KAAKgc,KAAKgC,UACvChe,KAAKmI,OAAOnE,YAAYkR,eACjBlV,MAAKgc,KAERhc,KAAK4d,YACP3c,EAAKwT,oBAAoBxL,SAAU,YAAajJ,KAAK4d,iBAC9C5d,MAAK4d,WACV5d,KAAK8d,UACP7c,EAAKwT,oBAAoBxL,SAAU,UAAWjJ,KAAK8d,eAC5C9d,MAAK8d,SAId9d,KAAKmI,OAAOT,iBAEZqB,EAAMQ,kBASR1F,EAAKpC,UAAUme,WAAa,SAAUxa,GAEpC,IADA,GAAIya,GAAI7f,KAAK0V,OACNmK,GAAG,CACR,GAAIA,GAAKza,EACP,OAAO,CAETya,GAAIA,EAAEnK,OAGR,OAAO,GAQT7R,EAAKpC,UAAUqe,gBAAkB,WAC/B,MAAO7W,UAASC,cAAc,QAQhCrF,EAAKpC,UAAUoT,aAAe,SAAUD,GAClC5U,KAAK+D,IAAI6T,KACX5X,KAAK+D,IAAI6T,GAAGzO,UAAayL,EAAY,YAAc,GAE/C5U,KAAKkW,QACPlW,KAAKkW,OAAOrB,aAAaD,GAGvB5U,KAAKuR,QACPvR,KAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5BA,EAAMmD,aAAaD,OAW3B/Q,EAAKpC,UAAU+T,YAAc,SAAUrQ,GACrCnF,KAAKmF,MAAQA,EACbnF,KAAK8Y,aAOPjV,EAAKpC,UAAUkE,YAAc,SAAUT,GACrClF,KAAKkF,MAAQA,EACblF,KAAK8Y,aAaPjV,EAAKpC,UAAUqX,UAAY,SAAUjY,GAEnC,GAAIkf,GAAU/f,KAAK+D,IAAI0Z,IACnBsC,KACFA,EAAQjT,MAAMkT,WAA+B,GAAlBhgB,KAAKqa,WAAkB,KAIpD,IAAI8C,GAAWnd,KAAK+D,IAAImB,KACxB,IAAIiY,EAAU,CACRnd,KAAKqZ,eAEP8D,EAAS8C,gBAAkBjgB,KAAKyZ,SAASvU,MACzCiY,EAAStP,YAAa,EACtBsP,EAAShU,UAAY,SAIrBgU,EAAShU,UAAY,UAGvB,IAAIjE,EAEFA,GADgBhB,QAAdlE,KAAKmR,MACCnR,KAAKmR,MAEQjN,QAAdlE,KAAKkF,MACJlF,KAAKkF,MAENlF,KAAK8a,aACJ9a,KAAKgL,KAGL,GAEVmS,EAASjE,UAAYlZ,KAAKkgB,YAAYhb,GAIxC,GAAI2X,GAAW7c,KAAK+D,IAAIoB,KACxB,IAAI0X,EAAU,CACZ,GAAIK,GAAQld,KAAKuR,OAASvR,KAAKuR,OAAOnQ,OAAS,CAC9B,UAAbpB,KAAKgL,KACP6R,EAAS3D,UAAY,IAAMgE,EAAQ,IAEf,UAAbld,KAAKgL,KACZ6R,EAAS3D,UAAY,IAAMgE,EAAQ,IAGnCL,EAAS3D,UAAYlZ,KAAKkgB,YAAYlgB,KAAKmF,OAK/CnF,KAAKyb,kBACLzb,KAAK4b,kBAGD/a,GAAWA,EAAQoa,iBAAkB,GAEvCjb,KAAKmgB,oBAGHtf,GAAWA,EAAQyE,WAAY,GAE7BtF,KAAKuR,QACPvR,KAAKuR,OAAO4I,QAAQ,SAAUzI,GAC5BA,EAAMoH,UAAUjY,KAMlBb,KAAKkW,QACPlW,KAAKkW,OAAO4C,aAUhBjV,EAAKpC,UAAU0e,kBAAoB,WACjC,GAAItD,GAAW7c,KAAK+D,IAAIoB,MACpBoM,EAASvR,KAAKuR,MACdsL,IAAYtL,IACG,SAAbvR,KAAKgL,KACPuG,EAAO4I,QAAQ,SAAUzI,EAAOP,GAC9BO,EAAMP,MAAQA,CACd,IAAI8I,GAAavI,EAAM3N,IAAImB,KACvB+U,KACFA,EAAWf,UAAY/H,KAIP,UAAbnR,KAAKgL,MACZuG,EAAO4I,QAAQ,SAAUzI,GACJxN,QAAfwN,EAAMP,cACDO,GAAMP,MAEMjN,QAAfwN,EAAMxM,QACRwM,EAAMxM,MAAQ,SAY1BrB,EAAKpC,UAAU2e,gBAAkB,WAC/B,GAAIvD,EA+BJ,OA7BiB,SAAb7c,KAAKgL,MACP6R,EAAW5T,SAASC,cAAc,OAClC2T,EAAS1T,UAAY,WACrB0T,EAAS3D,UAAY,SAED,UAAblZ,KAAKgL,MACZ6R,EAAW5T,SAASC,cAAc,OAClC2T,EAAS1T,UAAY,WACrB0T,EAAS3D,UAAY,UAGhBlZ,KAAKyZ,SAAStU,OAASlE,EAAKkP,MAAMnQ,KAAKmF,QAE1C0X,EAAW5T,SAASC,cAAc,KAClC2T,EAAS1T,UAAY,QACrB0T,EAASpP,KAAOzN,KAAKmF,MACrB0X,EAASxT,OAAS,SAClBwT,EAAS3D,UAAYlZ,KAAKkgB,YAAYlgB,KAAKmF,SAI3C0X,EAAW5T,SAASC,cAAc,OAClC2T,EAASoD,gBAAkBjgB,KAAKyZ,SAAStU,MACzC0X,EAAShP,YAAa,EACtBgP,EAAS1T,UAAY,QACrB0T,EAAS3D,UAAYlZ,KAAKkgB,YAAYlgB,KAAKmF,QAIxC0X,GAQThZ,EAAKpC,UAAU4e,uBAAyB,WAEtC,GAAI9a,GAAS0D,SAASC,cAAc,SAYpC,OAXIlJ,MAAK8a,cACPvV,EAAO4D,UAAYnJ,KAAKmZ,SAAW,WAAa,YAChD5T,EAAO8E,MACH,wGAIJ9E,EAAO4D,UAAY,YACnB5D,EAAO8E,MAAQ,IAGV9E,GAST1B,EAAKpC,UAAUic,eAAiB,WAC9B,GAAI3Z,GAAM/D,KAAK+D,IACXgc,EAAU9W,SAASC,cAAc,SACjCjD,EAAQgD,SAASC,cAAc,QACnC6W,GAAQjT,MAAMwT,eAAiB,WAC/BP,EAAQ5W,UAAY,SACpB4W,EAAQva,YAAYS,EACpB,IAAI2R,GAAK3O,SAASC,cAAc,KAChCjD,GAAMT,YAAYoS,EAGlB,IAAI2I,GAAWtX,SAASC,cAAc,KACtCqX,GAASpX,UAAY,OACrByO,EAAGpS,YAAY+a,GACfxc,EAAIwB,OAASvF,KAAKqgB,yBAClBE,EAAS/a,YAAYzB,EAAIwB,QACzBxB,EAAIwc,SAAWA,CAGf,IAAI/C,GAAUvU,SAASC,cAAc,KACrCsU,GAAQrU,UAAY,OACpByO,EAAGpS,YAAYgY,GACfzZ,EAAImB,MAAQlF,KAAK8f,kBACjBtC,EAAQhY,YAAYzB,EAAImB,OACxBnB,EAAIyZ,QAAUA,CAGd,IAAIgD,GAAcvX,SAASC,cAAc,KACzCsX,GAAYrX,UAAY,OACxByO,EAAGpS,YAAYgb,GACE,UAAbxgB,KAAKgL,MAAiC,SAAbhL,KAAKgL,OAChCwV,EAAYhb,YAAYyD,SAASuE,eAAe,MAChDgT,EAAYrX,UAAY,aAE1BpF,EAAIyc,YAAcA,CAGlB,IAAIC,GAAUxX,SAASC,cAAc,KAOrC,OANAuX,GAAQtX,UAAY,OACpByO,EAAGpS,YAAYib,GACf1c,EAAIoB,MAAQnF,KAAKogB,kBACjBK,EAAQjb,YAAYzB,EAAIoB,OACxBpB,EAAI0c,QAAUA,EAEPV,GAOTlc,EAAKpC,UAAUqH,QAAU,SAAUC,GACjC,GAIInE,GAJAoG,EAAOjC,EAAMiC,KACb3B,EAASN,EAAMM,QAAUN,EAAM2X,WAC/B3c,EAAM/D,KAAK+D,IACXqB,EAAOpF,KAEP2gB,EAAa3gB,KAAK8a,YAmBtB,KAfIzR,GAAUtF,EAAIiY,MAAQ3S,GAAUtF,EAAIgC,QAC1B,aAARiF,EACFhL,KAAKmI,OAAOnE,YAAY4Q,UAAU5U,MAEnB,YAARgL,GACPhL,KAAKmI,OAAOnE,YAAY+Q,eAKhB,aAAR/J,GAAuB3B,GAAUtF,EAAIiY,MACvChc,KAAK2d,aAAa5U,GAIR,SAARiC,GAAmB3B,GAAUtF,EAAIgC,KAAM,CACzC,GAAI/B,GAAcoB,EAAK+C,OAAOnE,WAC9BA,GAAY4Q,UAAUxP,GACtBpB,EAAYiR,OACZhU,EAAK8P,aAAahN,EAAIgC,KAAM,YAC5B/F,KAAK4gB,gBAAgB7c,EAAIgC,KAAM,WAC7B9E,EAAKiQ,gBAAgBnN,EAAIgC,KAAM,YAC/B/B,EAAYkR,SACZlR,EAAY+Q,gBAKhB,GAAY,SAAR/J,GAAmB3B,GAAUtF,EAAIwB,QAC/Bob,EAAY,CACd,GAAIrb,GAAUyD,EAAMuC,OACpBtL,MAAK6gB,UAAUvb,GAKnB,GAAIuX,GAAW9Y,EAAIoB,KACnB,IAAIkE,GAAUwT,EAEZ,OAAQ7R,GACN,IAAK,QACHpG,EAAY5E,IACZ,MAEF,KAAK,OACL,IAAK,SACHA,KAAKoa,cAAa,GAClBpa,KAAK4b,kBACD5b,KAAKmF,QACP0X,EAAS3D,UAAYlZ,KAAKkgB,YAAYlgB,KAAKmF,OAE7C,MAEF,KAAK,QACHnF,KAAKoa,cAAa,GAClBpa,KAAK4b,iBACL,MAEF,KAAK,UACL,IAAK,YACH5b,KAAKmI,OAAOlE,UAAYjE,KAAKmI,OAAOJ,cACpC,MAEF,KAAK,SACCgB,EAAMuC,UAAYtL,KAAKyZ,SAAStU,QAC9BlE,EAAKkP,MAAMnQ,KAAKmF,QAClBuI,OAAOC,KAAK3N,KAAKmF,MAAO,SAG5B,MAEF,KAAK,QACHnF,KAAKoa,cAAa,GAClBpa,KAAK4b,iBACL,MAEF,KAAK,MACL,IAAK,QACH/S,WAAW,WACTzD,EAAKgV,cAAa,GAClBhV,EAAKwW,mBACJ,GAMT,GAAIuB,GAAWpZ,EAAImB,KACnB,IAAImE,GAAU8T,EACZ,OAAQnS,GACN,IAAK,QACHpG,EAAY5E,IACZ,MAEF,KAAK,OACL,IAAK,SACHA,KAAK8Z,cAAa,GAClB9Z,KAAKyb,kBACDzb,KAAKkF,QACPiY,EAASjE,UAAYlZ,KAAKkgB,YAAYlgB,KAAKkF,OAE7C,MAEF,KAAK,QACHlF,KAAK8Z,cAAa,GAClB9Z,KAAKyb,iBACL,MAEF,KAAK,UACL,IAAK,YACHzb,KAAKmI,OAAOlE,UAAYjE,KAAKmI,OAAOJ,cACpC,MAEF,KAAK,QACH/H,KAAK8Z,cAAa,GAClB9Z,KAAKyb,iBACL,MAEF,KAAK,MACL,IAAK,QACH5S,WAAW,WACTzD,EAAK0U,cAAa,GAClB1U,EAAKqW,mBACJ,GAOT,GAAIsE,GAAUhc,EAAI0Z,IAClB,IAAIpU,GAAU0W,EAAQvb,WACpB,OAAQwG,GACN,IAAK,QACH,GAAI2F,GAAyBzM,QAAjB6E,EAAM+X,QACb/X,EAAM+X,QAAkC,IAAvB9gB,KAAKqa,WAAa,GACnCtR,EAAMqV,MAAQnd,EAAKsP,gBAAgBxM,EAAIyc,YACxC7P,IAAQgQ,EAENxD,IACFlc,EAAK+Q,wBAAwBmL,GAC7BA,EAASvX,SAIPiX,IACF5b,EAAK+Q,wBAAwB6K,GAC7BA,EAASjX,SAMnB,GAAKyD,GAAUtF,EAAIwc,WAAaI,GAAetX,GAAUtF,EAAIyZ,SACzDnU,GAAUtF,EAAIyc,YAChB,OAAQxV,GACN,IAAK,QACCmS,IACFlc,EAAK+Q,wBAAwBmL,GAC7BA,EAASvX,SAML,WAARoF,GACFhL,KAAK+gB,UAAUhY,IAQnBlF,EAAKpC,UAAUsf,UAAY,SAAUhY,GACnC,GAMI2P,GAAUsI,EAAUC,EAASC,EAN7B/V,EAASpC,EAAMqC,OAASrC,EAAMsC,QAC9BhC,EAASN,EAAMM,QAAUN,EAAM2X,WAC/BpV,EAAUvC,EAAMuC,QAChBC,EAAWxC,EAAMwC,SACjB4V,EAASpY,EAAMoY,OACf3V,GAAU,EAEViO,EAAwC,SAA7BzZ,KAAKmI,OAAOtH,QAAQa,IAGnC,IAAc,IAAVyJ,GACF,GAAI9B,GAAUrJ,KAAK+D,IAAIoB,QAChBnF,KAAKyZ,SAAStU,OAAS4D,EAAMuC,UAC5BrK,EAAKkP,MAAMnQ,KAAKmF,SAClBuI,OAAOC,KAAK3N,KAAKmF,MAAO,UACxBqG,GAAU,OAIX,IAAInC,GAAUrJ,KAAK+D,IAAIwB,OAAQ,CAClC,GAAIob,GAAa3gB,KAAK8a,YACtB,IAAI6F,EAAY,CACd,GAAIrb,GAAUyD,EAAMuC,OACpBtL,MAAK6gB,UAAUvb,GACf+D,EAAOzD,QACP4F,GAAU,QAIX,IAAc,IAAVL,EACHG,GAAWmO,IACbzZ,KAAKohB,eACL5V,GAAU,OAGT,IAAc,IAAVL,EACHG,IACFtL,KAAK6gB,UAAUtV,GACflC,EAAOzD,QACP4F,GAAU,OAGT,IAAc,IAAVL,GAAgBsO,EACnBnO,IACFtL,KAAK4gB,gBAAgBvX,GACrBmC,GAAU,OAGT,IAAc,IAAVL,GAAgBsO,EACnBnO,IACFtL,KAAKqhB,YACL7V,GAAU,OAGT,IAAc,IAAVL,GAAgBsO,EACnBnO,IAAYC,GACdvL,KAAKshB,kBACL9V,GAAU,GAEHF,GAAWC,IAClBvL,KAAKuhB,iBACL/V,GAAU,OAGT,IAAc,IAAVL,GACP,GAAIgW,EAAQ,CAEV,GAAIK,GAAWxhB,KAAKyhB,WAChBD,IACFA,EAAS5b,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,IAE3DmC,GAAU,OAGT,IAAc,IAAVL,GACP,GAAIgW,EAAQ,CAEV,GAAIQ,GAAY3hB,KAAK4hB,YACjBD,IACFA,EAAU/b,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,IAE5DmC,GAAU,OAGT,IAAc,IAAVL,GACP,GAAIgW,IAAW5V,EAAU,CAEvB,GAAIsW,GAAc7hB,KAAK8hB,iBAAiBzY,EACpCwY,IACF7hB,KAAK4F,MAAM5F,KAAK0hB,gBAAgBG,IAElCrW,GAAU,MAEP,IAAI2V,GAAU5V,GAAYkO,EAAU,CACvC,GAAIzZ,KAAKmZ,SAAU,CACjB,GAAI4I,GAAY/hB,KAAK0a,WACrBuG,GAAUc,EAAYA,EAAUnH,YAAc1W,WAE3C,CACH,GAAIH,GAAM/D,KAAKkG,QACf+a,GAAUld,EAAI6W,YAEZqG,IACFD,EAAWnd,EAAKqH,kBAAkB+V,GAClCC,EAAWD,EAAQrG,YACnBoH,EAAYne,EAAKqH,kBAAkBgW,GAC/BF,GAAYA,YAAoB5F,IACD,GAA7Bpb,KAAK0V,OAAOnE,OAAOnQ,QACrB4gB,GAAaA,EAAUtM,SACzBsM,EAAUtM,OAAOwF,WAAWlb,KAAMgiB,GAClChiB,KAAK4F,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,WAKxD,IAAc,IAAV8B,EACHgW,IAAW5V,GAEbmN,EAAW1Y,KAAKiiB,gBACZvJ,GACFA,EAAS9S,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,IAE3DmC,GAAU,GAEH2V,GAAU5V,IAEjBmN,EAAW1Y,KAAKiiB,gBACZvJ,GAAYA,EAAShD,SACvBgD,EAAShD,OAAOwF,WAAWlb,KAAM0Y,GACjC1Y,KAAK4F,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,KAEvDmC,GAAU,OAGT,IAAc,IAAVL,GACP,GAAIgW,IAAW5V,EAAU,CAEvB,GAAI2W,GAAcliB,KAAKmiB,aAAa9Y,EAChC6Y,IACFliB,KAAK4F,MAAM5F,KAAK0hB,gBAAgBQ,IAElC1W,GAAU,MAEP,IAAI2V,GAAU5V,EAAU,CAC3BxH,EAAM/D,KAAKkG,QACX,IAAIkc,GAAUre,EAAIwb,eACd6C,KACF1J,EAAW7U,EAAKqH,kBAAkBkX,GAC9B1J,GAAYA,EAAShD,QACpBgD,YAAoB0C,KACjB1C,EAAS2J,cACf3J,EAAShD,OAAOwF,WAAWlb,KAAM0Y,GACjC1Y,KAAK4F,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,WAKxD,IAAc,IAAV8B,EACP,GAAIgW,IAAW5V,EAEbyV,EAAWhhB,KAAKsiB,YACZtB,GACFA,EAASpb,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,IAE3DmC,GAAU,MAEP,IAAI2V,GAAU5V,GAAYkO,EAAU,CAGrCuH,EADEhhB,KAAKmZ,SACInZ,KAAKkW,OAASlW,KAAKkW,OAAOoM,YAAcpe,OAGxClE,KAAKsiB,YAElBrB,EAAUD,EAAWA,EAAS9a,SAAWhC,OAEvCgd,EAD+B,GAA7BlhB,KAAK0V,OAAOnE,OAAOnQ,OACV6f,EAGAA,EAAUA,EAAQrG,YAAc1W,MAE7C,IAAI8d,GAAYne,EAAKqH,kBAAkBgW,EACnCc,IAAaA,EAAUtM,SACzBsM,EAAUtM,OAAOwF,WAAWlb,KAAMgiB,GAClChiB,KAAK4F,MAAM/B,EAAKiY,cAAgB9b,KAAK0hB,gBAAgBrY,KAEvDmC,GAAU,EAIVA,IACFzC,EAAMQ,iBACNR,EAAM8C,oBASVhI,EAAKpC,UAAUof,UAAY,SAAUvb,GACnC,GAAIA,EAAS,CAEX,GAAIN,GAAQhF,KAAK+D,IAAI6T,GAAGpT,WACpBD,EAAQS,EAAMR,WACd6C,EAAY9C,EAAM8C,SACtB9C,GAAME,YAAYO,GAGhBhF,KAAKmZ,SACPnZ,KAAKgG,SAASV,GAGdtF,KAAKuF,OAAOD,GAGVA,IAEFf,EAAMiB,YAAYR,GAClBT,EAAM8C,UAAYA,IAQtBxD,EAAKpC,UAAU4f,UAAY,WACzBrhB,KAAKmI,OAAOnE,YAAY+Q,aACxB,IAAIxD,GAASvR,KAAK0V,OAAOnE,OACrBJ,EAAQI,EAAOjC,QAAQtP,MAGvBuX,EAAevX,KAAKmI,OAAOJ,cAC3BwJ,GAAOJ,EAAQ,GACjBI,EAAOJ,EAAQ,GAAGvL,QAEX2L,EAAOJ,EAAQ,GACtBI,EAAOJ,EAAQ,GAAGvL,QAGlB5F,KAAK0V,OAAO9P,OAEd,IAAI4R,GAAexX,KAAKmI,OAAOJ,cAG/B/H,MAAK0V,OAAO6G,QAAQvc,MAGpBA,KAAKmI,OAAO5B,UAAU,cACpBnB,KAAMpF,KACN0V,OAAQ1V,KAAK0V,OACbvE,MAAOA,EACPoG,aAAcA,EACdC,aAAcA,KAQlB3T,EAAKpC,UAAU2f,aAAe,WAC5B,GAAI7J,GAAevX,KAAKmI,OAAOJ,eAC3BqO,EAAQpW,KAAK0V,OAAOwG,WAAWlc,KACnCoW,GAAMxQ,OACN,IAAI4R,GAAexX,KAAKmI,OAAOJ,cAE/B/H,MAAKmI,OAAO5B,UAAU,iBACpBnB,KAAMpF,KACNoW,MAAOA,EACPV,OAAQ1V,KAAK0V,OACb6B,aAAcA,EACdC,aAAcA,KAWlB3T,EAAKpC,UAAU6f,gBAAkB,SAAUpc,EAAOC,EAAO6F,GACvD,GAAIuM,GAAevX,KAAKmI,OAAOJ,eAE3Bwa,EAAU,GAAI1e,GAAK7D,KAAKmI,QAC1BjD,MAAiBhB,QAATgB,EAAsBA,EAAQ,GACtCC,MAAiBjB,QAATiB,EAAsBA,EAAQ,GACtC6F,KAAMA,GAERuX,GAAQhd,QAAO,GACfvF,KAAK0V,OAAOE,aAAa2M,EAASviB,MAClCA,KAAKmI,OAAOnE,YAAY+Q,cACxBwN,EAAQ3c,MAAM,QACd,IAAI4R,GAAexX,KAAKmI,OAAOJ,cAE/B/H,MAAKmI,OAAO5B,UAAU,oBACpBnB,KAAMmd,EACN1M,WAAY7V,KACZ0V,OAAQ1V,KAAK0V,OACb6B,aAAcA,EACdC,aAAcA,KAWlB3T,EAAKpC,UAAU8f,eAAiB,SAAUrc,EAAOC,EAAO6F,GACtD,GAAIuM,GAAevX,KAAKmI,OAAOJ,eAE3Bwa,EAAU,GAAI1e,GAAK7D,KAAKmI,QAC1BjD,MAAiBhB,QAATgB,EAAsBA,EAAQ,GACtCC,MAAiBjB,QAATiB,EAAsBA,EAAQ,GACtC6F,KAAMA,GAERuX,GAAQhd,QAAO,GACfvF,KAAK0V,OAAOK,YAAYwM,EAASviB,MACjCA,KAAKmI,OAAOnE,YAAY+Q,cACxBwN,EAAQ3c,MAAM,QACd,IAAI4R,GAAexX,KAAKmI,OAAOJ,cAE/B/H,MAAKmI,OAAO5B,UAAU,mBACpBnB,KAAMmd,EACNvM,UAAWhW,KACX0V,OAAQ1V,KAAK0V,OACb6B,aAAcA,EACdC,aAAcA,KAWlB3T,EAAKpC,UAAU+gB,UAAY,SAAUtd,EAAOC,EAAO6F,GACjD,GAAIuM,GAAevX,KAAKmI,OAAOJ,eAE3Bwa,EAAU,GAAI1e,GAAK7D,KAAKmI,QAC1BjD,MAAiBhB,QAATgB,EAAsBA,EAAQ,GACtCC,MAAiBjB,QAATiB,EAAsBA,EAAQ,GACtC6F,KAAMA,GAERuX,GAAQhd,QAAO,GACfvF,KAAK0V,OAAOlQ,YAAY+c,GACxBviB,KAAKmI,OAAOnE,YAAY+Q,cACxBwN,EAAQ3c,MAAM,QACd,IAAI4R,GAAexX,KAAKmI,OAAOJ,cAE/B/H,MAAKmI,OAAO5B,UAAU,cACpBnB,KAAMmd,EACN7M,OAAQ1V,KAAK0V,OACb6B,aAAcA,EACdC,aAAcA,KASlB3T,EAAKpC,UAAUghB,cAAgB,SAAUlM,GACvC,GAAID,GAAUtW,KAAKgL,IACnB,IAAIuL,GAAWD,EAAS,CACtB,GAAIiB,GAAevX,KAAKmI,OAAOJ,cAC/B/H,MAAKqW,WAAWE,EAChB,IAAIiB,GAAexX,KAAKmI,OAAOJ,cAE/B/H,MAAKmI,OAAO5B,UAAU,cACpBnB,KAAMpF,KACNsW,QAASA,EACTC,QAASA,EACTgB,aAAcA,EACdC,aAAcA,MAWpB3T,EAAKpC,UAAUihB,QAAU,SAAUC,GACjC,GAAI3iB,KAAK8a,aAAc,CACrB,GAAI8H,GAAsB,QAAbD,EAAuB,GAAK,EACrCpf,EAAqB,SAAbvD,KAAKgL,KAAmB,QAAS,OAC7ChL,MAAK+W,YAEL,IAAIE,GAAYjX,KAAKuR,OACjByF,EAAUhX,KAAK8W,IAGnB9W,MAAKuR,OAASvR,KAAKuR,OAAOoK,SAG1B3b,KAAKuR,OAAOuF,KAAK,SAAUrH,EAAGC,GAC5B,MAAID,GAAElM,GAAQmM,EAAEnM,GAAcqf,EAC1BnT,EAAElM,GAAQmM,EAAEnM,IAAeqf,EACxB,IAET5iB,KAAK8W,KAAiB,GAAT8L,EAAc,MAAQ,OAEnC5iB,KAAKmI,OAAO5B,UAAU,QACpBnB,KAAMpF,KACNiX,UAAWA,EACXD,QAASA,EACTI,UAAWpX,KAAKuR,OAChB4F,QAASnX,KAAK8W,OAGhB9W,KAAKkX,eAQTrT,EAAKpC,UAAUiZ,UAAY,WAKzB,MAJK1a,MAAKkW,SACRlW,KAAKkW,OAAS,GAAIkF,GAAWpb,KAAKmI,QAClCnI,KAAKkW,OAAO0D,UAAU5Z,OAEjBA,KAAKkW,OAAOhQ,UASrBrC,EAAKqH,kBAAoB,SAAU7B,GACjC,KAAOA,GAAQ,CACb,GAAIA,EAAOjE,KACT,MAAOiE,GAAOjE,IAEhBiE,GAASA,EAAO7E,WAGlB,MAAON,SAQTL,EAAKpC,UAAUwgB,cAAgB,WAC7B,GAAIvJ,GAAW,KACX3U,EAAM/D,KAAKkG,QACf,IAAInC,GAAOA,EAAIS,WAAY,CAEzB,GAAI4d,GAAUre,CACd,GACEqe,GAAUA,EAAQ7C,gBAClB7G,EAAW7U,EAAKqH,kBAAkBkX,SAE7BA,GAAY1J,YAAoB0C,KAAe1C,EAAS2J,aAEjE,MAAO3J,IAQT7U,EAAKpC,UAAU6gB,UAAY,WACzB,GAAItB,GAAW,KACXjd,EAAM/D,KAAKkG,QACf,IAAInC,GAAOA,EAAIS,WAAY,CAEzB,GAAIyc,GAAUld,CACd,GACEkd,GAAUA,EAAQrG,YAClBoG,EAAWnd,EAAKqH,kBAAkB+V,SAE7BA,GAAYD,YAAoB5F,KAAe4F,EAASqB,aAGjE,MAAOrB,IAQTnd,EAAKpC,UAAUmgB,WAAa,WAC1B,GAAID,GAAY,KACZ5d,EAAM/D,KAAKkG,QACf,IAAInC,GAAOA,EAAIS,WAAY,CACzB,GAAIqe,GAAW9e,EAAIS,WAAWsO,UAC9B6O,GAAY9d,EAAKqH,kBAAkB2X,GAGrC,MAAOlB,IAQT9d,EAAKpC,UAAUggB,UAAY,WACzB,GAAID,GAAW,KACXzd,EAAM/D,KAAKkG,QACf,IAAInC,GAAOA,EAAIS,WAAY,CACzB,GAAIse,GAAU/e,EAAIS,WAAWue,SAE7B,KADAvB,EAAY3d,EAAKqH,kBAAkB4X,GAC5BA,GAAYtB,YAAoBpG,KAAeoG,EAASa,aAC7DS,EAAUA,EAAQvD,gBAClBiC,EAAY3d,EAAKqH,kBAAkB4X,GAGvC,MAAOtB,IAST3d,EAAKpC,UAAUqgB,iBAAmB,SAAUtR,GAC1C,GAAIzM,GAAM/D,KAAK+D,GAEf,QAAQyM,GACN,IAAKzM,GAAIoB,MACP,GAAInF,KAAKqZ,cACP,MAAOtV,GAAImB,KAGf,KAAKnB,GAAImB,MACP,GAAIlF,KAAK8a,aACP,MAAO/W,GAAIwB,MAGf,KAAKxB,GAAIwB,OACP,MAAOxB,GAAIgC,IACb,KAAKhC,GAAIgC,KACP,GAAIhC,EAAIiY,KACN,MAAOjY,GAAIiY,IAGf,SACE,MAAO,QAUbnY,EAAKpC,UAAU0gB,aAAe,SAAU3R,GACtC,GAAIzM,GAAM/D,KAAK+D,GAEf,QAAQyM,GACN,IAAKzM,GAAIiY,KACP,MAAOjY,GAAIgC,IACb,KAAKhC,GAAIgC,KACP,GAAI/F,KAAK8a,aACP,MAAO/W,GAAIwB,MAGf,KAAKxB,GAAIwB,OACP,GAAIvF,KAAKqZ,cACP,MAAOtV,GAAImB,KAGf,KAAKnB,GAAImB,MACP,IAAKlF,KAAK8a,aACR,MAAO/W,GAAIoB,KAEf,SACE,MAAO,QAYbtB,EAAKpC,UAAUigB,gBAAkB,SAAUzO,GACzC,GAAIlP,GAAM/D,KAAK+D,GACf,KAAK,GAAIzB,KAAQyB,GACf,GAAIA,EAAIY,eAAerC,IACjByB,EAAIzB,IAAS2Q,EACf,MAAO3Q,EAIb,OAAO,OASTuB,EAAKpC,UAAUqZ,WAAa,WAC1B,MAAoB,SAAb9a,KAAKgL,MAAgC,UAAbhL,KAAKgL,MAItCnH,EAAKmf,aACHC,KAAQ,8HAGRnT,OAAU,+EAEVoT,MAAS,yEAETC,OAAU,oGAWZtf,EAAKpC,UAAUmf,gBAAkB,SAAUwC,EAAQC,GACjD,GAAIje,GAAOpF,KACPsjB,EAASzf,EAAKmf,YACdO,IAgDJ,IA9CIvjB,KAAKyZ,SAAStU,OAChBoe,EAAMvU,MACJ7I,KAAM,OACNkE,MAAO,gCACPlB,UAAW,QAAUnJ,KAAKgL,KAC1BwY,UAEIrd,KAAM,OACNgD,UAAW,aACO,QAAbnJ,KAAKgL,KAAiB,YAAc,IACzCX,MAAOiZ,EAAOL,KACdQ,MAAO,WACLre,EAAKqd,cAAc,WAIrBtc,KAAM,QACNgD,UAAW,cACO,SAAbnJ,KAAKgL,KAAkB,YAAc,IAC1CX,MAAOiZ,EAAOJ,MACdO,MAAO,WACLre,EAAKqd,cAAc,YAIrBtc,KAAM,SACNgD,UAAW,eACO,UAAbnJ,KAAKgL,KAAmB,YAAc,IAC3CX,MAAOiZ,EAAOxT,OACd2T,MAAO,WACLre,EAAKqd,cAAc,aAIrBtc,KAAM,SACNgD,UAAW,eACO,UAAbnJ,KAAKgL,KAAmB,YAAc,IAC3CX,MAAOiZ,EAAOH,OACdM,MAAO,WACLre,EAAKqd,cAAc,eAOzBziB,KAAK8a,aAAc,CACrB,GAAI6H,GAA2B,OAAb3iB,KAAK8W,KAAiB,OAAQ,KAChDyM,GAAMvU,MACJ7I,KAAM,OACNkE,MAAO,2BAA6BrK,KAAKgL,KACzC7B,UAAW,QAAUwZ,EACrBc,MAAO,WACLre,EAAKsd,QAAQC,IAEfa,UAEIrd,KAAM,YACNgD,UAAW,WACXkB,MAAO,2BAA6BrK,KAAKgL,KAAO,sBAChDyY,MAAO,WACLre,EAAKsd,QAAQ,UAIfvc,KAAM,aACNgD,UAAW,YACXkB,MAAO,2BAA6BrK,KAAKgL,KAAM,uBAC/CyY,MAAO,WACLre,EAAKsd,QAAQ,aAOvB,GAAI1iB,KAAK0V,QAAU1V,KAAK0V,OAAOoF,aAAc,CACvCyI,EAAMniB,QAERmiB,EAAMvU,MACJhE,KAAQ,aAKZ,IAAIuG,GAASnM,EAAKsQ,OAAOnE,MACrBnM,IAAQmM,EAAOA,EAAOnQ,OAAS,IACjCmiB,EAAMvU,MACJ7I,KAAM,SACNkE,MAAO,wEACPqZ,aAAc,8CACdva,UAAW,SACXsa,MAAO,WACLre,EAAKod,UAAU,GAAI,GAAI,SAEzBgB,UAEIrd,KAAM,OACNgD,UAAW,YACXkB,MAAOiZ,EAAOL,KACdQ,MAAO,WACLre,EAAKod,UAAU,GAAI,GAAI,WAIzBrc,KAAM,QACNgD,UAAW,aACXkB,MAAOiZ,EAAOJ,MACdO,MAAO,WACLre,EAAKod,UAAU,UAIjBrc,KAAM,SACNgD,UAAW,cACXkB,MAAOiZ,EAAOxT,OACd2T,MAAO,WACLre,EAAKod,UAAU,UAIjBrc,KAAM,SACNgD,UAAW,cACXkB,MAAOiZ,EAAOH,OACdM,MAAO,WACLre,EAAKod,UAAU,GAAI,GAAI,eAQjCe,EAAMvU,MACJ7I,KAAM,SACNkE,MAAO,mEACPqZ,aAAc,8CACdva,UAAW,SACXsa,MAAO,WACLre,EAAKkc,gBAAgB,GAAI,GAAI,SAE/BkC,UAEIrd,KAAM,OACNgD,UAAW,YACXkB,MAAOiZ,EAAOL,KACdQ,MAAO,WACLre,EAAKkc,gBAAgB,GAAI,GAAI,WAI/Bnb,KAAM,QACNgD,UAAW,aACXkB,MAAOiZ,EAAOJ,MACdO,MAAO,WACLre,EAAKkc,gBAAgB,UAIvBnb,KAAM,SACNgD,UAAW,cACXkB,MAAOiZ,EAAOxT,OACd2T,MAAO,WACLre,EAAKkc,gBAAgB,UAIvBnb,KAAM,SACNgD,UAAW,cACXkB,MAAOiZ,EAAOH,OACdM,MAAO,WACLre,EAAKkc,gBAAgB,GAAI,GAAI,eAMjCthB,KAAKyZ,SAASvU,QAEhBqe,EAAMvU,MACJ7I,KAAM,YACNkE,MAAO,gCACPlB,UAAW,YACXsa,MAAO,WACLre,EAAKgc,kBAKTmC,EAAMvU,MACJ7I,KAAM,SACNkE,MAAO,+BACPlB,UAAW,SACXsa,MAAO,WACLre,EAAKic,gBAMb,GAAItb,GAAO,GAAIuT,GAAYiK,GAAQI,MAAON,GAC1Ctd,GAAK6d,KAAKR,IASZvf,EAAKpC,UAAUuY,SAAW,SAAS7U,GACjC,MAAIA,aAAiB0e,OACZ,QAEL1e,YAAiBkL,QACZ,SAEY,gBAAX,IAA0D,gBAA5BrQ,MAAKyc,YAAYtX,GAChD,SAGF,QAUTtB,EAAKpC,UAAUgb,YAAc,SAASG,GACpC,GAAIkH,GAAQlH,EAAItB,cACZyI,EAAM3X,OAAOwQ,GACboH,EAAW9P,WAAW0I,EAE1B,OAAW,IAAPA,EACK,GAES,QAATkH,EACA,KAES,QAATA,GACA,EAES,SAATA,GACA,EAECG,MAAMF,IAASE,MAAMD,GAItBpH,EAHAmH,GAaXlgB,EAAKpC,UAAUye,YAAc,SAAU/Z,GACrC,GAAI+d,GAAcnU,OAAO5J,GACpBge,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,MAAO,WACfA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UAEfrjB,EAAOqB,KAAKC,UAAU8hB,EAC1B,OAAOpjB,GAAKsjB,UAAU,EAAGtjB,EAAKM,OAAS,IASzCyC,EAAKpC,UAAUkb,cAAgB,SAAU0H,GACvC,GAAIvjB,GAAO,IAAMd,KAAKskB,YAAYD,GAAe,IAC7CH,EAAcjjB,EAAKgB,MAAMnB,EAC7B,OAAOojB,GACFC,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,iBAAkB,MAYjCtgB,EAAKpC,UAAU6iB,YAAc,SAAUne,GAIrC,IAFA,GAAIoe,GAAU,GACVjhB,EAAI,EAAGmO,EAAOtL,EAAK/E,OACZqQ,EAAJnO,GAAU,CACf,GAAI7C,GAAI0F,EAAKoI,OAAOjL,EACX,OAAL7C,EACF8jB,GAAW,MAEC,MAAL9jB,GACP8jB,GAAW9jB,EACX6C,IAEA7C,EAAI0F,EAAKoI,OAAOjL,GACe,IAA3B,aAAagM,QAAQ7O,KACvB8jB,GAAW,MAEbA,GAAW9jB,GAGX8jB,GADY,KAAL9jB,EACI,MAGAA,EAEb6C,IAGF,MAAOihB,GAIT,IAAInJ,GAAa7B,EAAkB1V,EAEnChE,GAAOD,QAAUiE,GAKZ,SAAShE,EAAQD,EAASM,GAW/B,QAASskB,GAAmBrc,EAAQ3G,EAAOijB,GAOzC,QAASC,GAAWhjB,GAElByG,EAAOxG,QAAQD,EAGf,IAAIoJ,GAAU3C,EAAOpE,KAAOoE,EAAOpE,IAAI+G,OACnCA,IACFA,EAAQlF,QA6CZ,IAAK,GAxCD+e,IACFC,MACEze,KAAQ,OACRkE,MAAS,6BACToZ,MAAS,WACPiB,EAAW,UAGfG,MACE1e,KAAQ,OACRkE,MAAS,wBACToZ,MAAS,WACPiB,EAAW,UAGfve,MACEA,KAAQ,OACRkE,MAAS,8BACToZ,MAAS,WACPiB,EAAW,UAGfjH,MACEtX,KAAQ,OACRkE,MAAS,wBACToZ,MAAS,WACPiB,EAAW,UAGfI,MACE3e,KAAQ,OACRkE,MAAS,sBACToZ,MAAS,WACPiB,EAAW,WAMbnB,KACKjgB,EAAI,EAAGA,EAAI9B,EAAMJ,OAAQkC,IAAK,CACrC,GAAI5B,GAAOF,EAAM8B,GACbyhB,EAAOJ,EAAejjB,EAC1B,KAAKqjB,EACH,KAAM,IAAIhkB,OAAM,iBAAmBW,EAAO,IAG5CqjB,GAAK5b,UAAY,cAAiBsb,GAAW/iB,EAAQ,YAAc,IACnE6hB,EAAMvU,KAAK+V,GAIb,GAAIC,GAAcL,EAAeF,EACjC,KAAKO,EACH,KAAM,IAAIjkB,OAAM,iBAAmB0jB,EAAU,IAE/C,IAAIQ,GAAeD,EAAY7e,KAG3B+e,EAAMjc,SAASC,cAAc,SASjC,OARAgc,GAAI/b,UAAY,kBAChB+b,EAAIhM,UAAY+L,EAAe,YAC/BC,EAAI7a,MAAQ,qBACZ6a,EAAI9b,QAAU,WACZ,GAAIrD,GAAO,GAAIuT,GAAYiK,EAC3Bxd,GAAK6d,KAAKsB,IAGLA,EAhGT,GAAI5L,GAAcpZ,EAAoB,GAmGtCN,GAAQkD,OAAS0hB,GAKZ,SAAS3kB,EAAQD,EAASM,GAG/B,GAAIgM,GAAMhM,EAAoB,GAG9BA,GAAoB,IACpBA,EAAoB,IACpBA,EAAoB,IAEpBL,EAAOD,QAAUsM,GAKZ,SAASrM,EAAQD,EAASM,GAa/B,QAASoZ,GAAaiK,EAAO1iB,GAiC3B,QAASskB,GAAiBC,EAAMC,EAAU9B,GACxCA,EAAMpJ,QAAQ,SAAU4K,GACtB,GAAiB,aAAbA,EAAK/Z,KAAqB,CAE5B,GAAIsa,GAAYrc,SAASC,cAAc,MACvCoc,GAAUnc,UAAY,YACtBoc,EAAKtc,SAASC,cAAc,MAC5Bqc,EAAG/f,YAAY8f,GACfF,EAAK5f,YAAY+f,OAEd,CACH,GAAIC,MAGAD,EAAKtc,SAASC,cAAc,KAChCkc,GAAK5f,YAAY+f,EAGjB,IAAIE,GAASxc,SAASC,cAAc,SAepC,IAdAuc,EAAOtc,UAAY4b,EAAK5b,UACxBqc,EAAQC,OAASA,EACbV,EAAK1a,QACPob,EAAOpb,MAAQ0a,EAAK1a,OAElB0a,EAAKtB,QACPgC,EAAOrc,QAAU,WACfvC,EAAGgU,OACHkK,EAAKtB,UAGT8B,EAAG/f,YAAYigB,GAGXV,EAAKvB,QAAS,CAEhB,GAAIkC,GAAUzc,SAASC,cAAc,MACrCwc,GAAQvc,UAAY,OACpBsc,EAAOjgB,YAAYkgB,GACnBD,EAAOjgB,YAAYyD,SAASuE,eAAeuX,EAAK5e,MAEhD,IAAIwf,EACJ,IAAIZ,EAAKtB,MAAO,CAEdgC,EAAOtc,WAAa,UAEpB,IAAIyc,GAAe3c,SAASC,cAAc,SAC1Csc,GAAQI,aAAeA,EACvBA,EAAazc,UAAY,SACzByc,EAAa1M,UAAY,6BACzBqM,EAAG/f,YAAYogB,GACXb,EAAKrB,eACPkC,EAAavb,MAAQ0a,EAAKrB,cAG5BiC,EAAgBC,MAEb,CAEH,GAAIC,GAAY5c,SAASC,cAAc,MACvC2c,GAAU1c,UAAY,SACtBsc,EAAOjgB,YAAYqgB,GAEnBF,EAAgBF,EAIlBE,EAAcvc,QAAU,WACtBvC,EAAGif,cAAcN,GACjBG,EAAc/f,QAIhB,IAAImgB,KACJP,GAAQQ,SAAWD,CACnB,IAAIE,GAAKhd,SAASC,cAAc,KAChCsc,GAAQS,GAAKA,EACbA,EAAG9c,UAAY,OACf8c,EAAGnZ,MAAM9F,OAAS,IAClBue,EAAG/f,YAAYygB,GACfd,EAAgBc,EAAIF,EAAahB,EAAKvB,aAItCiC,GAAOvM,UAAY,2BAA6B6L,EAAK5e,IAGvDkf,GAASrW,KAAKwW,MAtHpBxlB,KAAK+D,MAEL,IAAI8C,GAAK7G,KACL+D,EAAM/D,KAAK+D,GACf/D,MAAKojB,OAASlf,OACdlE,KAAKujB,MAAQA,EACbvjB,KAAKkmB,kBACLlmB,KAAKiE,UAAYC,OACjBlE,KAAKmmB,eAAiBjiB,OACtBlE,KAAKqjB,QAAUxiB,EAAUA,EAAQ8iB,MAAQzf,MAGzC,IAAI6B,GAAOkD,SAASC,cAAc,MAClCnD,GAAKoD,UAAY,yBACjBpF,EAAIgC,KAAOA,CAGX,IAAIqf,GAAOnc,SAASC,cAAc,KAClCkc,GAAKjc,UAAY,OACjBpD,EAAKP,YAAY4f,GACjBrhB,EAAIqhB,KAAOA,EACXrhB,EAAIwf,QAGJ,IAAI6C,GAAcnd,SAASC,cAAc,SACzCnF,GAAIqiB,YAAcA,CAClB,IAAIb,GAAKtc,SAASC,cAAc,KAChCqc,GAAGzY,MAAMuZ,SAAW,SACpBd,EAAGzY,MAAM9F,OAAS,IAClBue,EAAG/f,YAAY4gB,GACfhB,EAAK5f,YAAY+f,GA4FjBJ,EAAgBC,EAAMplB,KAAK+D,IAAIwf,MAAOA,GAKtCvjB,KAAKsmB,UAAY,EACjB/C,EAAMpJ,QAAQ,SAAU4K,GACtB,GAAI/d,GAAqE,IAA3Duc,EAAMniB,QAAU2jB,EAAKvB,QAAUuB,EAAKvB,QAAQpiB,OAAS,GACnEyF,GAAGyf,UAAY/d,KAAKE,IAAI5B,EAAGyf,UAAWtf,KA9I1C,GAAI/F,GAAOf,EAAoB,EAuJ/BoZ,GAAY7X,UAAU8kB,mBAAqB,WACzC,GAAIC,MACA3f,EAAK7G,IAiBT,OAhBAA,MAAK+D,IAAIwf,MAAMpJ,QAAQ,SAAU4K,GAC/ByB,EAAQxX,KAAK+V,EAAKU,QACdV,EAAKa,cACPY,EAAQxX,KAAK+V,EAAKa,cAEhBb,EAAKiB,UAAYjB,GAAQle,EAAG4f,cAC9B1B,EAAKiB,SAAS7L,QAAQ,SAAUuM,GAC9BF,EAAQxX,KAAK0X,EAAQjB,QACjBiB,EAAQd,cACVY,EAAQxX,KAAK0X,EAAQd,kBAOtBY,GAITlN,EAAYqN,YAAcziB,OAM1BoV,EAAY7X,UAAUmiB,KAAO,SAAUR,GACrCpjB,KAAK6a,MAGL,IAAI+L,GAAelZ,OAAOmZ,YACtBC,EAAgBpZ,OAAOoD,aAAe7H,SAAS5B,WAAa,EAC5D0f,EAAeH,EAAeE,EAC9BE,EAAe5D,EAAO9D,aACtB2H,EAAajnB,KAAKsmB,UAGlB3V,EAAO1P,EAAKsP,gBAAgB6S,GAC5Btc,EAAM7F,EAAK8F,eAAeqc,EACQ2D,GAAlCjgB,EAAMkgB,EAAeC,GAEvBjnB,KAAK+D,IAAIgC,KAAK+G,MAAM6D,KAAOA,EAAO,KAClC3Q,KAAK+D,IAAIgC,KAAK+G,MAAMhG,IAAOA,EAAMkgB,EAAgB,KACjDhnB,KAAK+D,IAAIgC,KAAK+G,MAAM5F,OAAS,KAI7BlH,KAAK+D,IAAIgC,KAAK+G,MAAM6D,KAAOA,EAAO,KAClC3Q,KAAK+D,IAAIgC,KAAK+G,MAAMhG,IAAM,GAC1B9G,KAAK+D,IAAIgC,KAAK+G,MAAM5F,OAAU0f,EAAe9f,EAAO,MAItDmC,SAASgV,KAAKzY,YAAYxF,KAAK+D,IAAIgC,KAGnC,IAAIc,GAAK7G,KACLolB,EAAOplB,KAAK+D,IAAIqhB,IACpBplB,MAAKkmB,eAAegB,UAAYjmB,EAAKiJ,iBACjCjB,SAAU,YAAa,SAAUF,GAE/B,GAAIM,GAASN,EAAMM,MACdA,IAAU+b,GAAUve,EAAG+Y,WAAWvW,EAAQ+b,KAC7Cve,EAAGgU,OACH9R,EAAM8C,kBACN9C,EAAMQ,oBAGdvJ,KAAKkmB,eAAeiB,WAAalmB,EAAKiJ,iBAClCjB,SAAU,aAAc,SAAUF,GAEhCA,EAAM8C,kBACN9C,EAAMQ,mBAEZvJ,KAAKkmB,eAAekB,QAAUnmB,EAAKiJ,iBAC/BjB,SAAU,UAAW,SAAUF,GAC7BlC,EAAGoE,WAAWlC,KAIpB/I,KAAKiE,UAAYhD,EAAK8G,eACtB/H,KAAKojB,OAASA,EACdva,WAAW,WACThC,EAAG9C,IAAIqiB,YAAYxgB,SAClB,GAEC0T,EAAYqN,aACdrN,EAAYqN,YAAY9L,OAE1BvB,EAAYqN,YAAc3mB,MAM5BsZ,EAAY7X,UAAUoZ,KAAO,WAEvB7a,KAAK+D,IAAIgC,KAAKvB,aAChBxE,KAAK+D,IAAIgC,KAAKvB,WAAWC,YAAYzE,KAAK+D,IAAIgC,MAC1C/F,KAAKqjB,SACPrjB,KAAKqjB,UAMT,KAAK,GAAI/gB,KAAQtC,MAAKkmB,eACpB,GAAIlmB,KAAKkmB,eAAevhB,eAAerC,GAAO,CAC5C,GAAI+kB,GAAKrnB,KAAKkmB,eAAe5jB,EACzB+kB,IACFpmB,EAAKwT,oBAAoBxL,SAAU3G,EAAM+kB,SAEpCrnB,MAAKkmB,eAAe5jB,GAI3BgX,EAAYqN,aAAe3mB,OAC7BsZ,EAAYqN,YAAcziB,SAU9BoV,EAAY7X,UAAUqkB,cAAgB,SAAUN,GAC9C,GAAI3e,GAAK7G,KACLsnB,EAAkB9B,GAAWxlB,KAAKymB,aAGlCA,EAAezmB,KAAKymB,YAcxB,IAbIA,IAEFA,EAAaR,GAAGnZ,MAAM9F,OAAS,IAC/Byf,EAAaR,GAAGnZ,MAAMya,QAAU,GAChC1e,WAAW,WACLhC,EAAG4f,cAAgBA,IACrBA,EAAaR,GAAGnZ,MAAM0a,QAAU,GAChCvmB,EAAKiQ,gBAAgBuV,EAAaR,GAAGzhB,WAAY,cAElD,KACHxE,KAAKymB,aAAeviB,SAGjBojB,EAAgB,CACnB,GAAIrB,GAAKT,EAAQS,EACjBA,GAAGnZ,MAAM0a,QAAU,OACNvB,GAAGhf,YAChB4B,YAAW,WACLhC,EAAG4f,cAAgBjB,IACrBS,EAAGnZ,MAAM9F,OAAiC,GAAvBif,EAAGzU,WAAWpQ,OAAe,KAChD6kB,EAAGnZ,MAAMya,QAAU,aAEpB,GACHtmB,EAAK8P,aAAakV,EAAGzhB,WAAY,YACjCxE,KAAKymB,aAAejB,IASxBlM,EAAY7X,UAAUwJ,WAAa,SAAUlC,GAC3C,GAGIyd,GAASiB,EAAaC,EAAYC,EAHlCte,EAASN,EAAMM,OACf8B,EAASpC,EAAMqC,MACfI,GAAU,CAGA,KAAVL,GAIEnL,KAAKiE,WACPhD,EAAK2G,aAAa5H,KAAKiE,WAErBjE,KAAKojB,QACPpjB,KAAKojB,OAAOxd,QAGd5F,KAAK6a,OAELrP,GAAU,GAEO,GAAVL,EACFpC,EAAMwC,UAUTib,EAAUxmB,KAAKumB,qBACfkB,EAAcjB,EAAQlX,QAAQjG,GACX,GAAfoe,IAEFjB,EAAQA,EAAQplB,OAAS,GAAGwE,QAC5B4F,GAAU,KAdZgb,EAAUxmB,KAAKumB,qBACfkB,EAAcjB,EAAQlX,QAAQjG,GAC1Boe,GAAejB,EAAQplB,OAAS,IAElColB,EAAQ,GAAG5gB,QACX4F,GAAU,IAaG,IAAVL,GACiB,UAApB9B,EAAOF,YACTqd,EAAUxmB,KAAKumB,qBACfkB,EAAcjB,EAAQlX,QAAQjG,GAC9Bqe,EAAalB,EAAQiB,EAAc,GAC/BC,GACFA,EAAW9hB,SAGf4F,GAAU,GAEO,IAAVL,GACPqb,EAAUxmB,KAAKumB,qBACfkB,EAAcjB,EAAQlX,QAAQjG,GAC9Bqe,EAAalB,EAAQiB,EAAc,GAC/BC,GAAsC,UAAxBA,EAAWve,YAE3Bue,EAAalB,EAAQiB,EAAc,IAEhCC,IAEHA,EAAalB,EAAQA,EAAQplB,OAAS,IAEpCsmB,GACFA,EAAW9hB,QAEb4F,GAAU,GAEO,IAAVL,GACPqb,EAAUxmB,KAAKumB,qBACfkB,EAAcjB,EAAQlX,QAAQjG,GAC9Bse,EAAanB,EAAQiB,EAAc,GAC/BE,GAAsC,UAAxBA,EAAWxe,WAC3Bwe,EAAW/hB,QAEb4F,GAAU,GAEO,IAAVL,IACPqb,EAAUxmB,KAAKumB,qBACfkB,EAAcjB,EAAQlX,QAAQjG,GAC9Bse,EAAanB,EAAQiB,EAAc,GAC/BE,GAAsC,UAAxBA,EAAWxe,YAE3Bwe,EAAanB,EAAQiB,EAAc,IAEhCE,IAEHA,EAAanB,EAAQ,IAEnBmB,IACFA,EAAW/hB,QACX4F,GAAU,GAEZA,GAAU,GAIRA,IACFzC,EAAM8C,kBACN9C,EAAMQ,mBAUV+P,EAAY7X,UAAUme,WAAa,SAAUlO,EAAOgE,GAElD,IADA,GAAIkS,GAAIlW,EAAMlN,WACPojB,GAAG,CACR,GAAIA,GAAKlS,EACP,OAAO,CAETkS,GAAIA,EAAEpjB,WAGR,OAAO,GAGT3E,EAAOD,QAAU0Z,GAKZ,SAASzZ,EAAQD,EAASM,GAS/B,QAASqZ,GAAkB1V,GAQzB,QAASuX,GAAYjT,GAEnBnI,KAAKmI,OAASA,EACdnI,KAAK+D,OA4MP,MAzMAqX,GAAW3Z,UAAY,GAAIoC,GAM3BuX,EAAW3Z,UAAUyE,OAAS,WAE5B,GAAInC,GAAM/D,KAAK+D,GAEf,IAAIA,EAAI6T,GACN,MAAO7T,GAAI6T,EAGb5X,MAAKwZ,oBAGL,IAAIqO,GAAW5e,SAASC,cAAc,KAMtC,IALA2e,EAASziB,KAAOpF,KAChB+D,EAAI6T,GAAKiQ,EAIL7nB,KAAKyZ,SAASvU,MAAO,CAEvBnB,EAAIsZ,OAASpU,SAASC,cAAc,KAGpC,IAAIqU,GAAStU,SAASC,cAAc,KACpCnF,GAAIwZ,OAASA,CACb,IAAIxX,GAAOkD,SAASC,cAAc,SAClCnD,GAAKoD,UAAY,cACjBpD,EAAKsE,MAAQ,0CACbtG,EAAIgC,KAAOA,EACXwX,EAAO/X,YAAYzB,EAAIgC,MAIzB,GAAI+hB,GAAW7e,SAASC,cAAc,MAClC6e,EAAU9e,SAASC,cAAc,MASrC,OARA6e,GAAQ7O,UAAY,UACpB6O,EAAQ5e,UAAY,WACpB2e,EAAStiB,YAAYuiB,GACrBhkB,EAAI8T,GAAKiQ,EACT/jB,EAAIoC,KAAO4hB,EAEX/nB,KAAK8Y,YAEE+O,GAMTzM,EAAW3Z,UAAUqX,UAAY,WAC/B,GAAI/U,GAAM/D,KAAK+D,IACX+jB,EAAW/jB,EAAI8T,EACfiQ,KACFA,EAAShb,MAAMkb,YAAiC,GAAlBhoB,KAAKqa,WAAkB,GAAM,KAI7D,IAAI0N,GAAUhkB,EAAIoC,IACd4hB,KACFA,EAAQ7O,UAAY,UAAYlZ,KAAK0V,OAAO1K,KAAO,IAKrD,IAAI6c,GAAW9jB,EAAI6T,EACd5X,MAAKqiB,YAYHte,EAAI6T,GAAG9E,aACN/O,EAAIsZ,QACNwK,EAASriB,YAAYzB,EAAIsZ,QAEvBtZ,EAAIwZ,QACNsK,EAASriB,YAAYzB,EAAIwZ,QAE3BsK,EAASriB,YAAYsiB,IAlBnB/jB,EAAI6T,GAAG9E,aACL/O,EAAIsZ,QACNwK,EAASpjB,YAAYV,EAAIsZ,QAEvBtZ,EAAIwZ,QACNsK,EAASpjB,YAAYV,EAAIwZ,QAE3BsK,EAASpjB,YAAYqjB,KAqB3B1M,EAAW3Z,UAAU4gB,UAAY,WAC/B,MAAqC,IAA7BriB,KAAK0V,OAAOnE,OAAOnQ,QAS7Bga,EAAW3Z,UAAUmf,gBAAkB,SAAUwC,EAAQC,GACvD,GAAIje,GAAOpF,KACPsjB,EAASzf,EAAKmf,YACdO,IAGApd,KAAQ,SACRkE,MAAS,uDACTqZ,aAAgB,8CAChBva,UAAa,SACbsa,MAAS,WACPre,EAAKod,UAAU,GAAI,GAAI,SAEzBgB,UAEIrd,KAAQ,OACRgD,UAAa,YACbkB,MAASiZ,EAAOL,KAChBQ,MAAS,WACPre,EAAKod,UAAU,GAAI,GAAI,WAIzBrc,KAAQ,QACRgD,UAAa,aACbkB,MAASiZ,EAAOJ,MAChBO,MAAS,WACPre,EAAKod,UAAU,UAIjBrc,KAAQ,SACRgD,UAAa,cACbkB,MAASiZ,EAAOxT,OAChB2T,MAAS,WACPre,EAAKod,UAAU,UAIjBrc,KAAQ,SACRgD,UAAa,cACbkB,MAASiZ,EAAOH,OAChBM,MAAS,WACPre,EAAKod,UAAU,GAAI,GAAI,eAO7Bzc,EAAO,GAAIuT,GAAYiK,GAAQI,MAAON,GAC1Ctd,GAAK6d,KAAKR,IAOZhI,EAAW3Z,UAAUqH,QAAU,SAAUC,GACvC,GAAIiC,GAAOjC,EAAMiC,KACb3B,EAASN,EAAMM,QAAUN,EAAM2X,WAC/B3c,EAAM/D,KAAK+D,IAGXgC,EAAOhC,EAAIgC,IAWf,IAVIsD,GAAUtD,IACA,aAARiF,EACFhL,KAAKmI,OAAOnE,YAAY4Q,UAAU5U,KAAK0V,QAExB,YAAR1K,GACPhL,KAAKmI,OAAOnE,YAAY+Q;AAKhB,SAAR/J,GAAmB3B,GAAUtF,EAAIgC,KAAM,CACzC,GAAI/B,GAAchE,KAAKmI,OAAOnE,WAC9BA,GAAY4Q,UAAU5U,KAAK0V,QAC3B1R,EAAYiR,OACZhU,EAAK8P,aAAahN,EAAIgC,KAAM,YAC5B/F,KAAK4gB,gBAAgB7c,EAAIgC,KAAM,WAC7B9E,EAAKiQ,gBAAgBnN,EAAIgC,KAAM,YAC/B/B,EAAYkR,SACZlR,EAAY+Q,gBAIJ,WAAR/J,GACFhL,KAAK+gB,UAAUhY,IAIZqS,EA9NT,GAAIna,GAAOf,EAAoB,GAC3BoZ,EAAcpZ,EAAoB,GAgOtCL,GAAOD,QAAU2Z,GAKZ,SAAS1Z,EAAQD,EAASM,GAG/B,GAAIgO,GAAW,WACf,GAAI+Z,IAAUC,MAAO,aACrBC,MACAC,UAAWhlB,MAAQ,EAAEilB,WAAa,EAAEC,OAAS,EAAEC,WAAa,EAAEC,OAAS,EAAEC,gBAAkB,EAAEC,KAAO,EAAEC,mBAAqB,EAAEC,KAAO,GAAGC,MAAQ,GAAGC,SAAW,GAAGC,UAAY,GAAGC,IAAM,GAAGC,WAAa,GAAGC,UAAY,GAAGC,IAAI,GAAGC,IAAI,GAAGC,eAAiB,GAAGC,WAAa,GAAGC,IAAI,GAAGC,IAAI,GAAGC,IAAI,GAAGC,IAAI,GAAGC,gBAAkB,GAAGC,QAAU,EAAEC,KAAO,GAC7UC,YAAaC,EAAE,QAAQC,EAAE,SAASC,EAAE,SAASC,EAAE,OAAOC,GAAG,OAAOC,GAAG,QAAQC,GAAG,MAAMC,GAAG,IAAIC,GAAG,IAAIC,GAAG,IAAIC,GAAG,IAAIC,GAAG,IAAIC,GAAG,KAC1HC,cAAe,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAC5JC,cAAe,SAAmBC,EAAOC,EAAOC,EAAS7C,EAAG8C,EAAQC,EAAGC,GAEvE,GAAIC,GAAKF,EAAG9pB,OAAS,CACrB,QAAQ6pB,GACR,IAAK,GACKjrB,KAAKqrB,EAAIP,EAAO3G,QAAQ,YAAa,MACzBA,QAAQ,OAAO,MACfA,QAAQ,OAAO,MACfA,QAAQ,OAAO,KACfA,QAAQ,OAAO,KACfA,QAAQ,OAAO,MACfA,QAAQ,OAAO,KAErC,MACA,KAAK,GAAEnkB,KAAKqrB,EAAIjf,OAAO0e,EACvB,MACA,KAAK,GAAE9qB,KAAKqrB,EAAI,IAChB,MACA,KAAK,GAAErrB,KAAKqrB,GAAI,CAChB,MACA,KAAK,GAAErrB,KAAKqrB,GAAI,CAChB,MACA,KAAK,GAAE,MAAOrrB,MAAKqrB,EAAIH,EAAGE,EAAG,EAE7B,KAAK,IAAGprB,KAAKqrB,IACb,MACA,KAAK,IAAGrrB,KAAKqrB,EAAIH,EAAGE,EAAG,EACvB,MACA,KAAK,IAAGprB,KAAKqrB,GAAKH,EAAGE,EAAG,GAAIF,EAAGE,GAC/B,MACA,KAAK,IAAGprB,KAAKqrB,KAAQrrB,KAAKqrB,EAAEH,EAAGE,GAAI,IAAMF,EAAGE,GAAI,EAChD,MACA,KAAK,IAAGprB,KAAKqrB,EAAIH,EAAGE,EAAG,GAAIF,EAAGE,EAAG,GAAGF,EAAGE,GAAI,IAAMF,EAAGE,GAAI,EACxD,MACA,KAAK,IAAGprB,KAAKqrB,IACb,MACA,KAAK,IAAGrrB,KAAKqrB,EAAIH,EAAGE,EAAG,EACvB,MACA,KAAK,IAAGprB,KAAKqrB,GAAKH,EAAGE,GACrB,MACA,KAAK,IAAGprB,KAAKqrB,EAAIH,EAAGE,EAAG,GAAIF,EAAGE,EAAG,GAAGpc,KAAKkc,EAAGE,MAI5CpmB,QAASsmB,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,GAAGuB,EAAE,EAAEtB,IAAI,EAAE,IAAIC,IAAI,EAAE,IAAIsB,GAAG,EAAEC,GAAG,EAAEC,GAAG,EAAEC,GAAG,EAAEvB,IAAI,EAAE,IAAII,IAAI,EAAE,MAAMoB,GAAG,KAAKzB,IAAI,EAAE,MAAMA,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKN,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKN,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKN,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMN,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMN,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMN,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKN,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKN,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKN,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGC,IAAI,EAAE,GAAGC,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKN,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,GAAGE,IAAI,EAAE,KAAKW,EAAE,GAAGtB,GAAG,EAAE,IAAIO,IAAI,EAAE,IAAIwB,GAAG,GAAGC,GAAG,KAAKV,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,GAAGuB,EAAE,EAAEtB,IAAI,EAAE,IAAIC,IAAI,EAAE,IAAIuB,GAAG,GAAGC,GAAG,EAAEC,GAAG,EAAEvB,IAAI,EAAE,IAAII,IAAI,EAAE,IAAIC,IAAI,EAAE,IAAIsB,GAAG,KAAKH,GAAG,EAAE,KAAKzB,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMJ,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMF,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMD,IAAI,EAAE,MAAMH,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMF,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMF,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMN,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMW,EAAE,GAAGtB,GAAG,EAAE,IAAIgC,GAAG,KAAKV,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,GAAGuB,EAAE,EAAEtB,IAAI,EAAE,IAAIC,IAAI,EAAE,IAAIuB,GAAG,GAAGC,GAAG,EAAEC,GAAG,EAAEvB,IAAI,EAAE,IAAII,IAAI,EAAE,MAAML,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMW,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,IAAIuB,EAAE,EAAEtB,GAAG,EAAE,GAAGuB,EAAE,EAAEtB,IAAI,EAAE,IAAIC,IAAI,EAAE,IAAIuB,GAAG,GAAGC,GAAG,EAAEC,GAAG,EAAEvB,IAAI,EAAE,IAAII,IAAI,EAAE,MAAMH,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMF,IAAI,EAAE,IAAIE,IAAI,EAAE,MAAMA,IAAI,EAAE,IAAIE,IAAI,EAAE,MACtwCuB,gBAAiBL,IAAI,EAAE,IACvBM,WAAY,SAAoBvP,EAAKwP,GACjC,KAAM,IAAIrrB,OAAM6b,IAEpB3a,MAAO,SAAe4D,GA0BlB,QAASwmB,GAAUxM,GACfyM,EAAMlrB,OAASkrB,EAAMlrB,OAAS,EAAEye,EAChC0M,EAAOnrB,OAASmrB,EAAOnrB,OAASye,EAChC2M,EAAOprB,OAASorB,EAAOprB,OAASye,EAGpC,QAAS4M,KACL,GAAIC,EAMJ,OALAA,GAAQC,EAAKC,MAAMH,OAAS,EAEP,gBAAVC,KACPA,EAAQC,EAAKvE,SAASsE,IAAUA,GAE7BA,EAtCX,GAAIC,GAAO3sB,KACPssB,GAAS,GACTC,GAAU,MACVC,KACAxnB,EAAQhF,KAAKgF,MACb8lB,EAAS,GACTE,EAAW,EACXD,EAAS,EACT8B,EAAa,EACbC,EAAS,EACT9D,EAAM,CAIVhpB,MAAK4sB,MAAMG,SAASlnB,GACpB7F,KAAK4sB,MAAMzE,GAAKnoB,KAAKmoB,GACrBnoB,KAAKmoB,GAAGyE,MAAQ5sB,KAAK4sB,MACW,mBAArB5sB,MAAK4sB,MAAMI,SAClBhtB,KAAK4sB,MAAMI,UACf,IAAIC,GAAQjtB,KAAK4sB,MAAMI,MACvBR,GAAOxd,KAAKie,GAEsB,kBAAvBjtB,MAAKmoB,GAAGgE,aACfnsB,KAAKmsB,WAAansB,KAAKmoB,GAAGgE,WAmB9B,KADA,GAAIe,GAAQC,EAAgBC,EAAO5mB,EAAW6mB,EAAY3sB,EAAE4sB,EAAIC,EAAUC,EAAzBC,OACpC,CAgBT,GAdAL,EAAQd,EAAMA,EAAMlrB,OAAO,GAGvBpB,KAAKksB,eAAekB,GACpB5mB,EAASxG,KAAKksB,eAAekB,IAEf,MAAVF,IACAA,EAAST,KAEbjmB,EAASxB,EAAMooB,IAAUpoB,EAAMooB,GAAOF,IAKpB,mBAAX1mB,KAA2BA,EAAOpF,SAAWoF,EAAO,GAAI,CAE/D,IAAKqmB,EAAY,CAEbW,IACA,KAAK9sB,IAAKsE,GAAMooB,GAAYptB,KAAK8pB,WAAWppB,IAAMA,EAAI,GAClD8sB,EAASxe,KAAK,IAAIhP,KAAK8pB,WAAWppB,GAAG,IAEzC,IAAIgtB,GAAS,EAETA,GADA1tB,KAAK4sB,MAAMe,aACF,wBAAwB3C,EAAS,GAAG,MAAMhrB,KAAK4sB,MAAMe,eAAe,eAAeH,EAAShe,KAAK,MAAQ,UAAYxP,KAAK8pB,WAAWoD,GAAS,IAE9I,wBAAwBlC,EAAS,GAAG,iBACpB,GAAVkC,EAAsB,eACV,KAAKltB,KAAK8pB,WAAWoD,IAAWA,GAAQ,KAEvEltB,KAAKmsB,WAAWuB,GACXvnB,KAAMnG,KAAK4sB,MAAMrd,MAAOmd,MAAO1sB,KAAK8pB,WAAWoD,IAAWA,EAAQU,KAAM5tB,KAAK4sB,MAAM5B,SAAU6C,IAAKZ,EAAOO,SAAUA,IAI5H,GAAkB,GAAdX,EAAiB,CACjB,GAAIK,GAAUlE,EACV,KAAM,IAAIjoB,OAAM2sB,GAAU,kBAI9B3C,GAAS/qB,KAAK4sB,MAAM7B,OACpBD,EAAS9qB,KAAK4sB,MAAM9B,OACpBE,EAAWhrB,KAAK4sB,MAAM5B,SACtBiC,EAAQjtB,KAAK4sB,MAAMI,OACnBE,EAAST,IAIb,OAAU,CAEN,GAAKK,EAAOxc,YAAetL,GAAMooB,GAC7B,KAEJ,IAAa,GAATA,EACA,KAAM,IAAIrsB,OAAM2sB,GAAU,kBAE9BrB,GAAS,GACTe,EAAQd,EAAMA,EAAMlrB,OAAO,GAG/B+rB,EAAiBD,EACjBA,EAASJ,EACTM,EAAQd,EAAMA,EAAMlrB,OAAO,GAC3BoF,EAASxB,EAAMooB,IAAUpoB,EAAMooB,GAAON,GACtCD,EAAa,EAIjB,GAAIrmB,EAAO,YAAcqd,QAASrd,EAAOpF,OAAS,EAC9C,KAAM,IAAIL,OAAM,oDAAoDqsB,EAAM,YAAYF,EAG1F,QAAQ1mB,EAAO,IAEX,IAAK,GAGD8lB,EAAMtd,KAAKke,GACXX,EAAOvd,KAAKhP,KAAK4sB,MAAM9B,QACvB0B,EAAOxd,KAAKhP,KAAK4sB,MAAMI,QACvBV,EAAMtd,KAAKxI,EAAO,IAClB0mB,EAAS,KACJC,GAQDD,EAASC,EACTA,EAAiB,OARjBpC,EAAS/qB,KAAK4sB,MAAM7B,OACpBD,EAAS9qB,KAAK4sB,MAAM9B,OACpBE,EAAWhrB,KAAK4sB,MAAM5B,SACtBiC,EAAQjtB,KAAK4sB,MAAMI,OACfH,EAAa,GACbA,IAKR,MAEJ,KAAK,GAgBD,GAbAS,EAAMttB,KAAK4qB,aAAapkB,EAAO,IAAI,GAGnCinB,EAAMpC,EAAIkB,EAAOA,EAAOnrB,OAAOksB,GAE/BG,EAAMtC,IACF2C,WAAYtB,EAAOA,EAAOprB,QAAQksB,GAAK,IAAIQ,WAC3CC,UAAWvB,EAAOA,EAAOprB,OAAO,GAAG2sB,UACnCC,aAAcxB,EAAOA,EAAOprB,QAAQksB,GAAK,IAAIU,aAC7CC,YAAazB,EAAOA,EAAOprB,OAAO,GAAG6sB,aAEzCZ,EAAIrtB,KAAK6qB,cAActqB,KAAKktB,EAAO3C,EAAQC,EAAQC,EAAUhrB,KAAKmoB,GAAI3hB,EAAO,GAAI+lB,EAAQC,GAExE,mBAANa,GACP,MAAOA,EAIPC,KACAhB,EAAQA,EAAM4B,MAAM,EAAE,GAAGZ,EAAI,GAC7Bf,EAASA,EAAO2B,MAAM,EAAG,GAAGZ,GAC5Bd,EAASA,EAAO0B,MAAM,EAAG,GAAGZ,IAGhChB,EAAMtd,KAAKhP,KAAK4qB,aAAapkB,EAAO,IAAI,IACxC+lB,EAAOvd,KAAKye,EAAMpC,GAClBmB,EAAOxd,KAAKye,EAAMtC,IAElBoC,EAAWvoB,EAAMsnB,EAAMA,EAAMlrB,OAAO,IAAIkrB,EAAMA,EAAMlrB,OAAO,IAC3DkrB,EAAMtd,KAAKue,EACX,MAEJ,KAAK,GACD,OAAO,GAKnB,OAAO,IAGPX,EAAQ,WACZ,GAAIA,IAAU5D,IAAI,EAClBmD,WAAW,SAAoBvP,EAAKwP,GAC5B,IAAIpsB,KAAKmoB,GAAGgE,WAGR,KAAM,IAAIprB,OAAM6b,EAFhB5c,MAAKmoB,GAAGgE,WAAWvP,EAAKwP,IAKpCW,SAAS,SAAUlnB,GAOX,MANA7F,MAAKmuB,OAAStoB,EACd7F,KAAKouB,MAAQpuB,KAAKquB,MAAQruB,KAAKsuB,MAAO,EACtCtuB,KAAKgrB,SAAWhrB,KAAK+qB,OAAS,EAC9B/qB,KAAK8qB,OAAS9qB,KAAKuuB,QAAUvuB,KAAKuP,MAAQ,GAC1CvP,KAAKwuB,gBAAkB,WACvBxuB,KAAKgtB,QAAUc,WAAW,EAAEE,aAAa,EAAED,UAAU,EAAEE,YAAY,GAC5DjuB,MAEf6F,MAAM,WACE,GAAI4oB,GAAKzuB,KAAKmuB,OAAO,EACrBnuB,MAAK8qB,QAAQ2D,EACbzuB,KAAK+qB,SACL/qB,KAAKuP,OAAOkf,EACZzuB,KAAKuuB,SAASE,CACd,IAAIC,GAAQD,EAAGlf,MAAM,KAGrB,OAFImf,IAAO1uB,KAAKgrB,WAChBhrB,KAAKmuB,OAASnuB,KAAKmuB,OAAOD,MAAM,GACzBO,GAEfE,MAAM,SAAUF,GAER,MADAzuB,MAAKmuB,OAASM,EAAKzuB,KAAKmuB,OACjBnuB,MAEf4uB,KAAK,WAEG,MADA5uB,MAAKouB,OAAQ,EACNpuB,MAEf6uB,KAAK,SAAUhP,GACP7f,KAAKmuB,OAASnuB,KAAKuP,MAAM2e,MAAMrO,GAAK7f,KAAKmuB,QAEjDW,UAAU,WACF,GAAIC,GAAO/uB,KAAKuuB,QAAQS,OAAO,EAAGhvB,KAAKuuB,QAAQntB,OAASpB,KAAKuP,MAAMnO,OACnE,QAAQ2tB,EAAK3tB,OAAS,GAAK,MAAM,IAAM2tB,EAAKC,OAAO,KAAK7K,QAAQ,MAAO,KAE/E8K,cAAc,WACN,GAAIrjB,GAAO5L,KAAKuP,KAIhB,OAHI3D,GAAKxK,OAAS,KACdwK,GAAQ5L,KAAKmuB,OAAOa,OAAO,EAAG,GAAGpjB,EAAKxK,UAElCwK,EAAKojB,OAAO,EAAE,KAAKpjB,EAAKxK,OAAS,GAAK,MAAM,KAAK+iB,QAAQ,MAAO,KAEhFwJ,aAAa,WACL,GAAIuB,GAAMlvB,KAAK8uB,YACXruB,EAAI,GAAIojB,OAAMqL,EAAI9tB,OAAS,GAAGoO,KAAK,IACvC,OAAO0f,GAAMlvB,KAAKivB,gBAAkB,KAAOxuB,EAAE,KAErDmL,KAAK,WACG,GAAI5L,KAAKsuB,KACL,MAAOtuB,MAAKgpB,GAEXhpB,MAAKmuB,SAAQnuB,KAAKsuB,MAAO,EAE9B,IAAI5B,GACAnd,EACA4f,EACAhe,EAEAud,CACC1uB,MAAKouB,QACNpuB,KAAK8qB,OAAS,GACd9qB,KAAKuP,MAAQ,GAGjB,KAAK,GADD6f,GAAQpvB,KAAKqvB,gBACR/rB,EAAE,EAAEA,EAAI8rB,EAAMhuB,SACnB+tB,EAAYnvB,KAAKmuB,OAAO5e,MAAMvP,KAAKovB,MAAMA,EAAM9rB,MAC3C6rB,GAAe5f,KAAS4f,EAAU,GAAG/tB,OAASmO,EAAM,GAAGnO,UACvDmO,EAAQ4f,EACRhe,EAAQ7N,EACHtD,KAAKa,QAAQyuB,OALKhsB,KAQ/B,MAAIiM,IACAmf,EAAQnf,EAAM,GAAGA,MAAM,SACnBmf,IAAO1uB,KAAKgrB,UAAY0D,EAAMttB,QAClCpB,KAAKgtB,QAAUc,WAAY9tB,KAAKgtB,OAAOe,UACxBA,UAAW/tB,KAAKgrB,SAAS,EACzBgD,aAAchuB,KAAKgtB,OAAOiB,YAC1BA,YAAaS,EAAQA,EAAMA,EAAMttB,OAAO,GAAGA,OAAO,EAAIpB,KAAKgtB,OAAOiB,YAAc1e,EAAM,GAAGnO,QACxGpB,KAAK8qB,QAAUvb,EAAM,GACrBvP,KAAKuP,OAASA,EAAM,GACpBvP,KAAK+qB,OAAS/qB,KAAK8qB,OAAO1pB,OAC1BpB,KAAKouB,OAAQ,EACbpuB,KAAKmuB,OAASnuB,KAAKmuB,OAAOD,MAAM3e,EAAM,GAAGnO,QACzCpB,KAAKuuB,SAAWhf,EAAM,GACtBmd,EAAQ1sB,KAAK6qB,cAActqB,KAAKP,KAAMA,KAAKmoB,GAAInoB,KAAMovB,EAAMje,GAAOnR,KAAKwuB,eAAexuB,KAAKwuB,eAAeptB,OAAO,IAC7GpB,KAAKsuB,MAAQtuB,KAAKmuB,SAAQnuB,KAAKsuB,MAAO,GACtC5B,EAAcA,EACb,QAEW,KAAhB1sB,KAAKmuB,OACEnuB,KAAKgpB,QAEZhpB,MAAKmsB,WAAW,0BAA0BnsB,KAAKgrB,SAAS,GAAG,yBAAyBhrB,KAAK2tB,gBAChFxnB,KAAM,GAAIumB,MAAO,KAAMkB,KAAM5tB,KAAKgrB,YAGvDyB,IAAI,WACI,GAAIY,GAAIrtB,KAAK4L,MACb,OAAiB,mBAANyhB,GACAA,EAEArtB,KAAKysB,OAGxB8C,MAAM,SAAeC,GACbxvB,KAAKwuB,eAAexf,KAAKwgB,IAEjCC,SAAS,WACD,MAAOzvB,MAAKwuB,eAAekB,OAEnCL,cAAc,WACN,MAAOrvB,MAAK2vB,WAAW3vB,KAAKwuB,eAAexuB,KAAKwuB,eAAeptB,OAAO,IAAIguB,OAElFQ,SAAS,WACD,MAAO5vB,MAAKwuB,eAAexuB,KAAKwuB,eAAeptB,OAAO,IAE9DyuB,UAAU,SAAeL,GACjBxvB,KAAKuvB,MAAMC,IA0CnB,OAxCA5C,GAAM/rB,WACN+rB,EAAM/B,cAAgB,SAAmB1C,EAAG2H,EAAIC,EAA0BC,GAG1E,OAAOD,GACP,IAAK,GACL,KACA,KAAK,GAAE,MAAO,EAEd,KAAK,GAAkD,MAAhDD,GAAIhF,OAASgF,EAAIhF,OAAOkE,OAAO,EAAEc,EAAI/E,OAAO,GAAW,CAE9D,KAAK,GAAE,MAAO,GAEd,KAAK,GAAE,MAAO,GAEd,KAAK,GAAE,MAAO,GAEd,KAAK,GAAE,MAAO,GAEd,KAAK,GAAE,MAAO,GAEd,KAAK,GAAE,MAAO,GAEd,KAAK,GAAE,MAAO,GAEd,KAAK,IAAG,MAAO,GAEf,KAAK,IAAG,MAAO,EAEf,KAAK,IAAG,MAAO,GAEf,KAAK,IAAG,MAAO,YAIf6B,EAAMwC,OAAS,WAAW,8DAA8D,qEAAqE,UAAU,UAAU,UAAU,UAAU,SAAS,SAAS,cAAc,eAAe,cAAc,SAAS,UAC3QxC,EAAM+C,YAAcM,SAAWb,OAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,IAAIc,WAAY,IAI9EtD,IAEP,OADA3E,GAAO2E,MAAQA,EACR3E,IAGLroB,GAAQqoB,OAAS/Z,EACjBtO,EAAQqC,MAAQiM,EAASjM,MAAMkuB,KAAKjiB,IAKjC,SAASrO,EAAQD,EAASM,GAgC/BgM,IAAIpM,OAAO,wBAAyB,UAAW,UAAW,SAAU,eAAgB,SAASswB,EAAUxwB,EAASC,GAEhHD,EAAQywB,QAAS,EACjBzwB,EAAQ0wB,SAAW,iBACnB1wB,EAAQ2wB,QAAU,w/EA2GlB,IAAIxsB,GAAMqsB,EAAS,aACnBrsB,GAAIysB,gBAAgB5wB,EAAQ2wB,QAAS3wB,EAAQ0wB,aAMxC,SAASzwB,EAAQD,EAASM,IAsC/B,WA2HA,QAASuwB,GAAUC,GACf,GAAIN,GAAW,SAASvwB,EAAQqI,GAC5B,MAAOyoB,GAAU,GAAI9wB,EAAQqI,IAG7BxI,EAAOkxB,CACPF,KACKE,EAAOF,KACRE,EAAOF,OACXhxB,EAAOkxB,EAAOF,IAGbhxB,EAAKI,QAAWJ,EAAKI,OAAO+wB,WAC7BC,EAAQC,SAAWrxB,EAAKI,OACxBJ,EAAKI,OAASgxB,EACdpxB,EAAKI,OAAO+wB,UAAW,GAGtBnxB,EAAK0wB,UAAa1wB,EAAK0wB,SAASS,WACjCF,EAAUI,SAAWrxB,EAAK0wB,SAC1B1wB,EAAK0wB,SAAWA,EAChB1wB,EAAK0wB,SAASS,UAAW,GA9IjC,GAAIG,GAAgB,MAEhBJ,EAAS,WACT,MAAO5wB,QAIX,IAAKgxB,GAAuC,mBAAfC,YAA7B,CAIA,GAAIH,GAAU,SAASjxB,EAAQqxB,EAAMC,GACjC,MAAsB,gBAAXtxB,QACHixB,EAAQC,SACRD,EAAQC,SAASlhB,MAAMnC,OAAQvM,YAE/ByO,QAAQxM,MAAM,mDACdwM,QAAQsY,WAKQ,GAApB/mB,UAAUC,SACV+vB,EAAUD,GAETJ,EAAQ7wB,UACT6wB,EAAQ7wB,WACR6wB,EAAQM,aAGZN,EAAQM,SAASvxB,GAAUsxB,OAC3BL,EAAQ7wB,QAAQJ,GAAU,QAM1B8wB,EAAY,SAASU,EAAUxxB,EAAQqI,GACvC,GAA+C,mBAA3CmI,OAAO5O,UAAU6O,SAAS/P,KAAKV,GAA8B,CAE7D,IAAK,GADDoF,MACK3B,EAAI,EAAGguB,EAAIzxB,EAAOuB,OAAYkwB,EAAJhuB,IAASA,EAAG,CAC3C,GAAIiuB,GAAMC,EAAOH,EAAUxxB,EAAOyD,GAClC,KAAKiuB,GAAOZ,EAAUI,SAClB,MAAOJ,GAAUI,SAASlhB,MAAMnC,OAAQvM,UAC5C8D,GAAO+J,KAAKuiB,GAEZrpB,GACAA,EAAS2H,MAAM,KAAM5K,OAGxB,CAAA,GAAsB,gBAAXpF,GAAqB,CACjC,GAAIsxB,GAAUK,EAAOH,EAAUxxB,EAC/B,QAAKsxB,GAAWR,EAAUI,SACfJ,EAAUI,SAASlhB,MAAMnC,OAAQvM,YAExC+G,GACAA,IAGGipB,GAGP,GAAIR,EAAUI,SACV,MAAOJ,GAAUI,SAASlhB,MAAMnC,OAAQvM,aAIhDswB,EAAkB,SAASJ,EAAUK,GAErC,GAAgC,KAA5BA,EAAWpiB,QAAQ,KAAa,CAChC,GAAIqiB,GAASD,EAAWzgB,MAAM,IAC9B,OAAOwgB,GAAgBJ,EAAUM,EAAO,IAAM,IAAMF,EAAgBJ,EAAUM,EAAO,IAGzF,GAA4B,KAAxBD,EAAWnjB,OAAO,GAAW,CAC7B,GAAIqjB,GAAOP,EAASpgB,MAAM,KAAKid,MAAM,EAAG,IAAI1e,KAAK,IAGjD,KAFAkiB,EAAaE,EAAO,IAAMF,EAEQ,KAA5BA,EAAWpiB,QAAQ,MAAe3D,GAAY+lB,GAAY,CAC5D,GAAI/lB,GAAW+lB,CACfA,GAAaA,EAAWvN,QAAQ,SAAU,KAAKA,QAAQ,iBAAkB,KAIjF,MAAOuN,IAOPF,EAAS,SAASH,EAAUK,GAE5BA,EAAaD,EAAgBJ,EAAUK,EAEvC,IAAI7xB,GAASixB,EAAQ7wB,QAAQyxB,EAC7B,KAAK7xB,EAAQ,CAET,GADAA,EAASixB,EAAQM,SAASM,GACJ,kBAAX7xB,GAAuB,CAC9B,GAAID,MACAiyB,GACAxxB,GAAIqxB,EACJI,IAAK,GACLlyB,QAASA,EACTixB,UAAU,GAGVkB,EAAM,SAASlyB,EAAQqI,GACvB,MAAOyoB,GAAUe,EAAY7xB,EAAQqI,IAGrC8pB,EAAcnyB,EAAOkyB,EAAKnyB,EAASiyB,EACvCjyB,GAAUoyB,GAAeH,EAAIjyB,QAC7BkxB,EAAQ7wB,QAAQyxB,GAAc9xB,QACvBkxB,GAAQM,SAASM,GAE5B7xB,EAASixB,EAAQ7wB,QAAQyxB,GAAc9xB,GAAWC,EAEtD,MAAOA,GA4BX4wB,GAAUO,OAIV9kB,IAAIpM,OAAO,kBAAkB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACxF,YAoDI,SAASoyB,GAAgBC,GACrB,OAAQA,EAAMtB,OAAa,IAAM,KACzBsB,EAAMC,WAAa,IAAM,KACzBD,EAAME,UAAa,IAAM,KACzBF,EAAMG,SAAa,IAAM,KACzBH,EAAMI,OAAa,IAAM,IAGrC,QAAShjB,GAAS4T,EAAO6B,EAAMwN,GAC3B,GAAI1O,MAAMpiB,UAAU6N,QAChB,MAAO4T,GAAM5T,QAAQyV,EAAMwN,EAC/B,KAAK,GAAIjvB,GAAIivB,GAAQ,EAAGjvB,EAAI4f,EAAM9hB,OAAQkC,IACtC,GAAI4f,EAAM5f,KAAOyhB,EACb,MAAOzhB,EAEf,OAAO,GAjEX,GAAIkvB,IACIve,KAAMhE,OAAOxO,UAAUwS,KACvB5E,KAAMY,OAAOxO,UAAU4N,KACvBE,MAAOQ,OAAOtO,UAAU8N,MACxB4U,QAASpU,OAAOtO,UAAU0iB,QAC1BlT,MAAOlB,OAAOtO,UAAUwP,OAE5BwhB,EAAsDvuB,SAAlCsuB,EAAKve,KAAK1T,KAAK,OAAQ,IAAI,GAC/CmyB,EAA8B,WAC1B,GAAIC,GAAI,IAER,OADAH,GAAKnjB,KAAK9O,KAAKoyB,EAAG,KACVA,EAAEC,YAGdF,IAA+BD,IAEnCxiB,OAAOxO,UAAUwS,KAAO,SAAU2I,GAC9B,GACIta,GAAMuwB,EADNtjB,EAAQijB,EAAKve,KAAKpE,MAAM7P,KAAMmB,UAElC,IAAoB,gBAAT,IAAqBoO,EAAO,CAUnC,IATKkjB,GAAqBljB,EAAMnO,OAAS,GAAKkO,EAAQC,EAAO,IAAM,KAC/DsjB,EAAK5iB,OAAOjQ,KAAK8yB,OAAQN,EAAKrO,QAAQ5jB,KAAK0xB,EAAejyB,MAAO,IAAK,KACtEwyB,EAAKrO,QAAQ5jB,KAAKqc,EAAIsR,MAAM3e,EAAM4B,OAAQ0hB,EAAI,WAC1C,IAAK,GAAIvvB,GAAI,EAAGA,EAAInC,UAAUC,OAAS,EAAGkC,IACjBY,SAAjB/C,UAAUmC,KACViM,EAAMjM,GAAKY,WAIvBlE,KAAK+yB,UAAY/yB,KAAK+yB,SAASC,aAC/B,IAAK,GAAI1vB,GAAI,EAAGA,EAAIiM,EAAMnO,OAAQkC,IAC9BhB,EAAOtC,KAAK+yB,SAASC,aAAa1vB,EAAI,GAClChB,IACDiN,EAAMjN,GAAQiN,EAAMjM,KAG1BovB,GAA+B1yB,KAAK4wB,SAAWrhB,EAAM,GAAGnO,QAAWpB,KAAK4yB,UAAYrjB,EAAM4B,OAC3FnR,KAAK4yB,YAEb,MAAOrjB,IAENmjB,IACDziB,OAAOxO,UAAU4N,KAAO,SAAUuN,GAC9B,GAAIrN,GAAQijB,EAAKve,KAAK1T,KAAKP,KAAM4c,EAGjC,OAFIrN,IAASvP,KAAK4wB,SAAWrhB,EAAM,GAAGnO,QAAWpB,KAAK4yB,UAAYrjB,EAAM4B,OACpEnR,KAAK4yB,cACArjB,OAwBrBrD,IAAIpM,OAAO,oBAAoB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GAE1F,QAASozB,MA8cT,QAASC,GAAuBpjB,GAC5B,IAEI,MADAO,QAAO8iB,eAAerjB,EAAQ,eACvB,YAAcA,GACvB,MAAOsjB,KAkLb,QAASC,GAAUxT,GAOf,MANAA,IAAKA,EACDA,IAAMA,EACNA,EAAI,EACS,IAANA,GAAWA,IAAO,EAAE,GAAMA,MAAQ,EAAE,KAC3CA,GAAKA,EAAI,GAAK,IAAMtX,KAAK+qB,MAAM/qB,KAAKK,IAAIiX,KAErCA,EAzoBN/a,SAASrD,UAAU0uB,OACpBrrB,SAASrD,UAAU0uB,KAAO,SAAcoD,GACpC,GAAIlqB,GAASrJ,IACb,IAAqB,kBAAVqJ,GACP,KAAM,IAAImqB,WAAU,kDAAoDnqB,EAE5E,IAAIsG,GAAOue,EAAM3tB,KAAKY,UAAW,GAC7BsyB,EAAQ,WAER,GAAIzzB,eAAgByzB,GAAO,CAEvB,GAAIC,GAASrqB,EAAOwG,MAChB7P,KACA2P,EAAKgM,OAAOuS,EAAM3tB,KAAKY,YAE3B,OAAIkP,QAAOqjB,KAAYA,EACZA,EAEJ1zB,KAGP,MAAOqJ,GAAOwG,MACV0jB,EACA5jB,EAAKgM,OAAOuS,EAAM3tB,KAAKY,aAWnC,OALGkI,GAAO5H,YACNwxB,EAAMxxB,UAAY4H,EAAO5H,UACzBgyB,EAAMhyB,UAAY,GAAIwxB,GACtBA,EAAMxxB,UAAY,MAEfgyB,GAGf,IAMIE,GACAC,EACAC,EACAC,EACAC,EAVAxzB,EAAOuE,SAASrD,UAAUlB,KAC1ByzB,EAAmBnQ,MAAMpiB,UACzBwyB,EAAoB5jB,OAAO5O,UAC3BysB,EAAQ8F,EAAiB9F,MACzBgG,EAAY3zB,EAAK4vB,KAAK8D,EAAkB3jB,UACxC6jB,EAAO5zB,EAAK4vB,KAAK8D,EAAkBtvB,eAYvC,KANKovB,EAAoBI,EAAKF,EAAmB,uBAC7CN,EAAepzB,EAAK4vB,KAAK8D,EAAkBG,kBAC3CR,EAAerzB,EAAK4vB,KAAK8D,EAAkBI,kBAC3CR,EAAetzB,EAAK4vB,KAAK8D,EAAkBK,kBAC3CR,EAAevzB,EAAK4vB,KAAK8D,EAAkBM,mBAEjB,IAAzB,EAAE,GAAGnjB,OAAO,GAAGhQ,OAChB,GAAG,WACC,QAASozB,GAAUlD,GACf,GAAI7hB,GAAI,GAAIoU,OAAMyN,EAAE,EAEpB,OADA7hB,GAAE,GAAKA,EAAE,GAAK,EACPA,EAEX,GAAgBglB,GAAZvR,IAUJ,OARAA,GAAM9R,OAAOvB,MAAMqT,EAAOsR,EAAU,KACpCtR,EAAM9R,OAAOvB,MAAMqT,EAAOsR,EAAU,KAEpCC,EAAevR,EAAM9hB,OACrB8hB,EAAM9R,OAAO,EAAG,EAAG,OAEnBqjB,EAAe,GAAKvR,EAAM9hB,OAEtBqzB,EAAe,GAAKvR,EAAM9hB,QACnB,EADX,UAGC,CACD,GAAIszB,GAAe7Q,MAAMpiB,UAAU2P,MACnCyS,OAAMpiB,UAAU2P,OAAS,SAASujB,EAAOC,GACrC,MAAKzzB,WAAUC,OAGJszB,EAAa7kB,MAAM7P,MACZ,SAAV20B,EAAmB,EAAIA,EACP,SAAhBC,EAA0B50B,KAAKoB,OAASuzB,EAASC,GACnDjZ,OAAOuS,EAAM3tB,KAAKY,UAAW,aAIvC0iB,OAAMpiB,UAAU2P,OAAS,SAASyjB,EAAKC,GACnC,GAAI1zB,GAASpB,KAAKoB,MACdyzB,GAAM,EACFA,EAAMzzB,IACNyzB,EAAMzzB,GACI,QAAPyzB,EACPA,EAAM,EACO,EAANA,IACPA,EAAMtsB,KAAKE,IAAIrH,EAASyzB,EAAK,IAGTzzB,EAAlByzB,EAAIC,IACNA,EAAc1zB,EAASyzB,EAE3B,IAAIE,GAAU/0B,KAAKkuB,MAAM2G,EAAKA,EAAIC,GAC9BE,EAAS9G,EAAM3tB,KAAKY,UAAW,GAC/BsF,EAAMuuB,EAAO5zB,MACjB,IAAIyzB,IAAQzzB,EACJqF,GACAzG,KAAKgP,KAAKa,MAAM7P,KAAMg1B,OAEvB,CACH,GAAIC,GAAS1sB,KAAKC,IAAIssB,EAAa1zB,EAASyzB,GACxCK,EAAaL,EAAMI,EACnBE,EAAaD,EAAazuB,EAAMwuB,EAChCG,EAAYh0B,EAAS8zB,EACrBG,EAAoBj0B,EAAS6zB,CAEjC,IAAiBC,EAAbC,EACA,IAAK,GAAI7xB,GAAI,EAAO8xB,EAAJ9xB,IAAiBA,EAC7BtD,KAAKm1B,EAAW7xB,GAAKtD,KAAKk1B,EAAW5xB,OAEtC,IAAI6xB,EAAaD,EACpB,IAAK5xB,EAAI8xB,EAAW9xB,KAChBtD,KAAKm1B,EAAW7xB,GAAKtD,KAAKk1B,EAAW5xB,EAI7C,IAAImD,GAAOouB,IAAQQ,EACfr1B,KAAKoB,OAASi0B,EACdr1B,KAAKgP,KAAKa,MAAM7P,KAAMg1B,OAGtB,KADAh1B,KAAKoB,OAASi0B,EAAoB5uB,EAC7BnD,EAAI,EAAOmD,EAAJnD,IAAWA,EACnBtD,KAAK60B,EAAIvxB,GAAK0xB,EAAO1xB,GAIjC,MAAOyxB,GAIdlR,OAAMrgB,UACPqgB,MAAMrgB,QAAU,SAAiB4M,GAC7B,MAAyB,kBAAlB8jB,EAAU9jB,IAGzB,IAAIklB,GAAcjlB,OAAO,KACrBklB,EAAgC,KAAlBD,EAAY,MAAe,IAAKA,GAgPlD,IA9OKzR,MAAMpiB,UAAU0Y,UACjB0J,MAAMpiB,UAAU0Y,QAAU,SAAiBqb,GACvC,GAAI1lB,GAAS2lB,EAASz1B,MAClB2sB,EAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXnB,EACJ4lB,EAAQv0B,UAAU,GAClBmC,EAAI,GACJlC,EAASurB,EAAKvrB,SAAW,CAC7B,IAAsB,qBAAlB8yB,EAAUsB,GACV,KAAM,IAAIhC,UAGd,QAASlwB,EAAIlC,GACLkC,IAAKqpB,IACL6I,EAAIj1B,KAAKm1B,EAAO/I,EAAKrpB,GAAIA,EAAGwM,KAKvC+T,MAAMpiB,UAAUk0B,MACjB9R,MAAMpiB,UAAUk0B,IAAM,SAAaH,GAC/B,GAAI1lB,GAAS2lB,EAASz1B,MAClB2sB,EAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXnB,EACJ1O,EAASurB,EAAKvrB,SAAW,EACzBsyB,EAAS7P,MAAMziB,GACfs0B,EAAQv0B,UAAU,EACtB,IAAsB,qBAAlB+yB,EAAUsB,GACV,KAAM,IAAIhC,WAAUgC,EAAM,qBAG9B,KAAK,GAAIlyB,GAAI,EAAOlC,EAAJkC,EAAYA,IACpBA,IAAKqpB,KACL+G,EAAOpwB,GAAKkyB,EAAIj1B,KAAKm1B,EAAO/I,EAAKrpB,GAAIA,EAAGwM,GAEhD,OAAO4jB,KAGV7P,MAAMpiB,UAAUm0B,SACjB/R,MAAMpiB,UAAUm0B,OAAS,SAAgBJ,GACrC,GAMIrwB,GANA2K,EAAS2lB,EAASz1B,MAClB2sB,EAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACPnB,EACR1O,EAASurB,EAAKvrB,SAAW,EACzBsyB,KAEAgC,EAAQv0B,UAAU,EACtB,IAAsB,qBAAlB+yB,EAAUsB,GACV,KAAM,IAAIhC,WAAUgC,EAAM,qBAG9B,KAAK,GAAIlyB,GAAI,EAAOlC,EAAJkC,EAAYA,IACpBA,IAAKqpB,KACLxnB,EAAQwnB,EAAKrpB,GACTkyB,EAAIj1B,KAAKm1B,EAAOvwB,EAAO7B,EAAGwM,IAC1B4jB,EAAO1kB,KAAK7J,GAIxB,OAAOuuB,KAGV7P,MAAMpiB,UAAUo0B,QACjBhS,MAAMpiB,UAAUo0B,MAAQ,SAAeL,GACnC,GAAI1lB,GAAS2lB,EAASz1B,MAClB2sB,EAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXnB,EACJ1O,EAASurB,EAAKvrB,SAAW,EACzBs0B,EAAQv0B,UAAU,EACtB,IAAsB,qBAAlB+yB,EAAUsB,GACV,KAAM,IAAIhC,WAAUgC,EAAM,qBAG9B,KAAK,GAAIlyB,GAAI,EAAOlC,EAAJkC,EAAYA,IACxB,GAAIA,IAAKqpB,KAAS6I,EAAIj1B,KAAKm1B,EAAO/I,EAAKrpB,GAAIA,EAAGwM,GAC1C,OAAO,CAGf,QAAO,IAGV+T,MAAMpiB,UAAUq0B,OACjBjS,MAAMpiB,UAAUq0B,KAAO,SAAcN,GACjC,GAAI1lB,GAAS2lB,EAASz1B,MAClB2sB,EAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXnB,EACJ1O,EAASurB,EAAKvrB,SAAW,EACzBs0B,EAAQv0B,UAAU,EACtB,IAAsB,qBAAlB+yB,EAAUsB,GACV,KAAM,IAAIhC,WAAUgC,EAAM,qBAG9B,KAAK,GAAIlyB,GAAI,EAAOlC,EAAJkC,EAAYA,IACxB,GAAIA,IAAKqpB,IAAQ6I,EAAIj1B,KAAKm1B,EAAO/I,EAAKrpB,GAAIA,EAAGwM,GACzC,OAAO,CAGf,QAAO,IAGV+T,MAAMpiB,UAAUs0B,SACjBlS,MAAMpiB,UAAUs0B,OAAS,SAAgBP,GACrC,GAAI1lB,GAAS2lB,EAASz1B,MAClB2sB,EAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXnB,EACJ1O,EAASurB,EAAKvrB,SAAW,CAC7B,IAAsB,qBAAlB8yB,EAAUsB,GACV,KAAM,IAAIhC,WAAUgC,EAAM,qBAE9B,KAAKp0B,GAA8B,GAApBD,UAAUC,OACrB,KAAM,IAAIoyB,WAAU,8CAGxB,IACIE,GADApwB,EAAI,CAER,IAAInC,UAAUC,QAAU,EACpBsyB,EAASvyB,UAAU,OAEnB,QAAG,CACC,GAAImC,IAAKqpB,GAAM,CACX+G,EAAS/G,EAAKrpB,IACd,OAEJ,KAAMA,GAAKlC,EACP,KAAM,IAAIoyB,WAAU,+CAKhC,KAAWpyB,EAAJkC,EAAYA,IACXA,IAAKqpB,KACL+G,EAAS8B,EAAIj1B,KAAK,OAAQmzB,EAAQ/G,EAAKrpB,GAAIA,EAAGwM,GAItD,OAAO4jB,KAGV7P,MAAMpiB,UAAUu0B,cACjBnS,MAAMpiB,UAAUu0B,YAAc,SAAqBR,GAC/C,GAAI1lB,GAAS2lB,EAASz1B,MAClB2sB,EAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXnB,EACJ1O,EAASurB,EAAKvrB,SAAW,CAC7B,IAAsB,qBAAlB8yB,EAAUsB,GACV,KAAM,IAAIhC,WAAUgC,EAAM,qBAE9B,KAAKp0B,GAA8B,GAApBD,UAAUC,OACrB,KAAM,IAAIoyB,WAAU,mDAGxB,IAAIE,GAAQpwB,EAAIlC,EAAS,CACzB,IAAID,UAAUC,QAAU,EACpBsyB,EAASvyB,UAAU,OAEnB,QAAG,CACC,GAAImC,IAAKqpB,GAAM,CACX+G,EAAS/G,EAAKrpB,IACd,OAEJ,KAAMA,EAAI,EACN,KAAM,IAAIkwB,WAAU,oDAKhC,EACQlwB,KAAKtD,QACL0zB,EAAS8B,EAAIj1B,KAAK,OAAQmzB,EAAQ/G,EAAKrpB,GAAIA,EAAGwM,UAE7CxM,IAET,OAAOowB,KAGV7P,MAAMpiB,UAAU6N,SAAoC,KAAvB,EAAG,GAAGA,QAAQ,EAAG,KAC/CuU,MAAMpiB,UAAU6N,QAAU,SAAiB2mB,GACvC,GAAItJ,GAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXwkB,EAASz1B,MACboB,EAASurB,EAAKvrB,SAAW,CAE7B,KAAKA,EACD,MAAO,EAGX,IAAIkC,GAAI,CAKR,KAJInC,UAAUC,OAAS,IACnBkC,EAAI+vB,EAAUlyB,UAAU,KAE5BmC,EAAIA,GAAK,EAAIA,EAAIiF,KAAKE,IAAI,EAAGrH,EAASkC,GAC3BlC,EAAJkC,EAAYA,IACf,GAAIA,IAAKqpB,IAAQA,EAAKrpB,KAAO2yB,EACzB,MAAO3yB,EAGf,OAAO,KAGVugB,MAAMpiB,UAAUy0B,aAA6C,KAA5B,EAAG,GAAGA,YAAY,EAAG,MACvDrS,MAAMpiB,UAAUy0B,YAAc,SAAqBD,GAC/C,GAAItJ,GAAO4I,GAAkC,mBAAnBrB,EAAUl0B,MAC5BA,KAAKiR,MAAM,IACXwkB,EAASz1B,MACboB,EAASurB,EAAKvrB,SAAW,CAE7B,KAAKA,EACD,MAAO,EAEX,IAAIkC,GAAIlC,EAAS,CAKjB,KAJID,UAAUC,OAAS,IACnBkC,EAAIiF,KAAKC,IAAIlF,EAAG+vB,EAAUlyB,UAAU,MAExCmC,EAAIA,GAAK,EAAIA,EAAIlC,EAASmH,KAAKK,IAAItF,GAC5BA,GAAK,EAAGA,IACX,GAAIA,IAAKqpB,IAAQsJ,IAAWtJ,EAAKrpB,GAC7B,MAAOA,EAGf,OAAO,KAGV+M,OAAO8lB,iBACR9lB,OAAO8lB,eAAiB,SAAwBrmB,GAC5C,MAAOA,GAAOsmB,YACVtmB,EAAOumB,YACPvmB,EAAOumB,YAAY50B,UACnBwyB,MAIP5jB,OAAOimB,yBAA0B,CAClC,GAAIC,GAAiB,0DAErBlmB,QAAOimB,yBAA2B,SAAkCxmB,EAAQ0mB,GACxE,GAAsB,gBAAV1mB,IAAuC,kBAAVA,IAAoC,OAAXA,EAC9D,KAAM,IAAI0jB,WAAU+C,EAAiBzmB,EACzC,IAAKqkB,EAAKrkB,EAAQ0mB,GAAlB,CAGA,GAAIC,GAAYC,EAAQC,CAExB,IADAF,GAAgBG,YAAY,EAAMC,cAAc,GAC5C9C,EAAmB,CACnB,GAAItyB,GAAYqO,EAAOsmB,SACvBtmB,GAAOsmB,UAAYnC,CAEnB,IAAIyC,GAAS7C,EAAa/jB,EAAQ0mB,GAC9BG,EAAS7C,EAAahkB,EAAQ0mB,EAGlC,IAFA1mB,EAAOsmB,UAAY30B,EAEfi1B,GAAUC,EAGV,MAFID,KAAQD,EAAW30B,IAAM40B,GACzBC,IAAQF,EAAW50B,IAAM80B,GACtBF,EAIf,MADAA,GAAWtxB,MAAQ2K,EAAO0mB,GACnBC,IAQf,GALKpmB,OAAOymB,sBACRzmB,OAAOymB,oBAAsB,SAA6BhnB,GACtD,MAAOO,QAAO0mB,KAAKjnB,MAGtBO,OAAOvN,OAAQ,CAChB,GAAIk0B,EAEAA,GAD+B,OAA/B3mB,OAAO5O,UAAU20B,UACH,WACV,OAASA,UAAa,OAGZ,WACV,GAAIa,KACJ,KAAK,GAAI3zB,KAAK2zB,GACVA,EAAM3zB,GAAK,IASf,OARA2zB,GAAMZ,YACNY,EAAMtyB,eACNsyB,EAAMC,qBACND,EAAME,cACNF,EAAMG,eACNH,EAAM3mB,SACN2mB,EAAMI,QACNJ,EAAMb,UAAY,KACXa,GAIf5mB,OAAOvN,OAAS,SAAgBrB,EAAW61B,GACvC,GAAIxnB,EACJ,IAAkB,OAAdrO,EACAqO,EAASknB,QACN,CACH,GAAwB,gBAAbv1B,GACP,KAAM,IAAI+xB,WAAU,0BAA4B/xB,GAAW,gBAC/D,IAAI81B,GAAO,YACXA,GAAK91B,UAAYA,EACjBqO,EAAS,GAAIynB,GACbznB,EAAOsmB,UAAY30B,EAIvB,MAFmB,UAAf61B,GACAjnB,OAAOmnB,iBAAiB1nB,EAAQwnB,GAC7BxnB,GAWf,GAAIO,OAAO8iB,eAAgB,CACvB,GAAIsE,GAA8BvE,MAC9BwE,EAA8C,mBAAZzuB,WAClCiqB,EAAuBjqB,SAASC,cAAc,OAClD,KAAKuuB,IAAgCC,EACjC,GAAIC,GAAyBtnB,OAAO8iB,eAI5C,IAAK9iB,OAAO8iB,gBAAkBwE,EAAwB,CAClD,GAAIC,GAA4B,2CAC5BC,EAAwB,+CACxBC,EAA8B,gEAGlCznB,QAAO8iB,eAAiB,SAAwBrjB,EAAQ0mB,EAAUC,GAC9D,GAAsB,gBAAV3mB,IAAuC,kBAAVA,IAAoC,OAAXA,EAC9D,KAAM,IAAI0jB,WAAUqE,EAAwB/nB,EAChD,IAA0B,gBAAd2mB,IAA+C,kBAAdA,IAA4C,OAAfA,EACtE,KAAM,IAAIjD,WAAUoE,EAA4BnB,EACpD,IAAIkB,EACA,IACI,MAAOA,GAAuBp3B,KAAK8P,OAAQP,EAAQ0mB,EAAUC,GAC/D,MAAOrD,IAGb,GAAIe,EAAKsC,EAAY,SAEjB,GAAI1C,IAAsBF,EAAa/jB,EAAQ0mB,IACrB1C,EAAahkB,EAAQ0mB,IAC/C,CACI,GAAI/0B,GAAYqO,EAAOsmB,SACvBtmB,GAAOsmB,UAAYnC,QACZnkB,GAAO0mB,GACd1mB,EAAO0mB,GAAYC,EAAWtxB,MAC9B2K,EAAOsmB,UAAY30B,MAEnBqO,GAAO0mB,GAAYC,EAAWtxB,UAE/B,CACH,IAAK4uB,EACD,KAAM,IAAIP,WAAUsE,EACpB3D,GAAKsC,EAAY,QACjB9C,EAAa7jB,EAAQ0mB,EAAUC,EAAW30B,KAC1CqyB,EAAKsC,EAAY,QACjB7C,EAAa9jB,EAAQ0mB,EAAUC,EAAW50B,KAGlD,MAAOiO,IAGVO,OAAOmnB,mBACRnnB,OAAOmnB,iBAAmB,SAA0B1nB,EAAQwnB,GACxD,IAAK,GAAId,KAAYc,GACbnD,EAAKmD,EAAYd,IACjBnmB,OAAO8iB,eAAerjB,EAAQ0mB,EAAUc,EAAWd,GAE3D,OAAO1mB,KAGVO,OAAO0nB,OACR1nB,OAAO0nB,KAAO,SAAcjoB,GACxB,MAAOA,KAGVO,OAAO2nB,SACR3nB,OAAO2nB,OAAS,SAAgBloB,GAC5B,MAAOA,IAGf,KACIO,OAAO2nB,OAAO,cAChB,MAAO5E,GACL/iB,OAAO2nB,OAAS,SAAiBC,GAC7B,MAAO,UAAgBnoB,GACnB,MAAqB,kBAAVA,GACAA,EAEAmoB,EAAanoB,KAG7BO,OAAO2nB,QAgCd,GA9BK3nB,OAAO6nB,oBACR7nB,OAAO6nB,kBAAoB,SAA2BpoB,GAClD,MAAOA,KAGVO,OAAO8nB,WACR9nB,OAAO8nB,SAAW,SAAkBroB,GAChC,OAAO,IAGVO,OAAO+nB,WACR/nB,OAAO+nB,SAAW,SAAkBtoB,GAChC,OAAO,IAGVO,OAAOgoB,eACRhoB,OAAOgoB,aAAe,SAAsBvoB,GACxC,GAAIO,OAAOP,KAAYA,EACnB,KAAM,IAAI0jB,UAGd,KADA,GAAIlxB,GAAO,GACJ6xB,EAAKrkB,EAAQxN,IAChBA,GAAQ,GAEZwN,GAAOxN,IAAQ,CACf,IAAI0vB,GAAcmC,EAAKrkB,EAAQxN,EAE/B,cADOwN,GAAOxN,GACP0vB,KAGV3hB,OAAO0mB,KAAM,CACd,GAAIuB,IAAiB,EACjBC,GACI,WACA,iBACA,UACA,iBACA,gBACA,uBACA,eAEJC,EAAkBD,EAAUn3B,MAEhC,KAAK,GAAI+N,MAAQmB,SAAY,MACzBgoB,GAAiB,CAGrBjoB,QAAO0mB,KAAO,QAASA,GAAKjnB,GAExB,GACsB,gBAAVA,IAAuC,kBAAVA,IAC1B,OAAXA,EAEA,KAAM,IAAI0jB,WAAU,qCAGxB,IAAIuD,KACJ,KAAK,GAAIz0B,KAAQwN,GACTqkB,EAAKrkB,EAAQxN,IACby0B,EAAK/nB,KAAK1M,EAIlB,IAAIg2B,EACA,IAAK,GAAIh1B,GAAI,EAAGoL,EAAK8pB,EAAqB9pB,EAAJpL,EAAQA,IAAK,CAC/C,GAAIm1B,GAAWF,EAAUj1B,EACrB6wB,GAAKrkB,EAAQ2oB,IACb1B,EAAK/nB,KAAKypB,GAItB,MAAO1B,IAIVzf,KAAKohB,MACNphB,KAAKohB,IAAM,WACP,OAAO,GAAIphB,OAAOqhB,WAG1B,IAAIC,GAAK,8CAGT,KAAK7oB,OAAOtO,UAAUo3B,MAAQD,EAAGC,OAAQ,CACrCD,EAAK,IAAMA,EAAK,GAChB,IAAIE,GAAkB,GAAI7oB,QAAO,IAAM2oB,EAAKA,EAAK,KAC7CG,EAAgB,GAAI9oB,QAAO2oB,EAAKA,EAAK,KACzC7oB,QAAOtO,UAAUo3B,KAAO,WACpB,MAAO9oB,QAAO/P,MAAMmkB,QAAQ2U,EAAiB,IAAI3U,QAAQ4U,EAAe,KA8ChF,GAAItD,GAAW,SAAUuD,GACrB,GAAS,MAALA,EACA,KAAM,IAAIxF,WAAU,iBAAiBwF,EAAE,aAE3C,OAAO3oB,QAAO2oB,MAKlB9sB,IAAIpM,OAAO,0BAA0B,UAAU,UAAU,SAAS,iBAAiB,oBAAqB,SAASswB,EAAUxwB,EAASC,GACpI,YAEAuwB,GAAS,YACTA,EAAS,gBAITlkB,IAAIpM,OAAO,eAAe,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACrF,YAEA,IAAuB,mBAAZoJ,UAAX,CAGA,GAAIgwB,GAAW,8BAEfr5B,GAAQs5B,gBAAkB,SAASC,GAG/B,MAFKA,KACDA,EAAMlwB,UACHkwB,EAAIC,MAAQD,EAAIE,qBAAqB,QAAQ,IAAMF,EAAIG,iBAGlE15B,EAAQsJ,cAAgB,SAASqwB,EAAK7I,GAClC,MAAOznB,UAASuwB,gBACTvwB,SAASuwB,gBAAgB9I,GAAMuI,EAAUM,GACzCtwB,SAASC,cAAcqwB,IAGlC35B,EAAQ65B,YAAc,SAASC,EAAIp3B,GAC/B,GAAI0O,IAAW0oB,EAAGvwB,WAAa,IAAI8H,MAAM,OACzC,OAAiC,KAA1BD,EAAQ1B,QAAQhN,IAE3B1C,EAAQ+5B,YAAc,SAASD,EAAIp3B,GAC1B1C,EAAQ65B,YAAYC,EAAIp3B,KACzBo3B,EAAGvwB,WAAa,IAAM7G,IAG9B1C,EAAQg6B,eAAiB,SAASF,EAAIp3B,GAElC,IADA,GAAI0O,GAAU0oB,EAAGvwB,UAAU8H,MAAM,UACpB,CACT,GAAIE,GAAQH,EAAQ1B,QAAQhN,EAC5B,IAAa,IAAT6O,EACA,KAEJH,GAAQI,OAAOD,EAAO,GAE1BuoB,EAAGvwB,UAAY6H,EAAQxB,KAAK,MAGhC5P,EAAQi6B,eAAiB,SAASH,EAAIp3B,GAElC,IADA,GAAI0O,GAAU0oB,EAAGvwB,UAAU8H,MAAM,QAASxK,GAAM,IACnC,CACT,GAAI0K,GAAQH,EAAQ1B,QAAQhN,EAC5B,IAAa,IAAT6O,EACA,KAEJ1K,IAAM,EACNuK,EAAQI,OAAOD,EAAO,GAM1B,MAJG1K,IACCuK,EAAQhC,KAAK1M,GAEjBo3B,EAAGvwB,UAAY6H,EAAQxB,KAAK,KACrB/I,GAEX7G,EAAQk6B,YAAc,SAAS10B,EAAM+D,EAAW4wB,GACxCA,EACAn6B,EAAQ+5B,YAAYv0B,EAAM+D,GAE1BvJ,EAAQg6B,eAAex0B,EAAM+D,IAIrCvJ,EAAQo6B,aAAe,SAAS35B,EAAI84B,GAChC,GAAec,GAAX9oB,EAAQ,CAGZ,IAFAgoB,EAAMA,GAAOlwB,SAETkwB,EAAIe,mBAAqBD,EAASd,EAAIgB,cACtC,KAAOhpB,EAAQ8oB,EAAO74B,QAClB,GAAI64B,EAAO9oB,KAASipB,cAAc/5B,KAAOA,EAAI,OAAO,MACrD,IAAK45B,EAASd,EAAIE,qBAAqB,SAC1C,KAAOloB,EAAQ8oB,EAAO74B,QAClB,GAAI64B,EAAO9oB,KAAS9Q,KAAOA,EAAI,OAAO,CAG9C,QAAO,GAGXT,EAAQ4wB,gBAAkB,SAAyBD,EAASlwB,EAAI84B,GAE5D,GADAA,EAAMA,GAAOlwB,SACT5I,GAAMT,EAAQo6B,aAAa35B,EAAI84B,GAC/B,MAAO,KAEX,IAAIrsB,EAEAqsB,GAAIe,kBACJptB,EAAQqsB,EAAIe,mBACZptB,EAAMyjB,QAAUA,EACZlwB,IACAyM,EAAMstB,cAAc/5B,GAAKA,KAE7ByM,EAAQqsB,EAAIK,gBACNL,EAAIK,gBAAgBP,EAAU,SAC9BE,EAAIjwB,cAAc,SAExB4D,EAAMtH,YAAY2zB,EAAI3rB,eAAe+iB,IACjClwB,IACAyM,EAAMzM,GAAKA,GAEfT,EAAQs5B,gBAAgBC,GAAK3zB,YAAYsH,KAIjDlN,EAAQy6B,mBAAqB,SAASvI,EAAKqH,GACvC,GAAIA,EAAIe,iBACJf,EAAIe,iBAAiBpI,OAClB,CACH,GAAIwI,GAAO16B,EAAQsJ,cAAc,OACjCoxB,GAAKC,IAAM,aACXD,EAAK7sB,KAAOqkB,EAEZlyB,EAAQs5B,gBAAgBC,GAAK3zB,YAAY80B,KAIjD16B,EAAQ46B,cAAgB,SAASvnB,GAC7B,MACIwnB,UAAS76B,EAAQ86B,cAAcznB,EAAS,eAAgB,IACxDwnB,SAAS76B,EAAQ86B,cAAcznB,EAAS,gBAAiB,IACzDA,EAAQzG,aAIhB5M,EAAQ+6B,eAAiB,SAAS1nB,GAC9B,MACIwnB,UAAS76B,EAAQ86B,cAAcznB,EAAS,cAAe,IACvDwnB,SAAS76B,EAAQ86B,cAAcznB,EAAS,iBAAkB,IAC1DA,EAAQhM,cAIW/C,SAAvBwJ,OAAOoD,aACPlR,EAAQg7B,iBAAmB,WACvB,MAAOltB,QAAOoD,aAGlBlR,EAAQi7B,kBAAoB,WACxB,MAAOntB,QAAOkD,eAIlBhR,EAAQg7B,iBAAmB,WACvB,MAAO3xB,UAASgV,KAAK5W,WAGzBzH,EAAQi7B,kBAAoB,WACxB,MAAO5xB,UAASgV,KAAKpN,aAIzBnD,OAAOotB,iBACPl7B,EAAQ86B,cAAgB,SAASznB,EAASnG,GACtC,MAAIA,IACQY,OAAOotB,iBAAiB7nB,EAAS,SAAWnG,IAAU,GAC3DY,OAAOotB,iBAAiB7nB,EAAS,SAG5CrT,EAAQ86B,cAAgB,SAASznB,EAASnG,GACtC,MAAIA,GACOmG,EAAQ8nB,aAAajuB,GACzBmG,EAAQ8nB,cAGvBn7B,EAAQo7B,eAAiB,SAAS/xB,GAC9B,GAAIgyB,GAAQr7B,EAAQsJ,cAAc,YAClC+xB,GAAMnuB,MAAMb,MAAQ,OACpBgvB,EAAMnuB,MAAMouB,SAAW,MACvBD,EAAMnuB,MAAM9F,OAAS,QACrBi0B,EAAMnuB,MAAM0a,QAAU,OAEtB,IAAI2T,GAAQv7B,EAAQsJ,cAAc,aAC9B4D,EAAQquB,EAAMruB,KAElBA,GAAMsuB,SAAW,WACjBtuB,EAAM6D,KAAO,WACb7D,EAAMuZ,SAAW,SACjBvZ,EAAMb,MAAQ,QACda,EAAMouB,SAAW,MACjBpuB,EAAM9F,OAAS,QACf8F,EAAM0a,QAAU,QAEhB2T,EAAM31B,YAAYy1B,EAElB,IAAIhd,GAAOhV,EAASqwB,eACpBrb,GAAKzY,YAAY21B,EAEjB,IAAIE,GAAcJ,EAAMK,WAExBxuB,GAAMuZ,SAAW,QACjB,IAAIkV,GAAgBN,EAAMK,WAQ1B,OANID,IAAeE,IACfA,EAAgBJ,EAAM3uB,aAG1ByR,EAAKxZ,YAAY02B,GAEVE,EAAYE,GAEvB37B,EAAQ47B,aAAe,SAAS9B,EAAI+B,GAChC,GAAIxoB,GAAUymB,EAAGgC,WAAU,EAG3B,OAFAzoB,GAAQiG,UAAYuiB,EACpB/B,EAAGl1B,WAAWm3B,aAAa1oB,EAASymB,GAC7BzmB,GAGP,eAAiBhK,UAASqwB,iBAC1B15B,EAAQg8B,aAAe,SAASlC,EAAInmB,GAChCmmB,EAAGmC,YAActoB,GAGrB3T,EAAQoT,aAAe,SAAS0mB,GAC5B,MAAOA,GAAGmC,eAIdj8B,EAAQg8B,aAAe,SAASlC,EAAInmB,GAChCmmB,EAAGnmB,UAAYA,GAGnB3T,EAAQoT,aAAe,SAAS0mB,GAC5B,MAAOA,GAAGnmB,YAIlB3T,EAAQk8B,gBAAkB,SAAS7yB,GAC/B,MAAOA,GAAS8yB,aAAe9yB,EAAS+yB,iBAK5C9vB,IAAIpM,OAAO,eAAe,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACrF,YAEAD,GAAQq8B,SAAW,SAASC,EAAMC,GAC9BD,EAAKE,OAASD,EACdD,EAAKz6B,UAAY4O,OAAOvN,OAAOq5B,EAAU16B,WACrC40B,aACIlxB,MAAO+2B,EACPtF,YAAY,EACZyF,UAAU,EACVxF,cAAc,MAK1Bj3B,EAAQiD,MAAQ,SAASuN,EAAKvN,GAC1B,IAAK,GAAIsM,KAAOtM,GACZuN,EAAIjB,GAAOtM,EAAMsM,EAErB,OAAOiB,IAGXxQ,EAAQ08B,UAAY,SAASC,EAAO15B,GAChCjD,EAAQiD,MAAM05B,EAAO15B,MAKzBqJ,IAAIpM,OAAO,gBAAgB,UAAU,UAAU,SAAS,yBAAyB,eAAgB,SAASswB,EAAUxwB,EAASC,GAC7H,YAEAuwB,GAAS,mBAET,IAAIoM,GAAMpM,EAAS,SACfqM,EAAO,WACP,GAkEIn6B,GAAMgB,EAlENo5B,GACAC,eACI9Q,GAAI,QAASvB,GAAI,OAAQC,GAAI,MAAOqS,IAAK,QAG7CC,UACIC,KAAQ,EAAGC,IAAO,EAAGC,OAAW,EAAGC,MAAS,EAC5CC,QAAS,EAAGC,KAAQ,EAAGC,QAAW,EAAGC,IAAO,GAGhDC,eACIpT,EAAK,YACLuB,EAAK,MACLE,GAAK,SACLI,GAAK,QACLwR,GAAK,MACLC,GAAK,QACLC,GAAK,SACLC,GAAK,WACLC,GAAK,MACLC,GAAK,OACLC,GAAK,OACLC,GAAK,KACLC,GAAK,QACLC,GAAK,OACLC,GAAK,QACLC,GAAK,SACLC,GAAK,SACLC,GAAK,UACLC,GAAK,UACLC,GAAK,UACLC,GAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACLC,IAAK,UACLC,MAAO,cACPC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,UACLC,IAAK,cAGTC,gBACGrC,GAAI,IAAMsC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,GAAK,IAChEC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAMC,GAAI,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IACjEC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IAAKC,IAAK,IACjEC,IAAK,KAAKC,IAAK,IAAKC,IAAK,KAI/B,KAAK1/B,IAAKo5B,GAAIY,cACVh7B,EAAOo6B,EAAIY,cAAch6B,GAAGgY,cAC5BohB,EAAIp6B,GAAQm4B,SAASn3B,EAAG,GAE5B,KAAKA,IAAKo5B,GAAImD,eACVv9B,EAAOo6B,EAAImD,eAAev8B,GAAGgY,cAC7BohB,EAAIp6B,GAAQm4B,SAASn3B,EAAG,GAsB5B,OApBAk5B,GAAI35B,MAAM65B,EAAKA,EAAIC,eACnBH,EAAI35B,MAAM65B,EAAKA,EAAImD,gBACnBrD,EAAI35B,MAAM65B,EAAKA,EAAIY,eACnBZ,EAAIuG,MAAQvG,EAAI,UAChBA,EAAIwG,OAASxG,EAAIyG,IACjBzG,EAAI0G,IAAM1G,EAAI,UACdA,EAAI,KAAO,IAEX,WAEI,IAAK,GADD2G,IAAQ,MAAO,OAAQ,MAAO,SACzB//B,EAAIiF,KAAK+6B,IAAI,EAAGD,EAAKjiC,QAASkC,KACnCo5B,EAAIG,SAASv5B,GAAK+/B,EAAKzN,OAAO,SAASjD,GACnC,MAAOrvB,GAAIo5B,EAAIG,SAASlK,KACzBnjB,KAAK,KAAO,OAIvBktB,EAAIG,SAAS,GAAK,GAClBH,EAAIG,SAAS,IAAM,QAEZH,IAEXF,GAAI35B,MAAMjD,EAAS68B,GAEnB78B,EAAQ2jC,gBAAkB,SAASl4B,GAC/B,GAAIm4B,GAAY/G,EAAKpxB,EAGrB,OAFwB,gBAAbm4B,KACPA,EAAYzzB,OAAO0zB,aAAap4B,IAC7Bm4B,EAAUloB,iBAKrBpP,IAAIpM,OAAO,qBAAqB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GAC3F,YAeA,IAdAD,EAAQ8jC,IACJC,MAAO,QACPC,IAAK,MACLC,QAAS,WAEbjkC,EAAQkkC,MAAQ,WACZ,MAAIlkC,GAAQmkC,MACDnkC,EAAQ8jC,GAAGE,IACXhkC,EAAQokC,QACRpkC,EAAQ8jC,GAAGC,MAEX/jC,EAAQ8jC,GAAGG,SAGF,gBAAbjwB,WAAX,CAGA,GAAIqwB,IAAMrwB,UAAUswB,SAAS30B,MAAM,oBAAsB,UAAU,GAAG+L,cAClExH,EAAKF,UAAUG,SACnBnU,GAAQukC,MAAe,OAANF,EACjBrkC,EAAQmkC,MAAe,OAANE,EACjBrkC,EAAQokC,QAAiB,SAANC,EACnBrkC,EAAQwkC,KAEFlwB,WADoB,+BAArBN,UAAUC,SAA4CD,UAAUC,QAAQvE,QAAQ,cAAgB,GACnFwE,EAAGvE,MAAM,gEAAgE,IACzEuE,EAAGvE,MAAM,0DAA0D,IAErF3P,EAAQykC,QAAUzkC,EAAQwkC,MAAQxkC,EAAQwkC,KAAO,EACjDxkC,EAAQ0kC,QAAU1kC,EAAQ2kC,WAAa72B,OAAO82B,aAAe92B,OAAO+2B,cAA6C,UAA7B/2B,OAAOkG,UAAU8wB,QACrG9kC,EAAQ+kC,WAAa/kC,EAAQ0kC,SAAW7J,UAAU3mB,EAAGvE,MAAM,kBAAkB,GAAI,IAAM,EACvF3P,EAAQglC,QAAUl3B,OAAOm3B,OAAyD,kBAAhDx0B,OAAO5O,UAAU6O,SAAS/P,KAAKmN,OAAOm3B,OACxEjlC,EAAQklC,SAAW5wB,WAAWJ,EAAG7C,MAAM,WAAW,KAAO/M,OAEzDtE,EAAQmlC,SAAW7wB,WAAWJ,EAAG7C,MAAM,YAAY,KAAO/M,OAE1DtE,EAAQolC,MAAQlxB,EAAGxE,QAAQ,aAAe,EAE1C1P,EAAQqlC,OAASnxB,EAAGxE,QAAQ,SAAW,EAEvC1P,EAAQslC,WAAapxB,EAAGxE,QAAQ,aAAe,EAE/C1P,EAAQulC,WAAarxB,EAAGxE,QAAQ,WAAa,KAI7CpD,IAAIpM,OAAO,iBAAiB,UAAU,UAAU,SAAS,eAAe,qBAAsB,SAASswB,EAAUxwB,EAASC,GAC1H,YA0LA,SAASulC,GAAqBl9B,EAAU0f,EAAGvc,GACvC,GAAIg6B,GAASC,EAAgB1d,EAE7B,KAAK2d,EAAUxB,OAASyB,EAAa,CAGjC,IAFIA,EAAY,KAAOA,EAAY,OAC/BH,GAAU,GACVG,EAAYC,MAAO,CACnB,GAAoB,IAAf,EAAIJ,GAGL,MAFAG,GAAYC,MAAQ,EAI5B,GAAgB,KAAZp6B,GAA8B,KAAZA,EAAgB,CAClC,GAAIq6B,GAAW,YAAc9d,GAAIA,EAAE8d,SAAW9d,EAAE+d,WAChD,IAAgB,KAAZt6B,GAA+B,IAAbq6B,EAClBE,EAAKhe,EAAEie,cACJ,IAAgB,KAAZx6B,GAA6B,IAAXg6B,GAA6B,IAAbK,EAAgB,CACzD,GAAII,IAAMF,CACVA,GAAKhe,EAAEie,UACPC,GAAMF,EACG,EAALE,IACAN,EAAYC,OAAQ,KAKpC,GAAIp6B,IAAW0rB,GAAK4F,cAAe,CAC/B,OAAQ5F,EAAK4F,cAActxB,IACvB,IAAK,MACDg6B,EAAS,CACT,MACJ,KAAK,QACDA,EAAS,CACT,MACJ,KAAK,OACDA,EAAS,CACT,MACJ,SACIA,EAAS,EAGjBh6B,EAAU,GAOd,GAJa,EAATg6B,IAA2B,KAAZh6B,GAA8B,KAAZA,KACjCA,EAAU,KAGTg6B,GAAsB,KAAZh6B,EAAgB,CAC3B,GAAIq6B,GAAW,YAAc9d,GAAIA,EAAE8d,SAAW9d,EAAE+d,WAChD,IAAiB,IAAbD,IACAx9B,EAAS0f,EAAGyd,GAASh6B,GACjBuc,EAAEme,kBACF,OAIZ,GAAIR,EAAUJ,YAAuB,EAATE,EAAY,CAEpC,GADAn9B,EAAS0f,EAAGyd,EAAQh6B,GAChBuc,EAAEme,iBACF,MAEAV,IAAU,GAElB,MAAKA,IAAYh6B,IAAW0rB,GAAKuG,eAAoBjyB,IAAW0rB,GAAK8I,eAI9D33B,EAAS0f,EAAGyd,EAAQh6B,IAHhB,EAzPf,GAAI0rB,GAAO3G,EAAS,UAChBmV,EAAYnV,EAAS,cAEzBxwB,GAAQomC,YAAc,SAASx1B,EAAMxF,EAAM9C,GACvC,GAAIsI,EAAKtG,iBACL,MAAOsG,GAAKtG,iBAAiBc,EAAM9C,GAAU,EAEjD,IAAIsI,EAAK+D,YAAa,CAClB,GAAI0xB,GAAU,WACV/9B,EAAS3H,KAAKiQ,EAAM9C,OAAO3E,OAE/Bb,GAASg+B,SAAWD,EACpBz1B,EAAK+D,YAAY,KAAOvJ,EAAMi7B,KAItCrmC,EAAQumC,eAAiB,SAAS31B,EAAMxF,EAAM9C,GAC1C,MAAIsI,GAAKiE,oBACEjE,EAAKiE,oBAAoBzJ,EAAM9C,GAAU,QAEhDsI,EAAKkE,aACLlE,EAAKkE,YAAY,KAAO1J,EAAM9C,EAASg+B,UAAYh+B,KAG3DtI,EAAQwmC,UAAY,SAASxe,GAGzB,MAFAhoB,GAAQiM,gBAAgB+b,GACxBhoB,EAAQ2J,eAAeqe,IAChB,GAGXhoB,EAAQiM,gBAAkB,SAAS+b,GAC3BA,EAAE/b,gBACF+b,EAAE/b,kBAEF+b,EAAEye,cAAe,GAGzBzmC,EAAQ2J,eAAiB,SAASqe,GAC1BA,EAAEre,eACFqe,EAAEre,iBAEFqe,EAAEoK,aAAc,GAExBpyB,EAAQ0mC,UAAY,SAAS1e,GACzB,MAAc,YAAVA,EAAE5c,KACK,EACG,eAAV4c,EAAE5c,MAA0Bu6B,EAAUxB,OAAUnc,EAAEtc,UAAYsc,EAAEzG,SAAWyG,EAAErc,SACtE,EACPqc,EAAEre,eACKqe,EAAEnC,QAGDqG,EAAE,EAAG/B,EAAE,EAAGC,EAAE,GAAGpC,EAAEnC,SAIjC7lB,EAAQ2mC,QAAU,SAAS7M,EAAI8M,EAAcC,GACzC,QAASC,GAAU9e,GACf4e,GAAgBA,EAAa5e,GAC7B6e,GAAyBA,EAAsB7e,GAE/ChoB,EAAQumC,eAAel9B,SAAU,YAAau9B,GAAc,GAC5D5mC,EAAQumC,eAAel9B,SAAU,UAAWy9B,GAAW,GACvD9mC,EAAQumC,eAAel9B,SAAU,YAAay9B,GAAW,GAO7D,MAJA9mC,GAAQomC,YAAY/8B,SAAU,YAAau9B,GAAc,GACzD5mC,EAAQomC,YAAY/8B,SAAU,UAAWy9B,GAAW,GACpD9mC,EAAQomC,YAAY/8B,SAAU,YAAay9B,GAAW,GAE/CA,GAGX9mC,EAAQ+mC,sBAAwB,SAASjN,EAAIxxB,GACrC,gBAAkBwxB,GAClB95B,EAAQomC,YAAYtM,EAAI,aAAc,SAAS9R,GAC3C,GAAIgf,GAAS,CACS1iC,UAAlB0jB,EAAEif,aACFjf,EAAEkf,QAAUlf,EAAEif,YAAcD,EAC5Bhf,EAAEmf,QAAUnf,EAAEof,YAAcJ,IAE5Bhf,EAAEkf,OAAS,EACXlf,EAAEmf,QAAUnf,EAAEqf,WAAaL,GAE/B1+B,EAAS0f,KAEN,WAAa8R,GACpB95B,EAAQomC,YAAYtM,EAAI,QAAU,SAAS9R,GACvC,GAAIgf,GAAS,GACb,QAAQhf,EAAEsf,WACN,IAAKtf,GAAEuf,gBACHvf,EAAEkf,OAASlf,EAAEwf,OAASR,GAAU;AAChChf,EAAEmf,OAASnf,EAAEyf,OAAST,GAAU,CAChC,MACJ,KAAKhf,GAAE0f,eACP,IAAK1f,GAAE2f,eACH3f,EAAEkf,OAA2B,GAAjBlf,EAAEwf,QAAU,GACxBxf,EAAEmf,OAA2B,GAAjBnf,EAAEyf,QAAU,GAIhCn/B,EAAS0f,KAGbhoB,EAAQomC,YAAYtM,EAAI,iBAAkB,SAAS9R,GAC3CA,EAAE4f,MAAQ5f,EAAE4f,MAAQ5f,EAAE6f,iBACtB7f,EAAEkf,OAA2B,GAAjBlf,EAAE8f,QAAU,GACxB9f,EAAEmf,OAAS,IAEXnf,EAAEkf,OAAS,EACXlf,EAAEmf,OAA2B,GAAjBnf,EAAE8f,QAAU,IAE5Bx/B,EAAS0f,MAKrBhoB,EAAQ+nC,0BAA4B,SAASjO,EAAIkO,EAAUpB,EAAcqB,GACrE,GACIC,GAAQC,EAAQC,EADhBC,EAAS,EAETC,GACAne,EAAG,WACHuB,EAAG,cACHtB,EAAG,YAGPpqB,GAAQomC,YAAYtM,EAAI,YAAa,SAAS9R,GAU1C,GAT6B,IAAzBhoB,EAAQ0mC,UAAU1e,GAClBqgB,EAAS,EACFrgB,EAAE8f,OAAS,GAClBO,IACIA,EAAS,IACTA,EAAS,IAEbA,EAAS,EAET1C,EAAUnB,KAAM,CAChB,GAAI+D,GAAa5/B,KAAKK,IAAIgf,EAAEwgB,QAAUN,GAAU,GAAKv/B,KAAKK,IAAIgf,EAAEygB,QAAUN,GAAU,IAC/EC,GAASG,KACVF,EAAS,GACTD,GACArgC,aAAaqgC,GACjBA,EAAQn/B,WAAW,WAAYm/B,EAAQ,MAAOJ,EAASK,EAAS,IAAM,KAExD,GAAVA,IACAH,EAASlgB,EAAEwgB,QACXL,EAASngB,EAAEygB,SAQnB,GAJAzgB,EAAE0gB,QAAUL,EAEZzB,EAAaqB,GAAc,YAAajgB,GAEpCqgB,EAAS,EACTA,EAAS,MACR,IAAIA,EAAS,EACd,MAAOzB,GAAaqB,GAAcK,EAAWD,GAASrgB,KAG1D2d,EAAUlB,SACVzkC,EAAQomC,YAAYtM,EAAI,WAAY,SAAS9R,GACzCqgB,EAAS,EACLD,GACArgC,aAAaqgC,GACjBA,EAAQn/B,WAAW,WAAYm/B,EAAQ,MAAOJ,EAASK,EAAS,IAAM,KACtEzB,EAAaqB,GAAc,YAAajgB,GACxC4e,EAAaqB,GAAcK,EAAWD,GAASrgB,KAK3D,IAAI0d,IAAkBC,EAAUxB,QAASwB,EAAUX,SAAa,iBAAmBl3B,QAI7E,SAASka,GACP,MAAO,IAAKA,EAAEtc,QAAU,EAAI,IAAMsc,EAAEzG,OAAS,EAAI,IAAMyG,EAAErc,SAAW,EAAI,IAAMqc,EAAE2gB,QAAU,EAAI,IAJhG,SAAS3gB,GACP,MAAO,IAAKA,EAAE2gB,QAAU,EAAI,IAAM3gB,EAAEzG,OAAS,EAAI,IAAMyG,EAAErc,SAAW,EAAI,IAAMqc,EAAEtc,QAAU,EAAI,GAMtG1L,GAAQ4oC,kBAAoB,SAAS5gB,GACjC,MAAOmP,GAAK8F,SAASyI,EAAgB1d,IA0EzC,IAAI4d,GAAc,KACdI,EAAK,CAyCT,IAxCAhmC,EAAQ6oC,sBAAwB,SAAS/O,EAAIxxB,GACzC,GAAI89B,GAAcpmC,EAAQomC,WAC1B,IAAIT,EAAUZ,YAAeY,EAAUX,WAAa,iBAAmBl3B,SAAU,CAC7E,GAAIg7B,GAAqB,IACzB1C,GAAYtM,EAAI,UAAW,SAAS9R,GAChC8gB,EAAqB9gB,EAAEvc,UAE3B26B,EAAYtM,EAAI,WAAY,SAAS9R,GACjC,MAAOwd,GAAqBl9B,EAAU0f,EAAG8gB,SAE1C,CACH,GAAIC,GAAuB,IAE3B3C,GAAYtM,EAAI,UAAW,SAAS9R,GAChC4d,EAAY5d,EAAEvc,UAAW,CACzB,IAAIqoB,GAAS0R,EAAqBl9B,EAAU0f,EAAGA,EAAEvc,QAEjD,OADAs9B,GAAuB/gB,EAAEme,iBAClBrS,IAGXsS,EAAYtM,EAAI,WAAY,SAAS9R,GAC7B+gB,IAAyB/gB,EAAEtc,SAAWsc,EAAEzG,QAAUyG,EAAErc,UAAYqc,EAAE2gB,WAClE3oC,EAAQwmC,UAAUxe,GAClB+gB,EAAuB,QAI/B3C,EAAYtM,EAAI,QAAS,SAAS9R,GAC9B4d,EAAY5d,EAAEvc,SAAW,OAGxBm6B,IACDA,EAAcn1B,OAAOvN,OAAO,MAC5BkjC,EAAYt4B,OAAQ,QAAS,SAASka,GAClC4d,EAAcn1B,OAAOvN,OAAO,WAMxC4K,OAAOk7B,cAAgBrD,EAAUlB,QAAS,CAC1C,GAAIwE,GAAgB,CACpBjpC,GAAQkpC,SAAW,SAAS5gC,EAAU6gC,GAClCA,EAAMA,GAAOr7B,MACb,IAAIs7B,GAAc,wBAA0BH,CAC5CjpC,GAAQomC,YAAY+C,EAAK,UAAW,QAAS10B,GAASuT,GAC9CA,EAAEplB,MAAQwmC,IACVppC,EAAQiM,gBAAgB+b,GACxBhoB,EAAQumC,eAAe4C,EAAK,UAAW10B,GACvCnM,OAGR6gC,EAAIH,YAAYI,EAAa,MAKrCppC,EAAQqpC,UAAYv7B,OAAOw7B,uBACvBx7B,OAAOy7B,0BACPz7B,OAAO07B,6BACP17B,OAAO27B,yBACP37B,OAAO47B,uBAEP1pC,EAAQqpC,UACRrpC,EAAQqpC,UAAYrpC,EAAQqpC,UAAU9Y,KAAKziB,QAE3C9N,EAAQqpC,UAAY,SAAS/gC,GACzBW,WAAWX,EAAU,OAI7BgE,IAAIpM,OAAO,gBAAgB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACtF,YAEAD,GAAQ2pC,KAAO,SAAS95B,GACpB,MAAOA,GAAEA,EAAErO,OAAS,IAGxBxB,EAAQ4pC,cAAgB,SAASrmB,GAC7B,MAAOA,GAAOlS,MAAM,IAAIw4B,UAAUj6B,KAAK,KAG3C5P,EAAQ8pC,aAAe,SAAUvmB,EAAQjG,GAErC,IADA,GAAIwW,GAAS,GACNxW,EAAQ,GACC,EAARA,IACAwW,GAAUvQ,IAEVjG,IAAU,KACViG,GAAUA,EAElB,OAAOuQ,GAGX,IAAIoF,GAAkB,SAClBC,EAAgB,QAEpBn5B,GAAQ+pC,eAAiB,SAAUxmB,GAC/B,MAAOA,GAAOgB,QAAQ2U,EAAiB,KAG3Cl5B,EAAQgqC,gBAAkB,SAAUzmB,GAChC,MAAOA,GAAOgB,QAAQ4U,EAAe,KAGzCn5B,EAAQiqC,WAAa,SAASz5B,GAC1B,GAAI05B,KACJ,KAAK,GAAI36B,KAAOiB,GACZ05B,EAAK36B,GAAOiB,EAAIjB,EAEpB,OAAO26B,IAGXlqC,EAAQmqC,UAAY,SAAS7mB,GAEzB,IAAK,GADD4mB,MACKxmC,EAAE,EAAGguB,EAAEpO,EAAM9hB,OAAUkwB,EAAFhuB,EAAKA,IAC3B4f,EAAM5f,IAAyB,gBAAZ4f,GAAM5f,GACzBwmC,EAAKxmC,GAAKtD,KAAK6pC,WAAY3mB,EAAM5f,IAEjCwmC,EAAKxmC,GAAK4f,EAAM5f,EAExB,OAAOwmC,IAGXlqC,EAAQoqC,SAAW,SAAU55B,GACzB,GAAmB,gBAARA,KAAqBA,EAC5B,MAAOA,EACX,IAAI65B,GAAO75B,EAAIimB,WACf,IAAI4T,IAASh6B,OACT,MAAOG,EAEX,IAAI05B,GAAOG,GACX,KAAK,GAAI96B,KAAOiB,GACY,gBAAbA,GAAIjB,GACX26B,EAAK36B,GAAOvP,EAAQoqC,SAAS55B,EAAIjB,IAEjC26B,EAAK36B,GAAOiB,EAAIjB,EAGxB,OAAO26B,IAGXlqC,EAAQsqC,WAAa,SAAShwB,GAE1B,IAAK,GADDyb,MACKryB,EAAE,EAAGA,EAAE4W,EAAI9Y,OAAQkC,IACxBqyB,EAAIzb,EAAI5W,IAAM,CAElB,OAAOqyB,IAIX/1B,EAAQuqC,UAAY,SAASC,GACzB,GAAIzU,GAAMtlB,OAAOvN,OAAO,KACxB,KAAK,GAAIQ,KAAK8mC,GACVzU,EAAIryB,GAAK8mC,EAAM9mC,EAEnB,OAAOqyB,IAEX/1B,EAAQyqC,YAAc,SAASnnB,EAAO/d,GACpC,IAAK,GAAI7B,GAAI,EAAGA,GAAK4f,EAAM9hB,OAAQkC,IAC7B6B,IAAU+d,EAAM5f,IAClB4f,EAAM9R,OAAO9N,EAAG,IAKtB1D,EAAQ0qC,aAAe,SAAS1tB,GAC5B,MAAOA,GAAIuH,QAAQ,0BAA2B,SAGlDvkB,EAAQ2qC,WAAa,SAAS3tB,GAC1B,MAAOA,GAAIuH,QAAQ,KAAM,SAASA,QAAQ,KAAM,SAASA,QAAQ,KAAM,SAASA,QAAQ,KAAM,UAGlGvkB,EAAQ4qC,gBAAkB,SAASrnB,EAAQsnB,GACvC,GAAIC,KASJ,OAPAvnB,GAAOgB,QAAQsmB,EAAQ,SAAS7tB,GAC5B8tB,EAAQ17B,MACJ27B,OAAQxpC,UAAUA,UAAUC,OAAO,GACnCA,OAAQwb,EAAIxb,WAIbspC,GAEX9qC,EAAQgrC,aAAe,SAASC,GAC5B,GAAI7C,GAAQ,KACR9/B,EAAW,WACX8/B,EAAQ,KACR6C,KAGAC,EAAW,SAASrzB,GAGpB,MAFAqzB,GAASC,SACT/C,EAAQn/B,WAAWX,EAAUuP,GAAW,GACjCqzB,EAqBX,OAlBAA,GAASE,SAAWF,EAEpBA,EAASvqC,KAAO,WAGZ,MAFAP,MAAK+qC,SACLF,IACOC,GAGXA,EAASC,OAAS,WAGd,MAFApjC,cAAaqgC,GACbA,EAAQ,KACD8C,GAGXA,EAASG,UAAY,WACjB,MAAOjD,IAGJ8C,GAIXlrC,EAAQsrC,YAAc,SAASL,EAAKM,GAChC,GAAInD,GAAQ,KACR9/B,EAAW,WACX8/B,EAAQ,KACR6C,KAGAO,EAAQ,SAAS3zB,GACJ,MAATuwB,IACAA,EAAQn/B,WAAWX,EAAUuP,GAAW0zB,IAuBhD,OApBAC,GAAM1zB,MAAQ,SAASD,GACnBuwB,GAASrgC,aAAaqgC,GACtBA,EAAQn/B,WAAWX,EAAUuP,GAAW0zB,IAE5CC,EAAMJ,SAAWI,EAEjBA,EAAM7qC,KAAO,WACTP,KAAK+qC,SACLF,KAGJO,EAAML,OAAS,WACX/C,GAASrgC,aAAaqgC,GACtBA,EAAQ,MAGZoD,EAAMH,UAAY,WACd,MAAOjD,IAGJoD,KAIXl/B,IAAIpM,OAAO,0BAA0B,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,cAAc,gBAAiB,SAASswB,EAAUxwB,EAASC,GACjK,YAEA,IAAIkJ,GAAQqnB,EAAS,gBACjBmV,EAAYnV,EAAS,oBACrBrsB,EAAMqsB,EAAS,cACfib,EAAOjb,EAAS,eAChBkb,EAAiB/F,EAAUR,SAAW,GACtCwG,EAAoBhG,EAAUnB,KAE9BoH,EAAY,SAAShnC,EAAYinC,GAiDjC,QAASC,GAAezuB,GACpB,IAAI0uB,EAAJ,CAEA,GAAIC,EACAC,EAAiB,EACjBC,EAAe7uB,EAAU,EAAI9W,EAAKhB,MAAM/D,OAAS,MAEjD,IAAIyqC,GAAiB5uB,EAAU,EAAI,EAC/B6uB,EAAe,CAEvB,KACI3lC,EAAK4lC,kBAAkBF,EAAgBC,GACzC,MAAMlkB,MAGZ,QAASokB,KACDL,IAEJxlC,EAAKhB,MAAQ8mC,EACT1G,EAAUT,UACVoH,EAAUlB,YA4UlB,QAASmB,KACLxkC,aAAaykC,GACbA,EAAevjC,WAAW,WAClBwjC,IACAlmC,EAAK2G,MAAMyjB,QAAU8b,EACrBA,EAAY,IAE2B,MAAvCZ,EAAKa,SAASC,wBACdd,EAAKa,SAASC,uBAAwB,EACtCd,EAAKa,SAASE,0BAEnBjH,EAAUlB,QAAU,IAAM,GA3ZjC,GAAIl+B,GAAOpC,EAAImF,cAAc,WAC7B/C,GAAKgD,UAAY,iBAEbo8B,EAAUL,YACV/+B,EAAKsmC,aAAa,2BAA2B,GAEjDtmC,EAAKumC,KAAO,MACZvmC,EAAKwmC,YAAc,MACnBxmC,EAAKymC,eAAiB,MACtBzmC,EAAK0H,YAAa,EAElB1H,EAAK2G,MAAM+/B,QAAU,IACjBtH,EAAUlB,UAASl+B,EAAK2G,MAAMhG,IAAM,UACxCtC,EAAWoR,aAAazP,EAAM3B,EAAWsO,WAEzC,IAAIm5B,GAAc,KAEda,GAAS,EACTC,GAAS,EACTpB,GAAgB,EAChBU,EAAY,GACZW,GAAmB,CACvB,KAAM,GAAIC,GAAYhkC,SAASikC,gBAAkB/mC,EAAQ,MAAMyhB,IAE/D7e,EAAMi9B,YAAY7/B,EAAM,OAAQ,SAASyhB,GACrC6jB,EAAK0B,OAAOvlB,GACZqlB,GAAY,IAEhBlkC,EAAMi9B,YAAY7/B,EAAM,QAAS,SAASyhB,GACtCqlB,GAAY,EACZxB,EAAK2B,QAAQxlB,GACb8jB,MAEJ1rC,KAAK4F,MAAQ,WAAaO,EAAKP,SAC/B5F,KAAKyF,KAAO,WAAaU,EAAKV,QAC9BzF,KAAKitC,UAAY,WACb,MAAOA,GAEX,IAAII,GAAgBhC,EAAKH,YAAY,WACjC+B,GAAavB,EAAesB,KAE5Bd,EAAYb,EAAKH,YAAY,WACvBS,IACFxlC,EAAKhB,MAAQ8mC,EACbgB,GAAavB,MA2BrBnG,GAAUT,UAAY2G,EAAKvhC,iBAAiB,kBAAmB,WACvDuhC,EAAKxnC,UAAUgZ,WAAa+vB,IAC5BA,GAAoBA,EACpBK,EAAcrC,cAItBgB,IACIiB,GACAxB,EAAK2B,SAGT,IAAIE,GAAgB,SAASnnC,GACzB,MAA+B,KAAxBA,EAAK0lC,gBAAwB1lC,EAAK2lC,eAAiB3lC,EAAKhB,MAAM/D,OAkBzE,KAhBK+E,EAAK4lC,mBAAqB5lC,EAAKonC,kBAChCpnC,EAAK4lC,kBAAoB,SAASF,EAAgBC,GAC9C,GAAIjkC,GAAQ7H,KAAKutC,iBACjB1lC,GAAM7B,UAAS,GACf6B,EAAM2lC,UAAU,YAAa3B,GAC7BhkC,EAAM4lC,QAAQ,YAAa3B,GAC3BjkC,EAAM6D,UAEV4hC,EAAgB,SAASnnC,GACrB,IACI,GAAI0B,GAAQ1B,EAAKunC,cAAczpC,UAAUiO,cAC5C,MAAM0V,IACP,MAAK/f,IAASA,EAAM8lC,iBAAmBxnC,EAC5B0B,EAAM1B,MAAQA,EAAKhB,OADsB,IAIxDogC,EAAUlB,QAAS,CACnB,GAAIuJ,IAAmB,EACnBC,EAAmB,SAASjmB,GAC5B,IAAIgmB,EAAJ,CAEA,GAAIprC,GAAO2D,EAAKhB,KAChB,KAAIwmC,GAAkBnpC,GAAQA,GAAQypC,EAAtC,CAEA,GAAIrkB,GAAKplB,GAAQypC,EAAY,GACzB,MAAO6B,GAAa9C,UAExB+C,GAASvrC,GACTorC,GAAmB,EACnB5B,IACA4B,GAAmB,KAEnBE,EAAezC,EAAKH,YAAY2C,EACpC9kC,GAAMi9B,YAAY7/B,EAAM,iBAAkB0nC,EAE1C,IAAIG,IAAariB,GAAG,EAAG4R,GAAG,EAC1Bx0B,GAAMi9B,YAAY7/B,EAAM,QAAS,SAAUyhB,GAGvC,OAFI+jB,GAAmBxlC,EAAKhB,QAAS6oC,EAASpmB,EAAEvc,UAC5CxC,WAAWolC,EAAkB,IAC5B9nC,EAAKhB,MAAM+oC,WAAW,IAAI,GAAK,IACzBJ,EAAavtC,YAExBorC,EAAgBwC,IAAwBC,OAE5CrlC,EAAMi9B,YAAY7/B,EAAM,UAAW,SAAUyhB,GACzCkmB,EAAa9C,SAAS,MAI9B,GAAIqD,GAAW,SAASzmB,GAChBklB,EACAA,GAAS,EACFQ,EAAcnnC,IACrBslC,EAAK6C,YACL5C,KACOE,GACPF,EAAeD,EAAKxnC,UAAUgZ,YAIlC2uB,EAAe,IACnB5rC,MAAKuuC,gBAAkB,SAASC,GAAK5C,EAAe4C,GACpDxuC,KAAKyuC,gBAAkB,WAAY,MAAO7C,GAC1C,IAAI8C,IAAmB,EAEnBX,EAAW,SAASvrC,GAChBopC,IACAppC,EAAOopC,EAAappC,GACpBopC,EAAe,MAEfmB,GACArB,IACIlpC,GACAipC,EAAKkD,QAAQnsC,GACjBuqC,GAAS,GACFvqC,GAAQypC,EAAY19B,OAAO,GAC9BmgC,EACAjD,EAAKmD,YAAY,OAAQ9b,OAAQ,QAEjC2Y,EAAKmD,YAAY,aAAc9b,OAAQ,SAEvCtwB,EAAK4hB,UAAU,EAAG,IAAM6nB,EACxBzpC,EAAOA,EAAKwsB,OAAO,GACdxsB,EAAK+L,OAAO,IAAM09B,EAAY19B,OAAO,GAC1C/L,EAAOA,EAAKwsB,OAAO,GACdxsB,EAAK+L,OAAO/L,EAAKpB,OAAS,IAAM6qC,EAAY19B,OAAO,KACxD/L,EAAOA,EAAK0rB,MAAM,EAAG,KACrB1rB,EAAK+L,OAAO/L,EAAKpB,OAAS,IAAM6qC,EAAY19B,OAAO,KACnD/L,EAAOA,EAAK0rB,MAAM,EAAG,KAErB1rB,GACAipC,EAAKoD,YAAYrsC,IAErBksC,IACAA,GAAmB,IAEvBI,EAAU,SAASlnB,GACnB,IAAI+jB,EAAJ,CAEA,GAAInpC,GAAO2D,EAAKhB,KAChB4oC,GAASvrC,GACTwpC,MAGA+C,EAAsB,SAASnnB,EAAGplB,GAClC,GAAIwsC,GAAgBpnB,EAAEonB,eAAiBthC,OAAOshC,aAC9C,IAAKA,IAAiB1D,EAAtB,CAEA,GAAI2D,GAAO1D,EAAmB,OAAS,YACvC,OAAI/oC,GACOwsC,EAAcE,QAAQD,EAAMzsC,MAAU,EAEtCwsC,EAAcG,QAAQF,KAIjCG,EAAS,SAASxnB,EAAGynB,GACrB,GAAI7sC,GAAOipC,EAAK6D,aAChB,OAAK9sC,QAGDusC,EAAoBnnB,EAAGplB,IACvB6sC,EAAQ5D,EAAK8D,QAAU9D,EAAK+D,SAC5BzmC,EAAMQ,eAAeqe,KAErBklB,GAAS,EACT3mC,EAAKhB,MAAQ3C,EACb2D,EAAKuF,SACL7C,WAAW,WACPikC,GAAS,EACTd,IACAN,IACA2D,EAAQ5D,EAAK8D,QAAU9D,EAAK+D,aAbzBzmC,EAAMQ,eAAeqe,IAkBhC2nB,EAAQ,SAAS3nB,GACjBwnB,EAAOxnB,GAAG,IAGV4nB,EAAS,SAAS5nB,GAClBwnB,EAAOxnB,GAAG,IAGV+mB,EAAU,SAAS/mB,GACnB,GAAIplB,GAAOusC,EAAoBnnB,EACZ,iBAARplB,IACHA,GACAipC,EAAKkD,QAAQnsC,GACb+iC,EAAUnB,MACVv7B,WAAW6iC,GACf3iC,EAAMQ,eAAeqe,KAGrBzhB,EAAKhB,MAAQ,GACb4nC,GAAS,GAIjBhkC,GAAM0/B,sBAAsBtiC,EAAMslC,EAAKgE,aAAatf,KAAKsb,IAEzD1iC,EAAMi9B,YAAY7/B,EAAM,SAAUkoC,GAElCtlC,EAAMi9B,YAAY7/B,EAAM,QAAS2oC,GAEjC/lC,EAAMi9B,YAAY7/B,EAAM,MAAOopC,GAC/BxmC,EAAMi9B,YAAY7/B,EAAM,OAAQqpC,GAChCzmC,EAAMi9B,YAAY7/B,EAAM,QAASwoC,GAC3B,SAAWxoC,IAAW,UAAYA,IAAW,WAAaA,IAC5D4C,EAAMi9B,YAAYxhC,EAAY,UAAW,SAASojB,GAC9C,KAAK2d,EAAUxB,OAAUnc,EAAE2gB,UAAa3gB,EAAEtc,QAG1C,OAAQsc,EAAEvc,SACN,IAAK,IACDmkC,EAAO5nB,EACP,MACJ,KAAK,IACD+mB,EAAQ/mB,EACR,MACJ,KAAK,IACD2nB,EAAM3nB,KAKtB,IAAIwmB,GAAqB,SAASxmB,GAC1B+jB,IAAkBF,EAAK2C,oBAAsB3C,EAAKiE,YAEtD/D,KACAF,EAAK2C,qBACLvlC,WAAWslC,EAAqB,GAChC1C,EAAK79B,GAAG,YAAaqgC,GAChBxC,EAAKxnC,UAAUgZ,YAChBwuB,EAAKzW,OAAO,IACZyW,EAAKkE,QAAQC,gBACbnE,EAAKxnC,UAAU4rC,kBAEnBpE,EAAKkE,QAAQC,kBAGbzB,EAAsB,WACtB,GAAKxC,GAAkBF,EAAK0C,sBAAuB1C,EAAKiE,UAAxD,CAEA,GAAII,GAAM3pC,EAAKhB,MAAMgf,QAAQ,QAAS,GACtC,IAAIwnB,EAAcoE,YAAcD,IAEhCrE,EAAK0C,oBAAoB2B,GACrBnE,EAAcoE,WACdtE,EAAKnhC,OACTqhC,EAAcoE,UAAYD,EACtBnE,EAAcoE,WAAW,CACzB,GAAI1iB,GAAIoe,EAAKxnC,UAAU+rC,UACvBvE,GAAKzW,OAAO2W,EAAcoE,WAC1BtE,EAAKkE,QAAQC,gBACbjE,EAAc9jC,MAAQ4jC,EAAKxnC,UAAU+rC,WACrCvE,EAAKxnC,UAAUgsC,SAAS5iB,GACxBoe,EAAKxnC,UAAU4rC,oBAInB5B,EAAmB,SAASrmB,GAC5B,GAAK6jB,EAAKwC,mBAAoBxC,EAAKiE,UAAnC,CACA,GAAIjvC,GAAIkrC,CACRA,IAAgB,CAChB,IAAI3D,GAAQn/B,WAAW,WACnBm/B,EAAQ,IACR,IAAIprB,GAAMzW,EAAKhB,MAAMgf,QAAQ,QAAS,GAClCwnB,KAEK/uB,GAAOnc,EAAEsvC,UACd/D,KACMvrC,EAAEsvC,WAAanzB,IACrBovB,IACA+B,EAASnxB,MAGjBgvB,GAAe,SAAiChvB,GAI5C,MAHIorB,IACArgC,aAAaqgC,GACjBprB,EAAMA,EAAIuH,QAAQ,QAAS,IACvBvH,GAAOnc,EAAEsvC,UACF,IACPtvC,EAAEsvC,WAAa/H,GACfyD,EAAKnhC,OACFsS,IAEX6uB,EAAKwC,mBACLxC,EAAKtF,eAAe,YAAa8H,GACnB,kBAAVrmB,EAAE5c,MAA4BvK,EAAEoH,OAChC4jC,EAAKxnC,UAAUgsC,SAASxvC,EAAEoH,SAM9BqoC,EAAkB7E,EAAKH,YAAYiD,EAAqB,GAE5DplC,GAAMi9B,YAAY7/B,EAAM,mBAAoBioC,GACxC7I,EAAUjB,QACVv7B,EAAMi9B,YAAY7/B,EAAM,OAAQ,WAAW+pC,EAAgBlF,cAE3DjiC,EAAMi9B,YAAY7/B,EAAM,QAAS,WAAW+pC,EAAgBlF,aAC5DjiC,EAAMi9B,YAAY7/B,EAAM,UAAW,WAAW+pC,EAAgBlF,cAElEjiC,EAAMi9B,YAAY7/B,EAAM,iBAAkB8nC,GAE1CjuC,KAAKmwC,WAAa,WACd,MAAOhqC,IAGXnG,KAAKowC,YAAc,SAASC,GACzBlqC,EAAKkqC,SAAWA,GAGnBrwC,KAAKswC,cAAgB,SAAS1oB,GAC1B8mB,GAAmB,EACnBhD,EAAeD,EAAKxnC,UAAUgZ,WAC9BwuB,EAAK8E,MAAM,qBAAsBlnC,OAAQoiC,EAAM+E,SAAU5oB,IACzD5nB,KAAKywC,YAAY7oB,GAAG,IAGxB5nB,KAAKywC,YAAc,SAAS7oB,EAAG8oB,GAC3B,GAAKA,IAAgBnL,EAAUlB,QAA/B,CAEKgI,IACDA,EAAYlmC,EAAK2G,MAAMyjB,SAC3BpqB,EAAK2G,MAAMyjB,SAAWmgB,EAAe,kBAAoB,IACnD,UAAYvqC,EAAK2G,MAAM9F,OAAS,KAC/Bu+B,EAAUnB,KAAO,eAAiB,GAEzC,IAAI3zB,GAAOg7B,EAAK7qC,UAAU8P,wBACtB5D,EAAQ/I,EAAI22B,cAAc+Q,EAAK7qC,WAC/BkG,EAAM2J,EAAK3J,KAAO2zB,SAAS3tB,EAAM6jC,iBAAmB,GACpDhgC,EAAOF,EAAKE,MAAQ8pB,SAAShqB,EAAKmgC,kBAAoB,GACtDC,EAASpgC,EAAKvJ,OAASJ,EAAMX,EAAKc,aAAc,EAChD6pC,EAAO,SAASlpB,GAChBzhB,EAAK2G,MAAM6D,KAAOiX,EAAEwgB,QAAUz3B,EAAO,EAAI,KACzCxK,EAAK2G,MAAMhG,IAAMyB,KAAKC,IAAIof,EAAEygB,QAAUvhC,EAAM,EAAG+pC,GAAU,KAE7DC,GAAKlpB,GAES,aAAVA,EAAE5c,OAGFygC,EAAKa,SAASC,wBACdd,EAAKa,SAASC,sBAAwB,MACtChH,EAAUpB,QAAUoB,EAAUlB,SAC9Bt7B,EAAMw9B,QAAQkF,EAAK7qC,UAAWkwC,EAAM3E,MAG5CnsC,KAAKmsC,mBAAqBA,CAC1B,IAAIC,GAeAkE,EAAgB,SAAS1oB,GACzB6jB,EAAKsF,UAAUT,cAAc1oB,GAC7BukB,IAEJpjC,GAAMi9B,YAAYyF,EAAKa,SAAS0E,SAAU,cAAeV,GACzDvnC,EAAMi9B,YAAY7/B,EAAM,cAAemqC,GAG3C1wC,GAAQ4rC,UAAYA,IAGpBt/B,IAAIpM,OAAO,8BAA8B,UAAU,UAAU,SAAS,cAAc,gBAAgB,qBAAsB,SAASswB,EAAUxwB,EAASC,GACtJ,YAQA,SAASoxC,GAAgBC,GACrBA,EAAaC,gBAAkB,IAE/B,IAAIhpC,GAAS+oC,EAAa/oC,MAC1BA,GAAOipC,kBAAkB,YAAapxC,KAAKqxC,YAAYlhB,KAAK+gB,IAC5D/oC,EAAOipC,kBAAkB,WAAYpxC,KAAKsxC,cAAcnhB,KAAK+gB,IAC7D/oC,EAAOipC,kBAAkB,cAAepxC,KAAKuxC,cAAcphB,KAAK+gB,IAChE/oC,EAAOipC,kBAAkB,YAAapxC,KAAKwxC,YAAYrhB,KAAK+gB,IAC5D/oC,EAAOipC,kBAAkB,aAAcpxC,KAAKyxC,aAAathB,KAAK+gB,GAE9D,IAAItxC,IAAW,SAAU,cAAe,YAAa,eAAgB,mBACjE,mBAAoB,WAAY,cAAe,YAEnDA,GAAQua,QAAQ,SAASwY,GACrBue,EAAave,GAAK3yB,KAAK2yB,IACxB3yB,MAEHkxC,EAAaQ,cAAgB1xC,KAAK2xC,kBAAkBxhB,KAAK+gB,EAAc,gBACvEA,EAAaU,cAAgB5xC,KAAK2xC,kBAAkBxhB,KAAK+gB,EAAc,gBAmM3E,QAASW,GAAaC,EAAIC,EAAIC,EAAIC,GAC9B,MAAO1pC,MAAK2pC,KAAK3pC,KAAK+6B,IAAI0O,EAAKF,EAAI,GAAKvpC,KAAK+6B,IAAI2O,EAAKF,EAAI,IAG9D,QAASI,GAAqBtqC,EAAOqW,GACjC,GAAIrW,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,IAC7B,GAAIE,GAAM,EAAIp0B,EAAOq0B,OAAS1qC,EAAM8sB,MAAM4d,OAAS1qC,EAAMwqC,IAAIE,WAC5D,IAAI1qC,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,IAAM,GAAMvqC,EAAM8sB,MAAM4d,QAAW1qC,EAAMwqC,IAAIE,OAG/E,GAAID,GAAM,EAAIp0B,EAAOk0B,IAAMvqC,EAAM8sB,MAAMyd,IAAMvqC,EAAMwqC,IAAID,QAFvD,IAAIE,GAAMp0B,EAAOq0B,OAAS,CAI9B,OAAU,GAAND,GACQp0B,OAAQrW,EAAM8sB,MAAOvR,OAAQvb,EAAMwqC,MAEnCn0B,OAAQrW,EAAMwqC,IAAKjvB,OAAQvb,EAAM8sB,OA1OjD,GAII6d,IAJMpiB,EAAS,cACPA,EAAS,gBACLA,EAAS,oBAEP,IAuBlB,WAEIpwB,KAAKqxC,YAAc,SAASoB,GACxB,GAAIC,GAAcD,EAAGC,cACjB7d,EAAM4d,EAAGE,qBACb3yC,MAAK4yC,eAAiBH,CACtB,IAAItqC,GAASnI,KAAKmI,OAEdsd,EAASgtB,EAAGnM,WAChB,IAAe,IAAX7gB,EAAc,CACd,GAAIotB,GAAiB1qC,EAAO2qC,oBACxBC,EAAiBF,EAAe51B,SAKpC,OAHI81B,IACA5qC,EAAOlE,UAAU+uC,eAAene,OACpC1sB,GAAO4oC,UAAUT,cAAcmC,EAAGjC,UAKtC,MADAxwC,MAAK4yC,eAAeK,KAAO37B,KAAKohB,OAC5Bga,GAAgBvqC,EAAO8kC,cACvB9kC,EAAOvC,SACH5F,KAAKkzC,cAAiBlzC,KAAKmxC,iBAAoBhpC,EAAOgrC,oBAO9DnzC,KAAKozC,aAAaX,GAClBzyC,KAAKqzC,YAAYxe,EAAK4d,EAAGjC,SAASlI,QAAU,GACrCmK,EAAGlpC,mBARFvJ,KAAKszC,SAAS,iBACdtzC,MAAKozC,aAAaX,KAU9BzyC,KAAKqzC,YAAc,SAASxe,EAAK0e,GAC7B1e,EAAMA,GAAO70B,KAAKmI,OAAOmkC,SAASkH,wBAAwBxzC,KAAK2yB,EAAG3yB,KAAKyzC,EACvE,IAAItrC,GAASnI,KAAKmI,MAEdnI,MAAK4yC,eAAec,cACpBvrC,EAAOlE,UAAU0vC,iBAAiB9e,GAC5B0e,GACNprC,EAAOlE,UAAU+uC,eAAene,GAC/B0e,GACDvzC,KAAK0L,SACLvD,EAAOmkC,SAAS0E,SAAS4C,YACzBzrC,EAAOmkC,SAAS0E,SAAS4C,aAE7BzrC,EAAO0rC,SAAS,iBAChB7zC,KAAKszC,SAAS,WAGlBtzC,KAAK0L,OAAS,WACV,GAAI0X,GAAQjb,EAASnI,KAAKmI,OACtB+V,EAAS/V,EAAOmkC,SAASkH,wBAAwBxzC,KAAK2yB,EAAG3yB,KAAKyzC,EAElE,IAAIzzC,KAAKmxC,gBAAiB,CACtB,GAAImB,GAAMtyC,KAAKmxC,gBAAgB2C,aAAa51B,EAE5C,IAAW,IAAPo0B,EACAlvB,EAASpjB,KAAKmxC,gBAAgBkB,QAC3B,IAAW,GAAPC,EACPlvB,EAASpjB,KAAKmxC,gBAAgBxc,UAC3B,CACH,GAAIof,GAAgB5B,EAAqBnyC,KAAKmxC,gBAAiBjzB,EAC/DA,GAAS61B,EAAc71B,OACvBkF,EAAS2wB,EAAc3wB,OAE3Bjb,EAAOlE,UAAU+vC,mBAAmB5wB,EAAOgvB,IAAKhvB,EAAOmvB,QAE3DpqC,EAAOlE,UAAU0vC,iBAAiBz1B,GAElC/V,EAAOmkC,SAAS2H,wBAGpBj0C,KAAK2xC,kBAAoB,SAASuC,GAC9B,GAAI9wB,GAAQjb,EAASnI,KAAKmI,OACtB+V,EAAS/V,EAAOmkC,SAASkH,wBAAwBxzC,KAAK2yB,EAAG3yB,KAAKyzC,GAC9D5rC,EAAQM,EAAOlE,UAAUiwC,GAAUh2B,EAAOk0B,IAAKl0B,EAAOq0B,OAE1D,IAAIvyC,KAAKmxC,gBAAiB,CACtB,GAAIgD,GAAWn0C,KAAKmxC,gBAAgB2C,aAAajsC,EAAM8sB,OACnDyf,EAASp0C,KAAKmxC,gBAAgB2C,aAAajsC,EAAMwqC,IAErD,IAAgB,IAAZ8B,GAA4B,GAAVC,EAClBhxB,EAASpjB,KAAKmxC,gBAAgBkB,KAC1BxqC,EAAMwqC,IAAID,KAAOl0B,EAAOk0B,KAAOvqC,EAAMwqC,IAAIE,QAAUr0B,EAAOq0B,UAC1Dr0B,EAASrW,EAAM8sB,WAChB,IAAc,GAAVyf,GAAeD,GAAY,EAClC/wB,EAASpjB,KAAKmxC,gBAAgBxc,OAC1B9sB,EAAM8sB,MAAMyd,KAAOl0B,EAAOk0B,KAAOvqC,EAAM8sB,MAAM4d,QAAUr0B,EAAOq0B,UAC9Dr0B,EAASrW,EAAMwqC,SAChB,IAAgB,IAAZ8B,GAA4B,GAAVC,EACzBl2B,EAASrW,EAAMwqC,IACfjvB,EAASvb,EAAM8sB,UACZ,CACH,GAAIof,GAAgB5B,EAAqBnyC,KAAKmxC,gBAAiBjzB,EAC/DA,GAAS61B,EAAc71B,OACvBkF,EAAS2wB,EAAc3wB,OAE3Bjb,EAAOlE,UAAU+vC,mBAAmB5wB,EAAOgvB,IAAKhvB,EAAOmvB,QAE3DpqC,EAAOlE,UAAU0vC,iBAAiBz1B,GAElC/V,EAAOmkC,SAAS2H,wBAGpBj0C,KAAKq0C,UACLr0C,KAAKs0C,aACLt0C,KAAKu0C,iBACLv0C,KAAKw0C,iBAAmB,WACpBx0C,KAAKmxC,gBAAkB,KACvBnxC,KAAKmI,OAAOssC,WAAW,iBACnBz0C,KAAKmI,OAAOmkC,SAAS0E,SAAS0D,gBAC9B10C,KAAKmI,OAAOmkC,SAAS0E,SAAS0D,kBAItC10C,KAAK20C,UAAY,WACb,GAAIC,GAAW/C,EAAa7xC,KAAK4yC,eAAejgB,EAAG3yB,KAAK4yC,eAAea,EAAGzzC,KAAK2yB,EAAG3yB,KAAKyzC,GACnFR,EAAO37B,KAAKohB,OAEZkc,EAAWpC,GAAeS,EAAOjzC,KAAK4yC,eAAeK,KAAOjzC,KAAKkzC,eACjElzC,KAAKqzC,YAAYrzC,KAAK4yC,eAAeD,wBAG7C3yC,KAAKsxC,cAAgB,SAASmB,GAC1B,GAAI5d,GAAM4d,EAAGE,sBACTxqC,EAASnI,KAAKmI,OACdwnC,EAAUxnC,EAAOwnC,QAEjB9nC,EAAQ8nC,EAAQkF,gBAAgBhgB,EAChChtB,IACIA,EAAMoV,YACNpV,EAAM8sB,MAAM4d,SACZ1qC,EAAMwqC,IAAIE,UAEdvyC,KAAKszC,SAAS,YAEdzrC,EAAQM,EAAOlE,UAAU6wC,aAAajgB,EAAIud,IAAKvd,EAAI0d,QACnDvyC,KAAKszC,SAAS,kBAElBtzC,KAAKmxC,gBAAkBtpC,EACvB7H,KAAK0L,UAGT1L,KAAKuxC,cAAgB,SAASkB,GAC1B,GAAI5d,GAAM4d,EAAGE,sBACTxqC,EAASnI,KAAKmI,MAElBnI,MAAKszC,SAAS,gBACd,IAAIzrC,GAAQM,EAAO2qC,mBACfjrC,GAAMktC,eAAiBltC,EAAMmtC,SAASngB,EAAIud,IAAKvd,EAAI0d,SACnDvyC,KAAKmxC,gBAAkBhpC,EAAOlE,UAAUgxC,aAAaptC,EAAM8sB,MAAMyd,KACjEpyC,KAAKmxC,gBAAgBkB,IAAMlqC,EAAOlE,UAAUgxC,aAAaptC,EAAMwqC,IAAID,KAAKC,KAExEryC,KAAKmxC,gBAAkBhpC,EAAOlE,UAAUgxC,aAAapgB,EAAIud,KAE7DpyC,KAAK0L,UAGT1L,KAAKwxC,YAAc,SAASiB,GACxB,GAAItqC,GAASnI,KAAKmI,MAElBA,GAAOmmC,YACPtuC,KAAKmxC,gBAAkBhpC,EAAO2qC,oBAC9B9yC,KAAKszC,SAAS,cAGlBtzC,KAAKyxC,aAAe,SAASgB,GACzB,IAAIA,EAAGyC,cAAP,CAEIzC,EAAGiB,eAAiBjB,EAAG1L,SAAW0L,EAAG3L,SACrC2L,EAAG3L,OAAS2L,EAAG1L,OACf0L,EAAG1L,OAAS,EAGhB,IAAIhqB,GAAI01B,EAAGjC,SAAS3K,UAChBC,EAAK/oB,GAAK/c,KAAKm1C,iBAAiB,GAEhChtC,EAASnI,KAAKmI,OACditC,EAAcjtC,EAAOmkC,SAAS+I,eAAe5C,EAAG3L,OAAS2L,EAAG6C,MAAO7C,EAAG1L,OAAS0L,EAAG6C,MACtF,OAAIF,IAAoB,IAALtP,GACf9lC,KAAKm1C,gBAAkBp4B,EACvB5U,EAAOmkC,SAASiJ,SAAS9C,EAAG3L,OAAS2L,EAAG6C,MAAO7C,EAAG1L,OAAS0L,EAAG6C,OACvD7C,EAAG+C,QAHd,WAOLj1C,KAAK0wC,EAAgBxvC,WAExB7B,EAAQqxC,gBAAkBA,IAsB1B/kC,IAAIpM,OAAO,eAAe,UAAU,UAAU,SAAS,cAAc,eAAgB,SAASswB,EAAUxwB,EAASC,GACjH,YAIA,SAAS41C,GAASjxC,GACdxE,KAAK01C,QAAS,EACd11C,KAAK21C,SAAW,KAChB31C,KAAK41C,YAAcpxC,EALvB,GACIT,IADMqsB,EAAS,aACTA,EAAS,eAOnB,WACIpwB,KAAK61C,MAAQ,WAKT,MAJA71C,MAAK21C,SAAW5xC,EAAImF,cAAc,OAClClJ,KAAK21C,SAASxsC,UAAY,cAC1BnJ,KAAK21C,SAAS7oC,MAAM0a,QAAU,OAC9BxnB,KAAK41C,YAAYpwC,YAAYxF,KAAK21C,UAC3B31C,KAAK21C,UAEhB31C,KAAKmwC,WAAa,WACd,MAAOnwC,MAAK21C,UAAY31C,KAAK61C,SAEjC71C,KAAK+B,QAAU,SAASoE,GACpBpC,EAAI63B,aAAa57B,KAAKmwC,aAAchqC,IAExCnG,KAAK81C,QAAU,SAASC,GACpB/1C,KAAKmwC,aAAaj3B,UAAY68B,GAElC/1C,KAAKg2C,YAAc,SAASrjB,EAAG8gB,GAC3BzzC,KAAKmwC,aAAarjC,MAAM6D,KAAOgiB,EAAI,KACnC3yB,KAAKmwC,aAAarjC,MAAMhG,IAAM2sC,EAAI,MAEtCzzC,KAAKi2C,aAAe,SAAS9sC,GACzBpF,EAAI41B,YAAY35B,KAAKmwC,aAAchnC,IAEvCnJ,KAAK4jB,KAAO,SAASzd,EAAMwsB,EAAG8gB,GACd,MAARttC,GACAnG,KAAK+B,QAAQoE,GACR,MAALwsB,GAAkB,MAAL8gB,GACbzzC,KAAKg2C,YAAYrjB,EAAG8gB,GACnBzzC,KAAK01C,SACN11C,KAAKmwC,aAAarjC,MAAM0a,QAAU,QAClCxnB,KAAK01C,QAAS,IAItB11C,KAAK6a,KAAO,WACJ7a,KAAK01C,SACL11C,KAAKmwC,aAAarjC,MAAM0a,QAAU,OAClCxnB,KAAK01C,QAAS,IAGtB11C,KAAKk2C,UAAY,WACb,MAAOl2C,MAAKmwC,aAAa7wB,cAE7Btf,KAAKm2C,SAAW,WACZ,MAAOn2C,MAAKmwC,aAAa7U,eAG9B/6B,KAAKk1C,EAAQh0C,WAEhB7B,EAAQ61C,QAAUA,IAGlBvpC,IAAIpM,OAAO,oCAAoC,UAAU,UAAU,SAAS,cAAc,cAAc,gBAAgB,eAAgB,SAASswB,EAAUxwB,EAASC,GACpK,YAMA,SAASu2C,GAAclF,GAiCnB,QAASmF,KACL,GAAIjE,GAAMkE,EAAW3D,sBAAsBP,IACvCmE,EAAaC,EAAOC,aAAarE,EACrC,KAAKmE,EACD,MAAOG,IAEX,IAAIC,GAASxuC,EAAOwnC,QAAQiH,WAC5B,IAAIxE,GAAOuE,EAAQ,CACf,GAAIE,GAAY1uC,EAAOmkC,SAASwK,yBAAyB,EAAGR,EAAW7C,GAAGrB,IACtEvd,EAAMyhB,EAAWS,IACrB,IAAIF,EAAY1uC,EAAOwnC,QAAQqH,oBAAoBniB,EAAIud,IAAKvd,EAAI0d,QAC5D,MAAOmE,KAGf,GAAIO,GAAqBV,EAQzB,GANAU,EAAoBV,EAAWpwC,KAAKqJ,KAAK,SAEzC0nC,EAAQpB,QAAQmB,GAChBC,EAAQtzB,OACRzb,EAAOyF,GAAG,aAAc8oC,GAEpBxF,EAAaiG,qBACbC,EAAYd,OACT,CACH,GAAIe,GAAgBb,EAAOc,OAAOnvC,EAAOwnC,QAAQqH,oBAAoB5E,EAAK,IAAIn/B,QAC1ExC,EAAO4mC,EAAc3mC,wBACrB5D,EAAQoqC,EAAQ/G,aAAarjC,KACjCA,GAAM6D,KAAOF,EAAK8mC,MAAQ,KAC1BzqC,EAAMhG,IAAM2J,EAAKvJ,OAAS,MAIlC,QAASwvC,KACDc,IACAA,EAAiB7vC,aAAa6vC,IAC9BP,IACAC,EAAQr8B,OACRo8B,EAAoB,KACpB9uC,EAAOsM,oBAAoB,aAAciiC,IAIjD,QAASU,GAAYxvB,GACjBsvB,EAAQlB,YAAYpuB,EAAE+K,EAAG/K,EAAE6rB,GA5E/B,GAAItrC,GAAS+oC,EAAa/oC,OACtBquC,EAASruC,EAAOmkC,SAASmL,aACzBP,EAAU,GAAIQ,GAAcvvC,EAAOvH,UAEvCswC,GAAa/oC,OAAOipC,kBAAkB,kBAAmB,SAASxpB,GAC9D,GAAKzf,EAAO8kC,aAAgC,GAAjBrlB,EAAE0e,YAA7B,CAEA,GAAIqR,GAAenB,EAAOoB,UAAUhwB,EAEpC,IAAoB,eAAhB+vB,EAAJ,CAGA,GAAIvF,GAAMxqB,EAAE+qB,sBAAsBP,IAC9BnuC,EAAYkE,EAAOwnC,QAAQ1rC,SAE/B,IAAI2jB,EAAE8rB,cACFzvC,EAAU4zC,SAASzF,EAAK,OACvB,CACD,GAAyB,GAArBxqB,EAAE4oB,SAAS9I,OAEX,MADAv/B,GAAOmmC,YACA1mB,EAAEre,gBAEb2nC,GAAaC,gBAAkBhpC,EAAOlE,UAAUgxC,aAAa7C,GAIjE,MAFAlB,GAAaoC,SAAS,iBACtBpC,EAAakC,aAAaxrB,GACnBA,EAAEre,oBAIb,IAAIiuC,GAAgBlB,EAAYW,CAiDhC/F,GAAa/oC,OAAOipC,kBAAkB,kBAAmB,SAASxpB,GAC9D,GAAIve,GAASue,EAAE4oB,SAASnnC,QAAUue,EAAE4oB,SAAS9vB,UAC7C,OAAI3c,GAAI01B,YAAYpwB,EAAQ,mBACjBqtC,KAEPO,GAAqB/F,EAAaiG,sBAClCC,EAAYxvB,GAEhB0uB,EAAa1uB,OACT4vB,IAEJA,EAAiB3uC,WAAW,WACxB2uC,EAAiB,KACblB,IAAepF,EAAa4G,eAC5BzB,IAEAK,KACL,SAGP3tC,EAAMi9B,YAAY79B,EAAOmkC,SAASyL,QAAS,WAAY,SAASnwB,GAC5D0uB,EAAa,KACRW,IAAqBO,IAG1BA,EAAiB3uC,WAAW,WACxB2uC,EAAiB,KACjBd,KACD,OAGPvuC,EAAOyF,GAAG,gBAAiB8oC,GAG/B,QAASgB,GAAclzC,GACnBixC,EAAQl1C,KAAKP,KAAMwE,GAxHvB,GAAIT,GAAMqsB,EAAS,cACfoM,EAAMpM,EAAS,cACfrnB,EAAQqnB,EAAS,gBACjBqlB,EAAUrlB,EAAS,cAAcqlB,OAwHrCjZ,GAAIP,SAASyb,EAAejC,GAE5B,WACIz1C,KAAKg2C,YAAc,SAASrjB,EAAG8gB,GAC3B,GAAIuE,GAActqC,OAAOuqC,YAAchvC,SAASqwB,gBAAgB9sB,YAC5Doa,EAAelZ,OAAOmZ,aAAe5d,SAASqwB,gBAAgBryB,aAC9DgF,EAAQjM,KAAKm2C,WACbnvC,EAAShH,KAAKk2C,WAClBvjB,IAAK,GACL8gB,GAAK,GACD9gB,EAAI1mB,EAAQ+rC,IACZrlB,GAAMA,EAAI1mB,EAAS+rC,GAEnBvE,EAAIzsC,EAAS4f,IACb6sB,GAAK,GAAKzsC,GAEdyuC,EAAQh0C,UAAUu0C,YAAYz1C,KAAKP,KAAM2yB,EAAG8gB,KAGjDlzC,KAAKm3C,EAAcj2C,WAItB7B,EAAQw2C,cAAgBA,IAIxBlqC,IAAIpM,OAAO,yBAAyB,UAAU,UAAU,SAAS,gBAAgB,qBAAsB,SAASswB,EAAUxwB,EAASC,GACnI,YAEA,IAAIkJ,GAAQqnB,EAAS,gBACjBmV,EAAYnV,EAAS,oBACrB8nB,EAAat4C,EAAQs4C,WAAa,SAAS1H,EAAUroC,GACrDnI,KAAKwwC,SAAWA,EAChBxwC,KAAKmI,OAASA,EAEdnI,KAAK2yB,EAAI3yB,KAAKooC,QAAUoI,EAASpI,QACjCpoC,KAAKyzC,EAAIzzC,KAAKqoC,QAAUmI,EAASnI,QAEjCroC,KAAK+2C,KAAO,KACZ/2C,KAAKm4C,aAAe,KAEpBn4C,KAAKo4C,oBAAqB,EAC1Bp4C,KAAK+lC,kBAAmB,IAG5B,WAEI/lC,KAAK6L,gBAAkB,WACnB9C,EAAM8C,gBAAgB7L,KAAKwwC,UAC3BxwC,KAAKo4C,oBAAqB,GAG9Bp4C,KAAKuJ,eAAiB,WAClBR,EAAMQ,eAAevJ,KAAKwwC,UAC1BxwC,KAAK+lC,kBAAmB,GAG5B/lC,KAAKw1C,KAAO,WACRx1C,KAAK6L,kBACL7L,KAAKuJ,kBAETvJ,KAAK2yC,oBAAsB,WACvB,MAAI3yC,MAAK+2C,KACE/2C,KAAK+2C,MAEhB/2C,KAAK+2C,KAAO/2C,KAAKmI,OAAOmkC,SAASkH,wBAAwBxzC,KAAKooC,QAASpoC,KAAKqoC,SACrEroC,KAAK+2C,OAEhB/2C,KAAK0yC,YAAc,WACf,GAA0B,OAAtB1yC,KAAKm4C,aACL,MAAOn4C,MAAKm4C,YAEhB,IAAIhwC,GAASnI,KAAKmI,OAGd0qC,EAAiB1qC,EAAO2qC,mBAC5B,IAAID,EAAe51B,UACfjd,KAAKm4C,cAAe,MACnB,CACD,GAAItjB,GAAM70B,KAAK2yC,qBACf3yC,MAAKm4C,aAAetF,EAAemC,SAASngB,EAAIud,IAAKvd,EAAI0d,QAG7D,MAAOvyC,MAAKm4C,cAEhBn4C,KAAKsmC,UAAY,WACb,MAAOv9B,GAAMu9B,UAAUtmC,KAAKwwC,WAEhCxwC,KAAK0zC,YAAc,WACf,MAAO1zC,MAAKwwC,SAASjlC,UAGzBvL,KAAKk1C,YAAc3P,EAAUxB,MACvB,WAAa,MAAO/jC,MAAKwwC,SAASjI,SAClC,WAAa,MAAOvoC,MAAKwwC,SAASllC,WAEzC/K,KAAK23C,EAAWz2C,aAInByK,IAAIpM,OAAO,8BAA8B,UAAU,UAAU,SAAS,cAAc,gBAAgB,qBAAsB,SAASswB,EAAUxwB,EAASC,GACtJ,YAUA,SAASw4C,GAAgBnH,GAkJrB,QAAS+C,GAAqB/1B,EAAQo6B,GAClC,GAAI5f,GAAMphB,KAAKohB,MACX6f,GAAaD,GAAcp6B,EAAOk0B,KAAOkG,EAAWlG,IACpDoG,GAAaF,GAAcp6B,EAAOq0B,QAAU+F,EAAW/F,MAC3D,KAAKkG,GAAmBF,GAAaC,EACjCrwC,EAAOuwC,iBAAmB,EAC1BvwC,EAAOwwC,qBAAqBz6B,GAC5B/V,EAAOuwC,iBAAmB,EAC1BD,EAAkB/f,EAClBkgB,GAA2BjmB,EAAGA,EAAG8gB,EAAGA,OACjC,CACH,GAAImB,GAAW/C,EAAa+G,EAAwBjmB,EAAGimB,EAAwBnF,EAAG9gB,EAAG8gB,EACjFmB,GAAWiE,EACXJ,EAAkB,KACX/f,EAAM+f,GAAmBK,IAChC3wC,EAAOmkC,SAAS2H,uBAChBwE,EAAkB,OAK9B,QAASM,GAAW76B,EAAQo6B,GACxB,GAAI5f,GAAMphB,KAAKohB,MACXsgB,EAAa7wC,EAAOmkC,SAAS2M,YAAYD,WACzCE,EAAiB/wC,EAAOmkC,SAAS2M,YAAYC,eAC7CC,EAAahxC,EAAOmkC,SAAS0E,SAAStgC,wBACtC0oC,GACDzmB,GACIhiB,KAAMgiB,EAAIwmB,EAAWxoC,KACrB4mC,MAAO4B,EAAW5B,MAAQ5kB,GAE9B8gB,GACI3sC,IAAK2sC,EAAI0F,EAAWryC,IACpBI,OAAQiyC,EAAWjyC,OAASusC,IAG/B4F,EAAiB9wC,KAAKC,IAAI4wC,EAAQzmB,EAAEhiB,KAAMyoC,EAAQzmB,EAAE4kB,OACpD+B,EAAiB/wC,KAAKC,IAAI4wC,EAAQ3F,EAAE3sC,IAAKsyC,EAAQ3F,EAAEvsC,QACnDqyC,GAAgBnH,IAAKl0B,EAAOk0B,IAAKG,OAAQr0B,EAAOq0B,OACb,IAAnC8G,EAAiBH,IACjBK,EAAahH,QAAW6G,EAAQzmB,EAAEhiB,KAAOyoC,EAAQzmB,EAAE4kB,MAAQ,GAAK,GAEjC,GAA/B+B,EAAiBN,IACjBO,EAAanH,KAAQgH,EAAQ3F,EAAE3sC,IAAMsyC,EAAQ3F,EAAEvsC,OAAS,GAAK,EAEjE,IAAIsyC,GAAUt7B,EAAOk0B,KAAOmH,EAAanH,IACrCqH,EAAUv7B,EAAOq0B,QAAUgH,EAAahH,OACxCgG,GAAaD,GAAcp6B,EAAOk0B,KAAOkG,EAAWlG,GACpDoH,IAAYC,IAAYlB,EACnBmB,EAEIhhB,EAAMghB,GAAuBC,GAClCxxC,EAAOmkC,SAAS2H,qBAAqBsF,GAFrCG,EAAsBhhB,EAI1BghB,EAAsB,KAI9B,QAASE,KACL,GAAItB,GAAauB,CACjBA,GAAa1xC,EAAOmkC,SAASkH,wBAAwB7gB,EAAG8gB,GACxDQ,EAAqB4F,EAAYvB,GACjCS,EAAWc,EAAYvB,GAG3B,QAASwB,KACLjyC,EAAQM,EAAOlE,UAAU81C,kBACzBC,EAAsB7xC,EAAOwnC,QAAQsK,UAAUpyC,EAAO,gBAAiBM,EAAO+xC,qBAC9E/xC,EAAO0nC,iBACH1nC,EAAO8kC,aACP9kC,EAAOmkC,SAAS6N,aAAaC,aAAY,GAC7CC,cAAcC,GACdV,IACAU,EAAU7yC,YAAYmyC,EAAgB,IACtCW,EAAU,EACVxxC,EAAMi9B,YAAY/8B,SAAU,YAAauxC,GAG7C,QAASC,KACLJ,cAAcC,GACdnyC,EAAOwnC,QAAQ+K,aAAaV,GAC5BA,EAAsB,KACtB7xC,EAAOuwC,iBAAmB,EAC1BvwC,EAAOlE,UAAU02C,kBAAkB9yC,GACnCM,EAAOuwC,iBAAmB,EACtBvwC,EAAO8kC,cAAgB2N,GACvBzyC,EAAOmkC,SAAS6N,aAAaC,aAAajyC,EAAO0yC,eACrDhzC,EAAQ,KACRgyC,EAAa,KACbU,EAAU,EACVb,EAAsB,KACtBjB,EAAkB,KAClB1vC,EAAMo9B,eAAel9B,SAAU,YAAauxC,GAGhD,QAASA,KACmB,MAApBM,IACAA,EAAmBjyC,WAAW,WACF,MAApBiyC,GAA4Bd,GAC5BS,KACL,KAIX,QAASM,GAAUC,GACf,GAAIC,GAAQD,EAAaC,KACzB,QAAQA,GAASp3B,MAAMpiB,UAAUq0B,KAAKv1B,KAAK06C,EAAO,SAASjwC,GACvD,MAAe,cAARA,GAAgC,QAARA,IAIvC,QAASkwC,GAActzB,GACnB,GAAIuzB,IAAe,OAAQ,WAAY,MAAO,iBAC1CC,GAAe,OAAQ,WAAY,WAAY,MAAO,iBAEtDC,EAAoB9V,EAAUxB,MAAQnc,EAAEzG,OAASyG,EAAEtc,QACnDgwC,EAAgB,eACpB,KACIA,EAAgB1zB,EAAEozB,aAAaM,cAAchgC,cAC/C,MAAOsM,IACT,GAAI2zB,GAAa,MASjB,OAPIF,IAAqBF,EAAY7rC,QAAQgsC,IAAkB,EAC3DC,EAAa,OACRH,EAAY9rC,QAAQgsC,IAAkB,EAC3CC,EAAa,OACRJ,EAAY7rC,QAAQgsC,IAAkB,IAC3CC,EAAa,QAEVA,EAjRX,GAAIpzC,GAAS+oC,EAAa/oC,OAEtBqzC,EAAaz3C,EAAImF,cAAc,MACnCsyC,GAAWC,IAAM,6EACblW,EAAUX,UACV4W,EAAW1uC,MAAMyjB,QAAU,iFAE/B,IAAI3wB,IAAW,WAAY,cAAe,YAAa,eAAgB,cAEtEA,GAAQua,QAAQ,SAASwY,GACrBue,EAAave,GAAK3yB,KAAK2yB,IACzB3yB,MACHmI,EAAO+B,iBAAiB,YAAalK,KAAKqxC,YAAYlhB,KAAK+gB,GAG3D,IACI8I,GAAqBrnB,EAAG8gB,EACxB6G,EAASzyC,EACTgyC,EACA6B,EACAd,EACAlB,EACAjB,EACAG,EARA+C,EAAcxzC,EAAOvH,UAGT25C,EAAU,CAO1Bv6C,MAAK47C,YAAc,SAASh0B,GACxB,GAAI5nB,KAAK67C,aAAeF,EAAYG,UAAW,CAC3C,GAAInvB,GAAO3sB,IAKX,OAJA6I,YAAW,WACP8jB,EAAK0mB,cACL1mB,EAAKymB,aAAaxrB,IACnB,GACIA,EAAEre,iBAEb1B,EAAQM,EAAO2qC,mBAEf,IAAIkI,GAAepzB,EAAEozB,YACrBA,GAAaM,cAAgBnzC,EAAO0yC,cAAgB,OAAS,WACzDtV,EAAUX,UACVz8B,EAAOvH,UAAU4E,YAAYg2C,GAC7BA,EAAWn0C,UAAY,GAE3B2zC,EAAae,cAAgBf,EAAae,aAAaP,EAAY,EAAG,GAClEjW,EAAUX,SACVz8B,EAAOvH,UAAU6D,YAAY+2C,GAEjCR,EAAagB,YACbhB,EAAa9L,QAAQ,OAAQ/mC,EAAOwnC,QAAQsM,gBAE5CrB,GAAa,EACb56C,KAAKszC,SAAS,SAGlBtzC,KAAKk8C,UAAY,SAASt0B,GAItB,GAHA+zB,EAAYG,WAAY,EACxBlB,GAAa,EACb56C,KAAKszC,SAAS,OACTnrC,EAAO0yC,cAAe,CACvB,GAAIU,GAAa3zB,EAAEozB,aAAaO,UAC3BG,IAA+B,QAAdH,GAClBpzC,EAAOwnC,QAAQ1a,OAAO9sB,EAAO2qC,qBACjC3qC,EAAOmkC,SAAS6N,aAAaC,aAAY,GAE7Cp6C,KAAKmI,OAAOssC,WAAW,gBACvBz0C,KAAKmI,OAAOmkC,SAAS6P,eAAe,KAGxCn8C,KAAKo8C,YAAc,SAASx0B,GACxB,OAAIzf,EAAO0yC,eAAkBE,EAAUnzB,EAAEozB,eAEzCroB,EAAI/K,EAAEwgB,QACNqL,EAAI7rB,EAAEygB,QACD2R,GACDF,IACJS,IACA3yB,EAAEozB,aAAaO,WAAaG,EAAgBR,EAActzB,GACnD7e,EAAMQ,eAAeqe,IAR5B,QAWJ5nB,KAAKq8C,WAAa,SAASz0B,GACvB,OAAIzf,EAAO0yC,eAAkBE,EAAUnzB,EAAEozB,eAEzCroB,EAAI/K,EAAEwgB,QACNqL,EAAI7rB,EAAEygB,QACD2R,IACDF,IACAS,KAEqB,OAArBO,IACAA,EAAmB,MAEvBlzB,EAAEozB,aAAaO,WAAaG,EAAgBR,EAActzB,GACnD7e,EAAMQ,eAAeqe,IAZ5B,QAeJ5nB,KAAKs8C,YAAc,SAAS10B,GAExB,MADA2yB,KACe,GAAXA,GAAgBP,GAChBS,IACAiB,EAAgB,KACT3yC,EAAMQ,eAAeqe,IAHhC,QAOJ5nB,KAAKu8C,OAAS,SAAS30B,GACnB,GAAKiyB,EAAL,CAEA,GAAImB,GAAepzB,EAAEozB,YACrB,IAAIJ,EACA,OAAQc,GACJ,IAAK,OAEG7zC,EADAA,EAAMmtC,SAAS6E,EAAWzH,IAAKyH,EAAWtH,SAEtC5d,MAAOklB,EACPxH,IAAKwH,GAGD1xC,EAAOq0C,SAAS30C,EAAOgyC,EAEnC,MACJ,KAAK,OACDhyC,EAAQM,EAAOq0C,SAAS30C,EAAOgyC,GAAY,OAGhD,CACH,GAAI4C,GAAWzB,EAAa7L,QAAQ,OACpCtnC,IACI8sB,MAAOklB,EACPxH,IAAKlqC,EAAOwnC,QAAQ3a,OAAO6kB,EAAY4C,IAE3Ct0C,EAAOvC,QACP81C,EAAgB,KAGpB,MADAjB,KACO1xC,EAAMQ,eAAeqe,KAGhC7e,EAAMi9B,YAAY2V,EAAa,YAAa37C,KAAK47C,YAAYzrB,KAAK+gB,IAClEnoC,EAAMi9B,YAAY2V,EAAa,UAAW37C,KAAKk8C,UAAU/rB,KAAK+gB,IAC9DnoC,EAAMi9B,YAAY2V,EAAa,YAAa37C,KAAKo8C,YAAYjsB,KAAK+gB,IAClEnoC,EAAMi9B,YAAY2V,EAAa,WAAY37C,KAAKq8C,WAAWlsB,KAAK+gB,IAChEnoC,EAAMi9B,YAAY2V,EAAa,YAAa37C,KAAKs8C,YAAYnsB,KAAK+gB,IAClEnoC,EAAMi9B,YAAY2V,EAAa,OAAQ37C,KAAKu8C,OAAOpsB,KAAK+gB,GAgGxD,IAAI4J,GAAmB,KA2H3B,QAASjJ,GAAaC,EAAIC,EAAIC,EAAIC,GAC9B,MAAO1pC,MAAK2pC,KAAK3pC,KAAK+6B,IAAI0O,EAAKF,EAAI,GAAKvpC,KAAK+6B,IAAI2O,EAAKF,EAAI,IApX9D,GAAIhuC,GAAMqsB,EAAS,cACfrnB,EAAQqnB,EAAS,gBACjBmV,EAAYnV,EAAS,oBAErBupB,EAAmB,IACnBb,EAAsB,IACtBD,EAA2B,GAyR/B,WAEI74C,KAAK08C,SAAW,WACZ,GAAIt1C,GAAWkQ,KAAKohB,MAAQ14B,KAAK4yC,eAAeK,IAC5C7rC,GAAWpH,KAAKmI,OAAOw0C,gBACvB38C,KAAK48C,aAGb58C,KAAK68C,YAAc,WACf,GAAIxzC,GAASrJ,KAAKmI,OAAOvH,SACzByI,GAAOyyC,WAAY,EACnB97C,KAAKqzC,YAAYrzC,KAAK4yC,eAAeD,uBACrC3yC,KAAKq0C,aAGTr0C,KAAK88C,aAAe,SAASl1B,GACzB5nB,KAAKmI,OAAOmkC,SAAS6N,aAAaC,aAAap6C,KAAKmI,OAAO0yC,eAC3D76C,KAAKmI,OAAOssC,WAAW,gBACvBz0C,KAAKmI,OAAOmkC,SAAS6P,eAAe,IACpCn8C,KAAK68C,eAGT78C,KAAK48C,UAAY,WACb58C,KAAK67C,YAAa,CAClB,IAAI1zC,GAASnI,KAAKmI,OACdkB,EAASlB,EAAOvH,SACpByI,GAAOyyC,WAAY,EACnB3zC,EAAOmkC,SAAS6N,aAAaC,aAAY,GACzCjyC,EAAO0rC,SAAS,eAChB,IAAIkJ,GAAcxX,EAAUpB,MAAQ,UAAY,MAChDh8B,GAAOmkC,SAAS6P,eAAeY,GAC/B/8C,KAAKszC,SAAS,cAGlBtzC,KAAKg9C,YAAc,SAASp1B,GACxB,GAAIve,GAASrJ,KAAKmI,OAAOvH,SACzB,IAAI2kC,EAAUnB,MAAsB,aAAdpkC,KAAKotB,MAAsB,CAC7C,GAAIwnB,GAAW/C,EAAa7xC,KAAK4yC,eAAejgB,EAAG3yB,KAAK4yC,eAAea,EAAGzzC,KAAK2yB,EAAG3yB,KAAKyzC,EACnFmB,GAAW,GACXvrC,EAAO4zC,WAEf,GAAmB,aAAfj9C,KAAKotB,MAAsB,CAC3B,GAAIwnB,GAAW/C,EAAa7xC,KAAK4yC,eAAejgB,EAAG3yB,KAAK4yC,eAAea,EAAGzzC,KAAK2yB,EAAG3yB,KAAKyzC,EACnFmB,GAAW,IACXvrC,EAAOyyC,WAAY,EACnB97C,KAAKqzC,YAAYrzC,KAAK4yC,eAAeD,0BAKjD3yC,KAAKqxC,YAAc,SAASzpB,GACxB,GAAK5nB,KAAKk9C,aAAV,CAEAl9C,KAAK4yC,eAAiBhrB,CACtB,IAAIzf,GAASnI,KAAKmI,OAEduqC,EAAc9qB,EAAE8qB,cAChBjtB,EAASmC,EAAE0e,YACX6W,EAAav1B,EAAE4oB,SAAS9I,QAAU,CACtC,IAAmB,IAAfyV,GAA+B,IAAX13B,GAAgBitB,EAAa,CACjD,GAAI9qB,EAAEzf,OAAOgrC,oBAAsBvrB,EAAEstB,eAAiBttB,EAAE8rB,eACpD,MACJ1zC,MAAK4yC,eAAeK,KAAO37B,KAAKohB,KAChC,IAAI0kB,GAAcx1B,EAAE4oB,SAASnnC,QAAUue,EAAE4oB,SAAS9vB,UAGlD,IAFI,gBAAkB08B,KAClBA,EAAYC,aAAe,MAC3Bl1C,EAAOw0C,eAAgB,CACvB,GAAIpX,EAAUT,SAAU,CACpB9kC,KAAK67C,YAAa,CAClB,IAAIF,GAAcxzC,EAAOvH,SACzB+6C,GAAYG,WAAY,EAE5B97C,KAAKszC,SAAS,gBAEdtzC,MAAK48C,WAET58C,MAAKozC,aAAaxrB,EAAG5nB,KAAKg9C,YAAY7sB,KAAKnwB,OAC3C4nB,EAAEme,kBAAmB,OAI9BxlC,KAAK83C,EAAgB52C,WAOxB7B,EAAQy4C,gBAAkBA,IAI1BnsC,IAAIpM,OAAO,eAAe,UAAU,UAAU,SAAS,eAAgB,SAASswB,EAAUxwB,EAASC,GACnG,YACA,IAAIkE,GAAMqsB,EAAS,QAEnBxwB,GAAQkC,IAAM,SAAUw7C,EAAKp1C,GACzB,GAAIq1C,GAAM,GAAIC,eACdD,GAAI5vC,KAAK,MAAO2vC,GAAK,GACrBC,EAAIE,mBAAqB,WACE,IAAnBF,EAAIG,YACJx1C,EAASq1C,EAAII,eAGrBJ,EAAIK,KAAK,OAGbh+C,EAAQi+C,WAAa,SAASnkC,EAAMxR,GAChC,GAAIkxB,GAAOr1B,EAAIm1B,kBACX4kB,EAAI70C,SAASC,cAAc,SAE/B40C,GAAErC,IAAM/hC,EACR0f,EAAK5zB,YAAYs4C,GAEjBA,EAAEC,OAASD,EAAEL,mBAAqB,SAASO,EAAGC,IACtCA,IAAYH,EAAEJ,YAA8B,UAAhBI,EAAEJ,YAA0C,YAAhBI,EAAEJ,cAC1DI,EAAIA,EAAEC,OAASD,EAAEL,mBAAqB,KACjCQ,GACD/1C,OAIhBtI,EAAQs+C,WAAa,SAASZ,GAC1B,GAAI7tC,GAAIxG,SAASC,cAAc,IAE/B,OADAuG,GAAEhC,KAAO6vC,EACF7tC,EAAEhC,QAKbvB,IAAIpM,OAAO,yBAAyB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GAC/F,YAEA,IAAIs+C,MACAtyC,EAAkB,WAAa7L,KAAKo4C,oBAAqB,GACzD7uC,EAAiB,WAAavJ,KAAK+lC,kBAAmB,EAE1DoY,GAAa5N,MACb4N,EAAaC,eAAiB,SAASC,EAAWz2B,GAC9C5nB,KAAKs+C,iBAAmBt+C,KAAKs+C,mBAC7Bt+C,KAAKu+C,mBAAqBv+C,KAAKu+C,oBAE/B,IAAIC,GAAYx+C,KAAKs+C,eAAeD,OAChCI,EAAiBz+C,KAAKu+C,iBAAiBF,EAC3C,IAAKG,EAAUp9C,QAAWq9C,EAA1B,CAGgB,gBAAL72B,IAAkBA,IACzBA,MAECA,EAAE5c,OACH4c,EAAE5c,KAAOqzC,GACRz2B,EAAE/b,kBACH+b,EAAE/b,gBAAkBA,GACnB+b,EAAEre,iBACHqe,EAAEre,eAAiBA,GAEvBi1C,EAAYA,EAAUtwB,OACtB,KAAK,GAAI5qB,GAAE,EAAGA,EAAEk7C,EAAUp9C,SACtBo9C,EAAUl7C,GAAGskB,EAAG5nB,OACZ4nB,EAAEwwB,oBAFwB90C,KAMlC,MAAIm7C,KAAmB72B,EAAEme,iBACd0Y,EAAe72B,EAAG5nB,MAD7B,SAKJm+C,EAAaO,QAAU,SAASL,EAAWz2B,GACvC,GAAI42B,IAAax+C,KAAKs+C,oBAAsBD,EAC5C,IAAKG,EAAL,CAEAA,EAAYA,EAAUtwB,OACtB,KAAK,GAAI5qB,GAAE,EAAGA,EAAEk7C,EAAUp9C,OAAQkC,IAC9Bk7C,EAAUl7C,GAAGskB,EAAG5nB,QAGxBm+C,EAAaQ,KAAO,SAASN,EAAWn2C,GACpC,GAAIkjC,GAAQprC,IACZkI,IAAYlI,KAAKkK,iBAAiBm0C,EAAW,QAASO,KAClDxT,EAAM32B,oBAAoB4pC,EAAWO,GACrC12C,EAAS2H,MAAM,KAAM1O,cAK7Bg9C,EAAa/M,kBAAoB,SAASiN,EAAWn2C,GACjD,GAAI22C,GAAW7+C,KAAKu+C,gBAIpB,IAHKM,IACDA,EAAW7+C,KAAKu+C,kBAAoBO,gBAEpCD,EAASR,GAAY,CACrB,GAAIU,GAAMF,EAASR,GACf1zC,EAAWk0C,EAASC,WAAWT,EAC9B1zC,KACDk0C,EAASC,WAAWT,GAAa1zC,MACrCA,EAASqE,KAAK+vC,EACd,IAAIz7C,GAAIqH,EAAS2E,QAAQpH,EAChB,KAAL5E,GACAqH,EAASyG,OAAO9N,EAAG,GAE3Bu7C,EAASR,GAAan2C,GAE1Bi2C,EAAaa,qBAAuB,SAASX,EAAWn2C,GACpD,GAAI22C,GAAW7+C,KAAKu+C,gBACpB,IAAKM,EAAL,CAEA,GAAIl0C,GAAWk0C,EAASC,WAAWT,EAEnC,IAAIQ,EAASR,IAAcn2C,EAAU,CACvB22C,EAASR,EACf1zC,IACA3K,KAAKoxC,kBAAkBiN,EAAW1zC,EAAS+kB,WAC5C,IAAI/kB,EAAU,CACjB,GAAIrH,GAAIqH,EAAS2E,QAAQpH,EAChB,KAAL5E,GACAqH,EAASyG,OAAO9N,EAAG,MAI/B66C,EAAavwC,GACbuwC,EAAaj0C,iBAAmB,SAASm0C,EAAWn2C,EAAU+2C,GAC1Dj/C,KAAKs+C,eAAiBt+C,KAAKs+C,kBAE3B,IAAIE,GAAYx+C,KAAKs+C,eAAeD,EAMpC,OALKG,KACDA,EAAYx+C,KAAKs+C,eAAeD,OAED,IAA/BG,EAAUlvC,QAAQpH,IAClBs2C,EAAUS,EAAY,UAAY,QAAQ/2C,GACvCA,GAGXi2C,EAAae,IACbf,EAAahY,eACbgY,EAAa1pC,oBAAsB,SAAS4pC,EAAWn2C,GACnDlI,KAAKs+C,eAAiBt+C,KAAKs+C,kBAE3B,IAAIE,GAAYx+C,KAAKs+C,eAAeD,EACpC,IAAKG,EAAL,CAGA,GAAIrtC,GAAQqtC,EAAUlvC,QAAQpH,EAChB,MAAViJ,GACAqtC,EAAUptC,OAAOD,EAAO,KAGhCgtC,EAAagB,mBAAqB,SAASd,GACnCr+C,KAAKs+C,iBAAgBt+C,KAAKs+C,eAAeD,QAGjDz+C,EAAQu+C,aAAeA,IAIvBjyC,IAAIpM,OAAO,cAAc,UAAU,UAAU,SAAS,eAAe,cAAc,cAAc,yBAA0B,SAASswB,EAAUxwB,EAASC,GACvJ,eA2GW,SAASu/C,GAAKvuB,GAIrB,GAFAhwB,EAAQgwB,SAAWA,GAAYT,EAASS,UAAYhxB,EAAOgxB,UAAaD,EAAO9wB,QAAUI,EAAoB,IAAI2wB,UAE5GD,EAAO3nB,SACR,MAAO,EAQX,KAAK,GANDo2C,MACAC,EAAY,GACZC,EAAiBt2C,SAASs2C,eAAiBt2C,SAASu2C,eACpDC,EAAkBF,GAAiBA,EAAc7R,eAAiBzkC,SAElEy2C,EAAUD,EAAgBpmB,qBAAqB,UAC1C/1B,EAAE,EAAGA,EAAEo8C,EAAQt+C,OAAQkC,IAAK,CACjC,GAAIq8C,GAASD,EAAQp8C,GAEjBm4C,EAAMkE,EAAOlE,KAAOkE,EAAOC,aAAa,MAC5C,IAAKnE,EAAL,CAIA,IAAK,GADD7pC,GAAa+tC,EAAO/tC,WACfC,EAAE,EAAGyf,EAAE1f,EAAWxQ,OAAYkwB,EAAJzf,EAAOA,IAAK,CAC3C,GAAIguC,GAAOjuC,EAAWC,EACiB,KAAnCguC,EAAKv9C,KAAKgN,QAAQ,eAClB+vC,EAAcS,EAAYD,EAAKv9C,KAAK6hB,QAAQ,aAAc,MAAQ07B,EAAK16C,OAI/E,GAAI3E,GAAIi7C,EAAIlsC,MAAM,+BACd/O,KACA8+C,EAAY9+C,EAAE,KAGlB8+C,IACAD,EAAcztB,KAAOytB,EAAcztB,MAAQ0tB,EAC3CD,EAAcxuB,UAAW,GAG7BwuB,EAAcU,SAAWV,EAAcztB,KACvCytB,EAAcW,WAAaX,EAAcW,YAAcX,EAAcztB,KACrEytB,EAAcY,SAAWZ,EAAcY,UAAYZ,EAAcztB,KACjEytB,EAAca,UAAYb,EAAca,WAAab,EAAcztB,WAC5DytB,GAAcztB,IAErB,KAAK,GAAIziB,KAAOkwC,GACsB,mBAAvBA,GAAclwC,IACrBvP,EAAQiC,IAAIsN,EAAKkwC,EAAclwC,IAK3C,QAAS2wC,GAAYljC,GACjB,MAAOA,GAAIuH,QAAQ,QAAS,SAAS3jB,EAAG2/C,GAAM,MAAOA,GAAGC,gBA7J5D,GAAI/U,GAAOjb,EAAS,cAChBoM,EAAMpM,EAAS,aACfiwB,EAAMjwB,EAAS,aACf+tB,EAAe/tB,EAAS,uBAAuB+tB,aAE/CvtB,EAAS,WACT,MAAO5wB,SAGPa,GACAgwB,UAAU,EACVmvB,WAAY,KACZC,SAAU,KACVC,UAAW,KACXH,SAAU,GACVO,OAAQ,MACRC,eAGJ3gD,GAAQkC,IAAM,SAASqN,GACnB,IAAKtO,EAAQ8D,eAAewK,GACxB,KAAM,IAAIpO,OAAM,uBAAyBoO,EAE7C,OAAOtO,GAAQsO,IAGnBvP,EAAQiC,IAAM,SAASsN,EAAKhK,GACxB,IAAKtE,EAAQ8D,eAAewK,GACxB,KAAM,IAAIpO,OAAM,uBAAyBoO,EAE7CtO,GAAQsO,GAAOhK,GAGnBvF,EAAQ4gD,IAAM,WACV,MAAOnV,GAAKxB,WAAWhpC,IAE3B27B,EAAIF,UAAU18B,EAASu+C,GAEvBv+C,EAAQ6gD,UAAY,SAASn+C,EAAMo+C,GAC/B,GAAI7/C,EAAQ0/C,YAAYj+C,GACpB,MAAOzB,GAAQ0/C,YAAYj+C,EAE/B,IAAIq+C,GAAQr+C,EAAK2O,MAAM,IACvByvC,GAAYA,GAAaC,EAAMA,EAAMv/C,OAAS,IAAM,EACpD,IAAIw/C,GAAmB,YAAbF,EAA0B,IAAM,IACtC9uB,EAAO+uB,EAAMA,EAAMv/C,OAAS,EAChC,IAAiB,UAAbs/C,GAAgC,KAAPE,EAAY,CACrC,GAAI5sC,GAAK,GAAI/D,QAAO,IAAMywC,EAAY,gBAAkBA,EAAY,IAAK,IACzE9uB,GAAOA,EAAKzN,QAAQnQ,EAAI,MAGtB4d,GAAQA,GAAQ8uB,IAAcC,EAAMv/C,OAAS,IAC/CwwB,EAAO+uB,EAAMA,EAAMv/C,OAAS,GAChC,IAAIsY,GAAO7Y,EAAQ6/C,EAAY,OAQ/B,OAPY,OAARhnC,EACAA,EAAO7Y,EAAQk/C,SACD,KAAPa,IACPF,EAAYE,EAAM,IAElBlnC,GAA0B,KAAlBA,EAAKwU,MAAM,MACnBxU,GAAQ,KACLA,EAAOgnC,EAAYE,EAAMhvB,EAAO5xB,KAAK8B,IAAI,WAGpDlC,EAAQihD,aAAe,SAASv+C,EAAMw+C,GAClC,MAAOjgD,GAAQ0/C,YAAYj+C,GAAQw+C,GAGvClhD,EAAQmhD,YACRnhD,EAAQohD,WAAa,SAAStvB,EAAYuvB,GACtC,GAAIphD,GAAQqhD,CACRr9B,OAAMrgB,QAAQkuB,KACdwvB,EAAaxvB,EAAW,GACxBA,EAAaA,EAAW,GAG5B,KACI7xB,EAASuwB,EAASsB,GACpB,MAAO9J,IACT,GAAI/nB,IAAWD,EAAQmhD,SAASrvB,GAC5B,MAAOuvB,IAAUA,EAAOphD,EAO5B,IALKD,EAAQmhD,SAASrvB,KAClB9xB,EAAQmhD,SAASrvB,OAErB9xB,EAAQmhD,SAASrvB,GAAY1iB,KAAKiyC,KAE9BrhD,EAAQmhD,SAASrvB,GAAYtwB,OAAS,GAA1C,CAGA,GAAI+/C,GAAY,WACZ/wB,GAAUsB,GAAa,SAAS7xB,GAC5BD,EAAQ2wC,MAAM,eAAgBjuC,KAAMovB,EAAY7xB,OAAQA,GACxD,IAAI2+C,GAAY5+C,EAAQmhD,SAASrvB,EACjC9xB,GAAQmhD,SAASrvB,GAAc,KAC/B8sB,EAAUrkC,QAAQ,SAAS8mC,GACvBA,GAAUA,EAAOphD,OAK7B,OAAKD,GAAQkC,IAAI,gBAEjBu+C,GAAIxC,WAAWj+C,EAAQ6gD,UAAU/uB,EAAYwvB,GAAaC,GAD/CA,MAGf/B,GAAK,GAiDLx/C,EAAQw/C,KAAOA,CAMf,IAAIgC,IACAC,WAAY,SAASC,GACjBjxC,OAAO0mB,KAAKuqB,GAASnnC,QAAQ,SAAShL,GAClCnP,KAAKuhD,UAAUpyC,EAAKmyC,EAAQnyC,KAC7BnP,OAEPwhD,WAAY,SAASC,GACjB,GAAI/tB,KAUJ,OATK+tB,GAEO59B,MAAMrgB,QAAQi+C,KACtB/tB,EAAS+tB,EACTA,EAAcpxC,OAAO0mB,KAAKrD,IAH1B+tB,EAAcpxC,OAAO0mB,KAAK/2B,KAAK0hD,UAKnCD,EAAYtnC,QAAQ,SAAShL,GACzBukB,EAAOvkB,GAAOnP,KAAK2hD,UAAUxyC,IAC9BnP,MACI0zB,GAEX6tB,UAAW,SAASj/C,EAAM6C,GACtB,GAAInF,KAAK,IAAMsC,KAAU6C,EAAzB,CAEA,GAAIy8C,GAAM5hD,KAAK0hD,SAASp/C,EACxB,KAAKs/C,EAGD,YAFsB,mBAAXhyC,UAA0BA,QAAQiyC,MACzCjyC,QAAQiyC,KAAK,sBAAwBv/C,EAAO,KAGpD,IAAIs/C,EAAIE,UACJ,MAAO9hD,MAAK4hD,EAAIE,YAAc9hD,KAAK4hD,EAAIE,WAAWP,UAAUj/C,EAAM6C,EAEjEy8C,GAAIG,aACL/hD,KAAK,IAAMsC,GAAQ6C,GACnBy8C,GAAOA,EAAI//C,KACX+/C,EAAI//C,IAAItB,KAAKP,KAAMmF,KAE3Bw8C,UAAW,SAASr/C,GAChB,GAAIs/C,GAAM5hD,KAAK0hD,SAASp/C,EACxB,OAAKs/C,GAKDA,EAAIE,UACG9hD,KAAK4hD,EAAIE,YAAc9hD,KAAK4hD,EAAIE,WAAWH,UAAUr/C,GACzDs/C,GAAOA,EAAI9/C,IAAM8/C,EAAI9/C,IAAIvB,KAAKP,MAAQA,KAAK,IAAMsC,QAN9B,mBAAXsN,UAA0BA,QAAQiyC,MACzCjyC,QAAQiyC,KAAK,sBAAwBv/C,EAAO,QASxD0/C,IACJpiD,GAAQqiD,cAAgB,SAAS7xC,EAAKsJ,EAAM7Y,GAgBxC,MAfKuP,GAAIsxC,WACLM,EAAetoC,GAAQtJ,EAAIsxC,aAE/BrxC,OAAO0mB,KAAKl2B,GAASsZ,QAAQ,SAAShL,GAClC,GAAIyyC,GAAM/gD,EAAQsO,EACA,iBAAPyyC,KACPA,GAAOE,UAAWF,IAEtBA,EAAIt/C,OAASs/C,EAAIt/C,KAAO6M,GACxBiB,EAAIsxC,SAASE,EAAIt/C,MAAQs/C,EACrB,gBAAkBA,KAClBxxC,EAAI,IAAMwxC,EAAIt/C,MAAQs/C,EAAIM,gBAElC1lB,EAAIF,UAAUlsB,EAAKgxC,GAEZphD,MAGXJ,EAAQuiD,aAAe,SAAS/xC,GAC5BC,OAAO0mB,KAAK3mB,EAAIsxC,UAAUvnC,QAAQ,SAAShL,GACvC,GAAIyyC,GAAMxxC,EAAIsxC,SAASvyC,EACnB,UAAWyyC,IACXxxC,EAAImxC,UAAUpyC,EAAKyyC,EAAIz8C;IAInCvF,EAAQwiD,gBAAkB,SAAS1oC,EAAMpX,EAAM6C,GAC3C,GAAIk9C,GAAOL,EAAetoC,KAAUsoC,EAAetoC,MAC/C2oC,GAAK//C,KACD+/C,EAAKP,UACLliD,EAAQwiD,gBAAgBC,EAAKP,UAAWx/C,EAAM6C,GAE9Ck9C,EAAK//C,GAAM6C,MAAQA,IAI/BvF,EAAQ0iD,iBAAmB,SAAS5oC,EAAM6oC,GACtClyC,OAAO0mB,KAAKwrB,GAAYpoC,QAAQ,SAAShL,GACrCvP,EAAQwiD,gBAAgB1oC,EAAMvK,EAAKozC,EAAWpzC,SAMtDjD,IAAIpM,OAAO,2BAA2B,UAAU,UAAU,SAAS,gBAAgB,oBAAoB,6BAA6B,mCAAmC,wBAAwB,6BAA6B,cAAe,SAASswB,EAAUxwB,EAASC,GACvQ,YAEA,IAAIkJ,GAAQqnB,EAAS,gBACjBmV,EAAYnV,EAAS,oBACrB6gB,EAAkB7gB,EAAS,sBAAsB6gB,gBACjDuR,EAAuBpyB,EAAS,4BAA4BgmB,cAC5D8B,EAAa9nB,EAAS,iBAAiB8nB,WACvCG,EAAkBjoB,EAAS,sBAAsBioB,gBACjD31C,EAAS0tB,EAAS,aAElBqyB,EAAe,SAASt6C,GACxB,GAAIijC,GAAQprC,IACZA,MAAKmI,OAASA,EAEd,GAAI8oC,GAAgBjxC,MACpB,GAAIwiD,GAAqBxiD,MACzB,GAAIq4C,GAAgBr4C,KAEpB,IAAI0iD,GAAc,SAAS96B,IAClBzf,EAAO8kC,aAAe9kC,EAAO4oC,WAC9B5oC,EAAO4oC,UAAUN,YAAY7oB,GACjCzf,EAAOvC,SAGP+1C,EAAcxzC,EAAOmkC,SAASqW,qBAClC55C,GAAMi9B,YAAY2V,EAAa,QAAS37C,KAAK4iD,aAAazyB,KAAKnwB,KAAM,UACrE+I,EAAMi9B,YAAY2V,EAAa,YAAa37C,KAAKw6C,YAAYrqB,KAAKnwB,KAAM,cACxE+I,EAAM4+B,0BAA0BgU,GAAc,IAAK,IAAK,KAAM37C,KAAM,gBAChEmI,EAAOmkC,SAASuW,aAChB95C,EAAM4+B,0BAA0Bx/B,EAAOmkC,SAASuW,WAAW5nB,OAAQ,IAAK,IAAK,KAAMj7B,KAAM,gBACzF+I,EAAM4+B,0BAA0Bx/B,EAAOmkC,SAASwW,WAAW7nB,OAAQ,IAAK,IAAK,KAAMj7B,KAAM,gBACrFulC,EAAUnB,OACVr7B,EAAMi9B,YAAY79B,EAAOmkC,SAASuW,WAAW5vC,QAAS,YAAayvC,GACnE35C,EAAMi9B,YAAY79B,EAAOmkC,SAASwW,WAAW7vC,QAAS,YAAayvC,KAG3E35C,EAAM49B,sBAAsBx+B,EAAOvH,UAAWZ,KAAKyxC,aAAathB,KAAKnwB,KAAM,cAE3E,IAAI+iD,GAAW56C,EAAOmkC,SAASyL,OAC/BhvC,GAAMi9B,YAAY+c,EAAU,YAAa/iD,KAAK4iD,aAAazyB,KAAKnwB,KAAM,oBACtE+I,EAAMi9B,YAAY+c,EAAU,QAAS/iD,KAAK4iD,aAAazyB,KAAKnwB,KAAM,gBAClE+I,EAAMi9B,YAAY+c,EAAU,WAAY/iD,KAAK4iD,aAAazyB,KAAKnwB,KAAM,mBACrE+I,EAAMi9B,YAAY+c,EAAU,YAAa/iD,KAAK4iD,aAAazyB,KAAKnwB,KAAM,oBAEtE+I,EAAMi9B,YAAY2V,EAAa,YAAa+G,GAE5C35C,EAAMi9B,YAAY+c,EAAU,YAAa,SAASn7B,GAE9C,MADAzf,GAAOvC,QACAmD,EAAMQ,eAAeqe,KAGhCzf,EAAOyF,GAAG,YAAa,SAASga,GAC5B,IAAIwjB,EAAMhe,QAASge,EAAM4X,YAAe5X,EAAM8R,aAA9C,CAGA,GAAI+F,GAAO96C,EAAOmkC,SAASkH,wBAAwB5rB,EAAE+K,EAAG/K,EAAE6rB,GACtD5rC,EAAQM,EAAOwnC,QAAQ1rC,UAAU+rC,WACjC1D,EAAWnkC,EAAOmkC,QAGlBA,GAAS6P,gBADRt0C,EAAMoV,WAAapV,EAAMq7C,YAAYD,EAAK7Q,IAAK6Q,EAAK1Q,QAC7B,UAEA,SAKpC,WACIvyC,KAAK4iD,aAAe,SAAStgD,EAAMslB,GAC/B5nB,KAAKmI,OAAOooC,MAAMjuC,EAAM,GAAI41C,GAAWtwB,EAAG5nB,KAAKmI,UAGnDnI,KAAKw6C,YAAc,SAASl4C,EAAMslB,GAC9B,GAAI42B,GAAYx+C,KAAKmI,OAAOm2C,gBAAkBt+C,KAAKmI,OAAOm2C,eAAe1gC,SACpE4gC,IAAcA,EAAUp9C,QAG7BpB,KAAKmI,OAAOooC,MAAMjuC,EAAM,GAAI41C,GAAWtwB,EAAG5nB,KAAKmI,UAGnDnI,KAAKyxC,aAAe,SAASnvC,EAAMslB,GAC/B,GAAI0uB,GAAa,GAAI4B,GAAWtwB,EAAG5nB,KAAKmI,OACxCmuC,GAAWhB,MAA4B,EAApBt1C,KAAKmjD,aACxB7M,EAAWxP,OAASlf,EAAEkf,OACtBwP,EAAWvP,OAASnf,EAAEmf,OAEtB/mC,KAAKmI,OAAOooC,MAAMjuC,EAAMg0C,IAG5Bt2C,KAAKszC,SAAW,SAASlmB,GACrBptB,KAAKotB,MAAQA,GAGjBptB,KAAKozC,aAAe,SAASX,EAAI2Q,GAC7BpjD,KAAK2yB,EAAI8f,EAAG9f,EACZ3yB,KAAKyzC,EAAIhB,EAAGgB,EAEZzzC,KAAK83C,gBAAiB,CACtB,IAAIxL,GAAWtsC,KAAKmI,OAAOmkC,QACvBA,GAASC,wBACTD,EAASC,sBAAwB,KAErC,IAAI5f,GAAO3sB,KACPw6C,EAAc,SAAS5yB,GACvB,GAAKA,EAAL,CACA,GAAI2d,EAAUT,WAAald,EAAExc,OAASuhB,EAAK02B,aACvC,MAAO12B,GAAK02B,cAEhB12B,GAAKgG,EAAI/K,EAAEwgB,QACXzb,EAAK8mB,EAAI7rB,EAAEygB,QACX+a,GAAoBA,EAAiBx7B,GACrC+E,EAAK2pB,WAAa,GAAI4B,GAAWtwB,EAAG+E,EAAKxkB,QACzCwkB,EAAK22B,aAAc,IAGnBC,EAAe,SAAS37B,GACxByyB,cAAcC,GACdkJ,IACA72B,EAAKA,EAAKS,MAAQ,QAAUT,EAAKA,EAAKS,MAAQ,OAAOxF,GACrD+E,EAAKS,MAAQ,GACyB,MAAlCkf,EAASC,wBACTD,EAASC,uBAAwB,EACjCD,EAASE,yBAEb7f,EAAKmrB,gBAAiB,EACtBnrB,EAAK82B,oBAAsB92B,EAAK02B,aAAe,KAC/Cz7B,GAAK+E,EAAKi2B,aAAa,UAAWh7B,IAGlC47B,EAAoB,WACpB72B,EAAKA,EAAKS,QAAUT,EAAKA,EAAKS,SAC9BT,EAAK22B,aAAc,EAGvB,IAAI/d,EAAUlB,SAA+B,YAApBoO,EAAGjC,SAASxlC,KACjC,MAAOnC,YAAW,WAAY06C,EAAa9Q,IAG/C9lB,GAAK82B,oBAAsBjJ,EAC3B7tB,EAAK02B,aAAet6C,EAAMw9B,QAAQvmC,KAAKmI,OAAOvH,UAAW45C,EAAa+I,EACtE,IAAIjJ,GAAU7yC,YAAY+7C,EAAmB,KAEjDxjD,KAAKqjD,aAAe,KACpBrjD,KAAK0jD,kBAAoB,WACrB,GAAIlO,GAAO,SAAS5tB,GACZA,GAAKA,EAAE4oB,UAA+B,eAAnB5oB,EAAE4oB,SAASxlC,OAElChL,KAAKmI,OAAO+2C,IAAI,oBAAqB1J,GACjC5tB,GAAKA,EAAE4oB,UACPznC,EAAMq9B,UAAUxe,EAAE4oB,YACxBrgB,KAAKnwB,KACP6I,YAAW2sC,EAAM,IACjBx1C,KAAKmI,OAAOyF,GAAG,oBAAqB4nC,MAEzCj1C,KAAKkiD,EAAahhD,WAErBiB,EAAOu/C,cAAcQ,EAAahhD,UAAW,gBACzCkiD,aAAczB,aAAc,GAC5B0B,WAAY1B,aAAe3c,EAAUxB,MAAQ,IAAM,GACnD8f,aAAc3B,cAAc,GAC5B4B,aAAc5B,aAAc,GAC5B6B,qBAAsB7B,cAAc,KAIxCtiD,EAAQ6iD,aAAeA,IAGvBv2C,IAAIpM,OAAO,0BAA0B,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GAChG,YAEA,SAASmkD,GAAY77C,GAEjBA,EAAOyF,GAAG,QAAS,SAASga,GACxB,GAAIwT,GAAWxT,EAAE+qB,sBACbhD,EAAUxnC,EAAOwnC,QACjBsU,EAAOtU,EAAQuU,UAAU9oB,EAASgX,IAAKhX,EAASmX,OAAQ,EACxD0R,KACIr8B,EAAEstB,cACFvF,EAAQwU,WAAWF,GAEnBtU,EAAQyU,WAAWH,GAEvBr8B,EAAE4tB,UAIVrtC,EAAOyF,GAAG,cAAe,SAASga,GAC9B,GAAI+vB,GAAexvC,EAAOmkC,SAASmL,aAAaG,UAAUhwB,EAE1D,IAAoB,eAAhB+vB,EAA+B,CAC/B,GAAIvF,GAAMxqB,EAAE+qB,sBAAsBP,IAC9BzC,EAAUxnC,EAAOwnC,OACjBA,GAAQ0U,aAAe1U,EAAQ0U,YAAYjS,IAC3CjqC,EAAOwnC,QAAQ2U,kBAAkBlS,EAAKxqB,GACrCzf,EAAO8kC,aACR9kC,EAAOvC,QACXgiB,EAAE4tB,UAIVrtC,EAAOyF,GAAG,iBAAkB,SAASga,GACjC,GAAI+vB,GAAexvC,EAAOmkC,SAASmL,aAAaG,UAAUhwB,EAE1D,IAAoB,eAAhB+vB,EAA+B,CAC/B,GAAIvF,GAAMxqB,EAAE+qB,sBAAsBP,IAC9BzC,EAAUxnC,EAAOwnC,QACjBntC,EAAOmtC,EAAQ4U,uBAAuBnS,GAAK,GAC3CvqC,EAAQrF,EAAKqF,OAASrF,EAAKgiD,UAE/B,IAAI38C,EAAO,CACPuqC,EAAMvqC,EAAM8sB,MAAMyd,GAClB,IAAI6R,GAAOtU,EAAQuU,UAAU9R,EAAKzC,EAAQ8U,QAAQrS,GAAKhxC,OAAQ,EAE3D6iD,GACAtU,EAAQwU,WAAWF,IAEnBtU,EAAQ+U,QAAQ,MAAO78C,GACvBM,EAAOmkC,SAAS2H,sBAAsB7B,IAAKvqC,EAAM8sB,MAAMyd,IAAKG,OAAQ,KAG5E3qB,EAAE4tB,UAKd51C,EAAQokD,YAAcA,IAItB93C,IAAIpM,OAAO,2BAA2B,UAAU,UAAU,SAAS,eAAe,iBAAkB,SAASswB,EAAUxwB,EAASC,GAChI,YAEA,IAAI8kD,GAAWv0B,EAAS,eACpBrnB,EAAQqnB,EAAS,gBAEjBw0B,EAAa,SAASz8C,GACtBnI,KAAK6kD,QAAU18C,EACfnI,KAAK8kD,OAAS38C,OAAQA,GACtBnI,KAAK+kD,aACL/kD,KAAKoxC,kBAAkBjpC,EAAO68C,YAGlC,WACIhlD,KAAKoxC,kBAAoB,SAAS6T,GAC9BjlD,KAAKklD,sBAAsBllD,KAAKmlD,iBAChCnlD,KAAKmlD,gBAAkBF,EACvBjlD,KAAKolD,mBAAmBH,EAAI,IAGhCjlD,KAAKqlD,mBAAqB,SAASJ,GAC/B,GAAIK,GAAItlD,KAAK+kD,SACb,IAAIO,EAAEA,EAAElkD,OAAS,IAAM6jD,EAAvB,CAGA,KAAOK,EAAEA,EAAElkD,OAAS,IAAMkkD,EAAEA,EAAElkD,OAAS,IAAMpB,KAAKmlD,iBAC9CnlD,KAAKklD,sBAAsBI,EAAEA,EAAElkD,OAAS,GAE5CpB,MAAKolD,mBAAmBH,EAAI,KAGhCjlD,KAAKolD,mBAAqB,SAASH,EAAIpwB,GACnC,GAAKowB,EAAL,CAEiB,kBAANA,IAAqBA,EAAGM,iBAC/BN,EAAGM,eAAiBN,EACxB,IAAI3hD,GAAItD,KAAK+kD,UAAUz1C,QAAQ21C,EACtB,KAAL3hD,GACAtD,KAAK+kD,UAAU3zC,OAAO9N,EAAG,GAElBY,QAAP2wB,EACA70B,KAAK+kD,UAAU/1C,KAAKi2C,GAEpBjlD,KAAK+kD,UAAU3zC,OAAOyjB,EAAK,EAAGowB,GAEzB,IAAL3hD,GAAW2hD,EAAGO,QACdP,EAAGO,OAAOxlD,KAAK6kD,WAGvB7kD,KAAKklD,sBAAwB,SAASD,GAClC,GAAI3hD,GAAItD,KAAK+kD,UAAUz1C,QAAQ21C,EAC/B,OAAS,IAAL3hD,GACO,GACXtD,KAAK+kD,UAAU3zC,OAAO9N,EAAG,GACzB2hD,EAAGQ,QAAUR,EAAGQ,OAAOzlD,KAAK6kD,UACrB,IAGX7kD,KAAK0lD,mBAAqB,WACtB,MAAO1lD,MAAK+kD,UAAU/kD,KAAK+kD,UAAU3jD,OAAS,IAGlDpB,KAAK2lD,cAAgB,WACjB,GAAInjD,GAAOxC,KAAK8kD,MACZ38C,EAAS3F,EAAK2F,MAClB,OAAOnI,MAAK+kD,UAAUpvB,IAAI,SAAS2vB,GAC/B,MAAOA,GAAEK,eAAiBL,EAAEK,cAAcx9C,EAAQ3F,IAAS,KAC5DozB,OAAO5lB,SAASR,KAAK,MAG5BxP,KAAK4lD,sBAAwB,SAASvgB,EAAQ7B,EAAWn4B,EAASuc,GAK9D,IAAK,GAJDi+B,GACAC,GAAU,EACVd,EAAWhlD,KAAK6kD,QAAQG,SAEnB1hD,EAAItD,KAAK+kD,UAAU3jD,OAAQkC,MAChCuiD,EAAY7lD,KAAK+kD,UAAUzhD,GAAGiiD,eAC1BvlD,KAAK8kD,MAAOzf,EAAQ7B,EAAWn4B,EAASuc,KAEvCi+B,GAAcA,EAAUzoB,UAGzB0oB,EADqB,QAArBD,EAAUzoB,SACA,EAEA4nB,EAAS/wC,KAAK4xC,EAAUzoB,QAASp9B,KAAK6kD,QAASgB,EAAUl2C,KAAMiY,GAEzEk+B,GAAWl+B,GAAe,IAAVyd,GACO,GAAvBwgB,EAAUE,WAAoD,GAA/BF,EAAUzoB,QAAQ2oB,WAEjDh9C,EAAMq9B,UAAUxe,GAEhBk+B,OAGR,MAAOA,IAGX9lD,KAAKyvC,aAAe,SAAS7nB,EAAGyd,EAAQh6B,GACpC,GAAIm4B,GAAYmhB,EAAQphB,gBAAgBl4B,EACxCrL,MAAK4lD,sBAAsBvgB,EAAQ7B,EAAWn4B,EAASuc,IAG3D5nB,KAAK6uC,YAAc,SAAS1oC,GACxB,GAAI2/C,GAAU9lD,KAAK4lD,sBAAsB,GAAIz/C,EACxC2/C,IACD9lD,KAAK6kD,QAAQG,SAAS/wC,KAAK,eAAgBjU,KAAK6kD,QAAS1+C,MAGlE5F,KAAKqkD,EAAWnjD,WAEnB7B,EAAQglD,WAAaA,IAGrB14C,IAAIpM,OAAO,aAAa,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACnF,YACA,IAAImmD,GAAgB,SAASC,EAAIC,GAC7B,MAAOD,GAAG7T,IAAM8T,EAAG9T,KAAO6T,EAAG1T,OAAS2T,EAAG3T,QAEzC4T,EAAQ,SAASC,EAAUC,EAAaC,EAAQC,GAChDvmD,KAAK20B,OACDyd,IAAKgU,EACL7T,OAAQ8T,GAGZrmD,KAAKqyC,KACDD,IAAKkU,EACL/T,OAAQgU,KAIhB,WACIvmD,KAAKwmD,QAAU,SAAS3+C,GACpB,MAAO7H,MAAK20B,MAAMyd,MAAQvqC,EAAM8sB,MAAMyd,KAClCpyC,KAAKqyC,IAAID,MAAQvqC,EAAMwqC,IAAID,KAC3BpyC,KAAK20B,MAAM4d,SAAW1qC,EAAM8sB,MAAM4d,QAClCvyC,KAAKqyC,IAAIE,SAAW1qC,EAAMwqC,IAAIE,QAEtCvyC,KAAKsQ,SAAW,WACZ,MAAQ,WAAatQ,KAAK20B,MAAMyd,IAAM,IAAMpyC,KAAK20B,MAAM4d,OACnD,SAAWvyC,KAAKqyC,IAAID,IAAM,IAAMpyC,KAAKqyC,IAAIE,OAAS,KAG1DvyC,KAAKg1C,SAAW,SAAS5C,EAAKG,GAC1B,MAAoC,IAA7BvyC,KAAKymD,QAAQrU,EAAKG,IAE7BvyC,KAAK0mD,aAAe,SAAS7+C,GACzB,GAAIyqC,GACAD,EAAMxqC,EAAMwqC,IACZ1d,EAAQ9sB,EAAM8sB,KAGlB,OADA2d,GAAMtyC,KAAKymD,QAAQpU,EAAID,IAAKC,EAAIE,QACrB,GAAPD,GACAA,EAAMtyC,KAAKymD,QAAQ9xB,EAAMyd,IAAKzd,EAAM4d,QACzB,GAAPD,EACO,EACO,GAAPA,EACA,EAEA,GAEG,IAAPA,EACA,IAEPA,EAAMtyC,KAAKymD,QAAQ9xB,EAAMyd,IAAKzd,EAAM4d,QACzB,IAAPD,EACO,GACO,GAAPA,EACA,GAEA,IAInBtyC,KAAK8zC,aAAe,SAASpzC,GACzB,MAAOV,MAAKymD,QAAQ/lD,EAAE0xC,IAAK1xC,EAAE6xC,SAEjCvyC,KAAK2mD,cAAgB,SAAS9+C,GAC1B,MAAyC,IAAlC7H,KAAK8zC,aAAajsC,EAAM8sB,QAA+C,GAAhC30B,KAAK8zC,aAAajsC,EAAMwqC,MAE1EryC,KAAK4mD,WAAa,SAAS/+C,GACvB,GAAIyqC,GAAMtyC,KAAK0mD,aAAa7+C,EAC5B,OAAe,IAAPyqC,GAAoB,GAAPA,GAAmB,GAAPA,GAErCtyC,KAAK6mD,MAAQ,SAASzU,EAAKG,GACvB,MAAOvyC,MAAKqyC,IAAID,KAAOA,GAAOpyC,KAAKqyC,IAAIE,QAAUA,GAErDvyC,KAAK8mD,QAAU,SAAS1U,EAAKG,GACzB,MAAOvyC,MAAK20B,MAAMyd,KAAOA,GAAOpyC,KAAK20B,MAAM4d,QAAUA,GAEzDvyC,KAAK6S,SAAW,SAASu/B,EAAKG,GACR,gBAAPH,IACPpyC,KAAK20B,MAAM4d,OAASH,EAAIG,OACxBvyC,KAAK20B,MAAMyd,IAAMA,EAAIA,MAErBpyC,KAAK20B,MAAMyd,IAAMA,EACjBpyC,KAAK20B,MAAM4d,OAASA,IAG5BvyC,KAAK+S,OAAS,SAASq/B,EAAKG,GACN,gBAAPH,IACPpyC,KAAKqyC,IAAIE,OAASH,EAAIG,OACtBvyC,KAAKqyC,IAAID,IAAMA,EAAIA,MAEnBpyC,KAAKqyC,IAAID,IAAMA,EACfpyC,KAAKqyC,IAAIE,OAASA,IAG1BvyC,KAAK+mD,OAAS,SAAS3U,EAAKG,GACxB,MAAiC,IAA7BvyC,KAAKymD,QAAQrU,EAAKG,GACdvyC,KAAK6mD,MAAMzU,EAAKG,IAAWvyC,KAAK8mD,QAAQ1U,EAAKG,IACtC,GAEA,GAGR,GAEXvyC,KAAKkjD,YAAc,SAAS9Q,EAAKG,GAC7B,MAAiC,IAA7BvyC,KAAKymD,QAAQrU,EAAKG,GACdvyC,KAAK6mD,MAAMzU,EAAKG,IACT,GAEA,GAGR,GAEXvyC,KAAKgnD,UAAY,SAAS5U,EAAKG,GAC3B,MAAiC,IAA7BvyC,KAAKymD,QAAQrU,EAAKG,GACdvyC,KAAK8mD,QAAQ1U,EAAKG,IACX,GAEA,GAGR,GAEXvyC,KAAKymD,QAAU,SAASrU,EAAKG,GACzB,MAAKvyC,MAAK+0C,eACF3C,IAAQpyC,KAAK20B,MAAMyd,IAKvBA,EAAMpyC,KAAK20B,MAAMyd,IACV,GAEPA,EAAMpyC,KAAKqyC,IAAID,IACR,EAEPpyC,KAAK20B,MAAMyd,MAAQA,EACZG,GAAUvyC,KAAK20B,MAAM4d,OAAS,EAAI,GAEzCvyC,KAAKqyC,IAAID,MAAQA,EACVG,GAAUvyC,KAAKqyC,IAAIE,OAAS,EAAI,EAEpC,EAhBQA,EAASvyC,KAAK20B,MAAM4d,OAAS,GAAMA,EAASvyC,KAAKqyC,IAAIE,OAAS,EAAI,GAkBrFvyC,KAAKinD,aAAe,SAAS7U,EAAKG,GAC9B,MAAIvyC,MAAK20B,MAAMyd,KAAOA,GAAOpyC,KAAK20B,MAAM4d,QAAUA,EACvC,GAEAvyC,KAAKymD,QAAQrU,EAAKG,IAGjCvyC,KAAKknD,WAAa,SAAS9U,EAAKG,GAC5B,MAAIvyC,MAAKqyC,IAAID,KAAOA,GAAOpyC,KAAKqyC,IAAIE,QAAUA,EACnC,EAEAvyC,KAAKymD,QAAQrU,EAAKG,IAGjCvyC,KAAKmnD,cAAgB,SAAS/U,EAAKG,GAC/B,MAAIvyC,MAAKqyC,IAAID,KAAOA,GAAOpyC,KAAKqyC,IAAIE,QAAUA,EACnC,EACAvyC,KAAK20B,MAAMyd,KAAOA,GAAOpyC,KAAK20B,MAAM4d,QAAUA,EAC9C,GAEAvyC,KAAKymD,QAAQrU,EAAKG,IAGjCvyC,KAAKonD,SAAW,SAASC,EAAUC,GAC/B,GAAItnD,KAAKqyC,IAAID,IAAMkV,EACf,GAAIjV,IAAOD,IAAKkV,EAAU,EAAG/U,OAAQ,OACpC,IAAIvyC,KAAKqyC,IAAID,IAAMiV,EACpB,GAAIhV,IAAOD,IAAKiV,EAAU9U,OAAQ,EAEtC,IAAIvyC,KAAK20B,MAAMyd,IAAMkV,EACjB,GAAI3yB,IAASyd,IAAKkV,EAAU,EAAG/U,OAAQ,OACtC,IAAIvyC,KAAK20B,MAAMyd,IAAMiV,EACtB,GAAI1yB,IAASyd,IAAKiV,EAAU9U,OAAQ,EAExC,OAAO4T,GAAMoB,WAAW5yB,GAAS30B,KAAK20B,MAAO0d,GAAOryC,KAAKqyC,MAE7DryC,KAAKyC,OAAS,SAAS2vC,EAAKG,GACxB,GAAID,GAAMtyC,KAAKymD,QAAQrU,EAAKG,EAE5B,IAAW,GAAPD,EACA,MAAOtyC,KACN,IAAW,IAAPsyC,EACL,GAAI3d,IAASyd,IAAKA,EAAKG,OAAQA,OAE/B,IAAIF,IAAOD,IAAKA,EAAKG,OAAQA,EAEjC,OAAO4T,GAAMoB,WAAW5yB,GAAS30B,KAAK20B,MAAO0d,GAAOryC,KAAKqyC,MAG7DryC,KAAKid,QAAU,WACX,MAAQjd,MAAK20B,MAAMyd,MAAQpyC,KAAKqyC,IAAID,KAAOpyC,KAAK20B,MAAM4d,SAAWvyC,KAAKqyC,IAAIE,QAE9EvyC,KAAK+0C,YAAc,WACf,MAAQ/0C,MAAK20B,MAAMyd,MAAQpyC,KAAKqyC,IAAID,KAExCpyC,KAAKoW,MAAQ,WACT,MAAO+vC,GAAMoB,WAAWvnD,KAAK20B,MAAO30B,KAAKqyC,MAE7CryC,KAAKwnD,aAAe,WAChB,MAAuB,IAAnBxnD,KAAKqyC,IAAIE,OACF,GAAI4T,GAAMnmD,KAAK20B,MAAMyd,IAAK,EAAG7pC,KAAKE,IAAIzI,KAAK20B,MAAMyd,IAAKpyC,KAAKqyC,IAAID,IAAI,GAAI,GAEvE,GAAI+T,GAAMnmD,KAAK20B,MAAMyd,IAAK,EAAGpyC,KAAKqyC,IAAID,IAAK,IAE1DpyC,KAAKynD,cAAgB,SAAS9X,GAC1B,GAAI+X,GAAiB/X,EAAQgY,yBAAyB3nD,KAAK20B,OACvDizB,EAAejY,EAAQgY,yBAAyB3nD,KAAKqyC,IAEzD,OAAO,IAAI8T,GACPuB,EAAetV,IAAKsV,EAAenV,OACnCqV,EAAaxV,IAAKwV,EAAarV,SAGvCvyC,KAAK6nD,OAAS,SAASzV,EAAKG,GACxBvyC,KAAK20B,MAAMyd,KAAOA,EAClBpyC,KAAK20B,MAAM4d,QAAUA,EACrBvyC,KAAKqyC,IAAID,KAAOA,EAChBpyC,KAAKqyC,IAAIE,QAAUA,KAGxBhyC,KAAK4lD,EAAM1kD,WACd0kD,EAAMoB,WAAa,SAAS5yB,EAAO0d,GAC/B,MAAO,IAAI8T,GAAMxxB,EAAMyd,IAAKzd,EAAM4d,OAAQF,EAAID,IAAKC,EAAIE,SAE3D4T,EAAMH,cAAgBA,EAEtBG,EAAMH,cAAgB,SAASC,EAAIC,GAC/B,MAAOD,GAAG7T,IAAM8T,EAAG9T,KAAO6T,EAAG1T,OAAS2T,EAAG3T,QAI7C3yC,EAAQumD,MAAQA,IAGhBj6C,IAAIpM,OAAO,iBAAiB,UAAU,UAAU,SAAS,cAAc,eAAe,wBAAwB,aAAc,SAASswB,EAAUxwB,EAASC,GACxJ,YAEA,IAAI28B,GAAMpM,EAAS,aACfib,EAAOjb,EAAS,cAChB+tB,EAAe/tB,EAAS,uBAAuB+tB,aAC/CgI,EAAQ/1B,EAAS,WAAW+1B,MAC5B2B,EAAY,SAASnY,GACrB3vC,KAAK2vC,QAAUA,EACf3vC,KAAKm5B,IAAMwW,EAAQoY,cAEnB/nD,KAAK6vC,iBACL7vC,KAAKgoD,KAAOhoD,KAAKioD,cAAgBjoD,KAAKm5B,IAAI+uB,aAAa,EAAG,GAC1DloD,KAAKojB,OAASpjB,KAAKmoD,gBAAkBnoD,KAAKm5B,IAAI+uB,aAAa,EAAG,EAE9D,IAAIv7B,GAAO3sB,IACXA,MAAKgoD,KAAKp6C,GAAG,SAAU,SAASga,GAC5B+E,EAAK4jB,MAAM,gBACN5jB,EAAKy7B,UACNz7B,EAAK4jB,MAAM,mBACV5jB,EAAK07B,4BAA8BzgC,EAAEm3B,IAAIxM,QAAU3qB,EAAEziB,MAAMotC,SAC5D5lB,EAAK27B,eAAiB,QAG9BtoD,KAAKmoD,gBAAgBv6C,GAAG,SAAU,WACzB+e,EAAKy7B,UACNz7B,EAAK4jB,MAAM,uBAIvB,WAEI/T,EAAIF,UAAUt8B,KAAMm+C,GACpBn+C,KAAKid,QAAU,WACX,MAAQjd,MAAKooD,UACTpoD,KAAKojB,OAAOgvB,KAAOpyC,KAAKgoD,KAAK5V,KAC7BpyC,KAAKojB,OAAOmvB,QAAUvyC,KAAKgoD,KAAKzV,QAGxCvyC,KAAK+0C,YAAc,WACf,MAAI/0C,MAAKid,WACE,EAGJjd,KAAKgwC,WAAW+E,eAE3B/0C,KAAKuoD,UAAY,WACb,MAAOvoD,MAAKgoD,KAAKQ,eAErBxoD,KAAKg0C,mBAAqB,SAAS5B,EAAKG,GACpCvyC,KAAKojB,OAAO4yB,YAAY5D,EAAKG,GAEzBvyC,KAAKooD,WACLpoD,KAAKooD,UAAW,EAChBpoD,KAAKuwC,MAAM,qBAGnBvwC,KAAKyoD,mBAAqB,WACtB,MAAIzoD,MAAKooD,SACEpoD,KAAK0oD,mBAEL1oD,KAAKojB,OAAOolC,eAE3BxoD,KAAK0oD,iBAAmB,WACpB,MAAO1oD,MAAKgoD,KAAKQ,eAErBxoD,KAAK2oD,eAAiB,SAASC,GAC3B,GAAI5oD,KAAKooD,SAEL,WADApoD,MAAK6oD,aAAa7oD,KAAKgoD,KAAK5V,IAAKpyC,KAAKgoD,KAAKzV,OAASqW,EAIxD,IAAIxlC,GAASpjB,KAAKyoD,qBACdT,EAAOhoD,KAAK0oD,mBAEZI,EAAc9oD,KAAK8oD,aAElBA,IAAiC,IAAlB1lC,EAAOmvB,QACvBvyC,KAAKg0C,mBAAmB5wB,EAAOgvB,IAAKhvB,EAAOmvB,OAASqW,IAEpDE,GAA+B,IAAhBd,EAAKzV,SACpBvyC,KAAK+oD,eAAe,WAChB/oD,KAAK6oD,aAAab,EAAK5V,IAAK4V,EAAKzV,OAASqW,MAItD5oD,KAAK8oD,YAAc,WACf,GAAI1lC,GAASpjB,KAAKojB,OACd4kC,EAAOhoD,KAAKgoD,IAChB,OAAQ5kC,GAAOgvB,IAAM4V,EAAK5V,KAAQhvB,EAAOgvB,KAAO4V,EAAK5V,KAAOhvB,EAAOmvB,OAASyV,EAAKzV,QAErFvyC,KAAKgwC,SAAW,WACZ,GAAI5sB,GAASpjB,KAAKojB,OACd4kC,EAAOhoD,KAAKgoD,IAEhB,OAAIhoD,MAAKid,UACEkpC,EAAMoB,WAAWS,EAAMA,GAE9BhoD,KAAK8oD,cACE3C,EAAMoB,WAAWS,EAAM5kC,GAGvB+iC,EAAMoB,WAAWnkC,EAAQ4kC,IAGxChoD,KAAK6vC,eAAiB,WACb7vC,KAAKooD,WACNpoD,KAAKooD,UAAW,EAChBpoD,KAAKuwC,MAAM,qBAGnBvwC,KAAKsuC,UAAY,WACb,GAAIgZ,GAAUtnD,KAAKm5B,IAAIyd,YAAc,CACrC52C,MAAKg0C,mBAAmB,EAAG,GAC3Bh0C,KAAK6oD,aAAavB,EAAStnD,KAAKm5B,IAAIsrB,QAAQ6C,GAASlmD,SAEzDpB,KAAKiwC,SACLjwC,KAAK+rC,kBAAoB,SAASlkC,EAAO4hC,GACjCA,GACAzpC,KAAKg0C,mBAAmBnsC,EAAMwqC,IAAID,IAAKvqC,EAAMwqC,IAAIE,QACjDvyC,KAAK63C,SAAShwC,EAAM8sB,MAAMyd,IAAKvqC,EAAM8sB,MAAM4d,UAE3CvyC,KAAKg0C,mBAAmBnsC,EAAM8sB,MAAMyd,IAAKvqC,EAAM8sB,MAAM4d,QACrDvyC,KAAK63C,SAAShwC,EAAMwqC,IAAID,IAAKvqC,EAAMwqC,IAAIE,SAEvCvyC,KAAKgwC,WAAW/yB,YAChBjd,KAAKooD,UAAW,GACpBpoD,KAAKsoD,eAAiB,MAG1BtoD,KAAK+oD,eAAiB,SAASC,GAC3B,GAAIhB,GAAOhoD,KAAKgoD,IACZhoD,MAAKooD,UACLpoD,KAAKg0C,mBAAmBgU,EAAK5V,IAAK4V,EAAKzV,QAE3CyW,EAAMzoD,KAAKP,OAEfA,KAAK63C,SAAW,SAASzF,EAAKG,GAC1BvyC,KAAK+oD,eAAe,WAChB/oD,KAAK6oD,aAAazW,EAAKG,MAG/BvyC,KAAK2zC,iBAAmB,SAAS9e,GAC7B70B,KAAK+oD,eAAe,WAChB/oD,KAAK24C,qBAAqB9jB,MAGlC70B,KAAK0W,OAAS,SAAS07B,EAAKG,GACxBvyC,KAAK6vC,iBACL7vC,KAAK6oD,aAAazW,EAAKG,IAE3BvyC,KAAKgzC,eAAiB,SAASne,GAC3B70B,KAAK6vC,iBACL7vC,KAAK24C,qBAAqB9jB,IAE9B70B,KAAKipD,SAAW,WACZjpD,KAAK+oD,eAAe/oD,KAAKkpD,eAE7BlpD,KAAKmpD,WAAa,WACdnpD,KAAK+oD,eAAe/oD,KAAKopD,iBAE7BppD,KAAKqpD,YAAc,WACfrpD,KAAK+oD,eAAe/oD,KAAKspD,kBAE7BtpD,KAAKupD,WAAa,WACdvpD,KAAK+oD,eAAe/oD,KAAKwpD,iBAE7BxpD,KAAKypD,gBAAkB,WACnBzpD,KAAK+oD,eAAe/oD,KAAK0pD,sBAE7B1pD,KAAK2pD,cAAgB,WACjB3pD,KAAK+oD,eAAe/oD,KAAK4pD,oBAE7B5pD,KAAK6pD,cAAgB,WACjB7pD,KAAK+oD,eAAe/oD,KAAK8pD,oBAE7B9pD,KAAK+pD,gBAAkB,WACnB/pD,KAAK+oD,eAAe/oD,KAAKgqD,sBAE7BhqD,KAAKiqD,gBAAkB,WACnBjqD,KAAK+oD,eAAe/oD,KAAKkqD,sBAE7BlqD,KAAKmqD,eAAiB,WAClBnqD,KAAK+oD,eAAe/oD,KAAKoqD,qBAE7BpqD,KAAK80C,aAAe,SAAS1C,EAAKG,GAC9B,GAAqB,mBAAVA,GAAuB,CAC9B,GAAIr0B,GAASk0B,GAAOpyC,KAAKgoD,IACzB5V,GAAMl0B,EAAOk0B,IACbG,EAASr0B,EAAOq0B,OAEpB,MAAOvyC,MAAK2vC,QAAQmF,aAAa1C,EAAKG,IAE1CvyC,KAAKqqD,WAAa,WACdrqD,KAAK+rC,kBAAkB/rC,KAAK80C,iBAEhC90C,KAAKsqD,YAAc,WACf,GAAIpsC,GAASle,KAAKuoD,YACd1gD,EAAQ7H,KAAK2vC,QAAQ4a,cAAcrsC,EAAOk0B,IAAKl0B,EAAOq0B,OAC1DvyC,MAAK+rC,kBAAkBlkC,IAG3B7H,KAAKi1C,aAAe,SAAS7C,EAAKoY,GAC9B,GACIC,GADAC,EAAyB,gBAAPtY,GAAkBA,EAAMpyC,KAAKgoD,KAAK5V,IAGpDuY,EAAW3qD,KAAK2vC,QAAQib,YAAYF,EAOxC,OANIC,IACAD,EAAWC,EAASh2B,MAAMyd,IAC1BqY,EAASE,EAAStY,IAAID,KAEtBqY,EAASC,EAETF,KAAoB,EACb,GAAIrE,GAAMuE,EAAU,EAAGD,EAAQzqD,KAAK2vC,QAAQ8U,QAAQgG,GAAQrpD,QAE5D,GAAI+kD,GAAMuE,EAAU,EAAGD,EAAS,EAAG,IAElDzqD,KAAK6qD,WAAa,WACd7qD,KAAK+rC,kBAAkB/rC,KAAKi1C,iBAEhCj1C,KAAKkpD,aAAe,WAChBlpD,KAAK8qD,aAAa,GAAI,IAE1B9qD,KAAKopD,eAAiB,WAClBppD,KAAK8qD,aAAa,EAAG,IAEzB9qD,KAAKwpD,eAAiB,WAClB,GACIvF,GADA/lC,EAASle,KAAKgoD,KAAKQ,aAGvB,IAAIvE,EAAOjkD,KAAK2vC,QAAQuU,UAAUhmC,EAAOk0B,IAAKl0B,EAAOq0B,OAAQ,IACzDvyC,KAAK6oD,aAAa5E,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,YAC1C,IAAsB,IAAlBr0B,EAAOq0B,OACVr0B,EAAOk0B,IAAM,GACbpyC,KAAK6oD,aAAa3qC,EAAOk0B,IAAM,EAAGpyC,KAAKm5B,IAAIsrB,QAAQvmC,EAAOk0B,IAAM,GAAGhxC,YAGtE,CACD,GAAI2pD,GAAU/qD,KAAK2vC,QAAQqb,YACvBhrD,MAAK2vC,QAAQsb,UAAU/sC,IAAWle,KAAKm5B,IAAIsrB,QAAQvmC,EAAOk0B,KAAKlkB,MAAMhQ,EAAOq0B,OAAOwY,EAAS7sC,EAAOq0B,QAAQthC,MAAM,KAAK7P,OAAO,GAAK2pD,EAClI/qD,KAAK8qD,aAAa,GAAIC,GAEtB/qD,KAAK8qD,aAAa,EAAG,MAGjC9qD,KAAKspD,gBAAkB,WACnB,GACIrF,GADA/lC,EAASle,KAAKgoD,KAAKQ,aAEvB,IAAIvE,EAAOjkD,KAAK2vC,QAAQuU,UAAUhmC,EAAOk0B,IAAKl0B,EAAOq0B,OAAQ,GACzDvyC,KAAK6oD,aAAa5E,EAAK5R,IAAID,IAAK6R,EAAK5R,IAAIE,YAExC,IAAIvyC,KAAKgoD,KAAKzV,QAAUvyC,KAAKm5B,IAAIsrB,QAAQzkD,KAAKgoD,KAAK5V,KAAKhxC,OACrDpB,KAAKgoD,KAAK5V,IAAMpyC,KAAKm5B,IAAIyd,YAAc,GACvC52C,KAAK6oD,aAAa7oD,KAAKgoD,KAAK5V,IAAM,EAAG,OAGxC,CACD,GAAI2Y,GAAU/qD,KAAK2vC,QAAQqb,aACvB9sC,EAASle,KAAKgoD,IACdhoD,MAAK2vC,QAAQsb,UAAU/sC,IAAWle,KAAKm5B,IAAIsrB,QAAQvmC,EAAOk0B,KAAKlkB,MAAMhQ,EAAOq0B,OAAQr0B,EAAOq0B,OAAOwY,GAAS95C,MAAM,KAAK7P,OAAO,GAAK2pD,EAClI/qD,KAAK8qD,aAAa,EAAGC,GAErB/qD,KAAK8qD,aAAa,EAAG,KAGjC9qD,KAAK0pD,oBAAsB,WACvB,GAAItX,GAAMpyC,KAAKgoD,KAAK5V,IAChBG,EAASvyC,KAAKgoD,KAAKzV,OACnBsE,EAAY72C,KAAK2vC,QAAQqH,oBAAoB5E,EAAKG,GAClD2Y,EAAsBlrD,KAAK2vC,QAAQwb,yBAAyBtU,EAAW,GACvEuU,EAAeprD,KAAK2vC,QAAQ0b,eAC5BjZ,EAAK,KAAM8Y,EAAoB9Y,IAC/B8Y,EAAoB3Y,QAGpB+Y,EAAeF,EAAa77C,MAAM,OAClC+7C,GAAa,GAAGlqD,QAAUmxC,GAAWvyC,KAAK2vC,QAAQ4b,0BAClDL,EAAoB3Y,QAAU+Y,EAAa,GAAGlqD,QAClDpB,KAAK24C,qBAAqBuS,IAE9BlrD,KAAK4pD,kBAAoB,WACrB,GAAI5B,GAAOhoD,KAAKgoD,KACZwD,EAAUxrD,KAAK2vC,QAAQ8b,iCAAiCzD,EAAK5V,IAAK4V,EAAKzV,OAC3E,IAAIvyC,KAAKgoD,KAAKzV,QAAUiZ,EAAQjZ,OAAQ,CACpC,GAAI3kB,GAAO5tB,KAAK2vC,QAAQ8U,QAAQ+G,EAAQpZ,IACxC,IAAIoZ,EAAQjZ,QAAU3kB,EAAKxsB,OAAQ,CAC/B,GAAIsqD,GAAU99B,EAAKlpB,OAAO,OACtBgnD,GAAU,IACVF,EAAQjZ,OAASmZ,IAI7B1rD,KAAK6oD,aAAa2C,EAAQpZ,IAAKoZ,EAAQjZ,SAE3CvyC,KAAK8pD,kBAAoB,WACrB,GAAI1X,GAAMpyC,KAAKm5B,IAAIyd,YAAc,EAC7BrE,EAASvyC,KAAKm5B,IAAIsrB,QAAQrS,GAAKhxC,MACnCpB,MAAK6oD,aAAazW,EAAKG,IAE3BvyC,KAAKgqD,oBAAsB,WACvBhqD,KAAK6oD,aAAa,EAAG,IAEzB7oD,KAAK2rD,wBAA0B,WAC3B,GAKIp8C,GALA6iC,EAAMpyC,KAAKgoD,KAAK5V,IAChBG,EAASvyC,KAAKgoD,KAAKzV,OACnB3kB,EAAO5tB,KAAKm5B,IAAIsrB,QAAQrS,GACxBwZ,EAAgBh+B,EAAKxJ,UAAUmuB,EAGnCvyC,MAAK2vC,QAAQkc,WAAWj5B,UAAY,EACpC5yB,KAAK2vC,QAAQmc,QAAQl5B,UAAY,CACjC,IAAIqxB,GAAOjkD,KAAK2vC,QAAQuU,UAAU9R,EAAKG,EAAQ,EAC/C,OAAI0R,OACAjkD,MAAK6oD,aAAa5E,EAAK5R,IAAID,IAAK6R,EAAK5R,IAAIE,UAGzChjC,EAAQvP,KAAK2vC,QAAQkc,WAAW53C,KAAK23C,MACrCrZ,GAAUvyC,KAAK2vC,QAAQkc,WAAWj5B,UAClC5yB,KAAK2vC,QAAQkc,WAAWj5B,UAAY,EACpCg5B,EAAgBh+B,EAAKxJ,UAAUmuB,IAE/BA,GAAU3kB,EAAKxsB,QACfpB,KAAK6oD,aAAazW,EAAKxkB,EAAKxsB,QAC5BpB,KAAKspD,uBACDlX,EAAMpyC,KAAKm5B,IAAIyd,YAAc,GAC7B52C,KAAKkqD,0BAGT36C,EAAQvP,KAAK2vC,QAAQmc,QAAQ73C,KAAK23C,MAClCrZ,GAAUvyC,KAAK2vC,QAAQmc,QAAQl5B,UAC/B5yB,KAAK2vC,QAAQmc,QAAQl5B,UAAY,OAGrC5yB,MAAK6oD,aAAazW,EAAKG,MAE3BvyC,KAAK+rD,uBAAyB,WAC1B,GAEI9H,GAFA7R,EAAMpyC,KAAKgoD,KAAK5V,IAChBG,EAASvyC,KAAKgoD,KAAKzV,MAEvB,IAAI0R,EAAOjkD,KAAK2vC,QAAQuU,UAAU9R,EAAKG,EAAQ,IAE3C,WADAvyC,MAAK6oD,aAAa5E,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,OAIjD,IAAI31B,GAAM5c,KAAK2vC,QAAQqc,gBAAgB5Z,EAAKG,EAAQ,GACzC,OAAP31B,IACAA,EAAM5c,KAAKm5B,IAAIsrB,QAAQrS,GAAKhuB,UAAU,EAAGmuB,GAG7C,IACIhjC,GADA08C,EAAe5gB,EAAK7B,cAAc5sB,EAStC,OAPA5c,MAAK2vC,QAAQkc,WAAWj5B,UAAY,EACpC5yB,KAAK2vC,QAAQmc,QAAQl5B,UAAY,GAC7BrjB,EAAQvP,KAAK2vC,QAAQkc,WAAW53C,KAAKg4C,MACrC1Z,GAAUvyC,KAAK2vC,QAAQkc,WAAWj5B,UAClCq5B,EAAeA,EAAa/9B,MAAMluB,KAAK2vC,QAAQkc,WAAWj5B,WAC1D5yB,KAAK2vC,QAAQkc,WAAWj5B,UAAY,GAE1B,GAAV2f,GACAvyC,KAAK6oD,aAAazW,EAAK,GACvBpyC,KAAKwpD,sBACDpX,EAAM,GACNpyC,KAAKoqD,yBAGT76C,EAAQvP,KAAK2vC,QAAQmc,QAAQ73C,KAAKg4C,MAClC1Z,GAAUvyC,KAAK2vC,QAAQmc,QAAQl5B,UAC/B5yB,KAAK2vC,QAAQmc,QAAQl5B,UAAY,OAGrC5yB,MAAK6oD,aAAazW,EAAKG,KAG3BvyC,KAAKksD,mBAAqB,SAASN,GAC/B,GAAIr8C,GAAkBkf,EAAXtd,EAAQ,EACfg7C,EAAe,KACfL,EAAU9rD,KAAK2vC,QAAQmc,OAG3B,IADAA,EAAQl5B,UAAY,EAChBrjB,EAAQvP,KAAK2vC,QAAQmc,QAAQ73C,KAAK23C,GAClCz6C,EAAQnR,KAAK2vC,QAAQmc,QAAQl5B,cAC1B,CACH,MAAQnE,EAAKm9B,EAAcz6C,KAAWg7C,EAAa98C,KAAKof,IACpDtd,GAEJ,IAAY,EAARA,EAEC,IADD26C,EAAQl5B,UAAY,GACXnE,EAAKm9B,EAAcz6C,MAAY26C,EAAQz8C,KAAKof,IAGjD,GAFAq9B,EAAQl5B,UAAY,EACpBzhB,IACIg7C,EAAa98C,KAAKof,GAAK,CACvB,GAAItd,EAAQ,EAAG,CACXA,GACA,OAEA,MAAQsd,EAAKm9B,EAAcz6C,KAAWg7C,EAAa98C,KAAKof,IACpDtd,GACJ,IAAIA,EAAQ,EACR,OAQxB,MAFA26C,GAAQl5B,UAAY,EAEbzhB,GAGXnR,KAAKosD,yBAA2B,WAC5B,GAAIha,GAAMpyC,KAAKgoD,KAAK5V,IAChBG,EAASvyC,KAAKgoD,KAAKzV,OACnB3kB,EAAO5tB,KAAKm5B,IAAIsrB,QAAQrS,GACxBwZ,EAAgBh+B,EAAKxJ,UAAUmuB,GAE/B0R,EAAOjkD,KAAK2vC,QAAQuU,UAAU9R,EAAKG,EAAQ,EAC/C,IAAI0R,EACA,MAAOjkD,MAAK6oD,aAAa5E,EAAK5R,IAAID,IAAK6R,EAAK5R,IAAIE,OAEpD,IAAIA,GAAU3kB,EAAKxsB,OAAQ,CACvB,GAAIkwB,GAAItxB,KAAKm5B,IAAIyd,WACjB,GACIxE,KACAwZ,EAAgB5rD,KAAKm5B,IAAIsrB,QAAQrS,SACtB9gB,EAAN8gB,GAAW,QAAQ/iC,KAAKu8C,GAE5B,QAAOv8C,KAAKu8C,KACbA,EAAgB,IACpBrZ,EAAS,EAGb,GAAIphC,GAAQnR,KAAKksD,mBAAmBN,EAEpC5rD,MAAK6oD,aAAazW,EAAKG,EAASphC,IAGpCnR,KAAKqsD,wBAA0B,WAC3B,GAGIpI,GAHA7R,EAAMpyC,KAAKgoD,KAAK5V,IAChBG,EAASvyC,KAAKgoD,KAAKzV,MAGvB,IAAI0R,EAAOjkD,KAAK2vC,QAAQuU,UAAU9R,EAAKG,EAAQ,IAC3C,MAAOvyC,MAAK6oD,aAAa5E,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,OAExD,IAAI3kB,GAAO5tB,KAAK2vC,QAAQ8U,QAAQrS,GAAKhuB,UAAU,EAAGmuB,EAClD,IAAe,IAAXA,EAAc,CACd,EACIH,KACAxkB,EAAO5tB,KAAKm5B,IAAIsrB,QAAQrS,SACnBA,EAAM,GAAK,QAAQ/iC,KAAKue,GAEjC2kB,GAAS3kB,EAAKxsB,OACT,OAAOiO,KAAKue,KACbA,EAAO,IAGf,GAAIq+B,GAAe5gB,EAAK7B,cAAc5b,GAClCzc,EAAQnR,KAAKksD,mBAAmBD,EAEpC,OAAOjsD,MAAK6oD,aAAazW,EAAKG,EAASphC,IAG3CnR,KAAKkqD,oBAAsB,WACnBlqD,KAAK2vC,QAAQ2c,iBACbtsD,KAAK2rD,0BAEL3rD,KAAKosD,4BAGbpsD,KAAKoqD,mBAAqB,WAClBpqD,KAAK2vC,QAAQ2c,iBACbtsD,KAAK+rD,yBAEL/rD,KAAKqsD,2BAEbrsD,KAAK8qD,aAAe,SAASyB,EAAMx9C,GAC/B,GAAIy9C,GAAYxsD,KAAK2vC,QAAQgY,yBACzB3nD,KAAKgoD,KAAK5V,IACVpyC,KAAKgoD,KAAKzV,OAGA,KAAVxjC,IACI/O,KAAKsoD,eACLkE,EAAUja,OAASvyC,KAAKsoD,eAExBtoD,KAAKsoD,eAAiBkE,EAAUja,OAGxC,IAAIka,GAASzsD,KAAK2vC,QAAQwb,yBAAyBqB,EAAUpa,IAAMma,EAAMC,EAAUja,OAEtE,KAATga,GAAwB,IAAVx9C,GAAe09C,EAAOra,MAAQpyC,KAAKgoD,KAAK5V,KAAOqa,EAAOla,SAAWvyC,KAAKgoD,KAAKzV,QACrFvyC,KAAK2vC,QAAQ+c,aAAe1sD,KAAK2vC,QAAQ+c,YAAYD,EAAOra,MAC5Dqa,EAAOra,MAEfpyC,KAAK6oD,aAAa4D,EAAOra,IAAKqa,EAAOla,OAASxjC,EAAiB,IAAVA,IAEzD/O,KAAK24C,qBAAuB,SAASvd,GACjCp7B,KAAK6oD,aAAaztB,EAASgX,IAAKhX,EAASmX,SAE7CvyC,KAAK6oD,aAAe,SAASzW,EAAKG,EAAQoa,GACtC,GAAI1I,GAAOjkD,KAAK2vC,QAAQuU,UAAU9R,EAAKG,EAAQ,EAC3C0R,KACA7R,EAAM6R,EAAKtvB,MAAMyd,IACjBG,EAAS0R,EAAKtvB,MAAM4d,QAGxBvyC,KAAKqoD,4BAA6B,EAClCroD,KAAKgoD,KAAKhS,YAAY5D,EAAKG,GAC3BvyC,KAAKqoD,4BAA6B,EAE7BsE,IACD3sD,KAAKsoD,eAAiB,OAE9BtoD,KAAK4sD,mBAAqB,SAASxa,EAAKG,EAAQoa,GAC5C,GAAI93B,GAAM70B,KAAK2vC,QAAQwb,yBAAyB/Y,EAAKG,EACrDvyC,MAAK6oD,aAAah0B,EAAIud,IAAKvd,EAAI0d,OAAQoa,IAE3C3sD,KAAKylD,OAAS,WACVzlD,KAAKgoD,KAAKvC,SACVzlD,KAAKojB,OAAOqiC,SACZzlD,KAAK2vC,QAAU3vC,KAAKm5B,IAAM,MAG9Bn5B,KAAK26C,kBAAoB,SAAS9yC,GAC9B7H,KAAK+rC,kBAAkBlkC,EAAOA,EAAMqW,QAAUrW,EAAM8sB,OACpD30B,KAAKsoD,eAAiBzgD,EAAMglD,eAAiB7sD,KAAKsoD,gBAGtDtoD,KAAK+5C,gBAAkB,SAASlyC,GAC5B,GAAIwlB,GAAIrtB,KAAKgwC,UAYb,OAXInoC,IACAA,EAAM8sB,MAAM4d,OAASllB,EAAEsH,MAAM4d,OAC7B1qC,EAAM8sB,MAAMyd,IAAM/kB,EAAEsH,MAAMyd,IAC1BvqC,EAAMwqC,IAAIE,OAASllB,EAAEglB,IAAIE,OACzB1qC,EAAMwqC,IAAID,IAAM/kB,EAAEglB,IAAID,KAEtBvqC,EAAQwlB,EAGZxlB,EAAMqW,OAASle,KAAK8oD,cAAgBjhD,EAAM8sB,MAAQ9sB,EAAMwqC,IACxDxqC,EAAMglD,cAAgB7sD,KAAKsoD,eACpBzgD,GAEX7H,KAAK8sD,oBAAsB,SAASC,GAChC,GAAIp4B,GAAQ30B,KAAKuoD,WACjB,KACIwE,EAAKxsD,KAAK,KAAMP,KAChB,IAAIqyC,GAAMryC,KAAKuoD,WACf,OAAOpC,GAAMoB,WAAW5yB,EAAM0d,GAChC,MAAMzqB,GACJ,MAAOu+B,GAAMoB,WAAW5yB,EAAMA,GAChC,QACE30B,KAAK24C,qBAAqBhkB,KAIlC30B,KAAKgtD,OAAS,WACV,GAAIhtD,KAAKwS,WACL,GAAIhQ,GAAOxC,KAAKitD,OAAOt3B,IAAI,SAAStI,GAChC,GAAI6/B,GAAK7/B,EAAEjX,OAEX,OADA82C,GAAGpE,YAAcz7B,EAAEnP,QAAUmP,EAAEsH,MACxBu4B,QAER,CACH,GAAI1qD,GAAOxC,KAAKgwC,UAChBxtC,GAAKsmD,YAAc9oD,KAAK8oD,cAE5B,MAAOtmD,IAGXxC,KAAKmtD,SAAW,SAAS3qD,GACrB,GAAkB0B,QAAd1B,EAAKmyB,MAAoB,CACzB,GAAI30B,KAAKotD,UAAW,CAChBptD,KAAKqtD,cAAc7qD,EAAK,GACxB,KAAK,GAAIc,GAAId,EAAKpB,OAAQkC,KAAO,CAC7B,GAAI+pB,GAAI84B,EAAMoB,WAAW/kD,EAAKc,GAAGqxB,MAAOnyB,EAAKc,GAAG+uC,IAC5C7vC,GAAKsmD,cACLz7B,EAAEnP,OAASmP,EAAEsH,OACjB30B,KAAKqS,SAASgb,GAAG,GAErB,OAEA7qB,EAAOA,EAAK,GAEhBxC,KAAKotD,WACLptD,KAAKqtD,cAAc7qD,GACvBxC,KAAK+rC,kBAAkBvpC,EAAMA,EAAKsmD,cAGtC9oD,KAAKwmD,QAAU,SAAShkD,GACpB,IAAKA,EAAKpB,QAAUpB,KAAKwS,aAAehQ,EAAKpB,QAAUpB,KAAKwS,WACxD,OAAO,CACX,KAAKhQ,EAAKpB,SAAWpB,KAAKitD,OACtB,MAAOjtD,MAAKgwC,WAAWwW,QAAQhkD,EAEnC,KAAK,GAAIc,GAAItD,KAAKitD,OAAO7rD,OAAQkC,KAC7B,IAAKtD,KAAKitD,OAAO3pD,GAAGkjD,QAAQhkD,EAAKc,IAC7B,OAAO,CAEf,QAAO,KAGZ/C,KAAKunD,EAAUrmD,WAElB7B,EAAQkoD,UAAYA,IAGpB57C,IAAIpM,OAAO,iBAAiB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACvF,YACA,IAAIytD,GAAkB,IAClBC,EAAY,SAASn+B,GACrBpvB,KAAKwtD,OAASp+B,EAEdpvB,KAAKytD,WACLztD,KAAK0tD,gBACL,KAAK,GAAIv+C,KAAOnP,MAAKwtD,OAAQ,CAQzB,IAAK,GAPDpgC,GAAQptB,KAAKwtD,OAAOr+C,GACpBw+C,KACAC,EAAa,EACbC,EAAU7tD,KAAK0tD,cAAcv+C,IAAQ2+C,aAAc,QACnDC,EAAO,IAEPC,KACK1qD,EAAI,EAAGA,EAAI8pB,EAAMhsB,OAAQkC,IAAK,CACnC,GAAI2qD,GAAO7gC,EAAM9pB,EAKjB,IAJI2qD,EAAKH,eACLD,EAAQC,aAAeG,EAAKH,cAC5BG,EAAKC,kBACLH,EAAO,MACO,MAAdE,EAAK/7B,MAAT,CAGI+7B,EAAK/7B,gBAAiBjiB,UACtBg+C,EAAK/7B,MAAQ+7B,EAAK/7B,MAAM5hB,WAAW4d,MAAM,EAAG,IAChD,IAAIigC,GAAgBF,EAAK/7B,MACrBk8B,EAAa,GAAIn+C,QAAO,OAASk+C,EAAgB,UAAUl6C,KAAK,KAAK7S,OAAS,CAC9EyiB,OAAMrgB,QAAQyqD,EAAKvhC,OACM,GAArBuhC,EAAKvhC,MAAMtrB,QAA6B,GAAdgtD,EAC1BH,EAAKvhC,MAAQuhC,EAAKvhC,MAAM,GACjB0hC,EAAa,GAAKH,EAAKvhC,MAAMtrB,QACpCpB,KAAKquD,YAAY,qDACbJ,KAAMA,EACNK,WAAYF,EAAa,IAE7BH,EAAKvhC,MAAQuhC,EAAKvhC,MAAM,KAExBuhC,EAAKM,WAAaN,EAAKvhC,MACvBuhC,EAAKvhC,MAAQ,KACbuhC,EAAKO,QAAUxuD,KAAKyuD,cAEI,kBAAdR,GAAKvhC,OAAwBuhC,EAAKO,UAC5CJ,EAAa,EACbH,EAAKO,QAAUxuD,KAAK0uD,YAEpBT,EAAKO,QAAUP,EAAKvhC,OAGxB0hC,EAAa,IACT,OAAO/+C,KAAK4+C,EAAK/7B,OACjBi8B,EAAgBF,EAAK/7B,MAAM/N,QAAQ,cAAe,SAAS5U,EAAOo/C,GAC9D,MAAO,MAAQl0B,SAASk0B,EAAO,IAAMf,EAAa,MAGtDQ,EAAa,EACbD,EAAgBnuD,KAAK4uD,sBAAsBX,EAAK/7B,QAE/C+7B,EAAKY,YAAmC,gBAAdZ,GAAKvhC,OAChCshC,EAAeh/C,KAAKi/C,IAG5BJ,EAAQD,GAActqD,EACtBsqD,GAAcQ,EAEdT,EAAY3+C,KAAKm/C,GACZF,EAAKO,UACNP,EAAKO,QAAU,OAGlBb,EAAYvsD,SACbysD,EAAQ,GAAK,EACbF,EAAY3+C,KAAK,MAGrBg/C,EAAe7zC,QAAQ,SAAS8zC,GAC5BA,EAAKY,WAAa7uD,KAAK8uD,qBAAqBb,EAAK/7B,MAAO67B,IACzD/tD,MAEHA,KAAKytD,QAAQt+C,GAAO,GAAIc,QAAO,IAAM09C,EAAYn+C,KAAK,OAAS,QAASu+C,MAIhF,WACI/tD,KAAK+uD,kBAAoB,SAASvuD,GAC9B8sD,EAAsB,EAAJ9sD,GAGtBR,KAAK0uD,YAAc,SAAS9xC,GACxB,GAAIoyC,GAAShvD,KAAK6uD,WAAW56C,KAAK2I,GAAKsR,MAAM,GACzC+sB,EAAQj7C,KAAK0sB,MAAM7c,MAAM7P,KAAMgvD,EACnC,IAAqB,gBAAV/T,GACP,QAASjwC,KAAMiwC,EAAO91C,MAAOyX,GAGjC,KAAK,GADDqyC,MACK3rD,EAAI,EAAGguB,EAAI2pB,EAAM75C,OAAYkwB,EAAJhuB,EAAOA,IACjC0rD,EAAO1rD,KACP2rD,EAAOA,EAAO7tD,SACV4J,KAAMiwC,EAAM33C,GACZ6B,MAAO6pD,EAAO1rD,IAG1B,OAAO2rD,IAGXjvD,KAAKyuD,aAAe,SAAS7xC,GACzB,IAAKA,EACD,QACJ,IAAIoyC,GAAShvD,KAAK6uD,WAAW56C,KAAK2I,EAClC,KAAKoyC,EACD,MAAO,MAGX,KAAK,GAFDC,MACAhU,EAAQj7C,KAAKuuD,WACRjrD,EAAI,EAAGguB,EAAI2pB,EAAM75C,OAAYkwB,EAAJhuB,EAAOA,IACjC0rD,EAAO1rD,EAAI,KACX2rD,EAAOA,EAAO7tD,SACV4J,KAAMiwC,EAAM33C,GACZ6B,MAAO6pD,EAAO1rD,EAAI,IAG9B,OAAO2rD,IAGXjvD,KAAK4uD,sBAAwB,SAASnT,GAClC,GAAIpuB,GAAIouB,EAAIt3B,QACR,0CACA,SAASwO,EAAG8gB,GAAI,MAAOA,GAAI,MAAQ9gB,GAEvC,OAAOtF,IAGXrtB,KAAK8uD,qBAAuB,SAASrT,EAAKsS,GACtC,GAA0B,IAAtBtS,EAAInsC,QAAQ,OAAc,CAC1B,GAAIgd,GAAQ,EACR4iC,GAAY,EACZC,IACJ1T,GAAIt3B,QAAQ,uCAAwC,SAChD3jB,EAAG2iC,EAAKisB,EAAWC,EAAYC,EAAQn+C,GAmBvC,MAjBI+9C,GACAA,EAAsB,KAAVI,EACLA,EACPJ,GAAY,EACLG,GACH/iC,GAAS6iC,EAAY7iC,QACrB6iC,EAAY9c,IAAMlhC,EAAM,EACxBg+C,EAAY7iC,MAAQ,IAExBA,KACO8iC,IACP9iC,IACwB,GAApB8iC,EAAUhuD,SACV+tD,EAAY7iC,MAAQA,EACpB6iC,EAAYx6B,MAAQxjB,IAGrB3Q,IAGY,MAAnB2uD,EAAY9c,KAAe,QAAQhjC,KAAKosC,EAAIzsB,OAAOmgC,EAAY9c,QAC/DoJ,EAAMA,EAAIr3B,UAAU,EAAG+qC,EAAYx6B,OAAS8mB,EAAIzsB,OAAOmgC,EAAY9c,MAE3E,MAAO,IAAIpiC,QAAOwrC,GAAMsS,GAAM,IAAI5pC,QAAQ,IAAK,MAEnDnkB,KAAKuvD,cAAgB,SAAS3hC,EAAM4hC,GAChC,GAAIA,GAAmC,gBAAdA,GAAwB,CAC7C,GAAIljC,GAAQkjC,EAAWthC,MAAM,EAC7BshC,GAAaljC,EAAM,GACA,SAAfkjC,IACAljC,EAAM2Q,QACNuyB,EAAaljC,EAAM2Q,aAGvB,IAAI3Q,KAER,IAAImjC,GAAeD,GAAc,QAC7BpiC,EAAQptB,KAAKwtD,OAAOiC,EACnBriC,KACDqiC,EAAe,QACfriC,EAAQptB,KAAKwtD,OAAOiC,GAExB,IAAI5B,GAAU7tD,KAAK0tD,cAAc+B,GAC7Bz7C,EAAKhU,KAAKytD,QAAQgC,EACtBz7C,GAAG4e,UAAY,CAQf,KANA,GAAIrjB,GAAO0/C,KACPr8B,EAAY,EACZ88B,EAAgB,EAEhBhjC,GAAS1hB,KAAM,KAAM7F,MAAO,IAEzBoK,EAAQyE,EAAGC,KAAK2Z,IAAO,CAC1B,GAAI5iB,GAAO6iD,EAAQC,aACfG,EAAO,KACP9oD,EAAQoK,EAAM,GACd4B,EAAQ6C,EAAG4e,SAEf,IAAIzhB,EAAQhM,EAAM/D,OAASwxB,EAAW,CAClC,GAAI+8B,GAAU/hC,EAAKxJ,UAAUwO,EAAWzhB,EAAQhM,EAAM/D,OAClDsrB,GAAM1hB,MAAQA,EACd0hB,EAAMvnB,OAASwqD,GAEXjjC,EAAM1hB,MACNikD,EAAOjgD,KAAK0d,GAChBA,GAAS1hB,KAAMA,EAAM7F,MAAOwqD,IAIpC,IAAK,GAAIrsD,GAAI,EAAGA,EAAIiM,EAAMnO,OAAO,EAAGkC,IAChC,GAAqBY,SAAjBqL,EAAMjM,EAAI,GAAd,CAGA2qD,EAAO7gC,EAAMygC,EAAQvqD,IAGjB0H,EADAijD,EAAKO,QACEP,EAAKO,QAAQrpD,EAAOsqD,EAAcnjC,GAElC2hC,EAAKvhC,MAEZuhC,EAAKriD,OAED6jD,EADoB,gBAAbxB,GAAKriD,KACGqiD,EAAKriD,KAELqiD,EAAKriD,KAAK6jD,EAAcnjC,GAG3Cc,EAAQptB,KAAKwtD,OAAOiC,GACfriC,IACDptB,KAAKquD,YAAY,sBAAuBoB,GACxCA,EAAe,QACfriC,EAAQptB,KAAKwtD,OAAOiC,IAExB5B,EAAU7tD,KAAK0tD,cAAc+B,GAC7B78B,EAAYzhB,EACZ6C,EAAKhU,KAAKytD,QAAQgC,GAClBz7C,EAAG4e,UAAYzhB,EAEnB,OAGJ,GAAIhM,EACA,GAAoB,gBAAT6F,GACDijD,GAAQA,EAAK2B,SAAU,GAAUljC,EAAM1hB,OAASA,GAG9C0hB,EAAM1hB,MACNikD,EAAOjgD,KAAK0d,GAChBA,GAAS1hB,KAAMA,EAAM7F,MAAOA,IAJ5BunB,EAAMvnB,OAASA,MAMhB,IAAI6F,EAAM,CACT0hB,EAAM1hB,MACNikD,EAAOjgD,KAAK0d,GAChBA,GAAS1hB,KAAM,KAAM7F,MAAO,GAC5B,KAAK,GAAI7B,GAAI,EAAGA,EAAI0H,EAAK5J,OAAQkC,IAC7B2rD,EAAOjgD,KAAKhE,EAAK1H,IAI7B,GAAIsvB,GAAahF,EAAKxsB,OAClB,KAIJ,IAFAwxB,EAAYzhB,EAERu+C,IAAkBpC,EAAiB,CAOnC,IANIoC,EAAgB,EAAI9hC,EAAKxsB,QACzBpB,KAAKquD,YAAY,uCACbmB,WAAYA,EACZ5hC,KAAMA,IAGPgF,EAAYhF,EAAKxsB,QAChBsrB,EAAM1hB,MACNikD,EAAOjgD,KAAK0d,GAChBA,GACIvnB,MAAOyoB,EAAKxJ,UAAUwO,EAAWA,GAAa,KAC9C5nB,KAAM,WAGdykD,GAAe,QACfnjC,IACA,QAWR,MAPII,GAAM1hB,MACNikD,EAAOjgD,KAAK0d,GAEZJ,EAAMlrB,OAAS,GACXkrB,EAAM,KAAOmjC,GACbnjC,EAAM3S,QAAQ,OAAQ81C,IAG1BR,OAASA,EACT7hC,MAAQd,EAAMlrB,OAASkrB,EAAQmjC,IAIvCzvD,KAAKquD,YAAc,SAASwB,EAAKrtD,GAC7B,GAAIolB,GAAI,GAAI7mB,OAAM8uD,EAClBjoC,GAAEplB,KAAOA,EACa,gBAAXoN,UAAuBA,QAAQxM,OACtCwM,QAAQxM,MAAMwkB,GAClB/e,WAAW,WAAa,KAAM+e,QAEnCrnB,KAAKgtD,EAAU9rD,WAElB7B,EAAQ2tD,UAAYA,IAGpBrhD,IAAIpM,OAAO,iCAAiC,UAAU,UAAU,SAAS,gBAAiB,SAASswB,EAAUxwB,EAASC,GACtH,YAEA,IAAIwrC,GAAOjb,EAAS,eAEhB0/B,EAAqB,WAErB9vD,KAAK+vD,QACDp7B,QACIjI,MAAQ,aACRwF,MAAQ,OAER47B,aAAe,YAK3B,WAEI9tD,KAAKgwD,SAAW,SAAS5gC,EAAO6gC,GAC5B,GAAKA,EAKL,IAAK,GAAI9gD,KAAOigB,GAAO,CAEnB,IAAK,GADDhC,GAAQgC,EAAMjgB,GACT7L,EAAI,EAAGA,EAAI8pB,EAAMhsB,OAAQkC,IAAK,CACnC,GAAI2qD,GAAO7gC,EAAM9pB,IACb2qD,EAAKriD,MAAQqiD,EAAKO,WACM,gBAAbP,GAAKriD,KACRqiD,EAAKiC,WAAgD,IAAnCjC,EAAKiC,UAAU5gD,QAAQ2gD,KACzChC,EAAKiC,UAAYD,EAAShC,EAAKiC,WAED,IAA9BjC,EAAKriD,KAAK0D,QAAQ2gD,KAClBhC,EAAKriD,KAAOqkD,EAAShC,EAAKriD,OAI1C5L,KAAK+vD,OAAOE,EAAS9gD,GAAOie,MAlB5B,KAAK,GAAIje,KAAOigB,GACZpvB,KAAK+vD,OAAO5gD,GAAOigB,EAAMjgB,IAqBrCnP,KAAKmwD,SAAW,WACZ,MAAOnwD,MAAK+vD,QAGhB/vD,KAAKowD,WAAa,SAAUC,EAAgBJ,EAAQK,EAAa9C,EAAQt3C,GACrE,GAAIk6C,GAAsC,kBAAlBC,IAClB,GAAIA,IAAiBF,WACrBE,CACN,IAAI7C,EACA,IAAK,GAAIlqD,GAAI,EAAGA,EAAIkqD,EAAOpsD,OAAQkC,IAC/BkqD,EAAOlqD,GAAK2sD,EAASzC,EAAOlqD,OAC7B,CACHkqD,IACA,KAAK,GAAIr+C,KAAOihD,GACZ5C,EAAOx+C,KAAKihD,EAAS9gD,GAK7B,GAFAnP,KAAKgwD,SAASI,EAAYH,GAEtBK,EAEA,IAAK,GADDN,GAAWnsC,MAAMpiB,UAAUyU,EAAS,OAAS,WACxC5S,EAAI,EAAGA,EAAIkqD,EAAOpsD,OAAQkC,IAC/B0sD,EAASngD,MAAM7P,KAAK+vD,OAAOvC,EAAOlqD,IAAK+nC,EAAKrB,SAASsmB,GAGxDtwD,MAAKuwD,UACNvwD,KAAKuwD,YACTvwD,KAAKuwD,QAAQvhD,KAAKihD,IAGtBjwD,KAAKwwD,UAAY,WACb,MAAOxwD,MAAKuwD,QAGhB,IAAI1gC,GAAY,SAAS4/B,EAAcnjC,GAGnC,OAFoB,SAAhBmjC,GAA2BnjC,EAAMlrB,SACjCkrB,EAAM3S,QAAQ3Z,KAAKkwD,UAAWT,GAC3BzvD,KAAKkwD,WAEZzgC,EAAW,SAASggC,EAAcnjC,GAElC,MADAA,GAAM2Q,QACC3Q,EAAM2Q,SAAW,QAG5Bj9B,MAAKywD,eAAiB,WAGlB,QAASC,GAAavhD,GAClB,GAAIie,GAAQgC,EAAMjgB,EAClBie,GAAMujC,WAAY,CAClB,KAAK,GAAIrtD,GAAI,EAAGA,EAAI8pB,EAAMhsB,OAAQkC,IAAK,CACnC,GAAI2qD,GAAO7gC,EAAM9pB,IACZ2qD,EAAK/7B,OAAS+7B,EAAKt5B,QACpBs5B,EAAK/7B,MAAQ+7B,EAAKt5B,MACbs5B,EAAKriD,OACNqiD,EAAKriD,SACTqiD,EAAKriD,KAAKoD,MACN8+C,aAAcG,EAAKvhC,QAEnBA,MAAOuhC,EAAKvhC,MAAQ,OACpBwF,MAAO+7B,EAAK5b,KAAO4b,EAAKt5B,MACxB/oB,KAAM,QAEVqiD,EAAKvhC,MAAQuhC,EAAKvhC,MAAQ,SAC1BuhC,EAAKj/C,MAAO,EAEhB,IAAIpD,GAAOqiD,EAAKriD,MAAQqiD,EAAKj/C,IAC7B,IAAIpD,GAAQiY,MAAMrgB,QAAQoI,GAAO,CAC7B,GAAIglD,GAAY3C,EAAK2C,SAChBA,KACDA,EAAY3C,EAAKvhC,MACO,gBAAbkkC,KACPA,EAAYA,EAAU,IAAM,IAC5BxhC,EAAMwhC,KACNA,GAAavwD,MAErB+uB,EAAMwhC,GAAahlD,EACnBqiD,EAAKriD,KAAOglD,EACZF,EAAaE,OACE,OAARhlD,IACPqiD,EAAKriD,KAAO6jB,EAShB,IANIw+B,EAAKj/C,OACLi/C,EAAKiC,UAAYjC,EAAKriD,MAAQqiD,EAAKj/C,KACnCi/C,EAAKriD,KAAOikB,QACLo+B,GAAKj/C,MAGZi/C,EAAK7+B,MACL,IAAK,GAAI/B,KAAK4gC,GAAK7+B,MACXA,EAAM/B,GACF+B,EAAM/B,GAAGre,MACTogB,EAAM/B,GAAGre,KAAKa,MAAMuf,EAAM/B,GAAI4gC,EAAK7+B,MAAM/B,IAE7C+B,EAAM/B,GAAK4gC,EAAK7+B,MAAM/B,EAIlC,IAAI4gC,EAAKl0B,SAA0B,gBAARk0B,GACvB,GAAI4C,GAAc5C,EAAKl0B,SAAWk0B,EAC9B6C,EAAW1hC,EAAMyhC,OACdhtC,OAAMrgB,QAAQyqD,KACrB6C,EAAW7C,EAEf,IAAI6C,EAAU,CACV,GAAInhD,IAAQrM,EAAG,GAAGqY,OAAOm1C,EACrB7C,GAAK8C,WACLphD,EAAOA,EAAKimB,OAAO,SAASjD,GAAI,OAAQA,EAAE/mB,QAC9CwhB,EAAMhc,OAAOvB,MAAMud,EAAOzd,GAC1BrM,IACAwtD,EAAW,KAGX7C,EAAK+C,aACL/C,EAAKvhC,MAAQ1sB,KAAKixD,oBACdhD,EAAK+C,WAAY/C,EAAKH,cAAgB,OAAQG,EAAKC,uBAEhDD,GAAKH,eAzExB,GAAIztD,GAAK,EACL+uB,EAAQpvB,KAAK+vD,MA4EjB1/C,QAAO0mB,KAAK3H,GAAOjV,QAAQu2C,EAAc1wD,OAG7CA,KAAKixD,oBAAsB,SAASt7B,EAAKm4B,EAAc37B,EAAY++B,GAC/D,GAAIC,GAAW9gD,OAAOvN,OAAO,KAc7B,OAbAuN,QAAO0mB,KAAKpB,GAAKxb,QAAQ,SAAShR,GAC9B,GAAIsG,GAAIkmB,EAAIxsB,EACRgpB,KACA1iB,EAAIA,EAAE6L,cAEV,KAAK,GADD8J,GAAO3V,EAAEwB,MAAMigD,GAAa,KACvB5tD,EAAI8hB,EAAKhkB,OAAQkC,KACtB6tD,EAAS/rC,EAAK9hB,IAAM6F,IAExBkH,OAAO8lB,eAAeg7B,KACtBA,EAAS/6B,UAAY,MAEzBp2B,KAAKoxD,aAAe/gD,OAAO0mB,KAAKo6B,GAChCx7B,EAAM,KACCxD,EACD,SAAShtB,GAAQ,MAAOgsD,GAAShsD,EAAMmW,gBAAkBwyC,GACzD,SAAS3oD,GAAQ,MAAOgsD,GAAShsD,IAAU2oD,IAGrD9tD,KAAKqxD,YAAc,WACf,MAAOrxD,MAAKsxD,aAGjB/wD,KAAKuvD,EAAmBruD,WAE3B7B,EAAQkwD,mBAAqBA,IAG7B5jD,IAAIpM,OAAO,sBAAsB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GAC5F,YAEA,IAAI0xD,GAAY,WACbvxD,KAAKwxD,iBAGR,WAEIxxD,KAAKyG,IAAM,SAAUnE,EAAMkE,EAAQ0B,GAC/B,OAAQhE,QACN,IAAKlE,MAAKwxD,YACNxxD,KAAKwxD,cACT,KAAKxxD,MAAKwxD,YAAYlvD,GAClBtC,KAAKwxD,YAAYlvD,MAEvBtC,KAAKwxD,YAAYlvD,GAAMkE,GAAU0B,GAGrClI,KAAKyxD,cAAgB,SAAUC,GAC3B,IAAK,GAAIviD,KAAOuiD,GACZ,IAAK,GAAIlrD,KAAUkrD,GAAWviD,GAC1BnP,KAAKyG,IAAI0I,EAAK3I,EAAQkrD,EAAWviD,GAAK3I,KAKlDxG,KAAKi1B,OAAS,SAAU3yB,GAChBtC,KAAKwxD,aAAexxD,KAAKwxD,YAAYlvD,UAC9BtC,MAAKwxD,YAAYlvD,IAIhCtC,KAAK2xD,QAAU,SAAUjwD,EAAMk0B,GAC3B,GAAoB,kBAATl0B,GACP,GAAIgwD,IAAa,GAAIhwD,IAAOkwD,cAAch8B,OAE1C,IAAI87B,GAAahwD,EAAKkwD,cAAch8B,EAExC51B,MAAKyxD,cAAcC,IAGvB1xD,KAAK4xD,cAAgB,SAAUh8B,GAC3B,GAAKA,EAEE,CAEH,IAAK,GADD8G,MACKp5B,EAAI,EAAGA,EAAIsyB,EAAOx0B,OAAQkC,IAC3BtD,KAAKwxD,YAAY57B,EAAOtyB,MACxBo5B,EAAI9G,EAAOtyB,IAAMtD,KAAKwxD,YAAY57B,EAAOtyB,IAGjD,OAAOo5B,GARP,MAAO18B,MAAKwxD,eAYrBjxD,KAAKgxD,EAAU9vD,WAElB7B,EAAQ2xD,UAAYA,IAGpBrlD,IAAIpM,OAAO,eAAe,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACrF,YA2CA,SAASgyD,GAAmBC,GACxB,GAAIC,GAAY,QAChB,KAAK,GAAIzvD,KAAQwvD,GACblyD,EAAQoyD,SAAS1vD,GAAQwvD,EAAKxvD,GAAM6hB,QAAQ4tC,EAAW,SA7C/DnyD,EAAQoyD,YAERH,GACII,EAAI,4sFACJC,GAAI;AACJC,GAAI,o8EACJC,GAAI,0DACJC,GAAI,8QACJC,GAAI,knEACJC,EAAI,izCACJC,GAAI,4tCACJC,GAAI,qsBACJC,GAAI,0CACJC,EAAI,4hBACJC,GAAI,8TACJC,GAAI,6DACJC,GAAI,+MACJC,EAAI,40BACJC,GAAI,wEACJC,GAAI,mSACJC,GAAI,+RACJC,GAAI,mDACJC,GAAI,2CACJC,GAAI,wCACJC,GAAI,+xBACJC,EAAI,0kCACJC,GAAI,mWACJC,GAAI,yFACJC,GAAI,4KACJC,GAAI,43BACJC,EAAI,gDACJC,GAAI,wCACJC,GAAI,OACJC,GAAI,OACJC,EAAI,0mFACJC,GAAI,qBACJC,GAAI,iFACJC,GAAI,YACJC,GAAI,YACJC,GAAI,ikFAWRnoD,IAAIpM,OAAO,sBAAsB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GAC5F,YACA,IAAIy0D,GAAgB,SAAS3kB,EAAS4kB,EAAYC,GAC9Cx0D,KAAKy0D,SAAW9kB,EAChB3vC,KAAK00D,KAAOH,EACZv0D,KAAK20D,WAAahlB,EAAQilB,UAAUL,EAEpC,IAAI7nC,GAAQijB,EAAQklB,WAAWN,EAAYC,EAC3Cx0D,MAAK80D,YAAcpoC,EAAQA,EAAMvb,MAAQ,KAG7C,WACInR,KAAK+0D,aAAe,WAGhB,IAFA/0D,KAAK80D,aAAe,EAEb90D,KAAK80D,YAAc,GAAG,CAEzB,GADA90D,KAAK00D,MAAQ,EACT10D,KAAK00D,KAAO,EAEZ,MADA10D,MAAK00D,KAAO,EACL,IAGX10D,MAAK20D,WAAa30D,KAAKy0D,SAASG,UAAU50D,KAAK00D,MAC/C10D,KAAK80D,YAAc90D,KAAK20D,WAAWvzD,OAAS,EAGhD,MAAOpB,MAAK20D,WAAW30D,KAAK80D,cAEhC90D,KAAKg1D,YAAc,WACfh1D,KAAK80D,aAAe,CAEpB,KADA,GAAIG,GACGj1D,KAAK80D,aAAe90D,KAAK20D,WAAWvzD,QAAQ,CAI/C,GAHApB,KAAK00D,MAAQ,EACRO,IACDA,EAAWj1D,KAAKy0D,SAAS7d,aACzB52C,KAAK00D,MAAQO,EAEb,MADAj1D,MAAK00D,KAAOO,EAAW,EAChB,IAGXj1D,MAAK20D,WAAa30D,KAAKy0D,SAASG,UAAU50D,KAAK00D,MAC/C10D,KAAK80D,YAAc,EAGvB,MAAO90D,MAAK20D,WAAW30D,KAAK80D,cAEhC90D,KAAKk1D,gBAAkB,WACnB,MAAOl1D,MAAK20D,WAAW30D,KAAK80D,cAEhC90D,KAAKm1D,mBAAqB,WACtB,MAAOn1D,MAAK00D,MAEhB10D,KAAKo1D,sBAAwB,WACzB,GAAIC,GAAYr1D,KAAK20D,WACjBW,EAAat1D,KAAK80D,YAClBviB,EAAS8iB,EAAUC,GAAY3gC,KACnC,IAAezwB,SAAXquC,EACA,MAAOA,EAGX,KADAA,EAAS,EACF+iB,EAAa,GAChBA,GAAc,EACd/iB,GAAU8iB,EAAUC,GAAYnwD,MAAM/D,MAG1C,OAAOmxC,MAGZhyC,KAAK+zD,EAAc7yD,WAEtB7B,EAAQ00D,cAAgBA,IAGxBpoD,IAAIpM,OAAO,iBAAiB,UAAU,UAAU,SAAS,gBAAgB,gCAAgC,qBAAqB,cAAc,eAAe,qBAAqB,aAAc,SAASswB,EAAUxwB,EAASC,GAC1N,YAEA,IAAI0tD,GAAYn9B,EAAS,gBAAgBm9B,UACrCuC,EAAqB1/B,EAAS,0BAA0B0/B,mBACxDyB,EAAYnhC,EAAS,eAAemhC,UACpCgE,EAAUnlC,EAAS,cACnBib,EAAOjb,EAAS,eAChBkkC,EAAgBlkC,EAAS,qBAAqBkkC,cAC9CnO,EAAQ/1B,EAAS,YAAY+1B,MAE7BqP,EAAO,WACPx1D,KAAKqwD,eAAiBP,EACtB9vD,KAAKy1D,WAAa,GAAIlE,KAG1B,WAEIvxD,KAAK8rD,QAAU,GAAI77C,QAAO,KACpBslD,EAAQvD,SAASC,EACjBsD,EAAQvD,SAASQ,GAAK+C,EAAQvD,SAASS,GACvC8C,EAAQvD,SAASY,GACjB2C,EAAQvD,SAASqB,GAAK,SAAU,KAGtCrzD,KAAK6rD,WAAa,GAAI57C,QAAO,SACvBslD,EAAQvD,SAASC,EACjBsD,EAAQvD,SAASQ,GAAK+C,EAAQvD,SAASS,GACvC8C,EAAQvD,SAASY,GACjB2C,EAAQvD,SAASqB,GAAK,eAAgB,KAG5CrzD,KAAK01D,aAAe,WAKhB,MAJK11D,MAAK21D,aACN31D,KAAK41D,gBAAkB51D,KAAK41D,iBAAmB,GAAI51D,MAAKqwD,eACxDrwD,KAAK21D,WAAa,GAAIpI,GAAUvtD,KAAK41D,gBAAgBzF,aAElDnwD,KAAK21D,YAGhB31D,KAAK61D,iBAAmB,GACxB71D,KAAK81D,aAAe,GAEpB91D,KAAK+1D,mBAAqB,SAAS3oC,EAAOuiB,EAASyW,EAAUE,GA6FzD,QAAS0P,GAAKxgC,GACV,IAAK,GAAIlyB,GAAI8iD,EAAeE,GAALhjD,EAAaA,IAChCkyB,EAAI2D,EAAIsrB,QAAQnhD,GAAIA,GA9F5B,GAAI61B,GAAMwW,EAAQxW,IAEd88B,GAAmB,EACnBC,GAAe,EACfC,EAAYC,EAAAA,EACZrL,EAAUpb,EAAQqb,aAClBqL,GAAkB,CAEtB,IAAKr2D,KAAK61D,iBAkCH,CACH,GAAIhyC,MAAMrgB,QAAQxD,KAAK61D,kBACnB,GAAIS,GAAct2D,KAAK61D,iBAAiBlgC,IAAI0V,EAAKf,cAAc96B,KAAK,KAChEqmD,EAAmB71D,KAAK61D,iBAAiB,OAE7C,IAAIS,GAAcjrB,EAAKf,aAAatqC,KAAK61D,kBACrCA,EAAmB71D,KAAK61D,gBAEhCS,GAAc,GAAIrmD,QAAO,aAAeqmD,EAAc,OAEtDD,EAAkB1mB,EAAQ4mB,gBAE1B,IAAIC,GAAY,SAAS5oC,EAAMtqB,GAC3B,GAAI9C,GAAIotB,EAAKre,MAAM+mD,EACnB,IAAK91D,EAAL,CACA,GAAIm0B,GAAQn0B,EAAE,GAAGY,OAAQixC,EAAM7xC,EAAE,GAAGY,MAC/Bq1D,GAAkB7oC,EAAM+G,EAAO0d,IAAyB,KAAjB7xC,EAAE,GAAG6xC,EAAM,IACnDA,IACJlZ,EAAIu9B,aAAapzD,EAAGqxB,EAAO0d,KAE3BskB,EAAmBd,EAAmB,IACtCe,EAAU,SAAShpC,EAAMtqB,KACpB2yD,GAAoB,KAAK5mD,KAAKue,MAC3B6oC,EAAkB7oC,EAAMuoC,EAAWA,GACnCh9B,EAAI09B,cAAczkB,IAAK9uC,EAAGivC,OAAQ4jB,GAAYQ,GAE9Cx9B,EAAI09B,cAAczkB,IAAK9uC,EAAGivC,OAAQ4jB,GAAYN,KAGtDiB,EAAa,SAASlpC,EAAMtqB,GAC5B,MAAOgzD,GAAYjnD,KAAKue,IAGxB6oC,EAAoB,SAAS7oC,EAAMmpC,EAAQC,GAE3C,IADA,GAAIC,GAAS,EACNF,KAAmC,KAAvBnpC,EAAKrf,OAAOwoD,IAC3BE,GACJ,IAAIA,EAASlM,GAAW,EACpB,OAAO,CAEX,KADA,GAAIkM,GAAS,EACkB,KAAxBrpC,EAAKrf,OAAOyoD,MACfC,GACJ,OAAIlM,GAAU,EACHkM,EAASlM,GAAWA,EAAU,EAE9BkM,EAASlM,GAAW,OA/EX,CACxB,IAAK/qD,KAAK81D,aACN,OAAO,CACX,IAAID,GAAmB71D,KAAK81D,aAAanhC,MACrCuiC,EAAiBl3D,KAAK81D,aAAazjB,IACnCikB,EAAc,GAAIrmD,QAAO,aAAeo7B,EAAKf,aAAaurB,GAAoB,KAC9EsB,EAAY,GAAIlnD,QAAO,MAAQo7B,EAAKf,aAAa4sB,GAAkB,UAEnEN,EAAU,SAAShpC,EAAMtqB,GACrBwzD,EAAWlpC,EAAMtqB,MAEhB2yD,GAAoB,KAAK5mD,KAAKue,MAC/BuL,EAAI09B,cAAczkB,IAAK9uC,EAAGivC,OAAQ3kB,EAAKxsB,QAAS81D,GAChD/9B,EAAI09B,cAAczkB,IAAK9uC,EAAGivC,OAAQ4jB,GAAYN,KAIlDW,EAAY,SAAS5oC,EAAMtqB,GAC3B,GAAI9C,IACAA,EAAIotB,EAAKre,MAAM4nD,KACfh+B,EAAIu9B,aAAapzD,EAAGsqB,EAAKxsB,OAASZ,EAAE,GAAGY,OAAQwsB,EAAKxsB,SACpDZ,EAAIotB,EAAKre,MAAM+mD,KACfn9B,EAAIu9B,aAAapzD,EAAG9C,EAAE,GAAGY,OAAQZ,EAAE,GAAGY,SAG1C01D,EAAa,SAASlpC,EAAMwkB,GAC5B,GAAIkkB,EAAYjnD,KAAKue,GACjB,OAAO,CAEX,KAAK,GADDqhC,GAAStf,EAAQilB,UAAUxiB,GACtB9uC,EAAI,EAAGA,EAAI2rD,EAAO7tD,OAAQkC,IAC/B,GAAuB,YAAnB2rD,EAAO3rD,GAAG0H,KACV,OAAO,GA2DvB,GAAIosD,GAAiBhB,EAAAA,CACrBJ,GAAK,SAASpoC,EAAMtqB,GAChB,GAAI+zD,GAASzpC,EAAKlpB,OAAO,KACV,MAAX2yD,GACalB,EAATkB,IACAlB,EAAYkB,GACZnB,IAAiBY,EAAWlpC,EAAMtqB,KAClC4yD,GAAe,IACZkB,EAAiBxpC,EAAKxsB,SAC7Bg2D,EAAiBxpC,EAAKxsB,UAI1B+0D,GAAaC,EAAAA,IACbD,EAAYiB,EACZnB,GAAmB,EACnBC,GAAe,GAGfG,GAAmBF,EAAYpL,GAAW,IAC1CoL,EAAY5tD,KAAK+qB,MAAM6iC,EAAYpL,GAAWA,GAElDiL,EAAKE,EAAeM,EAAYI,IAGpC52D,KAAKs3D,mBAAqB,SAASlqC,EAAOuiB,EAAS9nC,EAAOqW,GACtD,GAAI04C,GAAU52D,KAAK81D,YACnB,IAAKc,EAAL,EAEKA,EAAQjiC,OAASiiC,EAAQ,KAC1BA,EAAUA,EAAQ,GAEtB,IAKIxQ,GAAUmR,EALVC,EAAW,GAAIlD,GAAc3kB,EAASzxB,EAAOk0B,IAAKl0B,EAAOq0B,QACzD7lB,EAAQ8qC,EAAStC,kBAGjBuC,GADM9nB,EAAQ1rC,UACC0rC,EAAQ1rC,UAAU81C,kBAGrC,IAAIrtB,GAAS,UAAUrd,KAAKqd,EAAM1hB,MAAO,CAErC,IADA,GAAI0sD,GAAYC,EACTjrC,GAAS,UAAUrd,KAAKqd,EAAM1hB,OAAO,CACxC,GAAI1H,GAAIopB,EAAMvnB,MAAMmK,QAAQsnD,EAAQjiC,MACpC,IAAS,IAALrxB,EAAS,CACT,GAAI8uC,GAAMolB,EAASrC,qBACf5iB,EAASilB,EAASpC,wBAA0B9xD,CAChDo0D,GAAa,GAAIvR,GAAM/T,EAAKG,EAAQH,EAAKG,EAASqkB,EAAQjiC,MAAMvzB,OAChE,OAEJsrB,EAAQ8qC,EAASzC,eAKrB,IAFA,GAAIyC,GAAW,GAAIlD,GAAc3kB,EAASzxB,EAAOk0B,IAAKl0B,EAAOq0B,QACzD7lB,EAAQ8qC,EAAStC,kBACdxoC,GAAS,UAAUrd,KAAKqd,EAAM1hB,OAAO,CACxC,GAAI1H,GAAIopB,EAAMvnB,MAAMmK,QAAQsnD,EAAQvkB,IACpC,IAAS,IAAL/uC,EAAS,CACT,GAAI8uC,GAAMolB,EAASrC,qBACf5iB,EAASilB,EAASpC,wBAA0B9xD,CAChDq0D,GAAW,GAAIxR,GAAM/T,EAAKG,EAAQH,EAAKG,EAASqkB,EAAQvkB,IAAIjxC,OAC5D,OAEJsrB,EAAQ8qC,EAASxC,cAEjB2C,GACAhoB,EAAQ1a,OAAO0iC,GACfD,IACA/nB,EAAQ1a,OAAOyiC,GACftR,EAAWsR,EAAW/iC,MAAMyd,IAC5BmlB,GAAWX,EAAQjiC,MAAMvzB,YAG7Bm2D,GAAUX,EAAQjiC,MAAMvzB,OACxBglD,EAAWv+C,EAAM8sB,MAAMyd,IACvBzC,EAAQ3a,OAAOntB,EAAMwqC,IAAKukB,EAAQvkB,KAClC1C,EAAQ3a,OAAOntB,EAAM8sB,MAAOiiC,EAAQjiC,MAEpC8iC,GAAa9iC,MAAMyd,KAAOgU,IAC1BqR,EAAa9iC,MAAM4d,QAAUglB,GAC7BE,EAAaplB,IAAID,KAAOgU,IACxBqR,EAAaplB,IAAIE,QAAUglB,GAC/B5nB,EAAQ1rC,UAAU02C,kBAAkB8c,KAGxCz3D,KAAK43D,kBAAoB,SAASxqC,EAAOQ,EAAMiqC,GAC3C,MAAO73D,MAAK83D,WAAWlqC,IAG3B5tB,KAAK+3D,aAAe,SAAS3qC,EAAOQ,EAAM/nB,GACtC,OAAO,GAGX7F,KAAKg4D,YAAc,SAAS5qC,EAAO+L,EAAKiZ,KAGxCpyC,KAAK83D,WAAa,SAASlqC,GACvB,MAAOA,GAAKre,MAAM,QAAQ,IAG9BvP,KAAKi4D,aAAe,SAAStoB,GACzB,MAAO,OAGX3vC,KAAKk4D,oBAAsB,SAAUrK,GACjC7tD,KAAKuwD,WACLvwD,KAAKm4D,SACL,KAAK,GAAI70D,KAAKuqD,GACNA,EAAQvqD,KACRtD,KAAKuwD,QAAQvhD,KAAK1L,GAClBtD,KAAKm4D,OAAO70D,GAAK,GAAIuqD,GAAQvqD,GAOrC,KAAK,GAHD80D,IAAe,qBAAsB,qBAAsB,oBAC3D,eAAgB,cAAe,kBAAmB,kBAE7C90D,EAAI,EAAGA,EAAI80D,EAAYh3D,OAAQkC,KACnC,SAAS+0D,GACR,GAAIC,GAAeF,EAAY90D,GAC3Bm7C,EAAiB4Z,EAAMC,EAC3BD,GAAMD,EAAY90D,IAAM,WACpB,MAAOtD,MAAKu4D,WAAWD,EAAcn3D,UAAWs9C,KAEnDz+C,OAIXA,KAAKu4D,WAAa,SAASC,EAAQ7oD,EAAM8uC,GACrC,GAAIrxB,GAAQzd,EAAK,EACG,iBAATyd,KACPA,EAAQA,EAAM,GAClB,KAAK,GAAI9pB,GAAI,EAAGA,EAAItD,KAAKuwD,QAAQnvD,OAAQkC,IACrC,GAAKtD,KAAKm4D,OAAOn4D,KAAKuwD,QAAQjtD,IAA9B,CAEA,GAAI2N,GAAQmc,EAAMnc,MAAMjR,KAAKuwD,QAAQjtD,GACrC,KAAK2N,EAAM,IAAMA,EAAM,GAAI,CACvBtB,EAAK,GAAKsB,EAAM,EAChB,IAAIvP,GAAO1B,KAAKm4D,OAAOn4D,KAAKuwD,QAAQjtD,GACpC,OAAO5B,GAAK82D,GAAQ3oD,MAAMnO,EAAMiO,IAGxC,GAAI+sB,GAAM+hB,EAAe5uC,MAAM7P,KAAM2P,EACrC,OAAO8uC,GAAiB/hB,EAAMx4B,QAGlClE,KAAKy4D,gBAAkB,SAASrrC,EAAO5mB,EAAQ2B,EAAQwnC,EAAS+oB,GAC5D,GAAI14D,KAAKy1D,WAAY,CACjB,GAAI/D,GAAa1xD,KAAKy1D,WAAW7D,eACjC,KAAK,GAAIziD,KAAOuiD,GACZ,GAAIA,EAAWviD,GAAK3I,GAAS,CACzB,GAAIk2B,GAAMg1B,EAAWviD,GAAK3I,GAAQqJ,MAAM7P,KAAMmB,UAC9C,IAAIu7B,EACA,MAAOA,MAO3B18B,KAAKqxD,YAAc,SAASn7C,GACxB,IAAKlW,KAAK24D,mBAAoB,CAC1B,GAAIvpC,GAAQpvB,KAAK21D,WAAWvmC,MACxBupC,IACJ,KAAK,GAAI1K,KAAQ7+B,GAEb,IAAK,GADDwpC,GAAUxpC,EAAM6+B,GACX5gC,EAAI,EAAGiE,EAAIsnC,EAAQx3D,OAAYkwB,EAAJjE,EAAOA,IACvC,GAAgC,gBAArBurC,GAAQvrC,GAAGX,MACd,0BAA0Brd,KAAKupD,EAAQvrC,GAAGX,QAC1CisC,EAAmB3pD,KAAK4pD,EAAQvrC,GAAG6E,WAEtC,IAAgC,gBAArB0mC,GAAQvrC,GAAGX,MACvB,IAAK,GAAIjd,GAAI,EAAGopD,EAAUD,EAAQvrC,GAAGX,MAAMtrB,OAAYy3D,EAAJppD,EAAaA,IAC5D,GAAI,0BAA0BJ,KAAKupD,EAAQvrC,GAAGX,MAAMjd,IAAK,CACrD,GAAIw+C,GAAO2K,EAAQvrC,GAAG6E,MAAM3iB,MAAM,YAAYE,EAC9CkpD,GAAmB3pD,KAAKi/C,EAAKj/B,OAAO,EAAGi/B,EAAK7sD,OAAS,IAMzEpB,KAAK24D,mBAAqBA,EAE9B,MAAKziD,GAEEyiD,EAAmBh9C,OAAO3b,KAAKoxD,kBAD3BpxD,KAAKoxD,cAIpBpxD,KAAK84D,mBAAqB,WAGtB,MAFK94D,MAAK41D,iBACN51D,KAAK01D,eACF11D,KAAKoxD,aAAepxD,KAAK41D,gBAAgBxE,kBAGpDpxD,KAAK+4D,eAAiB,SAAS3rC,EAAOuiB,EAAS9a,EAAKo7B,GAChD,GAAIkB,GAAWnxD,KAAKoxD,cAAgBpxD,KAAK84D,oBACzC,OAAO3H,GAASx7B,IAAI,SAASqjC,GACzB,OACI12D,KAAM02D,EACN7zD,MAAO6zD,EACPC,MAAO,EACP97B,KAAM,cAKlBn9B,KAAKk5D,IAAM,kBACZ34D,KAAKi1D,EAAK/zD,WAEb7B,EAAQ41D,KAAOA,IAGftpD,IAAIpM,OAAO,cAAc,UAAU,UAAU,SAAS,cAAc,yBAA0B,SAASswB,EAAUxwB,EAASC,GAC1H,YAEA,IAAI28B,GAAMpM,EAAS,aACf+tB,EAAe/tB,EAAS,uBAAuB+tB,aAE/Cgb,EAASv5D,EAAQu5D,OAAS,SAAShgC,EAAKiZ,EAAKG,GAC7CvyC,KAAKo5D,UAAYp5D,KAAK0K,SAASylB,KAAKnwB,MACpCA,KAAKwlD,OAAOrsB,GAES,mBAAVoZ,GACPvyC,KAAKg2C,YAAY5D,EAAIA,IAAKA,EAAIG,QAE9BvyC,KAAKg2C,YAAY5D,EAAKG,KAG9B,WAEI/V,EAAIF,UAAUt8B,KAAMm+C,GACpBn+C,KAAKwoD,YAAc,WACf,MAAOxoD,MAAKq5D,wBAAwBr5D,KAAKoyC,IAAKpyC,KAAKuyC,SAEvDvyC,KAAK+nD,YAAc,WACf,MAAO/nD,MAAKiJ,UAEhBjJ,KAAKs5D,cAAe,EACpBt5D,KAAK0K,SAAW,SAASkd,GACrB,GAAI2xC,GAAQ3xC,EAAEplB,KACVqF,EAAQ0xD,EAAM1xD,KAElB,KAAIA,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,KAAOvqC,EAAM8sB,MAAMyd,KAAOpyC,KAAKoyC,QAG5DvqC,EAAM8sB,MAAMyd,IAAMpyC,KAAKoyC,KAGvBvqC,EAAM8sB,MAAMyd,KAAOpyC,KAAKoyC,KAAOvqC,EAAM8sB,MAAM4d,OAASvyC,KAAKuyC,QAA7D,CAGA,GAAIH,GAAMpyC,KAAKoyC,IACXG,EAASvyC,KAAKuyC,OACd5d,EAAQ9sB,EAAM8sB,MACd0d,EAAMxqC,EAAMwqC,GAEK,gBAAjBknB,EAAM/yD,OACFmuB,EAAMyd,MAAQA,GAAOzd,EAAM4d,QAAUA,EACjC5d,EAAM4d,SAAWA,GAAUvyC,KAAKs5D,eACzB3kC,EAAMyd,MAAQC,EAAID,IACzBG,GAAUF,EAAIE,OAAS5d,EAAM4d,QAE7BA,GAAU5d,EAAM4d,OAChBH,GAAOC,EAAID,IAAMzd,EAAMyd,MAEpBzd,EAAMyd,MAAQC,EAAID,KAAOzd,EAAMyd,IAAMA,IAC5CA,GAAOC,EAAID,IAAMzd,EAAMyd,KAEH,gBAAjBmnB,EAAM/yD,OACTmuB,EAAMyd,MAAQA,GAAkB,IAAXG,GAAgBvyC,KAAKs5D,cAErC3kC,EAAMyd,KAAOA,IAClBA,GAAOC,EAAID,IAAMzd,EAAMyd,KAEH,eAAjBmnB,EAAM/yD,OACTmuB,EAAMyd,MAAQA,GAAOzd,EAAM4d,OAASA,EAEhCA,EADAF,EAAIE,QAAUA,EACL5d,EAAM4d,OAENhqC,KAAKE,IAAI,EAAG8pC,GAAUF,EAAIE,OAAS5d,EAAM4d,SAE/C5d,EAAMyd,MAAQC,EAAID,KAAOzd,EAAMyd,IAAMA,GACxCC,EAAID,MAAQA,IACZG,EAAShqC,KAAKE,IAAI,EAAG8pC,EAASF,EAAIE,QAAU5d,EAAM4d,QACtDH,GAAQC,EAAID,IAAMzd,EAAMyd,KACjBC,EAAID,MAAQA,IACnBA,GAAOC,EAAID,IAAMzd,EAAMyd,IACvBG,EAAShqC,KAAKE,IAAI,EAAG8pC,EAASF,EAAIE,QAAU5d,EAAM4d,QAE/B,eAAhBgnB,EAAM/yD,QACTmuB,EAAMyd,KAAOA,IACTC,EAAID,KAAOA,EACXA,GAAOC,EAAID,IAAMzd,EAAMyd,KAEvBA,EAAMzd,EAAMyd,IACZG,EAAS,IAKrBvyC,KAAKg2C,YAAY5D,EAAKG,GAAQ,KAElCvyC,KAAKg2C,YAAc,SAAS5D,EAAKG,EAAQinB,GACrC,GAAI3kC,EAUJ,IARIA,EADA2kC,GAEIpnB,IAAKA,EACLG,OAAQA,GAGNvyC,KAAKq5D,wBAAwBjnB,EAAKG,GAGxCvyC,KAAKoyC,KAAOvd,EAAIud,KAAOpyC,KAAKuyC,QAAU1d,EAAI0d,OAA9C,CAGA,GAAIwM,IACA3M,IAAKpyC,KAAKoyC,IACVG,OAAQvyC,KAAKuyC,OAGjBvyC,MAAKoyC,IAAMvd,EAAIud,IACfpyC,KAAKuyC,OAAS1d,EAAI0d,OAClBvyC,KAAK0+C,QAAQ,UACTK,IAAKA,EACL55C,MAAO0vB,MAGf70B,KAAKylD,OAAS,WACVzlD,KAAKiJ,SAASwL,oBAAoB,SAAUzU,KAAKo5D,YAErDp5D,KAAKwlD,OAAS,SAASrsB,GACnBn5B,KAAKiJ,SAAWkwB,GAAOn5B,KAAKiJ,SAC5BjJ,KAAKiJ,SAAS2E,GAAG,SAAU5N,KAAKo5D,YAEpCp5D,KAAKq5D,wBAA0B,SAASjnB,EAAKG,GACzC,GAAI1d,KAkBJ,OAhBIud,IAAOpyC,KAAKiJ,SAAS2tC,aACrB/hB,EAAIud,IAAM7pC,KAAKE,IAAI,EAAGzI,KAAKiJ,SAAS2tC,YAAc,GAClD/hB,EAAI0d,OAASvyC,KAAKiJ,SAASw7C,QAAQ5vB,EAAIud,KAAKhxC,QAEjC,EAANgxC,GACLvd,EAAIud,IAAM,EACVvd,EAAI0d,OAAS,IAGb1d,EAAIud,IAAMA,EACVvd,EAAI0d,OAAShqC,KAAKC,IAAIxI,KAAKiJ,SAASw7C,QAAQ5vB,EAAIud,KAAKhxC,OAAQmH,KAAKE,IAAI,EAAG8pC,KAGhE,EAATA,IACA1d,EAAI0d,OAAS,GAEV1d,KAGZt0B,KAAK44D,EAAO13D,aAIfyK,IAAIpM,OAAO,gBAAgB,UAAU,UAAU,SAAS,cAAc,wBAAwB,YAAY,cAAe,SAASswB,EAAUxwB,EAASC,GACrJ,YAEA,IAAI28B,GAAMpM,EAAS,aACf+tB,EAAe/tB,EAAS,uBAAuB+tB,aAC/CgI,EAAQ/1B,EAAS,WAAW+1B,MAC5BgT,EAAS/oC,EAAS,YAAY+oC,OAE9BM,EAAW,SAAStzD,GACpBnG,KAAK05D,UACe,IAAhBvzD,EAAK/E,OACLpB,KAAK05D,QAAU,IACR71C,MAAMrgB,QAAQ2C,GACrBnG,KAAK25D,aAAa,EAAGxzD,GAErBnG,KAAKg1B,QAAQod,IAAK,EAAGG,OAAO,GAAIpsC,KAIxC,WAEIq2B,EAAIF,UAAUt8B,KAAMm+C,GACpBn+C,KAAKiO,SAAW,SAAS9H,GACrB,GAAImnB,GAAMttB,KAAK42C,WACf52C,MAAKi1B,OAAO,GAAIkxB,GAAM,EAAG,EAAG74B,EAAKttB,KAAKykD,QAAQn3B,EAAI,GAAGlsB,SACrDpB,KAAKg1B,QAAQod,IAAK,EAAGG,OAAO,GAAIpsC,IAEpCnG,KAAK0F,SAAW,WACZ,MAAO1F,MAAK45D,cAAcpqD,KAAKxP,KAAK65D,wBAExC75D,KAAKkoD,aAAe,SAAS9V,EAAKG,GAC9B,MAAO,IAAI4mB,GAAOn5D,KAAMoyC,EAAKG,IAED,IAA5B,MAAMthC,MAAM,KAAK7P,OACjBpB,KAAK85D,OAAS,SAAS3zD,GACnB,MAAOA,GAAKge,QAAQ,WAAY,MAAMlT,MAAM,OAGhDjR,KAAK85D,OAAS,SAAS3zD,GACnB,MAAOA,GAAK8K,MAAM,eAI1BjR,KAAK+5D,eAAiB,SAAS5zD,GAC3B,GAAIoJ,GAAQpJ,EAAKoJ,MAAM,oBACvBvP,MAAKg6D,aAAezqD,EAAQA,EAAM,GAAK,KACvCvP,KAAK0+C,QAAQ,sBAEjB1+C,KAAK65D,oBAAsB,WACvB,OAAQ75D,KAAKi6D,cACX,IAAK,UACH,MAAO,MACT,KAAK,OACH,MAAO,IACT,SACE,MAAOj6D,MAAKg6D,cAAgB,OAIpCh6D,KAAKg6D,aAAe,GACpBh6D,KAAKi6D,aAAe,OACpBj6D,KAAKk6D,eAAiB,SAASC,GACvBn6D,KAAKi6D,eAAiBE,IAG1Bn6D,KAAKi6D,aAAeE,EACpBn6D,KAAK0+C,QAAQ,uBAEjB1+C,KAAKo6D,eAAiB,WAClB,MAAOp6D,MAAKi6D,cAEhBj6D,KAAKq6D,UAAY,SAASl0D,GACtB,MAAgB,QAARA,GAA0B,MAARA,GAAwB,MAARA,GAE9CnG,KAAKykD,QAAU,SAASrS,GACpB,MAAOpyC,MAAK05D,OAAOtnB,IAAQ,IAE/BpyC,KAAKs6D,SAAW,SAASjT,EAAUC,GAC/B,MAAOtnD,MAAK05D,OAAOxrC,MAAMm5B,EAAUC,EAAU,IAEjDtnD,KAAK45D,YAAc,WACf,MAAO55D,MAAKs6D,SAAS,EAAGt6D,KAAK42C,cAEjC52C,KAAK42C,UAAY,WACb,MAAO52C,MAAK05D,OAAOt4D,QAEvBpB,KAAKi8C,aAAe,SAASp0C,GACzB,GAAIA,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,IAC7B,MAAOpyC,MAAKykD,QAAQ58C,EAAM8sB,MAAMyd,KAC3BhuB,UAAUvc,EAAM8sB,MAAM4d,OAAQ1qC,EAAMwqC,IAAIE,OAEjD,IAAI7jB,GAAQ1uB,KAAKs6D,SAASzyD,EAAM8sB,MAAMyd,IAAKvqC,EAAMwqC,IAAID,IACrD1jB,GAAM,IAAMA,EAAM,IAAM,IAAItK,UAAUvc,EAAM8sB,MAAM4d,OAClD,IAAIjhB,GAAI5C,EAAMttB,OAAS,CAGvB,OAFIyG,GAAMwqC,IAAID,IAAMvqC,EAAM8sB,MAAMyd,KAAO9gB,IACnC5C,EAAM4C,GAAK5C,EAAM4C,GAAGlN,UAAU,EAAGvc,EAAMwqC,IAAIE,SACxC7jB,EAAMlf,KAAKxP,KAAK65D,wBAG3B75D,KAAKu6D,cAAgB,SAASn/B,GAC1B,GAAIh6B,GAASpB,KAAK42C,WAMlB,OALIxb,GAASgX,KAAOhxC,GAChBg6B,EAASgX,IAAM7pC,KAAKE,IAAI,EAAGrH,EAAS,GACpCg6B,EAASmX,OAASvyC,KAAKykD,QAAQrjD,EAAO,GAAGA,QAClCg6B,EAASgX,IAAM,IACtBhX,EAASgX,IAAM,GACZhX,GAEXp7B,KAAKg1B,OAAS,SAASoG,EAAUj1B,GAC7B,IAAKA,GAAwB,IAAhBA,EAAK/E,OACd,MAAOg6B,EAEXA,GAAWp7B,KAAKu6D,cAAcn/B,GAC1Bp7B,KAAK42C,aAAe,GACpB52C,KAAK+5D,eAAe5zD,EAExB,IAAIuoB,GAAQ1uB,KAAK85D,OAAO3zD,GACpBq0D,EAAY9rC,EAAMtd,OAAO,EAAG,GAAG,GAC/BqpD,EAA2B,GAAhB/rC,EAAMttB,OAAc,KAAOstB,EAAMtd,OAAOsd,EAAMttB,OAAS,EAAG,GAAG,EAQ5E,OANAg6B,GAAWp7B,KAAK62D,aAAaz7B,EAAUo/B,GACtB,OAAbC,IACAr/B,EAAWp7B,KAAK06D,cAAct/B,GAC9BA,EAAWp7B,KAAK25D,aAAav+B,EAASgX,IAAK1jB,GAC3C0M,EAAWp7B,KAAK62D,aAAaz7B,EAAUq/B,GAAY,KAEhDr/B,GAEXp7B,KAAK26D,YAAc,SAASvoB,EAAK1jB,GAC7B,MAAI0jB,IAAOpyC,KAAK42C,YACL52C,KAAKg1B,QAAQod,IAAKA,EAAKG,OAAQ,GAAI,KAAO7jB,EAAMlf,KAAK,OACzDxP,KAAK25D,aAAapxD,KAAKE,IAAI2pC,EAAK,GAAI1jB,IAE/C1uB,KAAK25D,aAAe,SAASvnB,EAAK1jB,GAC9B,GAAoB,GAAhBA,EAAMttB,OACN,OAAQgxC,IAAKA,EAAKG,OAAQ,EAC9B,MAAO7jB,EAAMttB,OAAS,OAAQ,CAC1B,GAAIixC,GAAMryC,KAAK25D,aAAavnB,EAAK1jB,EAAMR,MAAM,EAAG,OAChDQ,GAAQA,EAAMR,MAAM,OACpBkkB,EAAMC,EAAID,IAGd,GAAIziC,IAAQyiC,EAAK,EACjBziC,GAAKX,KAAKa,MAAMF,EAAM+e,GACtB1uB,KAAK05D,OAAOtoD,OAAOvB,MAAM7P,KAAK05D,OAAQ/pD,EAEtC,IAAI9H,GAAQ,GAAIs+C,GAAM/T,EAAK,EAAGA,EAAM1jB,EAAMttB,OAAQ,GAC9Cm4D,GACA/yD,OAAQ,cACRqB,MAAOA,EACP6mB,MAAOA,EAGX,OADA1uB,MAAK0+C,QAAQ,UAAYl8C,KAAM+2D,IACxB1xD,EAAMwqC,KAEjBryC,KAAK06D,cAAgB,SAASt/B,GAC1BA,EAAWp7B,KAAKu6D,cAAcn/B,EAC9B,IAAIxN,GAAO5tB,KAAK05D,OAAOt+B,EAASgX,MAAQ,EAExCpyC,MAAK05D,OAAOt+B,EAASgX,KAAOxkB,EAAKxJ,UAAU,EAAGgX,EAASmX,QACvDvyC,KAAK05D,OAAOtoD,OAAOgqB,EAASgX,IAAM,EAAG,EAAGxkB,EAAKxJ,UAAUgX,EAASmX,OAAQ3kB,EAAKxsB;AAE7E,GAAIixC,IACAD,IAAMhX,EAASgX,IAAM,EACrBG,OAAS,GAGTgnB,GACA/yD,OAAQ,aACRqB,MAAOs+C,EAAMoB,WAAWnsB,EAAUiX,GAClClsC,KAAMnG,KAAK65D,sBAIf,OAFA75D,MAAK0+C,QAAQ,UAAYl8C,KAAM+2D,IAExBlnB,GAEXryC,KAAK62D,aAAe,SAASz7B,EAAUj1B,GACnC,GAAmB,GAAfA,EAAK/E,OACL,MAAOg6B,EAEX,IAAIxN,GAAO5tB,KAAK05D,OAAOt+B,EAASgX,MAAQ,EAExCpyC,MAAK05D,OAAOt+B,EAASgX,KAAOxkB,EAAKxJ,UAAU,EAAGgX,EAASmX,QAAUpsC,EACvDynB,EAAKxJ,UAAUgX,EAASmX,OAElC,IAAIF,IACAD,IAAMhX,EAASgX,IACfG,OAASnX,EAASmX,OAASpsC,EAAK/E,QAGhCm4D,GACA/yD,OAAQ,aACRqB,MAAOs+C,EAAMoB,WAAWnsB,EAAUiX,GAClClsC,KAAMA,EAIV,OAFAnG,MAAK0+C,QAAQ,UAAYl8C,KAAM+2D,IAExBlnB,GAEXryC,KAAKi1B,OAAS,SAASptB,GAMnB,GALMA,YAAiBs+C,KACnBt+C,EAAQs+C,EAAMoB,WAAW1/C,EAAM8sB,MAAO9sB,EAAMwqC,MAChDxqC,EAAM8sB,MAAQ30B,KAAKu6D,cAAc1yD,EAAM8sB,OACvC9sB,EAAMwqC,IAAMryC,KAAKu6D,cAAc1yD,EAAMwqC,KAEjCxqC,EAAMoV,UACN,MAAOpV,GAAM8sB,KAEjB,IAAI0yB,GAAWx/C,EAAM8sB,MAAMyd,IACvBkV,EAAUz/C,EAAMwqC,IAAID,GAExB,IAAIvqC,EAAMktC,cAAe,CACrB,GAAI6lB,GAAqC,GAAtB/yD,EAAM8sB,MAAM4d,OAAc8U,EAAWA,EAAW,EAC/DwT,EAAcvT,EAAU,CAExBz/C,GAAMwqC,IAAIE,OAAS,GACnBvyC,KAAK02D,aAAapP,EAAS,EAAGz/C,EAAMwqC,IAAIE,QAExCsoB,GAAeD,GACf56D,KAAK86D,aAAaF,EAAcC,GAEhCD,GAAgBvT,IAChBrnD,KAAK02D,aAAarP,EAAUx/C,EAAM8sB,MAAM4d,OAAQvyC,KAAKykD,QAAQ4C,GAAUjmD,QACvEpB,KAAK+6D,cAAclzD,EAAM8sB,MAAMyd,UAInCpyC,MAAK02D,aAAarP,EAAUx/C,EAAM8sB,MAAM4d,OAAQ1qC,EAAMwqC,IAAIE,OAE9D,OAAO1qC,GAAM8sB,OAEjB30B,KAAK02D,aAAe,SAAStkB,EAAKiU,EAAaE,GAC3C,GAAIF,GAAeE,EAAnB,CAGA,GAAI1+C,GAAQ,GAAIs+C,GAAM/T,EAAKiU,EAAajU,EAAKmU,GACzC34B,EAAO5tB,KAAKykD,QAAQrS,GACpBrd,EAAUnH,EAAKxJ,UAAUiiC,EAAaE,GACtCyU,EAAUptC,EAAKxJ,UAAU,EAAGiiC,GAAez4B,EAAKxJ,UAAUmiC,EAAW34B,EAAKxsB,OAC9EpB,MAAK05D,OAAOtoD,OAAOghC,EAAK,EAAG4oB,EAE3B,IAAIzB,IACA/yD,OAAQ,aACRqB,MAAOA,EACP1B,KAAM4uB,EAGV,OADA/0B,MAAK0+C,QAAQ,UAAYl8C,KAAM+2D,IACxB1xD,EAAM8sB,QAEjB30B,KAAKi7D,YAAc,SAAS5T,EAAUC,GAClC,MAAe,GAAXD,GAAgBC,GAAWtnD,KAAK42C,YACzB52C,KAAKi1B,OAAO,GAAIkxB,GAAMkB,EAAU,EAAGC,EAAU,EAAG,IACpDtnD,KAAK86D,aAAazT,EAAUC,IAGvCtnD,KAAK86D,aAAe,SAASzT,EAAUC,GACnC,GAAIz/C,GAAQ,GAAIs+C,GAAMkB,EAAU,EAAGC,EAAU,EAAG,GAC5CvyB,EAAU/0B,KAAK05D,OAAOtoD,OAAOi2C,EAAUC,EAAUD,EAAW,GAE5DkS,GACA/yD,OAAQ,cACRqB,MAAOA,EACPqzD,GAAIl7D,KAAK65D,sBACTnrC,MAAOqG,EAGX,OADA/0B,MAAK0+C,QAAQ,UAAYl8C,KAAM+2D,IACxBxkC,GAEX/0B,KAAK+6D,cAAgB,SAAS3oB,GAC1B,GAAIooB,GAAYx6D,KAAKykD,QAAQrS,GACzB+oB,EAAan7D,KAAKykD,QAAQrS,EAAI,GAE9BvqC,EAAQ,GAAIs+C,GAAM/T,EAAKooB,EAAUp5D,OAAQgxC,EAAI,EAAG,GAChDxkB,EAAO4sC,EAAYW,CAEvBn7D,MAAK05D,OAAOtoD,OAAOghC,EAAK,EAAGxkB,EAE3B,IAAI2rC,IACA/yD,OAAQ,aACRqB,MAAOA,EACP1B,KAAMnG,KAAK65D,sBAEf75D,MAAK0+C,QAAQ,UAAYl8C,KAAM+2D,KAEnCv5D,KAAKmkB,QAAU,SAAStc,EAAO1B,GAG3B,GAFM0B,YAAiBs+C,KACnBt+C,EAAQs+C,EAAMoB,WAAW1/C,EAAM8sB,MAAO9sB,EAAMwqC,MAC7B,GAAflsC,EAAK/E,QAAeyG,EAAMoV,UAC1B,MAAOpV,GAAM8sB,KACjB,IAAIxuB,GAAQnG,KAAKi8C,aAAap0C,GAC1B,MAAOA,GAAMwqC,GAGjB,IADAryC,KAAKi1B,OAAOptB,GACR1B,EACA,GAAIksC,GAAMryC,KAAKg1B,OAAOntB,EAAM8sB,MAAOxuB,OAGnCksC,GAAMxqC,EAAM8sB,KAGhB,OAAO0d,IAEXryC,KAAKo7D,YAAc,SAASC,GACxB,IAAK,GAAI/3D,GAAE,EAAGA,EAAE+3D,EAAOj6D,OAAQkC,IAAK,CAChC,GAAIi2D,GAAQ8B,EAAO/3D,GACfuE,EAAQs+C,EAAMoB,WAAWgS,EAAM1xD,MAAM8sB,MAAO4kC,EAAM1xD,MAAMwqC,IAExC,gBAAhBknB,EAAM/yD,OACNxG,KAAK26D,YAAY9yD,EAAM8sB,MAAMyd,IAAKmnB,EAAM7qC,OACnB,cAAhB6qC,EAAM/yD,OACXxG,KAAKg1B,OAAOntB,EAAM8sB,MAAO4kC,EAAMpzD,MACV,eAAhBozD,EAAM/yD,OACXxG,KAAK86D,aAAajzD,EAAM8sB,MAAMyd,IAAKvqC,EAAMwqC,IAAID,IAAM,GAC9B,cAAhBmnB,EAAM/yD,QACXxG,KAAKi1B,OAAOptB,KAGxB7H,KAAKs7D,aAAe,SAASD,GACzB,IAAK,GAAI/3D,GAAE+3D,EAAOj6D,OAAO,EAAGkC,GAAG,EAAGA,IAAK,CACnC,GAAIi2D,GAAQ8B,EAAO/3D,GAEfuE,EAAQs+C,EAAMoB,WAAWgS,EAAM1xD,MAAM8sB,MAAO4kC,EAAM1xD,MAAMwqC,IAExC,gBAAhBknB,EAAM/yD,OACNxG,KAAK86D,aAAajzD,EAAM8sB,MAAMyd,IAAKvqC,EAAMwqC,IAAID,IAAM,GAC9B,cAAhBmnB,EAAM/yD,OACXxG,KAAKi1B,OAAOptB,GACS,eAAhB0xD,EAAM/yD,OACXxG,KAAK25D,aAAa9xD,EAAM8sB,MAAMyd,IAAKmnB,EAAM7qC,OACpB,cAAhB6qC,EAAM/yD,QACXxG,KAAKg1B,OAAOntB,EAAM8sB,MAAO4kC,EAAMpzD,QAG3CnG,KAAKu7D,gBAAkB,SAASpqD,EAAOi1C,GAGnC,IAAK,GAFD13B,GAAQ1uB,KAAK05D,QAAU15D,KAAK45D,cAC5B4B,EAAgBx7D,KAAK65D,sBAAsBz4D,OACtCkC,EAAI8iD,GAAY,EAAG90B,EAAI5C,EAAMttB,OAAYkwB,EAAJhuB,EAAOA,IAEjD,GADA6N,GAASud,EAAMprB,GAAGlC,OAASo6D,EACf,EAARrqD,EACA,OAAQihC,IAAK9uC,EAAGivC,OAAQphC,EAAQud,EAAMprB,GAAGlC,OAASo6D,EAE1D,QAAQppB,IAAK9gB,EAAE,EAAGihB,OAAQ7jB,EAAM4C,EAAE,GAAGlwB,SAEzCpB,KAAKy7D,gBAAkB,SAAS5mC,EAAKuxB,GAKjC,IAAK,GAJD13B,GAAQ1uB,KAAK05D,QAAU15D,KAAK45D,cAC5B4B,EAAgBx7D,KAAK65D,sBAAsBz4D,OAC3C+P,EAAQ,EACRihC,EAAM7pC,KAAKC,IAAIqsB,EAAIud,IAAK1jB,EAAMttB,QACzBkC,EAAI8iD,GAAY,EAAOhU,EAAJ9uC,IAAWA,EACnC6N,GAASud,EAAMprB,GAAGlC,OAASo6D,CAE/B,OAAOrqD,GAAQ0jB,EAAI0d,UAGxBhyC,KAAKk5D,EAASh4D,WAEjB7B,EAAQ65D,SAAWA,IAGnBvtD,IAAIpM,OAAO,4BAA4B,UAAU,UAAU,SAAS,cAAc,yBAA0B,SAASswB,EAAUxwB,EAASC,GACxI,YAEA,IAAI28B,GAAMpM,EAAS,aACf+tB,EAAe/tB,EAAS,uBAAuB+tB,aAE/Cud,EAAsB,SAASC,EAAWxzD,GAC1CnI,KAAK47D,SAAU,EACf57D,KAAK0uB,SACL1uB,KAAKwtD,UACLxtD,KAAK67D,YAAc,EACnB77D,KAAK27D,UAAYA,CAEjB,IAAIhvC,GAAO3sB,IAEXA,MAAK87D,QAAU,WACX,GAAKnvC,EAAKivC,QAAV,CAOA,IALA,GAAIG,GAAc,GAAIzkD,MAClBukD,EAAclvC,EAAKkvC,YACnBG,EAAU,GACV7iC,EAAMxM,EAAKwM,IAERxM,EAAK+B,MAAMmtC,IACdA,GAEJ,IAAII,GAAYJ,EAEZvuC,EAAM6L,EAAIyd,YACVslB,EAAiB,CAErB,KADAvvC,EAAKivC,SAAU,EACMtuC,EAAduuC,GAAmB,CACtBlvC,EAAKwvC,aAAaN,GAClBG,EAAUH,CACV,GACIA,WACKlvC,EAAK+B,MAAMmtC,GAEpB,IADAK,IACKA,EAAiB,IAAM,GAAO,GAAI5kD,MAASykD,EAAe,GAAI,CAC/DpvC,EAAKivC,QAAU/yD,WAAW8jB,EAAKmvC,QAAS,GACxC,QAGRnvC,EAAKkvC,YAAcA,EAEFG,GAAbC,GACAtvC,EAAKyvC,gBAAgBH,EAAWD,OAI5C,WAEIx/B,EAAIF,UAAUt8B,KAAMm+C,GACpBn+C,KAAKq8D,aAAe,SAASV,GACzB37D,KAAK27D,UAAYA,EACjB37D,KAAK0uB,SACL1uB,KAAKwtD,UAELxtD,KAAK20B,MAAM,IAEf30B,KAAKs8D,YAAc,SAASnjC,GACxBn5B,KAAKm5B,IAAMA,EACXn5B,KAAK0uB,SACL1uB,KAAKwtD,UAELxtD,KAAKw1C,QAETx1C,KAAKo8D,gBAAkB,SAAS/U,EAAUC,GACtC,GAAI9kD,IACA2Q,MAAOk0C,EACP9d,KAAM+d,EAEVtnD,MAAK0+C,QAAQ,UAAWl8C,KAAMA,KAElCxC,KAAK20B,MAAQ,SAASyxB,GAClBpmD,KAAK67D,YAActzD,KAAKC,IAAI49C,GAAY,EAAGpmD,KAAK67D,YAAa77D,KAAKm5B,IAAIyd,aACtE52C,KAAK0uB,MAAMtd,OAAOpR,KAAK67D,YAAa77D,KAAK0uB,MAAMttB,QAC/CpB,KAAKwtD,OAAOp8C,OAAOpR,KAAK67D,YAAa77D,KAAKwtD,OAAOpsD,QAEjDpB,KAAKw1C,OACLx1C,KAAK47D,QAAU/yD,WAAW7I,KAAK87D,QAAS,MAG5C97D,KAAKu8D,cAAgB,WACZv8D,KAAK47D,UACN57D,KAAK47D,QAAU/yD,WAAW7I,KAAK87D,QAAS,OAGhD97D,KAAKw8D,gBAAkB,SAASjD,GAC5B,GAAI1xD,GAAQ0xD,EAAM1xD,MACdu+C,EAAWv+C,EAAM8sB,MAAMyd,IACvB9kB,EAAMzlB,EAAMwqC,IAAID,IAAMgU,CAE1B,IAAY,IAAR94B,EACAttB,KAAK0uB,MAAM03B,GAAY,SACpB,IAAoB,cAAhBmT,EAAM/yD,QAA0C,eAAhB+yD,EAAM/yD,OAC7CxG,KAAK0uB,MAAMtd,OAAOg1C,EAAU94B,EAAM,EAAG,MACrCttB,KAAKwtD,OAAOp8C,OAAOg1C,EAAU94B,EAAM,EAAG,UACnC,CACH,GAAI3d,GAAOkU,MAAMyJ,EAAM,EACvB3d,GAAKgK,QAAQysC,EAAU,GACvBpmD,KAAK0uB,MAAMtd,OAAOvB,MAAM7P,KAAK0uB,MAAO/e,GACpC3P,KAAKwtD,OAAOp8C,OAAOvB,MAAM7P,KAAKwtD,OAAQ79C,GAG1C3P,KAAK67D,YAActzD,KAAKC,IAAI49C,EAAUpmD,KAAK67D,YAAa77D,KAAKm5B,IAAIyd,aAEjE52C,KAAKw1C,QAETx1C,KAAKw1C,KAAO,WACJx1C,KAAK47D,SACLj0D,aAAa3H,KAAK47D,SACtB57D,KAAK47D,SAAU,GAEnB57D,KAAK40D,UAAY,SAASxiB,GACtB,MAAOpyC,MAAK0uB,MAAM0jB,IAAQpyC,KAAKm8D,aAAa/pB,IAEhDpyC,KAAKy8D,SAAW,SAASrqB,GAGrB,MAFIpyC,MAAK67D,aAAezpB,GACpBpyC,KAAKm8D,aAAa/pB,GACfpyC,KAAKwtD,OAAOpb,IAAQ,SAG/BpyC,KAAKm8D,aAAe,SAAS/pB,GACzB,GAAIxkB,GAAO5tB,KAAKm5B,IAAIsrB,QAAQrS,GACxBhlB,EAAQptB,KAAKwtD,OAAOpb,EAAM,GAE1B5vC,EAAOxC,KAAK27D,UAAUpM,cAAc3hC,EAAMR,EAAOglB,EAWrD,OATIpyC,MAAKwtD,OAAOpb,GAAO,IAAO5vC,EAAK4qB,MAAQ,IACvCptB,KAAKwtD,OAAOpb,GAAO5vC,EAAK4qB,MACxBptB,KAAK0uB,MAAM0jB,EAAM,GAAK,KAClBpyC,KAAK67D,YAAczpB,EAAM,IACzBpyC,KAAK67D,YAAczpB,EAAM,IACtBpyC,KAAK67D,aAAezpB,IAC3BpyC,KAAK67D,YAAczpB,EAAM,GAGtBpyC,KAAK0uB,MAAM0jB,GAAO5vC,EAAKysD,UAGnC1uD,KAAKm7D,EAAoBj6D,WAE5B7B,EAAQ87D,oBAAsBA,IAG9BxvD,IAAIpM,OAAO,wBAAwB,UAAU,UAAU,SAAS,eAAe,cAAc,aAAc,SAASswB,EAAUxwB,EAASC,GACvI,YAEA,IAAIwrC,GAAOjb,EAAS,cAEhB+1B,GADM/1B,EAAS,aACPA,EAAS,WAAW+1B,OAE5BuW,EAAkB,SAASjyB,EAAQkyB,EAAO3xD,GAC1ChL,KAAK48D,UAAUnyB,GACfzqC,KAAK28D,MAAQA,EACb38D,KAAKgL,KAAOA,GAAQ,SAGxB,WACIhL,KAAK68D,WAAa,IAElB78D,KAAK48D,UAAY,SAASnyB,GAClBzqC,KAAKyqC,OAAO,IAAMA,EAAO,KAE7BzqC,KAAKyqC,OAASA,EACdzqC,KAAK88D,WAGT98D,KAAK+8D,OAAS,SAAShnB,EAAMinB,EAAartB,EAASjtC,GAC/C,GAAK1C,KAAKyqC,OAIV,IAAK,GAFD9V,GAAQjyB,EAAO2kD,SAAUhV,EAAM3vC,EAAO4kD,QAEjChkD,EAAIqxB,EAAY0d,GAAL/uC,EAAUA,IAAK,CAC/B,GAAI2pD,GAASjtD,KAAK88D,MAAMx5D,EACV,OAAV2pD,IACAA,EAAS5hB,EAAKb,gBAAgBmF,EAAQ8U,QAAQnhD,GAAItD,KAAKyqC,QACnDwiB,EAAO7rD,OAASpB,KAAK68D,aACrB5P,EAASA,EAAO/+B,MAAM,EAAGluB,KAAK68D,aAClC5P,EAASA,EAAOt3B,IAAI,SAASpmB,GACzB,MAAO,IAAI42C,GAAM7iD,EAAGiM,EAAMo7B,OAAQrnC,EAAGiM,EAAMo7B,OAASp7B,EAAMnO,UAE9DpB,KAAK88D,MAAMx5D,GAAK2pD,EAAO7rD,OAAS6rD,EAAS,GAG7C,KAAK,GAAIp7C,GAAIo7C,EAAO7rD,OAAQyQ,KACxBmrD,EAAYC,qBACRlnB,EAAMkX,EAAOp7C,GAAG41C,cAAc9X,GAAU3vC,KAAK28D,MAAOj6D,OAKrEnC,KAAKm8D,EAAgBj7D,WAExB7B,EAAQ88D,gBAAkBA,IAG1BxwD,IAAIpM,OAAO,8BAA8B,UAAU,UAAU,SAAS,aAAc,SAASswB,EAAUxwB,EAASC,GAChH,YAGA,SAASq9D,GAASC,EAAUC,GACxBp9D,KAAKm9D,SAAWA,EACZt5C,MAAMrgB,QAAQ45D,GACdp9D,KAAKo9D,MAAQA,EAEbA,EAAQp9D,KAAKo9D,OAAUA,EAG3B,IAAI7zB,GAAO6zB,EAAMA,EAAMh8D,OAAS,EAChCpB,MAAK6H,MAAQ,GAAIs+C,GAAMiX,EAAM,GAAGzoC,MAAMyd,IAAKgrB,EAAM,GAAGzoC,MAAM4d,OACnChJ,EAAK8I,IAAID,IAAK7I,EAAK8I,IAAIE,QAC9CvyC,KAAK20B,MAAQ30B,KAAK6H,MAAM8sB,MACxB30B,KAAKqyC,IAAQryC,KAAK6H,MAAMwqC,IAExBryC,KAAKo9D,MAAMjjD,QAAQ,SAAS8pC,GACxBA,EAAKoZ,YAAYr9D,OAClBA,MAjBP,GAAImmD,GAAQ/1B,EAAS,YAAY+1B,OAoBjC,WACInmD,KAAKs9D,SAAW,SAASrgC,GACrBj9B,KAAK20B,MAAMyd,KAAOnV,EAClBj9B,KAAKqyC,IAAID,KAAOnV,EAChBj9B,KAAKo9D,MAAMjjD,QAAQ,SAAS8pC,GACxBA,EAAKtvB,MAAMyd,KAAOnV,EAClBgnB,EAAK5R,IAAID,KAAOnV,KAIxBj9B,KAAK0kD,QAAU,SAAST,GACpB,GAAIA,EAAKsZ,QAAS,CACd,GAAItZ,EAAKtvB,MAAMyd,IAAMpyC,KAAKomD,UAAYnC,EAAKqC,OAAStmD,KAAKsmD,OACrD,KAAM,IAAIvlD,OAAM,4DAEpBf,MAAKo9D,MAAMpuD,KAAKi1C,GAChBjkD,KAAKo9D,MAAMtmD,KAAK,SAASrH,EAAGC,GACxB,OAAQD,EAAE5H,MAAMq/C,WAAWx3C,EAAEilB,MAAMyd,IAAK1iC,EAAEilB,MAAM4d,UAEhDvyC,KAAK6H,MAAMq/C,WAAWjD,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,QAAU,GAC3DvyC,KAAKqyC,IAAID,IAAM6R,EAAK5R,IAAID,IACxBpyC,KAAKqyC,IAAIE,OAAU0R,EAAK5R,IAAIE,QACrBvyC,KAAK6H,MAAMo/C,aAAahD,EAAK5R,IAAID,IAAK6R,EAAK5R,IAAIE,QAAU,IAChEvyC,KAAK20B,MAAMyd,IAAM6R,EAAKtvB,MAAMyd,IAC5BpyC,KAAK20B,MAAM4d,OAAS0R,EAAKtvB,MAAM4d,YAEhC,IAAI0R,EAAKtvB,MAAMyd,KAAOpyC,KAAKqyC,IAAID,IAClCpyC,KAAKo9D,MAAMpuD,KAAKi1C,GAChBjkD,KAAKqyC,IAAID,IAAM6R,EAAK5R,IAAID,IACxBpyC,KAAKqyC,IAAIE,OAAS0R,EAAK5R,IAAIE,WACxB,CAAA,GAAI0R,EAAK5R,IAAID,KAAOpyC,KAAK20B,MAAMyd,IAKlC,KAAM,IAAIrxC,OAAM,iEAJhBf,MAAKo9D,MAAMzjD,QAAQsqC,GACnBjkD,KAAK20B,MAAMyd,IAAM6R,EAAKtvB,MAAMyd,IAC5BpyC,KAAK20B,MAAM4d,OAAS0R,EAAKtvB,MAAM4d,OAInC0R,EAAK0G,SAAW3qD,MAGpBA,KAAKw9D,YAAc,SAASprB,GACxB,MAAOA,IAAOpyC,KAAK20B,MAAMyd,KAAOA,GAAOpyC,KAAKqyC,IAAID,KAGpDpyC,KAAKy9D,KAAO,SAASv1D,EAAUo+C,EAAQC,GACnC,GAEItC,GACA3R,EAAKkD,EAHLkoB,EAAU,EACVN,EAAQp9D,KAAKo9D,MAEFO,GAAW,CAEZ,OAAVrX,IACAA,EAAStmD,KAAKqyC,IAAID,IAClBmU,EAAYvmD,KAAKqyC,IAAIE,OAGzB,KAAK,GAAIjvC,GAAI,EAAGA,EAAI85D,EAAMh8D,OAAQkC,IAAK,CAInC,GAHA2gD,EAAOmZ,EAAM95D,GAEbgvC,EAAM2R,EAAKp8C,MAAMo/C,aAAaX,EAAQC,GAC3B,IAAPjU,EAEA,WADApqC,GAAS,KAAMo+C,EAAQC,EAAWmX,EAASC,EAM/C,IAFAnoB,EAAOttC,EAAS,KAAM+7C,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,OAAQmrB,EAASC,GAClEnoB,GAAQA,GAAQttC,EAAS+7C,EAAK2Z,YAAa3Z,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,OAAQmrB,GAC1EloB,GAAgB,IAARlD,EACR,MAEJqrB,IAAY1Z,EAAKsZ,QACjBG,EAAUzZ,EAAK5R,IAAIE,OAEvBrqC,EAAS,KAAMo+C,EAAQC,EAAWmX,EAASC,IAG/C39D,KAAK69D,cAAgB,SAASzrB,EAAKG,GAE/B,IAAK,GADD0R,GAAM3R,EACDhvC,EAAI,EAAGA,EAAItD,KAAKo9D,MAAMh8D,OAAQkC,IAAK,CAGxC,GAFA2gD,EAAOjkD,KAAKo9D,MAAM95D,GAClBgvC,EAAM2R,EAAKp8C,MAAMq/C,WAAW9U,EAAKG,GACtB,IAAPD,EACA,OACI2R,KAAMA,EACN6Z,KAAM,QAEP,IAAY,IAARxrB,EACP,OACI2R,KAAMA,EACN6Z,KAAM,UAIlB,MAAO,OAGX99D,KAAK+9D,eAAiB,SAAS3rB,EAAKG,EAAQjlB,GACxC,GACI22B,GAAMmZ,EADN1gC,EAAM18B,KAAK69D,cAAczrB,EAAKG,EAElC,IAAI7V,EAEA,GADAunB,EAAOvnB,EAAIunB,KACK,UAAZvnB,EAAIohC,MACD7Z,EAAKtvB,MAAM4d,QAAUA,GACrB0R,EAAKtvB,MAAMyd,KAAOA,EAErB1kC,OAAOkC,SAAWlC,OAAOkC,QAAQzM,IAAIivC,EAAKG,EAAQ0R,OAC/C,IAAIA,EAAKtvB,MAAMyd,KAAOA,EAAK,CAC9BgrB,EAAQp9D,KAAKo9D,KACb,IAAI95D,GAAI85D,EAAM9tD,QAAQ20C,EAItB,KAHU,IAAN3gD,IACAtD,KAAK20B,MAAM4d,QAAUjlB,GAEpBhqB,EAAGA,EAAI85D,EAAMh8D,OAAQkC,IAAK,CAG3B,GAFA2gD,EAAOmZ,EAAM95D,GACb2gD,EAAKtvB,MAAM4d,QAAUjlB,GAChB22B,EAAKsZ,QACN,MAEJtZ,GAAK5R,IAAIE,QAAUjlB,EAEvBttB,KAAKqyC,IAAIE,QAAUjlB,IAK/BttB,KAAKiR,MAAQ,SAASmhC,EAAKG,GACvB,GAAI1d,GAAM70B,KAAK69D,cAAczrB,EAAKG,EAElC,KAAK1d,GAAmB,UAAZA,EAAIipC,KACZ,MAAO,KAEX,IAAI7Z,GAAOpvB,EAAIovB,KACXmZ,EAAQp9D,KAAKo9D,MACbD,EAAWn9D,KAAKm9D,SAEhB75D,EAAI85D,EAAM9tD,QAAQ20C,GAClB+Z,EAAaZ,EAAM95D,EAAI,EAC3BtD,MAAKqyC,IAAID,IAAM4rB,EAAW3rB,IAAID,IAC9BpyC,KAAKqyC,IAAIE,OAASyrB,EAAW3rB,IAAIE,OACjC6qB,EAAQA,EAAMhsD,OAAO9N,EAAG85D,EAAMh8D,OAASkC,EAEvC,IAAI26D,GAAc,GAAIf,GAASC,EAAUC,EAEzC,OADAD,GAAS/rD,OAAO+rD,EAAS7tD,QAAQtP,MAAQ,EAAG,EAAGi+D,GACxCA,GAGXj+D,KAAK4vD,MAAQ,SAASsO,GAElB,IAAK,GADDd,GAAQc,EAAad,MAChB95D,EAAI,EAAGA,EAAI85D,EAAMh8D,OAAQkC,IAC9BtD,KAAK0kD,QAAQ0Y,EAAM95D,GAEvB,IAAI65D,GAAWn9D,KAAKm9D,QACpBA,GAAS/rD,OAAO+rD,EAAS7tD,QAAQ4uD,GAAe,IAGpDl+D,KAAKsQ,SAAW,WACZ,GAAIosB,IAAO18B,KAAK6H,MAAMyI,WAAa,MAMnC,OAJAtQ,MAAKo9D,MAAMjjD,QAAQ,SAAS8pC,GACxBvnB,EAAI1tB,KAAK,KAAOi1C,EAAK3zC,cAEzBosB,EAAI1tB,KAAK,KACF0tB,EAAIltB,KAAK,OAGpBxP,KAAKm+D,cAAgB,SAASC,GAG1B,IAAK,GAFDC,GAAoB,EAEf/6D,EAAI,EAAGA,EAAItD,KAAKo9D,MAAMh8D,OAAQkC,IAAK,CACxC,GAAI2gD,GAAOjkD,KAAKo9D,MAAM95D,EAGtB,IADA86D,GAAOna,EAAKtvB,MAAM4d,OAAS8rB,EACjB,EAAND,EACA,OACIhsB,IAAK6R,EAAKtvB,MAAMyd,IAChBG,OAAQ0R,EAAKtvB,MAAM4d,OAAS6rB,EAKpC,IADAA,GAAOna,EAAK2Z,YAAYx8D,OACd,EAANg9D,EACA,MAAOna,GAAKtvB,KAGhB0pC,GAAoBpa,EAAK5R,IAAIE,OAGjC,OACIH,IAAKpyC,KAAKqyC,IAAID,IACdG,OAAQvyC,KAAKqyC,IAAIE,OAAS6rB,MAGnC79D,KAAK28D,EAASz7D,WAEjB7B,EAAQs9D,SAAWA,IAGnBhxD,IAAIpM,OAAO,kBAAkB,UAAU,UAAU,SAAS,aAAc,SAASswB,EAAUxwB,EAASC,GACpG,YACA,IAAIsmD,GAAQ/1B,EAAS,WAAW+1B,MAC5BH,EAAgBG,EAAMH,cAEtBsY,EAAY,WACZt+D,KAAKitD,YAGT,WACIjtD,KAAKgmD,cAAgBA,EAErBhmD,KAAKu+D,WAAa,SAAS1pC,EAAK2pC,EAAc7nD,GAG1C,IAAK,GAFDyO,GAAOplB,KAAKitD,OAEP3pD,EAAIqT,GAAc,EAAGrT,EAAI8hB,EAAKhkB,OAAQkC,IAAK,CAChD,GAAIuE,GAAQud,EAAK9hB,GACb8wC,EAAS4R,EAAcnxB,EAAKhtB,EAAMwqC,IACtC,MAAI+B,EAAS,GAAb,CAEA,GAAID,GAAW6R,EAAcnxB,EAAKhtB,EAAM8sB,MACxC,OAAe,KAAXyf,EACOoqB,GAA6B,IAAbrqB,GAAkB7wC,EAAE,EAAIA,EAC/C6wC,EAAW,GAAmB,IAAbA,IAAmBqqB,EAC7Bl7D,GAEHA,EAAE,GAEd,OAAQA,EAAI,GAGhBtD,KAAKyG,IAAM,SAASoB,GAChB,GAAI22D,IAAgB32D,EAAMoV,UACtBtG,EAAa3W,KAAKu+D,WAAW12D,EAAM8sB,MAAO6pC,EAC7B,GAAb7nD,IACAA,GAAcA,EAAa,EAE/B,IAAIE,GAAW7W,KAAKu+D,WAAW12D,EAAMwqC,IAAKmsB,EAAc7nD,EAMxD,OAJe,GAAXE,EACAA,GAAYA,EAAW,EAEvBA,IACG7W,KAAKitD,OAAO77C,OAAOuF,EAAYE,EAAWF,EAAY9O,IAGjE7H,KAAKy+D,QAAU,SAASr5C,GAEpB,IAAK,GADD2P,MACKzxB,EAAI8hB,EAAKhkB,OAAQkC,KACtByxB,EAAQ/lB,KAAKzO,KAAKw0B,EAAS/0B,KAAKyG,IAAI2e,EAAK9hB,IAE7C,OAAOyxB,IAGX/0B,KAAK0+D,eAAiB,SAAS7pC,GAC3B,GAAIvxB,GAAItD,KAAKu+D,WAAW1pC,EAExB,OAAIvxB,IAAK,EACEtD,KAAKitD,OAAO77C,OAAO9N,EAAG,GADjC,QAGJtD,KAAK4vD,MAAQ,WACT,GAAI76B,MACA3P,EAAOplB,KAAKitD,MAEhB7nC,GAAOA,EAAKtO,KAAK,SAASrH,EAAGC,GACzB,MAAOs2C,GAAcv2C,EAAEklB,MAAOjlB,EAAEilB,QAIpC,KAAK,GADe9sB,GAAhB+D,EAAOwZ,EAAK,GACP9hB,EAAI,EAAGA,EAAI8hB,EAAKhkB,OAAQkC,IAAK,CAClCuE,EAAQ+D,EACRA,EAAOwZ,EAAK9hB,EACZ,IAAIgvC,GAAM0T,EAAcn+C,EAAMwqC,IAAKzmC,EAAK+oB,MAC9B,GAAN2d,IAGO,GAAPA,GAAazqC,EAAMoV,WAAcrR,EAAKqR,aAGtC+oC,EAAcn+C,EAAMwqC,IAAKzmC,EAAKymC,KAAO,IACrCxqC,EAAMwqC,IAAID,IAAMxmC,EAAKymC,IAAID,IACzBvqC,EAAMwqC,IAAIE,OAAS3mC,EAAKymC,IAAIE,QAGhCntB,EAAKhU,OAAO9N,EAAG,GACfyxB,EAAQ/lB,KAAKpD,GACbA,EAAO/D,EACPvE,KAKJ,MAFAtD,MAAKitD,OAAS7nC,EAEP2P,GAGX/0B,KAAKg1C,SAAW,SAAS5C,EAAKG,GAC1B,MAAOvyC,MAAKu+D,YAAYnsB,IAAKA,EAAKG,OAAQA,KAAY,GAG1DvyC,KAAK2+D,cAAgB,SAAS9pC,GAC1B,MAAO70B,MAAKu+D,WAAW1pC,IAAQ,GAGnC70B,KAAK4+D,aAAe,SAAS/pC,GACzB,GAAIvxB,GAAItD,KAAKu+D,WAAW1pC,EACxB,OAAIvxB,IAAK,EACEtD,KAAKitD,OAAO3pD,GADvB,QAKJtD,KAAKonD,SAAW,SAAShB,EAAUE,GAC/B,GAAIlhC,GAAOplB,KAAKitD,MAChB,IAAI7nC,EAAK,GAAGuP,MAAMyd,IAAMkU,GAAUlhC,EAAKA,EAAKhkB,OAAS,GAAGuzB,MAAMyd,IAAMgU,EAChE,QAEJ,IAAIzvC,GAAa3W,KAAKu+D,YAAYnsB,IAAKgU,EAAU7T,OAAQ,GACxC,GAAb57B,IACAA,GAAcA,EAAa,EAC/B,IAAIE,GAAW7W,KAAKu+D,YAAYnsB,IAAKkU,EAAQ/T,OAAQ,GAAI57B,EAC1C,GAAXE,IACAA,GAAYA,EAAW,EAG3B,KAAK,GADDgoD,MACKv7D,EAAIqT,EAAgBE,EAAJvT,EAAcA,IACnCu7D,EAAQ7vD,KAAKoW,EAAK9hB,GAEtB,OAAOu7D,IAGX7+D,KAAK8+D,UAAY,WACb,MAAO9+D,MAAKitD,OAAO77C,OAAO,EAAGpR,KAAKitD,OAAO7rD,SAG7CpB,KAAKwlD,OAAS,SAAS7V,GACf3vC,KAAK2vC,SACL3vC,KAAKylD,SAETzlD,KAAK2vC,QAAUA,EACf3vC,KAAK0K,SAAW1K,KAAKo5D,UAAUjpC,KAAKnwB,MAEpCA,KAAK2vC,QAAQ/hC,GAAG,SAAU5N,KAAK0K,WAGnC1K,KAAKylD,OAAS,WACLzlD,KAAK2vC,UAEV3vC,KAAK2vC,QAAQxJ,eAAe,SAAUnmC,KAAK0K,UAC3C1K,KAAK2vC,QAAU,OAGnB3vC,KAAKo5D,UAAY,SAASxxC,GACtB,GAAIm3C,GAAcn3C,EAAEplB,KAAKqF,KACzB,IAAwB,KAApB+f,EAAEplB,KAAKgE,OAAO,GACd,GAAImuB,GAAQoqC,EAAYpqC,MACpB0d,EAAM0sB,EAAY1sB,QAEtB,IAAIA,GAAM0sB,EAAYpqC,MAClBA,EAAQoqC,EAAY1sB,GAS5B,KAAK,GAPD+T,GAAWzxB,EAAMyd,IACjBkU,EAASjU,EAAID,IACb4sB,EAAU1Y,EAASF,EAEnBmR,GAAW5iC,EAAM4d,OAASF,EAAIE,OAC9B0a,EAASjtD,KAAKitD,OAET3pD,EAAI,EAAGuc,EAAIotC,EAAO7rD,OAAYye,EAAJvc,EAAOA,IAAK,CAC3C,GAAI+pB,GAAI4/B,EAAO3pD,EACf,MAAI+pB,EAAEglB,IAAID,IAAMgU,GAAhB,CAEA,GAAI/4B,EAAEsH,MAAMyd,IAAMgU,EACd,KASJ,IAPI/4B,EAAEsH,MAAMyd,KAAOgU,GAAY/4B,EAAEsH,MAAM4d,QAAU5d,EAAM4d,SAC/CllB,EAAEsH,MAAM4d,QAAU5d,EAAM4d,QAAUvyC,KAAKs5D,eAEvCjsC,EAAEsH,MAAM4d,QAAUglB,EAClBlqC,EAAEsH,MAAMyd,KAAO4sB,IAGnB3xC,EAAEglB,IAAID,KAAOgU,GAAY/4B,EAAEglB,IAAIE,QAAU5d,EAAM4d,OAAQ,CACvD,GAAIllB,EAAEglB,IAAIE,QAAU5d,EAAM4d,QAAUvyC,KAAKs5D,aACrC,QAEAjsC,GAAEglB,IAAIE,QAAU5d,EAAM4d,QAAUglB,EAAU,GAAS13C,EAAI,EAARvc,GAC3C+pB,EAAEglB,IAAIE,OAASllB,EAAEsH,MAAM4d,QAAUllB,EAAEglB,IAAIE,QAAU0a,EAAO3pD,EAAE,GAAGqxB,MAAM4d,SACnEllB,EAAEglB,IAAIE,QAAUglB,GAExBlqC,EAAEglB,IAAIE,QAAUglB,EAChBlqC,EAAEglB,IAAID,KAAO4sB,IAIrB,GAAe,GAAXA,GAAoBn/C,EAAJvc,EAChB,KAAWuc,EAAJvc,EAAOA,IAAK,CACf,GAAI+pB,GAAI4/B,EAAO3pD,EACf+pB,GAAEsH,MAAMyd,KAAO4sB,EACf3xC,EAAEglB,IAAID,KAAO4sB,MAK1Bz+D,KAAK+9D,EAAU78D,WAElB7B,EAAQ0+D,UAAYA,IAGpBpyD,IAAIpM,OAAO,yBAAyB,UAAU,UAAU,SAAS,YAAY,iBAAiB,eAAgB,SAASswB,EAAUxwB,EAASC,GAC1I,YAkFA,SAASo/D,GAAaC,EAAO97C,GACzB87C,EAAM9sB,KAAOhvB,EAAOgvB,IACH,GAAb8sB,EAAM9sB,MACN8sB,EAAM3sB,QAAUnvB,EAAOmvB,QAE/B,QAAS4sB,GAAat3D,EAAOub,GACzB67C,EAAap3D,EAAM8sB,MAAOvR,GAC1B67C,EAAap3D,EAAMwqC,IAAKjvB,GAE5B,QAASg8C,GAAaF,EAAO97C,GACR,GAAb87C,EAAM9sB,MACN8sB,EAAM3sB,QAAUnvB,EAAOmvB,QAC3B2sB,EAAM9sB,KAAOhvB,EAAOgvB,IAExB,QAASitB,GAAax3D,EAAOub,GACzBg8C,EAAav3D,EAAM8sB,MAAOvR,GAC1Bg8C,EAAav3D,EAAMwqC,IAAKjvB,GAhG5B,GACIk7C,IADQluC,EAAS,YAAY+1B,MACjB/1B,EAAS,iBAAiBkuC,WACtC9hC,EAAMpM,EAAS,cACfkvC,EAAO1/D,EAAQ0/D,KAAO,SAASz3D,EAAO+1D,GACtC59D,KAAK2qD,SAAW,KAChB3qD,KAAK49D,YAAcA,EACnB59D,KAAK6H,MAAQA,EACb7H,KAAK20B,MAAQ9sB,EAAM8sB,MACnB30B,KAAKqyC,IAAMxqC,EAAMwqC,IAEjBryC,KAAKu9D,QAAU11D,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,IAC5CpyC,KAAKu/D,SAAWv/D,KAAKitD,UAGzBzwB,GAAIP,SAASqjC,EAAMhB,GAEnB,WAEIt+D,KAAKsQ,SAAW,WACZ,MAAO,IAAMtQ,KAAK49D,YAAc,KAAO59D,KAAK6H,MAAMyI,YAGtDtQ,KAAKq9D,YAAc,SAAS1S,GACxB3qD,KAAK2qD,SAAWA,EAChB3qD,KAAKu/D,SAASplD,QAAQ,SAAS8pC,GAC3BA,EAAKoZ,YAAY1S,MAIzB3qD,KAAKoW,MAAQ,WACT,GAAIvO,GAAQ7H,KAAK6H,MAAMuO,QACnB6tC,EAAO,GAAIqb,GAAKz3D,EAAO7H,KAAK49D,YAKhC,OAJA59D,MAAKu/D,SAASplD,QAAQ,SAASqlD,GAC3Bvb,EAAKsb,SAASvwD,KAAKwwD,EAAQppD,WAE/B6tC,EAAKwb,iBAAmBz/D,KAAKy/D,iBACtBxb,GAGXjkD,KAAK0/D,WAAa,SAASzb,GACvB,IAAIjkD,KAAK6H,MAAM2+C,QAAQvC,GAAvB,CAGA,IAAKjkD,KAAK6H,MAAM8+C,cAAc1C,GAC1B,KAAM,IAAIljD,OAAM,+CAAiDkjD,EAAKp8C,MAAQ7H,KAAK6H,MACvFs3D,GAAalb,EAAMjkD,KAAK20B,MAGxB,KAAK,GADDyd,GAAM6R,EAAKtvB,MAAMyd,IAAKG,EAAS0R,EAAKtvB,MAAM4d,OACrCjvC,EAAI,EAAGgvC,EAAM,GAAIhvC,EAAItD,KAAKu/D,SAASn+D,SACxCkxC,EAAMtyC,KAAKu/D,SAASj8D,GAAGuE,MAAM4+C,QAAQrU,EAAKG,GAC/B,GAAPD,GAF4ChvC,KAKpD,GAAIq8D,GAAa3/D,KAAKu/D,SAASj8D,EAE/B,IAAW,GAAPgvC,EACA,MAAOqtB,GAAWD,WAAWzb,EAEjC,KAAK,GADD7R,GAAM6R,EAAKp8C,MAAMwqC,IAAID,IAAKG,EAAS0R,EAAKp8C,MAAMwqC,IAAIE,OAC7C1gC,EAAIvO,EAAGgvC,EAAM,GAAIzgC,EAAI7R,KAAKu/D,SAASn+D,SACxCkxC,EAAMtyC,KAAKu/D,SAAS1tD,GAAGhK,MAAM4+C,QAAQrU,EAAKG,GAC/B,GAAPD,GAF4CzgC,KAKrC7R,KAAKu/D,SAAS1tD,EAE7B,IAAW,GAAPygC,EACA,KAAM,IAAIvxC,OAAM,+CAAiDkjD,EAAKp8C,MAAQ7H,KAAK6H,MAEnE7H,MAAKu/D,SAASnuD,OAAO9N,EAAGuO,EAAIvO,EAAG2gD,EAGnD,OAFAA,GAAKoZ,YAAYr9D,KAAK2qD,UAEf1G,IAGXjkD,KAAKq/D,aAAe,SAASx3D,GACzB,MAAOw3D,GAAax3D,EAAO7H,KAAK20B,SAGrCp0B,KAAK++D,EAAK79D,aAuBbyK,IAAIpM,OAAO,4BAA4B,UAAU,UAAU,SAAS,YAAY,6BAA6B,wBAAwB,sBAAuB,SAASswB,EAAUxwB,EAASC,GACxL,YAOA,SAAS+/D,KACL5/D,KAAKkkD,UAAY,SAAS9R,EAAKG,EAAQstB,GACnC,GAAIlV,GAAW3qD,KAAK4qD,YAAYxY,EAChC,KAAKuY,EACD,MAAO,KAGX,KAAK,GADDyS,GAAQzS,EAASyS,MACZ95D,EAAI,EAAGA,EAAI85D,EAAMh8D,OAAQkC,IAAK,CACnC,GAAI2gD,GAAOmZ,EAAM95D,EACjB,IAAI2gD,EAAKp8C,MAAMmtC,SAAS5C,EAAKG,GAAS,CAClC,GAAY,GAARstB,GAAa5b,EAAKp8C,MAAMg/C,MAAMzU,EAAKG,GACnC,QACG,IAAY,IAARstB,GAAc5b,EAAKp8C,MAAMi/C,QAAQ1U,EAAKG,GAC7C,QAEJ,OAAO0R,MAInBjkD,KAAK8/D,gBAAkB,SAASj4D,GAC5B,GAAI8sB,GAAQ9sB,EAAM8sB,MACd0d,EAAMxqC,EAAMwqC,IACZ0tB,EAAY//D,KAAKggE,UACjBC,IAEJtrC,GAAM4d,QAAU,EAChBF,EAAIE,QAAU,CAEd,KAAK,GAAIjvC,GAAI,EAAGA,EAAIy8D,EAAU3+D,OAAQkC,IAAK,CACvC,GAAIgvC,GAAMytB,EAAUz8D,GAAGuE,MAAM6+C,aAAa7+C,EAC1C,IAAW,GAAPyqC,EAAJ,CAGK,GAAW,IAAPA,EACL,KAIJ,KAAK,GADD8qB,GAAQ2C,EAAUz8D,GAAG85D,MAChBvrD,EAAI,EAAGA,EAAIurD,EAAMh8D,OAAQyQ,IAAK,CACnC,GAAIoyC,GAAOmZ,EAAMvrD,EAEjB,IADAygC,EAAM2R,EAAKp8C,MAAM6+C,aAAa7+C,GACnB,IAAPyqC,EACA,KACG,IAAW,GAAPA,EAAJ,CAGP,GAAW,IAAPA,EACA,KAEJ2tB,GAAWjxD,KAAKi1C,MAMxB,MAHAtvB,GAAM4d,QAAU,EAChBF,EAAIE,QAAU,EAEP0tB,GAGXjgE,KAAKkgE,oBAAsB,SAASjT,GAChC,GAAIppC,MAAMrgB,QAAQypD,GAAS,CACvB,GAAImQ,KACJnQ,GAAO9yC,QAAQ,SAAStS,GACpBu1D,EAAQA,EAAMzhD,OAAO3b,KAAK8/D,gBAAgBj4D,KAC3C7H,UAEH,IAAIo9D,GAAQp9D,KAAK8/D,gBAAgB7S,EAErC,OAAOmQ,IAEXp9D,KAAKmgE,YAAc,WAIf,IAAK,GAHD/C,MACA2C,EAAY//D,KAAKggE,UAEZ18D,EAAI,EAAGA,EAAIy8D,EAAU3+D,OAAQkC,IAClC,IAAK,GAAIuO,GAAI,EAAGA,EAAIkuD,EAAUz8D,GAAG85D,MAAMh8D,OAAQyQ,IAC3CurD,EAAMpuD,KAAK+wD,EAAUz8D,GAAG85D,MAAMvrD,GAEtC,OAAOurD,IAEXp9D,KAAKgsD,gBAAkB,SAAS5Z,EAAKG,EAAQ1Z,EAAM8xB,GAE/C,GADAA,EAAWA,GAAY3qD,KAAK4qD,YAAYxY,IACnCuY,EACD,MAAO,KAMX,KAAK,GADD/tC,GAAKqnC,EAHLmc,GACA/tB,KAAOE,OAAQ,IAGVjvC,EAAI,EAAGA,EAAIqnD,EAASyS,MAAMh8D,OAAQkC,IAAK,CAC5C2gD,EAAO0G,EAASyS,MAAM95D,EACtB,IAAIgvC,GAAM2R,EAAKp8C,MAAMq/C,WAAW9U,EAAKG,EACrC,IAAW,IAAPD,EAAW,CACX11B,EAAM5c,KACDykD,QAAQR,EAAKtvB,MAAMyd,KACnBhuB,UAAUg8C,EAAS/tB,IAAIE,OAAQ0R,EAAKtvB,MAAM4d,OAC/C,OAEC,GAAY,IAARD,EACL,MAAO,KAEX8tB,GAAWnc,EAKf,MAHKrnC,KACDA,EAAM5c,KAAKykD,QAAQR,EAAKtvB,MAAMyd,KAAKhuB,UAAUg8C,EAAS/tB,IAAIE,SAElD,IAAR1Z,EACOjc,EAAIwH,UAAU,EAAGmuB,EAAS6tB,EAAS/tB,IAAIE,QACjC,GAAR1Z,EACEjc,EAAIwH,UAAUmuB,EAAS6tB,EAAS/tB,IAAIE,QAEpC31B,GAGf5c,KAAK4qD,YAAc,SAASyV,EAAQC,GAChC,GAAInD,GAAWn9D,KAAKggE,UAChB18D,EAAI,CAKR,KAJIg9D,IACAh9D,EAAI65D,EAAS7tD,QAAQgxD,IAChB,IAALh9D,IACAA,EAAI,GACHA,EAAGA,EAAI65D,EAAS/7D,OAAQkC,IAAK,CAC9B,GAAIqnD,GAAWwS,EAAS75D,EACxB,IAAIqnD,EAASh2B,MAAMyd,KAAOiuB,GAAU1V,EAAStY,IAAID,KAAOiuB,EACpD,MAAO1V,EACJ,IAAIA,EAAStY,IAAID,IAAMiuB,EAC1B,MAAO,MAGf,MAAO,OAEXrgE,KAAKugE,gBAAkB,SAASF,EAAQC,GACpC,GAAInD,GAAWn9D,KAAKggE,UAChB18D,EAAI,CAKR,KAJIg9D,IACAh9D,EAAI65D,EAAS7tD,QAAQgxD,IAChB,IAALh9D,IACAA,EAAI,GACHA,EAAGA,EAAI65D,EAAS/7D,OAAQkC,IAAK,CAC9B,GAAIqnD,GAAWwS,EAAS75D,EACxB,IAAIqnD,EAAStY,IAAID,KAAOiuB,EACpB,MAAO1V,GAGf,MAAO,OAGX3qD,KAAKwgE,kBAAoB,SAASrtD,EAAOo2B,GAErC,IAAK,GADD4zB,GAAWn9D,KAAKggE,UAAW/K,EAAW1rB,EAAKp2B,EAAM,EAC5C7P,EAAI,EAAGA,EAAI65D,EAAS/7D,OAAQkC,IAAK,CACtC,GAAIqnD,GAAWwS,EAAS75D,GACpB+uC,EAAMsY,EAAStY,IAAID,IACnBzd,EAAQg2B,EAASh2B,MAAMyd,GAC3B,IAAIC,GAAO9I,EAAM,CACFA,EAAR5U,IACIA,GAASxhB,EACR8hD,GAAY1rB,EAAK5U,EAEjBsgC,EAAW,EAEnB,OACM5iB,GAAOl/B,IAET8hD,GADAtgC,GAASxhB,EACIk/B,EAAI1d,EAEJ0d,EAAIl/B,EAAM,GAGnC,MAAO8hD,IAGXj1D,KAAKygE,aAAe,SAAS9V,GAKzB,MAJA3qD,MAAKggE,UAAUhxD,KAAK27C,GACpB3qD,KAAKggE,UAAUlpD,KAAK,SAASrH,EAAGC,GAC5B,MAAOD,GAAEklB,MAAMyd,IAAM1iC,EAAEilB,MAAMyd,MAE1BuY,GAEX3qD,KAAK0kD,QAAU,SAASkZ,EAAa/1D,GACjC,GAEIo8C,GAFAkZ,EAAWn9D,KAAKggE,UAChBU,GAAQ,CAGR9C,aAAuB0B,GACvBrb,EAAO2Z,GAEP3Z,EAAO,GAAIqb,GAAKz3D,EAAO+1D,GACvB3Z,EAAKwb,iBAAmB53D,EAAM43D,kBAElCz/D,KAAK2gE,qBAAqB1c,EAAKp8C,MAE/B,IAAIu+C,GAAWnC,EAAKtvB,MAAMyd,IACtBiU,EAAcpC,EAAKtvB,MAAM4d,OACzB+T,EAASrC,EAAK5R,IAAID,IAClBmU,EAAYtC,EAAK5R,IAAIE,MACzB,MAAiB+T,EAAXF,GACFA,GAAYE,GAAyBC,EAAY,GAA3BF,GACtB,KAAM,IAAItlD,OAAM,kDAEpB,IAAI6/D,GAAY5gE,KAAKkkD,UAAUkC,EAAUC,EAAa,GAClDwa,EAAU7gE,KAAKkkD,UAAUoC,EAAQC,EAAW,GAChD,IAAIqa,GAAaC,GAAWD,EACxB,MAAOA,GAAUlB,WAAWzb,EAE5B2c,KAAcA,EAAU/4D,MAAMi/C,QAAQV,EAAUC,IAChDrmD,KAAKmkD,WAAWyc,GAEhBC,IAAYA,EAAQh5D,MAAMg/C,MAAMP,EAAQC,IACxCvmD,KAAKmkD,WAAW0c,EACpB,IAAIzD,GAAQp9D,KAAK8/D,gBAAgB7b,EAAKp8C,MAClCu1D,GAAMh8D,OAAS,IACfpB,KAAK8gE,YAAY1D,GACjBA,EAAMjjD,QAAQ,SAASqlD,GACnBvb,EAAKyb,WAAWF,KAIxB,KAAK,GAAIl8D,GAAI,EAAGA,EAAI65D,EAAS/7D,OAAQkC,IAAK,CACtC,GAAIqnD,GAAWwS,EAAS75D,EACxB,IAAIgjD,GAAUqE,EAASh2B,MAAMyd,IAAK,CAC9BuY,EAASjG,QAAQT,GACjByc,GAAQ,CACR,OACG,GAAIta,GAAYuE,EAAStY,IAAID,IAAK,CAGrC,GAFAuY,EAASjG,QAAQT,GACjByc,GAAQ,GACHzc,EAAKsZ,QAAS,CACf,GAAIW,GAAef,EAAS75D,EAAI,EAChC,IAAI46D,GAAgBA,EAAavpC,MAAMyd,KAAOkU,EAAQ,CAClDqE,EAASiF,MAAMsO,EACf,QAGR,MACG,GAAI5X,GAAUqE,EAASh2B,MAAMyd,IAChC,MAcR,MAVKsuB,KACD/V,EAAW3qD,KAAKygE,aAAa,GAAIvD,GAASl9D,KAAKggE,UAAW/b,KAE1DjkD,KAAK+gE,aACL/gE,KAAKghE,gBAAgBrW,EAASh2B,MAAMyd,IAAKuY,EAASh2B,MAAMyd,KAExDpyC,KAAKihE,sBAAsBtW,EAASh2B,MAAMyd,IAAKuY,EAASh2B,MAAMyd,KAClEpyC,KAAKkhE,WAAY,EACjBlhE,KAAKuwC,MAAM,cAAgB/tC,KAAMyhD,EAAMz9C,OAAQ,QAExCy9C,GAGXjkD,KAAKmhE,SAAW,SAAS/D,GACrBA,EAAMjjD,QAAQ,SAAS8pC,GACnBjkD,KAAK0kD,QAAQT,IACdjkD,OAGPA,KAAKmkD,WAAa,SAASF,GACvB,GAAI0G,GAAW1G,EAAK0G,SAChBvE,EAAWuE,EAASh2B,MAAMyd,IAC1BkU,EAASqE,EAAStY,IAAID,IAEtB2tB,EAAY//D,KAAKggE,UACjB5C,EAAQzS,EAASyS,KACrB,IAAoB,GAAhBA,EAAMh8D,OACN2+D,EAAU3uD,OAAO2uD,EAAUzwD,QAAQq7C,GAAW,OAElD,IAAIA,EAAS9iD,MAAMg/C,MAAM5C,EAAK5R,IAAID,IAAK6R,EAAK5R,IAAIE,QAC5C6qB,EAAM1tC,MACNi7B,EAAStY,IAAID,IAAMgrB,EAAMA,EAAMh8D,OAAS,GAAGixC,IAAID,IAC/CuY,EAAStY,IAAIE,OAAS6qB,EAAMA,EAAMh8D,OAAS,GAAGixC,IAAIE,WAEtD,IAAIoY,EAAS9iD,MAAMi/C,QAAQ7C,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,QAClD6qB,EAAMngC,QACN0tB,EAASh2B,MAAMyd,IAAMgrB,EAAM,GAAGzoC,MAAMyd,IACpCuY,EAASh2B,MAAM4d,OAAS6qB,EAAM,GAAGzoC,MAAM4d,WAE3C,IAAI0R,EAAKsZ,QACLH,EAAMhsD,OAAOgsD,EAAM9tD,QAAQ20C,GAAO,OAEtC,CACI,GAAIga,GAActT,EAAS15C,MAAMgzC,EAAKtvB,MAAMyd,IAAK6R,EAAKtvB,MAAM4d,OAC5D6qB,GAAQa,EAAYb,MACpBA,EAAMngC,QACNghC,EAAYtpC,MAAMyd,IAAMgrB,EAAM,GAAGzoC,MAAMyd,IACvC6rB,EAAYtpC,MAAM4d,OAAS6qB,EAAM,GAAGzoC,MAAM4d,OAGzCvyC,KAAKohE,YACFphE,KAAK+gE,aACL/gE,KAAKghE,gBAAgB5a,EAAUE,GAE/BtmD,KAAKihE,sBAAsB7a,EAAUE,IAE7CtmD,KAAKkhE,WAAY,EACjBlhE,KAAKuwC,MAAM,cAAgB/tC,KAAMyhD,EAAMz9C,OAAQ,YAGnDxG,KAAK8gE,YAAc,SAAS1D,GAExB,IAAK,GADDiE,MACK/9D,EAAI,EAAGA,EAAI85D,EAAMh8D,OAAQkC,IAC9B+9D,EAAWryD,KAAKouD,EAAM95D,GAG1B+9D,GAAWlnD,QAAQ,SAAS8pC,GACxBjkD,KAAKmkD,WAAWF,IACjBjkD,MACHA,KAAKkhE,WAAY,GAGrBlhE,KAAKokD,WAAa,SAASH,GACvBjkD,KAAKmkD,WAAWF,GAChBA,EAAKsb,SAASplD,QAAQ,SAASqlD,GAC3Bvb,EAAKob,aAAaG,GAClBx/D,KAAK0kD,QAAQ8a,IACdx/D,MACCikD,EAAKwb,iBAAmB,GACxBz/D,KAAKshE,QAAQrd,EAAKtvB,MAAMyd,IAAI,EAAG6R,EAAK5R,IAAID,IAAK6R,EAAKwb,iBAAiB,GAEvExb,EAAKsb,aAGTv/D,KAAKuhE,YAAc,SAASnE,GACxBA,EAAMjjD,QAAQ,SAAS8pC,GACnBjkD,KAAKokD,WAAWH,IACjBjkD,OAGPA,KAAKwhE,OAAS,SAAS97B,EAAU+7B,GAC7B,GAAI55D,GAAOu1D,CAYX,IAXgB,MAAZ13B,GACA79B,EAAQ,GAAIs+C,GAAM,EAAG,EAAGnmD,KAAK42C,YAAa,GAC1C6qB,GAAc,GAEd55D,EAD0B,gBAAZ69B,GACN,GAAIygB,GAAMzgB,EAAU,EAAGA,EAAU1lC,KAAKykD,QAAQ/e,GAAUtkC,QAC3D,OAASskC,GACNygB,EAAMoB,WAAW7hB,EAAUA,GAE3BA,EAEZ03B,EAAQp9D,KAAKkgE,oBAAoBr4D,GAC7B45D,EACAzhE,KAAK8gE,YAAY1D,OAGjB,KADA,GAAImC,GAAWnC,EACRmC,EAASn+D,QACZpB,KAAKuhE,YAAYhC,GACjBA,EAAWv/D,KAAKkgE,oBAAoBr4D,EAG5C,OAAIu1D,GAAMh8D,OACCg8D,EADX,QAGJp9D,KAAK0hE,YAAc,SAASrB,EAAQsB,GAChC,QAAS3hE,KAAK4qD,YAAYyV,EAAQsB,IAGtC3hE,KAAK4hE,cAAgB,SAASvB,EAAQsB,GAClC,GAAIhX,GAAW3qD,KAAK4qD,YAAYyV,EAAQsB,EACxC,OAAOhX,GAAWA,EAAStY,IAAID,IAAMiuB,GAGzCrgE,KAAK6hE,gBAAkB,SAASxB,EAAQsB,GACpC,GAAIhX,GAAW3qD,KAAK4qD,YAAYyV,EAAQsB,EACxC,OAAOhX,GAAWA,EAASh2B,MAAMyd,IAAMiuB,GAG3CrgE,KAAK8hE,mBAAqB,SAASnX,EAAUrE,EAAQC,EAAWH,EAAUC,GACtD,MAAZD,IACAA,EAAWuE,EAASh2B,MAAMyd,KACX,MAAfiU,IACAA,EAAc,GACJ,MAAVC,IACAA,EAASqE,EAAStY,IAAID,KACT,MAAbmU,IACAA,EAAYvmD,KAAKykD,QAAQ6B,GAAQllD,OACrC,IAAI+3B,GAAMn5B,KAAKm5B,IACX4oC,EAAW,EAiBf,OAfApX,GAAS8S,KAAK,SAASG,EAAaxrB,EAAKG,EAAQyvB,GAC7C,KAAU5b,EAANhU,GAAJ,CAEA,GAAIA,GAAOgU,EAAU,CACjB,GAAaC,EAAT9T,EACA,MACJyvB,GAAaz5D,KAAKE,IAAI49C,EAAa2b,GAInCD,GADe,MAAfnE,EACYA,EAEAzkC,EAAIsrB,QAAQrS,GAAKhuB,UAAU49C,EAAYzvB,KAExD+T,EAAQC,GACJwb,GAGX/hE,KAAKqrD,eAAiB,SAASjZ,EAAKmU,EAAWH,EAAUC,GACrD,GAAIsE,GAAW3qD,KAAK4qD,YAAYxY,EAEhC,IAAKuY,EAKD,MAAO3qD,MAAK8hE,mBACRnX,EAAUvY,EAAKmU,EAAWH,EAAUC,EALxC,IAAIz4B,EAEJ,OADAA,GAAO5tB,KAAKm5B,IAAIsrB,QAAQrS,GACjBxkB,EAAKxJ,UAAUiiC,GAAe,EAAGE,GAAa34B,EAAKxsB,SAOlEpB,KAAKiiE,eAAiB,WAClB,GAAIC,KAQJ,OAPAA,GAAKliE,KAAKggE,UAAUrqC,IAAI,SAASg1B,GAC7B,GAAIyS,GAAQzS,EAASyS,MAAMznC,IAAI,SAASsuB,GACpC,MAAOA,GAAK7tC,SAEhB,OAAO,IAAI8mD,GAASgF,EAAI9E,MAMhCp9D,KAAKmiE,WAAa,SAASC,GACvB,GAEIne,GACAoe,EAHAp+D,EAAYjE,KAAKiE,UACjB4D,EAAQ5D,EAAU+rC,UAItB,IAAInoC,EAAMoV,UAAW,CACjB,GAAIiB,GAASrW,EAAM8sB,KAGnB,IAFAsvB,EAAOjkD,KAAKkkD,UAAUhmC,EAAOk0B,IAAKl0B,EAAOq0B,QAIrC,WADAvyC,MAAKokD,WAAWH,IAEToe,EAAariE,KAAKsiE,oBAAoBpkD,IACP,GAAlCrW,EAAMisC,aAAauuB,GACnBx6D,EAAMwqC,IAAMgwB,GAEZx6D,EAAM8sB,MAAQ0tC,EACdx6D,EAAM8sB,MAAM4d,SACZ1qC,EAAMwqC,IAAIE,WAEP8vB,EAAariE,KAAKsiE,qBAAqBlwB,IAAKl0B,EAAOk0B,IAAKG,OAAQr0B,EAAOq0B,OAAS,MACjD,GAAlC1qC,EAAMisC,aAAauuB,GACnBx6D,EAAMwqC,IAAMgwB,EAEZx6D,EAAM8sB,MAAQ0tC,EAElBx6D,EAAM8sB,MAAM4d,UAEZ1qC,EAAQ7H,KAAKuiE,oBAAoBrkD,EAAOk0B,IAAKl0B,EAAOq0B,SAAW1qC,MAEhE,CACH,GAAIu1D,GAAQp9D,KAAK8/D,gBAAgBj4D,EACjC,IAAIu6D,GAAehF,EAAMh8D,OAErB,WADApB,MAAKuhE,YAAYnE,EAEM,IAAhBA,EAAMh8D,SACb6iD,EAAOmZ,EAAM,IAOrB,GAHKnZ,IACDA,EAAOjkD,KAAKkkD,UAAUr8C,EAAM8sB,MAAMyd,IAAKvqC,EAAM8sB,MAAM4d,SAEnD0R,GAAQA,EAAKp8C,MAAMyI,YAAczI,EAAMyI,WAEvC,WADAtQ,MAAKokD,WAAWH,EAIpB,IAAI2Z,GAAc,KAClB,KAAK/1D,EAAMktC,cAAe,CAEtB,GADA6oB,EAAc59D,KAAKi8C,aAAap0C,GAC7B+1D,EAAYx8D,OAAS,EACpB,MACJw8D,GAAcA,EAAY/kC,OAAOzU,UAAU,EAAG,GAAK,KAGvDpkB,KAAK0kD,QAAQkZ,EAAa/1D,IAG9B7H,KAAKuiE,oBAAsB,SAASnwB,EAAKG,EAAQiwB,GAC7C,GAAIhL,GAAW,GAAIlD,GAAct0D,KAAMoyC,EAAKG,GACxC7lB,EAAQ8qC,EAAStC,iBACrB,IAAIxoC,GAAS,kBAAkBrd,KAAKqd,EAAM1hB,MAAO,CAC7C,GAAInD,GAAQ,GAAIs+C,GACZnyC,EAAK,GAAI/D,QAAOyc,EAAM1hB,KAAKmZ,QAAQ,OAAQ,OAC/C,IAAW,GAAPq+C,EAAU,CACV,EACI91C,GAAQ8qC,EAASzC,qBACbroC,GAAS1Y,EAAG3E,KAAKqd,EAAM1hB,MAC/BwsD,GAASxC,cAQb,GALAntD,EAAM8sB,MAAMyd,IAAMolB,EAASrC,qBAC3BttD,EAAM8sB,MAAM4d,OAASilB,EAASpC,wBAA0B,EAExDoC,EAAW,GAAIlD,GAAct0D,KAAMoyC,EAAKG,GAE7B,IAAPiwB,EAAW,CACX,EACI91C,GAAQ8qC,EAASxC,oBACbtoC,GAAS1Y,EAAG3E,KAAKqd,EAAM1hB,MAC/B0hB,GAAQ8qC,EAASzC,mBAEjBroC,GAAQ8qC,EAAStC,iBAIrB,OAFArtD,GAAMwqC,IAAID,IAAMolB,EAASrC,qBACzBttD,EAAMwqC,IAAIE,OAASilB,EAASpC,wBAA0B1oC,EAAMvnB,MAAM/D,OAAS,EACpEyG,IAIf7H,KAAKshE,QAAU,SAASlb,EAAUE,EAAQmc,GACzBv+D,QAATu+D,IACAA,EAAQ,IACZ,IAAIpe,GAAcrkD,KAAKqkD,WACvB,IAAKA,EAAL,CAEAiC,EAASA,GAAUtmD,KAAK42C,YACxBwP,EAAWA,GAAY,CACvB,KAAK,GAAIhU,GAAMgU,EAAgBE,EAANlU,EAAcA,IAGnC,GAFwB,MAApBiS,EAAYjS,KACZiS,EAAYjS,GAAOpyC,KAAK0iE,cAActwB,IAClB,SAApBiS,EAAYjS,GAAhB,CAGA,GAAIvqC,GAAQ7H,KAAK2iE,mBAAmBvwB,EACpC,IAAIvqC,GAASA,EAAMktC,eACZltC,EAAMwqC,IAAID,KAAOkU,GACjBz+C,EAAM8sB,MAAMyd,KAAOgU,EACxB,CACEhU,EAAMvqC,EAAMwqC,IAAID,GAChB,KACI,GAAI6R,GAAOjkD,KAAK0kD,QAAQ,MAAO78C,EAC3Bo8C,KACAA,EAAKwb,iBAAmBgD,GAC9B,MAAM76C,SAIpB5nB,KAAK4iE,aACDC,OAAU,EACVC,UAAa,EACbC,aAAgB,GAEpB/iE,KAAKgjE,WAAa,YAClBhjE,KAAKijE,aAAe,SAASn2D,GACzB,IAAK9M,KAAK4iE,YAAY91D,GAClB,KAAM,IAAI/L,OAAM,uBAAyB+L,EAAQ,IAAMuD,OAAO0mB,KAAK/2B,KAAK4iE,aAAapzD,KAAK,MAAQ,IAEtG,IAAIxP,KAAKgjE,YAAcl2D,EAAvB,CAGA9M,KAAKgjE,WAAal2D,EAEL,UAATA,GACA9M,KAAKwhE,QACT,IAAI9/D,GAAO1B,KAAKkjE,SAChBljE,MAAKmjE,YAAY,MACjBnjE,KAAKmjE,YAAYzhE,KAGrB1B,KAAKmjE,YAAc,SAASC,GACxB,GAAIpjE,KAAKkjE,WAAaE,EAAtB,CAQA,GALApjE,KAAKkjE,UAAYE,EAEjBpjE,KAAKmmC,eAAe,SAAUnmC,KAAKqjE,oBACnCrjE,KAAKuwC,MAAM,qBAEN6yB,GAA+B,UAAnBpjE,KAAKgjE,WAElB,YADAhjE,KAAKqkD,YAAc,KAIvBrkD,MAAKqkD,eACLrkD,KAAK0iE,cAAgBU,EAASV,cAAcvyC,KAAKizC,EAAUpjE,KAAMA,KAAKgjE,YACtEhjE,KAAK2iE,mBAAqBS,EAAST,mBAAmBxyC,KAAKizC,EAAUpjE,KAAMA,KAAKgjE,YAEhFhjE,KAAKqjE,mBAAqBrjE,KAAKsjE,kBAAkBnzC,KAAKnwB,MACtDA,KAAK4N,GAAG,SAAU5N,KAAKqjE,sBAI3BrjE,KAAKukD,uBAAyB,SAAUnS,EAAKmxB,GACzC,GAAIC,GAAKxjE,KAAKqkD,WACd,KAAKmf,GAAOD,GAAiBC,EAAGpxB,GAC5B,QAGJ,KADA,GAAiBoS,GAAblhD,EAAI8uC,EAAM,EACP9uC,GAAK,GAAG,CACX,GAAI7C,GAAI+iE,EAAGlgE,EAIX,IAHS,MAAL7C,IACAA,EAAI+iE,EAAGlgE,GAAKtD,KAAK0iE,cAAcp/D,IAE1B,SAAL7C,EAAc,CACd,GAAIoH,GAAQ7H,KAAK2iE,mBAAmBr/D,EAGpC,IAFKkhD,IACDA,EAAa38C,GACbA,GAASA,EAAMwqC,IAAID,KAAOA,EAC1B,MAER9uC,IAGJ,OACIuE,MAAa,KAANvE,GAAYuE,EACnB28C,WAAYA,IAIpBxkD,KAAKskD,kBAAoB,SAASlS,EAAKxqB,GACnCA,EAAIA,EAAE4oB,QACN,IAAI3vC,IACA4iE,SAAU77C,EAAErc,SACZi1C,IAAK54B,EAAEtc,SAAWsc,EAAE2gB,QACpBm7B,SAAU97C,EAAEzG,QAGZtZ,EAAQ7H,KAAK2jE,kBAAkBvxB,EAAKvxC,EACxC,KAAKgH,EAAO,CACR,GAAI6xB,GAAM9R,EAAEve,QAAUue,EAAElH,UACpBgZ,IAAM,kBAAkBrqB,KAAKqqB,EAAGvwB,aAChCuwB,EAAGvwB,WAAa,kBAI5BnJ,KAAK2jE,kBAAoB,SAASvxB,EAAKvxC,GACnC,GAAKb,KAAK0iE,cAAV,CAEA,GAAI13D,GAAOhL,KAAK0iE,cAActwB,GAC1BxkB,EAAO5tB,KAAKykD,QAAQrS,GAEpBowB,EAAe,QAATx3D,EAAiB,GAAK,EAC5Bi5C,EAAOjkD,KAAKkkD,UAAU9R,EAAa,KAARowB,EAAa,EAAI50C,EAAKxsB,OAAQohE,EAE7D,IAAIve,EAKA,YAJIpjD,EAAQ4iE,UAAY5iE,EAAQ2/C,IAC5BxgD,KAAKmkD,WAAWF,GAEhBjkD,KAAKokD,WAAWH,GAIxB,IAAIp8C,GAAQ7H,KAAK2iE,mBAAmBvwB,GAAK,EACzC,IAAIvqC,IAAUA,EAAMktC,gBAChBkP,EAAOjkD,KAAKkkD,UAAUr8C,EAAM8sB,MAAMyd,IAAKvqC,EAAM8sB,MAAM4d,OAAQ,GACvD0R,GAAQp8C,EAAM2+C,QAAQvC,EAAKp8C,QAE3B,WADA7H,MAAKmkD,WAAWF,EAKxB,IAAIpjD,EAAQ6iE,SAAU,CAClB,GAAIlhE,GAAOxC,KAAKukD,uBAAuBnS,EACvC,IAAI5vC,EAAKqF,MACL,GAAIu+C,GAAW5jD,EAAKqF,MAAM8sB,MAAMyd,IAAM,EAClCkU,EAAS9jD,EAAKqF,MAAMwqC,IAAID,GAEhCpyC,MAAKshE,QAAQlb,EAAUE,EAAQzlD,EAAQ2/C,IAAM,IAAQ,OAC9C3/C,GAAQ4iE,UACfnd,EAASz+C,EAAQA,EAAMwqC,IAAID,IAAMpyC,KAAK42C,YACtC52C,KAAKshE,QAAQlvB,EAAM,EAAGvqC,EAAMwqC,IAAID,IAAKvxC,EAAQ2/C,IAAM,IAAQ,IACpD34C,IACHhH,EAAQ2/C,MACR34C,EAAM43D,iBAAmB,KAC7Bz/D,KAAK0kD,QAAQ,MAAO78C,GAGxB,OAAOA,KAKX7H,KAAK4jE,iBAAmB,SAASC,GAC7B,GAAIzxB,GAAMpyC,KAAKiE,UAAUskD,YAAYnW,GACrCA,GAAMpyC,KAAK6hE,gBAAgBzvB,EAC3B,IAAIvqC,GAAQ7H,KAAK2jE,kBAAkBvxB,KAEnC,KAAIvqC,EAAJ,CAEA,GAAIrF,GAAOxC,KAAKukD,uBAAuBnS,GAAK,EAG5C,IAFAvqC,EAAQrF,EAAKqF,OAASrF,EAAKgiD,WAEhB,CACPpS,EAAMvqC,EAAM8sB,MAAMyd,GAClB,IAAI6R,GAAOjkD,KAAKkkD,UAAU9R,EAAKpyC,KAAKykD,QAAQrS,GAAKhxC,OAAQ,EAErD6iD,GACAjkD,KAAKmkD,WAAWF,GAEhBjkD,KAAK0kD,QAAQ,MAAO78C,MAKhC7H,KAAKsjE,kBAAoB,SAAS17C,GAC9B,GAAI2xC,GAAQ3xC,EAAEplB,KACVqF,EAAQ0xD,EAAM1xD,MACdw/C,EAAWx/C,EAAM8sB,MAAMyd,IACvB9kB,EAAMzlB,EAAMwqC,IAAID,IAAMiV,CAE1B,IAAY,IAAR/5B,EACAttB,KAAKqkD,YAAYgD,GAAY,SAC1B,IAAoB,cAAhBkS,EAAM/yD,QAA0C,eAAhB+yD,EAAM/yD,OAC7CxG,KAAKqkD,YAAYjzC,OAAOi2C,EAAU/5B,EAAM,EAAG,UACxC,CACH,GAAI3d,GAAOkU,MAAMyJ,EAAM,EACvB3d,GAAKgK,QAAQ0tC,EAAU,GACvBrnD,KAAKqkD,YAAYjzC,OAAOvB,MAAM7P,KAAKqkD,YAAa10C,KA7sB5D,GAAIw2C,GAAQ/1B,EAAS,YAAY+1B,MAC7B+W,EAAW9sC,EAAS,eAAe8sC,SACnCoC,EAAOlvC,EAAS,UAAUkvC,KAC1BhL,EAAgBlkC,EAAS,qBAAqBkkC,aAgtBlD10D,GAAQggE,QAAUA,IAIlB1zD,IAAIpM,OAAO,kCAAkC,UAAU,UAAU,SAAS,qBAAqB,aAAc,SAASswB,EAAUxwB,EAASC,GACzI,YAMA,SAASikE,KAEL9jE,KAAKsiE,oBAAsB,SAASlnC,EAAU2oC,GAC1C,GAAuB,GAAnB3oC,EAASmX,OAAa,MAAO,KAEjC,IAAIyxB,GAAmBD,GAAO/jE,KAAKykD,QAAQrpB,EAASgX,KAAK7jC,OAAO6sB,EAASmX,OAAO,EAChF,IAAwB,IAApByxB,EAAwB,MAAO,KAEnC,IAAIz0D,GAAQy0D,EAAiBz0D,MAAM,wBACnC,OAAKA,GAGDA,EAAM,GACCvP,KAAKikE,oBAAoB10D,EAAM,GAAI6rB,GAEnCp7B,KAAKkkE,oBAAoB30D,EAAM,GAAI6rB,GALnC,MAQfp7B,KAAK60C,gBAAkB,SAAShgB,GAC5B,GACmBhtB,GADf+lB,EAAO5tB,KAAKykD,QAAQ5vB,EAAIud,KACxB2kB,GAAS,EAETgN,EAAMn2C,EAAKrf,OAAOsmB,EAAI0d,OAAO,GAC7BhjC,EAAQw0D,GAAOA,EAAIx0D,MAAM,wBAO7B,IANKA,IACDw0D,EAAMn2C,EAAKrf,OAAOsmB,EAAI0d,QACtB1d,GAAOud,IAAKvd,EAAIud,IAAKG,OAAQ1d,EAAI0d,OAAS,GAC1ChjC,EAAQw0D,GAAOA,EAAIx0D,MAAM,yBACzBwnD,GAAS,IAERxnD,EACD,MAAO,KAEX,IAAIA,EAAM,GAAI,CACV,GAAI8yD,GAAariE,KAAKikE,oBAAoB10D,EAAM,GAAIslB,EACpD,KAAKwtC,EACD,MAAO,KACXx6D,GAAQs+C,EAAMoB,WAAW1yB,EAAKwtC,GACzBtL,IACDlvD,EAAMwqC,IAAIE,SACV1qC,EAAM8sB,MAAM4d,UAEhB1qC,EAAMqW,OAASrW,EAAMwqC,QAClB,CACH,GAAIgwB,GAAariE,KAAKkkE,oBAAoB30D,EAAM,GAAIslB,EACpD,KAAKwtC,EACD,MAAO,KACXx6D,GAAQs+C,EAAMoB,WAAW8a,EAAYxtC,GAChCkiC,IACDlvD,EAAM8sB,MAAM4d,SACZ1qC,EAAMwqC,IAAIE,UAEd1qC,EAAMqW,OAASrW,EAAM8sB,MAGzB,MAAO9sB,IAGX7H,KAAKmkE,WACDC,IAAK,IACLC,IAAK,IACL36C,IAAK,IACLD,IAAK,IACLN,IAAK,IACLC,IAAK,KAGTppB,KAAKkkE,oBAAsB,SAASI,EAASlpC,EAAUmpC,GACnD,GAAIC,GAAcxkE,KAAKmkE,UAAUG,GAC7B7B,EAAQ,EAERjL,EAAW,GAAIlD,GAAct0D,KAAMo7B,EAASgX,IAAKhX,EAASmX,QAC1D7lB,EAAQ8qC,EAAStC,iBAGrB,IAFKxoC,IACDA,EAAQ8qC,EAASxC,eAChBtoC,EAAL,CAGM63C,IACFA,EAAS,GAAIt0D,QACT,QACAyc,EAAM1hB,KAAKmZ,QAAQ,IAAK,OAAOA,QAAQ,SAAU,UAC5CA,QAAQ,0BAA2B,IACtC,MAMV,KAHA,GAAIsgD,GAAarpC,EAASmX,OAASilB,EAASpC,wBAA0B,EAClEjwD,EAAQunB,EAAMvnB,QAEL,CAET,KAAOs/D,GAAc,GAAG,CACpB,GAAIV,GAAM5+D,EAAMoJ,OAAOk2D,EACvB,IAAIV,GAAOS,GAEP,GADA/B,GAAS,EACI,GAATA,EACA,OAAQrwB,IAAKolB,EAASrC,qBAClB5iB,OAAQkyB,EAAajN,EAASpC,6BAGjC2O,IAAOO,IACZ7B,GAAS,EAEbgC,IAAc,EAElB,EACI/3C,GAAQ8qC,EAASzC,qBACZroC,IAAU63C,EAAOl1D,KAAKqd,EAAM1hB,MAErC,IAAa,MAAT0hB,EACA,KAEJvnB,GAAQunB,EAAMvnB,MACds/D,EAAat/D,EAAM/D,OAAS,EAGhC,MAAO,QAGXpB,KAAKikE,oBAAsB,SAASK,EAASlpC,EAAUmpC,GACnD,GAAIG,GAAiB1kE,KAAKmkE,UAAUG,GAChC7B,EAAQ,EAERjL,EAAW,GAAIlD,GAAct0D,KAAMo7B,EAASgX,IAAKhX,EAASmX,QAC1D7lB,EAAQ8qC,EAAStC,iBAGrB,IAFKxoC,IACDA,EAAQ8qC,EAASxC,eAChBtoC,EAAL,CAGK63C,IACDA,EAAS,GAAIt0D,QACT,QACAyc,EAAM1hB,KAAKmZ,QAAQ,IAAK,OAAOA,QAAQ,SAAU,UAC5CA,QAAQ,0BAA2B,IACtC,MAKV,KAFA,GAAIsgD,GAAarpC,EAASmX,OAASilB,EAASpC,0BAE/B,CAIT,IAFA,GAAIjwD,GAAQunB,EAAMvnB,MACdw/D,EAAcx/D,EAAM/D,OACJujE,EAAbF,GAA0B,CAC7B,GAAIV,GAAM5+D,EAAMoJ,OAAOk2D,EACvB,IAAIV,GAAOW,GAEP,GADAjC,GAAS,EACI,GAATA,EACA,OAAQrwB,IAAKolB,EAASrC,qBAClB5iB,OAAQkyB,EAAajN,EAASpC,6BAGjC2O,IAAOO,IACZ7B,GAAS,EAEbgC,IAAc,EAElB,EACI/3C,GAAQ8qC,EAASxC,oBACZtoC,IAAU63C,EAAOl1D,KAAKqd,EAAM1hB,MAErC,IAAa,MAAT0hB,EACA,KAEJ+3C,GAAa,EAGjB,MAAO,QA5Kf,GAAInQ,GAAgBlkC,EAAS,qBAAqBkkC,cAC9CnO,EAAQ/1B,EAAS,YAAY+1B,KA8KjCvmD,GAAQkkE,aAAeA,IAIvB53D,IAAIpM,OAAO,oBAAoB,UAAU,UAAU,SAAS,cAAc,eAAe,aAAa,wBAAwB,gBAAgB,gBAAgB,YAAY,eAAe,2BAA2B,uBAAuB,2BAA2B,kCAAmC,SAASswB,EAAUxwB,EAASC,GACrU,YAEA,IAAI28B,GAAMpM,EAAS,aACfib,EAAOjb,EAAS,cAChB1tB,EAAS0tB,EAAS,YAClB+tB,EAAe/tB,EAAS,uBAAuB+tB,aAC/C2J,EAAY13B,EAAS,eAAe03B,UACpC8c,EAAWx0C,EAAS,eAAeolC,KACnCrP,EAAQ/1B,EAAS,WAAW+1B,MAC5BsT,EAAWrpC,EAAS,cAAcqpC,SAClCiC,EAAsBtrC,EAAS,0BAA0BsrC,oBACzDgB,EAAkBtsC,EAAS,sBAAsBssC,gBAEjDmI,EAAc,SAAS1+D,EAAMzE,GAC7B1B,KAAK8kE,gBACL9kE,KAAK+kE,gBACL/kE,KAAKglE,iBACLhlE,KAAKilE,gBACLjlE,KAAKklE,UAAY,EACjBllE,KAAKmlE,aAAc,EAEnBnlE,KAAKggE,aACLhgE,KAAKggE,UAAU1vD,SAAW,WACtB,MAAOtQ,MAAKwP,KAAK,OAErBxP,KAAK4N,GAAG,aAAc5N,KAAKolE,aAAaj1C,KAAKnwB,OAC7CA,KAAKo5D,UAAYp5D,KAAK0K,SAASylB,KAAKnwB,MAEjB,gBAARmG,IAAqBA,EAAKs+C,UACjCt+C,EAAO,GAAIszD,GAAStzD,IAExBnG,KAAKs8D,YAAYn2D,GACjBnG,KAAKiE,UAAY,GAAI6jD,GAAU9nD,MAE/B0C,EAAOy/C,aAAaniD,MACpBA,KAAK2B,QAAQD,GACbgB,EAAOg8C,QAAQ,UAAW1+C,QAI9B,WA8+CI,QAASqlE,GAAY5kE,GACjB,MAAQ,MAAJA,GACO,EACJA,GAAK,MAAe,MAALA,GACfA,GAAK,MAAe,MAALA,GACfA,GAAK,MAAe,MAALA,GACfA,GAAK,MAAe,MAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,GACfA,GAAK,OAAe,OAALA,EA9gD1B+7B,EAAIF,UAAUt8B,KAAMm+C,GACpBn+C,KAAKs8D,YAAc,SAASnjC,GACpBn5B,KAAKm5B,KACLn5B,KAAKm5B,IAAIgN,eAAe,SAAUnmC,KAAKo5D,WAE3Cp5D,KAAKm5B,IAAMA,EACXA,EAAIvrB,GAAG,SAAU5N,KAAKo5D,WAElBp5D,KAAKslE,aACLtlE,KAAKslE,YAAYhJ,YAAYt8D,KAAK+nD,eAEtC/nD,KAAKulE,eAETvlE,KAAK+nD,YAAc,WACf,MAAO/nD,MAAKm5B,KAEhBn5B,KAAKwlE,eAAiB,SAASnF,GAC3B,IAAKA,EAGD,MAFArgE,MAAKylE,qBACLzlE,KAAK0lE,mBAGT,IAAIp0C,GAAItxB,KAAKylE,aAAarkE,OACtBkC,EAAItD,KAAK2lE,kBAAkB3lE,KAAKylE,aAAcpF,GAAU,CACxD/uC,GAAIhuB,IACJtD,KAAKylE,aAAar0D,OAAO9N,EAAGguB,GAC5BtxB,KAAK0lE,gBAAgBt0D,OAAO9N,EAAGguB,KAIvCtxB,KAAK2lE,kBAAoB,SAASC,EAAY91B,GAI1C,IAHA,GAAI+1B,GAAM,EACNC,EAAKF,EAAWxkE,OAAS,EAEf0kE,GAAPD,GAAW,CACd,GAAIE,GAAOF,EAAMC,GAAO,EACpBrlE,EAAImlE,EAAWG,EAEnB,IAAIj2B,EAAMrvC,EACNolE,EAAME,EAAM,MACX,CAAA,KAAUtlE,EAANqvC,GAGL,MAAOi2B,EAFPD,GAAKC,EAAM,GAKnB,MAAOF,GAAK,GAGhB7lE,KAAKulE,YAAc,WACfvlE,KAAKkhE,WAAY,EACjBlhE,KAAKgmE,aACLhmE,KAAKimE,mBACLjmE,KAAKwlE,eAAe,GAChBxlE,KAAKslE,aACLtlE,KAAKslE,YAAY3wC,MAAM,IAG/B30B,KAAKolE,aAAe,SAASx9C,GACzB,GAAIq8B,GAAOr8B,EAAEplB,IACbxC,MAAKwlE,eAAevhB,EAAKtvB,MAAMyd,MAGnCpyC,KAAK0K,SAAW,SAASkd,GACrB,GAAI2xC,GAAQ3xC,EAAEplB,IACdxC,MAAKkhE,WAAY,EAEjBlhE,KAAKwlE,eAAejM,EAAM1xD,MAAM8sB,MAAMyd,IAEtC,IAAI8zB,GAAelmE,KAAKmmE,4BAA4Bv+C,EAC/C5nB,MAAKomE,YAAapmE,KAAKqmE,cAAiB9M,EAAM+M,SAC/CtmE,KAAKumE,WAAWv3D,KAAKuqD,GACjB2M,GAAuC,GAAvBA,EAAa9kE,QAC7BpB,KAAKwmE,YAAYx3D,MACbxI,OAAQ,cACR42D,MAAQ8I,IAIhBlmE,KAAKymE,mBAAmBz7B,YAG5BhrC,KAAKslE,aAAetlE,KAAKslE,YAAY9I,gBAAgBjD,GACrDv5D,KAAK0+C,QAAQ,SAAU92B,IAE3B5nB,KAAKiO,SAAW,SAAS9H,GACrBnG,KAAKm5B,IAAIlrB,SAAS9H,GAClBnG,KAAKiE,UAAUyS,OAAO,EAAG,GAEzB1W,KAAKwlE,eAAe,GACpBxlE,KAAK0mE,WACL1mE,KAAKumE,cACLvmE,KAAKwmE,eACLxmE,KAAK2mE,eAAe3mE,KAAKqmE,cACzBrmE,KAAK4mE,iBAAiBC,SAE1B7mE,KAAK0F,SACL1F,KAAKsQ,SAAW,WACZ,MAAOtQ,MAAKm5B,IAAIzzB,YAEpB1F,KAAK+H,aAAe,WAChB,MAAO/H,MAAKiE,WAEhBjE,KAAKy8D,SAAW,SAASrqB,GACrB,MAAOpyC,MAAKslE,YAAY7I,SAASrqB,IAErCpyC,KAAK40D,UAAY,SAASxiB,GACtB,MAAOpyC,MAAKslE,YAAY1Q,UAAUxiB,IAEtCpyC,KAAK60D,WAAa,SAASziB,EAAKG,GAC5B,GACI7lB,GADAuiC,EAASjvD,KAAKslE,YAAY1Q,UAAUxiB,GAC7B3xC,EAAI,CACf,IAAc,MAAV8xC,EACAjvC,EAAI2rD,EAAO7tD,OAAS,EACpBX,EAAIT,KAAKykD,QAAQrS,GAAKhxC,WAEtB,KAAK,GAAIkC,GAAI,EAAGA,EAAI2rD,EAAO7tD,SACvBX,GAAKwuD,EAAO3rD,GAAG6B,MAAM/D,SACjBX,GAAK8xC,IAFsBjvC,KAOvC,OADAopB,EAAQuiC,EAAO3rD,KAGfopB,EAAMvb,MAAQ7N,EACdopB,EAAMiI,MAAQl0B,EAAIisB,EAAMvnB,MAAM/D,OACvBsrB,GAHI,MAKf1sB,KAAK2mE,eAAiB,SAASG,GAS3B,GARA9mE,KAAKqmE,aAAeS,EACpB9mE,KAAK0mE,WACL1mE,KAAKumE,cACLvmE,KAAKwmE,eAEDxmE,KAAKymE,oBACLzmE,KAAKymE,mBAAmB17B,SAExB+7B,EAAa,CACb,GAAIn6C,GAAO3sB,IAEXA,MAAK+mE,uBAAyB,WAC1Bp6C,EAAK85C,mBAAmB17B,SAEpBpe,EAAK65C,YAAYplE,SACjBurB,EAAK+5C,QAAQ13D,MACTg4D,MAAO,OACP3L,OAAQ1uC,EAAK65C,cAEjB75C,EAAK65C,gBAGL75C,EAAK45C,WAAWnlE,SAChBurB,EAAK+5C,QAAQ13D,MACTg4D,MAAO,MACP3L,OAAQ1uC,EAAK45C,aAEjB55C,EAAK45C,eAGL55C,EAAK+5C,QAAQtlE,OAAS,GACtB0lE,EAAYG,SACRzgE,OAAQ,YACRmJ,MAAOgd,EAAK+5C,QAAS/5C,GACrBijC,MAAOjjC,EAAKu6C,kBAGpBv6C,EAAKu6C,iBAAkB,EACvBv6C,EAAK+5C,YAET1mE,KAAKymE,mBAAqBp7B,EAAKH,YAAYlrC,KAAK+mE,0BAGxD/mE,KAAK4vC,cAAgB,WACb5vC,KAAK+mE,wBACL/mE,KAAK+mE,0BAGb/mE,KAAKmnE,qBACD78D,KAAM,aACNE,KAAM,aACNq8D,MAAO,cAEX7mE,KAAK4mE,eAAiB,WAClB,MAAO5mE,MAAKqmE,cAAgBrmE,KAAKmnE,qBAErCnnE,KAAKonE,aAAe,WAChB,MAAIpnE,MAAKu2D,iBACElrB,EAAK3B,aAAa,IAAK1pC,KAAKgrD,cAE5B,KAGfhrD,KAAKqN,eAAiB,SAASyiC,GAC3B9vC,KAAKuhD,UAAU,cAAezR,IAElC9vC,KAAKu2D,eAAiB,WAClB,MAAOv2D,MAAKqnE,eAAiBrnE,KAAKsnE,MAAMC,iBAE5CvnE,KAAKoN,WAAa,SAAS29C,GACvB/qD,KAAKuhD,UAAU,UAAWwJ,IAE9B/qD,KAAKgrD,WAAa,WACd,MAAOhrD,MAAKwnE,UAEhBxnE,KAAKirD,UAAY,SAAS7vB,GACtB,MAAOp7B,MAAKqnE,cAAiBjsC,EAASmX,OAASvyC,KAAKwnE,WAAa,GAGrExnE,KAAKynE,YAAa,EAClBznE,KAAK0nE,aAAe,SAASC,GACzB3nE,KAAKuhD,UAAU,YAAaomB,IAEhC3nE,KAAK4nE,aAAe,WAChB,MAAO5nE,MAAKynE,YAEhBznE,KAAK6nE,gBAAkB,WACnB7nE,KAAK0nE,cAAc1nE,KAAKynE,aAE5BznE,KAAK8nE,oBAAsB,SAAS11B,EAAKjpC,GAChCnJ,KAAK+kE,aAAa3yB,KACnBpyC,KAAK+kE,aAAa3yB,GAAO,IAC7BpyC,KAAK+kE,aAAa3yB,IAAQ,IAAMjpC,EAChCnJ,KAAK0+C,QAAQ,wBAEjB1+C,KAAK+nE,uBAAyB,SAAS31B,EAAKjpC,GACxCnJ,KAAK+kE,aAAa3yB,IAAQpyC,KAAK+kE,aAAa3yB,IAAQ,IAAIjuB,QAAQ,IAAMhb,EAAW,IACjFnJ,KAAK0+C,QAAQ,wBAEjB1+C,KAAKgoE,eAAiB,WAClB,MAAOhoE,MAAK8kE,cAEhB9kE,KAAKioE,eAAiB,SAAS1b,GAC3BvsD,KAAK8kE;AACL,IAAK,GAAIxhE,GAAE,EAAGA,EAAEipD,EAAKnrD,OAAQkC,IACzBtD,KAAK8kE,aAAavY,EAAKjpD,IAAM,gBAEjCtD,MAAK0+C,QAAQ,wBAEjB1+C,KAAKkoE,iBAAmB,WACpBloE,KAAK8kE,gBACL9kE,KAAK0+C,QAAQ,wBAEjB1+C,KAAKmoE,cAAgB,SAAS/1B,EAAKjpC,GACbjF,SAAdiF,IACAA,EAAY,kBACZA,EACAnJ,KAAK8kE,aAAa1yB,GAAOjpC,QAElBnJ,MAAK8kE,aAAa1yB,GAC7BpyC,KAAK0+C,QAAQ,wBAEjB1+C,KAAKooE,gBAAkB,SAASh2B,SACrBpyC,MAAK8kE,aAAa1yB,GACzBpyC,KAAK0+C,QAAQ,wBAEjB1+C,KAAKi6C,UAAY,SAASpyC,EAAO80D,EAAO3xD,EAAMq9D,GAC1C,GAAIhoE,GAAKL,KAAKklE,YAEVoD,GACAzgE,MAAQA,EACRmD,KAAOA,GAAQ,OACfshC,SAAyB,kBAARthC,GAAqBA,EAAO,KAC7C2xD,MAAQA,EACR0L,UAAWA,EACXhoE,GAAIA,EAWR,OARIgoE,IACAroE,KAAKglE,cAAc3kE,GAAMioE,EACzBtoE,KAAK0+C,QAAQ,uBAEb1+C,KAAKilE,aAAa5kE,GAAMioE,EACxBtoE,KAAK0+C,QAAQ,qBAGVr+C,GAEXL,KAAKuoE,iBAAmB,SAASD,EAAQD,GACrC,GAAKC,EAAOvL,OAAZ,CAEA,GAAI18D,GAAKL,KAAKklE,WAYd,OAXAoD,GAAOjoE,GAAKA,EACZioE,EAAOD,UAAYA,EAEfA,GACAroE,KAAKglE,cAAc3kE,GAAMioE,EACzBtoE,KAAK0+C,QAAQ,uBAEb1+C,KAAKilE,aAAa5kE,GAAMioE,EACxBtoE,KAAK0+C,QAAQ,qBAGV4pB,IAEXtoE,KAAK06C,aAAe,SAAS8tB,GACzB,GAAIF,GAAStoE,KAAKglE,cAAcwD,IAAaxoE,KAAKilE,aAAauD,EAC/D,IAAKF,EAAL,CAGA,GAAIG,GAAUH,EAAOD,QAAUroE,KAAKglE,cAAgBhlE,KAAKilE,YACrDqD,WACQG,GAAQD,GAChBxoE,KAAK0+C,QAAQ4pB,EAAOD,QAAU,oBAAsB,uBAG5DroE,KAAK0oE,WAAa,SAASL,GACvB,MAAOA,GAAUroE,KAAKglE,cAAgBhlE,KAAKilE,cAG/CjlE,KAAK4U,UAAY,SAASZ,GACtB,IAAKhU,KAAK2oE,iBAAkB,CACxB,GAAI/zD,GAAY,GAAI8nD,GAAgB,KAAM,oBAAqB,OAC/D18D,MAAK2oE,iBAAmB3oE,KAAKuoE,iBAAiB3zD,GAElD5U,KAAK2oE,iBAAiB/L,UAAU5oD,IAEpChU,KAAK4oE,eAAiB,SAASxiB,EAAUE,EAAQqW,EAAO0L,GAC/B,gBAAV/hB,KACPqW,EAAQrW,EACRA,EAASF,GAERuW,IACDA,EAAQ,WAEZ,IAAI90D,GAAQ,GAAIs+C,GAAMC,EAAU,EAAGE,EAAQ8P,EAAAA,EAE3C,OADAvuD,GAAMxH,GAAKL,KAAKi6C,UAAUpyC,EAAO80D,EAAO,WAAY0L,GAC7CxgE,GAEX7H,KAAK6oE,eAAiB,SAASC,GAC3B9oE,KAAKy2C,aAAeqyB,EACpB9oE,KAAK0+C,QAAQ,wBAEjB1+C,KAAK+oE,eAAiB,WAClB,MAAO/oE,MAAKy2C,kBAEhBz2C,KAAKgpE,iBAAmB,WACpBhpE,KAAK6oE,oBAET7oE,KAAK+5D,eAAiB,SAAS5zD,GAC3B,GAAIoJ,GAAQpJ,EAAKoJ,MAAM,eACnBA,GACAvP,KAAKg6D,aAAezqD,EAAM,GAE1BvP,KAAKg6D,aAAe,MAG5Bh6D,KAAK80C,aAAe,SAAS1C,EAAKG,GAC9B,GAAI3kB,GAAO5tB,KAAKykD,QAAQrS,GAEpB62B,GAAU,CAOd,IANI12B,EAAS,IACT02B,IAAYr7C,EAAKrf,OAAOgkC,EAAS,GAAGhjC,MAAMvP,KAAK8rD,UAE9Cmd,IACDA,IAAYr7C,EAAKrf,OAAOgkC,GAAQhjC,MAAMvP,KAAK8rD,UAE3Cmd,EACA,GAAIj1D,GAAKhU,KAAK8rD,YACb,IAAI,QAAQz8C,KAAKue,EAAKM,MAAMqkB,EAAO,EAAGA,EAAO,IAC9C,GAAIv+B,GAAK,SAET,IAAIA,GAAKhU,KAAK6rD,UAElB,IAAIl3B,GAAQ4d,CACZ,IAAI5d,EAAQ,EAAG,CACX,EACIA,WAEGA,GAAS,GAAK/G,EAAKrf,OAAOomB,GAAOplB,MAAMyE,GAC9C2gB,KAIJ,IADA,GAAI0d,GAAME,EACHF,EAAMzkB,EAAKxsB,QAAUwsB,EAAKrf,OAAO8jC,GAAK9iC,MAAMyE,IAC/Cq+B,GAGJ,OAAO,IAAI8T,GAAM/T,EAAKzd,EAAOyd,EAAKC,IAEtCryC,KAAKuqD,cAAgB,SAASnY,EAAKG,GAI/B,IAHA,GAAI22B,GAAYlpE,KAAK80C,aAAa1C,EAAKG,GACnC3kB,EAAO5tB,KAAKykD,QAAQykB,EAAU72B,IAAID,KAE/BxkB,EAAKrf,OAAO26D,EAAU72B,IAAIE,QAAQhjC,MAAM,UAC3C25D,EAAU72B,IAAIE,QAAU,CAE5B,OAAO22B,IAEXlpE,KAAKk6D,eAAiB,SAASC,GAC3Bn6D,KAAKm5B,IAAI+gC,eAAeC,IAE5Bn6D,KAAKo6D,eAAiB,WAClB,MAAOp6D,MAAKm5B,IAAIihC,kBAEpBp6D,KAAKmpE,aAAe,SAASC,GAAappE,KAAKuhD,UAAU,YAAa6nB,IACtEppE,KAAKqpE,aAAe,WAAa,MAAOrpE,MAAKspE,YAC7CtpE,KAAKupE,kBAAoB,SAAS3hD,GAC9B,GAAI2kC,GAAO3kC,EAAEplB,IACbxC,MAAKslE,YAAY3wC,MAAM43B,EAAKp5C,OAC5BnT,KAAK0+C,QAAQ,kBAAmB92B,IAGpC5nB,KAAKm4D,UACLn4D,KAAKsnE,MAAQ,KACbtnE,KAAKwpE,QAAU,KACfxpE,KAAK2B,QAAU,SAASD,EAAM8sC,GAC1B,GAAI9sC,GAAwB,gBAATA,GAAmB,CAClC,GAAIA,EAAKg0D,aACL,MAAO11D,MAAKypE,cAAc/nE,EAC9B,IAAIb,GAAUa,EACVgY,EAAO7Y,EAAQ6Y,SAEnBA,GAAOhY,GAAQ,eAKnB,OAHK1B,MAAKm4D,OAAO,mBACbn4D,KAAKm4D,OAAO,iBAAmB,GAAIyM,IAEnC5kE,KAAKm4D,OAAOz+C,KAAU7Y,GACtBb,KAAKypE,cAAczpE,KAAKm4D,OAAOz+C,SAC/B80B,GAAMA,OAGVxuC,KAAKwpE,QAAU9vD,EACfhX,EAAOs+C,YAAY,OAAQtnC,GAAO,SAASlZ,GACvC,MAAIR,MAAKwpE,UAAY9vD,EACV80B,GAAMA,IACbxuC,KAAKm4D,OAAOz+C,KAAU7Y,EACfb,KAAKypE,cAAczpE,KAAKm4D,OAAOz+C,SACtClZ,GAAKA,EAAEg1D,OACPh1D,EAAI,GAAIA,GAAEg1D,KAAK30D,GACVA,IACDb,KAAKm4D,OAAOz+C,GAAQlZ,EACpBA,EAAE04D,IAAMx/C,GAEZ1Z,KAAKypE,cAAcjpE,GACnBguC,GAAMA,OAEZre,KAAKnwB,YACFA,KAAKsnE,OACNtnE,KAAKypE,cAAczpE,KAAKm4D,OAAO,kBAAkB,MAGzDn4D,KAAKypE,cAAgB,SAAS/nE,EAAMgoE,GAGhC,GAFKA,IACD1pE,KAAKwpE,QAAU9nE,EAAKw3D,KACpBl5D,KAAKsnE,QAAU5lE,EAAnB,CAGA1B,KAAKsnE,MAAQ5lE,EAEb1B,KAAK2pE,cAED3pE,KAAKspE,YACLtpE,KAAK4pE,cAET,IAAIjO,GAAYj6D,EAAKg0D,cAErB,IAAkCxxD,SAA/By3D,EAAUzxD,iBAAgC,CACzC,GAAIq/D,GAAoBvpE,KAAKupE,kBAAkBp5C,KAAKnwB,KACpD27D,GAAUzxD,iBAAiB,SAAUq/D,GAGzC,GAAKvpE,KAAKslE,YAONtlE,KAAKslE,YAAYjJ,aAAaV,OAPX,CACnB37D,KAAKslE,YAAc,GAAI5J,GAAoBC,EAC3C,IAAIvwB,GAAQprC,IACZA,MAAKslE,YAAYp7D,iBAAiB,SAAU,SAAS0d,GACjDwjB,EAAMsT,QAAQ,kBAAmB92B,KAMzC5nB,KAAKslE,YAAYhJ,YAAYt8D,KAAK+nD,eAElC/nD,KAAK8rD,QAAUpqD,EAAKoqD,QACpB9rD,KAAK6rD,WAAanqD,EAAKmqD,WAGlB6d,IACGhoE,EAAKmoE,iBACLnoE,EAAKmoE,gBAAgB7pE,MACzBA,KAAK0hD,SAASooB,WAAWjoE,IAAItB,KAAKP,KAAMA,KAAK+pE,aAC7C/pE,KAAKmjE,YAAYzhE,EAAKsoE,cACtBhqE,KAAKslE,YAAY3wC,MAAM,GACvB30B,KAAKuwC,MAAM,iBAInBvwC,KAAK2pE,YAAc,WACX3pE,KAAK87D,UACL97D,KAAK87D,QAAQmO,YACbjqE,KAAK87D,QAAU,OAIvB97D,KAAK4pE,aAAe,WAChB,IACI5pE,KAAK87D,QAAU97D,KAAKsnE,MAAMrP,aAAaj4D,MACzC,MAAO4nB,GACiB,gBAAXhY,WACPA,QAAQzM,IAAI,yBACZyM,QAAQzM,IAAIykB,IAEhB5nB,KAAK87D,QAAU,OAGvB97D,KAAKkqE,QAAU,WACX,MAAOlqE,MAAKsnE,OAGhBtnE,KAAKmqE,WAAa,EAClBnqE,KAAKoqE,aAAe,SAAS/iE,GACrBrH,KAAKmqE,aAAe9iE,GAAa4c,MAAM5c,KAG3CrH,KAAKmqE,WAAa9iE,EAClBrH,KAAK0+C,QAAQ,kBAAmBr3C,KAEpCrH,KAAKqqE,aAAe,WAChB,MAAOrqE,MAAKmqE,YAGhBnqE,KAAKsqE,YAAc,EACnBtqE,KAAKuqE,cAAgB,SAAS15D,GACtB7Q,KAAKsqE,cAAgBz5D,GAAcoT,MAAMpT,KAG7C7Q,KAAKsqE,YAAcz5D,EACnB7Q,KAAK0+C,QAAQ,mBAAoB7tC,KAErC7Q,KAAKwqE,cAAgB,WACjB,MAAOxqE,MAAKsqE,aAEhBtqE,KAAKyqE,eAAiB,WAElB,MADAzqE,MAAK0qE,gBACD1qE,KAAK0sD,YACEnkD,KAAKE,IAAIzI,KAAK2qE,wBAAyB3qE,KAAK4qE,aAChD5qE,KAAK4qE,aAGhB5qE,KAAK2qE,sBAAwB,WACzB,GAA6B,MAAzB3qE,KAAK6qE,iBAA0B,MAAO7qE,MAAK6qE,gBAC/C,IAAI5+D,GAAQ,CAKZ,OAJAjM,MAAK0sD,YAAYvyC,QAAQ,SAAS2wD,GAC1BA,GAAKA,EAAEF,YAAc3+D,IACrBA,EAAQ6+D,EAAEF,eAEX5qE,KAAK+qE,gBAAkB9+D,GAGlCjM,KAAK0qE,cAAgB,SAAS38D,GAC1B,GAAI/N,KAAKkhE,WAAanzD,EAAO,CAGzB,GAFA/N,KAAKkhE,WAAY,EAEblhE,KAAK+gE,aACL,MAAO/gE,MAAK4qE,YAAc5qE,KAAKgrE,UAUnC,KAAK,GARDt8C,GAAQ1uB,KAAKm5B,IAAIygC,cACjBkD,EAAQ98D,KAAKimE,gBACbgF,EAAoB,EACpBC,EAAY,EACZvgB,EAAW3qD,KAAKggE,UAAUkL,GAC1BC,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,EAC5C9oC,EAAMoB,EAAMttB,OAEPkC,EAAI,EAAOgqB,EAAJhqB,EAASA,IAAK,CAC1B,GAAIA,EAAI6nE,EAAW,CAEf,GADA7nE,EAAIqnD,EAAStY,IAAID,IAAM,EACnB9uC,GAAKgqB,EACL,KACJq9B,GAAW3qD,KAAKggE,UAAUkL,KAC1BC,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,EAGhC,MAAZ0G,EAAMx5D,KACNw5D,EAAMx5D,GAAKtD,KAAKorE,sBAAsB18C,EAAMprB,IAAI,IAEhDw5D,EAAMx5D,GAAK2nE,IACXA,EAAoBnO,EAAMx5D,IAElCtD,KAAK4qE,YAAcK,IAG3BjrE,KAAKykD,QAAU,SAASrS,GACpB,MAAOpyC,MAAKm5B,IAAIsrB,QAAQrS,IAE5BpyC,KAAKs6D,SAAW,SAASjT,EAAUC,GAC/B,MAAOtnD,MAAKm5B,IAAImhC,SAASjT,EAAUC,IAEvCtnD,KAAK42C,UAAY,WACb,MAAO52C,MAAKm5B,IAAIyd,aAEpB52C,KAAKi8C,aAAe,SAASp0C,GACzB,MAAO7H,MAAKm5B,IAAI8iB,aAAap0C,GAAS7H,KAAKiE,UAAU+rC,aAEzDhwC,KAAKg1B,OAAS,SAASoG,EAAUj1B,GAC7B,MAAOnG,MAAKm5B,IAAInE,OAAOoG,EAAUj1B,IAErCnG,KAAKi1B,OAAS,SAASptB,GACnB,MAAO7H,MAAKm5B,IAAIlE,OAAOptB,IAE3B7H,KAAKqrE,YAAc,SAAShQ,EAAQiQ,GAChC,GAAKjQ,EAAOj6D,OAAZ,CAGApB,KAAKomE,WAAY,CAEjB,KAAK,GADDmF,GAAgB,KACXjoE,EAAI+3D,EAAOj6D,OAAS,EAAQ,IAALkC,EAASA,IAAK,CAC1C,GAAIi2D,GAAQ8B,EAAO/3D,EACA,QAAfi2D,EAAMyN,OACNhnE,KAAKm5B,IAAImiC,aAAa/B,EAAM8B,QAC5BkQ,EACIvrE,KAAKwrE,kBAAkBjS,EAAM8B,QAAQ,EAAMkQ,IAE/ChS,EAAM8B,OAAOlhD,QAAQ,SAASsxD,GAC1BzrE,KAAKmhE,SAASsK,EAAUrO,QACzBp9D,MAQX,MALAA,MAAKomE,WAAY,EACjBmF,GACIvrE,KAAKmlE,cACJmG,GACDtrE,KAAKiE,UAAU8nC,kBAAkBw/B,GAC9BA,IAEXvrE,KAAK0rE,YAAc,SAASrQ,EAAQiQ,GAChC,GAAKjQ,EAAOj6D,OAAZ,CAGApB,KAAKomE,WAAY,CAEjB,KAAK,GADDmF,GAAgB,KACXjoE,EAAI,EAAGA,EAAI+3D,EAAOj6D,OAAQkC,IAAK,CACpC,GAAIi2D,GAAQ8B,EAAO/3D,EACA,QAAfi2D,EAAMyN,QACNhnE,KAAKm5B,IAAIiiC,YAAY7B,EAAM8B,QAC3BkQ,EACIvrE,KAAKwrE,kBAAkBjS,EAAM8B,QAAQ,EAAOkQ,IAQxD,MALAvrE,MAAKomE,WAAY,EACjBmF,GACIvrE,KAAKmlE,cACJmG,GACDtrE,KAAKiE,UAAU8nC,kBAAkBw/B,GAC9BA,IAEXvrE,KAAK2rE,cAAgB,SAASC,GAC1B5rE,KAAKmlE,YAAcyG,GAGvB5rE,KAAKwrE,kBAAoB,SAASnQ,EAAQwQ,EAAQN,GAC9C,QAASO,GAASvS,GACd,GAAIvkC,GACiB,eAAjBukC,EAAM/yD,QAA4C,gBAAjB+yD,EAAM/yD,MAC3C,OAAOqlE,IAAU72C,EAASA,EAG9B,GACIntB,GAAOq3D,EADP3F,EAAQ8B,EAAO,GAEf0Q,GAAoB,CACpBD,GAASvS,IACT1xD,EAAQs+C,EAAMoB,WAAWgS,EAAM1xD,MAAM8sB,MAAO4kC,EAAM1xD,MAAMwqC,KACxD05B,GAAoB,IAEpBlkE,EAAQs+C,EAAMoB,WAAWgS,EAAM1xD,MAAM8sB,MAAO4kC,EAAM1xD,MAAM8sB,OACxDo3C,GAAoB,EAGxB,KAAK,GAAIzoE,GAAI,EAAGA,EAAI+3D,EAAOj6D,OAAQkC,IAC/Bi2D,EAAQ8B,EAAO/3D,GACXwoE,EAASvS,IACT2F,EAAQ3F,EAAM1xD,MAAM8sB,MAC0B,IAA1C9sB,EAAM4+C,QAAQyY,EAAM9sB,IAAK8sB,EAAM3sB,SAC/B1qC,EAAMgL,SAAS0mD,EAAM1xD,MAAM8sB,OAE/BuqC,EAAQ3F,EAAM1xD,MAAMwqC,IAC0B,GAA1CxqC,EAAM4+C,QAAQyY,EAAM9sB,IAAK8sB,EAAM3sB,SAC/B1qC,EAAMkL,OAAOwmD,EAAM1xD,MAAMwqC,KAE7B05B,GAAoB,IAEpB7M,EAAQ3F,EAAM1xD,MAAM8sB,MAC0B,IAA1C9sB,EAAM4+C,QAAQyY,EAAM9sB,IAAK8sB,EAAM3sB,UAC/B1qC,EACIs+C,EAAMoB,WAAWgS,EAAM1xD,MAAM8sB,MAAO4kC,EAAM1xD,MAAM8sB,QAExDo3C,GAAoB,EAG5B,IAAqB,MAAjBR,EAAuB,CACuC,IAA1DplB,EAAMH,cAAculB,EAAc52C,MAAO9sB,EAAM8sB,SAC/C42C,EAAc52C,MAAM4d,QAAU1qC,EAAMwqC,IAAIE,OAAS1qC,EAAM8sB,MAAM4d,OAC7Dg5B,EAAcl5B,IAAIE,QAAU1qC,EAAMwqC,IAAIE,OAAS1qC,EAAM8sB,MAAM4d,OAG/D,IAAID,GAAMi5B,EAAc7kB,aAAa7+C,EAC1B,IAAPyqC,EACAzqC,EAAMgL,SAAS04D,EAAc52C,OACf,IAAP2d,GACPzqC,EAAMkL,OAAOw4D,EAAcl5B,KAInC,MAAOxqC,IAEX7H,KAAKmkB,QAAU,SAAStc,EAAO1B,GAC3B,MAAOnG,MAAKm5B,IAAIhV,QAAQtc,EAAO1B,IAEnCnG,KAAKw8C,SAAW,SAASwvB,EAAWC,EAAYniC,GAC5C,GAAI3jC,GAAOnG,KAAKi8C,aAAa+vB,GACzB5O,EAAQp9D,KAAK8/D,gBAAgBkM,GAE7BE,EAAU/lB,EAAMoB,WAAW0kB,EAAYA,EAC3C,KAAKniC,EAAM,CACP9pC,KAAKi1B,OAAO+2C,EACZ,IAAIG,GAAUH,EAAUr3C,MAAMyd,IAAM45B,EAAU35B,IAAID,IAC9Cg6B,EAAWD,GAAWH,EAAU35B,IAAIE,OAASy5B,EAAUr3C,MAAM4d,OAASy5B,EAAU35B,IAAIE,MACpF65B,KACIF,EAAQv3C,MAAMyd,KAAO45B,EAAU35B,IAAID,KAAO85B,EAAQv3C,MAAM4d,OAASy5B,EAAU35B,IAAIE,SAC/E25B,EAAQv3C,MAAM4d,QAAU65B,GACxBF,EAAQ75B,IAAID,KAAO45B,EAAU35B,IAAID,KAAO85B,EAAQ75B,IAAIE,OAASy5B,EAAU35B,IAAIE,SAC3E25B,EAAQ75B,IAAIE,QAAU65B,IAE1BD,GAAWD,EAAQv3C,MAAMyd,KAAO45B,EAAU35B,IAAID,MAC9C85B,EAAQv3C,MAAMyd,KAAO+5B,EACrBD,EAAQ75B,IAAID,KAAO+5B,GAK3B,GADAD,EAAQ75B,IAAMryC,KAAKg1B,OAAOk3C,EAAQv3C,MAAOxuB,GACrCi3D,EAAMh8D,OAAQ,CACd,GAAIirE,GAAWL,EAAUr3C,MACrB23C,EAAWJ,EAAQv3C,MACnBw3C,EAAUG,EAASl6B,IAAMi6B,EAASj6B,IAClCg6B,EAAWE,EAAS/5B,OAAS85B,EAAS95B,MAC1CvyC,MAAKmhE,SAAS/D,EAAMznC,IAAI,SAAShD,GAQ7B,MAPAA,GAAIA,EAAEvc,QACFuc,EAAEgC,MAAMyd,KAAOi6B,EAASj6B,MACxBzf,EAAEgC,MAAM4d,QAAU65B,GAClBz5C,EAAE0f,IAAID,KAAOi6B,EAASj6B,MACtBzf,EAAE0f,IAAIE,QAAU65B,GACpBz5C,EAAEgC,MAAMyd,KAAO+5B,EACfx5C,EAAE0f,IAAID,KAAO+5B,EACNx5C,KAIf,MAAOu5C,IAEXlsE,KAAKusE,WAAa,SAASnmB,EAAUE,EAAQkmB,GACzCA,EAAeA,EAAaroD,QAAQ,MAAOnkB,KAAKonE,eAChD,KAAK,GAAIh1B,GAAIgU,EAAeE,GAALlU,EAAaA,IAChCpyC,KAAKg1B,QAAQod,IAAKA,EAAKG,OAAO,GAAIi6B,IAE1CxsE,KAAKysE,YAAc,SAAU5kE,GAKzB,IAAK,GAJD6kE,GAAW7kE,EAAM2/C,eACjBmlB,EAAc,GAAIxmB,GAAM,EAAG,EAAG,EAAG,GACjCymB,EAAO5sE,KAAKgrD,aAEP1nD,EAAIopE,EAAS/3C,MAAMyd,IAAK9uC,GAAKopE,EAASr6B,IAAID,MAAO9uC,EAAG,CACzD,GAAIsqB,GAAO5tB,KAAKykD,QAAQnhD,EAExBqpE,GAAYh4C,MAAMyd,IAAM9uC,EACxBqpE,EAAYt6B,IAAID,IAAM9uC,CACtB,KAAK,GAAIuO,GAAI,EAAO+6D,EAAJ/6D,GACU,KAAlB+b,EAAKrf,OAAOsD,KADQA,GAGpB+6D,EAAJ/6D,GAA8B,KAAlB+b,EAAKrf,OAAOsD,IACxB86D,EAAYh4C,MAAM4d,OAAS1gC,EAC3B86D,EAAYt6B,IAAIE,OAAS1gC,EAAI,IAE7B86D,EAAYh4C,MAAM4d,OAAS,EAC3Bo6B,EAAYt6B,IAAIE,OAAS1gC,GAE7B7R,KAAKi1B,OAAO03C,KAIpB3sE,KAAK6sE,WAAa,SAASxlB,EAAUC,EAASkb,GAG1C,GAFAnb,EAAWrnD,KAAK6hE,gBAAgBxa,GAChCC,EAAUtnD,KAAK4hE,cAActa,GACnB,EAANkb,EAAS,CACT,GAAIpwB,GAAMpyC,KAAK6hE,gBAAgBxa,EAAWmb,EAC1C,IAAU,EAANpwB,EAAS,MAAO,EACpB,IAAIzpC,GAAOypC,EAAIiV,MACZ,IAAImb,EAAM,EAAG,CAChB,GAAIpwB,GAAMpyC,KAAK4hE,cAActa,EAAUkb,EACvC,IAAIpwB,EAAMpyC,KAAKm5B,IAAIyd,YAAY,EAAG,MAAO,EACzC,IAAIjuC,GAAOypC,EAAIkV,MACZ,CACHD,EAAWrnD,KAAK8sE,mBAAmBzlB,GACnCC,EAAUtnD,KAAK8sE,mBAAmBxlB,EAClC,IAAI3+C,GAAO2+C,EAAUD,EAAW,EAGpC,GAAIx/C,GAAQ,GAAIs+C,GAAMkB,EAAU,EAAGC,EAASl7C,OAAO2gE,WAC/C3P,EAAQp9D,KAAK8/D,gBAAgBj4D,GAAO8tB,IAAI,SAAShD,GAIjD,MAHAA,GAAIA,EAAEvc,QACNuc,EAAEgC,MAAMyd,KAAOzpC,EACfgqB,EAAE0f,IAAID,KAAOzpC,EACNgqB,IAGPjE,EAAe,GAAP8zC,EACNxiE,KAAKm5B,IAAImhC,SAASjT,EAAUC,GAC5BtnD,KAAKm5B,IAAI8hC,YAAY5T,EAAUC,EAGrC,OAFAtnD,MAAKm5B,IAAIwhC,YAAYtT,EAAS1+C,EAAM+lB,GACpC0uC,EAAMh8D,QAAUpB,KAAKmhE,SAAS/D,GACvBz0D,GAEX3I,KAAKgtE,YAAc,SAAS3lB,EAAUC,GAClC,MAAOtnD,MAAK6sE,WAAWxlB,EAAUC,EAAS,KAE9CtnD,KAAKitE,cAAgB,SAAS5lB,EAAUC,GACpC,MAAOtnD,MAAK6sE,WAAWxlB,EAAUC,EAAS,IAE9CtnD,KAAKktE,eAAiB,SAAS7lB,EAAUC,GACrC,MAAOtnD,MAAK6sE,WAAWxlB,EAAUC,EAAS,IAI9CtnD,KAAK8sE,mBAAqB,SAAS16B,GAC/B,MAAO7pC,MAAKE,IAAI,EAAGF,KAAKC,IAAI4pC,EAAKpyC,KAAKm5B,IAAIyd,YAAY,KAG1D52C,KAAKmtE,iBAAmB,SAAS/6B,EAAKG,GAClC,MAAa,GAATA,EACO,EACJhqC,KAAKC,IAAIxI,KAAKm5B,IAAIsrB,QAAQrS,GAAKhxC,OAAQmxC,IAIlDvyC,KAAKq5D,wBAA0B,SAASjnB,EAAKG,GAGzC,GAFAA,EAAShqC,KAAKE,IAAI,EAAG8pC,GAEX,EAANH,EACAA,EAAM,EACNG,EAAS,MACN,CACH,GAAIjlB,GAAMttB,KAAKm5B,IAAIyd,WACfxE,IAAO9kB,GACP8kB,EAAM9kB,EAAM,EACZilB,EAASvyC,KAAKm5B,IAAIsrB,QAAQn3B,EAAI,GAAGlsB,QAEjCmxC,EAAShqC,KAAKC,IAAIxI,KAAKm5B,IAAIsrB,QAAQrS,GAAKhxC,OAAQmxC,GAIxD,OACIH,IAAKA,EACLG,OAAQA,IAIhBvyC,KAAK2gE,qBAAuB,SAAS94D,GAC7BA,EAAM8sB,MAAMyd,IAAM,GAClBvqC,EAAM8sB,MAAMyd,IAAM,EAClBvqC,EAAM8sB,MAAM4d,OAAS,GAErB1qC,EAAM8sB,MAAM4d,OAASvyC,KAAKmtE,iBACtBtlE,EAAM8sB,MAAMyd,IACZvqC,EAAM8sB,MAAM4d,OAIpB,IAAIjlB,GAAMttB,KAAKm5B,IAAIyd,YAAc,CAUjC,OATI/uC,GAAMwqC,IAAID,IAAM9kB,GAChBzlB,EAAMwqC,IAAID,IAAM9kB,EAChBzlB,EAAMwqC,IAAIE,OAASvyC,KAAKm5B,IAAIsrB,QAAQn3B,GAAKlsB,QAEzCyG,EAAMwqC,IAAIE,OAASvyC,KAAKmtE,iBACpBtlE,EAAMwqC,IAAID,IACVvqC,EAAMwqC,IAAIE,QAGX1qC,GAEX7H,KAAKgrE,WAAa,GAClBhrE,KAAK+gE,cAAe,EACpB/gE,KAAKotE,iBACD5kE,IAAM,KACNC,IAAM,MAEVzI,KAAKsN,eAAiB,SAAS+/D,GAC3B,GAAIA,GAAertE,KAAK+gE,aAAc,CAIlC,GAHA/gE,KAAK+gE,aAAesM,EACpBrtE,KAAKkhE,WAAY,EACjBlhE,KAAKwlE,eAAe,GAChB6H,EAAa,CACb,GAAI//C,GAAMttB,KAAK42C,WACf52C,MAAKgmE,UAAYniD,MAAMyJ,GACvBttB,KAAKghE,gBAAgB,EAAG1zC,EAAM,GAGlCttB,KAAK0+C,QAAQ,oBAGrB1+C,KAAKstE,eAAiB,WAClB,MAAOttE,MAAK+gE,cAEhB/gE,KAAKutE,kBAAoB,SAAS/kE,EAAKC,IAC/BzI,KAAKotE,gBAAgB5kE,MAAQA,GAAOxI,KAAKotE,gBAAgB3kE,MAAQA,KACjEzI,KAAKotE,iBACD5kE,IAAKA,EACLC,IAAKA,GAETzI,KAAKkhE,WAAY,EACjBlhE,KAAK0+C,QAAQ,oBAGrB1+C,KAAKwtE,gBAAkB,SAASC,EAAcC,GAC1C,GAAIC,GAAS3tE,KAAKotE,eACdO,GAAOllE,IAAM,IACbklE,GAAUnlE,IAAKklE,EAAcjlE,IAAKilE,GACtC,IAAIE,GAAY5tE,KAAK6tE,oBAAoBJ,EAAcE,EAAOnlE,IAAKmlE,EAAOllE,IAC1E,OAAImlE,IAAa5tE,KAAKgrE,YAAc4C,EAAY,GAC5C5tE,KAAKgrE,WAAa4C,EAClB5tE,KAAKkhE,WAAY,EACblhE,KAAK+gE,eACL/gE,KAAKghE,gBAAgB,EAAGhhE,KAAK42C,YAAc,GAC3C52C,KAAKwlE,eAAe,GACpBxlE,KAAK0+C,QAAQ,qBAEV,IAEJ,GAGX1+C,KAAK6tE,oBAAsB,SAASD,EAAWplE,EAAKC,GAOhD,MANID,KACAolE,EAAYrlE,KAAKE,IAAID,EAAKolE,IAE1BnlE,IACAmlE,EAAYrlE,KAAKC,IAAIC,EAAKmlE,IAEvBA,GAEX5tE,KAAK8tE,aAAe,WAChB,MAAO9tE,MAAKgrE,YAEhBhrE,KAAK+tE,aAAe,SAAUC,GAC1BhuE,KAAKutE,kBAAkBS,EAAOA,IAElChuE,KAAKiuE,kBAAoB,WACrB,OACIzlE,IAAMxI,KAAKotE,gBAAgB5kE,IAC3BC,IAAMzI,KAAKotE,gBAAgB3kE,MAInCzI,KAAKmmE,4BAA8B,SAASv+C,GACxC,GACI0F,GADA+/C,EAAcrtE,KAAK+gE,aAEnBv6D,EAASohB,EAAEplB,KAAKgE,OAChB6gD,EAAWz/B,EAAEplB,KAAKqF,MAAM8sB,MAAMyd,IAC9BkV,EAAU1/B,EAAEplB,KAAKqF,MAAMwqC,IAAID,IAC3Bzd,EAAQ/M,EAAEplB,KAAKqF,MAAM8sB,MACrB0d,EAAMzqB,EAAEplB,KAAKqF,MAAMwqC,IACnB6zB,EAAe,IAcnB,IAZ+B,IAA3B1/D,EAAO8I,QAAQ,UAEXg4C,EADU,eAAV9gD,EACU6gD,EAAYz/B,EAAEplB,KAAKksB,MAAY,OAE/B24B,EAEd/5B,EAAM1F,EAAEplB,KAAKksB,MAAQ9G,EAAEplB,KAAKksB,MAAMttB,OAASkmD,EAAUD,GAErD/5B,EAAMg6B,EAAUD,EAGpBrnD,KAAKohE,WAAY,EACN,GAAP9zC,EACA,GAAgC,IAA5B9mB,EAAO8I,QAAQ,UAAiB,CAChCtP,KAAKqtE,EAAc,YAAc,mBAAmBj8D,OAAOi2C,EAAU/5B,EAErE,IAAIyyC,GAAY//D,KAAKggE,SACrBkG,GAAelmE,KAAK8/D,gBAAgBl4C,EAAEplB,KAAKqF,OAC3C7H,KAAK8gE,YAAYoF,EAEjB,IAAIvb,GAAW3qD,KAAK4qD,YAAYvY,EAAID,KAChCgsB,EAAM,CACV,IAAIzT,EAAU,CACVA,EAASoT,eAAe1rB,EAAID,IAAKC,EAAIE,OAAQ5d,EAAM4d,OAASF,EAAIE,QAChEoY,EAAS2S,UAAUhwC,EAEnB,IAAI4gD,GAAiBluE,KAAK4qD,YAAYvD,EAClC6mB,IAAkBA,IAAmBvjB,IACrCujB,EAAete,MAAMjF,GACrBA,EAAWujB,GAEf9P,EAAM2B,EAAUzwD,QAAQq7C,GAAY,EAGxC,IAAKyT,EAAKA,EAAM2B,EAAU3+D,OAAQg9D,IAAO,CACrC,GAAIzT,GAAWoV,EAAU3B,EACrBzT,GAASh2B,MAAMyd,KAAOC,EAAID,KAC1BuY,EAAS2S,UAAUhwC,GAI3Bg6B,EAAUD,MACP,CACH,GAAI13C,GAAOkU,MAAMyJ,EACjB3d,GAAKgK,QAAQ0tC,EAAU,EACvB,IAAIntC,GAAMmzD,EAAcrtE,KAAKgmE,UAAYhmE,KAAKimE,eAC9C/rD,GAAI9I,OAAOvB,MAAMqK,EAAKvK,EACtB,IAAIowD,GAAY//D,KAAKggE,UACjBrV,EAAW3qD,KAAK4qD,YAAYvD,GAC5B+W,EAAM,CACV,IAAIzT,EAAU,CACV,GAAIrY,GAAMqY,EAAS9iD,MAAMs/C,cAAcxyB,EAAMyd,IAAKzd,EAAM4d,OAC7C,IAAPD,GACAqY,EAAWA,EAAS15C,MAAM0jB,EAAMyd,IAAKzd,EAAM4d,QACvCoY,IACAA,EAAS2S,SAAShwC,GAClBq9B,EAASoT,eAAezW,EAAS,EAAGjV,EAAIE,OAAS5d,EAAM4d,UAGpD,IAAPD,IACAqY,EAASoT,eAAe1W,EAAU,EAAGhV,EAAIE,OAAS5d,EAAM4d,QACxDoY,EAAS2S,SAAShwC,IAEtB8wC,EAAM2B,EAAUzwD,QAAQq7C,GAAY,EAGxC,IAAKyT,EAAKA,EAAM2B,EAAU3+D,OAAQg9D,IAAO,CACrC,GAAIzT,GAAWoV,EAAU3B,EACrBzT,GAASh2B,MAAMyd,KAAOiV,GACtBsD,EAAS2S,SAAShwC,QAI3B,CACHA,EAAM/kB,KAAKK,IAAIgf,EAAEplB,KAAKqF,MAAM8sB,MAAM4d,OAAS3qB,EAAEplB,KAAKqF,MAAMwqC,IAAIE,QAC5B,IAA5B/rC,EAAO8I,QAAQ,YACf42D,EAAelmE,KAAK8/D,gBAAgBl4C,EAAEplB,KAAKqF,OAC3C7H,KAAK8gE,YAAYoF,GAEjB54C,GAAOA,EAEX,IAAIq9B,GAAW3qD,KAAK4qD,YAAYvD,EAC5BsD,IACAA,EAASoT,eAAe1W,EAAU1yB,EAAM4d,OAAQjlB,GAcxD,MAVI+/C,IAAertE,KAAKgmE,UAAU5kE,QAAUpB,KAAKm5B,IAAIyd,aACjDhnC,QAAQxM,MAAM,6DAElBpD,KAAKohE,WAAY,EAEbiM,EACArtE,KAAKghE,gBAAgB3Z,EAAUC,GAE/BtnD,KAAKihE,sBAAsB5Z,EAAUC,GAElC4e,GAGXlmE,KAAKihE,sBAAwB,SAAS5Z,EAAUC,EAAS53C,GACrD1P,KAAKimE,gBAAgB5e,GAAY,KACjCrnD,KAAKimE,gBAAgB3e,GAAW,MAGpCtnD,KAAKghE,gBAAkB,SAAS3Z,EAAUC,GACtC,GAII2H,GACAtE,EALAj8B,EAAQ1uB,KAAKm5B,IAAIygC,cACjB7O,EAAU/qD,KAAKgrD,aACfmjB,EAAWnuE,KAAKgmE,UAChB4H,EAAY5tE,KAAKgrE,WAIjB54B,EAAMiV,CAEV,KADAC,EAAU/+C,KAAKC,IAAI8+C,EAAS54B,EAAMttB,OAAS,GAC7BkmD,GAAPlV,GACHuY,EAAW3qD,KAAK4qD,YAAYxY,EAAKuY,GAC5BA,GAKDsE,KACAtE,EAAS8S,KAAK,SAASG,EAAaxrB,EAAKG,EAAQyvB,GACzC,GAAIoM,EACJ,IAAmB,MAAfxQ,EAAqB,CACrBwQ,EAAapuE,KAAKquE,kBACFzQ,EAAa3O,EAAO7tD,QACpCgtE,EAAW,GAAKE,CAChB,KAAK,GAAIhrE,GAAI,EAAGA,EAAI8qE,EAAWhtE,OAAQkC,IACnC8qE,EAAW9qE,GAAKirE,MAGpBH,GAAapuE,KAAKquE,kBACd3/C,EAAM0jB,GAAKhuB,UAAU49C,EAAYzvB,GACjC0c,EAAO7tD,OAEf6tD,GAASA,EAAOtzC,OAAOyyD,IACzBj+C,KAAKnwB,MACP2qD,EAAStY,IAAID,IACb1jB,EAAMi8B,EAAStY,IAAID,KAAKhxC,OAAS,GAGrC+sE,EAASxjB,EAASh2B,MAAMyd,KAAOpyC,KAAKwuE,mBAAmBvf,EAAQ2e,EAAW7iB,GAC1E3Y,EAAMuY,EAAStY,IAAID,IAAM,IA1BzB6c,EAASjvD,KAAKquE,kBAAkB3/C,EAAM0jB,IACtC+7B,EAAS/7B,GAAOpyC,KAAKwuE,mBAAmBvf,EAAQ2e,EAAW7iB,GAC3D3Y,KA4BZ,IAAIq8B,GAAO,EACPC,EAAW,EACXJ,EAAoB,EACpBC,EAAoB,EACpBI,EAAc,EACdC,EAAQ,GACRC,EAAM,GACNC,EAAY,EAGhB9uE,MAAKwuE,mBAAqB,SAASvf,EAAQ2e,GAWvC,QAASmB,GAASviB,GACd,GAAIwiB,GAAY/f,EAAO/gC,MAAM+gD,EAAWziB,GACpCl/B,EAAM0hD,EAAU5tE,MACpB4tE,GAAUx/D,KAAK,IACX2U,QAAQ,MAAO,WACXmJ,GAAO,IAEXnJ,QAAQ,KAAM,WACVmJ,GAAO,IAGf4hD,GAAgB5hD,EAChB6hD,EAAOngE,KAAKkgE,GACZD,EAAYziB,EAvBhB,GAAqB,GAAjByC,EAAO7tD,OACP,QAyBJ,KAtBA,GAAI+tE,MACAC,EAAgBngB,EAAO7tD,OACvB6tE,EAAY,EAAGC,EAAe,EAE9BG,EAASrvE,KAAKsvE,YAkBXF,EAAgBH,EAAYrB,GAAW,CAC1C,GAAI38D,GAAQg+D,EAAYrB,CACxB,IAAI3e,EAAOh+C,EAAQ,IAAM29D,GAAS3f,EAAOh+C,IAAU29D,EAC/CG,EAAS99D,OAGb,IAAIg+C,EAAOh+C,IAAUq9D,GAAqBrf,EAAOh+C,IAAUs9D,EAA3D,CAuBA,IADA,GAAIgB,GAAWhnE,KAAKE,IAAIwI,GAASo+D,EAAS,GAAKzB,GAAWA,GAAW,IAAKqB,EAAY,GAC/Eh+D,EAAQs+D,GAAYtgB,EAAOh+C,GAASq9D,GACvCr9D,GAEJ,IAAIo+D,EAAQ,CACR,KAAOp+D,EAAQs+D,GAAYtgB,EAAOh+C,GAASq9D,GACvCr9D,GAEJ,MAAOA,EAAQs+D,GAAYtgB,EAAOh+C,IAAU09D,GACxC19D,QAGJ,MAAOA,EAAQs+D,GAAYtgB,EAAOh+C,GAAS29D,GACvC39D,GAGJA,GAAQs+D,EACRR,IAAW99D,IAGfA,EAAQg+D,EAAYrB,EAChB3e,EAAOh+C,IAAUy9D,GACjBz9D,IACJ89D,EAAS99D,QA7CT,CACI,IAAKA,EAAOA,GAASg+D,EAAY,GACzBhgB,EAAOh+C,IAAUq9D,EADWr9D,KAKpC,GAAIA,EAAQg+D,EAAW,CACnBF,EAAS99D,EACT,UAGJ,IADAA,EAAQg+D,EAAYrB,EACR38D,EAAQg+C,EAAO7tD,QACnB6tD,EAAOh+C,IAAUs9D,EADUt9D,KAKnC,GAAIA,GAASg+C,EAAO7tD,OAChB,KAEJ2tE,GAAS99D,IA4BjB,MAAOk+D,IAEXnvE,KAAKquE,kBAAoB,SAASzxD,EAAK+tB,GACnC,GACIogB,GADA7wC,IAEJywB,GAASA,GAAU,CAEnB,KAAK,GAAIrnC,GAAI,EAAGA,EAAIsZ,EAAIxb,OAAQkC,IAAK,CACjC,GAAI7C,GAAImc,EAAIsxB,WAAW5qC,EACvB,IAAS,GAAL7C,EAAQ,CACRsqD,EAAU/qD,KAAKwvE,iBAAiBt1D,EAAI9Y,OAASupC,GAC7CzwB,EAAIlL,KAAK6/D,EACT,KAAK,GAAIhvD,GAAI,EAAOkrC,EAAJlrC,EAAaA,IACzB3F,EAAIlL,KAAK8/D,OAGH,KAALruE,EACLyZ,EAAIlL,KAAK4/D,GACFnuE,EAAI,IAAU,GAAJA,GAAYA,EAAI,IAAU,GAAJA,EACvCyZ,EAAIlL,KAAK2/D,GAEJluE,GAAK,MAAU4kE,EAAY5kE,GAChCyZ,EAAIlL,KAAKy/D,EAAMC,GAEfx0D,EAAIlL,KAAKy/D,GAGjB,MAAOv0D,IAEXla,KAAKorE,sBAAwB,SAASxuD,EAAK6yD,EAAiBC,GACxD,GAAuB,GAAnBD,EACA,OAAQ,EAAG,EACQ,OAAnBA,IACAA,EAAkBrZ,EAAAA,GACtBsZ,EAAeA,GAAgB,CAE/B,IAAIjvE,GAAG8xC,CACP,KAAKA,EAAS,EAAGA,EAAS31B,EAAIxb,SAC1BX,EAAImc,EAAIsxB,WAAWqE,GAEfm9B,GADK,GAALjvE,EACgBT,KAAKwvE,iBAAiBE,GAEjCjvE,GAAK,MAAU4kE,EAAY5kE,GAChB,EAEA,IAEhBivE,EAAeD,IAVel9B,KAetC,OAAQm9B,EAAcn9B,IAG1BvyC,KAAK0sD,YAAc,KACnB1sD,KAAK2vE,aAAe,SAASv9B,GACzB,GAAIpyC,KAAK0sD,YACL,GAAIpH,GAAItlD,KAAK0sD,YAAYta,IAAQpyC,KAAK0sD,YAAYta,GAAK6iB,UAAY,MAEnE3P,GAAI,CACR,OAAKtlD,MAAK+gE,cAAiB/gE,KAAKgmE,UAAU5zB,GAG/BpyC,KAAKgmE,UAAU5zB,GAAKhxC,OAAS,EAAIkkD,EAFjC,EAAIA,GAKnBtlD,KAAK4vE,gBAAkB,SAASx9B,GAC5B,MAAKpyC,MAAK+gE,cAAiB/gE,KAAKgmE,UAAU5zB,GAG/BpyC,KAAKgmE,UAAU5zB,GAAKhxC,OAAS,EAF7B,GAKfpB,KAAK6vE,uBAAyB,SAASh5B,GACnC,GAAIhiB,GAAM70B,KAAKmrD,yBAAyBtU,EAAWzqC,OAAO2gE,UAC1D,OAAO/sE,MAAK8vE,uBAAuBj7C,EAAIud,IAAKvd,EAAI0d,SAEpDvyC,KAAK+vE,yBAA2B,SAAS1P,EAAQ2P,GAC7C,GAAIn5B,GAAY72C,KAAKg3C,oBAAoBqpB,EAAQ2P,EACjD,OAAOhwE,MAAK6vE,uBAAuBh5B,IAEvC72C,KAAKyrD,iCAAmC,SAAS4U,EAAQ2P,GACrD,GAAIn5B,GAAY72C,KAAKg3C,oBAAoBqpB,EAAQ2P,EACjD,OAAOhwE,MAAKmrD,yBAAyBtU,EAAWzqC,OAAO2gE,UAAY,KAEvE/sE,KAAKiwE,gBAAkB,SAAS79B,GAC5B,MAAKpyC,MAAK+gE,aAGC/gE,KAAKgmE,UAAU5zB,GAFfluC,QAKflE,KAAKwvE,iBAAmB,SAASE,GAC7B,MAAO1vE,MAAKwnE,SAAWkI,EAAe1vE,KAAKwnE,UAI/CxnE,KAAKkwE,oBAAsB,SAASr5B,EAAW64B,GAC3C,MAAO1vE,MAAKmrD,yBAAyBtU,EAAW64B,GAAct9B,KAIlEpyC,KAAKmwE,uBAAyB,SAASt5B,EAAW64B,GAC9C,MAAO1vE,MAAKmrD,yBAAyBtU,EAAW64B,GAAcn9B,QAElEvyC,KAAKmrD,yBAA2B,SAAStU,EAAW64B,GAChD,GAAgB,EAAZ74B,EACA,OAAQzE,IAAK,EAAGG,OAAQ,EAE5B,IAAI3kB,GAGA2kB,EAFA8tB,EAAS,EACT2P,EAAY,EAEZ59B,EAAM,EACNg+B,EAAY,EAEZC,EAAWrwE,KAAK0lE,gBAChBpiE,EAAItD,KAAK2lE,kBAAkB0K,EAAUx5B,GACrCvlB,EAAI++C,EAASjvE,MACjB,IAAIkwB,GAAKhuB,GAAK,EACV,GAAI8uC,GAAMi+B,EAAS/sE,GACf+8D,EAASrgE,KAAKylE,aAAaniE,GAC3BgtE,EAAUz5B,EAAYw5B,EAAS/+C,EAAI,OAEvC,IAAIg/C,IAAWh/C,CAOnB,KAJA,GAAIqlB,GAAS32C,KAAK42C,YAAc,EAC5B+T,EAAW3qD,KAAKugE,gBAAgBF,GAChC8K,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,EAElCvf,GAAPzE,IACHg+B,EAAYpwE,KAAK2vE,aAAatP,KAC1BjuB,EAAMg+B,EAAYv5B,GAAawpB,GAAU1pB,KAGzCvE,GAAOg+B,EACP/P,IACIA,EAAS8K,IACT9K,EAAS1V,EAAStY,IAAID,IAAI,EAC1BuY,EAAW3qD,KAAKugE,gBAAgBF,EAAQ1V,GACxCwgB,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,GAIhDka,IACAtwE,KAAKylE,aAAaz2D,KAAKqxD,GACvBrgE,KAAK0lE,gBAAgB12D,KAAKojC,GAIlC,IAAIuY,GAAYA,EAASh2B,MAAMyd,KAAOiuB,EAClCzyC,EAAO5tB,KAAK8hE,mBAAmBnX,GAC/B0V,EAAS1V,EAASh2B,MAAMyd,QACrB,CAAA,GAAuByE,GAAnBzE,EAAMg+B,GAA0B/P,EAAS1pB,EAChD,OACIvE,IAAKuE,EACLpE,OAAQvyC,KAAKykD,QAAQ9N,GAAQv1C,OAGjCwsB,GAAO5tB,KAAKykD,QAAQ4b,GACpB1V,EAAW,KAGf,GAAI3qD,KAAK+gE,aAAc,CACnB,GAAIoO,GAASnvE,KAAKgmE,UAAU3F,EAC5B,IAAI8O,EAAQ,CACR,GAAIoB,GAAahoE,KAAK+qB,MAAMujB,EAAYzE,EACxCG,GAAS48B,EAAOoB,GACbA,EAAa,GAAKpB,EAAO/tE,SACxB4uE,EAAYb,EAAOoB,EAAa,IAAMpB,EAAOA,EAAO/tE,OAAS,GAC7DwsB,EAAOA,EAAKxJ,UAAU4rD,KASlC,MAJAA,IAAahwE,KAAKorE,sBAAsBx9C,EAAM8hD,GAAc,GACxD1vE,KAAK+gE,cAAgBiP,GAAaz9B,IAClCy9B,EAAYz9B,EAAS,GAErBoY,EACOA,EAASwT,cAAc6R,IAE1B59B,IAAKiuB,EAAQ9tB,OAAQy9B,IAEjChwE,KAAK2nD,yBAA2B,SAAS0Y,EAAQ2P,GAC7C,GAAyB,mBAAdA,GACP,GAAIn7C,GAAM70B,KAAKq5D,wBAAwBgH,EAAOjuB,IAAKiuB,EAAO9tB,YAE1D1d,GAAM70B,KAAKq5D,wBAAwBgH,EAAQ2P,EAE/C3P,GAASxrC,EAAIud,IACb49B,EAAYn7C,EAAI0d,MAEhB,IAAIsE,GAAY,EACZ25B,EAAe,KACfvsB,EAAO,IACXA,GAAOjkD,KAAKkkD,UAAUmc,EAAQ2P,EAAW,GACrC/rB,IACAoc,EAASpc,EAAKtvB,MAAMyd,IACpB49B,EAAY/rB,EAAKtvB,MAAM4d,OAG3B,IAAIkY,GAAQrY,EAAM,EAGdi+B,EAAWrwE,KAAKylE,aAChBniE,EAAItD,KAAK2lE,kBAAkB0K,EAAUhQ,GACrC/uC,EAAI++C,EAASjvE,MACjB,IAAIkwB,GAAKhuB,GAAK,EACV,GAAI8uC,GAAMi+B,EAAS/sE,GACfuzC,EAAY72C,KAAK0lE,gBAAgBpiE,GACjCgtE,EAAUjQ,EAASgQ,EAAS/+C,EAAI,OAEpC,IAAIg/C,IAAWh/C,CAMnB,KAHA,GAAIq5B,GAAW3qD,KAAKugE,gBAAgBnuB,GAChC+4B,EAAYxgB,EAAUA,EAASh2B,MAAMyd,IAAKgkB,EAAAA,EAEjCiK,EAANjuB,GAAc,CACjB,GAAIA,GAAO+4B,EAAW,CAElB,GADA1gB,EAASE,EAAStY,IAAID,IAAM,EACxBqY,EAAS4V,EACT,KACJ1V,GAAW3qD,KAAKugE,gBAAgB9V,EAAQE,GACxCwgB,EAAYxgB,EAAUA,EAASh2B,MAAMyd,IAAKgkB,EAAAA,MAG1C3L,GAASrY,EAAM,CAGnByE,IAAa72C,KAAK2vE,aAAav9B,GAC/BA,EAAMqY,EAEF6lB,IACAtwE,KAAKylE,aAAaz2D,KAAKojC,GACvBpyC,KAAK0lE,gBAAgB12D,KAAK6nC,IAGlC,GAAIkrB,GAAW,EAQf,IAPIpX,GAAYvY,GAAO+4B,GACnBpJ,EAAW/hE,KAAK8hE,mBAAmBnX,EAAU0V,EAAQ2P,GACrDQ,EAAe7lB,EAASh2B,MAAMyd,MAE9B2vB,EAAW/hE,KAAKykD,QAAQ4b,GAAQj8C,UAAU,EAAG4rD,GAC7CQ,EAAenQ,GAEfrgE,KAAK+gE,aAAc,CACnB,GAAI0P,GAAUzwE,KAAKgmE,UAAUwK,EAC7B,IAAIC,EAAS,CAET,IADA,GAAIC,GAAkB,EACf3O,EAAS3gE,QAAUqvE,EAAQC,IAC9B75B,IACA65B,GAEJ3O,GAAWA,EAAS39C,UAChBqsD,EAAQC,EAAkB,IAAM,EAAG3O,EAAS3gE,SAKxD,OACIgxC,IAAKyE,EACLtE,OAAQvyC,KAAKorE,sBAAsBrJ,GAAU,KAGrD/hE,KAAK8vE,uBAAyB,SAAS19B,EAAK49B,GACxC,MAAOhwE,MAAK2nD,yBAAyBvV,EAAK49B,GAAWz9B,QAEzDvyC,KAAKg3C,oBAAsB,SAASqpB,EAAQ2P,GACxC,MAAOhwE,MAAK2nD,yBAAyB0Y,EAAQ2P,GAAW59B,KAE5DpyC,KAAK2wE,gBAAkB,WACnB,GAAIC,GAAa,EACb3sB,EAAO,IACX,IAAKjkD,KAAK+gE,aAaN,IALA,GAAIzZ,GAAUtnD,KAAKgmE,UAAU5kE,OACzBgxC,EAAM,EAAG9uC,EAAI,EACb2gD,EAAOjkD,KAAKggE,UAAU18D,KACtB6nE,EAAYlnB,EAAOA,EAAKtvB,MAAMyd,IAAKgkB,EAAAA,EAE1B9O,EAANlV,GAAe,CAClB,GAAI+8B,GAASnvE,KAAKgmE,UAAU5zB,EAC5Bw+B,IAAczB,EAASA,EAAO/tE,OAAS,EAAI,EAC3CgxC,IACIA,EAAM+4B,IACN/4B,EAAM6R,EAAK5R,IAAID,IAAI,EACnB6R,EAAOjkD,KAAKggE,UAAU18D,KACtB6nE,EAAYlnB,EAAMA,EAAKtvB,MAAMyd,IAAKgkB,EAAAA,OApBtB,CACpBwa,EAAa5wE,KAAK42C,WAElB,KAAK,GADDumB,GAAWn9D,KAAKggE,UACX18D,EAAI,EAAGA,EAAI65D,EAAS/7D,OAAQkC,IACjC2gD,EAAOkZ,EAAS75D,GAChBstE,GAAc3sB,EAAK5R,IAAID,IAAM6R,EAAKtvB,MAAMyd,IAsBhD,MAHIpyC,MAAK0sD,cACLkkB,GAAc5wE,KAAK6wE,0BAEhBD,GAEX5wE,KAAK8wE,gBAAkB,SAASC,KAGhC/wE,KAAKgxE,QAAU,WACPhxE,KAAKslE,cACLtlE,KAAKslE,YAAYhJ,YAAY,MAC7Bt8D,KAAKslE,YAAc,MAEvBtlE,KAAK2pE,iBAuCVppE,KAAKskE,EAAYpjE,WAEpB2uB,EAAS,0BAA0BwvC,QAAQr/D,KAAKskE,EAAYpjE,WAC5D2uB,EAAS,gCAAgC0zC,aAAavjE,KAAKskE,EAAYpjE,WAGvEiB,EAAOu/C,cAAc4iB,EAAYpjE,UAAW,WACxCirC,MACI7qC,IAAK,SAASsD,GAUV,GATKA,GAAkB,OAATA,EAEI,QAATA,EACLA,GAAQ,EACM,eAATA,EACLA,EAAQ,GACa,gBAATA,KACZA,EAAQs1B,SAASt1B,EAAO,MAAO,GAN/BA,GAAQ,EAQRnF,KAAKixE,OAAS9rE,EAAlB,CAEA,GAAKA,EAEE,CACH,GAAI4G,GAAsB,gBAAT5G,GAAoBA,EAAQ,IAC7CnF,MAAKutE,kBAAkBxhE,EAAKA,GAC5B/L,KAAKsN,gBAAe,OAJpBtN,MAAKsN,gBAAe,EAMxBtN,MAAKixE,MAAQ9rE,IAEjBrD,IAAK,WACD,MAAI9B,MAAKstE,iBACa,IAAdttE,KAAKixE,MACE,cACNjxE,KAAKiuE,oBAAoBzlE,IAEvBxI,KAAKixE,MADD,OAGR,OAEXlvB,YAAY,GAEhB+nB,YACIjoE,IAAK,SAASiuC,GACVA,EAAa,QAAPA,EACmB,QAAnB9vC,KAAKsnE,MAAMt8D,KACJ,QAAP8kC,EACFA,GAAO9vC,KAAKsvE,cACZtvE,KAAKsvE,YAAcx/B,EACf9vC,KAAK+gE,eACL/gE,KAAKkhE,WAAY,EACjBlhE,KAAKwlE,eAAe,GACpBxlE,KAAKghE,gBAAgB,EAAGhhE,KAAK42C,YAAc,MAIvDsL,aAAc,QAElBgvB,iBACIrvE,IAAK,WAAY7B,KAAK0+C,QAAQ,qBAC9BwD,aAAc,GAElBknB,WACIvnE,IAAK,SAASunE,GACVppE,KAAKspE,WAAaF,EAElBppE,KAAK2pE,cACDP,GACAppE,KAAK4pE,gBAEb1nB,cAAc,GAElBivB,aAAcjvB,cAAc,GAC5B6I,SACIlpD,IAAK,SAASkpD,GACN9mC,MAAM8mC,IAAY/qD,KAAKwnE,WAAazc,IAExC/qD,KAAKkhE,WAAY,EACjBlhE,KAAKimE,mBACLjmE,KAAKwnE,SAAWzc,EAChB/qD,KAAK0+C,QAAQ,mBAEjBwD,aAAc,EACdH,YAAY,GAEhB4lB,WACI9lE,IAAK,SAASiuC,GAAM9vC,KAAK0+C,QAAQ,oBACjCwD,cAAc,GAElBiY,aACIt4D,IAAK,SAASiuC,GAAM9vC,KAAKm5B,IAAI+gC,eAAepqB,IAC5ChuC,IAAK,WAAY,MAAO9B,MAAKm5B,IAAIihC,kBACjCrY,YAAY,GAEhBrgD,MACIG,IAAK,SAASiuC,GAAO9vC,KAAK2B,QAAQmuC,IAClChuC,IAAK,WAAa,MAAO9B,MAAKwpE,YAItC5pE,EAAQilE,YAAcA,IAGtB34D,IAAIpM,OAAO,cAAc,UAAU,UAAU,SAAS,eAAe,cAAc,aAAc,SAASswB,EAAUxwB,EAASC,GAC7H,YAEA,IAAIwrC,GAAOjb,EAAS,cAChBoM,EAAMpM,EAAS,aACf+1B,EAAQ/1B,EAAS,WAAW+1B,MAE5BirB,EAAS,WACTpxE,KAAK0hD,cAGT,WACI1hD,KAAK6B,IAAM,SAAShB,GAEhB,MADA27B,GAAI35B,MAAM7C,KAAK0hD,SAAU7gD,GAClBb,MAEXA,KAAKwhD,WAAa,WACd,MAAOnW,GAAKxB,WAAW7pC,KAAK0hD,WAEhC1hD,KAAKqhD,WAAa,SAASxgD,GACvBb,KAAK0hD,SAAW7gD,GAEpBb,KAAKqxE,KAAO,SAAS1hC,GACjB,GAAI6nB,GAAWx3D,KAAKsxE,eAAe3hC,EAAS3vC,KAAK0hD,SAEjD,KAAK8V,EACD,OAAO,CAEX,IAAIhT,GAAa,IAUjB,OATAgT,GAASr9C,QAAQ,SAAStS,EAAOuqC,EAAKzH,GAClC,GAAK9iC,EAAM8sB,MAIP6vB,EAAa38C,MAJC,CACd,GAAI0qC,GAAS1qC,EAAM8iC,QAAUA,GAAU,EACvC6Z,GAAa,GAAI2B,GAAM/T,EAAKG,EAAQH,EAAKG,EAAO1qC,EAAMzG,QAG1D,OAAO,IAGJojD,GAEXxkD,KAAKuxE,QAAU,SAAS5hC,GACpB,GAAI9uC,GAAUb,KAAK0hD,QACnB,KAAK7gD,EAAQ2wE,OACT,QACJxxE,MAAKyxE,gBAAgB5wE,EAErB,IAAIgH,GAAQhH,EAAQgH,MAChB6mB,EAAQ7mB,EACN8nC,EAAQ2qB,SAASzyD,EAAM8sB,MAAMyd,IAAKvqC,EAAMwqC,IAAID,KAC5CzC,EAAQxW,IAAIygC,cAEd3M,KACAj5C,EAAKnT,EAAQmT,EACjB,IAAInT,EAAQ6wE,aAAc,CACtB,GAEIC,GAFArkD,EAAMtZ,EAAG5S,OACTu1C,EAASjoB,EAAMttB,OAASksB,CAE5B6N,GAAO,IAAK,GAAIiX,GAAMp+B,EAAG22B,QAAU,EAAUgM,GAAPvE,EAAeA,IAAO,CACxD,IAAK,GAAIvgC,GAAI,EAAOyb,EAAJzb,EAASA,IACrB,GAAoC,IAAhC6c,EAAM0jB,EAAMvgC,GAAGnN,OAAOsP,EAAGnC,IACzB,QAASspB,EAEjB,IAAI8gC,GAAYvtC,EAAM0jB,GAClBxkB,EAAOc,EAAM0jB,EAAM9kB,EAAM,GACzB3W,EAAaslD,EAAU76D,OAAS66D,EAAU1sD,MAAMyE,EAAG,IAAI,GAAG5S,OAC1DyV,EAAW+W,EAAKre,MAAMyE,EAAGsZ,EAAM,IAAI,GAAGlsB,MAEtCuwE,IAAaA,EAAUt/B,IAAID,MAAQA,GACnCu/B,EAAUt/B,IAAIE,OAAS57B,IAI3Bs2C,EAAOj+C,KAAK2iE,EAAY,GAAIxrB,GACxB/T,EAAKz7B,EAAYy7B,EAAM9kB,EAAM,EAAGzW,IAEhCyW,EAAM,IACN8kB,EAAMA,EAAM9kB,EAAM,SAG1B,KAAK,GAAIhqB,GAAI,EAAGA,EAAIorB,EAAMttB,OAAQkC,IAE9B,IAAK,GADDonC,GAAUW,EAAKb,gBAAgB9b,EAAMprB,GAAI0Q,GACpCnC,EAAI,EAAGA,EAAI64B,EAAQtpC,OAAQyQ,IAAK,CACrC,GAAItC,GAAQm7B,EAAQ74B,EACpBo7C,GAAOj+C,KAAK,GAAIm3C,GAAM7iD,EAAGiM,EAAMo7B,OAAQrnC,EAAGiM,EAAMo7B,OAASp7B,EAAMnO,SAK3E,GAAIyG,EAAO,CAIP,IAHA,GAAIw+C,GAAcx+C,EAAM8sB,MAAM4d,OAC1BgU,EAAY1+C,EAAM8sB,MAAM4d,OACxBjvC,EAAI,EAAGuO,EAAIo7C,EAAO7rD,OAAS,EACpByQ,EAAJvO,GAAS2pD,EAAO3pD,GAAGqxB,MAAM4d,OAAS8T,GAAe4G,EAAO3pD,GAAGqxB,MAAMyd,KAAOvqC,EAAM8sB,MAAMyd,KACvF9uC,GAEJ,MAAWuO,EAAJvO,GAAS2pD,EAAOp7C,GAAGwgC,IAAIE,OAASgU,GAAa0G,EAAOp7C,GAAGwgC,IAAID,KAAOvqC,EAAMwqC,IAAID,KAC/EvgC,GAGJ,KADAo7C,EAASA,EAAO/+B,MAAM5qB,EAAGuO,EAAI,GACxBvO,EAAI,EAAGuO,EAAIo7C,EAAO7rD,OAAYyQ,EAAJvO,EAAOA,IAClC2pD,EAAO3pD,GAAGqxB,MAAMyd,KAAOvqC,EAAM8sB,MAAMyd,IACnC6a,EAAO3pD,GAAG+uC,IAAID,KAAOvqC,EAAM8sB,MAAMyd,IAIzC,MAAO6a,IAEXjtD,KAAKmkB,QAAU,SAASte,EAAO+rE,GAC3B,GAAI/wE,GAAUb,KAAK0hD,SAEf1tC,EAAKhU,KAAKyxE,gBAAgB5wE,EAC9B,IAAIA,EAAQ6wE,aACR,MAAOE,EAEX,IAAK59D,EAAL,CAGA,GAAIzE,GAAQyE,EAAGC,KAAKpO,EACpB,KAAK0J,GAASA,EAAM,GAAGnO,QAAUyE,EAAMzE,OACnC,MAAO,KAGX,IADAwwE,EAAc/rE,EAAMse,QAAQnQ,EAAI49D,GAC5B/wE,EAAQgxE,aAAc,CACtBD,EAAcA,EAAY3gE,MAAM,GAChC,KAAK,GAAI3N,GAAIiF,KAAKC,IAAI3C,EAAMzE,OAAQyE,EAAMzE,QAASkC,KAAO,CACtD,GAAImrB,GAAK5oB,EAAMvC,EACXmrB,IAAMA,EAAGnT,eAAiBmT,EAC1BmjD,EAAYtuE,GAAKsuE,EAAYtuE,GAAG88C,cAEhCwxB,EAAYtuE,GAAKsuE,EAAYtuE,GAAGgY,cAExCs2D,EAAcA,EAAYpiE,KAAK,IAGnC,MAAOoiE,KAGX5xE,KAAKsxE,eAAiB,SAAS3hC,EAAS9uC,GACpC,GAAImT,GAAKhU,KAAKyxE,gBAAgB5wE,EAC9B,KAAKmT,EACD,OAAO,CAEX,IAAiB9L,GAAbykB,EAAO3sB,KAAgB8xE,EAAYjxE,EAAQixE,SAE/C,IAAIjxE,EAAQ6wE,aACR,GAAIpkD,GAAMtZ,EAAG5S,OACT2wE,EAAgB,SAASnkD,EAAMwkB,EAAKzH,GACpC,GAAIh0B,GAAaiX,EAAKlpB,OAAOsP,EAAG,GAChC,IAAkB,IAAd2C,EAAJ,CAEA,IAAK,GAAIrT,GAAI,EAAOgqB,EAAJhqB,EAASA,IAErB,GADAsqB,EAAO+hB,EAAQ8U,QAAQrS,EAAM9uC,GACH,IAAtBsqB,EAAKlpB,OAAOsP,EAAG1Q,IACf,MAGR,IAAIuT,GAAW+W,EAAKre,MAAMyE,EAAGsZ,EAAM,IAAI,GAAGlsB,OAEtCyG,EAAQ,GAAIs+C,GAAM/T,EAAKz7B,EAAYy7B,EAAM9kB,EAAM,EAAGzW,EAOtD,OANiB,IAAb7C,EAAG22B,QACH9iC,EAAM8sB,MAAMyd,MACZvqC,EAAM8sB,MAAM4d,OAASnmC,OAAO2gE,WACrBpiC,IACP9iC,EAAM8sB,MAAM4d,QAAU5H,GAEtBziC,EAASL,IACF,EADX,aAGD,IAAIiqE,EACP,GAAIC,GAAgB,SAASnkD,EAAMwkB,EAAKz7B,GAEpC,IAAK,GADD+zB,GAAUW,EAAKb,gBAAgB5c,EAAM5Z,GAChC1Q,EAAIonC,EAAQtpC,OAAO,EAAGkC,GAAK,EAAGA,IACnC,GAAI4E,EAASwiC,EAAQpnC,GAAI8uC,EAAKz7B,GAC1B,OAAO,OAGnB,IAAIo7D,GAAgB,SAASnkD,EAAMwkB,EAAKz7B,GAEpC,IAAK,GADD+zB,GAAUW,EAAKb,gBAAgB5c,EAAM5Z,GAChC1Q,EAAI,EAAGA,EAAIonC,EAAQtpC,OAAQkC,IAChC,GAAI4E,EAASwiC,EAAQpnC,GAAI8uC,EAAKz7B,GAC1B,OAAO,EAIvB,QACIwD,QAAS,SAAS63D,GACd9pE,EAAW8pE,EACXrlD,EAAKslD,cAActiC,EAAS9uC,GAASsZ,QAAQ43D,MAKzD/xE,KAAKyxE,gBAAkB,SAAS5wE,EAASqxE,GACrC,GAAIrxE,EAAQ2wE,iBAAkBvhE,QAC1B,MAAOpP,GAAQmT,GAAKnT,EAAQ2wE,MAEhC,IAAIA,GAAS3wE,EAAQ2wE,MAErB,KAAK3wE,EAAQ2wE,OACT,MAAO3wE,GAAQmT,IAAK,CAEnBnT,GAAQ4pC,SACT+mC,EAASnmC,EAAKf,aAAaknC,IAE3B3wE,EAAQsxE,YACRX,EAAS,MAAQA,EAAS,MAE9B,IAAIY,GAAWvxE,EAAQwxE,cAAgB,KAAO,KAG9C,IADAxxE,EAAQ6wE,cAAgBQ,GAAyB,SAAS7iE,KAAKmiE,GAC3D3wE,EAAQ6wE,aACR,MAAO7wE,GAAQmT,GAAKhU,KAAKsyE,yBAAyBd,EAAQY,EAE9D,KACI,GAAIp+D,GAAK,GAAI/D,QAAOuhE,EAAQY,GAC9B,MAAMxqD,GACJ5T,GAAK,EAET,MAAOnT,GAAQmT,GAAKA,GAGxBhU,KAAKsyE,yBAA2B,SAASd,EAAQY,GAG7C,IAAK,GAFDzxB,GAAQ6wB,EAAOrtD,QAAQ,cAAe,QAAQlT,MAAM,MACpD+C,KACK1Q,EAAI,EAAGA,EAAIq9C,EAAMv/C,OAAQkC,IAAK,IACnC0Q,EAAGhF,KAAK,GAAIiB,QAAO0wC,EAAMr9C,GAAI8uE,IAC/B,MAAMxqD,GACJ,OAAO,EAQX,MANgB,IAAZ+4B,EAAM,IACN3sC,EAAGipB,QACHjpB,EAAG22B,OAAS,GAEZ32B,EAAG22B,OAAS,EAET32B,GAGXhU,KAAKiyE,cAAgB,SAAStiC,EAAS9uC,GACnC,GAAIixE,GAAiC,GAArBjxE,EAAQixE,UACpBS,EAAqC,GAAvB1xE,EAAQ0xE,YAEtB1qE,EAAQhH,EAAQgH,MAChB8sB,EAAQ9zB,EAAQ8zB,KACfA,KACDA,EAAQ9sB,EAAQA,EAAMiqE,EAAY,MAAQ,SAAWniC,EAAQ1rC,UAAU+rC,YAEvErb,EAAMA,QACNA,EAAQA,EAAM49C,GAAeT,EAAY,MAAQ,SAErD,IAAIzqB,GAAWx/C,EAAQA,EAAM8sB,MAAMyd,IAAM,EACrCkV,EAAUz/C,EAAQA,EAAMwqC,IAAID,IAAMzC,EAAQiH,YAAc,EAExDz8B,EAAU23D,EAAY,SAAS5pE,GAC3B,GAAIkqC,GAAMzd,EAAMyd,IAEZxkB,EAAO+hB,EAAQ8U,QAAQrS,GAAKhuB,UAAU,EAAGuQ,EAAM4d,OACnD,KAAIrqC,EAAS0lB,EAAMwkB,GAAnB,CAGA,IAAKA,IAAOA,GAAOiV,EAAUjV,IACzB,GAAIlqC,EAASynC,EAAQ8U,QAAQrS,GAAMA,GAC/B,MAER,IAAoB,GAAhBvxC,EAAQ6rC,KAGZ,IAAK0F,EAAMkV,EAASD,EAAW1yB,EAAMyd,IAAKA,GAAOiV,EAAUjV,IACvD,GAAIlqC,EAASynC,EAAQ8U,QAAQrS,GAAMA,GAC/B,SACR,SAASlqC,GACT,GAAIkqC,GAAMzd,EAAMyd,IAEZxkB,EAAO+hB,EAAQ8U,QAAQrS,GAAKpjB,OAAO2F,EAAM4d,OAC7C,KAAIrqC,EAAS0lB,EAAMwkB,EAAKzd,EAAM4d,QAA9B,CAGA,IAAKH,GAAU,EAAUkV,GAAPlV,EAAgBA,IAC9B,GAAIlqC,EAASynC,EAAQ8U,QAAQrS,GAAMA,GAC/B,MAER,IAAoB,GAAhBvxC,EAAQ6rC,KAGZ,IAAK0F,EAAMiV,EAAUC,EAAU3yB,EAAMyd,IAAYkV,GAAPlV,EAAgBA,IACtD,GAAIlqC,EAASynC,EAAQ8U,QAAQrS,GAAMA,GAC/B,QAGhB,QAAQj4B,QAASA,MAGtB5Z,KAAK6wE,EAAO3vE,WAEf7B,EAAQwxE,OAASA,IAGjBllE,IAAIpM,OAAO,6BAA6B,UAAU,UAAU,SAAS,eAAe,qBAAsB,SAASswB,EAAUxwB,EAASC,GACtI,YAMA,SAAS2yE,GAAY9vE,EAAQwhC,GACzBlkC,KAAKkkC,SAAWA,IAAaqB,EAAUxB,MAAQ,MAAQ,OACvD/jC,KAAKglD,YACLhlD,KAAKyyE,qBACLzyE,KAAK0yE,YAAYhwE,GACjB1C,KAAK2yE,gBAAiB,EAG1B,QAASC,GAAiBlwE,EAAQwhC,GAC9BsuC,EAAYjyE,KAAKP,KAAM0C,EAAQwhC,GAC/BlkC,KAAK2yE,gBAAiB,EAd1B,GAAIhuB,GAAUv0B,EAAS,eACnBmV,EAAYnV,EAAS,oBACrByM,EAAW8nB,EAAQ9nB,QAevB+1C,GAAiBnxE,UAAY+wE,EAAY/wE,UAEzC,WAGIzB,KAAK6yE,WAAa,SAASz1C,GACnBp9B,KAAKglD,SAAS5nB,EAAQ96B,OACtBtC,KAAK8yE,cAAc11C,GAEvBp9B,KAAKglD,SAAS5nB,EAAQ96B,MAAQ86B,EAE1BA,EAAQ21C,SACR/yE,KAAKgzE,cAAc51C,IAG3Bp9B,KAAK8yE,cAAgB,SAAS11C,EAAS61C,GACnC,GAAI3wE,GAAO86B,IAA+B,gBAAZA,GAAuBA,EAAUA,EAAQ96B,KACvE86B,GAAUp9B,KAAKglD,SAAS1iD,GACnB2wE,SACMjzE,MAAKglD,SAAS1iD,EACzB,IAAI4wE,GAAMlzE,KAAKyyE,iBACf,KAAK,GAAIU,KAASD,GAAK,CACnB,GAAIE,GAAWF,EAAIC,EACnB,IAAIC,GAAYh2C,QACL81C,GAAIC,OACR,IAAItvD,MAAMrgB,QAAQ4vE,GAAW,CAChC,GAAI9vE,GAAI8vE,EAAS9jE,QAAQ8tB,EAChB,KAAL95B,IACA8vE,EAAShiE,OAAO9N,EAAG,GACI,GAAnB8vE,EAAShyE,SACT8xE,EAAIC,GAASC,EAAS,QAM1CpzE,KAAK+yE,QAAU,SAAS5jE,EAAKiuB,EAASi2C,GAGlC,MAFkB,gBAAPlkE,KACPA,EAAMA,EAAInP,KAAKkkC,WACd/0B,EAEiB,kBAAXiuB,GACAp9B,KAAK6yE,YAAY5+D,KAAMmpB,EAAS21C,QAAS5jE,EAAK7M,KAAM86B,EAAQ96B,MAAQ6M,QAE/EA,GAAI8B,MAAM,KAAKkJ,QAAQ,SAASm5D,GAC5B,GAAIC,GAAQ,EACZ,IAA4B,IAAxBD,EAAQhkE,QAAQ,KAAY,CAC5B,GAAIqxC,GAAQ2yB,EAAQriE,MAAM,MAC1BqiE,GAAU3yB,EAAMjxB,MAChBixB,EAAMxmC,QAAQ,SAASm5D,GACnB,GAAIE,GAAUxzE,KAAKyzE,UAAUH,GACzBjzE,EAAKw8B,EAAS22C,EAAQnuC,QAAUmuC,EAAQrkE,GAC5CokE,KAAUA,EAAQ,IAAM,IAAMlzE,EAC9BL,KAAK0zE,qBAAqBH,EAAO,cAClCvzE,MACHuzE,GAAS,IAEb,GAAIC,GAAUxzE,KAAKyzE,UAAUH,GACzBjzE,EAAKw8B,EAAS22C,EAAQnuC,QAAUmuC,EAAQrkE,GAC5CnP,MAAK0zE,qBAAqBH,EAAQlzE,EAAI+8B,EAASi2C,IAChDrzE,MArBH,QAwBJA,KAAK0zE,qBAAuB,SAASP,EAAO/1C,EAASi2C,GACjD,GAAkC/vE,GAA9B4vE,EAAMlzE,KAAKyyE,iBACVr1C,IAEO81C,EAAIC,IAAUnzE,KAAK2yE,eAC3BO,EAAIC,GAAS/1C,GAERvZ,MAAMrgB,QAAQ0vE,EAAIC,IAEyB,KAApC7vE,EAAI4vE,EAAIC,GAAO7jE,QAAQ8tB,KAC/B81C,EAAIC,GAAO/hE,OAAO9N,EAAG,GAFrB4vE,EAAIC,IAAUD,EAAIC,IAKlBE,GAAaj2C,EAAQu2C,UACrBT,EAAIC,GAAOx5D,QAAQyjB,GAEnB81C,EAAIC,GAAOnkE,KAAKouB,UAbb81C,GAAIC,IAiBnBnzE,KAAK0yE,YAAc,SAAS1tB,GACxBA,GAAY30C,OAAO0mB,KAAKiuB,GAAU7qC,QAAQ,SAAS7X,GAC/C,GAAI86B,GAAU4nB,EAAS1iD,EACvB,IAAK86B,EAAL,CAGA,GAAuB,gBAAZA,GACP,MAAOp9B,MAAK+yE,QAAQ31C,EAAS96B,EAEV,mBAAZ86B,KACPA,GAAYnpB,KAAMmpB,IAEC,gBAAZA,KAGNA,EAAQ96B,OACT86B,EAAQ96B,KAAOA,GAEnBtC,KAAK6yE,WAAWz1C,MACjBp9B,OAGPA,KAAK4zE,eAAiB,SAAS5uB,GAC3B30C,OAAO0mB,KAAKiuB,GAAU7qC,QAAQ,SAAS7X,GACnCtC,KAAK8yE,cAAc9tB,EAAS1iD,KAC7BtC,OAGPA,KAAK6zE,SAAW,SAASC,GACrBzjE,OAAO0mB,KAAK+8C,GAAS35D,QAAQ,SAAShL,GAClCnP,KAAK+yE,QAAQ5jE,EAAK2kE,EAAQ3kE,KAC3BnP,OAGPA,KAAKgzE,cAAgB,SAAS51C,GAC1Bp9B,KAAK+yE,QAAQ31C,EAAQ21C,QAAS31C,IAElCp9B,KAAKyzE,UAAY,SAAS18C,GACtB,GAAI4pB,GAAQ5pB,EAAKzb,cAAcrK,MAAM,mBAAmB2kB,OAAO,SAASjD,GAAG,MAAOA,KAC9ExjB,EAAMwxC,EAAMjxB,MAEZrkB,EAAUs5C,EAAQx1C,EACtB,IAAIw1C,EAAQrnB,cAAcjyB,GACtB8D,EAAMw1C,EAAQrnB,cAAcjyB,GAASiQ,kBACpC,CAAA,IAAKqlC,EAAMv/C,OACZ,OAAQ+N,IAAKA,EAAKk2B,OAAQ,GACzB,IAAoB,GAAhBsb,EAAMv/C,QAA2B,SAAZu/C,EAAM,GAChC,OAAQxxC,IAAKA,EAAIixC,cAAe/a,OAAQ,IAG5C,IAAK,GADDA,GAAS,EACJ/hC,EAAIq9C,EAAMv/C,OAAQkC,KAAM,CAC7B,GAAI8uE,GAAWztB,EAAQ9nB,SAAS8jB,EAAMr9C,GACtC,IAAgB,MAAZ8uE,EAGA,MAFsB,mBAAXxiE,UACPA,QAAQxM,MAAM,oBAAsBu9C,EAAMr9C,GAAK,OAASyzB,IACrD,CAEXsO,IAAU+sC,EAEd,OAAQjjE,IAAKA,EAAKk2B,OAAQA,IAG9BrlC,KAAK+zE,eAAiB,SAAwB1uC,EAAQ7B,GAClD,GAAIr0B,GAAM0tB,EAASwI,GAAU7B,CAC7B,OAAOxjC,MAAKyyE,kBAAkBtjE,IAGlCnP,KAAKulD,eAAiB,SAAS/iD,EAAM6iC,EAAQ7B,EAAWn4B,GACpD,GAAI8D,GAAM0tB,EAASwI,GAAU7B,EACzBpG,EAAUp9B,KAAKyyE,kBAAkBtjE,EAMrC,OALI3M,GAAKwxE,YACLxxE,EAAKwxE,WAAa,IAAM7kE,EACxBiuB,EAAUp9B,KAAKyyE,kBAAkBjwE,EAAKwxE,YAAc52C,IAGpDA,GACe,aAAXA,GAAyD,aAA/BA,EAAQA,EAAQh8B,OAAS,IAMvDoB,EAAKwxE,WAAa3oE,EAAU,IAC5B7I,EAAKwxE,UAAY,KACb52C,QAASA,KAPT56B,EAAKwxE,UAAYxxE,EAAKwxE,WAAa7kE,GAC3BiuB,QAAS,WAS9B78B,KAAKiyE,EAAY/wE,WAEpB7B,EAAQ4yE,YAAcA,EACtB5yE,EAAQgzE,iBAAmBA,IAG3B1mE,IAAIpM,OAAO,gCAAgC,UAAU,UAAU,SAAS,cAAc,4BAA4B,yBAA0B,SAASswB,EAAUxwB,EAASC,GACxK,YAEA,IAAI28B,GAAMpM,EAAS,cACfwiD,EAAmBxiD,EAAS,4BAA4BwiD,iBACxDz0B,EAAe/tB,EAAS,wBAAwB+tB,aAEhD81B,EAAiB,SAAS/vC,EAAU8gB,GACpC4tB,EAAiBryE,KAAKP,KAAMglD,EAAU9gB,GACtClkC,KAAKk0E,OAASl0E,KAAKglD,SACnBhlD,KAAKoxC,kBAAkB,OAAQ,SAASxpB,GACpC,MAAOA,GAAEwV,QAAQnpB,KAAK2T,EAAEzf,OAAQyf,EAAEjY,YAI1C6sB,GAAIP,SAASg4C,EAAgBrB,GAE7B,WAEIp2C,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAKiU,KAAO,SAASmpB,EAASj1B,EAAQwH,GAClC,GAAIkU,MAAMrgB,QAAQ45B,GAAU,CACxB,IAAK,GAAI95B,GAAI85B,EAAQh8B,OAAQkC,KACzB,GAAItD,KAAKiU,KAAKmpB,EAAQ95B,GAAI6E,EAAQwH,GAAO,OAAO,CAEpD,QAAO,EAMX,GAHuB,gBAAZytB,KACPA,EAAUp9B,KAAKglD,SAAS5nB,KAEvBA,EACD,OAAO,CAEX,IAAIj1B,GAAUA,EAAOunC,YAActS,EAAQiT,SACvC,OAAO,CAEX,IAAIzoB,IAAKzf,OAAQA,EAAQi1B,QAASA,EAASztB,KAAMA,EAIjD,OAHAiY,GAAEoK,YAAchyB,KAAKuwC,MAAM,OAAQ3oB,GACnC5nB,KAAK0+C,QAAQ,YAAa92B,GAEnBA,EAAEoK,eAAgB,GAAQ,GAAQ,GAG7ChyB,KAAKm0E,gBAAkB,SAAShsE,GAC5B,MAAInI,MAAKo0E,UAAT,QAGAjsE,GAAUA,EAAOooC,MAAM,gBACnBvwC,KAAKq0E,WACLr0E,KAAKs0E,MAAM5kD,MACX1vB,KAAKyU,oBAAoB,OAAQzU,KAAKu0E,oBAEjCv0E,KAAKs0E,MAAMlzE,SACZpB,KAAKs0E,MAAQt0E,KAAKw0E,UAEfx0E,KAAKq0E,WAAY,IAEvBr0E,KAAKu0E,qBACNv0E,KAAKu0E,mBAAqB,SAAS3sD,GAC/B5nB,KAAKs0E,MAAMtlE,MAAM4Y,EAAEwV,QAASxV,EAAEjY,QAChCwgB,KAAKnwB,OAGXA,KAAKw0E,SAAWx0E,KAAKs0E,MACrBt0E,KAAKs0E,SACLt0E,KAAK4N,GAAG,OAAQ5N,KAAKu0E,oBACdv0E,KAAKq0E,WAAY,KAG5Br0E,KAAKy0E,OAAS,SAAStsE,GACnB,IAAInI,KAAKo0E,WAAcp0E,KAAKs0E,MAA5B,CAGA,GAAIt0E,KAAKq0E,UACL,MAAOr0E,MAAKm0E,gBAAgBhsE,EAEhC,KACInI,KAAKo0E,WAAY,EACjBp0E,KAAKs0E,MAAMn6D,QAAQ,SAASwY,GACR,gBAALA,GACP3yB,KAAKiU,KAAK0e,EAAGxqB,GAEbnI,KAAKiU,KAAK0e,EAAE,GAAIxqB,EAAQwqB,EAAE,KAC/B3yB,MACL,QACEA,KAAKo0E,WAAY,KAIzBp0E,KAAK00E,UAAY,SAASl0E,GACtB,MAAOA,GAAEm1B,IAAI,SAAShD,GAKlB,MAJmB,gBAARA,GAAE,KACTA,EAAE,GAAKA,EAAE,GAAGrwB,MACXqwB,EAAE,KACHA,EAAIA,EAAE,IACHA,MAIhBpyB,KAAK0zE,EAAexyE,WAEvB7B,EAAQq0E,eAAiBA,IAIzB/nE,IAAIpM,OAAO,iCAAiC,UAAU,UAAU,SAAS,eAAe,aAAa,aAAc,SAASswB,EAAUxwB,EAASC,GAC/I,YAMA,SAASkzE,GAAQhqC,EAAK4rC,GAClB,OAAQ5rC,IAAKA,EAAK4rC,IAAKA,GAL3B,GAAItpC,GAAOjb,EAAS,eAChB1tB,EAAS0tB,EAAS,aAClB+1B,EAAQ/1B,EAAS,YAAY+1B,KAKjCvmD,GAAQolD,WACJ1iD,KAAM,mBACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GACXzF,EAAOs+C,WAAW,wBAAyB,SAASnhD,GAChDA,EAAOu/C,KAAKj3C,GACZA,EAAOysE,sBAGfvkC,UAAU,IAEV/tC,KAAM,gBACNywE,QAASA,EAAQ,QAAS,UAC1B9+D,KAAM,SAAS9L,GACXzF,EAAOs+C,WAAW,uBAAwB,SAASnhD,GAC/CA,EAAOg1E,gBAAgB1sE,EAAQ,MAGvC2sE,eAAgB,UAChBzkC,UAAU,IAEV/tC,KAAM,oBACNywE,QAASA,EAAQ,cAAe,gBAChC9+D,KAAM,SAAS9L,GACXzF,EAAOs+C,WAAW,uBAAwB,SAASnhD,GAC/CA,EAAOg1E,gBAAgB1sE,EAAQ,OAGvC2sE,eAAgB,UAChBzkC,UAAU,IAEV/tC,KAAM,YACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOmmC,aAChC+B,UAAU,IAEV/tC,KAAM,kBACNywE,QAASA,EAAQ,KAAM,UACvB9+D,KAAM,SAAS9L,GAAUA,EAAO4sE,mBAChC1kC,UAAU,IAEV/tC,KAAM,WACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GACX,GAAIylB,GAAO6M,SAASu6C,OAAO,sBAAuB,GAC7C/wD,OAAM2J,IACPzlB,EAAO8sE,SAASrnD,IAGxByiB,UAAU,IAEV/tC,KAAM,OACNywE,QAASA,EAAQ,gBAAiB,4BAClC9+D,KAAM,SAAS9L,GAAUA,EAAOwnC,QAAQwyB,YAAW,IACnD2S,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,SACNywE,QAASA,EAAQ,4BAA6B,wCAC9C9+D,KAAM,SAAS9L,GAAUA,EAAOwnC,QAAQwyB,YAAW,IACnD2S,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,mBACNywE,QAASA,EAAQ,KAAM,MACvB9+D,KAAM,SAAS9L,GAAUA,EAAOwnC,QAAQi0B,oBACxCkR,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,yBACNywE,QAASA,EAAQ,SAAU,UAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOwnC,QAAQi0B,kBAAiB,IACzDkR,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,UACNywE,QAASA,EAAQ,aAAc,yBAC/B9+D,KAAM,SAAS9L,GAAUA,EAAOwnC,QAAQ2xB,WACxCwT,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,YACNywE,QAASA,EAAQ,QAAS,oBAC1B9+D,KAAM,SAAS9L,GACXA,EAAOwnC,QAAQ2xB,UACfn5D,EAAOwnC,QAAQ6xB,OAAOr5D,EAAOlE,UAAUixE,iBAE3CJ,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,YACNywE,QAASA,EAAQ,cAAe,0BAChC9+D,KAAM,SAAS9L,GAAUA,EAAOwnC,QAAQ6xB,UACxCsT,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,WACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOgtE,YAChCC,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,eACNywE,QAASA,EAAQ,eAAgB,mBACjC9+D,KAAM,SAAS9L,GAAUA,EAAOktE,gBAChCD,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,mBACNywE,QAASA,EAAQ,QAAS,UAC1B9+D,KAAM,SAAS9L,GACPA,EAAOlE,UAAUgZ,UACjB9U,EAAOlE,UAAUomD,aAEjBliD,EAAOgtE,YAEf9kC,UAAU,IAEV/tC,KAAM,uBACNywE,QAASA,EAAQ,cAAe,gBAChC9+D,KAAM,SAAS9L,GACPA,EAAOlE,UAAUgZ,UACjB9U,EAAOlE,UAAUomD,aAEjBliD,EAAOktE,gBAEfhlC,UAAU,IAEV/tC,KAAM,OACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GACXzF,EAAOs+C,WAAW,oBAAqB,SAASp5B,GAAIA,EAAEwpD,OAAOjpE,MAEjEkoC,UAAU,IAEV/tC,KAAM,YACNywE,QAAS,SACT9+D,KAAM,SAAS9L,GAAUA,EAAO0/D,mBAChCx3B,UAAU,IAEV/tC,KAAM,gBACNywE,QAASA,EAAQ,kBAAmB,oBACpC9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAegiD,mBAC/CqrB,kBAAmB,UACnB/kC,UAAU,EACVykC,eAAgB,UAChBQ,gBAAiB,aAEjBhzE,KAAM,YACNywE,QAASA,EAAQ,YAAa,2BAC9B9+D,KAAM,SAAS9L,GAAUA,EAAOotE,qBAChCH,kBAAmB,UACnB/kC,UAAU,EACVykC,eAAgB,UAChBQ,gBAAiB,aAEjBhzE,KAAM,WACNywE,QAASA,EAAQ,WAAY,YAC7B9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAekhD,YAC/CmsB,kBAAmB,UACnB/kC,UAAU;AAEV/tC,KAAM,WACNywE,QAASA,EAAQ,KAAM,aACvB9+D,KAAM,SAAS9L,EAAQwH,GAAQxH,EAAOqtE,WAAW7lE,EAAK8lE,QACtDL,kBAAmB,UACnB/kC,UAAU,IAEV/tC,KAAM,cACNywE,QAASA,EAAQ,iBAAkB,sBACnC9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAe8hD,iBAC/CurB,kBAAmB,UACnB/kC,UAAU,EACVykC,eAAgB,UAChBQ,gBAAiB,aAEjBhzE,KAAM,UACNywE,QAASA,EAAQ,WAAY,4BAC7B9+D,KAAM,SAAS9L,GAAUA,EAAOutE,mBAChCN,kBAAmB,UACnB/kC,UAAU,EACVykC,eAAgB,UAChBQ,gBAAiB,aAEjBhzE,KAAM,aACNywE,QAASA,EAAQ,aAAc,cAC/B9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAeohD,cAC/CisB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,aACNywE,QAASA,EAAQ,OAAQ,eACzB9+D,KAAM,SAAS9L,EAAQwH,GAAQxH,EAAOwtE,aAAahmE,EAAK8lE,QACxDL,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,iBACNywE,QAASA,EAAQ,kBAAmB,qBACpC9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAeoiD,kBAC/CirB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,eACNywE,QAASA,EAAQ,YAAa,eAC9B9+D,KAAM,SAAS9L,GAAUA,EAAOytE,oBAChCR,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,oBACNywE,QAASA,EAAQ,iBAAkB,sBACnC9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAe0hD,mBAC/C2rB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,gBACNywE,QAASA,EAAQ,gBAAiB,4BAClC9+D,KAAM,SAAS9L,GAAUA,EAAO0tE,qBAChCT,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,aACNywE,QAASA,EAAQ,aAAc,cAC/B9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAewhD,cAC/C6rB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,WACNywE,QAASA,EAAQ,OAAQ,eACzB9+D,KAAM,SAAS9L,EAAQwH,GAAQxH,EAAO2tE,aAAanmE,EAAK8lE,QACxDL,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,kBACNywE,QAASA,EAAQ,mBAAoB,sBACrC9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAekiD,mBAC/CmrB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,gBACNywE,QAASA,EAAQ,aAAc,gBAC/B9+D,KAAM,SAAS9L,GAAUA,EAAO4tE,qBAChCX,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,kBACNywE,QAASA,EAAQ,kBAAmB,uBACpC9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAe4hD,iBAC/CyrB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,cACNywE,QAASA,EAAQ,gBAAiB,4BAClC9+D,KAAM,SAAS9L,GAAUA,EAAO6tE,mBAChCZ,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,cACNywE,QAASA,EAAQ,cAAe,eAChC9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAeshD,eAC/C+rB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,YACNywE,QAASA,EAAQ,QAAS,gBAC1B9+D,KAAM,SAAS9L,EAAQwH,GAAQxH,EAAO8tE,cAActmE,EAAK8lE,QACzDL,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,iBACNywE,QAAS,iBACT9+D,KAAM,SAAS9L,GAAUA,EAAO+tE,kBAChC7lC,UAAU,IAEV/tC,KAAM,WACNywE,QAASA,EAAQ,KAAM,mBACvB9+D,KAAM,SAAS9L,GAAUA,EAAOguE,kBAChC9lC,UAAU,IAEV/tC,KAAM,eACNywE,QAASA,EAAQ,WAAY,mBAC7B9+D,KAAM,SAAS9L,GAAUA,EAAOiuE,gBAChC/lC,UAAU,IAEV/tC,KAAM,eACNywE,QAAS,eACT9+D,KAAM,SAAS9L,GAAUA,EAAOkuE,gBAChChmC,UAAU,IAEV/tC,KAAM,SACNywE,QAASA,EAAQ,KAAM,iBACvB9+D,KAAM,SAAS9L,GAAUA,EAAOmuE,gBAChCjmC,UAAU,IAEV/tC,KAAM,aACNywE,QAAS,SACT9+D,KAAM,SAAS9L,GAAUA,EAAOouE,cAChClmC,UAAU,IAEV/tC,KAAM,WACNywE,QAASA,EAAQ,UAAW,MAC5B9+D,KAAM,SAAS2T,GAAKA,EAAE0kB,SAASiJ,SAAS,EAAG,GAAK3tB,EAAE0kB,SAAS2M,YAAYD,aACvE3I,UAAU,IAEV/tC,KAAM,aACNywE,QAASA,EAAQ,YAAa,MAC9B9+D,KAAM,SAAS2T,GAAKA,EAAE0kB,SAASiJ,SAAS,EAAG,EAAI3tB,EAAE0kB,SAAS2M,YAAYD,aACtE3I,UAAU,IAEV/tC,KAAM,kBACNywE,QAAS,aACT9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAe0hD,mBAC/C2rB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,gBACNywE,QAAS,YACT9+D,KAAM,SAAS9L,GAAUA,EAAOJ,eAAe4hD,iBAC/CyrB,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,kBACNywE,QAASA,EAAQ,aAAc,oBAC/B9+D,KAAM,SAAS9L,GAAUA,EAAO68C,SAASmvB,gBAAgBhsE,IACzDkoC,UAAU,IAEV/tC,KAAM,cACNywE,QAASA,EAAQ,eAAgB,mBACjC9+D,KAAM,SAAS9L,GAAUA,EAAO68C,SAASyvB,OAAOtsE,IAChDkoC,UAAU,IAEV/tC,KAAM,iBACNywE,QAASA,EAAQ,SAAU,UAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOquE,kBAChCpB,kBAAmB,UACnB/kC,UAAU,IAEV/tC,KAAM,mBACNywE,QAASA,EAAQ,eAAgB,gBACjC9+D,KAAM,SAAS9L,GAAUA,EAAOquE,gBAAe,IAC/CpB,kBAAmB,UACnB/kC,UAAU,IAEV/tC,KAAM,oBACNywE,QAASA,EAAQ,OAAQ,QACzB9+D,KAAM,aACN8xC,WAAW,EACX1V,UAAU,IAGV/tC,KAAM,MACN2R,KAAM,SAAS9L,GACX,GAAIN,GAAQM,EAAO2qC,mBACnB3qC,GAAOooC,MAAM,MAAO1oC,GAEfM,EAAOlE,UAAUgZ,YAClB9U,EAAOwnC,QAAQ1a,OAAOptB,GACtBM,EAAO0nC,mBAGfilC,eAAgB,SAChBM,kBAAmB,YAEnB9yE,KAAM,aACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GAAUA,EAAO8yD,eAChC6Z,eAAgB,SAChBM,kBAAmB,gBAEnB9yE,KAAM,qBACNywE,QAASA,EAAQ,eAAgB,mBACjC9+D,KAAM,SAAS9L,GAAUA,EAAOsuE,sBAChC3B,eAAgB,SAChBM,kBAAmB,YAEnB9yE,KAAM,YACNywE,QAASA,EAAQ,aAAc,iBAC/B9+D,KAAM,SAAS9L,GAAUA,EAAOuuE,aAChC5B,eAAgB,YAChBM,kBAAmB,gBAEnB9yE,KAAM,gBACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GAAUA,EAAO4tD,sBAChCqf,kBAAmB,cACnBN,eAAgB,kBAEhBxyE,KAAM,qBACNywE,QAASA,EAAQ,eAAgB,mBACjC9+D,KAAM,SAAS9L,GAAUA,EAAOmvD,sBAChC8d,kBAAmB,UACnBN,eAAgB,kBAEhBxyE,KAAM,iBACNywE,QAASA,EAAQ,gBAAiB,gBAClC9+D,KAAM,SAAS9L,GAAUA,EAAOwuE,aAAa,IAC7CvB,kBAAmB,YAEnB9yE,KAAM,mBACNywE,QAASA,EAAQ,kBAAmB,kBACpC9+D,KAAM,SAAS9L,GAAUA,EAAOwuE,aAAa,KAC7CvB,kBAAmB,YAEnB9yE,KAAM,UACNywE,QAASA,EAAQ,SAAU,oBAC3B9+D,KAAM,SAAS9L,GACXzF,EAAOs+C,WAAW,oBAAqB,SAASp5B,GAAIA,EAAEwpD,OAAOjpE,GAAQ,QAGzE7F,KAAM,OACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOmC,UAEhChI,KAAM,OACNywE,QAASA,EAAQ,sBAAuB,6BACxC9+D,KAAM,SAAS9L,GAAUA,EAAOqC,UAEhClI,KAAM,cACNywE,QAASA,EAAQ,eAAgB,qBACjC9+D,KAAM,SAAS9L,GAAUA,EAAOyuE,eAChC9B,eAAgB,WAEhBxyE,KAAM,cACNywE,QAASA,EAAQ,SAAU,aAC3B9+D,KAAM,SAAS9L,GAAUA,EAAO6kE,eAChC8H,eAAgB,WAEhBxyE,KAAM,gBACNywE,QAASA,EAAQ,iBAAkB,uBACnC9+D,KAAM,SAAS9L,GAAUA,EAAO0uE,iBAChC/B,eAAgB,WAEhBxyE,KAAM,gBACNywE,QAASA,EAAQ,WAAY,eAC7B9+D,KAAM,SAAS9L,GAAUA,EAAO8kE,iBAChC6H,eAAgB,WAEhBxyE,KAAM,MACNywE,QAASA,EAAQ,SAAU,8BAC3B9+D,KAAM,SAAS9L,GAAUA,EAAO8sB,OAAO,UACvCmgD,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,YACNywE,QAASA,EACL,4BACA,mDAEJ9+D,KAAM,SAAS9L,GAAUA,EAAO8sB,OAAO,SACvCmgD,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,gBACNywE,QAASA,EAAQ,eAAgB,MACjC9+D,KAAM,SAAS9L,GACX,MAAIA,GAAOlE,UAAUgZ,cACjB9U,GAAO8sB,OAAO,SAEP,GAGfmgD,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,oBACNywE,QAASA,EAAQ,gBAAiB,qBAClC9+D,KAAM,SAAS9L,GAAUA,EAAO2uE,qBAChC1B,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,kBACNywE,QAASA,EAAQ,aAAc,UAC/B9+D,KAAM,SAAS9L,GAAUA,EAAO4uE,mBAChC3B,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,iBACNywE,QAASA,EAAQ,iBAAkB,oCACnC9+D,KAAM,SAAS9L,GAAUA,EAAO6uE,kBAChC5B,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,kBACNywE,QAASA,EAAQ,cAAe,cAChC9+D,KAAM,SAAS9L,GAAUA,EAAO8uE,mBAChC7B,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,UACNywE,QAASA,EAAQ,YAAa,aAC9B9+D,KAAM,SAAS9L,GAAUA,EAAO+uE,gBAChC9B,kBAAmB,UACnBN,eAAgB,kBAEhBxyE,KAAM,SACNywE,QAASA,EAAQ,MAAO,OACxB9+D,KAAM,SAAS9L,GAAUA,EAAOkvD,UAChC+d,kBAAmB,UACnBN,eAAgB,kBAEhBxyE,KAAM,eACNywE,QAASA,EAAQ,SAAU,UAC3B9+D,KAAM,SAAS9L,GAAUA,EAAO+uE,gBAChC9B,kBAAmB,cACnBN,eAAgB,kBAEhBxyE,KAAM,cACNywE,QAASA,EAAQ,SAAU,UAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOgvE,eAChC/B,kBAAmB,cACnBN,eAAgB,kBAEhBxyE,KAAM,eACN2R,KAAM,SAAS9L,EAAQyU,GAAOzU,EAAO6sB,OAAOpY,IAC5Cw4D,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,aACN2R,KAAM,SAAS9L,EAAQwH,GACnBxH,EAAO6sB,OAAOqW,EAAK3B,aAAa/5B,EAAKxJ,MAAS,GAAIwJ,EAAK8lE,OAAS,KAEpEL,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,YACNywE,QAASA,EAAQ,KAAM,UACvB9+D,KAAM,SAAS9L,GAAUA,EAAOivE,aAChChC,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,mBACNywE,QAASA,EAAQ,SAAU,UAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOkvE,oBAChCjC,kBAAmB,SAASjtE,GAASA,EAAOmvE,oBAAoB,IAChExC,eAAgB,WAEhBxyE,KAAM,cACNywE,QAASA,EAAQ,SAAU,UAC3B9+D,KAAM,SAAS9L,GAAUA,EAAOi4C,eAChCg1B,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,cACNywE,QAASA,EAAQ,eAAgB,gBACjC9+D,KAAM,SAAS9L,GAAUA,EAAOmT,eAChC85D,kBAAmB,UACnBN,eAAgB,WAEhBxyE,KAAM,eACNywE,QAASA,EAAQ,eAAgB,mBACjC9+D,KAAM,SAAS9L,GACX,GAAIN,GAAQM,EAAOlE,UAAU+rC,UAE7BnoC,GAAM8sB,MAAM4d,OAAS1qC,EAAMwqC,IAAIE,OAAS,EACxC1qC,EAAMwqC,IAAID,MACVjqC,EAAOlE,UAAUgsC,SAASpoC,GAAO,IAErCutE,kBAAmB,UACnBN,eAAgB,SAChBzkC,UAAU,IAEV/tC,KAAM,YACNywE,QAASA,EAAQ,KAAM,MACvB9+D,KAAM,SAAS9L,GASX,IAAK,GARD2gD,GAAc3gD,EAAOlE,UAAU6kD,cAC/Bjd,EAAiBid,EAAc3gD,EAAOlE,UAAUykD,mBAAqBvgD,EAAOlE,UAAUwkD,qBACtF3c,EAAegd,EAAc3gD,EAAOlE,UAAUwkD,qBAAuBtgD,EAAOlE,UAAUykD,mBACtF6uB,EAAkBpvE,EAAOwnC,QAAQxW,IAAIsrB,QAAQ5Y,EAAeuG,KAAKhxC,OACjEo2E,EAAervE,EAAOwnC,QAAQxW,IAAI8iB,aAAa9zC,EAAOlE,UAAU+rC,YAChEynC,EAAgBD,EAAarzD,QAAQ,QAAS,KAAK/iB,OACnDs2E,EAAavvE,EAAOwnC,QAAQxW,IAAIsrB,QAAQ5Y,EAAeuG,KAElD9uC,EAAIuoC,EAAeuG,IAAM,EAAG9uC,GAAKwoC,EAAasG,IAAM,EAAG9uC,IAAK,CACjE,GAAIq0E,GAAUtsC,EAAK1B,eAAe0B,EAAKzB,gBAAgBzhC,EAAOwnC,QAAQxW,IAAIsrB,QAAQnhD,IAC3D,KAAnBq0E,EAAQv2E,SACRu2E,EAAU,IAAMA,GAEpBD,GAAcC,EAGd7rC,EAAasG,IAAM,EAAKjqC,EAAOwnC,QAAQxW,IAAIyd,YAAc,IACzD8gC,GAAcvvE,EAAOwnC,QAAQxW,IAAI0gC,uBAGrC1xD,EAAO0nC,iBACP1nC,EAAOwnC,QAAQxW,IAAIhV,QAAQ,GAAIgiC,GAAMta,EAAeuG,IAAK,EAAGtG,EAAasG,IAAM,EAAG,GAAIslC,GAElFD,EAAgB,GAChBtvE,EAAOlE,UAAU4kD,aAAahd,EAAeuG,IAAKvG,EAAe0G,QACjEpqC,EAAOlE,UAAU4zC,SAAShM,EAAeuG,IAAKvG,EAAe0G,OAASklC,KAEtEF,EAAkBpvE,EAAOwnC,QAAQxW,IAAIsrB,QAAQ5Y,EAAeuG,KAAKhxC,OAASm2E,EAAmBA,EAAkB,EAAKA,EACpHpvE,EAAOlE,UAAU4kD,aAAahd,EAAeuG,IAAKmlC,KAG1DnC,kBAAmB,UACnB/kC,UAAU,IAEV/tC,KAAM,kBACNywE,QAASA,EAAQ,KAAM,MACvB9+D,KAAM,SAAS9L,GACX,GAAIm+C,GAASn+C,EAAOwnC,QAAQxW,IAAIyd,YAAc,EAC1CghC,EAASzvE,EAAOwnC,QAAQxW,IAAIsrB,QAAQ6B,GAAQllD,OAC5C6rD,EAAS9kD,EAAOlE,UAAUmpD,UAAUH,OACpC4qB,IACA5qB,GAAO7rD,OAAS,IAChB6rD,GAAU9kD,EAAOlE,UAAU+rC,YAG/B,KAAK,GAAI1sC,GAAI,EAAGA,EAAI2pD,EAAO7rD,OAAQkC,IAC3BA,GAAM2pD,EAAO7rD,OAAS,IAChB6rD,EAAO3pD,GAAG+uC,IAAID,MAAQkU,GAAU2G,EAAO3pD,GAAG+uC,IAAIE,SAAWqlC,IAC3DC,EAAU7oE,KAAK,GAAIm3C,GAAM8G,EAAO3pD,GAAG+uC,IAAID,IAAK6a,EAAO3pD,GAAG+uC,IAAIE,OAAQ+T,EAAQsxB,IAIxE,IAANt0E,GAC8B,IAAxB2pD,EAAO3pD,GAAGqxB,MAAMyd,KAAwC,IAA3B6a,EAAO3pD,GAAGqxB,MAAM4d,SAC/CslC,EAAU7oE,KAAK,GAAIm3C,GAAM,EAAG,EAAG8G,EAAO3pD,GAAGqxB,MAAMyd,IAAK6a,EAAO3pD,GAAGqxB,MAAM4d,SAGxEslC,EAAU7oE,KAAK,GAAIm3C,GAAM8G,EAAO3pD,EAAE,GAAG+uC,IAAID,IAAK6a,EAAO3pD,EAAE,GAAG+uC,IAAIE,OAAQ0a,EAAO3pD,GAAGqxB,MAAMyd,IAAK6a,EAAO3pD,GAAGqxB,MAAM4d,QAInHpqC,GAAO2vE,sBACP3vE,EAAO0nC,gBAEP,KAAI,GAAIvsC,GAAI,EAAGA,EAAIu0E,EAAUz2E,OAAQkC,IACjC6E,EAAOlE,UAAUoO,SAASwlE,EAAUv0E,IAAI,IAGhD+sC,UAAU,EACVykC,eAAgB,WAKpB5oE,IAAIpM,OAAO,cAAc,UAAU,UAAU,SAAS,yBAAyB,cAAc,cAAc,eAAe,oBAAoB,yBAAyB,0BAA0B,yBAAyB,0BAA0B,mBAAmB,aAAa,YAAY,wBAAwB,+BAA+B,gCAAgC,aAAa,sBAAuB,SAASswB,EAAUxwB,EAASC,GACvb,YAEAuwB,GAAS,uBAET,IAAIoM,GAAMpM,EAAS,aACfrsB,EAAMqsB,EAAS,aACfib,EAAOjb,EAAS,cAChBmV,EAAYnV,EAAS,mBACrBob,EAAYpb,EAAS,wBAAwBob,UAC7CiX,EAAeryB,EAAS,yBAAyBqyB,aACjDuB,EAAc5zB,EAAS,wBAAwB4zB,YAC/CY,EAAax0B,EAAS,yBAAyBw0B,WAC/CigB,EAAcz0C,EAAS,kBAAkBy0C,YACzCuM,EAAShhD,EAAS,YAAYghD,OAC9BjrB,EAAQ/1B,EAAS,WAAW+1B,MAC5BhI,EAAe/tB,EAAS,uBAAuB+tB,aAC/C81B,EAAiB7jD,EAAS,8BAA8B6jD,eACxD8D,EAAkB3nD,EAAS,+BAA+B40B,SAC1DtiD,EAAS0tB,EAAS,YAClBkkC,EAAgBlkC,EAAS,oBAAoBkkC,cAC7C0jB,EAAS,SAAS1rC,EAAUqD,GAC5B,GAAI/uC,GAAY0rC,EAAS2rC,qBACzBj4E,MAAKY,UAAYA,EACjBZ,KAAKssC,SAAWA,EAEhBtsC,KAAKglD,SAAW,GAAIivB,GAAe1uC,EAAUxB,MAAQ,MAAQ,MAAOg0C,GACpE/3E,KAAK+wC,UAAa,GAAIvF,GAAUc,EAAS4rC,uBAAwBl4E,MACjEA,KAAKssC,SAAS//B,SAAWvM,KAAK+wC,UAAUZ,aACxCnwC,KAAKm4E,WAAa,GAAIvzB,GAAW5kD,MACjCA,KAAKo4E,cAAgB,GAAI31B,GAAaziD,MACtC,GAAIgkD,GAAYhkD,MAEhBA,KAAK04C,gBAAkB,EACvB14C,KAAKq4E,SAAU,GAAIjH,IAASvvE,KACxB6qC,MAAM,IAGV1sC,KAAKs4E,gBAAkBt4E,KAAKs4E,gBAAgBnoD,KAAKnwB,MACjDA,KAAKglD,SAASp3C,GAAG,OAAQ5N,KAAKs4E,iBAE9Bt4E,KAAKu4E,0BAELv4E,KAAKw4E,iBAAmBntC,EAAKH,YAAY,WACrClrC,KAAK0+C,QAAQ,YACT1+C,KAAK2vC,SAAW3vC,KAAK2vC,QAAQ21B,aAC7BtlE,KAAK2vC,QAAQ21B,YAAY/I,iBAC/BpsC,KAAKnwB,OAEPA,KAAK4N,GAAG,SAAU,SAASowC,EAAG5S,GAC1BA,EAAMotC,iBAAiBxtC,SAAS,MAGpChrC,KAAKy4E,WAAW9oC,GAAW,GAAIk1B,GAAY,KAC3CniE,EAAOy/C,aAAaniD,MACpB0C,EAAOg8C,QAAQ,SAAU1+C,QAG7B,WAEIw8B,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAKu4E,wBAA0B,WAG3Bv4E,KAAK04E,cACL14E,KAAKglD,SAASp3C,GAAG,OAAQ5N,KAAK24E,eAAexoD,KAAKnwB,OAAO,GACzDA,KAAKglD,SAASp3C,GAAG,YAAa5N,KAAK44E,aAAazoD,KAAKnwB,OAAO,GAE5DA,KAAK64E,cAAgBxtC,EAAKH,YAAYlrC,KAAK44E,aAAazoD,KAAKnwB,OAE7DA,KAAK4N,GAAG,SAAU,WACd5N,KAAK84E,OAAS94E,KAAK24E,iBACnB34E,KAAK84E,MAAMC,YAAa,GAC1B5oD,KAAKnwB,OAAO,GAEdA,KAAK4N,GAAG,kBAAmB,WACvB5N,KAAK84E,OAAS94E,KAAK24E,iBACnB34E,KAAK84E,MAAME,kBAAmB,GAChC7oD,KAAKnwB,OAAO,IAGlBA,KAAK84E,MAAQ,KACb94E,KAAKi5E,UACLj5E,KAAK24E,eAAiB,SAASO,GAC3B,GAAIl5E,KAAK84E,MAAO,CACZ,IAAKI,GAAel5E,KAAK84E,MAAM17C,QAC3B,MACJp9B,MAAKi5E,OAASj5E,KAAK84E,MAElBI,IACDl5E,KAAKm5E,gBAAkB,KACvBD,MAGJl5E,KAAK64E,cAAc7tC,WACnBhrC,KAAK84E,OACD17C,QAAS87C,EAAY97C,YACrBztB,KAAMupE,EAAYvpE,KAClBtI,UAAWrH,KAAKssC,SAASjlC,YAIjCrH,KAAK44E,aAAe,SAAShxD,GACzB,GAAI5nB,KAAK84E,MAAO,CACZ,GAAIlxD,GAAKA,EAAEoK,eAAgB,EACvB,MAAOhyB,MAAK84E,MAAQ,IAExB,IAAI17C,GAAUp9B,KAAK84E,MAAM17C,OACzB,IAAIA,GAAWA,EAAQ03C,eAAgB,CACnC,OAAQ13C,EAAQ03C,gBACZ,IAAK,SACD90E,KAAKssC,SAAS2H,qBAAqB,KAAM,GACzC,MACJ,KAAK,UACL,IAAK,SACDj0C,KAAKssC,SAAS2H,sBACd,MACJ,KAAK,gBACD,GAAIpsC,GAAQ7H,KAAKiE,UAAU+rC,WACvBttC,EAAS1C,KAAKssC,SAAS2M,aACvBpxC,EAAM8sB,MAAMyd,KAAO1vC,EAAO4kD,SAAWz/C,EAAMwqC,IAAID,KAAO1vC,EAAO2kD,WAC7DrnD,KAAKssC,SAAS8sC,wBAAwBp5E,KAAKiE,UAAUmf,OAAQpjB,KAAKiE,UAAU+jD,MAM1D,WAA1B5qB,EAAQ03C,gBACR90E,KAAKssC,SAAS+sC,iBAAiBr5E,KAAK84E,MAAMzxE,WAGlDrH,KAAKi5E,OAASj5E,KAAK84E,MACnB94E,KAAK84E,MAAQ,OAGrB94E,KAAKs5E,oBAAsB,YAAa,MAAO,gBAC/Ct5E,KAAKs4E,gBAAkB,SAAS1wD,GAC5B,GAAK5nB,KAAKu5E,iBAAV,CAGA,GAAI/qE,GAAOxO,KAAKi5E,OACZO,EAAoBx5E,KAAKs5E,mBACzBG,EAAcjrE,EAAK4uB,SAAYxV,EAAEwV,QAAQ96B,MAAQkM,EAAK4uB,QAAQ96B,IAClE,IAAsB,gBAAlBslB,EAAEwV,QAAQ96B,KAAwB,CAClC,GAAI6D,GAAOyhB,EAAEjY,IACiBzL,UAA1BlE,KAAK05E,mBACL15E,KAAK05E,kBAAmB,GAE5BD,EAAcA,GACPz5E,KAAK05E,oBACH,KAAKrqE,KAAKlJ,IAAS,KAAKkJ,KAAKb,EAAKmB,OAE3C3P,KAAK05E,kBAAmB,MAExBD,GAAcA,GACuC,KAA9CD,EAAkBlqE,QAAQsY,EAAEwV,QAAQ96B,KAIlB,WAAzBtC,KAAKu5E,kBACFjiE,KAAKohB,MAAQ14B,KAAK25E,kBAAoB,MAEzCF,GAAc,GAGdA,EACAz5E,KAAK2vC,QAAQu3B,iBAAkB,EACoB,KAA9CsS,EAAkBlqE,QAAQsY,EAAEwV,QAAQ96B,QACzCtC,KAAK25E,kBAAoBriE,KAAKohB,SAEtC14B,KAAKqlD,mBAAqB,SAASu0B,EAAiBprC,GAChD,GAAIorC,GAA8C,gBAApBA,GAA8B,CACxD55E,KAAK65E,cAAgBD,CACrB,IAAIxuC,GAAQprC,IACZ0C,GAAOs+C,YAAY,aAAc44B,GAAkB,SAAS/5E,GACpDurC,EAAMyuC,eAAiBD,GACvBxuC,EAAM+sC,WAAW9yB,mBAAmBxlD,GAAUA,EAAOi6E,SACzDtrC,GAAMA,UAGVxuC,MAAK65E,cAAgB,KACrB75E,KAAKm4E,WAAW9yB,mBAAmBu0B,GACnCprC,GAAMA,KAGdxuC,KAAK0lD,mBAAqB,WACtB,MAAO1lD,MAAKm4E,WAAWzyB,sBAE3B1lD,KAAKy4E,WAAa,SAAS9oC,GACvB,GAAI3vC,KAAK2vC,SAAWA,EAApB,CAGA,GAAIoqC,GAAa/5E,KAAK2vC,OACtB,IAAIoqC,EAAY,CACZ/5E,KAAK2vC,QAAQl7B,oBAAoB,SAAUzU,KAAKg6E,mBAChDh6E,KAAK2vC,QAAQl7B,oBAAoB,aAAczU,KAAKypE,eACpDzpE,KAAK2vC,QAAQl7B,oBAAoB,kBAAmBzU,KAAKi6E,oBACzDj6E,KAAK2vC,QAAQl7B,oBAAoB,gBAAiBzU,KAAKk6E,kBACvDl6E,KAAK2vC,QAAQl7B,oBAAoB,kBAAmBzU,KAAKm6E,oBACzDn6E,KAAK2vC,QAAQl7B,oBAAoB,iBAAkBzU,KAAKo6E,mBACxDp6E,KAAK2vC,QAAQl7B,oBAAoB,eAAgBzU,KAAKq6E,eACtDr6E,KAAK2vC,QAAQl7B,oBAAoB,oBAAqBzU,KAAKs6E,sBAC3Dt6E,KAAK2vC,QAAQl7B,oBAAoB,mBAAoBzU,KAAKu6E,qBAC1Dv6E,KAAK2vC,QAAQl7B,oBAAoB,mBAAoBzU,KAAKw6E,qBAC1Dx6E,KAAK2vC,QAAQl7B,oBAAoB,mBAAoBzU,KAAKy6E,qBAC1Dz6E,KAAK2vC,QAAQl7B,oBAAoB,kBAAmBzU,KAAK06E,iBACzD16E,KAAK2vC,QAAQl7B,oBAAoB,kBAAmBzU,KAAK26E,oBACzD36E,KAAK2vC,QAAQl7B,oBAAoB,mBAAoBzU,KAAK46E,oBAE1D,IAAI32E,GAAYjE,KAAK2vC,QAAQ5nC,cAC7B9D,GAAUwQ,oBAAoB,eAAgBzU,KAAK06E,iBACnDz2E,EAAUwQ,oBAAoB,kBAAmBzU,KAAK66E,oBAG1D76E,KAAK2vC,QAAUA,EACXA,GACA3vC,KAAKg6E,kBAAoBh6E,KAAK86E,iBAAiB3qD,KAAKnwB,MACpD2vC,EAAQzlC,iBAAiB,SAAUlK,KAAKg6E,mBACxCh6E,KAAKssC,SAASmsC,WAAW9oC,GAEzB3vC,KAAKypE,cAAgBzpE,KAAK+6E,aAAa5qD,KAAKnwB,MAC5C2vC,EAAQzlC,iBAAiB,aAAclK,KAAKypE,eAE5CzpE,KAAKi6E,mBAAqBj6E,KAAKg7E,kBAAkB7qD,KAAKnwB,MACtD2vC,EAAQzlC,iBAAiB,kBAAmBlK,KAAKi6E,oBAEjDj6E,KAAKk6E,iBAAmBl6E,KAAKssC,SAAS2uC,gBAAgB9qD,KAAKnwB,KAAKssC,UAChEqD,EAAQzlC,iBAAiB,gBAAiBlK,KAAKk6E,kBAE/Cl6E,KAAKm6E,mBAAqBn6E,KAAKk7E,kBAAkB/qD,KAAKnwB,MACtD2vC,EAAQzlC,iBAAiB,kBAAmBlK,KAAKm6E,oBAEjDn6E,KAAKo6E,kBAAoBp6E,KAAKm7E,iBAAiBhrD,KAAKnwB,MACpD2vC,EAAQzlC,iBAAiB,iBAAkBlK,KAAKo6E,mBAEhDp6E,KAAKq6E,cAAgBr6E,KAAKolE,aAAaj1C,KAAKnwB,MAC5C2vC,EAAQzlC,iBAAiB,aAAclK,KAAKq6E,eAE5Cr6E,KAAKs6E,qBAAuBt6E,KAAKo7E,oBAAoBjrD,KAAKnwB,MAC1DA,KAAK2vC,QAAQzlC,iBAAiB,oBAAqBlK,KAAKs6E,sBAExDt6E,KAAKu6E,oBAAsBv6E,KAAKq7E,mBAAmBlrD,KAAKnwB,MACxDA,KAAK2vC,QAAQzlC,iBAAiB,mBAAoBlK,KAAKu6E,qBAEvDv6E,KAAKw6E,oBAAsBx6E,KAAKs7E,mBAAmBnrD,KAAKnwB,MACxDA,KAAK2vC,QAAQzlC,iBAAiB,mBAAoBlK,KAAKw6E,qBAEvDx6E,KAAKy6E,oBAAsBz6E,KAAKu7E,mBAAmBprD,KAAKnwB,MACxDA,KAAK2vC,QAAQzlC,iBAAiB,mBAAoBlK,KAAKy6E,qBAEvDz6E,KAAK06E,gBAAkB16E,KAAKw7E,eAAerrD,KAAKnwB,MAChDA,KAAK2vC,QAAQzlC,iBAAiB,kBAAmBlK,KAAK06E,iBAEtD16E,KAAK26E,mBAAqB36E,KAAKy7E,kBAAkBtrD,KAAKnwB,MACtDA,KAAK2vC,QAAQzlC,iBAAiB,kBAAmBlK,KAAK26E,oBAEtD36E,KAAK46E,oBAAsB56E,KAAK07E,mBAAmBvrD,KAAKnwB,MACxDA,KAAK2vC,QAAQzlC,iBAAiB,mBAAoBlK,KAAK46E,qBAEvD56E,KAAKiE,UAAY0rC,EAAQ5nC,eACzB/H,KAAKiE,UAAUiG,iBAAiB,eAAgBlK,KAAK06E,iBAErD16E,KAAK66E,mBAAqB76E,KAAK27E,kBAAkBxrD,KAAKnwB,MACtDA,KAAKiE,UAAUiG,iBAAiB,kBAAmBlK,KAAK66E,oBAExD76E,KAAK+6E,eAEL/6E,KAAK04C,iBAAmB,EACxB14C,KAAKw7E,iBACLx7E,KAAK04C,iBAAmB,EAExB14C,KAAKy7E,oBACLz7E,KAAK07E,qBACL17E,KAAK27E,oBACL37E,KAAKo7E,sBACLp7E,KAAKq7E,qBACLr7E,KAAKs7E,qBACLt7E,KAAKu7E,qBACLv7E,KAAK2vC,QAAQ29B,kBAAoBttE,KAAKssC,SAASkhC,kBAC/CxtE,KAAKssC,SAASsvC,eAEd57E,KAAKiE,UAAY,KACjBjE,KAAKssC,SAASmsC,WAAW9oC,IAG7B3vC,KAAK0+C,QAAQ,iBACT/O,QAASA,EACToqC,WAAYA,IAGhBA,GAAcA,EAAWr7B,QAAQ,gBAAiBm9B,UAAW77E,OAC7D2vC,GAAWA,EAAQ+O,QAAQ,gBAAiBv2C,OAAQnI,SAExDA,KAAKmN,WAAa,WACd,MAAOnN,MAAK2vC,SAEhB3vC,KAAKiO,SAAW,SAAS6hC,EAAKgsC,GAU1B,MATA97E,MAAK2vC,QAAQxW,IAAIlrB,SAAS6hC,GAErBgsC,EAEiB,GAAbA,EACL97E,KAAK01E,kBACa,IAAboG,GACL97E,KAAKu1E,oBAJLv1E,KAAKsuC,YAMFwB,GAEX9vC,KAAK0F,SAAW,WACZ,MAAO1F,MAAK2vC,QAAQjqC,YAExB1F,KAAK+H,aAAe,WAChB,MAAO/H,MAAKiE,WAEhBjE,KAAK8N,OAAS,SAASC,GACnB/N,KAAKssC,SAASyvC,SAAShuE,IAE3B/N,KAAKgN,SAAW,SAASV,EAAOkiC,GAC5BxuC,KAAKssC,SAASt/B,SAASV,EAAOkiC,IAElCxuC,KAAKg8E,SAAW,WACZ,MAAOh8E,MAAKssC,SAAS0vC,YAEzBh8E,KAAK6zC,SAAW,SAAS/mC,GACrB9M,KAAKssC,SAASuH,SAAS/mC,IAE3B9M,KAAKy0C,WAAa,SAAS3nC,GACvB9M,KAAKssC,SAASmI,WAAW3nC,IAE7B9M,KAAKi8E,YAAc,WACf,MAAOj8E,MAAK2hD,UAAU,aACnB59C,EAAI22B,cAAc16B,KAAKY,UAAW,aAEzCZ,KAAKkN,YAAc,SAAS0/D,GACxB5sE,KAAKuhD,UAAU,WAAYqrB,IAG/B5sE,KAAKk8E,mBAAqB,WAMtB,GALIl8E,KAAK2vC,QAAQwsC,oBACbn8E,KAAK2vC,QAAQ+K,aAAa16C,KAAK2vC,QAAQwsC,mBACvCn8E,KAAK2vC,QAAQwsC,kBAAoB,OAGjCn8E,KAAKo8E,kBAAT,CAGA,GAAIzvD,GAAO3sB,IACXA,MAAKo8E,mBAAoB,EACzBvzE,WAAW,WACP8jB,EAAKyvD,mBAAoB,CACzB,IAAIzsC,GAAUhjB,EAAKgjB,OACnB,IAAKA,GAAYA,EAAQ21B,YAAzB,CACA,GAAIzwC,GAAM8a,EAAQ2yB,oBAAoB31C,EAAK0vD,oBAC3C,IAAIxnD,EACA,GAAIhtB,GAAQ,GAAIs+C,GAAMtxB,EAAIud,IAAKvd,EAAI0d,OAAQ1d,EAAIud,IAAKvd,EAAI0d,OAAS,OAC9D,IAAI5C,EAAQ23B,MAAMgV,YACrB,GAAIz0E,GAAQ8nC,EAAQ23B,MAAMgV,YAAY3vD,EAAKgjB,QAE3C9nC,KACA8nC,EAAQwsC,kBAAoBxsC,EAAQsK,UAAUpyC,EAAO,cAAe,WACzE,MAEP7H,KAAKu8E,eAAiB,WAClB,IAAIv8E,KAAKw8E,qBAAT,CAEA,GAAI7vD,GAAO3sB,IACXA,MAAKw8E,sBAAuB,EAC5B3zE,WAAW,WACP8jB,EAAK6vD,sBAAuB,CAE5B,IAAI7sC,GAAUhjB,EAAKgjB,OACnB,IAAKA,GAAYA,EAAQ21B,YAAzB,CAEA,GAAIzwC,GAAMlI,EAAK0vD,oBACX7kB,EAAW,GAAIlD,GAAc3nC,EAAKgjB,QAAS9a,EAAIud,IAAKvd,EAAI0d,QACxD7lB,EAAQ8qC,EAAStC,iBAErB,KAAKxoC,GAA4C,KAAnCA,EAAM1hB,KAAKsE,QAAQ,YAG7B,MAFAqgC,GAAQ+K,aAAa/K,EAAQ8sC,oBAC7B9sC,EAAQ8sC,cAAgB,KAI5B,IAAIljD,GAAM7M,EAAMvnB,MACZs9D,EAAQ,EACRia,EAAYllB,EAASzC,cAEzB,IAAuB,KAAnB2nB,EAAUv3E,OACV,EACIu3E,GAAYhwD,EACZA,EAAQ8qC,EAASxC,cAEbtoC,GAASA,EAAMvnB,QAAUo0B,GAA0C,KAAnC7M,EAAM1hB,KAAKsE,QAAQ,cAC3B,MAApBotE,EAAUv3E,MACVs9D,IAC2B,OAApBia,EAAUv3E,OACjBs9D,WAIH/1C,GAAS+1C,GAAS,OACxB,CACH,EACI/1C,GAAQgwD,EACRA,EAAYllB,EAASzC,eAEjBroC,GAASA,EAAMvnB,QAAUo0B,GAA0C,KAAnC7M,EAAM1hB,KAAKsE,QAAQ,cAC3B,MAApBotE,EAAUv3E,MACVs9D,IAC2B,OAApBia,EAAUv3E,OACjBs9D,WAGHia,GAAsB,GAATja,EACtBjL,GAASxC,cAGb,IAAKtoC,EAGD,MAFAijB,GAAQ+K,aAAa/K,EAAQ8sC,oBAC7B9sC,EAAQ8sC,cAAgB,KAI5B,IAAIrqC,GAAMolB,EAASrC,qBACf5iB,EAASilB,EAASpC,wBAClBvtD,EAAQ,GAAIs+C,GAAM/T,EAAKG,EAAQH,EAAKG,EAAO7lB,EAAMvnB,MAAM/D,OACvDuuC,GAAQ8sC,eAAyF,IAAxE50E,EAAM6+C,aAAa/W,EAAQs1B,aAAat1B,EAAQ8sC,eAAe50E,SACxF8nC,EAAQ+K,aAAa/K,EAAQ8sC,eAC7B9sC,EAAQ8sC,cAAgB,MAGxB50E,IAAU8nC,EAAQ8sC,gBAClB9sC,EAAQ8sC,cAAgB9sC,EAAQsK,UAAUpyC,EAAO,cAAe,WACrE,MAEP7H,KAAK4F,MAAQ,WACT,GAAIwlC,GAAQprC,IACZ6I,YAAW,WACPuiC,EAAM2F,UAAUnrC,UAEpB5F,KAAK+wC,UAAUnrC,SAEnB5F,KAAKitC,UAAY,WACb,MAAOjtC,MAAK+wC,UAAU9D,aAE1BjtC,KAAKyF,KAAO,WACRzF,KAAK+wC,UAAUtrC,QAEnBzF,KAAKotC,QAAU,SAASxlB,GAChB5nB,KAAK28E,aAET38E,KAAK28E,YAAa,EAClB38E,KAAKssC,SAASswC,aACd58E,KAAKssC,SAASuwC,iBACd78E,KAAKuwC,MAAM,QAAS3oB,KAExB5nB,KAAKmtC,OAAS,SAASvlB,GACd5nB,KAAK28E,aAEV38E,KAAK28E,YAAa,EAClB38E,KAAKssC,SAASwwC,aACd98E,KAAKssC,SAASywC,gBACd/8E,KAAKuwC,MAAM,OAAQ3oB,KAGvB5nB,KAAKg9E,cAAgB,WACjBh9E,KAAKssC,SAAS2wC,gBAElBj9E,KAAK86E,iBAAmB,SAASlzD,GAC7B,GAEI0/B,GAFAiS,EAAQ3xC,EAAEplB,KACVqF,EAAQ0xD,EAAM1xD,KAIdy/C,GADAz/C,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,KAAuB,eAAhBmnB,EAAM/yD,QAA2C,eAAhB+yD,EAAM/yD,OACjEqB,EAAMwqC,IAAID,IAEVgkB,EAAAA,EACdp2D,KAAKssC,SAAS4wC,YAAYr1E,EAAM8sB,MAAMyd,IAAKkV,EAAStnD,KAAK2vC,QAAQoxB,cAEjE/gE,KAAK0+C,QAAQ,SAAU92B,GACvB5nB,KAAKg9E,gBACLh9E,KAAKm9E,8BAGTn9E,KAAKg7E,kBAAoB,SAASpzD,GAC9B,GAAI2kC,GAAO3kC,EAAEplB,IACbxC,MAAKssC,SAAS4wC,YAAY3wB,EAAKp5C,MAAOo5C,EAAKhjB,OAI/CvpC,KAAKy7E,kBAAoB,WACrBz7E,KAAKssC,SAAS8wC,UAAUp9E,KAAK2vC,QAAQ06B,iBAGzCrqE,KAAK07E,mBAAqB,WACtB17E,KAAKssC,SAAS+wC,UAAUr9E,KAAK2vC,QAAQ66B,kBAEzCxqE,KAAKw7E,eAAiB,WAClBx7E,KAAKg9E,gBAEAh9E,KAAK04C,iBACN14C,KAAKssC,SAAS2H,uBAGlBj0C,KAAKk8E,qBACLl8E,KAAKu8E,iBACLv8E,KAAKm9E,6BACLn9E,KAAK0+C,QAAQ,oBAGjB1+C,KAAKm9E,2BAA6B,WAC9B,GAEIvoE,GAFA+6B,EAAU3vC,KAAKmN,YAUnB,IAPInN,KAAKs9E,uBACwB,QAAxBt9E,KAAKu9E,iBAA8Bv9E,KAAKiE,UAAU8wC,gBACnDngC,EAAY5U,KAAKq8E,sBACjBr8E,KAAKssC,SAASkxC,WAA0C,IAA7Bx9E,KAAK2vC,QAAQiH,aAAuB52C,KAAKssC,SAASmxC,UAAY,IACzF7oE,GAAY,IAGhB+6B,EAAQ+tC,uBAAyB9oE,EACjC+6B,EAAQ+K,aAAa/K,EAAQ+tC,qBAAqBr9E,IAClDsvC,EAAQ+tC,qBAAuB,SAC5B,KAAK/tC,EAAQ+tC,sBAAwB9oE,EAAW,CACnD,GAAI/M,GAAQ,GAAIs+C,GAAMvxC,EAAUw9B,IAAKx9B,EAAU29B,OAAQ39B,EAAUw9B,IAAKgkB,EAAAA,EACtEvuD,GAAMxH,GAAKsvC,EAAQsK,UAAUpyC,EAAO,kBAAmB,cACvD8nC,EAAQ+tC,qBAAuB71E,MACxB+M,KACP+6B,EAAQ+tC,qBAAqB/oD,MAAMyd,IAAMx9B,EAAUw9B,IACnDzC,EAAQ+tC,qBAAqBrrC,IAAID,IAAMx9B,EAAUw9B,IACjDzC,EAAQ+tC,qBAAqB/oD,MAAM4d,OAAS39B,EAAU29B,OACtD5C,EAAQ+O,QAAQ,sBAIxB1+C,KAAK27E,kBAAoB,SAAS/zD,GAC9B,GAAI+nB,GAAU3vC,KAAK2vC,OAOnB,IALIA,EAAQguC,kBACRhuC,EAAQ+K,aAAa/K,EAAQguC,kBAEjChuC,EAAQguC,iBAAmB,KAEtB39E,KAAKiE,UAAUgZ,UAKhBjd,KAAKm9E,iCALsB,CAC3B,GAAIt1E,GAAQ7H,KAAKiE,UAAU+rC,WACvBljC,EAAQ9M,KAAKk6C,mBACjBvK,GAAQguC,iBAAmBhuC,EAAQsK,UAAUpyC,EAAO,gBAAiBiF,GAKzE,GAAIkH,GAAKhU,KAAK49E,wBAA0B59E,KAAK69E,8BAC7C79E,MAAK2vC,QAAQ/6B,UAAUZ,GAEvBhU,KAAK0+C,QAAQ,oBAGjB1+C,KAAK69E,6BAA+B,WAChC,GAAIluC,GAAU3vC,KAAK2vC,QAEf1rC,EAAYjE,KAAK8yC,mBACrB,KAAI7uC,EAAUgZ,YAAahZ,EAAU8wC,cAArC,CAGA,GAAI+oC,GAAa75E,EAAU0wB,MAAM4d,OAAS,EACtCwrC,EAAW95E,EAAUouC,IAAIE,OAAS,EAClC3kB,EAAO+hB,EAAQ8U,QAAQxgD,EAAU0wB,MAAMyd,KACvC4rC,EAAWpwD,EAAKxsB,OAChBowE,EAAS5jD,EAAKxJ,UAAU7b,KAAKE,IAAIq1E,EAAY,GACrBv1E,KAAKC,IAAIu1E,EAAUC,GAC/C,MAAKF,GAAc,GAAK,UAAUzuE,KAAKmiE,IACtBwM,GAAZD,GAAwB,UAAU1uE,KAAKmiE,MAG5CA,EAAS5jD,EAAKxJ,UAAUngB,EAAU0wB,MAAM4d,OAAQtuC,EAAUouC,IAAIE,QACzD,YAAYljC,KAAKmiE,IAAtB,CAGA,GAAIx9D,GAAKhU,KAAKq4E,QAAQ5G,iBAClBU,WAAW,EACXE,eAAe,EACfb,OAAQA,GAGZ,OAAOx9D,MAIXhU,KAAKo7E,oBAAsB,WACvBp7E,KAAKssC,SAAS2xC,sBAGlBj+E,KAAKq7E,mBAAqB,WACtBr7E,KAAKssC,SAAS4xC,qBAIlBl+E,KAAKs7E,mBAAqB,WACtBt7E,KAAKssC,SAAS6xC,qBAGlBn+E,KAAKu7E,mBAAqB,WACtBv7E,KAAKssC,SAASu8B,eAAe7oE,KAAK2vC,QAAQo5B,mBAI9C/oE,KAAK+6E,aAAe,SAASnzD,GACzB5nB,KAAKssC,SAAS8xC,aACdp+E,KAAKuwC,MAAM,aAAc3oB,IAI7B5nB,KAAKk7E,kBAAoB,WACrBl7E,KAAKssC,SAASsvC,cAGlB57E,KAAKm7E,iBAAmB,WACpBn7E,KAAKssC,SAASyvC,UAAS,IAI3B/7E,KAAKolE,aAAe,WAChBplE,KAAKm9E,6BACLn9E,KAAKssC,SAASsvC,cAElB57E,KAAKq+E,gBAAkB,WACnB,MAAOr+E,MAAK2vC,QAAQsM,aAAaj8C,KAAK8yC,sBAE1C9yC,KAAKsvC,YAAc,WACf,GAAInpC,GAAOnG,KAAKq+E,iBAEhB,OADAr+E,MAAK0+C,QAAQ,OAAQv4C,GACdA,GAEXnG,KAAKwvC,OAAS,WACVxvC,KAAKglD,SAAS/wC,KAAK,OAAQjU,OAE/BA,KAAKuvC,MAAQ,WACTvvC,KAAKglD,SAAS/wC,KAAK,MAAOjU,OAE9BA,KAAK2uC,QAAU,SAASxoC,GACpB,IAAInG,KAAK0vC,UAAT,CAEA,GAAI9nB,IAAKzhB,KAAMA,EACfnG,MAAK0+C,QAAQ,QAAS92B,GACtB5nB,KAAKg1B,OAAOpN,EAAEzhB,MAAM,KAGxBnG,KAAK4uC,YAAc,SAASxR,EAASztB,GACjC,MAAO3P,MAAKglD,SAAS/wC,KAAKmpB,EAASp9B,KAAM2P,IAE7C3P,KAAKg1B,OAAS,SAAS7uB,EAAM4mC,GACzB,GAAI4C,GAAU3vC,KAAK2vC,QACfjuC,EAAOiuC,EAAQu6B,UACfhsD,EAASle,KAAKq8E,mBAElB,IAAIr8E,KAAKs+E,yBAA2BvxC,EAAQ,CACxC,GAAIwxC,GAAY78E,EAAK+2D,gBAAgB9oB,EAAQ8sB,SAASv+C,EAAOk0B,KAAM,YAAapyC,KAAM2vC,EAASxpC,EAC3Fo4E,KACIp4E,IAASo4E,EAAUp4E,OACnBnG,KAAK2vC,QAAQu3B,iBAAkB,EAC/BlnE,KAAKw+E,mBAAoB,GAE7Br4E,EAAOo4E,EAAUp4E,MAOzB,GAFY,KAARA,IACAA,EAAOnG,KAAK2vC,QAAQy3B,gBACnBpnE,KAAKiE,UAAUgZ,WAKf,GAAIjd,KAAK2vC,QAAQi4B,eAAgB,CAClC,GAAI//D,GAAQ,GAAIs+C,GAAMoB,WAAWrpC,EAAQA,EACzCrW,GAAMwqC,IAAIE,QAAUpsC,EAAK/E,OACzBpB,KAAK2vC,QAAQ1a,OAAOptB,QARO,CAC3B,GAAIA,GAAQ7H,KAAK8yC,mBACjB50B,GAASle,KAAK2vC,QAAQ1a,OAAOptB,GAC7B7H,KAAK6vC,iBAQT,GAAY,MAAR1pC,GAAwB,QAARA,EAAgB,CAChC,GAAIynB,GAAO+hB,EAAQ8U,QAAQvmC,EAAOk0B,IAClC,IAAIl0B,EAAOq0B,OAAS3kB,EAAKlpB,OAAO,QAAS,CACrC,GAAI+5E,GAAI7wD,EAAKoB,OAAO9Q,EAAOq0B,QAAQ7tC,OAAO,OAC1CirC,GAAQxW,IAAIu9B,aAAax4C,EAAOk0B,IAAKl0B,EAAOq0B,OAAQr0B,EAAOq0B,OAASksC,IAG5Ez+E,KAAK6vC,gBAEL,IAAIlb,GAAQzW,EAAOq0B,OACfmsC,EAAY/uC,EAAQ8sB,SAASv+C,EAAOk0B,KACpCxkB,EAAO+hB,EAAQ8U,QAAQvmC,EAAOk0B,KAC9BusC,EAAgBj9E,EAAKq2D,aAAa2mB,EAAW9wD,EAAMznB,EAC7CwpC,GAAQ3a,OAAO9W,EAAQ/X,EAgBjC,IAdIo4E,GAAaA,EAAUt6E,WAEnBjE,KAAKiE,UAAU8nC,kBADe,GAA9BwyC,EAAUt6E,UAAU7C,OAEhB,GAAI+kD,GAAMjoC,EAAOk0B,IAAKzd,EAAQ4pD,EAAUt6E,UAAU,GACxCia,EAAOk0B,IAAKzd,EAAQ4pD,EAAUt6E,UAAU,IAGlD,GAAIkiD,GAAMjoC,EAAOk0B,IAAMmsC,EAAUt6E,UAAU,GACjCs6E,EAAUt6E,UAAU,GACpBia,EAAOk0B,IAAMmsC,EAAUt6E,UAAU,GACjCs6E,EAAUt6E,UAAU,KAItC0rC,EAAQoY,cAAcsS,UAAUl0D,GAAO,CACvC,GAAIy4E,GAAal9E,EAAKk2D,kBAAkB8mB,EAAW9wD,EAAKM,MAAM,EAAGhQ,EAAOq0B,QAAS5C,EAAQy3B,eAEzFz3B,GAAQ3a,QAAQod,IAAKl0B,EAAOk0B,IAAI,EAAGG,OAAQ,GAAIqsC,GAE/CD,GACAj9E,EAAKs2D,YAAY0mB,EAAW/uC,EAASzxB,EAAOk0B,MAGpDpyC,KAAK6uC,YAAc,SAAS1oC,GACxBnG,KAAKm4E,WAAWtpC,YAAY1oC,IAGhCnG,KAAKyvC,aAAe,SAAS7nB,EAAGyd,EAAQh6B,GACpCrL,KAAKm4E,WAAW1oC,aAAa7nB,EAAGyd,EAAQh6B,IAE5CrL,KAAK0nE,aAAe,SAASC,GACzB3nE,KAAK2vC,QAAQ+3B,aAAaC,IAE9B3nE,KAAK4nE,aAAe,WAChB,MAAO5nE,MAAK2vC,QAAQi4B,gBAExB5nE,KAAK6nE,gBAAkB,WACnB7nE,KAAK2vC,QAAQk4B,mBAEjB7nE,KAAK6+E,eAAiB,SAASvpC,GAC3Bt1C,KAAKuhD,UAAU,cAAejM,IAElCt1C,KAAK8+E,eAAiB,WAClB,MAAO9+E,MAAK2hD,UAAU,gBAE1B3hD,KAAK++E,aAAe,SAASn7B,GACzB5jD,KAAKuhD,UAAU,YAAaqC,IAEhC5jD,KAAK28C,aAAe,WAChB,MAAO38C,MAAK2hD,UAAU,cAE1B3hD,KAAKg/E,kBAAoB,SAASlvC,GAC9B9vC,KAAKuhD,UAAU,iBAAkBzR,IAErC9vC,KAAKk6C,kBAAoB,WACrB,MAAOl6C,MAAK2hD,UAAU,mBAE1B3hD,KAAKi/E,uBAAyB,SAASC,GACnCl/E,KAAKuhD,UAAU,sBAAuB29B,IAE1Cl/E,KAAKm/E,uBAAyB,WAC1B,MAAOn/E,MAAK2hD,UAAU,wBAE1B3hD,KAAKo/E,uBAAyB,SAASF,GACnCl/E,KAAKuhD,UAAU,sBAAuB29B,IAG1Cl/E,KAAKq/E,uBAAyB,WAC1B,MAAOr/E,MAAK2hD,UAAU,wBAE1B3hD,KAAKs/E,yBAA2B,SAASJ,GACrCl/E,KAAKuhD,UAAU,wBAAyB29B,IAE5Cl/E,KAAKu/E,yBAA2B,WAC5B,MAAOv/E,MAAK49E,wBAGhB59E,KAAKw/E,kBAAoB,SAASC,GAC9Bz/E,KAAKssC,SAASkzC,kBAAkBC,IAGpCz/E,KAAK0/E,kBAAoB,WACrB,MAAO1/E,MAAKssC,SAASozC,qBAEzB1/E,KAAK2/E,kBAAoB,SAASC,GAC9B5/E,KAAKssC,SAASqzC,kBAAkBC,IAEpC5/E,KAAK6/E,kBAAoB,WACrB,MAAO7/E,MAAKssC,SAASuzC,qBAGzB7/E,KAAK8/E,uBAAyB,SAASt4D,GACnCxnB,KAAKssC,SAASwzC,uBAAuBt4D,IAGzCxnB,KAAK+/E,uBAAyB,WAC1B,MAAO//E,MAAKssC,SAASyzC,0BAEzB//E,KAAKiN,mBAAqB,SAAS+yE,GAC/BhgF,KAAKssC,SAASr/B,mBAAmB+yE,IAErChgF,KAAKigF,mBAAqB,WACtB,MAAOjgF,MAAKssC,SAAS2zC,sBAEzBjgF,KAAKkgF,qBAAuB,SAASF,GACjChgF,KAAKssC,SAAS4zC,qBAAqBF,IAEvChgF,KAAKmgF,qBAAuB,WACxB,MAAOngF,MAAKssC,SAAS6zC,wBAEzBngF,KAAKowC,YAAc,SAASC,GACxBrwC,KAAKuhD,UAAU,WAAYlR,IAE/BrwC,KAAK66C,YAAc,WACf,MAAO76C,MAAK2hD,UAAU,aAE1B3hD,KAAKogF,qBAAuB,SAAUC,GAClCrgF,KAAKuhD,UAAU,oBAAqB8+B,IAExCrgF,KAAKs+E,qBAAuB,WACxB,MAAOt+E,MAAK2hD,UAAU,sBAE1B3hD,KAAKsgF,yBAA2B,SAAUD,GACtCrgF,KAAKuhD,UAAU,wBAAyB8+B,IAE5CrgF,KAAKugF,yBAA2B,WAC5B,MAAOvgF,MAAK2hD,UAAU,0BAE1B3hD,KAAKwgF,mBAAqB,SAAS58D,GAC/B5jB,KAAKuhD,UAAU,kBAAmB39B,IAGtC5jB,KAAKygF,mBAAqB,WACtB,MAAOzgF,MAAK2hD,UAAU,oBAG1B3hD,KAAK0gF,mBAAqB,SAASC,GAC/B3gF,KAAKuhD,UAAU,kBAAmBo/B,IAGtC3gF,KAAK4gF,mBAAqB,WACtB,MAAO5gF,MAAK2hD,UAAU,oBAE1B3hD,KAAKi1B,OAAS,SAASutC,GACfxiE,KAAKiE,UAAUgZ,YACJ,QAAPulD,EACAxiE,KAAKiE,UAAUslD,aAEfvpD,KAAKiE,UAAUolD,cAGvB,IAAIxhD,GAAQ7H,KAAK8yC,mBACjB,IAAI9yC,KAAKs+E,uBAAwB,CAC7B,GAAI3uC,GAAU3vC,KAAK2vC,QACfviB,EAAQuiB,EAAQ8sB,SAAS50D,EAAM8sB,MAAMyd,KACrCyuC,EAAYlxC,EAAQu6B,UAAUzR,gBAAgBrrC,EAAO,WAAYptB,KAAM2vC,EAAS9nC,EAEpF,IAAyB,IAArBA,EAAMwqC,IAAIE,OAAc,CACxB,GAAIpsC,GAAOwpC,EAAQsM,aAAap0C,EAChC,IAA6B,MAAzB1B,EAAKA,EAAK/E,OAAS,GAAY,CAC/B,GAAIwsB,GAAO+hB,EAAQ8U,QAAQ58C,EAAMwqC,IAAID,IACjC,SAAQ/iC,KAAKue,KACb/lB,EAAMwqC,IAAIE,OAAS3kB,EAAKxsB,SAIhCy/E,IACAh5E,EAAQg5E,GAGhB7gF,KAAK2vC,QAAQ1a,OAAOptB,GACpB7H,KAAK6vC,kBAET7vC,KAAKi3E,gBAAkB,WACfj3E,KAAKiE,UAAUgZ,WACfjd,KAAKiE,UAAUgmD,kBAEnBjqD,KAAK2vC,QAAQ1a,OAAOj1B,KAAK8yC,qBACzB9yC,KAAK6vC,kBAET7vC,KAAKg3E,eAAiB,WACdh3E,KAAKiE,UAAUgZ,WACfjd,KAAKiE,UAAUkmD,iBAEnBnqD,KAAK2vC,QAAQ1a,OAAOj1B,KAAK8yC,qBACzB9yC,KAAK6vC,kBAET7vC,KAAK82E,kBAAoB,WACjB92E,KAAKiE,UAAUgZ,WACfjd,KAAKiE,UAAUwlD,kBAEnBzpD,KAAK2vC,QAAQ1a,OAAOj1B,KAAK8yC,qBACzB9yC,KAAK6vC,kBAET7vC,KAAK+2E,gBAAkB,WACf/2E,KAAKiE,UAAUgZ,WACfjd,KAAKiE,UAAU0lD,eAEnB,IAAI9hD,GAAQ7H,KAAK8yC,mBACbjrC,GAAM8sB,MAAM4d,QAAU1qC,EAAMwqC,IAAIE,QAAU1qC,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,MACvEvqC,EAAMwqC,IAAIE,OAAS,EACnB1qC,EAAMwqC,IAAID,OAGdpyC,KAAK2vC,QAAQ1a,OAAOptB,GACpB7H,KAAK6vC,kBAET7vC,KAAKo3E,UAAY,WACRp3E,KAAKiE,UAAUgZ,YAChBjd,KAAK2vC,QAAQ1a,OAAOj1B,KAAK8yC,qBACzB9yC,KAAK6vC,iBAGT,IAAI3xB,GAASle,KAAKq8E,mBAClBr8E,MAAKg1B,OAAO,MACZh1B,KAAK24C,qBAAqBz6B,IAE9Ble,KAAKq3E,iBAAmB,WACpB,GAAKr3E,KAAKiE,UAAUgZ,UAApB,CAIA,GAAIiB,GAASle,KAAKq8E,oBACd9pC,EAASr0B,EAAOq0B,MACpB,IAAe,IAAXA,EAAJ,CAGA,GACIuuC,GAAMj5E,EADN+lB,EAAO5tB,KAAK2vC,QAAQ8U,QAAQvmC,EAAOk0B,IAEnCG,GAAS3kB,EAAKxsB,QACd0/E,EAAOlzD,EAAKrf,OAAOgkC,GAAU3kB,EAAKrf,OAAOgkC,EAAO,GAChD1qC,EAAQ,GAAIs+C,GAAMjoC,EAAOk0B,IAAKG,EAAO,EAAGr0B,EAAOk0B,IAAKG,EAAO,KAG3DuuC,EAAOlzD,EAAKrf,OAAOgkC,EAAO,GAAK3kB,EAAKrf,OAAOgkC,EAAO,GAClD1qC,EAAQ,GAAIs+C,GAAMjoC,EAAOk0B,IAAKG,EAAO,EAAGr0B,EAAOk0B,IAAKG,IAExDvyC,KAAK2vC,QAAQxrB,QAAQtc,EAAOi5E,MAEhC9gF,KAAKsb,YAAc,WACf,GAAIylE,GAAgB/gF,KAAK8yC,mBACrB9yC,MAAKiE,UAAUgZ,WACfjd,KAAKiE,UAAUomD,YAGnB,IAAIxiD,GAAQ7H,KAAK8yC,oBACb3sC,EAAOnG,KAAK2vC,QAAQsM,aAAap0C,EACrC7H,MAAK2vC,QAAQxrB,QAAQtc,EAAO1B,EAAKmV,eACjCtb,KAAKiE,UAAU8nC,kBAAkBg1C,IAErC/gF,KAAKogD,YAAc,WACf,GAAI2gC,GAAgB/gF,KAAK8yC,mBACrB9yC,MAAKiE,UAAUgZ,WACfjd,KAAKiE,UAAUomD,YAGnB,IAAIxiD,GAAQ7H,KAAK8yC,oBACb3sC,EAAOnG,KAAK2vC,QAAQsM,aAAap0C,EACrC7H,MAAK2vC,QAAQxrB,QAAQtc,EAAO1B,EAAKi6C,eACjCpgD,KAAKiE,UAAU8nC,kBAAkBg1C,IAErC/gF,KAAKq3D,OAAS,WACV,GAAI1nB,GAAU3vC,KAAK2vC,QACf9nC,EAAQ7H,KAAK8yC,mBAEjB,IAAIjrC,EAAM8sB,MAAMyd,IAAMvqC,EAAMwqC,IAAID,IAAK,CACjC,GAAIma,GAAOvsD,KAAKghF,kBAEhB,YADArxC,GAAQ48B,WAAWhgB,EAAKp5C,MAAOo5C,EAAKhjB,KAAM,KAEvC,GAAI1hC,EAAM8sB,MAAM4d,OAAS1qC,EAAMwqC,IAAIE,OAAQ,CAC9C,GAAIpsC,GAAOwpC,EAAQsM,aAAap0C,EAChC,KAAK,QAAQwH,KAAKlJ,GAAO,CACrB,GAAIomD,GAAOvsD,KAAKghF,kBAEhB,YADArxC,GAAQ48B,WAAWhgB,EAAKp5C,MAAOo5C,EAAKhjB,KAAM,MAKlD,GAAI3b,GAAO+hB,EAAQ8U,QAAQ58C,EAAM8sB,MAAMyd,KACnChX,EAAWvzB,EAAM8sB,MACjBi4C,EAAOj9B,EAAQqb,aACfzY,EAAS5C,EAAQmgC,uBAAuB10C,EAASgX,IAAKhX,EAASmX;AAEnE,GAAIvyC,KAAK2vC,QAAQ4mB,iBACb,GAAIr5C,GAAS0vD,EAAOr6B,EAASq6B,EACzBJ,EAAenhC,EAAK3B,aAAa,IAAKxsB,OACvC,CAEH,IADA,GAAIA,GAAQq1B,EAASq6B,EACc,KAA5Bh/C,EAAK/lB,EAAM8sB,MAAM4d,SAAkBr1B,GACtCrV,EAAM8sB,MAAM4d,SACZr1B,GAEJld,MAAKiE,UAAU8nC,kBAAkBlkC,GACjC2kE,EAAe,IAEnB,MAAOxsE,MAAKg1B,OAAOw3C,IAEvBxsE,KAAKm3E,YAAc,WACf,GAAI5qB,GAAOvsD,KAAKghF,kBAChBhhF,MAAK2vC,QAAQ48B,WAAWhgB,EAAKp5C,MAAOo5C,EAAKhjB,KAAM,MAEnDvpC,KAAKk3E,aAAe,WAChB,GAAIjzE,GAAYjE,KAAK2vC,QAAQ5nC,cAC7B/H,MAAK2vC,QAAQ88B,YAAYxoE,EAAU+rC,aAEvChwC,KAAK02E,UAAY,WACb,GAAInqB,GAAOvsD,KAAKghF,mBACZrxC,EAAU3vC,KAAK2vC,QAEfjhB,IACJ,KAAKprB,EAAIipD,EAAKp5C,MAAO7P,GAAKipD,EAAKhjB,KAAMjmC,IACjCorB,EAAM1f,KAAK2gC,EAAQ8U,QAAQnhD,GAE/BorB,GAAM5X,KAAK,SAASrH,EAAGC,GACnB,MAAID,GAAE6L,cAAgB5L,EAAE4L,cAAsB,GAC1C7L,EAAE6L,cAAgB5L,EAAE4L,cAAsB,EACvC,GAIX,KAAK,GADDqxD,GAAc,GAAIxmB,GAAM,EAAG,EAAG,EAAG,GAC5B7iD,EAAIipD,EAAKp5C,MAAO7P,GAAKipD,EAAKhjB,KAAMjmC,IAAK,CAC1C,GAAIsqB,GAAO+hB,EAAQ8U,QAAQnhD,EAC3BqpE,GAAYh4C,MAAMyd,IAAM9uC,EACxBqpE,EAAYt6B,IAAID,IAAM9uC,EACtBqpE,EAAYt6B,IAAIE,OAAS3kB,EAAKxsB,OAC9BuuC,EAAQxrB,QAAQwoD,EAAaj+C,EAAMprB,EAAEipD,EAAKp5C,UAGlDnT,KAAK+1D,mBAAqB,WACtB,GAAI3oC,GAAQptB,KAAK2vC,QAAQ8sB,SAASz8D,KAAKq8E,oBAAoBjqC,KACvDma,EAAOvsD,KAAKghF,kBAChBhhF,MAAK2vC,QAAQu6B,UAAUnU,mBAAmB3oC,EAAOptB,KAAK2vC,QAAS4c,EAAKp5C,MAAOo5C,EAAKhjB,OAGpFvpC,KAAKs3D,mBAAqB,WACtB,GAAIp5C,GAASle,KAAKq8E,oBACdjvD,EAAQptB,KAAK2vC,QAAQ8sB,SAASv+C,EAAOk0B,KACrCvqC,EAAQ7H,KAAK8yC,mBACjB9yC,MAAK2vC,QAAQu6B,UAAU5S,mBAAmBlqC,EAAOptB,KAAK2vC,QAAS9nC,EAAOqW,IAE1Ele,KAAKihF,YAAc,SAAS7uC,EAAKG,GAC7B,GAAI2uC,GAAY,2BAChBA,GAAUtuD,UAAY,CAGtB,KADA,GAAIkrB,GAAI99C,KAAK2vC,QAAQ8U,QAAQrS,GACtB8uC,EAAUtuD,UAAY2f,GAAQ,CACjC,GAAI/xC,GAAI0gF,EAAUjtE,KAAK6pC,EACvB,IAAGt9C,EAAE2Q,OAASohC,GAAU/xC,EAAE2Q,MAAM3Q,EAAE,GAAGY,QAAUmxC,EAAO,CAClD,GAAI4uC,IACAh8E,MAAO3E,EAAE,GACTm0B,MAAOn0B,EAAE2Q,MACTkhC,IAAK7xC,EAAE2Q,MAAM3Q,EAAE,GAAGY,OAEtB,OAAO+/E,IAGf,MAAO,OAEXnhF,KAAK22E,aAAe,SAASyK,GACzB,GAAIhvC,GAAMpyC,KAAKiE,UAAUskD,YAAYnW,IACjCG,EAASvyC,KAAKiE,UAAUskD,YAAYhW,OACpC8uC,EAAY,GAAIl7B,GAAM/T,EAAKG,EAAO,EAAGH,EAAKG,GAE1C9xC,EAAIT,KAAK2vC,QAAQsM,aAAaolC,EAClC,KAAKp9D,MAAM/P,WAAWzT,KAAO6gF,SAAS7gF,GAAI,CACtC,GAAI8gF,GAAKvhF,KAAKihF,YAAY7uC,EAAKG,EAC/B,IAAIgvC,EAAI,CACJ,GAAIC,GAAKD,EAAGp8E,MAAMmK,QAAQ,MAAQ,EAAIiyE,EAAG5sD,MAAQ4sD,EAAGp8E,MAAMmK,QAAQ,KAAO,EAAIiyE,EAAGlvC,IAC5EovC,EAAWF,EAAG5sD,MAAQ4sD,EAAGp8E,MAAM/D,OAASogF,EAExCzkE,EAAI7I,WAAWqtE,EAAGp8E,MACtB4X,IAAKxU,KAAK+6B,IAAI,GAAIm+C,GAIdL,GADDI,IAAOD,EAAGlvC,KAAgBmvC,EAATjvC,EACNhqC,KAAK+6B,IAAI,GAAIi+C,EAAGlvC,IAAME,EAAS,GAE/BhqC,KAAK+6B,IAAI,GAAIi+C,EAAGlvC,IAAME,GAGpCx1B,GAAKqkE,EACLrkE,GAAKxU,KAAK+6B,IAAI,GAAIm+C,EAClB,IAAIC,GAAM3kE,EAAE4kE,QAAQF,GAChBG,EAAe,GAAIz7B,GAAM/T,EAAKmvC,EAAG5sD,MAAOyd,EAAKmvC,EAAGlvC,IACpDryC,MAAK2vC,QAAQxrB,QAAQy9D,EAAcF,GACnC1hF,KAAK6oD,aAAazW,EAAK7pC,KAAKE,IAAI84E,EAAG5sD,MAAO,EAAG4d,EAASmvC,EAAItgF,OAASmgF,EAAGp8E,MAAM/D,YAKxFpB,KAAKi7D,YAAc,WACf,GACIpzD,GADA0kD,EAAOvsD,KAAKghF,kBAGZn5E,GADe,IAAf0kD,EAAKp5C,OAAeo5C,EAAKhjB,KAAK,EAAIvpC,KAAK2vC,QAAQiH,YACvC,GAAIuP,GAAMoG,EAAKp5C,MAAO,EAAGo5C,EAAKhjB,KAAK,EAAG,GAEtC,GAAI4c,GACRoG,EAAKp5C,MAAM,EAAGnT,KAAK2vC,QAAQ8U,QAAQ8H,EAAKp5C,MAAM,GAAG/R,OACjDmrD,EAAKhjB,KAAMvpC,KAAK2vC,QAAQ8U,QAAQ8H,EAAKhjB,MAAMnoC,QAEnDpB,KAAK2vC,QAAQ1a,OAAOptB,GACpB7H,KAAK6vC,kBAGT7vC,KAAKy2E,mBAAqB,WACtB,GAAInkE,GAAMtS,KAAKiE,UACXk1B,EAAMn5B,KAAK2vC,QACX9nC,EAAQyK,EAAI09B,WACZvG,EAAUn3B,EAAIw2C,aAClB,IAAIjhD,EAAMoV,UAAW,CACjB,GAAIm1B,GAAMvqC,EAAM8sB,MAAMyd,GACtBjZ,GAAI+zC,eAAe96B,EAAKA,OACrB,CACH,GAAI8sB,GAAQz1B,EAAU5hC,EAAM8sB,MAAQ9sB,EAAMwqC,IACtCwvC,EAAW1oD,EAAInE,OAAOkqC,EAAO/lC,EAAI8iB,aAAap0C,IAAQ,EAC1DA,GAAM8sB,MAAQuqC,EACdr3D,EAAMwqC,IAAMwvC,EAEZvvE,EAAIy5B,kBAAkBlkC,EAAO4hC,KAGrCzpC,KAAKitE,cAAgB,WACjBjtE,KAAK6sE,WAAW,SAASxlB,EAAUC,GAC/B,MAAOtnD,MAAK2vC,QAAQs9B,cAAc5lB,EAAUC,MAGpDtnD,KAAKgtE,YAAc,WACfhtE,KAAK6sE,WAAW,SAASxlB,EAAUC,GAC/B,MAAOtnD,MAAK2vC,QAAQq9B,YAAY3lB,EAAUC,MAGlDtnD,KAAKw8C,SAAW,SAAS30C,EAAOokE,EAAYniC,GACxC,MAAO9pC,MAAK2vC,QAAQ6M,SAAS30C,EAAOokE,EAAYniC,IAEpD9pC,KAAK42E,YAAc,WACf52E,KAAK6sE,WAAW,SAASxlB,EAAUC,GAE/B,MADAtnD,MAAK2vC,QAAQu9B,eAAe7lB,EAAUC,GAC/B,KAGftnD,KAAK62E,cAAgB,WACjB72E,KAAK6sE,WAAW,SAASxlB,EAAUC,GAC/B,MAAOtnD,MAAK2vC,QAAQu9B,eAAe7lB,EAAUC,MAGrDtnD,KAAK6sE,WAAa,SAAS7jB,GACvB,GAAI/kD,GAAYjE,KAAKiE,SACrB,KAAKA,EAAUkvC,mBAAqBnzC,KAAK8hF,uBAAwB,CAC7D,GAAIj6E,GAAQ5D,EAAU81C,kBAClBwS,EAAOvsD,KAAKghF,iBAAiBn5E,GAC7Bk6E,EAAa/4B,EAAMzoD,KAAKP,KAAMusD,EAAKp5C,MAAOo5C,EAAKhjB,KACnD1hC,GAAMggD,OAAOk6B,EAAY,GACzB99E,EAAU02C,kBAAkB9yC,OACzB,CACH,GAAIolD,GAAShpD,EAAUmpD,UAAUH,MACjChpD,GAAUmpD,UAAU3H,OAAOzlD,KAAK2vC,QAEhC,KAAK,GAAIrsC,GAAI2pD,EAAO7rD,OAAQkC,KAAO,CAK/B,IAJA,GAAI0+E,GAAa1+E,EACbipD,EAAOU,EAAO3pD,GAAGkkD,eACjBje,EAAOgjB,EAAKla,IAAID,IAChBj/B,EAAQo5C,EAAK53B,MAAMyd,IAChB9uC,MACHipD,EAAOU,EAAO3pD,GAAGkkD,eACbr0C,EAAQo5C,EAAKla,IAAID,KAAO,IACxBj/B,EAAQo5C,EAAKla,IAAID,GAIzB9uC,IAGA,KADA,GAAIy+E,GAAa/4B,EAAMzoD,KAAKP,KAAMmT,EAAOo2B,GAClCy4C,GAAc1+E,GACjB2pD,EAAO+0B,GAAYn6B,OAAOk6B,EAAY,GACtCC,IAGR/9E,EAAU02C,kBAAkB12C,EAAUgpD,OAAO,IAC7ChpD,EAAUmpD,UAAU5H,OAAOxlD,KAAK2vC,WAGxC3vC,KAAKghF,iBAAmB,WACpB,GAAIn5E,GAAQ7H,KAAK8yC,oBAAoB0U,cAErC,QACIr0C,MAAOnT,KAAK2vC,QAAQkyB,gBAAgBh6D,EAAM8sB,MAAMyd,KAChD7I,KAAMvpC,KAAK2vC,QAAQiyB,cAAc/5D,EAAMwqC,IAAID,OAInDpyC,KAAKouC,mBAAqB,SAASjoC,GAC/BnG,KAAKssC,SAAS21C,gBAAgBjiF,KAAKq8E,sBAGvCr8E,KAAKmuC,oBAAsB,SAAShoC,GAChCnG,KAAKssC,SAAS41C,mBAAmB/7E,IAGrCnG,KAAKiuC,iBAAmB,WACpBjuC,KAAKssC,SAAS61C,mBAElBniF,KAAKoiF,mBAAqB,WACtB,MAAOpiF,MAAKssC,SAAS81C,sBAEzBpiF,KAAKqiF,kBAAoB,WACrB,MAAOriF,MAAKssC,SAAS+1C,qBAEzBriF,KAAKsiF,aAAe,SAASlwC,GACzB,MAAQA,IAAOpyC,KAAKoiF,sBAAwBhwC,GAAOpyC,KAAKqiF,qBAE5DriF,KAAKuiF,kBAAoB,SAASnwC,GAC9B,MAAQA,IAAOpyC,KAAKssC,SAASk2C,2BAA6BpwC,GAAOpyC,KAAKssC,SAASm2C,0BAEnFziF,KAAK0iF,oBAAsB,WACvB,MAAO1iF,MAAKssC,SAASq2C,qBAAuB3iF,KAAKssC,SAASs2C,kBAAoB,GAGlF5iF,KAAK6iF,YAAc,SAASrgB,EAAK92D,GAC7B,GAAI4gC,GAAWtsC,KAAKssC,SAChB5pC,EAAS1C,KAAKssC,SAAS2M,YACvBsT,EAAOiW,EAAMj6D,KAAK+qB,MAAM5wB,EAAOsE,OAAStE,EAAOs2C,WAEnDh5C,MAAK04C,kBACDhtC,KAAW,EACX1L,KAAKiE,UAAU8kD,eAAe,WAC1B/oD,KAAK8qD,aAAayB,EAAM,KAErB7gD,KAAW,IAClB1L,KAAKiE,UAAU6mD,aAAayB,EAAM,GAClCvsD,KAAKiE,UAAU4rC,kBAEnB7vC,KAAK04C,iBAEL,IAAIrxC,GAAYilC,EAASjlC,SAEzBilC,GAASiJ,SAAS,EAAGgX,EAAO7pD,EAAOs2C,YACrB,MAAVttC,GACA4gC,EAAS2H,qBAAqB,KAAM,IAExC3H,EAAS+sC,iBAAiBhyE,IAE9BrH,KAAKk2E,eAAiB,WAClBl2E,KAAK6iF,YAAY,GAAG,IAExB7iF,KAAKq2E,aAAe,WAChBr2E,KAAK6iF,YAAY,IAAI,IAEzB7iF,KAAKo2E,aAAe,WACjBp2E,KAAK6iF,YAAY,GAAG,IAEvB7iF,KAAKu2E,WAAa,WACdv2E,KAAK6iF,YAAY,IAAI,IAEzB7iF,KAAKm2E,eAAiB,WAClBn2E,KAAK6iF,YAAY,IAErB7iF,KAAKs2E,aAAe,WAChBt2E,KAAK6iF,YAAY,KAErB7iF,KAAK8iF,YAAc,SAAS1wC,GACxBpyC,KAAKssC,SAASw2C,YAAY1wC,IAE9BpyC,KAAK+iF,aAAe,SAASn1D,EAAMo1D,EAAQt6E,EAASR,GAChDlI,KAAKssC,SAASy2C,aAAan1D,EAAMo1D,EAAQt6E,EAASR,IAEtDlI,KAAK+0E,gBAAkB,WACnB,GAAIltE,GAAQ7H,KAAK8yC,oBACbje,GACAud,IAAK7pC,KAAK+qB,MAAMzrB,EAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,IAAMvqC,EAAM8sB,MAAMyd,KAAO,GACtEG,OAAQhqC,KAAK+qB,MAAMzrB,EAAM8sB,MAAM4d,QAAU1qC,EAAMwqC,IAAIE,OAAS1qC,EAAM8sB,MAAM4d,QAAU,GAEtFvyC,MAAKssC,SAAS22C,YAAYpuD,EAAK,KAEnC70B,KAAKq8E,kBAAoB,WACrB,MAAOr8E,MAAKiE,UAAUskD,aAE1BvoD,KAAKkjF,wBAA0B,WAC3B,MAAOljF,MAAK2vC,QAAQgY,yBAAyB3nD,KAAKq8E,sBAEtDr8E,KAAK8yC,kBAAoB,WACrB,MAAO9yC,MAAKiE,UAAU+rC,YAE1BhwC,KAAKsuC,UAAY,WACbtuC,KAAK04C,iBAAmB,EACxB14C,KAAKiE,UAAUqqC,YACftuC,KAAK04C,iBAAmB,GAE5B14C,KAAK6vC,eAAiB,WAClB7vC,KAAKiE,UAAU4rC,kBAEnB7vC,KAAK6oD,aAAe,SAASzW,EAAKG,GAC9BvyC,KAAKiE,UAAU4kD,aAAazW,EAAKG,IAErCvyC,KAAK24C,qBAAuB,SAAS9jB,GACjC70B,KAAKiE,UAAU00C,qBAAqB9jB,IAExC70B,KAAKw2E,eAAiB,SAAS9qE,EAAQnG,GACnC,GAAI2Y,GAASle,KAAKq8E,oBACd7kB,EAAW,GAAIlD,GAAct0D,KAAK2vC,QAASzxB,EAAOk0B,IAAKl0B,EAAOq0B,QAC9DmqC,EAAYllB,EAAStC,kBACrBxoC,EAAQgwD,GAAallB,EAASxC,aAElC,IAAKtoC,EAAL,CACA,GAAIy2D,GAIAC,EAHAC,GAAQ,EACR5gB,KACAn/D,EAAI4a,EAAOq0B,OAAS7lB,EAAMiI,MAE1B2uD,GACAlf,IAAK,IACLC,IAAK,IACL36C,IAAK,IACLD,IAAK,IACLN,IAAK,IACLC,IAAK,IAGT,GAAG,CACC,GAAIsD,EAAMvnB,MAAMoK,MAAM,gBAClB,KAAOjM,EAAIopB,EAAMvnB,MAAM/D,SAAWiiF,EAAO//E,IACrC,GAAKggF,EAAS52D,EAAMvnB,MAAM7B,IAU1B,OANA8/E,EAAcE,EAAS52D,EAAMvnB,MAAM7B,IAAM,IAAMopB,EAAM1hB,KAAKmZ,QAAQ,SAAU,UAExEF,MAAMw+C,EAAM2gB,MACZ3gB,EAAM2gB,GAAe,GAGjB12D,EAAMvnB,MAAM7B,IAChB,IAAK,IACL,IAAK,IACL,IAAK,IACDm/D,EAAM2gB,IACN,MACJ,KAAK,IACL,IAAK,IACL,IAAK,IACD3gB,EAAM2gB,KAEqB,KAAvB3gB,EAAM2gB,KACND,EAAY,UACZE,GAAQ,QAMnB32D,IAA4C,KAAnCA,EAAM1hB,KAAKsE,QAAQ,cAC7B2U,MAAMw+C,EAAM/1C,EAAMvnB,UAClBs9D,EAAM/1C,EAAMvnB,OAAS,GAGD,MAApBu3E,EAAUv3E,MACVs9D,EAAM/1C,EAAMvnB,SAEa,OAApBu3E,EAAUv3E,OACfs9D,EAAM/1C,EAAMvnB,SAGW,KAAvBs9D,EAAM/1C,EAAMvnB,SACZg+E,EAAY,MACZE,GAAQ,GAIXA,KACD3G,EAAYhwD,EACZA,EAAQ8qC,EAASxC,cACjB1xD,EAAI,SAEHopB,IAAU22D,EACnB,IAAKF,EAAL,CAGA,GAAIt7E,GAAOgtB,CACX,IAAkB,YAAdsuD,EACAt7E,EAAQ7H,KAAK2vC,QAAQkF,gBAAgB32B,GAChCrW,IACDA,EAAQ,GAAIs+C,GACRqR,EAASrC,qBACTqC,EAASpC,wBAA0B9xD,EAAI,EACvCk0D,EAASrC,qBACTqC,EAASpC,wBAA0B9xD,EAAI,GAE3CuxB,EAAMhtB,EAAM8sB,OACRpvB,GAAUsvB,EAAIud,MAAQl0B,EAAOk0B,KAAO7pC,KAAKK,IAAIisB,EAAI0d,OAASr0B,EAAOq0B,QAAU,KAC3E1qC,EAAQ7H,KAAK2vC,QAAQkF,gBAAgBhgB,SAG5C,IAAkB,QAAdsuD,EAAqB,CAC1B,IAAIz2D,GAA4C,KAAnCA,EAAM1hB,KAAKsE,QAAQ,YAG5B,MAFA,IAAIiqB,GAAM7M,EAAMvnB,KAUpB,IANA0C,EAAQ,GAAIs+C,GACRqR,EAASrC,qBACTqC,EAASpC,wBAA0B,EACnCoC,EAASrC,qBACTqC,EAASpC,wBAA0B,GAEU,IAA7CvtD,EAAM4+C,QAAQvoC,EAAOk0B,IAAKl0B,EAAOq0B,QAAe,CAChD8wC,GAAQ,CACR,GACI32D,GAAQgwD,EACRA,EAAYllB,EAASzC,eAEjB2nB,IAC4C,KAAxCA,EAAU1xE,KAAKsE,QAAQ,cACvBzH,EAAMkL,OAAOykD,EAASrC,qBAAsBqC,EAASpC,wBAA0B,GAG/E1oC,EAAMvnB,QAAUo0B,GAA0C,KAAnC7M,EAAM1hB,KAAKsE,QAAQ,cAClB,MAApBotE,EAAUv3E,MACVs9D,EAAMlpC,KAEmB,OAApBmjD,EAAUv3E,OACfs9D,EAAMlpC,KAGS,IAAfkpC,EAAMlpC,KACN8pD,GAAQ,WAGf3G,IAAc2G,GAEvB32D,GAASA,EAAM1hB,KAAKsE,QAAQ,cAC5BulB,EAAMhtB,EAAM8sB,MACRE,EAAIud,KAAOl0B,EAAOk0B,KAAO7pC,KAAKK,IAAIisB,EAAI0d,OAASr0B,EAAOq0B,QAAU,IAChE1d,EAAMhtB,EAAMwqC,MAIxBxd,EAAMhtB,GAASA,EAAMqW,QAAU2W,EAC3BA,IACInpB,EACI7D,GAAStC,EACTvF,KAAKiE,UAAUgsC,SAASpoC,GACjBA,GAASA,EAAM2+C,QAAQxmD,KAAK8yC,qBACnC9yC,KAAK6vC,iBAEL7vC,KAAKiE,UAAU4zC,SAAShjB,EAAIud,IAAKvd,EAAI0d,QAGzCvyC,KAAKiE,UAAUyS,OAAOme,EAAIud,IAAKvd,EAAI0d,YAI/CvyC,KAAKi1E,SAAW,SAASsO,EAAYhxC,EAAQ7pC,GACzC1I,KAAKiE,UAAU4rC,iBACf7vC,KAAK2vC,QAAQ6xB,QAAQpvB,IAAKmxC,EAAa,EAAGhxC,OAAQA,GAAU,IAE5DvyC,KAAK04C,iBAAmB,EACxB14C,KAAK83E,qBAAuB93E,KAAK83E,sBACjC93E,KAAK6oD,aAAa06B,EAAa,EAAGhxC,GAAU,GAC5CvyC,KAAK04C,iBAAmB,EAEnB14C,KAAKuiF,kBAAkBgB,EAAa,IACrCvjF,KAAK+iF,aAAaQ,EAAa,GAAG,EAAM76E,IAEhD1I,KAAKwjF,WAAa,SAASpxC,EAAKG,GAC5BvyC,KAAKiE,UAAUyS,OAAO07B,EAAKG,IAE/BvyC,KAAKw1E,WAAa,SAASC,GACvB,GAAIz1E,KAAKiE,UAAU8wC,gBAAkB/0C,KAAKiE,UAAU6kD,cAAe,CAC/D,GAAIjd,GAAiB7rC,KAAKiE,UAAUmf,OAAOolC,aAC3C,OAAOxoD,MAAK24C,qBAAqB9M,GAErC7rC,KAAKiE,UAAU4rC,iBACf7vC,KAAKiE,UAAU6mD,cAAc2qB,GAAS,GAAI,IAE9Cz1E,KAAK21E,aAAe,SAASF,GACzB,GAAIz1E,KAAKiE,UAAU8wC,eAAiB/0C,KAAKiE,UAAU6kD,cAAe,CAC9D,GAAIhd,GAAe9rC,KAAKiE,UAAUmf,OAAOolC,aACzC,OAAOxoD,MAAK24C,qBAAqB7M,GAErC9rC,KAAKiE,UAAU4rC,iBACf7vC,KAAKiE,UAAU6mD,aAAa2qB,GAAS,EAAG,IAE5Cz1E,KAAK81E,aAAe,SAASL,GACzB,GAAKz1E,KAAKiE,UAAUgZ,UAMhB,IADAw4D,EAAQA,GAAS,EACVA,KACHz1E,KAAKiE,UAAUulD,qBAPQ,CAC3B,GAAI3d,GAAiB7rC,KAAK8yC,oBAAoBne,KAC9C30B,MAAK24C,qBAAqB9M,GAQ9B7rC,KAAK6vC,kBAET7vC,KAAKi2E,cAAgB,SAASR,GAC1B,GAAKz1E,KAAKiE,UAAUgZ,UAMhB,IADAw4D,EAAQA,GAAS,EACVA,KACHz1E,KAAKiE,UAAUqlD,sBAPQ,CAC3B,GAAIxd,GAAe9rC,KAAK8yC,oBAAoBT,GAC5CryC,MAAK24C,qBAAqB7M,GAQ9B9rC,KAAK6vC,kBAET7vC,KAAK61E,kBAAoB,WACrB71E,KAAKiE,UAAUylD,sBACf1pD,KAAK6vC,kBAET7vC,KAAKg2E,gBAAkB,WACnBh2E,KAAKiE,UAAU2lD,oBACf5pD,KAAK6vC,kBAET7vC,KAAK01E,gBAAkB,WACnB11E,KAAKiE,UAAU6lD,oBACf9pD,KAAK6vC,kBAET7vC,KAAKu1E,kBAAoB,WACrBv1E,KAAKiE,UAAU+lD,sBACfhqD,KAAK6vC,kBAET7vC,KAAK+1E,kBAAoB,WACrB/1E,KAAKiE,UAAUimD,sBACflqD,KAAK6vC,kBAET7vC,KAAK41E,iBAAmB,WACpB51E,KAAKiE,UAAUmmD,qBACfpqD,KAAK6vC,kBAET7vC,KAAKmkB,QAAU,SAASytD,EAAa/wE,GAC7BA,GACAb,KAAKq4E,QAAQx2E,IAAIhB,EAErB,IAAIgH,GAAQ7H,KAAKq4E,QAAQhH,KAAKrxE,KAAK2vC,SAC/B8zC,EAAW,CACf,OAAK57E,IAGD7H,KAAK0jF,YAAY77E,EAAO+pE,KACxB6R,EAAW,GAED,OAAV57E,IACA7H,KAAKiE,UAAU8nC,kBAAkBlkC,GACjC7H,KAAKssC,SAAS8sC,wBAAwBvxE,EAAM8sB,MAAO9sB,EAAMwqC,MAGtDoxC,GAVIA,GAYfzjF,KAAK2jF,WAAa,SAAS/R,EAAa/wE,GAChCA,GACAb,KAAKq4E,QAAQx2E,IAAIhB,EAGrB,IAAIosD,GAASjtD,KAAKq4E,QAAQ9G,QAAQvxE,KAAK2vC,SACnC8zC,EAAW,CACf,KAAKx2B,EAAO7rD,OACR,MAAOqiF,EAEXzjF,MAAK04C,iBAAmB,CAExB,IAAIz0C,GAAYjE,KAAK8yC,mBACrB9yC,MAAKiE,UAAUyS,OAAO,EAAG,EAEzB,KAAK,GAAIpT,GAAI2pD,EAAO7rD,OAAS,EAAGkC,GAAK,IAAKA,EACnCtD,KAAK0jF,YAAYz2B,EAAO3pD,GAAIsuE,IAC3B6R,GAOR,OAHAzjF,MAAKiE,UAAU8nC,kBAAkB9nC,GACjCjE,KAAK04C,iBAAmB,EAEjB+qC,GAGXzjF,KAAK0jF,YAAc,SAAS77E,EAAO+pE,GAC/B,GAAI/rE,GAAQ7F,KAAK2vC,QAAQsM,aAAap0C,EAEtC,OADA+pE,GAAc5xE,KAAKq4E,QAAQl0D,QAAQte,EAAO+rE,GACtB,OAAhBA,GACA/pE,EAAMwqC,IAAMryC,KAAK2vC,QAAQxrB,QAAQtc,EAAO+pE,GACjC/pE,GAEA,MAGf7H,KAAK4jF,qBAAuB,WACxB,MAAO5jF,MAAKq4E,QAAQ72B,cAExBxhD,KAAKqxE,KAAO,SAASG,EAAQ3wE,EAAS6H,GAC7B7H,IACDA,MAEiB,gBAAV2wE,IAAsBA,YAAkBvhE,QAC/CpP,EAAQ2wE,OAASA,EACK,gBAAVA,IACZh1C,EAAI35B,MAAMhC,EAAS2wE,EAEvB,IAAI3pE,GAAQ7H,KAAKiE,UAAU+rC,UACL,OAAlBnvC,EAAQ2wE,SACRA,EAASxxE,KAAK2vC,QAAQsM,aAAap0C,IAC5B7H,KAAKq4E,QAAQ32B,SAAS8vB,OACxBA,IACD3pE,EAAQ7H,KAAK2vC,QAAQmF,aAAajtC,EAAM8sB,MAAMyd,IAAKvqC,EAAM8sB,MAAM4d,QAC/Di/B,EAASxxE,KAAK2vC,QAAQsM,aAAap0C,IAEvC7H,KAAKq4E,QAAQx2E,KAAK2vE,OAAQA,KAG9BxxE,KAAKq4E,QAAQx2E,IAAIhB,GACZA,EAAQ8zB,OACT30B,KAAKq4E,QAAQx2E,KAAK8yB,MAAO9sB,GAE7B,IAAIg8E,GAAW7jF,KAAKq4E,QAAQhH,KAAKrxE,KAAK2vC,QACtC,OAAI9uC,GAAQijF,cACDD,EACPA,GACA7jF,KAAK+jF,YAAYF,EAAUn7E,GACpBm7E,IAEPhjF,EAAQixE,UACRjqE,EAAM8sB,MAAQ9sB,EAAMwqC,IAEpBxqC,EAAMwqC,IAAMxqC,EAAM8sB,UACtB30B,MAAKiE,UAAUgsC,SAASpoC,KAE5B7H,KAAKm1E,SAAW,SAASt0E,EAAS6H,GAC9B1I,KAAKqxE,MAAMkB,aAAa,EAAMT,WAAW,GAAQjxE,EAAS6H,IAE9D1I,KAAKq1E,aAAe,SAASx0E,EAAS6H,GAClC1I,KAAKqxE,KAAKxwE,GAAU0xE,aAAa,EAAMT,WAAW,GAAOppE,IAG7D1I,KAAK+jF,YAAc,SAASl8E,EAAOa,GAC/B1I,KAAK04C,iBAAmB,EACxB14C,KAAK2vC,QAAQ6xB,OAAO35D,GACpB7H,KAAKiE,UAAU8nC,kBAAkBlkC,GACjC7H,KAAK04C,iBAAmB,CAExB,IAAIrxC,GAAYrH,KAAKssC,SAASjlC,SAC9BrH,MAAKssC,SAAS8sC,wBAAwBvxE,EAAM8sB,MAAO9sB,EAAMwqC,IAAK,IAC1D3pC,KAAY,GACZ1I,KAAKssC,SAAS+sC,iBAAiBhyE,IAEvCrH,KAAKsK,KAAO,WACRtK,KAAK04C,kBACL14C,KAAK2vC,QAAQi3B,iBAAiBt8D,OAC9BtK,KAAK04C,kBACL14C,KAAKssC,SAAS2H,qBAAqB,KAAM,KAE7Cj0C,KAAKwK,KAAO,WACRxK,KAAK04C,kBACL14C,KAAK2vC,QAAQi3B,iBAAiBp8D,OAC9BxK,KAAK04C,kBACL14C,KAAKssC,SAAS2H,qBAAqB,KAAM,KAE7Cj0C,KAAKgxE,QAAU,WACXhxE,KAAKssC,SAAS0kC,UACdhxE,KAAK0+C,QAAQ,UAAW1+C,MACpBA,KAAK2vC,SACL3vC,KAAK2vC,QAAQqhC,WAGrBhxE,KAAKgkF,4BAA8B,SAASpY,GACxC,GAAKA,EAAL,CAEA,GAAIn7D,GACAkc,EAAO3sB,KACPikF,GAAe,CACdjkF,MAAKkkF,gBACNlkF,KAAKkkF,cAAgBj7E,SAASC,cAAc,OAChD,IAAIi7E,GAAenkF,KAAKkkF,aACxBC,GAAar3E,MAAMyjB,QAAU,oBAC7BvwB,KAAKY,UAAUgV,aAAauuE,EAAcnkF,KAAKY,UAAUkS,WACzD,IAAIsxE,GAAoBpkF,KAAK4N,GAAG,kBAAmB,WAC/Cq2E,GAAe,IAEfI,EAAiBrkF,KAAKssC,SAAS1+B,GAAG,eAAgB,WAC9Cq2E,IACAxzE,EAAOkc,EAAK2f,SAAS1rC,UAAU8P,2BAEnC4zE,EAAgBtkF,KAAKssC,SAAS1+B,GAAG,cAAe,WAChD,GAAIq2E,GAAgBxzE,IAASkc,EAAKsgB,aAC3BtgB,EAAK5hB,WAAa4hB,EAAK5hB,UAAUkiC,aACtC,CACE,GAAIX,GAAW3f,EAAK2f,SAChBzX,EAAMyX,EAAS6N,aAAaoqC,UAC5B7hF,EAAS4pC,EAAS2M,YAClBnyC,EAAM+tB,EAAI/tB,IAAMpE,EAAOioC,MAEvBs5C,GADApvD,EAAI/tB,KAAO,GAAKA,EAAM2J,EAAK3J,IAAM,GAClB,EACR+tB,EAAI/tB,IAAMpE,EAAOsE,QACxB6tB,EAAI/tB,IAAM2J,EAAK3J,IAAMpE,EAAOs2C,WAAatrC,OAAOmZ,aACjC,EAEA,KAEC,MAAhBo9D,IACAE,EAAar3E,MAAMhG,IAAMA,EAAM,KAC/Bq9E,EAAar3E,MAAM6D,KAAOkkB,EAAIlkB,KAAO,KACrCwzE,EAAar3E,MAAM9F,OAAStE,EAAOs2C,WAAa,KAChDmrC,EAAarP,eAAemP,IAEhCA,EAAexzE,EAAO,OAG9BzQ,MAAKgkF,4BAA8B,SAASpY,GACpCA,UAEG5rE,MAAKgkF,4BACZhkF,KAAKyU,oBAAoB,kBAAmB2vE,GAC5CpkF,KAAKssC,SAAS73B,oBAAoB,cAAe6vE,GACjDtkF,KAAKssC,SAAS73B,oBAAoB,eAAgB4vE,OAK1DrkF,KAAKwkF,kBAAoB,WACrB,GAAI13E,GAAQ9M,KAAKykF,cAAgB,MAC7BC,EAAc1kF,KAAKssC,SAAS6N,YAC3BuqC,KAELA,EAAYC,kBAAkB,SAASt1E,KAAKvC,IAC5C43E,EAAYE,YAAc5kF,KAAK0vC,WAAsB,QAAT5iC,EAC5C/I,EAAI+1B,YAAY4qD,EAAYzxE,QAAS,mBAAoB,OAAO5D,KAAKvC,QAG1EvM,KAAKy3E,EAAOv2E,WAIfiB,EAAOu/C,cAAc+1B,EAAOv2E,UAAW,UACnCojF,gBACIhjF,IAAK,SAASiL,GACV9M,KAAK27E,oBACL37E,KAAK0+C,QAAQ,wBAAyBl8C,KAAMsK,KAEhDo1C,aAAc,QAElB4iC,qBACIjjF,IAAK,WAAY7B,KAAKm9E,8BACtBj7B,cAAc,GAElB6iC,uBACIljF,IAAK,SAASq9E,GAAkBl/E,KAAK66E,sBACrC34B,cAAc,GAElB7R,UACIxuC,IAAK,SAASwuC,GACVrwC,KAAKwkF,qBAETtiC,cAAc,GAElBnF,aACIl7C,IAAK,SAASiuC,GAAO9vC,KAAKwkF,qBAC1Bx1B,QAAS,MAAO,OAAQ,SAAU,QAClC9M,aAAc,OAElBglB,iBACIlY,SAAS,GAAO,EAAM,UACtB9M,cAAc,GAElB8iC,mBAAoB9iC,cAAc,GAClC+iC,uBAAwB/iC,cAAc,GACtCgjC,0BACIrjF,IAAK,SAASiuC,GAAM9vC,KAAKgkF,4BAA4Bl0C,KAGzDq1C,wBAAyB,WACzBC,wBAAyB,WACzBC,oBAAqB,WACrBC,eAAgB,WAChB1F,eAAgB,WAChBI,gBAAiB,WACjBuF,kBAAmB,WACnBC,YAAa,WACbC,gBAAiB,WACjBC,gBAAiB,WACjBC,gBAAiB,WACjBC,WAAY,WACZC,oBAAqB,WACrBC,SAAU,WACVC,WAAY,WACZC,SAAU,WACVC,SAAU,WACVC,cAAe,WACfC,iBAAkB,WAClB75E,MAAO,WAEPq3C,YAAa,gBACbC,UAAW,gBACXC,YAAa,gBACbC,YAAa,gBACbC,oBAAqB,gBAErBmtB,gBAAiB,UACjBvJ,UAAW,UACXxN,YAAa,UACbiP,UAAW,UACX+H,YAAa,UACbpmB,QAAS,UACTre,KAAM,UACN05C,UAAW,UACX1kF,KAAM,YAGV9B,EAAQo4E,OAASA,IAGjB9rE,IAAIpM,OAAO,mBAAmB,UAAU,UAAU,UAAW,SAASswB,EAAUxwB,EAASC,GACzF,YACA,IAAIwmF,GAAc,WACdrmF,KAAK6mE,UAGT,WACI7mE,KAAKinE,QAAU,SAASpmE,GACpB,GAAIw6D,GAASx6D,EAAQ8O,KAAK,EAC1B3P,MAAKsmF,KAAQzlF,EAAQ8O,KAAK,GACtB9O,EAAQ+uD,OAAS5vD,KAAKumF,YACtBvmF,KAAKwmF,eACLnrB,EAASr7D,KAAKymF,WAAW/2D,MAAM/T,OAAO0/C,IAE1Cr7D,KAAKymF,WAAWz3E,KAAKqsD,GACrBr7D,KAAK0mF,cAED1mF,KAAKwmF,aAAe,IACpBxmF,KAAKwmF,aAAeG,KAExB3mF,KAAKwmF,gBAETxmF,KAAKsK,KAAO,SAASghE,GACjB,GAAIjQ,GAASr7D,KAAKymF,WAAW/2D,MACzBk3D,EAAqB,IAQzB,OAPIvrB,KACAurB,EACI5mF,KAAKsmF,KAAKjb,YAAYhQ,EAAQiQ,GAClCtrE,KAAK0mF,WAAW13E,KAAKqsD,GACrBr7D,KAAKwmF,gBAGFI,GAEX5mF,KAAKwK,KAAO,SAAS8gE,GACjB,GAAIjQ,GAASr7D,KAAK0mF,WAAWh3D,MACzBm3D,EAAqB,IAQzB,OAPIxrB,KACAwrB,EACI7mF,KAAKsmF,KAAK5a,YAAYrQ,EAAQiQ,GAClCtrE,KAAKymF,WAAWz3E,KAAKqsD,GACrBr7D,KAAKwmF,gBAGFK,GAEX7mF,KAAK6mE,MAAQ,WACT7mE,KAAKymF,cACLzmF,KAAK0mF,cACL1mF,KAAKwmF,aAAe,GAExBxmF,KAAKumF,QAAU,WACX,MAAOvmF,MAAKymF,WAAWrlF,OAAS,GAEpCpB,KAAK8mF,QAAU,WACX,MAAO9mF,MAAK0mF,WAAWtlF,OAAS,GAEpCpB,KAAK+mF,UAAY,WACb/mF,KAAKwmF,aAAe,GAExBxmF,KAAKgnF,QAAU,WACX,MAA6B,KAAtBhnF,KAAKwmF,gBAGjBjmF,KAAK8lF,EAAY5kF,WAEpB7B,EAAQymF,YAAcA,IAGtBn6E,IAAIpM,OAAO,oBAAoB,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,yBAA0B,SAASswB,EAAUxwB,EAASC,GAC7J,YAEA,IAAIkE,GAAMqsB,EAAS,cACfoM,EAAMpM,EAAS,cACfib,EAAOjb,EAAS,eAChB+tB,EAAe/tB,EAAS,wBAAwB+tB,aAEhD8oC,EAAS,SAASC,GAClBlnF,KAAKiT,QAAUlP,EAAImF,cAAc,OACjClJ,KAAKiT,QAAQ9J,UAAY,6BACzB+9E,EAAS1hF,YAAYxF,KAAKiT,SAC1BjT,KAAKwgF,mBAAmBxgF,KAAKmnF,kBAE7BnnF,KAAKonF,YAAc,EAEnBpnF,KAAKy2C,gBACLz2C,KAAKqnF,mBAAqBrnF,KAAKqnF,mBAAmBl3D,KAAKnwB,MAEvDA,KAAKs3C,YAGT,WAEI9a,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAKy4E,WAAa,SAAS9oC,GACnB3vC,KAAK2vC,SACL3vC,KAAK2vC,QAAQl7B,oBAAoB,SAAUzU,KAAKqnF,oBACpDrnF,KAAK2vC,QAAUA,EACXA,GACAA,EAAQ/hC,GAAG,SAAU5N,KAAKqnF,qBAGlCrnF,KAAK8nE,oBAAsB,SAAS11B,EAAKjpC,GACjCuE,OAAOkC,SACPA,QAAQiyC,MAAQjyC,QAAQiyC,KAAK,8CACjC7hD,KAAK2vC,QAAQm4B,oBAAoB11B,EAAKjpC,IAG1CnJ,KAAK+nE,uBAAyB,SAAS31B,EAAKjpC,GACpCuE,OAAOkC,SACPA,QAAQiyC,MAAQjyC,QAAQiyC,KAAK,iDACjC7hD,KAAK2vC,QAAQo4B,uBAAuB31B,EAAKjpC,IAG7CnJ,KAAK6oE,eAAiB,SAASC,GAC3B9oE,KAAKy2C,eACL,KAAK,GAAInzC,GAAI,EAAGA,EAAIwlE,EAAY1nE,OAAQkC,IAAK,CACzC,GAAIizC,GAAauyB,EAAYxlE,GACzB8uC,EAAMmE,EAAWnE,IACjBk1C,EAAUtnF,KAAKy2C,aAAarE,EAC3Bk1C,KACDA,EAAUtnF,KAAKy2C,aAAarE,IAAQjsC,SAExC,IAAIohF,GAAWhxC,EAAWpwC,IAC1BohF,GAAWA,EAAWl8C,EAAKd,WAAWg9C,GAAYhxC,EAAWR,MAAQ,GAE9B,KAAnCuxC,EAAQnhF,KAAKmJ,QAAQi4E,IACrBD,EAAQnhF,KAAK6I,KAAKu4E,EAEtB,IAAIv8E,GAAOurC,EAAWvrC,IACV,UAARA,EACAs8E,EAAQn+E,UAAY,aACP,WAAR6B,GAA0C,cAArBs8E,EAAQn+E,UAClCm+E,EAAQn+E,UAAY,eACP,QAAR6B,GAAoBs8E,EAAQn+E,YACjCm+E,EAAQn+E,UAAY,eAIhCnJ,KAAKqnF,mBAAqB,SAAUz/D,GAChC,GAAK5nB,KAAKy2C,aAAar1C,OAAvB,CAEA,GAAIm4D,GAAQ3xC,EAAEplB,KACVqF,EAAQ0xD,EAAM1xD,MACdw/C,EAAWx/C,EAAM8sB,MAAMyd,IACvB9kB,EAAMzlB,EAAMwqC,IAAID,IAAMiV,CAC1B,IAAY,IAAR/5B,OACG,IAAoB,cAAhBisC,EAAM/yD,QAA0C,eAAhB+yD,EAAM/yD,OAC7CxG,KAAKy2C,aAAarlC,OAAOi2C,EAAU/5B,EAAM,EAAG,UACzC,CACH,GAAI3d,GAAO,GAAIkU,OAAMyJ,EAAM,EAC3B3d,GAAKgK,QAAQ0tC,EAAU,GACvBrnD,KAAKy2C,aAAarlC,OAAOvB,MAAM7P,KAAKy2C,aAAc9mC,MAI1D3P,KAAK+8D,OAAS,SAASr6D,GAkBnB,IAjBA,GAAIitC,GAAU3vC,KAAK2vC,QACf0X,EAAW3kD,EAAO2kD,SAClBC,EAAU/+C,KAAKC,IAAI9F,EAAO4kD,QAAU5kD,EAAO8kF,aAC3C73C,EAAQiH,YAAc,GACtBqN,EAAOtU,EAAQ4wB,gBAAgBlZ,GAC/B8jB,EAAYlnB,EAAOA,EAAKtvB,MAAMyd,IAAMgkB,EAAAA,EACpC/R,EAAcrkD,KAAKmnF,kBAAoBx3C,EAAQ0U,YAC/CojC,EAAc93C,EAAQm1B,aACtB4iB,EAAc/3C,EAAQo1B,aACtBmM,EAAkBvhC,EAAQg4C,iBAC1BC,EAAiB,EAEjBC,EAAiBl4C,EAAQk4C,gBAAkB7nF,KAAK8nF,UAEhDC,EAAO,KACP52E,EAAQ,GACRihC,EAAMiV,IACG,CAMT,GALIjV,EAAM+4B,IACN/4B,EAAM6R,EAAK5R,IAAID,IAAM,EACrB6R,EAAOtU,EAAQ4wB,gBAAgBnuB,EAAK6R,GACpCknB,EAAYlnB,EAAOA,EAAKtvB,MAAMyd,IAAMgkB,EAAAA,GAEpChkB,EAAMkV,EAAS,CACf,KAAOtnD,KAAKs3C,OAAOl2C,OAAS+P,EAAQ,GAChC42E,EAAO/nF,KAAKs3C,OAAO5nB,MACnB1vB,KAAKiT,QAAQxO,YAAYsjF,EAAK90E,QAElC,OAGJ80E,EAAO/nF,KAAKs3C,SAASnmC,GAChB42E,IACDA,GAAQ90E,QAAS,KAAM+0E,SAAU,KAAMC,WAAY,MACnDF,EAAK90E,QAAUlP,EAAImF,cAAc,OACjC6+E,EAAKC,SAAW/+E,SAASuE,eAAe,IACxCu6E,EAAK90E,QAAQzN,YAAYuiF,EAAKC,UAC9BhoF,KAAKiT,QAAQzN,YAAYuiF,EAAK90E,SAC9BjT,KAAKs3C,OAAOnmC,GAAS42E,EAGzB,IAAI5+E,GAAY,kBACZs+E,GAAYr1C,KACZjpC,GAAas+E,EAAYr1C,IACzBs1C,EAAYt1C,KACZjpC,GAAau+E,EAAYt1C,IACzBpyC,KAAKy2C,aAAarE,KAClBjpC,GAAanJ,KAAKy2C,aAAarE,GAAKjpC,WACpC4+E,EAAK90E,QAAQ9J,WAAaA,IAC1B4+E,EAAK90E,QAAQ9J,UAAYA,EAE7B,IAAInC,GAAS2oC,EAAQggC,aAAav9B,GAAO1vC,EAAOs2C,WAAa,IAI7D,IAHIhyC,GAAU+gF,EAAK90E,QAAQnG,MAAM9F,SAC7B+gF,EAAK90E,QAAQnG,MAAM9F,OAASA,GAE5Bq9C,EAAa,CACb,GAAI5jD,GAAI4jD,EAAYjS,EACX,OAAL3xC,IACAA,EAAI4jD,EAAYjS,GAAOzC,EAAQ+yB,cAActwB,IAGrD,GAAI3xC,EAAG,CACEsnF,EAAKE,aACNF,EAAKE,WAAalkF,EAAImF,cAAc,QACpC6+E,EAAK90E,QAAQzN,YAAYuiF,EAAKE,YAElC,IAAI9+E,GAAY,uBAAyB1I,CAErC0I,IADK,SAAL1I,GAAgB2xC,GAAO+4B,GAAa/4B,EAAM6R,EAAK5R,IAAID,IACtC,cAEA,YACb21C,EAAKE,WAAW9+E,WAAaA,IAC7B4+E,EAAKE,WAAW9+E,UAAYA,EAEhC,IAAInC,GAAStE,EAAOs2C,WAAa,IAC7B+uC,GAAKE,WAAWn7E,MAAM9F,QAAUA,IAChC+gF,EAAKE,WAAWn7E,MAAM9F,OAASA,OAE/B+gF,GAAKE,aACLF,EAAK90E,QAAQxO,YAAYsjF,EAAKE,YAC9BF,EAAKE,WAAa,KAI1B,IAAI9hF,GAAOyhF,EAAiBC,EACtBA,EAAe3lF,QAAQytC,EAASyC,GAChCA,EAAM8+B,CACR/qE,IAAQ4hF,EAAKC,SAASxlF,OACtBulF,EAAKC,SAASxlF,KAAO2D,GAEzBisC,IAGJpyC,KAAKiT,QAAQnG,MAAM9F,OAAStE,EAAOwlF,UAAY,MAE3CloF,KAAKmoF,aAAex4C,EAAQoxB,gBAC5B6mB,EAAiBj4C,EAAQiH,YAAcs6B,EAE3C,IAAIkW,GAAcS,EACZA,EAAe1xC,SAASxG,EAASi4C,EAAgBllF,GACjDklF,EAAet3E,WAAWlP,OAASsB,EAAOw2C,eAE5C3xB,EAAUvnB,KAAKooF,UAAYpoF,KAAKqoF,iBACpCjB,IAAe7/D,EAAQ5W,KAAO4W,EAAQgwB,MAClC6vC,IAAgBpnF,KAAKonF,aAAgBnjE,MAAMmjE,KAC3CpnF,KAAKonF,YAAcA,EACnBpnF,KAAKiT,QAAQnG,MAAMb,MAAQ1D,KAAK+/E,KAAKtoF,KAAKonF,aAAe,KACzDpnF,KAAKuwC,MAAM,oBAAqB62C,KAIxCpnF,KAAKmoF,aAAc,EAEnBnoF,KAAKuoF,kBAAmB,EACxBvoF,KAAK8nF,UAAY,GACjB9nF,KAAKwoF,mBAAqB,SAAS5kE,GAC/B5jB,KAAK8nF,WAAalkE,IACduyB,SAAU,WAAY,MAAO,IAC7Bj0C,QAAS,WAAY,MAAO,MAIpClC,KAAKyoF,mBAAqB,WACtB,MAAOzoF,MAAKuoF,kBAGhBvoF,KAAKmnF,kBAAmB,EACxBnnF,KAAKwgF,mBAAqB,SAAS58D,GAC3BA,EACA7f,EAAI41B,YAAY35B,KAAKiT,QAAS,uBAE9BlP,EAAI61B,eAAe55B,KAAKiT,QAAS,uBAErCjT,KAAKmnF,iBAAmBvjE,EACxB5jB,KAAKooF,SAAW,MAGpBpoF,KAAKygF,mBAAqB,WACtB,MAAOzgF,MAAKmnF,kBAGhBnnF,KAAKqoF,gBAAkB,WACnB,IAAKroF,KAAKiT,QAAQH,WACd,OAAQnC,KAAM,EAAG4mC,MAAO,EAC5B,IAAIzqC,GAAQ/I,EAAI22B,cAAc16B,KAAKiT,QAAQH,WAI3C,OAHA9S,MAAKooF,YACLpoF,KAAKooF,SAASz3E,KAAO8pB,SAAS3tB,EAAMkb,aAAe,GAAK,EACxDhoB,KAAKooF,SAAS7wC,MAAQ9c,SAAS3tB,EAAM47E,eAAiB,EAC/C1oF,KAAKooF,UAGhBpoF,KAAK43C,UAAY,SAASsnB,GACtB,GAAI33C,GAAUvnB,KAAKooF,UAAYpoF,KAAKqoF,kBAChC53E,EAAOzQ,KAAKiT,QAAQvC,uBACxB,OAAIwuD,GAAMvsC,EAAIpL,EAAQ5W,KAAOF,EAAKE,KACvB,UACP3Q,KAAKmnF,kBAAoBjoB,EAAMvsC,EAAIliB,EAAK8mC,MAAQhwB,EAAQgwB,MACjD,cADX,UAILh3C,KAAK0mF,EAAOxlF,WAEf7B,EAAQqnF,OAASA,IAIjB/6E,IAAIpM,OAAO,oBAAoB,UAAU,UAAU,SAAS,YAAY,eAAgB,SAASswB,EAAUxwB,EAASC,GACpH,YAEA,IAAIsmD,GAAQ/1B,EAAS,YAAY+1B,MAC7BpiD,EAAMqsB,EAAS,cAEfu4D,EAAS,SAASzB,GAClBlnF,KAAKiT,QAAUlP,EAAImF,cAAc,OACjClJ,KAAKiT,QAAQ9J,UAAY,6BACzB+9E,EAAS1hF,YAAYxF,KAAKiT,WAG9B,WAEIjT,KAAKooF,SAAW,EAEhBpoF,KAAK4oF,WAAa,SAASrhE,GACvBvnB,KAAKooF,SAAW7gE,GAEpBvnB,KAAKy4E,WAAa,SAAS9oC,GACvB3vC,KAAK2vC,QAAUA,GAGnB3vC,KAAK6oF,WAAa,SAASpgB,GACvBzoE,KAAKyoE,QAAUA,GAGnBzoE,KAAK+8D,OAAS,SAASr6D,GACnB,GAAIA,GAASA,GAAU1C,KAAK0C,MAC5B,IAAKA,EAAL,CAGA1C,KAAK0C,OAASA,CAGd,IAAIqzC,KACJ,KAAK,GAAI5mC,KAAOnP,MAAKyoE,QAAS,CAC1B,GAAIH,GAAStoE,KAAKyoE,QAAQt5D,EAE1B,IAAKm5D,EAAOzgE,MAAZ,CAKA,GAAIA,GAAQygE,EAAOzgE,MAAMu/C,SAAS1kD,EAAO2kD,SAAU3kD,EAAO4kD,QAC1D,KAAIz/C,EAAMoV,UAGV,GADApV,EAAQA,EAAM4/C,cAAcznD,KAAK2vC,SAC7B24B,EAAOh8B,SAAU,CACjB,GAAIxlC,GAAM9G,KAAK8oF,QAAQjhF,EAAM8sB,MAAMyd,IAAK1vC,GACpCiO,EAAO3Q,KAAKooF,SAAWvgF,EAAM8sB,MAAM4d,OAAS7vC,EAAOw2C,cACvDovB,GAAOh8B,SAASyJ,EAAMluC,EAAO8I,EAAM7J,EAAKpE,OAClB,YAAf4lE,EAAOt9D,KACdhL,KAAK+oF,mBAAmBhzC,EAAMluC,EAAOygE,EAAO3L,MAAOj6D,GAC7B,cAAf4lE,EAAOt9D,KACdhL,KAAKgpF,qBAAqBjzC,EAAMluC,EAAOygE,EAAO3L,MAAOj6D,GAC9CmF,EAAMktC,cACM,QAAfuzB,EAAOt9D,KACPhL,KAAKipF,eAAelzC,EAAMluC,EAAOygE,EAAO3L,MAAOj6D,GAE/C1C,KAAKkpF,oBAAoBnzC,EAAMluC,EAAOygE,EAAO3L,MAAOj6D,GAExD1C,KAAKi9D,qBAAqBlnB,EAAMluC,EAAOygE,EAAO3L,MAAQ,aAAcj6D,OAtBpE4lE,GAAOvL,OAAOhnB,EAAM/1C,KAAMA,KAAK2vC,QAASjtC,GAyBhD1C,KAAKiT,QAAQiG,UAAY68B,EAAKvmC,KAAK,MAGvCxP,KAAK8oF,QAAU,SAAS12C,EAAK6G,GACzB,OAAQ7G,EAAM6G,EAAYkwC,gBAAkBlwC,EAAYD,YAE5Dh5C,KAAKipF,eAAiB,SAASG,EAAevhF,EAAO80D,EAAO1jB,EAAaowC,GACrE,GAAIj3C,GAAMvqC,EAAM8sB,MAAMyd,IAElBk3C,EAAY,GAAInjC,GAChB/T,EAAKvqC,EAAM8sB,MAAM4d,OACjBH,EAAKpyC,KAAK2vC,QAAQkgC,uBAAuBz9B,GAO7C,KALApyC,KAAKi9D,qBAAqBmsB,EAAeE,EAAW3sB,EAAQ,aAAc1jB,EAAa,EAAGowC,GAC1Fj3C,EAAMvqC,EAAMwqC,IAAID,IAChBk3C,EAAY,GAAInjC,GAAM/T,EAAK,EAAGA,EAAKvqC,EAAMwqC,IAAIE,QAC7CvyC,KAAKi9D,qBAAqBmsB,EAAeE,EAAW3sB,EAAO1jB,EAAa,EAAGowC,GAEtEj3C,EAAMvqC,EAAM8sB,MAAMyd,IAAM,EAAGA,EAAMvqC,EAAMwqC,IAAID,IAAKA,IACjDk3C,EAAU30D,MAAMyd,IAAMA,EACtBk3C,EAAUj3C,IAAID,IAAMA,EACpBk3C,EAAUj3C,IAAIE,OAASvyC,KAAK2vC,QAAQkgC,uBAAuBz9B,GAC3DpyC,KAAKi9D,qBAAqBmsB,EAAeE,EAAW3sB,EAAO1jB,EAAa,EAAGowC,IAGnFrpF,KAAKkpF,oBAAsB,SAASE,EAAevhF,EAAO80D,EAAOj6D,EAAQ2mF,GACrE,GAAI9hE,GAAUvnB,KAAKooF,SACfphF,EAAStE,EAAOs2C,WAChBlyC,EAAM9G,KAAK8oF,QAAQjhF,EAAM8sB,MAAMyd,IAAK1vC,GACpCiO,EAAO4W,EAAU1f,EAAM8sB,MAAM4d,OAAS7vC,EAAOw2C,cACjDmwC,GAAaA,GAAc,GAE3BD,EAAcp6E,KACV,eAAgB2tD,EAAO,sBACvB,UAAW31D,EAAQ,MACnB,WACA,OAAQF,EAAK,MACb,QAAS6J,EAAM,MAAO04E,EAAY,YAEtCviF,EAAM9G,KAAK8oF,QAAQjhF,EAAMwqC,IAAID,IAAK1vC,EAClC,IAAIuJ,GAAQpE,EAAMwqC,IAAIE,OAAS7vC,EAAOw2C,cAEtCkwC,GAAcp6E,KACV,eAAgB2tD,EAAO,YACvB,UAAW31D,EAAQ,MACnB,SAAUiF,EAAO,MACjB,OAAQnF,EAAK,MACb,QAASygB,EAAS,MAAO8hE,EAAY,YAEzCriF,GAAUa,EAAMwqC,IAAID,IAAMvqC,EAAM8sB,MAAMyd,IAAM,GAAK1vC,EAAOs2C,WAC3C,EAAThyC,IAEJF,EAAM9G,KAAK8oF,QAAQjhF,EAAM8sB,MAAMyd,IAAM,EAAG1vC,GAExC0mF,EAAcp6E,KACV,eAAgB2tD,EAAO,YACvB,UAAW31D,EAAQ,MACnB,WACA,OAAQF,EAAK,MACb,QAASygB,EAAS,MAAO8hE,EAAY,cAG7CrpF,KAAKi9D,qBAAuB,SAASmsB,EAAevhF,EAAO80D,EAAOj6D,EAAQ6mF,EAAaF,GACnF,GAAIriF,GAAStE,EAAOs2C,WAChB/sC,GAASpE,EAAMwqC,IAAIE,QAAUg3C,GAAe,GAAK1hF,EAAM8sB,MAAM4d,QAAU7vC,EAAOw2C,eAE9EpyC,EAAM9G,KAAK8oF,QAAQjhF,EAAM8sB,MAAMyd,IAAK1vC,GACpCiO,EAAO3Q,KAAKooF,SAAWvgF,EAAM8sB,MAAM4d,OAAS7vC,EAAOw2C,cAEvDkwC,GAAcp6E,KACV,eAAgB2tD,EAAO,YACvB,UAAW31D,EAAQ,MACnB,SAAUiF,EAAO,MACjB,OAAQnF,EAAK,MACb,QAAS6J,EAAM,MAAO04E,GAAc,GAAI,aAIhDrpF,KAAK+oF,mBAAqB,SAASK,EAAevhF,EAAO80D,EAAOj6D,EAAQ2mF,GACpE,GAAIviF,GAAM9G,KAAK8oF,QAAQjhF,EAAM8sB,MAAMyd,IAAK1vC,GACpCsE,EAAStE,EAAOs2C,UAChBnxC,GAAM8sB,MAAMyd,KAAOvqC,EAAMwqC,IAAID,MAC7BprC,GAAUhH,KAAK8oF,QAAQjhF,EAAMwqC,IAAID,IAAK1vC,GAAUoE,GAEpDsiF,EAAcp6E,KACV,eAAgB2tD,EAAO,YACvB,UAAW31D,EAAQ,MACnB,OAAQF,EAAK,MACb,kBAAmBuiF,GAAc,GAAI,aAI7CrpF,KAAKgpF,qBAAuB,SAASI,EAAevhF,EAAO80D,EAAOj6D,EAAQ2mF,GACtE,GAAIviF,GAAM9G,KAAK8oF,QAAQjhF,EAAM8sB,MAAMyd,IAAK1vC,GACpCsE,EAAStE,EAAOs2C,UAEpBowC,GAAcp6E,KACV,eAAgB2tD,EAAO,YACvB,UAAW31D,EAAQ,MACnB,OAAQF,EAAK,MACb,kBAAmBuiF,GAAc,GAAI,eAI9C9oF,KAAKooF,EAAOlnF,WAEf7B,EAAQ+oF,OAASA,IAIjBz8E,IAAIpM,OAAO,kBAAkB,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,oBAAoB,yBAA0B,SAASswB,EAAUxwB,EAASC,GAC/K,YAEA,IAAI28B,GAAMpM,EAAS,cACfrsB,EAAMqsB,EAAS,cACfib,EAAOjb,EAAS,eAEhB+tB,GADY/tB,EAAS,oBACNA,EAAS,wBAAwB+tB,cAEhDqrC,EAAO,SAAStC,GAChBlnF,KAAKiT,QAAUlP,EAAImF,cAAc,OACjClJ,KAAKiT,QAAQ9J,UAAY,2BACzB+9E,EAAS1hF,YAAYxF,KAAKiT,SAC1BjT,KAAKypF,eAAiBzpF,KAAKypF,eAAet5D,KAAKnwB,QAGnD,WAEIw8B,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAK0pF,SAAW,IAChB1pF,KAAK2pF,YAAc,IACnB3pF,KAAK4pF,cAAgB,IACrB5pF,KAAK6pF,SAAW7pF,KAAK2pF,YACrB3pF,KAAK8pF,SAAW,IAChB9pF,KAAK+pF,WAAa,IAClB/pF,KAAKooF,SAAW,EAEhBpoF,KAAKypF,eAAiB,WAClB,GAAII,GAAqD,MAA1C7pF,KAAK2vC,QAAQxW,IAAI0gC,sBAC3B75D,KAAK2pF,YACL3pF,KAAK4pF,aACV,OAAI5pF,MAAK6pF,UAAYA,GACjB7pF,KAAK6pF,SAAWA,GACT,GAFX,QAMJ7pF,KAAK4oF,WAAa,SAASrhE,GACvBvnB,KAAKooF,SAAW7gE,EAChBvnB,KAAKiT,QAAQnG,MAAMya,QAAU,KAAOA,EAAU,MAGlDvnB,KAAKgqF,cAAgB,WACjB,MAAOhqF,MAAKiqF,aAAaC,eAAeljF,QAAU,GAGtDhH,KAAKmqF,kBAAoB,WACrB,MAAOnqF,MAAKiqF,aAAaC,eAAej+E,OAAS,GAGrDjM,KAAK8wE,gBAAkB,SAASsZ,GAC5BpqF,KAAKiqF,aAAeG,EACpBpqF,KAAKiqF,aAAar8E,GAAG,sBAAuB,SAASga,GACjD5nB,KAAK0+C,QAAQ,sBAAuB92B,IACtCuI,KAAKnwB,OACPA,KAAKqqF,oBAGTrqF,KAAKsqF,oBAAsB,WACvBtqF,KAAKiqF,aAAaK,uBAEtBtqF,KAAKqqF,iBAAmB,WACpB,MAAOrqF,MAAKuqF,sBAAwBvqF,KAAKiqF,aAAaI,oBAE1DrqF,KAAKy4E,WAAa,SAAS9oC,GACvB3vC,KAAK2vC,QAAUA,EACXA,GACA3vC,KAAKwqF,qBAGbxqF,KAAK4/E,gBAAiB,EACtB5/E,KAAK2/E,kBAAoB,SAASC,GAC9B,MAAI5/E,MAAK4/E,gBAAkBA,GAChB,GAEX5/E,KAAK4/E,eAAiBA,EACtB5/E,KAAKwqF,qBACE,IAGXxqF,KAAK6lF,qBAAsB,EAC3B7lF,KAAK8/E,uBAAyB,SAASt4D,GACnC,MAAIxnB,MAAK6lF,qBAAuBr+D,GACrB,GAEXxnB,KAAK6lF,oBAAsBr+D,EAC3BxnB,KAAKwqF,qBACE,IAGXxqF,KAAKyqF,eACLzqF,KAAKi7E,gBACLj7E,KAAKwqF,kBAAoB,WACrB,GAAIz/B,GAAU/qD,KAAK2vC,QAAQqb,YAC3BhrD,MAAK+qD,QAAUA,CAEf,KAAK,GADD2/B,GAAS1qF,KAAKyqF,aAAe,GACxBnnF,EAAI,EAAOynD,EAAU,EAAdznD,EAAiBA,IAEzBonF,EAAO17E,KADPhP,KAAK4/E,eACO,iDACN5/E,KAAK8pF,SACLz+C,EAAK3B,aAAa,IAAQpmC,EAAI,GAC9B,UAEM+nC,EAAK3B,aAAa,IAAQpmC,GAG9C,IAAItD,KAAK6lF,oBAAqB,CAC1B7lF,KAAK2qF,eAAkB,kBACvB,IAAIxhF,GAAY,mBACZyhF,EAAa,GACbC,EAAW,EACf,IAAI7qF,KAAK4/E,eAAgB,CACrBz2E,GAAa,iBACbyhF,EAAa,uBACbC,EAAW,oBACX,IAAIC,GAAez/C,EAAK3B,aAAa1pC,KAAK+pF,WAAY/pF,KAAK+qD,SACvDggC,EAAa/qF,KAAK8pF,SAAWz+C,EAAK3B,aAAa,IAAQ1pC,KAAK+qD,QAAU,OAE1E,IAAI+/B,GAAez/C,EAAK3B,aAAa,IAAQ1pC,KAAK+qD,SAC9CggC,EAAaD,CAGrB9qF,MAAKyqF,YAAY,KAAO,gBAAkBthF,EAAYyhF,EAAa,KAAOE,EAAe,UACzF9qF,KAAKyqF,YAAY,KAAQ,gBAAkBthF,EAAY0hF,EAAW,KAAOE,EAAa,YAI9F/qF,KAAKk9E,YAAc,SAASx6E,EAAQ2kD,EAAUC,IACtCtnD,KAAK0C,OAAO4kD,SAAW5kD,EAAO4kD,SAC9BtnD,KAAK0C,OAAO2kD,UAAY3kD,EAAO2kD,WAC/BrnD,KAAKgrF,YAAYtoF,GAErB1C,KAAK0C,OAASA,CAQd,KAAK,GANDyQ,GAAQ5K,KAAKE,IAAI4+C,EAAU3kD,EAAO2kD,UAClC9d,EAAOhhC,KAAKC,IAAI8+C,EAAS5kD,EAAO4kD,SAEhC2jC,EAAejrF,KAAKiT,QAAQzB,WAC5B05E,EAAkB,EAEb94C,EAAM1vC,EAAO2kD,SAAgBl0C,EAANi/B,EAAaA,IAAO,CAChD,GAAIuY,GAAW3qD,KAAK2vC,QAAQib,YAAYxY,EACxC,IAAIuY,EAAU,CACV,GAAIA,EAAS6S,YAAYrqD,GAAQ,CAC7BA,EAAQw3C,EAASh2B,MAAMyd,GACvB,OAEAA,EAAMuY,EAAStY,IAAID,IAG3B84C,IAOJ,IAJA,GAAI94C,GAAMj/B,EACNw3C,EAAW3qD,KAAK2vC,QAAQ4wB,gBAAgBnuB,GACxC+4B,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,IAEnC,CAMT,GALIhkB,EAAM+4B,IACN/4B,EAAMuY,EAAStY,IAAID,IAAI,EACvBuY,EAAW3qD,KAAK2vC,QAAQ4wB,gBAAgBnuB,EAAKuY,GAC7CwgB,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAKgkB,EAAAA,GAE3ChkB,EAAM7I,EACN,KAEJ,IAAI4hD,GAAcF,EAAaC,IAC/B,IAAIC,EAAa,CACb,GAAIp1C,KACJ/1C,MAAKorF,YACDr1C,EAAM3D,GAAMpyC,KAAKqrF,iBAAkBj5C,GAAO+4B,EAAYxgB,GAAW,GAErEwgC,EAAYr+E,MAAM9F,OAAStE,EAAOs2C,WAAah5C,KAAK2vC,QAAQggC,aAAav9B,GAAO,KAChF+4C,EAAYjyE,UAAY68B,EAAKvmC,KAAK,IAEtC4iC,MAIRpyC,KAAKgrF,YAAc,SAAStoF,GACxB,GAAI4oF,GAAYtrF,KAAK0C,MAGrB,IAFA1C,KAAK0C,OAASA,GAET4oF,GAAaA,EAAUhkC,QAAU5kD,EAAO2kD,SACzC,MAAOrnD,MAAK+8D,OAAOr6D,EAEvB,IAAIA,EAAO4kD,QAAUgkC,EAAUjkC,SAC3B,MAAOrnD,MAAK+8D,OAAOr6D,EAEvB,IAAIg3B,GAAK15B,KAAKiT,OACd,IAAIq4E,EAAUjkC,SAAW3kD,EAAO2kD,SAC5B,IAAK,GAAIjV,GAAIpyC,KAAK2vC,QAAQ6wB,kBAAkB8qB,EAAUjkC,SAAU3kD,EAAO2kD,SAAW,GAAIjV,EAAI,EAAGA,IACzF1Y,EAAGj1B,YAAYi1B,EAAG5mB,WAE1B,IAAIw4E,EAAUhkC,QAAU5kD,EAAO4kD,QAC3B,IAAK,GAAIlV,GAAIpyC,KAAK2vC,QAAQ6wB,kBAAkB99D,EAAO4kD,QAAU,EAAGgkC,EAAUhkC,SAAUlV,EAAI,EAAGA,IACvF1Y,EAAGj1B,YAAYi1B,EAAG3W,UAE1B,IAAIrgB,EAAO2kD,SAAWikC,EAAUjkC,SAAU,CACtC,GAAIkkC,GAAWvrF,KAAKwrF,qBAAqB9oF,EAAQA,EAAO2kD,SAAUikC,EAAUjkC,SAAW,EACnF3tB,GAAG5mB,WACH4mB,EAAG9jB,aAAa21E,EAAU7xD,EAAG5mB,YAE7B4mB,EAAGl0B,YAAY+lF,GAGvB,GAAI7oF,EAAO4kD,QAAUgkC,EAAUhkC,QAAS,CACpC,GAAIikC,GAAWvrF,KAAKwrF,qBAAqB9oF,EAAQ4oF,EAAUhkC,QAAU,EAAG5kD,EAAO4kD,QAC/E5tB,GAAGl0B,YAAY+lF,KAIvBvrF,KAAKwrF,qBAAuB,SAAS9oF,EAAQ2kD,EAAUC,GAMnD,IALA,GAAIikC,GAAWvrF,KAAKiT,QAAQy6B,cAAc+9C,yBACtCr5C,EAAMiV,EACNsD,EAAW3qD,KAAK2vC,QAAQ4wB,gBAAgBnuB,GACxC+4B,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,IAEnC,CAMT,GALIhkB,EAAM+4B,IACN/4B,EAAMuY,EAAStY,IAAID,IAAI,EACvBuY,EAAW3qD,KAAK2vC,QAAQ4wB,gBAAgBnuB,EAAKuY,GAC7CwgB,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,GAE5ChkB,EAAMkV,EACN,KAEJ,IAAI1mD,GAAYmD,EAAImF,cAAc,OAE9B6sC,IAGJ,IAFA/1C,KAAKorF,YAAYr1C,EAAM3D,GAAK,EAAOA,GAAO+4B,EAAYxgB,GAAW,GACjE/pD,EAAUsY,UAAY68B,EAAKvmC,KAAK,IAC5BxP,KAAKqrF,iBACLzqF,EAAUuI,UAAY,iBACtBoiF,EAAS/lF,YAAY5E,GACrBA,EAAUkM,MAAM9F,OAAStE,EAAOs2C,WAAah5C,KAAK2vC,QAAQggC,aAAav9B,GAAO,SAG9E,MAAMxxC,EAAUkS,YACZy4E,EAAS/lF,YAAY5E,EAAUkS,WAGvCs/B,KAEJ,MAAOm5C,IAGXvrF,KAAK+8D,OAAS,SAASr6D,GACnB1C,KAAK0C,OAASA,CASd,KAPA,GAAIqzC,MACAsR,EAAW3kD,EAAO2kD,SAAUC,EAAU5kD,EAAO4kD,QAE7ClV,EAAMiV,EACNsD,EAAW3qD,KAAK2vC,QAAQ4wB,gBAAgBnuB,GACxC+4B,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAMgkB,EAAAA,IAEnC,CAMT,GALIhkB,EAAM+4B,IACN/4B,EAAMuY,EAAStY,IAAID,IAAI,EACvBuY,EAAW3qD,KAAK2vC,QAAQ4wB,gBAAgBnuB,EAAKuY,GAC7CwgB,EAAYxgB,EAAWA,EAASh2B,MAAMyd,IAAKgkB,EAAAA,GAE3ChkB,EAAMkV,EACN,KAEAtnD,MAAKqrF,kBACLt1C,EAAK/mC,KAAK,6CAA8CtM,EAAOs2C,WAAWh5C,KAAK2vC,QAAQggC,aAAav9B,GAAM,QAE9GpyC,KAAKorF,YAAYr1C,EAAM3D,GAAK,EAAOA,GAAO+4B,EAAYxgB,GAAW,GAE7D3qD,KAAKqrF,kBACLt1C,EAAK/mC,KAAK,UAEdojC,IAEJpyC,KAAKiT,QAAQiG,UAAY68B,EAAKvmC,KAAK,KAGvCxP,KAAK0rF,YACDvlF,MAAQ,EACRwlF,QAAU,EACVC,QAAU,GAGd5rF,KAAK6rF,aAAe,SAASzC,EAAe1Z,EAAchjD,EAAOvnB,GAC7D,GAAIwnB,GAAO3sB,KACP8rF,EAAa,0gBACbC,EAAc,SAAStrF,EAAGgP,EAAGC,EAAGs8E,EAAQC,GACxC,GAAIx8E,EACA,MAAOkd,GAAKizD,eACR,mDAAqDv0C,EAAK3B,aAAa/c,EAAKo9D,WAAYtpF,EAAEW,QAAU,UACpGiqC,EAAK3B,aAAa,IAAQjpC,EAAEW,OAC7B,IAAS,KAALX,EACP,MAAO,OACJ,IAAS,KAALA,EACP,MAAO,OACJ,IAAS,KAALA,EAAW,CAClB,GAAIsqD,GAAUp+B,EAAKgjB,QAAQ6/B,iBAAiBE,EAAesc,EAE3D,OADAtc,IAAgB3kB,EAAU,EACnBp+B,EAAK89D,YAAY1/B,GACrB,GAAS,KAALtqD,EAAe,CACtB,GAAIyrF,GAAav/D,EAAKizD,eAAiB,4CAA8C,UACjFuM,EAAQx/D,EAAKizD,eAAiBjzD,EAAKo9D,WAAa,EAEpD,OADAra,IAAgB,EACT,gBAAkBwc,EAAa,kBACJ,EAA7Bv/D,EAAKjqB,OAAOw2C,eACb,OAASizC,EAAQ,UAClB,MAAIz8E,GACA,+DAAiEid,EAAKo9D,WAAa,WAE1Fra,GAAgB,EACT,sCAC2B,EAA7B/iD,EAAKjqB,OAAOw2C,eACb,OAASz4C,EAAI,YAIrB2rF,EAASjnF,EAAMgf,QAAQ2nE,EAAYC,EAEvC,IAAK/rF,KAAK0rF,WAAWh/D,EAAM1hB,MAQvBo+E,EAAcp6E,KAAKo9E,OARW,CAC9B,GAAIp7E,GAAU,OAAS0b,EAAM1hB,KAAKmZ,QAAQ,MAAO,SAC7CrX,EAAQ,EACM,SAAd4f,EAAM1hB,OACN8B,EAAQ,iBAAoB4f,EAAMvnB,MAAM/D,OAASpB,KAAK0C,OAAOw2C,eAAkB,SACnFkwC,EAAcp6E,KAAK,gBAAiBgC,EAAS,IAAKlE,EAAO,IAAKs/E,EAAQ,WAK1E,MAAO1c,GAAevqE,EAAM/D,QAGhCpB,KAAKqsF,kBAAoB,SAASjD,EAAejkF,EAAOsD,GACpD,GAAI6jF,GAAOnnF,EAAMT,OAAO1E,KAAK2qF,eAC7B,OAAY,IAAR2B,GAAaA,GAAQ7jF,EACdtD,EACK,KAAZA,EAAM,IACNmnF,GAAQA,EAAOtsF,KAAK+qD,QACpBq+B,EAAcp6E,KAAKq8B,EAAK3B,aAAa1pC,KAAKyqF,YAAY,KAAM6B,EAAKtsF,KAAK+qD,UAC/D5lD,EAAM6pB,OAAOs9D,IACD,KAAZnnF,EAAM,IACbikF,EAAcp6E,KAAKq8B,EAAK3B,aAAa1pC,KAAKyqF,YAAY,KAAO6B,IACtDnnF,EAAM6pB,OAAOs9D,IAEjBnnF,GAGXnF,KAAKusF,mBAAqB,SAASnD,EAAen6B,EAAQkgB,EAAQqd,GAM9D,IAAK,GALDz9E,GAAQ,EACRkC,EAAQ,EACRw7E,EAAatd,EAAO,GACpBO,EAAe,EAEVpsE,EAAI,EAAGA,EAAI2rD,EAAO7tD,OAAQkC,IAAK,CACpC,GAAIopB,GAAQuiC,EAAO3rD,GACf6B,EAAQunB,EAAMvnB,KAClB,IAAS,GAAL7B,GAAUtD,KAAK6lF,oBAAqB,CAGpC,GAFA92E,EAAQ5J,EAAM/D,OACd+D,EAAQnF,KAAKqsF,kBAAkBjD,EAAejkF,EAAOsnF,IAChDtnF,EACD,QACJ4J,IAAS5J,EAAM/D,OAGnB,GAAI2N,EAAQ5J,EAAM/D,OAASqrF,EACvB/c,EAAe1vE,KAAK6rF,aAAazC,EAAe1Z,EAAchjD,EAAOvnB,GACrE4J,GAAS5J,EAAM/D,WACZ,CACH,KAAO2N,EAAQ5J,EAAM/D,QAAUqrF,GAC3B/c,EAAe1vE,KAAK6rF,aAChBzC,EAAe1Z,EACfhjD,EAAOvnB,EAAMif,UAAU,EAAGqoE,EAAa19E,IAE3C5J,EAAQA,EAAMif,UAAUqoE,EAAa19E,GACrCA,EAAQ09E,EAEHD,GACDpD,EAAcp6E,KAAK,SACf,uCACAhP,KAAK0C,OAAOs2C,WAAY,QAIhC/nC,IACAy+D,EAAe,EACf+c,EAAatd,EAAOl+D,IAAU7E,OAAO2gE,SAErB,IAAhB5nE,EAAM/D,SACN2N,GAAS5J,EAAM/D,OACfsuE,EAAe1vE,KAAK6rF,aAChBzC,EAAe1Z,EAAchjD,EAAOvnB,OAOxDnF,KAAK0sF,kBAAoB,SAAStD,EAAen6B,GAC7C,GAAIygB,GAAe,EACfhjD,EAAQuiC,EAAO,GACf9pD,EAAQunB,EAAMvnB,KACdnF,MAAK6lF,sBACL1gF,EAAQnF,KAAKqsF,kBAAkBjD,EAAejkF,IAC9CA,IACAuqE,EAAe1vE,KAAK6rF,aAAazC,EAAe1Z,EAAchjD,EAAOvnB,GACzE,KAAK,GAAI7B,GAAI,EAAGA,EAAI2rD,EAAO7tD,OAAQkC,IAC/BopB,EAAQuiC,EAAO3rD,GACf6B,EAAQunB,EAAMvnB,MACduqE,EAAe1vE,KAAK6rF,aAAazC,EAAe1Z,EAAchjD,EAAOvnB,IAG7EnF,KAAKorF,YAAc,SAAShC,EAAeh3C,EAAKo6C,EAAc7hC,GAI1D,GAHKA,GAAwB,GAAZA,IACbA,EAAW3qD,KAAK2vC,QAAQib,YAAYxY,IAEpCuY,EACA,GAAIsE,GAASjvD,KAAK2sF,mBAAmBv6C,EAAKuY,OAE1C,IAAIsE,GAASjvD,KAAK2vC,QAAQilB,UAAUxiB,EAYxC,IATKo6C,GACDpD,EAAcp6E,KACV,uCACIhP,KAAK0C,OAAOs2C,YACRh5C,KAAKqrF,iBAAmB,EAAGrrF,KAAK2vC,QAAQggC,aAAav9B,IACtD,QAIX6c,EAAO7tD,OAAQ,CACf,GAAI+tE,GAASnvE,KAAK2vC,QAAQsgC,gBAAgB79B,EACtC+8B,IAAUA,EAAO/tE,OACjBpB,KAAKusF,mBAAmBnD,EAAen6B,EAAQkgB,EAAQqd,GAEvDxsF,KAAK0sF,kBAAkBtD,EAAen6B,GAG1CjvD,KAAK4/E,iBACDj1B,IACAvY,EAAMuY,EAAStY,IAAID,KAEvBg3C,EAAcp6E,KACV,iDACAojC,GAAOpyC,KAAK2vC,QAAQiH,YAAc,EAAI52C,KAAK0pF,SAAW1pF,KAAK6pF,SAC3D,YAGH2C,GACDpD,EAAcp6E,KAAK,WAG3BhP,KAAK2sF,mBAAqB,SAASv6C,EAAKuY,GAIpC,QAASiiC,GAAU39B,EAAQ18B,EAAMs6D,GAE7B,IADA,GAAIzuB,GAAM,EAAGryD,EAAM,EACXA,EAAMkjD,EAAOmP,GAAKj5D,MAAM/D,OAAUmxB,GAItC,GAHAxmB,GAAOkjD,EAAOmP,GAAKj5D,MAAM/D,OACzBg9D,IAEIA,GAAOnP,EAAO7tD,OACd,MAER,IAAI2K,GAAOwmB,EAAM,CACb,GAAIptB,GAAQ8pD,EAAOmP,GAAKj5D,MAAMif,UAAUmO,EAAOxmB,EAC3C5G,GAAM/D,OAAUyrF,EAAKt6D,IACrBptB,EAAQA,EAAMif,UAAU,EAAGyoE,EAAKt6D;AAEpCu6D,EAAa99E,MACThE,KAAMikD,EAAOmP,GAAKpzD,KAClB7F,MAAOA,IAGX4G,EAAMwmB,EAAOptB,EAAM/D,OACnBg9D,GAAO,EAGX,KAAayuB,EAAN9gF,GAAYqyD,EAAMnP,EAAO7tD,QAAQ,CACpC,GAAI+D,GAAQ8pD,EAAOmP,GAAKj5D,KAEpB2nF,GAAa99E,KADb7J,EAAM/D,OAAS2K,EAAM8gF,GAEjB7hF,KAAMikD,EAAOmP,GAAKpzD,KAClB7F,MAAOA,EAAMif,UAAU,EAAGyoE,EAAK9gF,IAGjBkjD,EAAOmP,IAC7BryD,GAAO5G,EAAM/D,OACbg9D,GAAO,GApCf,GAAIzuB,GAAU3vC,KAAK2vC,QACfm9C,KAuCA79B,EAAStf,EAAQilB,UAAUxiB,EAgB/B,OAfAuY,GAAS8S,KAAK,SAASG,EAAaxrB,EAAKG,EAAQyvB,EAAYrE,GACtC,MAAfC,EACAkvB,EAAa99E,MACThE,KAAM,OACN7F,MAAOy4D,KAGPD,IACA1O,EAAStf,EAAQilB,UAAUxiB,IAE3B6c,EAAO7tD,QACPwrF,EAAU39B,EAAQ+S,EAAYzvB,KAEvCoY,EAAStY,IAAID,IAAKpyC,KAAK2vC,QAAQ8U,QAAQkG,EAAStY,IAAID,KAAKhxC,QAErD0rF,GAGX9sF,KAAKqrF,eAAiB,WAClB,MAAOrrF,MAAK2vC,QAAQ29B,kBAGxBttE,KAAKgxE,QAAU,WACX32B,cAAcr6C,KAAKuqF,uBACfvqF,KAAK+sF,cACL/sF,KAAK+sF,aAAavoF,WAAWC,YAAYzE,KAAK+sF,oBAC3C/sF,MAAK+sF,gBAGjBxsF,KAAKipF,EAAK/nF,WAEb7B,EAAQ4pF,KAAOA,IAIft9E,IAAIpM,OAAO,oBAAoB,UAAU,UAAU,SAAS,eAAgB,SAASswB,EAAUxwB,EAASC,GACxG,YAEA,IACImtF,GADAjpF,EAAMqsB,EAAS,cAGf68D,EAAS,SAAS/F,GAClBlnF,KAAKiT,QAAUlP,EAAImF,cAAc,OACjClJ,KAAKiT,QAAQ9J,UAAY,6BACzB+9E,EAAS1hF,YAAYxF,KAAKiT,SAEd/O,SAAR8oF,IACAA,EAAM,WAAahtF,MAAKiT,SAE5BjT,KAAKqiB,WAAY,EACjBriB,KAAK4kF,YAAa,EAClB5kF,KAAKktF,cAAgB,IACrBltF,KAAKmtF,gBAAiB,EAEtBntF,KAAKotF,WACLptF,KAAKke,OAASle,KAAKqtF,YACnBtpF,EAAI41B,YAAY35B,KAAKiT,QAAS,sBAC9BjT,KAAKstF,eAAiBttF,KAAKutF,kBAAkBp9D,KAAKnwB,QAGtD,WAEIA,KAAKutF,kBAAoB,SAASz9C,GAE9B,IAAK,GADDs9C,GAAUptF,KAAKotF,QACV9pF,EAAI8pF,EAAQhsF,OAAQkC,KACzB8pF,EAAQ9pF,GAAGwJ,MAAM0gF,WAAa19C,EAAM,GAAK,UAEjD9vC,KAAKytF,eAAiB,SAAS39C,GAE3B,IAAK,GADDs9C,GAAUptF,KAAKotF,QACV9pF,EAAI8pF,EAAQhsF,OAAQkC,KACzB8pF,EAAQ9pF,GAAGwJ,MAAM+/B,QAAUiD,EAAM,GAAK,KAI9C9vC,KAAKooF,SAAW,EAChBpoF,KAAK4oF,WAAa,SAASrhE,GACvBvnB,KAAKooF,SAAW7gE,GAGpBvnB,KAAKy4E,WAAa,SAAS9oC,GACvB3vC,KAAK2vC,QAAUA,GAGnB3vC,KAAKo6C,YAAc,SAASszC,GACpBA,GAAY1tF,KAAK4kF,aACjB5kF,KAAK4kF,WAAa8I,EAClB1tF,KAAK2tF,iBAIb3tF,KAAK4tF,iBAAmB,SAASV,GACzBA,GAAiBltF,KAAKktF,gBACtBltF,KAAKktF,cAAgBA,EACrBltF,KAAK2tF,iBAIb3tF,KAAK2kF,kBAAoB,SAASwI,GAC1BA,GAAkBntF,KAAKmtF,gBAAmBH,IAC1ChtF,KAAKmtF,eAAiBA,EACtBppF,EAAI+1B,YAAY95B,KAAKiT,QAAS,sBAAuBk6E,GACrDntF,KAAKstF,gBAAe,GACpBttF,KAAKstF,gBAAkBH,EACjBntF,KAAKytF,eACLztF,KAAKutF,mBAAmBp9D,KAAKnwB,MACnCA,KAAK2tF,iBAIb3tF,KAAKqtF,UAAY,WACb,GAAI3zD,GAAK31B,EAAImF,cAAc,MAI3B,OAHAwwB,GAAGvwB,UAAY,aACfnJ,KAAKiT,QAAQzN,YAAYk0B,GACzB15B,KAAKotF,QAAQp+E,KAAK0qB,GACXA,GAGX15B,KAAK6tF,aAAe,WAChB,GAAI7tF,KAAKotF,QAAQhsF,OAAS,EAAG,CACzB,GAAIs4B,GAAK15B,KAAKotF,QAAQ19D,KAEtB,OADAgK,GAAGl1B,WAAWC,YAAYi1B,GACnBA,IAIf15B,KAAK88E,WAAa,WACd98E,KAAKqiB,WAAY,EACjBte,EAAI41B,YAAY35B,KAAKiT,QAAS,sBAC9BjT,KAAK2tF,gBAGT3tF,KAAK48E,WAAa,WACd58E,KAAKqiB,WAAY,EACjBte,EAAI61B,eAAe55B,KAAKiT,QAAS,sBACjCjT,KAAK2tF,gBAGT3tF,KAAK2tF,aAAe,WAChB,GAAI5wB,GAAS/8D,KAAKstF,cASlB,IARAjzC,cAAcr6C,KAAK8tF,YACnBnmF,aAAa3H,KAAK+tF,WACd/tF,KAAKmtF,gBACLppF,EAAI61B,eAAe55B,KAAKiT,QAAS,uBAGrC8pD,GAAO,GAEF/8D,KAAK4kF,YAAe5kF,KAAKktF,eAAkBltF,KAAKqiB,UAArD,CAGIriB,KAAKmtF,gBACLtkF,WAAW,WACP9E,EAAI41B,YAAY35B,KAAKiT,QAAS,wBAChCkd,KAAKnwB,MAGX,IAAIguF,GAAQ,WACRhuF,KAAK+tF,UAAYllF,WAAW,WACxBk0D,GAAO,IACR,GAAM/8D,KAAKktF,gBAChB/8D,KAAKnwB,KAEPA,MAAK8tF,WAAarmF,YAAY,WAC1Bs1D,GAAO,GACPixB,KACDhuF,KAAKktF,eAERc,MAGJhuF,KAAKiuF,iBAAmB,SAAS7yD,EAAU8yD,GACvC,IAAKluF,KAAK0C,SAAW1C,KAAK2vC,QACtB,OAAQh/B,KAAO,EAAG7J,IAAM,EAEvBs0B,KACDA,EAAWp7B,KAAK2vC,QAAQ1rC,UAAUskD,YACtC,IAAI1zB,GAAM70B,KAAK2vC,QAAQgY,yBAAyBvsB,GAC5C+yD,EAAanuF,KAAKooF,SAAWvzD,EAAI0d,OAASvyC,KAAK0C,OAAOw2C,eACtDk1C,GAAav5D,EAAIud,KAAO87C,EAAWluF,KAAK0C,OAAOymF,eAAiB,IAChEnpF,KAAK0C,OAAOs2C,UAEhB,QAAQroC,KAAOw9E,EAAYrnF,IAAMsnF,IAGrCpuF,KAAK+8D,OAAS,SAASr6D,GACnB1C,KAAK0C,OAASA,CAEd,IAAIg2E,GAAa14E,KAAK2vC,QAAQ0+C,kBAC1B/qF,EAAI,EAAGgrF,EAAc,GAENpqF,SAAfw0E,GAAkD,IAAtBA,EAAWt3E,UACvCs3E,IAAex6D,OAAQ,OAG3B,KAAK,GAAI5a,GAAI,EAAGuc,EAAI64D,EAAWt3E,OAAYye,EAAJvc,EAAOA,IAAK,CAC/C,GAAIirF,GAAWvuF,KAAKiuF,iBAAiBvV,EAAWp1E,GAAG4a,QAAQ,EAC3D,OAAKqwE,EAASznF,IAAMpE,EAAOsE,OAAStE,EAAOioC,QACtC4jD,EAASznF,IAAM,IAAMxD,EAAI,GAD9B,CAKA,GAAIwJ,IAAS9M,KAAKotF,QAAQkB,MAAkBtuF,KAAKqtF,aAAavgF,KAE9DA,GAAM6D,KAAO49E,EAAS59E,KAAO,KAC7B7D,EAAMhG,IAAMynF,EAASznF,IAAM,KAC3BgG,EAAMb,MAAQvJ,EAAOw2C,eAAiB,KACtCpsC,EAAM9F,OAAStE,EAAOs2C,WAAa,MAEvC,KAAOh5C,KAAKotF,QAAQhsF,OAASktF,GACzBtuF,KAAK6tF,cAET,IAAIlmB,GAAY3nE,KAAK2vC,QAAQi4B,cAC7B5nE,MAAKwuF,cAAc7mB,GACnB3nE,KAAKukF,UAAYgK,EACjBvuF,KAAK2tF,gBAGT3tF,KAAKwuF,cAAgB,SAAS7mB,GACtBA,GAAa3nE,KAAK2nE,YAClB3nE,KAAK2nE,UAAYA,EACbA,EACA5jE,EAAI41B,YAAY35B,KAAKiT,QAAS,yBAE9BlP,EAAI61B,eAAe55B,KAAKiT,QAAS,2BAI7CjT,KAAKgxE,QAAU,WACX32B,cAAcr6C,KAAK8tF,YACnBnmF,aAAa3H,KAAK+tF,cAGvBxtF,KAAK0sF,EAAOxrF,WAEf7B,EAAQqtF,OAASA,IAIjB/gF,IAAIpM,OAAO,iBAAiB,UAAU,UAAU,SAAS,cAAc,cAAc,gBAAgB,yBAA0B,SAASswB,EAAUxwB,EAASC,GAC3J,YAEA,IAAI28B,GAAMpM,EAAS,aACfrsB,EAAMqsB,EAAS,aACfrnB,EAAQqnB,EAAS,eACjB+tB,EAAe/tB,EAAS,uBAAuB+tB,aAC/CswC,EAAY,SAAS/4E,GACrB1V,KAAKiT,QAAUlP,EAAImF,cAAc,OACjClJ,KAAKiT,QAAQ9J,UAAY,8BAAgCnJ,KAAK0uF,YAE9D1uF,KAAKi7B,MAAQl3B,EAAImF,cAAc,OAC/BlJ,KAAKi7B,MAAM9xB,UAAY,sBACvBnJ,KAAKiT,QAAQzN,YAAYxF,KAAKi7B,OAE9BvlB,EAAOlQ,YAAYxF,KAAKiT,SAExBjT,KAAK2uF,YAAW,GAChB3uF,KAAK4uF,WAAY,EAEjB7lF,EAAMi9B,YAAYhmC,KAAKiT,QAAS,SAAUjT,KAAK6uF,SAAS1+D,KAAKnwB,OAC7D+I,EAAMi9B,YAAYhmC,KAAKiT,QAAS,YAAalK,EAAMQ,kBAGvD,WACIizB,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAK2uF,WAAa,SAAStsE,GACvBriB,KAAKiT,QAAQnG,MAAM0a,QAAUnF,EAAY,GAAK,OAC9CriB,KAAKqiB,UAAYA,KAEtB9hB,KAAKkuF,EAAUhtF,UAClB,IAAIqtF,GAAa,SAASp5E,EAAQ42B,GAC9BmiD,EAAUluF,KAAKP,KAAM0V,GACrB1V,KAAKqH,UAAY,EACjBilC,EAASyiD,gBACT/uF,KAAKiM,MAAQlI,EAAIi3B,eAAetlB,EAAOg4B,eACvC1tC,KAAKi7B,MAAMnuB,MAAMb,MACjBjM,KAAKiT,QAAQnG,MAAMb,OAASjM,KAAKiM,OAAS,IAAM,EAAI,KAGxDuwB,GAAIP,SAAS6yD,EAAYL,GAEzB,WAEIzuF,KAAK0uF,YAAc,KACnB1uF,KAAK6uF,SAAW,WACP7uF,KAAK4uF,YACN5uF,KAAKqH,UAAYrH,KAAKiT,QAAQ5L,UAC9BrH,KAAKuwC,MAAM,UAAW/tC,KAAMxC,KAAKqH,aAErCrH,KAAK4uF,WAAY,GAErB5uF,KAAKm2C,SAAW,WACZ,MAAOn2C,MAAKqiB,UAAYriB,KAAKiM,MAAQ,GAEzCjM,KAAKgvF,UAAY,SAAShoF,GACtBhH,KAAKiT,QAAQnG,MAAM9F,OAASA,EAAS,MAEzChH,KAAKivF,eAAiB,SAASjoF,GAC3BhH,KAAKi7B,MAAMnuB,MAAM9F,OAASA,EAAS,MAEvChH,KAAKkvF,gBAAkB,SAASloF,GAC5BhH,KAAKi7B,MAAMnuB,MAAM9F,OAASA,EAAS,MAEvChH,KAAKoqE,aAAe,SAAS/iE,GACrBrH,KAAKqH,WAAaA,IAClBrH,KAAK4uF,WAAY,EACjB5uF,KAAKqH,UAAYrH,KAAKiT,QAAQ5L,UAAYA,KAInD9G,KAAKuuF,EAAWrtF,UACnB,IAAI0tF,GAAa,SAASz5E,EAAQ42B,GAC9BmiD,EAAUluF,KAAKP,KAAM0V,GACrB1V,KAAK6Q,WAAa,EAClB7Q,KAAKgH,OAASslC,EAASyiD,gBACvB/uF,KAAKi7B,MAAMnuB,MAAM9F,OACjBhH,KAAKiT,QAAQnG,MAAM9F,QAAUhH,KAAKgH,QAAU,IAAM,EAAI,KAG1Dw1B,GAAIP,SAASkzD,EAAYV,GAEzB,WAEIzuF,KAAK0uF,YAAc,KACnB1uF,KAAK6uF,SAAW,WACP7uF,KAAK4uF,YACN5uF,KAAK6Q,WAAa7Q,KAAKiT,QAAQpC,WAC/B7Q,KAAKuwC,MAAM,UAAW/tC,KAAMxC,KAAK6Q,cAErC7Q,KAAK4uF,WAAY,GAErB5uF,KAAKk2C,UAAY,WACb,MAAOl2C,MAAKqiB,UAAYriB,KAAKgH,OAAS,GAE1ChH,KAAKovF,SAAW,SAASnjF,GACrBjM,KAAKiT,QAAQnG,MAAMb,MAAQA,EAAQ,MAEvCjM,KAAKqvF,cAAgB,SAASpjF,GAC1BjM,KAAKi7B,MAAMnuB,MAAMb,MAAQA,EAAQ,MAErCjM,KAAKsvF,eAAiB,SAASrjF,GAC3BjM,KAAKi7B,MAAMnuB,MAAMb,MAAQA,EAAQ,MAErCjM,KAAKuqE,cAAgB,SAAS15D,GACtB7Q,KAAK6Q,YAAcA,IACnB7Q,KAAK4uF,WAAY,EACjB5uF,KAAK6Q,WAAa7Q,KAAKiT,QAAQpC,WAAaA,KAIrDtQ,KAAK4uF,EAAW1tF,WAGnB7B,EAAQ6uF,UAAYK,EACpBlvF,EAAQ2vF,WAAaT,EACrBlvF,EAAQ4vF,WAAaL,EAErBvvF,EAAQkvF,WAAaA,EACrBlvF,EAAQuvF,WAAaA,IAGrBjjF,IAAIpM,OAAO,kBAAkB,UAAU,UAAU,SAAS,iBAAkB,SAASswB,EAAUxwB,EAASC,GACxG,YAEA,IAAIkJ,GAAQqnB,EAAS,eAGjBq/D,EAAa,SAASC,EAAU3mD,GAChC/oC,KAAK0vF,SAAWA,EAChB1vF,KAAK2vF,SAAU,EACf3vF,KAAK4vF,QAAU,EACf5vF,KAAK0N,OAASq7B,GAAOr7B,SAGzB,WAGI1N,KAAKgrC,SAAW,SAAStkC,GAErB,GADA1G,KAAK4vF,QAAU5vF,KAAK4vF,QAAUlpF,GACzB1G,KAAK2vF,SAAW3vF,KAAK4vF,QAAS,CAC/B5vF,KAAK2vF,SAAU,CACf,IAAIvkD,GAAQprC,IACZ+I,GAAMkgC,UAAU,WACZmC,EAAMukD,SAAU,CAEhB,KADA,GAAIC,GACGA,EAAUxkD,EAAMwkD,SACnBxkD,EAAMwkD,QAAU,EAChBxkD,EAAMskD,SAASE,IAEpB5vF,KAAK0N,YAIjBnN,KAAKkvF,EAAWhuF,WAEnB7B,EAAQ6vF,WAAaA,IAGrBvjF,IAAIpM,OAAO,0BAA0B,UAAU,UAAU,SAAS,cAAc,cAAc,eAAe,oBAAoB,yBAA0B,SAASswB,EAAUxwB,EAASC,GAEvL,GAAI28B,GAAMpM,EAAS,cACfrsB,EAAMqsB,EAAS,cACfib,EAAOjb,EAAS,eAChBmV,EAAYnV,EAAS,oBACrB+tB,EAAe/tB,EAAS,wBAAwB+tB,aAEhD0xC,EAAa,EAEbC,EAAclwF,EAAQkwF,YAAc,SAAS5I,EAAU9/E,GACvDpH,KAAK05B,GAAK31B,EAAImF,cAAc,OAC5BlJ,KAAK+vF,sBAAsB/vF,KAAK05B,GAAG5sB,OAAO,GAE1C9M,KAAKgwF,MAAQjsF,EAAImF,cAAc,OAC/BlJ,KAAK+vF,sBAAsB/vF,KAAKgwF,MAAMljF,OAEtC9M,KAAK+sF,aAAehpF,EAAImF,cAAc,OACtClJ,KAAK+vF,sBAAsB/vF,KAAK+sF,aAAajgF,OAG7C9M,KAAK05B,GAAGl0B,YAAYxF,KAAKgwF,OACzBhwF,KAAK05B,GAAGl0B,YAAYxF,KAAK+sF,cACzB7F,EAAS1hF,YAAYxF,KAAK05B,IAErBm2D,GACD7vF,KAAKiwF,sBACTjwF,KAAK+sF,aAAa7zE,UAAYmyB,EAAK3B,aAAa,IAAKmmD,GAErD7vF,KAAKkqF,gBAAkBj+E,MAAO,EAAGjF,OAAQ,GACzChH,KAAKsqF,wBAGT,WAEI9tD,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAKkqF,gBAAkBj+E,MAAO,EAAGjF,OAAQ,GAEzChH,KAAKiwF,oBAAsB,WACvB,GAAIv2D,GAAK31B,EAAImF,cAAc,MAC3BlJ,MAAK+vF,sBAAsBr2D,EAAG5sB,OAC9B4sB,EAAG5sB,MAAMb,MAAQ,QACjBhD,SAASqwB,gBAAgB9zB,YAAYk0B,EACrC,IAAIoxC,GAAIpxC,EAAGhpB,wBAAwBzE,KAE/B4jF,GADA/kB,EAAI,GAAS,EAAJA,EACI,GAEA,IACjBpxC,EAAGl1B,WAAWC,YAAYi1B,IAG9B15B,KAAK+vF,sBAAwB,SAASjjF,EAAOojF,GACzCpjF,EAAMb,MAAQa,EAAM9F,OAAS,OAC7B8F,EAAM6D,KAAO7D,EAAMhG,IAAM,SACzBgG,EAAM0gF,WAAa,SACnB1gF,EAAMsuB,SAAW,QACjBtuB,EAAMqjF,WAAa,MAEf5qD,EAAUnB,KAAO,EACjBt3B,EAAM,eAAiB,UAEvBA,EAAMsjF,KAAO,UAEjBtjF,EAAMuZ,SAAW6pE,EAAS,SAAW,WAGzClwF,KAAKsqF,oBAAsB,WACvB,GAAI1d,GAAO5sE,KAAKqwF,eAChB,IAAIzjB,IAAS5sE,KAAKkqF,eAAej+E,QAAU2gE,EAAK3gE,OAASjM,KAAKkqF,eAAeljF,SAAW4lE,EAAK5lE,QAAS,CAClGhH,KAAK+sF,aAAajgF,MAAMwjF,WAAa,MACrC,IAAIC,GAAWvwF,KAAKqwF,eACpBrwF,MAAK+sF,aAAajgF,MAAMwjF,WAAa,GACrCtwF,KAAKkqF,eAAiBtd,EACtB5sE,KAAKwwF,UAAYngF,OAAOvN,OAAO,MAC/B9C,KAAKywF,eAAiBF,GAAYA,EAAStkF,QAAU2gE,EAAK3gE,OAASskF,EAASvpF,SAAW4lE,EAAK5lE,OAC5FhH,KAAKuwC,MAAM,uBAAwB/tC,KAAMoqE,MAIjD5sE,KAAKqqF,iBAAmB,WACpB,GAAIrqF,KAAKuqF,sBACL,MAAOvqF,MAAKuqF,qBAChB,IAAI59D,GAAO3sB,IACX,OAAOA,MAAKuqF,sBAAwB9iF,YAAY,WAC5CklB,EAAK29D,uBACN,MAGPtqF,KAAK0wF,WAAa,SAAS5gD,GACnBA,EACA9vC,KAAKqqF,mBAEDrqF,KAAKuqF,uBACLvqF,KAAKuqF,uBAIjBvqF,KAAKqwF,cAAgB,WACjB,GAAmB,KAAfR,EAAmB,CACnB,GAAIp/E,GAAO,IACX,KACGA,EAAOzQ,KAAK+sF,aAAar8E,wBAC1B,MAAMkX,GACLnX,GAAQxE,MAAO,EAAGjF,OAAO,GAE5B,GAAI4lE,IACA5lE,OAAQyJ,EAAKzJ,OACbiF,MAAOwE,EAAKxE,MAAQ4jF,OAGxB,IAAIjjB,IACA5lE,OAAQhH,KAAK+sF,aAAa9lF,aAC1BgF,MAAOjM,KAAK+sF,aAAavgF,YAAcqjF,EAG/C,OAAmB,KAAfjjB,EAAK3gE,OAA+B,IAAhB2gE,EAAK5lE,OAClB,KACJ4lE,GAGX5sE,KAAK2wF,kBAAoB,SAASliE,GAC9BzuB,KAAKgwF,MAAM92E,UAAYmyB,EAAK3B,aAAajb,EAAIohE,EAC7C,IAAIp/E,GAAOzQ,KAAKgwF,MAAMt/E,uBACtB,OAAOD,GAAKxE,MAAQ4jF,GAGxB7vF,KAAKmqF,kBAAoB,SAAS17D,GAC9B,GAAIq8C,GAAI9qE,KAAKwwF,UAAU/hE,EAIvB,OAHUvqB,UAAN4mE,IACA9qE,KAAKwwF,UAAU/hE,GAAMzuB,KAAK2wF,kBAAkBliE,GAAMzuB,KAAKkqF,eAAej+E,OAEnE6+D,GAGX9qE,KAAKgxE,QAAU,WACX32B,cAAcr6C,KAAKuqF,uBACfvqF,KAAK05B,IAAM15B,KAAK05B,GAAGl1B,YACnBxE,KAAK05B,GAAGl1B,WAAWC,YAAYzE,KAAK05B,OAG7Cn5B,KAAKuvF,EAAYruF,aAIpByK,IAAIpM,OAAO,wBAAwB,UAAU,UAAU,SAAS,cAAc,cAAc,aAAa,oBAAoB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,gBAAgB,gBAAgB,iBAAiB,yBAAyB,yBAA0B,SAASswB,EAAUxwB,EAASC,GACvU,YAEA,IAAI28B,GAAMpM,EAAS,aACfrsB,EAAMqsB,EAAS,aACf1tB,EAAS0tB,EAAS,YAClBmV,EAAYnV,EAAS,mBACrBwgE,EAAcxgE,EAAS,kBAAkB62D,OACzC4J,EAAczgE,EAAS,kBAAkBu4D,OACzCmI,EAAY1gE,EAAS,gBAAgBo5D,KACrCuH,EAAc3gE,EAAS,kBAAkB68D,OACzCkC,EAAa/+D,EAAS,eAAe++D,WACrCL,EAAa1+D,EAAS,eAAe0+D,WACrCW,EAAar/D,EAAS,gBAAgBq/D,WACtCK,EAAc1/D,EAAS,wBAAwB0/D,YAC/C3xC,EAAe/tB,EAAS,uBAAuB+tB,aAC/C6yC,EAAY,82VAoWhBjtF,GAAIysB,gBAAgBwgE,EAAW,aAE/B,IAAIC,GAAkB,SAASrwF,EAAW0L,GACtC,GAAI8+B,GAAQprC,IAEZA,MAAKY,UAAYA,GAAamD,EAAImF,cAAc,OAChDlJ,KAAKusC,uBAAyBhH,EAAUlB,QAExCtgC,EAAI41B,YAAY35B,KAAKY,UAAW,cAEhCZ,KAAKgN,SAASV,GAEdtM,KAAK+3C,QAAUh0C,EAAImF,cAAc,OACjClJ,KAAK+3C,QAAQ5uC,UAAY,aACzBnJ,KAAKY,UAAU4E,YAAYxF,KAAK+3C,SAEhC/3C,KAAKgxC,SAAWjtC,EAAImF,cAAc,OAClClJ,KAAKgxC,SAAS7nC,UAAY,eAC1BnJ,KAAKY,UAAU4E,YAAYxF,KAAKgxC,UAEhChxC,KAAK+E,QAAUhB,EAAImF,cAAc,OACjClJ,KAAK+E,QAAQoE,UAAY,cACzBnJ,KAAKgxC,SAASxrC,YAAYxF,KAAK+E,SAE/B/E,KAAKy3C,aAAe,GAAIm5C,GAAY5wF,KAAK+3C,SACzC/3C,KAAKy3C,aAAa7pC,GAAG,oBAAqB5N,KAAKkxF,eAAe/gE,KAAKnwB,OAEnEA,KAAKmxF,YAAc,GAAIN,GAAY7wF,KAAK+E,QAExC,IAAIqsF,GAAYpxF,KAAKqxF,WAAa,GAAIP,GAAU9wF,KAAK+E,QACrD/E,MAAKsxF,OAASF,EAAUn+E,QAExBjT,KAAKuxF,aAAe,GAAIV,GAAY7wF,KAAK+E,SAEzC/E,KAAKm6C,aAAe,GAAI42C,GAAY/wF,KAAK+E,SACzC/E,KAAKwxF,cAAe,EACpBxxF,KAAKyxF,UAAW,EAEhBzxF,KAAK0xF,UACL1xF,KAAK6iD,WAAa,GAAIisC,GAAW9uF,KAAKY,UAAWZ,MACjDA,KAAK8iD,WAAa,GAAIqsC,GAAWnvF,KAAKY,UAAWZ,MACjDA,KAAK6iD,WAAW34C,iBAAiB,SAAU,SAAS0d,GAC3CwjB,EAAMumD,kBACPvmD,EAAMuE,QAAQy6B,aAAaxiD,EAAEplB,KAAO4oC,EAAMwmD,aAAa9qF,OAE/D9G,KAAK8iD,WAAW54C,iBAAiB,SAAU,SAAS0d,GAC3CwjB,EAAMumD,kBACPvmD,EAAMuE,QAAQ46B,cAAc3iD,EAAEplB,KAAO4oC,EAAMwmD,aAAajhF,QAGhE3Q,KAAKqH,UAAY,EACjBrH,KAAK6Q,WAAa,EAElB7Q,KAAK87E,WACD1pC,IAAM,EACNG,OAAS,GAGbvyC,KAAKiqF,aAAe,GAAI6F,GAAY9vF,KAAKY,UAAW,KACpDZ,KAAKqxF,WAAWvgB,gBAAgB9wE,KAAKiqF,cACrCjqF,KAAKqxF,WAAWnnF,iBAAiB,sBAAuB,SAAS0d,GAC7DwjB,EAAMymD,sBACNzmD,EAAM2wC,UAAS,EAAM3wC,EAAMg8C,YAAah8C,EAAM0mD,MAAM7lF,MAAOm/B,EAAM0mD,MAAM9qF,QACvEokC,EAAMsT,QAAQ,sBAAuB92B,KAGzC5nB,KAAK8xF,OACD7lF,MAAO,EACPjF,OAAQ,EACR+qF,eAAgB,EAChBC,cAAe,EACfC,QAAQ,GAGZjyF,KAAKi5C,aACDhtC,MAAQ,EACRsb,QAAU,EACV8/B,SAAW,EACX8hC,eAAgB,EAChB7hC,QAAU,EACVtO,WAAa,EACbE,eAAiB,EACjBgvC,UAAY,EACZ5hE,UAAY,EACZqkB,OAAS,EACT3jC,OAAS,EACTwgF,aAAc,GAGlBxnF,KAAK4xF,cACDjhF,KAAM,EACN4mC,MAAO,EACPzwC,IAAK,EACLI,OAAQ,EACR4V,EAAG,EACHwoC,EAAG,GAGPtlD,KAAKkyF,MAAQ,GAAIzC,GACbzvF,KAAKmyF,eAAehiE,KAAKnwB,MACzBA,KAAKY,UAAU8sC,cAAc3R,aAEjC/7B,KAAKkyF,MAAMlnD,SAAShrC,KAAKoyF,aAEzBpyF,KAAK6xF,sBACL7xF,KAAK4oF,WAAW,GAChBlmF,EAAOy/C,aAAaniD,MACpB0C,EAAO6tC,MAAM,WAAYvwC,QAG7B,WAEIA,KAAKqyF,cAAgB,EACrBryF,KAAKsyF,cAAgB,EACrBtyF,KAAKuyF,cAAgB,EACrBvyF,KAAKwyF,cAAgB,EACrBxyF,KAAKyyF,aAAe,GACpBzyF,KAAK0yF,YAAc,GACnB1yF,KAAK2yF,YAAc,GACnB3yF,KAAK4yF,mBAAqB,IAC1B5yF,KAAK6yF,oBAAsB,IAC3B7yF,KAAKoyF,YAAc,IACnBpyF,KAAK8yF,gBAAkB,KAEvBt2D,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAK6xF,oBAAsB,WACnB7xF,KAAKqxF,WAAWZ,gBAAkBzwF,KAAK+yF,kBACvC/yF,KAAK+yF,gBAAkB/yF,KAAKqxF,WAAWZ,eACvCzwF,KAAK6zC,SAAS,cAAe7zC,KAAK+yF,kBAGtC/yF,KAAKi5C,YAAYC,eACjBl5C,KAAKk5C,eAAiBl5C,KAAKqxF,WAAWlH,oBACtCnqF,KAAKi5C,YAAYD,WACjBh5C,KAAKg5C,WAAah5C,KAAKqxF,WAAWrH,gBAClChqF,KAAKgzF,sBAEThzF,KAAKy4E,WAAa,SAAS9oC,GACnB3vC,KAAK2vC,SACL3vC,KAAK2vC,QAAQxW,IAAI+lB,IAAI,oBAAqBl/C,KAAKizF,qBAEnDjzF,KAAK2vC,QAAUA,EACXA,GAAW3vC,KAAK4xF,aAAa9qF,KAAO6oC,EAAQ06B,gBAAkB,GAC9D16B,EAAQy6B,cAAcpqE,KAAK4xF,aAAa9qF,KAE5C9G,KAAKm6C,aAAas+B,WAAW9oC,GAC7B3vC,KAAKmxF,YAAY1Y,WAAW9oC,GAC5B3vC,KAAKuxF,aAAa9Y,WAAW9oC,GAC7B3vC,KAAKy3C,aAAaghC,WAAW9oC,GAC7B3vC,KAAKqxF,WAAW5Y,WAAW9oC,GACtBA,IAGL3vC,KAAKkyF,MAAMlnD,SAAShrC,KAAKoyF,aACzBpyF,KAAK2vC,QAAQmhC,gBAAgB9wE,KAAKiqF,cAElCjqF,KAAKizF,oBAAsBjzF,KAAKizF,oBAAoB9iE,KAAKnwB,MACzDA,KAAKizF,sBACLjzF,KAAK2vC,QAAQxW,IAAIvrB,GAAG,oBAAqB5N,KAAKizF,uBAElDjzF,KAAKk9E,YAAc,SAAS71B,EAAUC,EAASv5C,GAiB3C,GAhBgB7J,SAAZojD,IACAA,EAAU8O,EAAAA,GAETp2D,KAAKkzF,eAOFlzF,KAAKkzF,cAAc7rC,SAAWA,IAC9BrnD,KAAKkzF,cAAc7rC,SAAWA,GAE9BrnD,KAAKkzF,cAAc5rC,QAAUA,IAC7BtnD,KAAKkzF,cAAc5rC,QAAUA,IAVjCtnD,KAAKkzF,eACD7rC,SAAUA,EACVC,QAASA,GAUbtnD,KAAKkzF,cAAc5rC,QAAUtnD,KAAKi5C,YAAYoO,SAAU,CACxD,IAAIt5C,EAGA,MAFA/N,MAAKkzF,cAAc5rC,QAAUtnD,KAAKi5C,YAAYqO,QAIlDtnD,KAAKkzF,cAAc7rC,SAAWrnD,KAAKi5C,YAAYqO,SAEnDtnD,KAAKkyF,MAAMlnD,SAAShrC,KAAKyyF,eAG7BzyF,KAAKizF,oBAAsB,WACvBjzF,KAAKkyF,MAAMlnD,SAAShrC,KAAK0yF,aACzB1yF,KAAKqxF,WAAW5H,kBAGpBzpF,KAAKi7E,gBAAkB,WACnBj7E,KAAKkyF,MAAMlnD,SAAShrC,KAAK0yF,YAAc1yF,KAAKsyF,eAC5CtyF,KAAKqxF,WAAWpW,mBAEpBj7E,KAAKo+E,WAAa,WACdp+E,KAAKkyF,MAAMlnD,SAAShrC,KAAK0yF,cAE7B1yF,KAAK47E,WAAa,SAAS7tE,GACnBA,EACA/N,KAAKmyF,eAAenyF,KAAKoyF,aAAa,GAEtCpyF,KAAKkyF,MAAMlnD,SAAShrC,KAAKoyF,cAEjCpyF,KAAKmzF,eAAiB,WAClBnzF,KAAKqxF,WAAW/G,uBAGpBtqF,KAAKozF,SAAW,EAChBpzF,KAAKqzF,iBAAmB,WAChBrzF,KAAKkyF,MAAMvC,QACX3vF,KAAK8xF,MAAMG,QAAS,EAEpBjyF,KAAK+7E,YAEb/7E,KAAK+7E,SAAW,SAAShuE,EAAOq5E,EAAan7E,EAAOjF,GAChD,KAAIhH,KAAKszF,SAAW,GAApB,CAEStzF,KAAKszF,SAAW,EACrBtzF,KAAKszF,WAELtzF,KAAKszF,SAAWvlF,EAAQ,EAAI,CAChC,IAAI2rB,GAAK15B,KAAKY,SACToG,KACDA,EAAS0yB,EAAGzyB,cAAgByyB,EAAGnyB,cAC9B0E,IACDA,EAAQytB,EAAGltB,aAAektB,EAAG65D,YACjC,IAAI3D,GAAU5vF,KAAKwzF,kBAAkBzlF,EAAOq5E,EAAan7E,EAAOjF,EAGhE,KAAKhH,KAAK8xF,MAAMC,iBAAoB9lF,IAAUjF,EAC1C,MAAOhH,MAAKszF,SAAW,CAEvBvlF,KACA/N,KAAKy3C,aAAa2wC,SAAW,MAE7Br6E,EACA/N,KAAKmyF,eAAevC,EAAU5vF,KAAKozF,UAAU,GAE7CpzF,KAAKkyF,MAAMlnD,SAAS4kD,EAAU5vF,KAAKozF,UAEnCpzF,KAAKszF,WACLtzF,KAAKszF,SAAW,KAGxBtzF,KAAKwzF,kBAAoB,SAASzlF,EAAOq5E,EAAan7E,EAAOjF,GACzDA,GAAWhH,KAAKyzF,cAAgB,CAChC,IAAI7D,GAAU,EACVhjB,EAAO5sE,KAAK8xF,MACZ4B,GACAznF,MAAO2gE,EAAK3gE,MACZjF,OAAQ4lE,EAAK5lE,OACb+qF,eAAgBnlB,EAAKmlB,eACrBC,cAAeplB,EAAKolB,cAwCxB,OAtCIhrF,KAAW+G,GAAS6+D,EAAK5lE,QAAUA,KACnC4lE,EAAK5lE,OAASA,EACd4oF,GAAW5vF,KAAK2yF,YAEhB/lB,EAAKmlB,eAAiBnlB,EAAK5lE,OACvBhH,KAAKwxF,eACL5kB,EAAKmlB,gBAAkB/xF,KAAK8iD,WAAW5M,aAC3Cl2C,KAAK6iD,WAAW5vC,QAAQnG,MAAM5F,OAASlH,KAAK8iD,WAAW5M,YAAc,KAErE05C,GAAoB5vF,KAAKwyF,eAGzBvmF,IAAU8B,GAAS6+D,EAAK3gE,OAASA,KACjC2jF,GAAW5vF,KAAK2yF,YAChB/lB,EAAK3gE,MAAQA,EAEM,MAAfm7E,IACAA,EAAcpnF,KAAK2zF,YAAc3zF,KAAK+3C,QAAQzc,YAAc,GAEhEt7B,KAAKonF,YAAcA,EAEnBpnF,KAAK8iD,WAAW7vC,QAAQnG,MAAM6D,KAC9B3Q,KAAKgxC,SAASlkC,MAAM6D,KAAOy2E,EAAc,KACzCxa,EAAKolB,cAAgBzpF,KAAKE,IAAI,EAAGwD,EAAQm7E,EAAcpnF,KAAK6iD,WAAW1M,YAEvEn2C,KAAK8iD,WAAW7vC,QAAQnG,MAAMyqC,MAC9Bv3C,KAAKgxC,SAASlkC,MAAMyqC,MAAQv3C,KAAK6iD,WAAW1M,WAAa,KACzDn2C,KAAKgxC,SAASlkC,MAAM5F,OAASlH,KAAK8iD,WAAW5M,YAAc,MAEvDl2C,KAAK2vC,SAAW3vC,KAAK2vC,QAAQ29B,kBAAoBttE,KAAKwtE,mBAAqBz/D,KAC3E6hF,GAAW5vF,KAAKoyF,cAGxBxlB,EAAKqlB,QAAUhmF,IAAUjF,EAErB4oF,GACA5vF,KAAK0+C,QAAQ,SAAUg1C,GAEpB9D,GAGX5vF,KAAKkxF,eAAiB,WAClB,GAAI9J,GAAcpnF,KAAK2zF,YAAc3zF,KAAK+3C,QAAQzc,YAAc,CAC5D8rD,IAAepnF,KAAKonF,cACpBpnF,KAAKozF,UAAYpzF,KAAKwzF,mBAAkB,EAAMpM,EAAapnF,KAAK8xF,MAAM7lF,MAAOjM,KAAK8xF,MAAM9qF,SAExFhH,KAAK2vC,QAAQ29B,kBAAoBttE,KAAKwtE,kBACtCxtE,KAAKkyF,MAAMlnD,SAAShrC,KAAKoyF,aAClBpyF,KAAK8xF,MAAMG,OAClBjyF,KAAKkyF,MAAMlnD,SAAShrC,KAAKoyF,cAEzBpyF,KAAK4zF,sBACL5zF,KAAKkyF,MAAMlnD,SAAShrC,KAAKsyF,iBAGjCtyF,KAAKwtE,gBAAkB,WACnB,GAAIqmB,GAAiB7zF,KAAK8xF,MAAME,cAAgC,EAAhBhyF,KAAKooF,SACjDpa,EAAQzlE,KAAK+qB,MAAMugE,EAAiB7zF,KAAKk5C,eAC7C,OAAOl5C,MAAK2vC,QAAQ69B,gBAAgBQ,EAAOhuE,KAAK8zF,kBAAoB9zF,KAAK+zF,qBAE7E/zF,KAAKw/E,kBAAoB,SAASC,GAC9Bz/E,KAAKuhD,UAAU,iBAAkBk+B,IAErCz/E,KAAK0/E,kBAAoB,WACrB,MAAO1/E,MAAKg0F,iBAEhBh0F,KAAK2/E,kBAAoB,SAASC,GAC9B5/E,KAAKuhD,UAAU,iBAAkBq+B,IAErC5/E,KAAK6/E,kBAAoB,WACrB,MAAO7/E,MAAK2hD,UAAU,mBAE1B3hD,KAAK+/E,uBAAyB,WAC1B,MAAO//E,MAAK2hD,UAAU,wBAG1B3hD,KAAK8/E,uBAAyB,SAASt4D,GACnCxnB,KAAKuhD,UAAU,sBAAuB/5B,IAE1CxnB,KAAKiN,mBAAqB,SAAS+yE,GAC/BhgF,KAAKuhD,UAAU,kBAAmBy+B,IAEtChgF,KAAKigF,mBAAqB,WACtB,MAAOjgF,MAAK2hD,UAAU,oBAE1B3hD,KAAKkgF,qBAAuB,SAASF,GACjChgF,KAAKuhD,UAAU,oBAAqBy+B,IAExChgF,KAAKmgF,qBAAuB,WACxB,MAAOngF,MAAK2hD,UAAU,sBAE1B3hD,KAAKi0F,cAAgB,WACjB,MAAOj0F,MAAK2hD,UAAU,eAE1B3hD,KAAKk0F,cAAgB,SAAStwE,GAC1B,MAAO5jB,MAAKuhD,UAAU,aAAc39B,IAGxC5jB,KAAK4gF,mBAAqB,WACtB,MAAO5gF,MAAK2hD,UAAU,oBAG1B3hD,KAAK0gF,mBAAqB,SAAS98D,GAC/B5jB,KAAKuhD,UAAU,kBAAmB39B,IAGtC5jB,KAAKo/E,uBAAyB,SAASF,GACnCl/E,KAAKuhD,UAAU,sBAAuB29B,IAG1Cl/E,KAAKq/E,uBAAyB,WAC1B,MAAOr/E,MAAK2hD,UAAU,wBAG1B3hD,KAAKm0F,2BAA6B,WAC9B,GAAIt/D,GAAM70B,KAAKm6C,aAAaoqC,UACxBv9E,EAAShH,KAAKi5C,YAAYD,UAC9B,IAAIh5C,KAAK2vC,QAAQ29B,iBAAkB,CAC/B,GAAIpvD,GAASle,KAAK2vC,QAAQ1rC,UAAUskD,WACpCrqC,GAAOq0B,OAAS,EAChB1d,EAAM70B,KAAKm6C,aAAa8zC,iBAAiB/vE,GAAQ,GACjDlX,GAAUhH,KAAK2vC,QAAQggC,aAAazxD,EAAOk0B,KAE/CpyC,KAAKo0F,qBAAqBtnF,MAAMhG,IAAM+tB,EAAI/tB,IAAM9G,KAAKi5C,YAAYtO,OAAS,KAC1E3qC,KAAKo0F,qBAAqBtnF,MAAM9F,OAASA,EAAS,MAGtDhH,KAAKgzF,mBAAqB,WACtB,GAAKhzF,KAAK8zF,kBAAqB9zF,KAAKq0F,eAApC,CAGA,IAAKr0F,KAAKq0F,eAAgB,CACtB,GAAIC,GAAcvwF,EAAImF,cAAc,MACpCorF,GAAYnrF,UAAY,mCACxBnJ,KAAKq0F,eAAiBtwF,EAAImF,cAAc,OACxClJ,KAAKq0F,eAAelrF,UAAY,mBAChCmrF,EAAY9uF,YAAYxF,KAAKq0F,gBAC7Br0F,KAAK+E,QAAQ6Q,aAAa0+E,EAAat0F,KAAK+E,QAAQ+N,YAGxD,GAAIhG,GAAQ9M,KAAKq0F,eAAevnF,KAChCA,GAAM6D,KAAS3Q,KAAKk5C,eAAiBl5C,KAAK+zF,mBAAsB/zF,KAAKooF,SAAY,KACjFt7E,EAAM0gF,WAAaxtF,KAAK8zF,iBAAmB,UAAY,SAEnD9zF,KAAK2vC,SAAiC,IAAtB3vC,KAAK2vC,QAAQshC,OAC7BjxE,KAAKwtE,oBAEbxtE,KAAKi4E,oBAAsB,WACvB,MAAOj4E,MAAKY,WAEhBZ,KAAK2iD,oBAAsB,WACvB,MAAO3iD,MAAK+E,SAEhB/E,KAAKk4E,qBAAuB,WACxB,MAAOl4E,MAAKY,WAEhBZ,KAAKwsC,sBAAwB,WACzB,GAAKxsC,KAAKusC,sBAAV,CAEA,GAAI7pC,GAAS1C,KAAKi5C,YACds7C,EAASv0F,KAAKm6C,aAAaoqC,UAAUz9E,IACrC0tF,EAAUx0F,KAAKm6C,aAAaoqC,UAAU5zE,IAC1C4jF,IAAU7xF,EAAOioC,MAEjB,IAAI2a,GAAItlD,KAAKg5C,UACb,MAAa,EAATu7C,GAAcA,EAAS7xF,EAAOsE,OAASs+C,GAA3C,CAGA,GAAIwlB,GAAI9qE,KAAKk5C,cACb,IAAIl5C,KAAKy0F,aAAc,CACnB,GAAI3kD,GAAM9vC,KAAKuM,SAASpH,MAAMgf,QAAQ,SAAU,GAChD2mD,IAAM9qE,KAAK2vC,QAAQy7B,sBAAsBt7B,GAAK,GAAG,EACjDwV,GAAK,EAETkvC,GAAWx0F,KAAK6Q,WACZ2jF,EAAUx0F,KAAK8xF,MAAME,cAAgBlnB,IACrC0pB,EAAUx0F,KAAK8xF,MAAME,cAAgBlnB,GAEzC0pB,GAAWx0F,KAAKonF,YAEhBpnF,KAAKuM,SAASO,MAAM9F,OAASs+C,EAAI,KACjCtlD,KAAKuM,SAASO,MAAMb,MAAQ6+D,EAAI,KAChC9qE,KAAKuM,SAASO,MAAM6D,KAAOpI,KAAKC,IAAIgsF,EAASx0F,KAAK8xF,MAAME,cAAgBlnB,GAAK,KAC7E9qE,KAAKuM,SAASO,MAAMhG,IAAMyB,KAAKC,IAAI+rF,EAAQv0F,KAAK8xF,MAAM9qF,OAASs+C,GAAK,QAExEtlD,KAAKoiF,mBAAqB,WACtB,MAAOpiF,MAAKi5C,YAAYoO,UAE5BrnD,KAAKwiF,wBAA0B,WAC3B,MAAOxiF,MAAKi5C,YAAYoO,UAAwC,IAA5BrnD,KAAKi5C,YAAYtO,OAAe,EAAI,IAE5E3qC,KAAKyiF,uBAAyB,WAC1B,GAAIiS,GAAQnsF,KAAK+qB,OAAOtzB,KAAKi5C,YAAYjyC,OAAShH,KAAKi5C,YAAYtO,QAAU3qC,KAAKi5C,YAAYD,WAC9F,OAAOh5C,MAAKi5C,YAAYoO,SAAW,EAAIqtC,GAE3C10F,KAAKqiF,kBAAoB,WACrB,MAAOriF,MAAKi5C,YAAYqO,SAG5BtnD,KAAKooF,SAAW,KAChBpoF,KAAK4oF,WAAa,SAASrhE,GACvBvnB,KAAKooF,SAAW7gE,EAChBvnB,KAAKqxF,WAAWzI,WAAWrhE,GAC3BvnB,KAAKm6C,aAAayuC,WAAWrhE,GAC7BvnB,KAAKuxF,aAAa3I,WAAWrhE,GAC7BvnB,KAAKmxF,YAAYvI,WAAWrhE,GAC5BvnB,KAAKkyF,MAAMlnD,SAAShrC,KAAKoyF,aACzBpyF,KAAKgzF,sBAGThzF,KAAK20F,gBAAkB,SAAS7tF,EAAKI,EAAQyJ,EAAM4mC,GAC/C,GAAIq9C,GAAK50F,KAAK4xF,YACdgD,GAAG9tF,IAAU,EAAJA,EACT8tF,EAAG1tF,OAAgB,EAAPA,EACZ0tF,EAAGr9C,MAAc,EAANA,EACXq9C,EAAGjkF,KAAY,EAALA,EACVikF,EAAG93E,EAAI83E,EAAG9tF,IAAM8tF,EAAG1tF,OACnB0tF,EAAGtvC,EAAIsvC,EAAGjkF,KAAOikF,EAAGr9C,MAChBq9C,EAAG9tF,KAAO9G,KAAKqH,WAAa,GAAKrH,KAAK2vC,SACtC3vC,KAAK2vC,QAAQy6B,cAAcwqB,EAAG9tF;AAClC9G,KAAK47E,cAET57E,KAAK60F,2BAA6B,WAC9B,MAAO70F,MAAK80F,0BAEhB90F,KAAK+0F,2BAA6B,SAASC,GACvCh1F,KAAKuhD,UAAU,0BAA2ByzC,IAE9Ch1F,KAAKi1F,2BAA6B,WAC9B,MAAOj1F,MAAK80F,0BAEhB90F,KAAKk1F,2BAA6B,SAASF,GACvCh1F,KAAKuhD,UAAU,0BAA2ByzC,IAG9Ch1F,KAAKm1F,kBAAoB,WACrB,GAAI5tF,GAAevH,KAAKi5C,YAAY3yB,UAChCyrE,EAAiB/xF,KAAK8xF,MAAMC,gBAC3B/xF,KAAKw9E,WAAax9E,KAAKo1F,iBACxB7tF,IAAiBwqF,EAAiB/xF,KAAKg5C,YAAch5C,KAAKo1F,eACtDp1F,KAAKqH,UAAYE,EAAewqF,IAChCxqF,EAAevH,KAAKqH,UAAY0qF,EAChC/xF,KAAK6iD,WAAWx7C,UAAY,OAGpCrH,KAAK6iD,WAAWqsC,gBAAgB3nF,EAAevH,KAAK4xF,aAAa90E,GACjE9c,KAAK6iD,WAAWunB,aAAapqE,KAAKqH,UAAYrH,KAAK4xF,aAAa9qF,MAEpE9G,KAAKq1F,kBAAoB,WACrBr1F,KAAK8iD,WAAWwsC,eAAetvF,KAAKi5C,YAAYhtC,MAAQ,EAAIjM,KAAKooF,SAAWpoF,KAAK4xF,aAAatsC,GAC9FtlD,KAAK8iD,WAAWynB,cAAcvqE,KAAK6Q,WAAa7Q,KAAK4xF,aAAajhF,OAGtE3Q,KAAKs1F,SAAU,EACft1F,KAAKg4B,OAAS,WACVh4B,KAAKs1F,SAAU,GAGnBt1F,KAAKu1F,SAAW,WACZv1F,KAAKs1F,SAAU,GAGnBt1F,KAAKmyF,eAAiB,SAASvC,EAAS7hF,GAKpC,GAJI/N,KAAKozF,WACLxD,GAAW5vF,KAAKozF,SAChBpzF,KAAKozF,SAAW,IAEdpzF,KAAK2vC,UAAY3vC,KAAKY,UAAU06B,aAAet7B,KAAKs1F,UAAc1F,IAAY7hF,EAEhF,YADA/N,KAAKozF,UAAYxD,EAGrB,IAAI5vF,KAAK8xF,MAAMG,OAEX,MADAjyF,MAAKozF,UAAYxD,EACV5vF,KAAK+7E,UAAS,EAEpB/7E,MAAKg5C,YACNh5C,KAAKqxF,WAAW/G,sBAGpBtqF,KAAK0+C,QAAQ,eACb,IAAIh8C,GAAS1C,KAAKi5C,WAClB,IAAI22C,EAAU5vF,KAAKoyF,aACfxC,EAAU5vF,KAAK2yF,aACf/C,EAAU5vF,KAAK0yF,aACf9C,EAAU5vF,KAAKyyF,cACf7C,EAAU5vF,KAAKwyF,eACf5C,EAAU5vF,KAAK8yF,gBACjB,CAEE,GADAlD,GAAW5vF,KAAK4zF,sBACZlxF,EAAO2kD,UAAYrnD,KAAKi5C,YAAYoO,UAAY3kD,EAAOymF,gBAAkBnpF,KAAKi5C,YAAYkwC,eAAgB,CAC1G,GAAIqM,GAAKx1F,KAAKqH,WAAa3E,EAAO2kD,SAAWrnD,KAAKi5C,YAAYoO,UAAYrnD,KAAKg5C,UAC3Ew8C,GAAK,IACLx1F,KAAKqH,UAAYmuF,EACjB5F,GAAoB5vF,KAAKwyF,cACzB5C,GAAW5vF,KAAK4zF,uBAGxBlxF,EAAS1C,KAAKi5C,YACdj5C,KAAKm1F,oBACDvF,EAAU5vF,KAAK8yF,iBACf9yF,KAAKq1F,oBACTr1F,KAAKy3C,aAAaxkC,QAAQnG,MAAM2oF,WAAc/yF,EAAOioC,OAAU,KAC/D3qC,KAAK+E,QAAQ+H,MAAM2oF,WAAc/yF,EAAOioC,OAAU,KAClD3qC,KAAK+E,QAAQ+H,MAAMb,MAAQvJ,EAAOuJ,MAAQ,EAAIjM,KAAKooF,SAAW,KAC9DpoF,KAAK+E,QAAQ+H,MAAM9F,OAAStE,EAAOwlF,UAAY,KAMnD,MAJI0H,GAAU5vF,KAAK8yF,kBACf9yF,KAAK+E,QAAQ+H,MAAMkT,YAAchgB,KAAK6Q,WAAa,KACnD7Q,KAAKgxC,SAAS7nC,UAAYnJ,KAAK6Q,YAAc,EAAI,eAAiB,gCAElE++E,EAAU5vF,KAAKoyF,aACfpyF,KAAKqxF,WAAWt0B,OAAOr6D,GACnB1C,KAAK2zF,aACL3zF,KAAKy3C,aAAaslB,OAAOr6D,GAC7B1C,KAAKmxF,YAAYp0B,OAAOr6D,GACxB1C,KAAKuxF,aAAax0B,OAAOr6D,GACzB1C,KAAKm6C,aAAa4iB,OAAOr6D,GACzB1C,KAAKwsC,wBACLxsC,KAAK01F,sBAAwB11F,KAAKm0F,iCAClCn0F,MAAK0+C,QAAQ,gBAGbkxC,EAAU5vF,KAAKwyF,eACX5C,EAAU5vF,KAAK0yF,aAAe9C,EAAU5vF,KAAKyyF,aAC7CzyF,KAAKqxF,WAAWt0B,OAAOr6D,GAEvB1C,KAAKqxF,WAAWrG,YAAYtoF,GAE5B1C,KAAK2zF,aACL3zF,KAAKy3C,aAAaslB,OAAOr6D,GAC7B1C,KAAKmxF,YAAYp0B,OAAOr6D,GACxB1C,KAAKuxF,aAAax0B,OAAOr6D,GACzB1C,KAAKm6C,aAAa4iB,OAAOr6D,GACzB1C,KAAK01F,sBAAwB11F,KAAKm0F,6BAClCn0F,KAAKwsC,4BACLxsC,MAAK0+C,QAAQ,iBAIbkxC,EAAU5vF,KAAK0yF,aACf1yF,KAAKqxF,WAAWt0B,OAAOr6D,GACnB1C,KAAK2zF,aACL3zF,KAAKy3C,aAAaslB,OAAOr6D,IAExBktF,EAAU5vF,KAAKyyF,cAChBzyF,KAAK21F,gBAAmB/F,EAAU5vF,KAAKuyF,eAAkBvyF,KAAK2zF,cAC9D3zF,KAAKy3C,aAAaslB,OAAOr6D,IAExBktF,EAAU5vF,KAAK0yF,aAAe9C,EAAU5vF,KAAKuyF,gBAC9CvyF,KAAK2zF,aACL3zF,KAAKy3C,aAAaslB,OAAOr6D,GAG7BktF,EAAU5vF,KAAKqyF,gBACfryF,KAAKm6C,aAAa4iB,OAAOr6D,GACzB1C,KAAKwsC,wBACLxsC,KAAK01F,sBAAwB11F,KAAKm0F,8BAGlCvE,GAAW5vF,KAAKsyF,cAAgBtyF,KAAK6yF,sBACrC7yF,KAAKuxF,aAAax0B,OAAOr6D,GAGzBktF,GAAW5vF,KAAKsyF,cAAgBtyF,KAAK4yF,qBACrC5yF,KAAKmxF,YAAYp0B,OAAOr6D,OAG5B1C,MAAK0+C,QAAQ,iBAIjB1+C,KAAK41F,UAAY,WACb,GAAI5uF,GAAShH,KAAK2vC,QAAQghC,kBAAoB3wE,KAAKg5C,WAC/C1yB,EAAYtmB,KAAKw9E,UAAYx9E,KAAKg5C,WAClC68C,EAAgBttF,KAAKE,KACpBzI,KAAKy9E,WAAW,GAAKz9E,KAAKg5C,WAC3BzwC,KAAKC,IAAI8d,EAAWtf,IACpBhH,KAAK4xF,aAAa90E,GAAK9c,KAAKyzF,cAAgB,GAC5Cj6C,EAAUxyC,EAASsf,CAEvB,IAAIuvE,GAAiB71F,KAAK61F,eACtB71F,KAAK8xF,MAAM9qF,QAAUhH,KAAK61F,eAAiBr8C,GAAWx5C,KAAKyxF,SAAU,CACjEj4C,GAAWx5C,KAAKyxF,WAChBzxF,KAAKyxF,SAAWj4C,EAChBx5C,KAAK6iD,WAAW8rC,WAAWn1C,GAG/B,IAAIsxB,GAAI9qE,KAAKY,UAAU4L,WACvBxM,MAAKY,UAAUkM,MAAM9F,OAAS6uF,EAAgB,KAC9C71F,KAAKwzF,mBAAkB,EAAMxzF,KAAK81F,aAAchrB,EAAG+qB,GACnD71F,KAAK61F,cAAgBA,EAErB71F,KAAK0+C,QAAQ,cAIrB1+C,KAAK4zF,oBAAsB,WACnB5zF,KAAKw9E,WAAax9E,KAAKg5C,WAAa,GACpCh5C,KAAK41F,WAET,IAAIjmD,GAAU3vC,KAAK2vC,QACfi9B,EAAO5sE,KAAK8xF,MAEZiE,EAAiBnpB,EAAK5lE,QAAU,EAAIhH,KAAKg5C,WACzCg9C,EAAch2F,KAAK2vC,QAAQghC,kBAC3BrqD,EAAY0vE,EAAch2F,KAAKg5C,WAE/BrO,EAAS3qC,KAAKqH,UAAYrH,KAAKg5C,WAC/BkvC,EAAYtb,EAAKmlB,eAAiB/xF,KAAKg5C,WAEvCi9C,EAAcj2F,KAAKk2F,kBAEnBC,GAAeJ,IAAmB/1F,KAAK80F,0BACvCloB,EAAKolB,cAAgBiE,EAAc,EAAIj2F,KAAKooF,SAAW,GAEvDgO,EAAiBp2F,KAAKwxF,eAAiB2E,CACvCC,KACAp2F,KAAKwxF,aAAe2E,EACpBn2F,KAAK8iD,WAAW6rC,WAAWwH,GAG/B,IAAIjQ,IAAiBlmF,KAAKw9E,WAAax9E,KAAKo1F,gBACrCxoB,EAAKmlB,eAAiB/xF,KAAKg5C,YAAch5C,KAAKo1F,eAC/C,CACN9uE,IAAa4/D,EAEblmF,KAAK2vC,QAAQy6B,aAAa7hE,KAAKE,KAAKzI,KAAK4xF,aAAa9qF,IAClDyB,KAAKC,IAAIxI,KAAKqH,UAAWif,EAAYsmD,EAAKmlB,eAAiB/xF,KAAK4xF,aAAa1qF,UAEjFlH,KAAK2vC,QAAQ46B,cAAchiE,KAAKE,KAAKzI,KAAK4xF,aAAajhF,KAAMpI,KAAKC,IAAIxI,KAAK6Q,WACvEolF,EAAc,EAAIj2F,KAAKooF,SAAWxb,EAAKolB,cAAgBhyF,KAAK4xF,aAAar6C,QAE7E,IAAIiC,IAAWu8C,IAAmB/1F,KAAKq2F,0BACnCzpB,EAAKmlB,eAAiBzrE,EAAY4/D,EAAgB,GAAKlmF,KAAKqH,WAC5DivF,EAAiBt2F,KAAKyxF,WAAaj4C,CACnC88C,KACAt2F,KAAKyxF,SAAWj4C,EAChBx5C,KAAK6iD,WAAW8rC,WAAWn1C,GAG/B,IAGI2vC,GAAgBoN,EAHhBC,EAAYjuF,KAAK+/E,KAAKJ,EAAYloF,KAAKg5C,YAAc,EACrDqO,EAAW9+C,KAAKE,IAAI,EAAGF,KAAKmX,OAAO1f,KAAKqH,UAAYsjC,GAAU3qC,KAAKg5C,aACnEsO,EAAUD,EAAWmvC,EAErBx9C,EAAah5C,KAAKg5C,UACtBqO,GAAW1X,EAAQugC,oBAAoB7oB,EAAU,EACjD,IAAIsD,GAAWhb,EAAQib,YAAYvD,EAC/BsD,KACAtD,EAAWsD,EAASh2B,MAAMyd,KAG9B+2C,EAAiBx5C,EAAQqH,oBAAoBqQ,EAAU,GACvDkvC,EAAiB5mD,EAAQggC,aAAatoB,GAAYrO,EAElDsO,EAAU/+C,KAAKC,IAAImnC,EAAQugC,oBAAoB5oB,EAAS,GAAI3X,EAAQiH,YAAc,GAClFsxC,EAAYtb,EAAKmlB,eAAiBpiD,EAAQggC,aAAaroB,GAAWtO,EAC1Bu9C,EAExC5rD,EAAS3qC,KAAKqH,UAAY8hF,EAAiBnwC,CAE3C,IAAI42C,GAAU,CAyBd,OAxBI5vF,MAAKi5C,YAAYhtC,OAASgqF,IAC1BrG,EAAU5vF,KAAK8yF,kBACfsD,GAAkBE,KAClB1G,EAAU5vF,KAAKwzF,mBAAkB,EAAMxzF,KAAKonF,YAAaxa,EAAK3gE,MAAO2gE,EAAK5lE,QAC1EhH,KAAK0+C,QAAQ,8BACT43C,IACAL,EAAcj2F,KAAKk2F,oBAG3Bl2F,KAAKi5C,aACDhtC,MAAQgqF,EACR1uE,QAAUvnB,KAAKooF,SACf/gC,SAAWA,EACX8hC,eAAgBA,EAChB7hC,QAAUA,EACVtO,WAAaA,EACbE,eAAiBl5C,KAAKk5C,eACtBgvC,UAAYA,EACZ5hE,UAAYA,EACZqkB,OAASA,EACT68C,aAAej/E,KAAKE,IAAI,EAAGF,KAAK+/E,MAAM39C,EAASiiC,EAAK5lE,OAAS4lE,EAAKmlB,gBAAkB/4C,IACpFhyC,OAAShH,KAAK8xF,MAAMC,gBAGjBnC,GAGX5vF,KAAK21F,aAAe,WAChB,GAAItuC,GAAWrnD,KAAKkzF,cAAc7rC,SAC9BC,EAAUtnD,KAAKkzF,cAAc5rC,OACjCtnD,MAAKkzF,cAAgB,IAErB,IAAIj6C,GAAcj5C,KAAKi5C,WAEvB,OAAIoO,GAAWpO,EAAYqO,QAAU,GACjCA,EAAUrO,EAAYoO,SAD1B,OAEIC,IAAY8O,EAAAA,GACRp2D,KAAK2zF,aACL3zF,KAAKy3C,aAAaslB,OAAO9jB,OAC7Bj5C,MAAKqxF,WAAWt0B,OAAO9jB,KAG3Bj5C,KAAKqxF,WAAWnU,YAAYjkC,EAAaoO,EAAUC,IAC5C,IAGXtnD,KAAKk2F,gBAAkB,WACnB,GAAIO,GAAYz2F,KAAK2vC,QAAQ86B,gBAI7B,OAHIzqE,MAAK4/E,iBAAmB5/E,KAAK2vC,QAAQoxB,eACrC01B,GAAa,GAEVluF,KAAKE,IAAIzI,KAAK8xF,MAAME,cAAgB,EAAIhyF,KAAKooF,SAAU7/E,KAAKmX,MAAM+2E,EAAYz2F,KAAKk5C,kBAE9Fl5C,KAAKi+E,mBAAqB,WACtBj+E,KAAKuxF,aAAa1I,WAAW7oF,KAAK2vC,QAAQ+4B,YAAW,IACrD1oE,KAAKkyF,MAAMlnD,SAAShrC,KAAK6yF,sBAE7B7yF,KAAKk+E,kBAAoB,WACrBl+E,KAAKmxF,YAAYtI,WAAW7oF,KAAK2vC,QAAQ+4B,cACzC1oE,KAAKkyF,MAAMlnD,SAAShrC,KAAK4yF,qBAE7B5yF,KAAK8nE,oBAAsB,SAAS11B,EAAKjpC,GACrCnJ,KAAKy3C,aAAaqwB,oBAAoB11B,EAAKjpC,IAE/CnJ,KAAK+nE,uBAAyB,SAAS31B,EAAKjpC,GACxCnJ,KAAKy3C,aAAaswB,uBAAuB31B,EAAKjpC,IAElDnJ,KAAKm+E,kBAAoB,SAAS5xB,GAC9BvsD,KAAKkyF,MAAMlnD,SAAShrC,KAAKuyF,gBAE7BvyF,KAAK6oE,eAAiB,SAASC,GAC3B9oE,KAAKy3C,aAAaoxB,eAAeC,GACjC9oE,KAAKkyF,MAAMlnD,SAAShrC,KAAKuyF,gBAE7BvyF,KAAKi9E,aAAe,WAChBj9E,KAAKkyF,MAAMlnD,SAAShrC,KAAKqyF,gBAE7BryF,KAAK88E,WAAa,WACd98E,KAAKm6C,aAAa2iC,cAEtB98E,KAAK48E,WAAa,WACd58E,KAAKm6C,aAAayiC,cAGtB58E,KAAKo5E,wBAA0B,SAASh2D,EAAQ4kC,EAAMrd,GAClD3qC,KAAKi0C,qBAAqB7wB,EAAQunB,GAClC3qC,KAAKi0C,qBAAqB+T,EAAMrd,IAEpC3qC,KAAKi0C,qBAAuB,SAAS/1B,EAAQysB,EAAQ+rD,GACjD,GAAkC,IAA9B12F,KAAK8xF,MAAMC,eAAf,CAGA,GAAIl9D,GAAM70B,KAAKm6C,aAAa8zC,iBAAiB/vE,GAEzCvN,EAAOkkB,EAAIlkB,KACX7J,EAAM+tB,EAAI/tB,IAEV6vF,EAAYD,GAAeA,EAAY5vF,KAAO,EAC9C8vF,EAAeF,GAAeA,EAAYxvF,QAAU,EAEpDG,EAAYrH,KAAK2xF,iBAAmB3xF,KAAK2vC,QAAQ06B,eAAiBrqE,KAAKqH,SAEvEA,GAAYsvF,EAAY7vF,GACpB6jC,IACA7jC,GAAO6jC,EAAS3qC,KAAK8xF,MAAMC,gBACnB,IAARjrF,IACAA,GAAO9G,KAAK4xF,aAAa9qF,KAC7B9G,KAAK2vC,QAAQy6B,aAAatjE,IACnBO,EAAYrH,KAAK8xF,MAAMC,eAAiB6E,EAAe9vF,EAAM9G,KAAKg5C,aACrErO,IACA7jC,GAAO6jC,EAAS3qC,KAAK8xF,MAAMC,gBAC/B/xF,KAAK2vC,QAAQy6B,aAAatjE,EAAM9G,KAAKg5C,WAAah5C,KAAK8xF,MAAMC,gBAGjE,IAAIlhF,GAAa7Q,KAAK6Q,UAElBA,GAAaF,GACTA,EAAO3Q,KAAKooF,SAAW,EAAIpoF,KAAKi5C,YAAYC,iBAC5CvoC,GAAQ3Q,KAAK4xF,aAAajhF,MAC9B3Q,KAAK2vC,QAAQ46B,cAAc55D,IACpBE,EAAa7Q,KAAK8xF,MAAME,cAAgBrhF,EAAO3Q,KAAKk5C,eAC3Dl5C,KAAK2vC,QAAQ46B,cAAchiE,KAAKmX,MAAM/O,EAAO3Q,KAAKk5C,eAAiBl5C,KAAK8xF,MAAME,gBACvEnhF,GAAc7Q,KAAKooF,UAAYz3E,EAAOE,EAAa7Q,KAAKk5C,gBAC/Dl5C,KAAK2vC,QAAQ46B,cAAc,KAGnCvqE,KAAKqqE,aAAe,WAChB,MAAOrqE,MAAK2vC,QAAQ06B,gBAExBrqE,KAAKwqE,cAAgB,WACjB,MAAOxqE,MAAK2vC,QAAQ66B,iBAExBxqE,KAAK4iF,gBAAkB,WACnB,MAAO5iF,MAAKqH,UAAYrH,KAAKg5C,YAEjCh5C,KAAK2iF,mBAAqB,WACtB,MAAOp6E,MAAKE,IAAI,EAAGF,KAAK+qB,OAAOtzB,KAAKqH,UAAYrH,KAAK8xF,MAAMC,gBAAkB/xF,KAAKg5C,YAAc,IAEpGh5C,KAAK8iF,YAAc,SAAS1wC,GACxBpyC,KAAK2vC,QAAQy6B,aAAah4B,EAAMpyC,KAAKg5C,aAGzCh5C,KAAKijF,YAAc,SAAS/kE,EAAQ24E,GACX,gBAAV34E,KACPA,GAAUk0B,IAAKl0B,EAAQq0B,OAAQ,GAEnC,IAAI1d,GAAM70B,KAAKm6C,aAAa8zC,iBAAiB/vE,GACzConC,EAAItlD,KAAK8xF,MAAMC,eAAiB/xF,KAAKg5C,WACrCrO,EAAS9V,EAAI/tB,IAAMw+C,GAAKuxC,GAAa,EAGzC,OADA72F,MAAK2vC,QAAQy6B,aAAaz/B,GACnBA,GAGX3qC,KAAK82F,MAAQ,EACb92F,KAAK+2F,WAAa,SAASC,EAAWC,GAClC,GAAI3zF,GAAI,EACJguB,EAAItxB,KAAK82F,MACTI,KAEAnqC,EAAQ,SAAShwC,EAAGo6E,EAAOC,GAC3B,MAAOA,IAAM7uF,KAAK+6B,IAAIvmB,EAAI,EAAG,GAAK,GAAKo6E,EAG3C,KAAK7zF,EAAI,EAAOguB,EAAJhuB,IAASA,EACjB4zF,EAAMloF,KAAK+9C,EAAKzpD,EAAItD,KAAK82F,MAAOE,EAAWC,EAAUD,GAEzD,OAAOE,IAEXl3F,KAAK+iF,aAAe,SAASn1D,EAAMo1D,EAAQt6E,EAASR,GAChD,GAAI2sB,GAAM70B,KAAKm6C,aAAa8zC,kBAAkB77C,IAAKxkB,EAAM2kB,OAAQ,IAC7D5H,EAAS9V,EAAI/tB,GACbk8E,KACAr4C,GAAU3qC,KAAK8xF,MAAMC,eAAiB,EAE1C,IAAIsF,GAAgBr3F,KAAKqH,SACzBrH,MAAK2vC,QAAQy6B,aAAaz/B,GACtBjiC,KAAY,GACZ1I,KAAKq5E,iBAAiBge,EAAenvF,IAG7ClI,KAAKq5E,iBAAmB,SAAS2d,EAAW9uF,GACxC,GAAI+uF,GAAUj3F,KAAKqH,SACnB,IAAKrH,KAAKg0F,gBAAV,CAEA,GAAI5oD,GAAQprC,IAEZ,IAAIg3F,GAAaC,EAAjB,CAGA,GAAIj3F,KAAK2xF,iBAAkB,CACvB,GAAI2F,GAAWt3F,KAAK2xF,iBAAiBuF,KACrC,IAAII,EAASl2F,SACT41F,EAAYM,EAAS,GACjBN,GAAaC,GACb,OAIZ,GAAIC,GAAQ9rD,EAAM2rD,WAAWC,EAAWC,EACxCj3F,MAAK2xF,kBAAoBp/D,KAAMykE,EAAWnK,GAAIoK,EAASC,MAAOA,GAE9D78C,cAAcr6C,KAAKu3F,QAEnBnsD,EAAMuE,QAAQy6B,aAAa8sB,EAAMj6D,SACjCmO,EAAMuE,QAAQw6B,WAAa8sB,EAC3Bj3F,KAAKu3F,OAAS9vF,YAAY,WAClByvF,EAAM91F,QACNgqC,EAAMuE,QAAQy6B,aAAa8sB,EAAMj6D,SACjCmO,EAAMuE,QAAQw6B,WAAa8sB,GACT,MAAXA,GACP7rD,EAAMuE,QAAQw6B,WAAa,GAC3B/+B,EAAMuE,QAAQy6B,aAAa6sB,GAC3BA,EAAU,OAEV7rD,EAAMmsD,OAASl9C,cAAcjP,EAAMmsD,QACnCnsD,EAAMumD,iBAAmB,KACzBzpF,GAAYA,MAEjB,OAEPlI,KAAKo9E,UAAY,SAAS/1E,GAClBrH,KAAKqH,YAAcA,IACnBrH,KAAKkyF,MAAMlnD,SAAShrC,KAAKwyF,eACzBxyF,KAAKqH,UAAYA,IAGzBrH,KAAKq9E,UAAY,SAASxsE,GAClB7Q,KAAK6Q,aAAeA,IACpB7Q,KAAK6Q,WAAaA,GACtB7Q,KAAKkyF,MAAMlnD,SAAShrC,KAAK8yF,kBAE7B9yF,KAAKiI,SAAW,SAAS0qB,EAAG8gB,GACxBzzC,KAAK2vC,QAAQy6B,aAAa32B,GAC1BzzC,KAAK2vC,QAAQ46B,cAAc92B,IAE/BzzC,KAAKu1C,SAAW,SAASnO,EAAQC,GAC7BA,GAAUrnC,KAAK2vC,QAAQy6B,aAAapqE,KAAK2vC,QAAQ06B,eAAiBhjC,GAClED,GAAUpnC,KAAK2vC,QAAQ46B,cAAcvqE,KAAK2vC,QAAQ66B,gBAAkBpjC,IAExEpnC,KAAKq1C,eAAiB,SAASjO,EAAQC,GACnC,MAAa,GAATA,GAAcrnC,KAAK2vC,QAAQ06B,gBAAkB,EAAIrqE,KAAK4xF,aAAa9qF,KAC7D,EACNugC,EAAS,GAAKrnC,KAAK2vC,QAAQ06B,eAAiBrqE,KAAK8xF,MAAMC,eACrD/xF,KAAKi5C,YAAY3yB,UAAY,GAAKtmB,KAAK4xF,aAAa1qF,QAChD,EACG,EAATkgC,GAAcpnC,KAAK2vC,QAAQ66B,iBAAmB,EAAIxqE,KAAK4xF,aAAajhF,MAC7D,EACPy2B,EAAS,GAAKpnC,KAAK2vC,QAAQ66B,gBAAkBxqE,KAAK8xF,MAAME,cACtDhyF,KAAKi5C,YAAYhtC,MAAQ,GAAKjM,KAAK4xF,aAAar6C,OAC5C,EAFV,QAKJv3C,KAAK82C,yBAA2B,SAASnkB,EAAG8gB,GACxC,GAAI+jD,GAAYx3F,KAAKgxC,SAAStgC,wBAE1Bi6B,GAAUhY,EAAI3yB,KAAK6Q,WAAa2mF,EAAU7mF,KAAO3Q,KAAKooF,UAAYpoF,KAAKk5C,eACvE9G,EAAM7pC,KAAK+qB,OAAOmgB,EAAIzzC,KAAKqH,UAAYmwF,EAAU1wF,KAAO9G,KAAKg5C,YAC7DjtC,EAAMxD,KAAKmX,MAAMirB,EAErB,QAAQyH,IAAKA,EAAKG,OAAQxmC,EAAK8zD,KAAMl1B,EAAS5+B,EAAM,EAAI,EAAI,KAGhE/L,KAAKwzC,wBAA0B,SAAS7gB,EAAG8gB,GACvC,GAAI+jD,GAAYx3F,KAAKgxC,SAAStgC,wBAE1B3E,EAAMxD,KAAKmX,OACViT,EAAI3yB,KAAK6Q,WAAa2mF,EAAU7mF,KAAO3Q,KAAKooF,UAAYpoF,KAAKk5C,gBAG9D9G,GAAOqB,EAAIzzC,KAAKqH,UAAYmwF,EAAU1wF,KAAO9G,KAAKg5C,UAEtD,OAAOh5C,MAAK2vC,QAAQwb,yBAAyB/Y,EAAK7pC,KAAKE,IAAIsD,EAAK,KAEpE/L,KAAKy3F,wBAA0B,SAASrlD,EAAKG,GACzC,GAAIilD,GAAYx3F,KAAKgxC,SAAStgC,wBAC1BmkB,EAAM70B,KAAK2vC,QAAQgY,yBAAyBvV,EAAKG,GAEjD5f,EAAI3yB,KAAKooF,SAAW7/E,KAAKmX,MAAMmV,EAAI0d,OAASvyC,KAAKk5C,gBACjDzF,EAAI5e,EAAIud,IAAMpyC,KAAKg5C,UAEvB,QACI56B,MAAOo5E,EAAU7mF,KAAOgiB,EAAI3yB,KAAK6Q,WACjCuO,MAAOo4E,EAAU1wF,IAAM2sC,EAAIzzC,KAAKqH,YAGxCrH,KAAK68E,eAAiB,WAClB94E,EAAI41B,YAAY35B,KAAKY,UAAW,cAEpCZ,KAAK+8E,cAAgB,WACjBh5E,EAAI61B,eAAe55B,KAAKY,UAAW,cAEvCZ,KAAKiiF,gBAAkB,SAAS7mD,GACvBp7B,KAAKy0F,eACNz0F,KAAKy0F,cACDiD,qBAAsB13F,KAAKusC,sBAC3Bhc,QAASvwB,KAAKuM,SAASO,MAAMyjB,UAGrCvwB,KAAKusC,uBAAwB,EAC7BxoC,EAAI41B,YAAY35B,KAAKuM,SAAU,mBAC/BvM,KAAKuM,SAASO,MAAMyjB,QAAU,GAC9BvwB,KAAKwsC,yBAETxsC,KAAKkiF,mBAAqB,SAAS/7E,GAC/BnG,KAAKwsC,yBAETxsC,KAAKmiF,gBAAkB,WACdniF,KAAKy0F,eAGV1wF,EAAI61B,eAAe55B,KAAKuM,SAAU,mBAClCvM,KAAKusC,sBAAwBvsC,KAAKy0F,aAAaiD,qBAC/C13F,KAAKuM,SAASO,MAAMyjB,QAAUvwB,KAAKy0F,aAAalkE,QAChDvwB,KAAKy0F,aAAe,OAExBz0F,KAAKgN,SAAW,SAASV,EAAOkiC,GAY5B,QAAS2S,GAAUthD,GACf,GAAIurC,EAAMusD,UAAYrrF,EAClB,MAAOkiC,IAAMA,GACjB,IAAK3uC,EAAOywB,SAAZ,CAEAvsB,EAAIysB,gBACA3wB,EAAO0wB,QACP1wB,EAAOywB,SACP8a,EAAMxqC,UAAU8sC,eAGhBtC,EAAM9+B,OACNvI,EAAI61B,eAAewR,EAAMxqC,UAAWwqC,EAAM9+B,MAAMgkB,SAEpD,IAAI/I,GAAU,WAAa1nB,GAASA,EAAO0nB,QACrC,YAAc6jB,EAAM9+B,WAAe,EAAI8+B,EAAMg9C,QAC/Ch9C,GAAMg9C,UAAY7gE,GAAW6jB,EAAMg9C,UACnCh9C,EAAMw9C,WAAWrhE,GACrB6jB,EAAMwsD,OAAS/3F,EAAOywB,SAEtB8a,EAAM9+B,MAAQzM,EACdkE,EAAI41B,YAAYyR,EAAMxqC,UAAWf,EAAOywB,UACxCvsB,EAAI+1B,YAAYsR,EAAMxqC,UAAW,WAAYf,EAAOwwB,QAChD+a,EAAM0mD,QACN1mD,EAAM0mD,MAAM7lF,MAAQ,EACpBm/B,EAAMioD,oBAGVjoD,EAAMgT,eAAe,eAAgB9xC,MAAMzM,IAC3C2uC,GAAMA,KAxCV,GAAIpD,GAAQprC,IAIZ,IAHAA,KAAK23F,SAAWrrF,EAChB8+B,EAAMgT,eAAe,eAAe9xC,MAAMA,IAErCA,GAAyB,gBAATA,GAIjB60C,EAAU70C,OAJ0B,CACpC,GAAIolB,GAAaplB,GAAStM,KAAK0hD,SAASp1C,MAAM41C,YAC9Cx/C,GAAOs+C,YAAY,QAAStvB,GAAayvB,KAqCjDnhD,KAAKg8E,SAAW,WACZ,MAAOh8E,MAAK23F,UAEhB33F,KAAK6zC,SAAW,SAAS/mC,EAAOitB,GAC5Bh2B,EAAI+1B,YAAY95B,KAAKY,UAAWkM,EAAOitB,KAAY,IAEvD/5B,KAAKy0C,WAAa,SAAS3nC,GACvB/I,EAAI61B,eAAe55B,KAAKY,UAAWkM,IAGvC9M,KAAKm8C,eAAiB,SAASrvC,GACvB9M,KAAKgxC,SAASlkC,MAAMoR,QAAUpR,IAC9B9M,KAAKgxC,SAASlkC,MAAMoR,OAASpR,IAErC9M,KAAK63F,eAAiB,SAAS96C,GAC3B/8C,KAAKgxC,SAASlkC,MAAMoR,OAAS6+B,GAEjC/8C,KAAKgxE,QAAU,WACXhxE,KAAKqxF,WAAWrgB,UAChBhxE,KAAKm6C,aAAa62B,aAGvBzwE,KAAK0wF,EAAgBxvF,WAGxBiB,EAAOu/C,cAAcgvC,EAAgBxvF,UAAW,YAC5C6jF,gBAAiBpjC,cAAc,GAC/B09B,gBACI/9E,IAAK,SAASsD,GACNnF,KAAKqxF,WAAW1R,kBAAkBx6E,IAClCnF,KAAKkyF,MAAMlnD,SAAShrC,KAAK0yF,cAEjCxwC,cAAc,GAElB89B,iBACIn+E,IAAK,WAAa7B,KAAKgzF,sBACvB9wC,cAAc,GAElBqjC,mBACI1jF,IAAK,WAAa7B,KAAKgzF,sBACvB9wC,aAAc,IAElBsjC,aACI3jF,IAAK,SAASiuC,GACQ,gBAAPA,KACP9vC,KAAK+zF,mBAAqBjkD,GAC9B9vC,KAAK8zF,mBAAqBhkD,EAC1B9vC,KAAKgzF,sBAETlxF,IAAK,WACD,MAAO9B,MAAK8zF,kBAAoB9zF,KAAK+zF,qBAG7CnO,YACI/jF,IAAK,SAAS+hB,GACV5jB,KAAK+3C,QAAQjrC,MAAM0a,QAAU5D,EAAO,QAAU,OAC9C5jB,KAAKkyF,MAAMlnD,SAAShrC,KAAKoyF,aACzBpyF,KAAKkxF,kBAEThvC,cAAc,GAElBujC,iBACI5jF,IAAK,SAAS+hB,GACV7f,EAAI+1B,YAAY95B,KAAK+3C,QAAS,wBAAyBn0B,IAE3Ds+B,cAAc,GAElBwjC,iBACI7jF,IAAK,SAAS+hB,GAAO5jB,KAAKy3C,aAAa+oC,mBAAmB58D,IAC1Ds+B,cAAc,GAElByjC,iBACI9jF,IAAK,SAAS+hB,GACV5jB,KAAKy3C,aAAa+wC,mBAAmB5kE,GACrC5jB,KAAKkyF,MAAMlnD,SAAShrC,KAAKuyF,gBAE7BrwC,cAAc,GAElB2jC,qBACIhkF,IAAK,SAAS+hB,GACN5jB,KAAKqxF,WAAWvR,uBAAuBl8D,IACvC5jB,KAAKkyF,MAAMlnD,SAAShrC,KAAK0yF,cAEjCxwC,cAAc,GAElBmjC,qBACIxjF,IAAK,SAASq9E,GACV,MAAKl/E,MAAKo0F,sBAOVp0F,KAAKo0F,qBAAqBtnF,MAAM0a,QAAU03D,EAAkB,GAAK,YAC7Dl/E,KAAKm6C,aAAaoqC,WAClBvkF,KAAKm0F,gCARLn0F,KAAKo0F,qBAAuBrwF,EAAImF,cAAc,OAC9ClJ,KAAKo0F,qBAAqBjrF,UAAY,6BACtCnJ,MAAK+3C,QAAQvyC,YAAYxF,KAAKo0F,wBAQtClyC,cAAc,EACd/8C,OAAO,GAEXggF,yBACItjF,IAAK,SAASiuC,GACL9vC,KAAK80F,0BAA6B90F,KAAKwxF,cACxCxxF,KAAKkyF,MAAMlnD,SAAShrC,KAAKwyF,gBAEjCtwC,cAAc,GAElBkjC,yBACIvjF,IAAK,SAASiuC,GACL9vC,KAAKq2F,0BAA6Br2F,KAAKyxF,UACxCzxF,KAAKkyF,MAAMlnD,SAAShrC,KAAKwyF,gBAEjCtwC,cAAc,GAElB4jC,UACIjkF,IAAK,SAAS+qE,GACS,gBAARA,KACPA,GAAc,MAClB5sE,KAAKY,UAAUkM,MAAMg5E,SAAWlZ,EAChC5sE,KAAKmzF,kBAETjxC,aAAc,IAElB6jC,YACIlkF,IAAK,SAASS,GACVtC,KAAKY,UAAUkM,MAAMi5E,WAAazjF,EAClCtC,KAAKmzF,mBAGbnN,UACInkF,IAAK,SAASiuC,GACV9vC,KAAK47E,eAGbqK,UACIpkF,IAAK,SAASiuC,GACV9vC,KAAK47E,eAGbsK,eACIrkF,IAAK,SAASiuC,GACVA,GAAOA,GAAO,EACV9vC,KAAKo1F,gBAAkBtlD,IAE3B9vC,KAAKo1F,eAAiBtlD,EACtB9vC,KAAKkyF,MAAMlnD,SAAShrC,KAAKwyF,iBAE7BtwC,aAAc,EACdH,YAAY,GAEhBokC,kBACItkF,IAAK,SAASiuC,GACV9vC,KAAKy3C,aAAa0wC,cAAgBr4C,EAClC9vC,KAAKkyF,MAAMlnD,SAAShrC,KAAKuyF,iBAGjCjmF,OACIzK,IAAK,SAASiuC,GAAO9vC,KAAKgN,SAAS8iC,IACnChuC,IAAK,WAAa,MAAO9B,MAAK23F,UAAY33F,KAAKsM,OAC/C41C,aAAc,mBACdH,YAAY,KAIpBniD,EAAQqxF,gBAAkBA,IAG1B/kF,IAAIpM,OAAO,4BAA4B,UAAU,UAAU,SAAS,cAAc,cAAc,wBAAwB,cAAe,SAASswB,EAAUxwB,EAASC,GACnK,YAEA,IAAI28B,GAAMpM,EAAS,cACfiwB,EAAMjwB,EAAS,cACf+tB,EAAe/tB,EAAS,wBAAwB+tB,aAChDz7C,EAAS0tB,EAAS,aAElB0nE,EAAe,SAASC,EAAoBlmE,EAAKmmE,EAAWC,GAO5D,GANAj4F,KAAKk4F,gBAAkBl4F,KAAKk4F,gBAAgB/nE,KAAKnwB,MACjDA,KAAKm4F,eAAiBn4F,KAAKm4F,eAAehoE,KAAKnwB,MAC/CA,KAAKo4F,UAAYp4F,KAAKo4F,UAAUjoE,KAAKnwB,MACjCowB,EAASioE,YAAcjoE,EAASkoE,QAChCloE,EAASkoE,MAAQloE,EAASioE,WAE1B31F,EAAOZ,IAAI,cAAgBsuB,EAASkoE,MACpCL,EAAYA,GAAav1F,EAAO+9C,UAAU5uB,EAAIxxB,GAAI,cAC/C,CACH,GAAIk4F,GAAgBv4F,KAAKw4F,cACzBP,GAAYA,GAAaM,EAAcnoE,EAASkoE,MAAM,uBAAwB,KAAM,KAEpF,IAAIG,KACJV,GAAmB59E,QAAQ,SAASuW,GAChC+nE,EAAK/nE,GAAM6nE,EAAcnoE,EAASkoE,MAAM5nE,EAAI,KAAM,KAAKvM,QAAQ,kBAAmB,OAI1F,IACQ,GAAIu0E,GAAY7mE,EAAI4pB,IACxBk9C,EAAOz4F,EAAoB,IAC3B04F,EAAO,GAAID,IAAOD,IAAe1tF,KAAM,2BACvC6tF,GAAWnrF,OAAOorF,KAAOprF,OAAOqrF,WAAWC,gBAAgBJ,EAE/D54F,MAAK87D,QAAU,GAAIm9B,QAAOJ,GAExB,MAAMjxE,GACJ,KAAIA,YAAala,QAAOwrF,cAQpB,KAAMtxE,EAPN,IAAIgxE,GAAO54F,KAAKm5F,YAAYlB,GACxBa,EAAMprF,OAAOorF,KAAOprF,OAAOqrF,UAC3BK,EAAUN,EAAIE,gBAAgBJ,EAElC54F,MAAK87D,QAAU,GAAIm9B,QAAOG,GAC1BN,EAAIO,gBAAgBD,GAK5Bp5F,KAAK87D,QAAQlzB,aACTwW,MAAO,EACPq5C,KAAOA,EACP54F,OAASgyB,EAAIxxB,GACb23F,UAAYA,IAGhBh4F,KAAKs5F,WAAa,EAClBt5F,KAAKu5F,aAELv5F,KAAK87D,QAAQ09B,UAAYx5F,KAAKo4F,YAGlC,WAEI57D,EAAIF,UAAUt8B,KAAMm+C,GAEpBn+C,KAAKo4F,UAAY,SAASxwE,GACtB,GAAIioC,GAAMjoC,EAAEplB,IACZ,QAAOqtD,EAAI7kD,MACP,IAAK,QACDhL,KAAK0+C,QAAQmR,EAAIvtD,MAAOE,KAAMqtD,EAAIrtD,MAClC,MACJ,KAAK,OACD,GAAI0F,GAAWlI,KAAKu5F,UAAU1pC,EAAIxvD,GAC9B6H,KACAA,EAAS2nD,EAAIrtD,YACNxC,MAAKu5F,UAAU1pC,EAAIxvD,IAE9B,MACJ,KAAK,QACDL,KAAKquD,YAAYwB,EAAIrtD,KACrB,MACJ,KAAK,MACDkL,OAAOkC,SAAWA,QAAQzM,KAAOyM,QAAQzM,IAAI0M,MAAMD,QAASigD,EAAIrtD,QAK5ExC,KAAKquD,YAAc,SAASrrD,GACxB0K,OAAOkC,SAAWA,QAAQxM,OAASwM,QAAQxM,MAAMJ,IAGrDhD,KAAKw4F,eAAiB,SAAS9+E,GAC3B,MAAO2mC,GAAInC,WAAWxkC,IAG1B1Z,KAAKiqE,UAAY,WACbjqE,KAAK0+C,QAAQ,gBACb1+C,KAAKy5F,WAAa,KAClBz5F,KAAK87D,QAAQmO,YACbjqE,KAAK87D,QAAU,KACX97D,KAAKsmF,MACLtmF,KAAKsmF,KAAKpnC,IAAI,SAAUl/C,KAAKm4F,gBACjCn4F,KAAKsmF,KAAO,MAGhBtmF,KAAK49C,KAAO,SAASvgB,EAAK1tB,GACtB3P,KAAK87D,QAAQlzB,aAAaxL,QAASC,EAAK1tB,KAAMA,KAGlD3P,KAAKO,KAAO,SAAS88B,EAAK1tB,EAAMzH,GAC5B,GAAIA,EAAU,CACV,GAAI7H,GAAKL,KAAKs5F,YACdt5F,MAAKu5F,UAAUl5F,GAAM6H,EACrByH,EAAKX,KAAK3O,GAEdL,KAAK49C,KAAKvgB,EAAK1tB,IAGnB3P,KAAK05F,KAAO,SAAS3wF,EAAOvG,GACxB,IACIxC,KAAK87D,QAAQlzB,aAAa7/B,MAAOA,EAAOvG,MAAOA,KAAMA,EAAKA,QAE9D,MAAMm3F,GACF/pF,QAAQxM,MAAMu2F,EAAGrtE,SAIzBtsB,KAAK45F,iBAAmB,SAASzgE,GAC1Bn5B,KAAKsmF,MACJtmF,KAAKiqE,YAETjqE,KAAKsmF,KAAOntD,EACZn5B,KAAKO,KAAK,YAAa44B,EAAIzzB,aAC3ByzB,EAAIvrB,GAAG,SAAU5N,KAAKm4F,iBAG1Bn4F,KAAKm4F,eAAiB,SAASvwE,GACtB5nB,KAAKy5F,WAINz5F,KAAKy5F,WAAWzqF,KAAK4Y,EAAEplB,OAHvBxC,KAAKy5F,YAAc7xE,EAAEplB,MACrBqG,WAAW7I,KAAKk4F,gBAAiB,KAKzCl4F,KAAKk4F,gBAAkB,WACnB,GAAI2B,GAAI75F,KAAKy5F,UACRI,KACL75F,KAAKy5F,WAAa,KACdI,EAAEz4F,OAAS,IAAMy4F,EAAEz4F,OAASpB,KAAKsmF,KAAK1vC,aAAe,EACrD52C,KAAKO,KAAK,YAAaP,KAAKsmF,KAAK5gF,aAEjC1F,KAAK05F,KAAK,UAAWl3F,KAAMq3F,MAGnC75F,KAAKm5F,YAAc,SAASlB,GACxB,GAAIt4C,GAAS,kBAAoBU,EAAInC,WAAW+5C,GAAa,KAC7D,KACI,MAAO,IAAIU,OAAMh5C,IAAU30C,KAAQ,2BACrC,MAAO4c,GACL,GAAIkyE,GAAcpsF,OAAOosF,aAAepsF,OAAOqsF,mBAAqBrsF,OAAOssF,eACvEC,EAAc,GAAIH,EAEtB,OADAG,GAAY/jF,OAAOypC,GACZs6C,EAAYC,QAAQ,8BAIpC35F,KAAKu3F,EAAar2F,UAGrB,IAAI04F,GAAiB,SAASpC,EAAoBlmE,EAAKmmE,GACnDh4F,KAAKk4F,gBAAkBl4F,KAAKk4F,gBAAgB/nE,KAAKnwB,MACjDA,KAAKm4F,eAAiBn4F,KAAKm4F,eAAehoE,KAAKnwB,MAC/CA,KAAKs5F,WAAa,EAClBt5F,KAAKu5F,aACLv5F,KAAKo6F,gBAEL,IAAIC,GAAO,KACPC,GAAW,EACXC,EAASlqF,OAAOvN,OAAOq7C,GACvB/S,EAAQprC,IAEZA,MAAK87D,WACL97D,KAAK87D,QAAQmO,UAAY,aACzBjqE,KAAK87D,QAAQlzB,YAAc,SAAShhB,GAChCwjB,EAAMgvD,cAAcprF,KAAK4Y,GACrByyE,IACIC,EACAzxF,WAAW2xF,GAEXA,MAGZx6F,KAAKy6F,YAAc,SAAS3qD,GAAOwqD,EAAWxqD,EAE9C,IAAI0qD,GAAc,WACd,GAAI3qC,GAAMzkB,EAAMgvD,cAAcn9D,OAC1B4yB,GAAIzyB,QACJi9D,EAAKxqC,EAAIzyB,SAASvtB,MAAMwqF,EAAMxqC,EAAIlgD,MAC7BkgD,EAAI9mD,OACTwxF,EAAO77C,QAAQmR,EAAI9mD,MAAO8mD,EAAIrtD,MAGtC+3F,GAAO3xD,YAAc,SAASinB,GAC1BzkB,EAAMgtD,WAAW51F,KAAMqtD,KAE3B0qC,EAAOryF,SAAW,SAAS1F,EAAM82F,GAC7Bt5F,KAAK4oC,aAAa59B,KAAM,OAAQ3K,GAAIi5F,EAAY92F,KAAMA,KAE1D+3F,EAAOb,KAAO,SAASp3F,EAAME,GACzBxC,KAAK4oC,aAAa59B,KAAM,QAAS1I,KAAMA,EAAME,KAAMA,KAGvDE,EAAOs+C,YAAY,SAAUnvB,GAAM,SAAS6oE,GAExC,IADAL,EAAO,GAAIK,GAAK1C,GAAWuC,GACpBnvD,EAAMgvD,cAAch5F,QACvBo5F,MAIZL,GAAe14F,UAAYq2F,EAAar2F,UAExC7B,EAAQu6F,eAAiBA,EACzBv6F,EAAQk4F,aAAeA,IAIvB5rF,IAAIpM,OAAO,mBAAmB,UAAU,UAAU,SAAS,YAAY,wBAAwB,eAAgB,SAASswB,EAAUxwB,EAASC,GAC3I,YAEA,IAAIsmD,GAAQ/1B,EAAS,WAAW+1B,MAC5BhI,EAAe/tB,EAAS,uBAAuB+tB,aAC/C3hB,EAAMpM,EAAS,aAEfuqE,EAAc,SAAShrD,EAASvuC,EAAQyzB,EAAK+lE,EAAQC,EAAWC,GAChE,GAAI1vD,GAAQprC,IACZA,MAAKoB,OAASA,EACdpB,KAAK2vC,QAAUA,EACf3vC,KAAKm5B,IAAMwW,EAAQoY,cACnB/nD,KAAK66F,UAAYA,EACjB76F,KAAK86F,YAAcA,EACnB96F,KAAK+6F,UAAY/6F,KAAKg7F,SAAS7qE,KAAKnwB,MACpCA,KAAKm5B,IAAIvrB,GAAG,SAAU5N,KAAK+6F,WAC3B/6F,KAAKi7F,QAAUL,EAEf56F,KAAK06E,gBAAkB,WACnB7xE,WAAW,WACPuiC,EAAMowC,oBAIdx7E,KAAK+2C,KAAOliB,CACZ,IAAIqmE,GAAYvrD,EAAQi3B,iBAAiB6f,YAAc92C,EAAQi3B,iBAAiBu0B,aAAe/5F,OAAQ,GACvGpB,MAAKo7F,gBAAmBF,EAAU95F,OAClCpB,KAAKq7F,QAEL1rD,EAAQ1rC,UAAU2J,GAAG,eAAgB5N,KAAK06E,mBAG9C,WAEIl+C,EAAIF,UAAUt8B,KAAMm+C,GACpBn+C,KAAKq7F,MAAQ,WACT,GAAIjwD,GAAQprC,KACRm5B,EAAMn5B,KAAKm5B,IACXwW,EAAU3vC,KAAK2vC,QACf9a,EAAM70B,KAAK+2C,IAEf/2C,MAAKs7F,gBAAkB3rD,EAAQ1rC,UAAU+oD,SACrCrd,EAAQ1rC,UAAUkvC,mBAClBxD,EAAQ1rC,UAAUopD,gBAEtBrtD,KAAK60B,IAAMsE,EAAI+uB,aAAarzB,EAAIud,IAAKvd,EAAI0d,QACzCvyC,KAAKwoE,SAAW74B,EAAQsK,UAAU,GAAIkM,GAAMtxB,EAAIud,IAAKvd,EAAI0d,OAAQ1d,EAAIud,IAAKvd,EAAI0d,OAASvyC,KAAKoB,QAASpB,KAAK66F,UAAW,MAAM,GAC3H76F,KAAK60B,IAAIjnB,GAAG,SAAU,SAAS7E,GAC3B4mC,EAAQ+K,aAAatP,EAAMo9B,UAC3Bp9B,EAAMo9B,SAAW74B,EAAQsK,UAAU,GAAIkM,GAAMp9C,EAAM5D,MAAMitC,IAAKrpC,EAAM5D,MAAMotC,OAAQxpC,EAAM5D,MAAMitC,IAAKrpC,EAAM5D,MAAMotC,OAAOnH,EAAMhqC,QAASgqC,EAAMyvD,UAAW,MAAM,KAEhK76F,KAAK46F,UACL56F,KAAKi7F,QAAQ9gF,QAAQ,SAASohF,GAC1B,GAAIn4E,GAAS+V,EAAI+uB,aAAaqzC,EAAMnpD,IAAKmpD,EAAMhpD,OAC/CnH,GAAMwvD,OAAO5rF,KAAKoU,KAEtBusB,EAAQg8B,eAAc,IAE1B3rE,KAAKw7F,iBAAmB,WACpB,IAAGx7F,KAAKy7F,aAAR,CACA,GAAI9rD,GAAU3vC,KAAK2vC,QACfvE,EAAQprC,IACZA,MAAKy7F,cAAe,EACpBz7F,KAAK46F,OAAOzgF,QAAQ,SAASiJ,GACzBA,EAAOolD,SAAW74B,EAAQsK,UAAU,GAAIkM,GAAM/iC,EAAOgvB,IAAKhvB,EAAOmvB,OAAQnvB,EAAOgvB,IAAKhvB,EAAOmvB,OAAOnH,EAAMhqC,QAASgqC,EAAM0vD,YAAa,MAAM,GAC3I13E,EAAOxV,GAAG,SAAU,SAAS7E,GACzB4mC,EAAQ+K,aAAat3B,EAAOolD,UAC5BplD,EAAOolD,SAAW74B,EAAQsK,UAAU,GAAIkM,GAAMp9C,EAAM5D,MAAMitC,IAAKrpC,EAAM5D,MAAMotC,OAAQxpC,EAAM5D,MAAMitC,IAAKrpC,EAAM5D,MAAMotC,OAAOnH,EAAMhqC,QAASgqC,EAAM0vD,YAAa,MAAM,SAI3K96F,KAAK07F,iBAAmB,WACpB,GAAI17F,KAAKy7F,aAAT,CACAz7F,KAAKy7F,cAAe,CACpB,KAAK,GAAIn4F,GAAI,EAAGA,EAAItD,KAAK46F,OAAOx5F,OAAQkC,IACpCtD,KAAK2vC,QAAQ+K,aAAa16C,KAAK46F,OAAOt3F,GAAGklE,YAGjDxoE,KAAKg7F,SAAW,SAASjyF,GACrB,GAAIwwD,GAAQxwD,EAAMvG,KACdqF,EAAQ0xD,EAAM1xD,KAClB,IAAGA,EAAM8sB,MAAMyd,MAAQvqC,EAAMwqC,IAAID,KAC9BvqC,EAAM8sB,MAAMyd,MAAQpyC,KAAK60B,IAAIud,MAC5BpyC,KAAKohE,UAAT,CACAphE,KAAKohE,WAAY,CACjB,IAAIu6B,GAA8B,eAAjBpiC,EAAM/yD,OAA0BqB,EAAMwqC,IAAIE,OAAS1qC,EAAM8sB,MAAM4d,OAAS1qC,EAAM8sB,MAAM4d,OAAS1qC,EAAMwqC,IAAIE,MAExH,IAAG1qC,EAAM8sB,MAAM4d,QAAUvyC,KAAK60B,IAAI0d,QAAU1qC,EAAM8sB,MAAM4d,QAAUvyC,KAAK60B,IAAI0d,OAASvyC,KAAKoB,OAAS,EAAG,CACjG,GAAIw6F,GAAoB/zF,EAAM8sB,MAAM4d,OAASvyC,KAAK60B,IAAI0d,MAEtD,IADAvyC,KAAKoB,QAAUu6F,GACX37F,KAAK2vC,QAAQy2B,UAAW,CACxB,GAAoB,eAAjB7M,EAAM/yD,OACL,IAAK,GAAIlD,GAAItD,KAAK46F,OAAOx5F,OAAS,EAAGkC,GAAK,EAAGA,IAAK,CAC9C,GAAIu4F,GAAW77F,KAAK46F,OAAOt3F,GACvBw4F,GAAU1pD,IAAKypD,EAASzpD,IAAKG,OAAQspD,EAAStpD,OAASqpD,EACxDC,GAASzpD,MAAQvqC,EAAM8sB,MAAMyd,KAAOvqC,EAAM8sB,MAAM4d,OAASspD,EAAStpD,SACjEupD,EAAOvpD,QAAUopD,GACrB37F,KAAKm5B,IAAInE,OAAO8mE,EAAQviC,EAAMpzD,UAE/B,IAAoB,eAAjBozD,EAAM/yD,OACZ,IAAK,GAAIlD,GAAItD,KAAK46F,OAAOx5F,OAAS,EAAGkC,GAAK,EAAGA,IAAK,CAC9C,GAAIu4F,GAAW77F,KAAK46F,OAAOt3F,GACvBw4F,GAAU1pD,IAAKypD,EAASzpD,IAAKG,OAAQspD,EAAStpD,OAASqpD,EACxDC,GAASzpD,MAAQvqC,EAAM8sB,MAAMyd,KAAOvqC,EAAM8sB,MAAM4d,OAASspD,EAAStpD,SACjEupD,EAAOvpD,QAAUopD,GACrB37F,KAAKm5B,IAAIlE,OAAO,GAAIkxB,GAAM21C,EAAO1pD,IAAK0pD,EAAOvpD,OAAQupD,EAAO1pD,IAAK0pD,EAAOvpD,OAASopD,IAGtF9zF,EAAM8sB,MAAM4d,SAAWvyC,KAAK60B,IAAI0d,QAA2B,eAAjBgnB,EAAM/yD,OAC/CqC,WAAW,WACP7I,KAAK60B,IAAImhB,YAAYh2C,KAAK60B,IAAIud,IAAKpyC,KAAK60B,IAAI0d,OAASopD,EACrD,KAAK,GAAIr4F,GAAI,EAAGA,EAAItD,KAAK46F,OAAOx5F,OAAQkC,IAAK,CACzC,GAAIi4F,GAAQv7F,KAAK46F,OAAOt3F,GACpBw4F,GAAU1pD,IAAKmpD,EAAMnpD,IAAKG,OAAQgpD,EAAMhpD,OAASopD,EAClDJ,GAAMnpD,MAAQvqC,EAAM8sB,MAAMyd,KAAOvqC,EAAM8sB,MAAM4d,OAASgpD,EAAMhpD,SAC3DupD,EAAOvpD,QAAUopD,GACrBJ,EAAMvlD,YAAY8lD,EAAO1pD,IAAK0pD,EAAOvpD,UAE3CpiB,KAAKnwB,MAAO,GAEV6H,EAAM8sB,MAAM4d,SAAWvyC,KAAK60B,IAAI0d,QAA2B,eAAjBgnB,EAAM/yD,QACpDqC,WAAW,WACP,IAAK,GAAIvF,GAAI,EAAGA,EAAItD,KAAK46F,OAAOx5F,OAAQkC,IAAK,CACzC,GAAIi4F,GAAQv7F,KAAK46F,OAAOt3F,EACrBi4F,GAAMnpD,MAAQvqC,EAAM8sB,MAAMyd,KAAOvqC,EAAM8sB,MAAM4d,OAASgpD,EAAMhpD,QAC3DgpD,EAAMvlD,YAAYulD,EAAMnpD,IAAKmpD,EAAMhpD,OAASopD,KAGtDxrE,KAAKnwB,MAAO,GAGtBA,KAAK60B,IAAI0b,MAAM,UAAWprC,MAAOnF,KAAK60B,KACtC,KAAK,GAAIvxB,GAAI,EAAGA,EAAItD,KAAK46F,OAAOx5F,OAAQkC,IACpCtD,KAAK46F,OAAOt3F,GAAGitC,MAAM,UAAWprC,MAAOnF,KAAK46F,OAAOt3F,KAG3DtD,KAAKohE,WAAY,IAGrBphE,KAAKw7E,eAAiB,SAASzyE,GAC3B,IAAI/I,KAAKohE,WAAcphE,KAAK2vC,QAA5B,CACA,GAAI9a,GAAM70B,KAAK2vC,QAAQ1rC,UAAUskD,WAC7B1zB,GAAIud,MAAQpyC,KAAK60B,IAAIud,KAAOvd,EAAI0d,QAAUvyC,KAAK60B,IAAI0d,QAAU1d,EAAI0d,QAAUvyC,KAAK60B,IAAI0d,OAASvyC,KAAKoB,QAClGpB,KAAKw7F,mBACLx7F,KAAKuwC,MAAM,cAAexnC,KAE1B/I,KAAK07F,mBACL17F,KAAKuwC,MAAM,cAAexnC,MAGlC/I,KAAKylD,OAAS,WACVzlD,KAAK2vC,QAAQ+K,aAAa16C,KAAKwoE,UAC/BxoE,KAAK07F,mBACL17F,KAAKm5B,IAAI1kB,oBAAoB,SAAUzU,KAAK+6F,WAC5C/6F,KAAK2vC,QAAQ1rC,UAAUwQ,oBAAoB,eAAgBzU,KAAK06E,iBAChE16E,KAAK60B,IAAI4wB,QACT,KAAK,GAAIniD,GAAI,EAAGA,EAAItD,KAAK46F,OAAOx5F,OAAQkC,IACpCtD,KAAK46F,OAAOt3F,GAAGmiD,QAEnBzlD,MAAK2vC,QAAQg8B,eAAc,GAC3B3rE,KAAK2vC,QAAU,MAEnB3vC,KAAK+qC,OAAS,WACV,GAA4B,KAAzB/qC,KAAKo7F,gBACJ,KAAMr6F,OAAM,+EAGhB,KAAK,GAFD+lE,GAAc9mE,KAAK2vC,QAAQi3B,iBAC3Bm1B,GAAiBj1B,EAAY2f,YAAc3f,EAAYq0B,YAAY/5F,OAASpB,KAAKo7F,gBAC5E93F,EAAI,EAAOy4F,EAAJz4F,EAAmBA,IAC/BwjE,EAAYx8D,MAAK,EAEjBtK,MAAKs7F,iBACLt7F,KAAK2vC,QAAQ1rC,UAAUkpD,SAASntD,KAAKs7F,oBAE9C/6F,KAAKo6F,EAAYl5F,WAGpB7B,EAAQ+6F,YAAcA,IAGtBzuF,IAAIpM,OAAO,kCAAkC,UAAU,UAAU,SAAS,gBAAgB,qBAAsB,SAASswB,EAAUxwB,EAASC,GAI5I,QAASm8F,GAAY/1C,EAAIC,GACrB,MAAOD,GAAG7T,KAAO8T,EAAG9T,KAAO6T,EAAG1T,QAAU2T,EAAG3T,OAG/C,QAASlB,GAAYzpB,GACjB,GAAI6qB,GAAK7qB,EAAE4oB,SACPzT,EAAM0V,EAAGtxB,OACT8b,EAAQwV,EAAGlnC,SACXuxB,EAAO2V,EAAGnnC,QACV2wF,EAAQr0E,EAAEstB,cACVzvB,EAASmC,EAAE0e,WAKf,IAHIxJ,GAAQyI,EAAUxB,QAClBte,EAASgtB,EAAGhtB,QAEZmC,EAAEzf,OAAOgrC,mBAA+B,GAAV1tB,EAE9B,WADAmC,GAAEzf,OAAO4oC,UAAUT,cAAc1oB,EAAE4oB,SAIvC,KAAK1T,IAASC,IAAQk/D,EAGlB,YAFe,IAAXx2E,GAAgBmC,EAAEzf,OAAOgrC,mBACzBvrB,EAAEzf,OAAO2vE,sBAIjB,IAAe,IAAXryD,EAAJ,CAGA,GAiBIy2E,GAjBA/zF,EAASyf,EAAEzf,OACXlE,EAAYkE,EAAOlE,UACnBk4F,EAAgBh0F,EAAOgrC,kBACvBte,EAAMjN,EAAE+qB,sBACRz0B,EAASja,EAAUskD,YACnB7V,EAAc9qB,EAAE8qB,eAAkBzuC,EAAUgZ,WAAa++E,EAAYnnE,EAAK3W,GAE1EC,EAASyJ,EAAE+K,EAAG/rB,EAASghB,EAAE6rB,EACzB2oD,EAAmB,SAASx0E,GAC5BzJ,EAASyJ,EAAEwgB,QACXxhC,EAASghB,EAAEygB,SAGXsH,EAAUxnC,EAAOwnC,QACjB0sD,EAAel0F,EAAOmkC,SAASwK,yBAAyB34B,EAAQvX,GAChE01F,EAAeD,CAGnB,IAAIl0F,EAAOiwE,cAAcmkB,iBACjBz/D,GAAQC,GAAOk/D,GAASl/D,EACxBm/D,EAAgB,MACXn/D,IACLm/D,EAAgB,aAEpB,IAAID,IAAUl/D,GAEV,GADAm/D,EAAgB,OACXC,GAAiBl/D,EAClB,WACGF,KACPm/D,EAAgB,QAQxB,IAJIA,GAAiB32D,EAAUxB,OAAS0O,EAAGnnC,SACvCnD,EAAOiwE,cAAc10B,oBAGJ,OAAjBw4C,EAAwB,CACxB,IAAKC,GAAiBzpD,EAClB,MAEJ,KAAKypD,EAAe,CAChB,GAAIt0F,GAAQ5D,EAAU81C,iBACtB5xC,GAAOq0F,mBAAmB30F,GAG9B,GAAI40F,GAAWx4F,EAAUmpD,UAAUwR,aAAa/pC,EAGhD1sB,GAAOuwC,kBACPvwC,EAAO25E,wBAAyB,EAE5B7kD,IACAw/D,EAAW,KACX50F,EAAQ5D,EAAUgpD,OAAO,GACzB9kD,EAAOu0F,sBAAsB70F,IAEjCM,EAAOw2C,KAAK,UAAW,WACnB,GAAIg+C,GAAS14F,EAAU81C,iBAEnB0iD,IAAYE,EAAO1/E,WAAa++E,EAAYS,EAASv+E,OAAQy+E,EAAOz+E,QACpEja,EAAUy6D,eAAei+B,EAAOz+E,SAE5B+e,EACAh5B,EAAUy6D,eAAe72D,EAAMqW,QACxBrW,IACPM,EAAOu0F,sBAAsB70F,GAC7B5D,EAAUoO,SAASxK,IAEvB5D,EAAUoO,SAASsqF,IAEvBx0F,EAAOuwC,kBACPvwC,EAAO25E,wBAAyB,QAGjC,IAAqB,SAAjBoa,EAA0B,CACjCt0E,EAAE4tB,OACFrtC,EAAO25E,wBAAyB,CAChC,IAAIrqB,GACAmlC,KACAC,EAAc,WACd,GAAIC,GAAY30F,EAAOmkC,SAASwK,yBAAyB34B,EAAQvX,GAC7DsX,EAASyxB,EAAQwb,yBAAyB2xC,EAAU1qD,IAAK0qD,EAAUvqD,OAEnEypD,GAAYM,EAAcQ,IAAcd,EAAY99E,EAAQja,EAAU+jD,QAE1Es0C,EAAeQ,EAEf30F,EAAOlE,UAAU+uC,eAAe90B,GAChC/V,EAAOmkC,SAAS2H,uBAEhB9rC,EAAO40F,uBAAuBH,GAC9BA,EAAU34F,EAAU+4F,sBAAsBV,EAAcD,GACpDl0F,EAAOiwE,cAAcjnC,iBAAqC,GAAlByrD,EAAQx7F,QAAew7F,EAAQ,GAAG3/E,YAC1E2/E,EAAQ,GAAKz0F,EAAOiwE,cAAcjnC,gBAAgB/6B,SACtDwmF,EAAQziF,QAAQhS,EAAOq0F,mBAAoBr0F,GAC3CA,EAAO80F,0BAGPd,KAAkBF,EAClBh4F,EAAUopD,iBACF8uC,GAAiBF,IACzBxkC,EAAexzD,EAAU81C,kBACzB5xC,EAAOq0F,mBAAmB/kC,IAG1Bx6B,EACAo/D,EAAe1sD,EAAQgY,yBAAyB1jD,EAAU+jD,MAE1D/jD,EAAU+uC,eAAene,GAE7BynE,GAAgBlqD,IAAK,GAAIG,OAAQ,GAEjC,IAAI2qD,GAAsB,SAASt1E,GAC/ByyB,cAAcC,GACdnyC,EAAO40F,uBAAuBH,GACzBA,EAAQx7F,SACTw7F,GAAW34F,EAAU81C,oBACzB5xC,EAAOuwC,kBACH+e,IACAtvD,EAAOu0F,sBAAsBjlC,GAC7BxzD,EAAUopD,cAAcoK,GAE5B,KAAK,GAAIn0D,GAAI,EAAGA,EAAIs5F,EAAQx7F,OAAQkC,IAChCW,EAAUoO,SAASuqF,EAAQt5F,GAC/B6E,GAAO25E,wBAAyB,EAChC35E,EAAOiwE,cAAcjnC,gBAAkB,KACvChpC,EAAOuwC,mBAGPykD,EAAsBN,CAE1B9zF,GAAMw9B,QAAQp+B,EAAOvH,UAAWw7F,EAAkBc,EAClD,IAAI5iD,GAAU7yC,YAAY,WAAY01F,KAAyB,GAE/D,OAAOv1E,GAAEre,mBAtKjB,GAAIR,GAAQqnB,EAAS,gBACjBmV,EAAYnV,EAAS,mBA0KzBxwB,GAAQyxC,YAAcA,IAItBnlC,IAAIpM,OAAO,sCAAsC,UAAU,UAAU,SAAS,6BAA8B,SAASswB,EAAUxwB,EAASC,GACxID,EAAQm4E,kBACJz1E,KAAM,iBACN2R,KAAM,SAAS9L,GAAUA,EAAOi1F,gBAAgB,KAChDrqB,SAAUhqC,IAAK,cAAe4rC,IAAK,eACnC0oB,UAAU,IAEV/6F,KAAM,iBACN2R,KAAM,SAAS9L,GAAUA,EAAOi1F,gBAAgB,IAChDrqB,SAAUhqC,IAAK,gBAAiB4rC,IAAK,iBACrC0oB,UAAU,IAEV/6F,KAAM,4BACN2R,KAAM,SAAS9L,GAAUA,EAAOi1F,gBAAgB,IAAI,IACpDrqB,SAAUhqC,IAAK,oBAAqB4rC,IAAK,qBACzC0oB,UAAU,IAEV/6F,KAAM,4BACN2R,KAAM,SAAS9L,GAAUA,EAAOi1F,gBAAgB,GAAG,IACnDrqB,SAAUhqC,IAAK,sBAAuB4rC,IAAK,uBAC3C0oB,UAAU,IAEV/6F,KAAM,mBACN2R,KAAM,SAAS9L,GAAUA,EAAOm1F,WAAW,KAC3CvqB,SAAUhqC,IAAK,gBAAiB4rC,IAAK,iBACrC0oB,UAAU,IAEV/6F,KAAM,kBACN2R,KAAM,SAAS9L,GAAUA,EAAOm1F,WAAW,IAC3CvqB,SAAUhqC,IAAK,iBAAkB4rC,IAAK,kBACtC0oB,UAAU,IAEV/6F,KAAM,mBACN2R,KAAM,SAAS9L,GAAUA,EAAOm1F,WAAW,IAAI,IAC/CvqB,SAAUhqC,IAAK,sBAAuB4rC,IAAK,uBAC3C0oB,UAAU,IAEV/6F,KAAM,kBACN2R,KAAM,SAAS9L,GAAUA,EAAOm1F,WAAW,GAAG,IAC9CvqB,SAAUhqC,IAAK,uBAAwB4rC,IAAK,wBAC5C0oB,UAAU,IAEV/6F,KAAM,iBACN2R,KAAM,SAAS9L,GAAUA,EAAOo1F,YAAYC,kBAC5CzqB,SAAUhqC,IAAK,aAAc4rC,IAAK,cAClC0oB,UAAU,IAEV/6F,KAAM,eACN2R,KAAM,SAAS9L,GAAUA,EAAOs1F,gBAChC1qB,SAAUhqC,IAAK,aAAc4rC,IAAK,gBAElCryE,KAAM,UACN2R,KAAM,SAAS9L,GAAUA,EAAOopE,WAChCwB,SAAUhqC,IAAK,aAAc4rC,IAAK,cAClC0oB,UAAU,IAEdz9F,EAAQ89F,sBACJp7F,KAAM,kBACNywE,QAAS,MACT9+D,KAAM,SAAS9L,GAAUA,EAAO2vE,uBAChCulB,UAAU,EACVM,YAAa,SAASx1F,GAAS,MAAOA,IAAUA,EAAOgrC,oBAG3D,IAAIq/B,GAAcpiD,EAAS,4BAA4BoiD,WACvD5yE,GAAQg6E,gBAAkB,GAAIpH,GAAY5yE,EAAQ89F,uBAIlDxxF,IAAIpM,OAAO,oBAAoB,UAAU,UAAU,SAAS,iBAAiB,YAAY,gBAAgB,iCAAiC,gBAAgB,eAAe,qCAAqC,aAAa,mBAAmB,aAAa,cAAe,SAASswB,EAAUxwB,EAASC,GAatS,QAASwxE,GAAK1hC,EAAS6hC,EAAQhP,GAI3B,MAHA99D,GAAOg9C,SAAShV,MAAO,EACvBhoC,EAAOg9C,SAAS8vB,OAASA,EACzB9sE,EAAOg9C,SAASowB,UAAmB,IAAPtP,EACrB99D,EAAO2sE,KAAK1hC,GA8rBvB,QAASqsD,GAAY/1C,EAAIC,GACrB,MAAOD,GAAG7T,KAAO8T,EAAG9T,KAAO6T,EAAG1T,QAAU2T,EAAG3T,OAqC/C,QAASqrD,GAAYz1F,GACbA,EAAO01F,8BAEX11F,EAAO21F,YAAc31F,EAAO21F,YAAY3tE,KAAKhoB,GAC7CA,EAAO41F,eAAiB51F,EAAO41F,eAAe5tE,KAAKhoB,GACnDA,EAAO61F,eAAiB71F,EAAO61F,eAAe7tE,KAAKhoB,GACnDA,EAAO81F,gBAAkB91F,EAAO81F,gBAAgB9tE,KAAKhoB,GACrDA,EAAO01F,4BAA8Bj+F,EAAQs+F,gBAAgB/tE,KAAKhoB,GAClEA,EAAOg2F,wBAA0Bh2F,EAAOg2F,wBAAwBhuE,KAAKhoB,GAErEA,EAAO01F,4BAA4B11F,GACnCA,EAAOyF,GAAG,gBAAiBzF,EAAO01F,6BAElC11F,EAAOyF,GAAG,YAAayjC,GACvBlpC,EAAO68C,SAAS0tB,YAAY1tB,EAAS+yB,iBAErCqmB,EAAsBj2F,IAG1B,QAASi2F,GAAsBj2F,GAgB3B,QAAS0+D,GAAMj/C,GACPy2E,IACAl2F,EAAOmkC,SAASurD,eAAe,IAC/BwG,GAAY,GAlBpB,GAAI3kE,GAAKvxB,EAAO4oC,UAAUZ,aACtBkuD,GAAY,CAChBt1F,GAAMi9B,YAAYtM,EAAI,UAAW,SAAS9R,GACrB,IAAbA,EAAEvc,SAAmBuc,EAAEtc,SAAWsc,EAAErc,UAAYqc,EAAE2gB,QAK3C81D,GACPx3B,IALKw3B,IACDl2F,EAAOmkC,SAASurD,eAAe,aAC/BwG,GAAY,KAOxBt1F,EAAMi9B,YAAYtM,EAAI,QAASmtC,GAC/B99D,EAAMi9B,YAAYtM,EAAI,OAAQmtC,GArxBlC,GAAIvI,GAAYluC,EAAS,gBAAgBkuC,UACrCnY,EAAQ/1B,EAAS,WAAW+1B,MAC5B2B,EAAY13B,EAAS,eAAe03B,UACpCzW,EAAcjhB,EAAS,gCAAgCihB,YACvDtoC,EAAQqnB,EAAS,eACjBib,EAAOjb,EAAS,cAChB40B,EAAW50B,EAAS,mCACxBxwB,GAAQolD,SAAWA,EAAS+yB,gBAAgBp8D,OAAOqpC,EAAS04C,oBAC5D,IAAItsB,GAAShhD,EAAS,YAAYghD,OAC9B1sE,EAAS,GAAI0sE,GAQbvM,EAAcz0C,EAAS,kBAAkBy0C,aAC7C,WACI7kE,KAAKs+F,oBAAsB,WACvB,MAAOt+F,MAAKquF,qBAEjB9tF,KAAKskE,EAAYpjE,WACpB,WACIzB,KAAKitD,OAAS,KACdjtD,KAAKotD,UAAY,KACjBptD,KAAKqS,SAAW,SAASxK,EAAO02F,GAC5B,GAAK12F,EAAL,CAGA,IAAK7H,KAAKmzC,mBAAyC,IAApBnzC,KAAKwS,WAAkB,CAClD,GAAIiqF,GAAWz8F,KAAK+5C,iBAGpB,IAFA/5C,KAAKotD,UAAU3mD,IAAIg2F,GACnBz8F,KAAKotD,UAAU3mD,IAAIoB,GACiB,GAAhC7H,KAAKotD,UAAUH,OAAO7rD,OAEtB,MADApB,MAAKotD,UAAU0R,YACRy/B,GAAsBv+F,KAAK26C,kBAAkB9yC,EAExD7H,MAAKotD,UAAU0R,YACf9+D,KAAKotD,UAAU3mD,IAAIg2F,GACnBz8F,KAAK89F,YAAYrB,GAGhB50F,EAAMqW,SACPrW,EAAMqW,OAASrW,EAAMwqC,IAEzB,IAAItd,GAAU/0B,KAAKotD,UAAU3mD,IAAIoB,EAcjC,OAZA7H,MAAK89F,YAAYj2F,GAEbktB,EAAQ3zB,QACRpB,KAAK+9F,eAAehpE,GAEpB/0B,KAAKwS,WAAa,IAAMxS,KAAKmzC,oBAC7BnzC,KAAK0+C,QAAQ,eACb1+C,KAAKmzC,mBAAoB,EACzBnzC,KAAK2vC,QAAQw1B,aAAc,EAC3BnlE,KAAKotD,UAAU5H,OAAOxlD,KAAK2vC,UAGxB4uD,GAAsBv+F,KAAK26C,kBAAkB9yC,KAGxD7H,KAAKqtD,cAAgB,SAASxlD,GAC1BA,EAAQA,GAAS7H,KAAKitD,OAAO,EAC7B,IAAIl4B,GAAU/0B,KAAKotD,UAAU0R,WACzB/pC,GAAQ3zB,QACRpB,KAAK+9F,eAAehpE,GAExBltB,GAAS7H,KAAK26C,kBAAkB9yC,IAEpC7H,KAAK0+D,eAAiB,SAAS7pC,GAC3B,GAAIE,GAAU/0B,KAAKotD,UAAUsR,eAAe7pC,EAC5C,OAAIE,IACA/0B,KAAK+9F,eAAehpE,GACbA,EAAQ,IAFnB,QAKJ/0B,KAAKw+F,uBAAyB,WAC1B,GAAIzpE,GAAU/0B,KAAKotD,UAAUwC,OACzB76B,GAAQ3zB,OACRpB,KAAK+9F,eAAehpE,GAChB/0B,KAAKitD,OAAO,IAChBjtD,KAAK26C,kBAAkB36C,KAAKitD,OAAO,KAG3CjtD,KAAK89F,YAAc,SAASj2F,GACxB7H,KAAKwS,WAAaxS,KAAKotD,UAAUH,OAAO7rD,OACxCpB,KAAKitD,OAAOtzC,QAAQ9R,GACpB7H,KAAK0+C,QAAQ,YAAa72C,MAAOA,KAGrC7H,KAAK+9F,eAAiB,SAAShpE,GAE3B,GADA/0B,KAAKwS,WAAaxS,KAAKotD,UAAUH,OAAO7rD,OACjB,GAAnBpB,KAAKwS,YAAmBxS,KAAKmzC,kBAAmB,CAChD,GAAIsrD,GAAYz+F,KAAKotD,UAAUH,OAAOv9B,KACtCqF,GAAQ/lB,KAAKyvF,GACbz+F,KAAKwS,WAAa,EAGtB,IAAK,GAAIlP,GAAIyxB,EAAQ3zB,OAAQkC,KAAO,CAChC,GAAI6N,GAAQnR,KAAKitD,OAAO39C,QAAQylB,EAAQzxB,GACxCtD,MAAKitD,OAAO77C,OAAOD,EAAO,GAG9BnR,KAAK0+C,QAAQ,eAAgBuO,OAAQl4B,IAEb,IAApB/0B,KAAKwS,YAAoBxS,KAAKmzC,oBAC9BnzC,KAAKmzC,mBAAoB,EACzBnzC,KAAK0+C,QAAQ,gBACb1+C,KAAK2vC,QAAQw1B,aAAc,EAC3BnlE,KAAKotD,UAAU3H,OAAOzlD,KAAK2vC,UAG/B8uD,EAAYA,GAAaz+F,KAAKitD,OAAO;AACjCwxC,IAAcA,EAAUj4C,QAAQxmD,KAAKgwC,aACrChwC,KAAK26C,kBAAkB8jD,IAE/Bz+F,KAAK0+F,eAAiB,WACd1+F,KAAKotD,YAGTptD,KAAKotD,UAAY,GAAIkR,GACrBt+D,KAAKitD,UACLjtD,KAAKwS,WAAa,IAEtBxS,KAAKk1E,aAAe,WAChB,MAAOl1E,MAAKwS,WAAaxS,KAAKotD,UAAUH,OAAOtxC,UAAY3b,KAAKgwC,aAGpEhwC,KAAKw9F,eAAiB,WAClB,GAAIx9F,KAAKwS,WAAa,EAAG,CACrB,GAAIy6C,GAASjtD,KAAKotD,UAAUH,OACxBwxC,EAAYxxC,EAAOA,EAAO7rD,OAAS,GACnCyG,EAAQs+C,EAAMoB,WAAW0F,EAAO,GAAGt4B,MAAO8pE,EAAUpsD,IAExDryC,MAAKqtD,gBACLrtD,KAAK+rC,kBAAkBlkC,EAAO42F,EAAUvgF,QAAUugF,EAAU9pE,WACzD,CACH,GAAI9sB,GAAQ7H,KAAKgwC,WACb8Y,EAAc9oD,KAAK8oD,cACnB1C,EAAWv+C,EAAM8sB,MAAMyd,IACvBkU,EAASz+C,EAAMwqC,IAAID,GACvB,IAAIgU,GAAYE,EAAQ,CACpB,GAAIwC,EACA,GAAIn0B,GAAQ9sB,EAAMwqC,IAAKA,EAAMxqC,EAAM8sB,UAEnC,IAAIA,GAAQ9sB,EAAM8sB,MAAO0d,EAAMxqC,EAAMwqC,GAIzC,OAFAryC,MAAKqS,SAAS8zC,EAAMoB,WAAWlV,EAAKA,QACpCryC,MAAKqS,SAAS8zC,EAAMoB,WAAW5yB,EAAOA,IAI1C,GAAIioE,MACAvvE,EAAIrtB,KAAKi1C,aAAamR,GAAU,EACpC/4B,GAAEsH,MAAM4d,OAAS1qC,EAAM8sB,MAAM4d,OAC7BqqD,EAAQ5tF,KAAKqe,EAEb,KAAK,GAAI/pB,GAAI8iD,EAAW,EAAOE,EAAJhjD,EAAYA,IACnCs5F,EAAQ5tF,KAAKhP,KAAKi1C,aAAa3xC,GAAG,GAEtC+pB,GAAIrtB,KAAKi1C,aAAaqR,GAAQ,GAC9Bj5B,EAAEglB,IAAIE,OAAS1qC,EAAMwqC,IAAIE,OACzBqqD,EAAQ5tF,KAAKqe,GAEbuvE,EAAQziF,QAAQna,KAAKqS,SAAUrS,QAGvCA,KAAK2+F,qBAAuB,WACxB,GAAI3+F,KAAKwS,WAAa,EAAG,CACrB,GAAIy6C,GAASjtD,KAAKotD,UAAUH,OACxBwxC,EAAYxxC,EAAOA,EAAO7rD,OAAS,GACnCyG,EAAQs+C,EAAMoB,WAAW0F,EAAO,GAAGt4B,MAAO8pE,EAAUpsD,IAExDryC,MAAKqtD,gBACLrtD,KAAK+rC,kBAAkBlkC,EAAO42F,EAAUvgF,QAAUugF,EAAU9pE,WACzD,CACH,GAAIzW,GAASle,KAAK2vC,QAAQgY,yBAAyB3nD,KAAKioD,eACpD7kC,EAASpjB,KAAK2vC,QAAQgY,yBAAyB3nD,KAAKmoD,iBAEpDy0C,EAAU58F,KAAKg9F,sBAAsB9+E,EAAQkF,EACjDw5E,GAAQziF,QAAQna,KAAKqS,SAAUrS,QAGvCA,KAAKg9F,sBAAwB,SAASV,EAAcD,EAAcuC,GAC9D,GAAIhC,MAEAiC,EAAavC,EAAa/pD,OAAS8pD,EAAa9pD,MACpD,IAAIssD,EACA,GAAIx4C,GAAci2C,EAAa/pD,OAC3BgU,EAAY81C,EAAa9pD,WAE7B,IAAI8T,GAAcg2C,EAAa9pD,OAC3BgU,EAAY+1C,EAAa/pD,MAGjC,IAAIusD,GAAaxC,EAAalqD,IAAMiqD,EAAajqD,GACjD,IAAI0sD,EACA,GAAI14C,GAAWk2C,EAAalqD,IACxBkU,EAAS+1C,EAAajqD,QAE1B,IAAIgU,GAAWi2C,EAAajqD,IACxBkU,EAASg2C,EAAalqD,GAGZ,GAAdiU,IACAA,EAAc,GACH,EAAXD,IACAA,EAAW,GAEXA,GAAYE,IACZs4C,GAAoB,EAExB,KAAK,GAAIxsD,GAAMgU,EAAiBE,GAAPlU,EAAeA,IAAO,CAC3C,GAAIvqC,GAAQs+C,EAAMoB,WACdvnD,KAAK2vC,QAAQwb,yBAAyB/Y,EAAKiU,GAC3CrmD,KAAK2vC,QAAQwb,yBAAyB/Y,EAAKmU,GAE/C,IAAI1+C,EAAMoV,UAAW,CACjB,GAAI8hF,GAAU/C,EAAYn0F,EAAMwqC,IAAK0sD,GACjC,KACJ,IAAIA,GAASl3F,EAAMwqC,IAEvBxqC,EAAMqW,OAAS2gF,EAAah3F,EAAM8sB,MAAQ9sB,EAAMwqC,IAChDuqD,EAAQ5tF,KAAKnH,GAMjB,GAHIi3F,GACAlC,EAAQnzD,WAEPm1D,EAAmB,CAEpB,IADA,GAAIvsD,GAAMuqD,EAAQx7F,OAAS,EACpBw7F,EAAQvqD,GAAKp1B,WAAao1B,EAAM,GACnCA,GACJ,IAAIA,EAAM,EAEN,IADA,GAAI1d,GAAQ,EACLioE,EAAQjoE,GAAO1X,WAClB0X,GAER,KAAK,GAAIrxB,GAAI+uC,EAAK/uC,GAAKqxB,EAAOrxB,IACtBs5F,EAAQt5F,GAAG2Z,WACX2/E,EAAQxrF,OAAO9N,EAAG,GAI9B,MAAOs5F,KAEZr8F,KAAKunD,EAAUrmD,UAClB,IAAIu2E,GAAS5nD,EAAS,YAAY4nD,QAClC,WACIh4E,KAAKi9F,uBAAyB,WAC1Bj9F,KAAKssC,SAAS2wC,eACdj9E,KAAKssC,SAAS4xC,qBAElBl+E,KAAKw8F,mBAAqB,SAASzoD,GAC1BA,EAAc71B,SACf61B,EAAc71B,OAAS61B,EAAc1B,IAEzC,IAAIvlC,GAAQ9M,KAAKk6C,mBAKjB,OAJAnG,GAAcu0B,OAAStoE,KAAK2vC,QAAQsK,UAAUlG,EAAe,gBAAiBjnC,GAE9E9M,KAAK2vC,QAAQ0+C,kBAAkBr/E,KAAK+kC,GACpC/zC,KAAK2vC,QAAQqvD,qBAAuBh/F,KAAK2vC,QAAQ0+C,kBAAkBjtF,OAC5D2yC,GAEX/zC,KAAK08F,sBAAwB,SAAS70F,GAClC,GAAKA,EAAMygE,OAAX,CAEAtoE,KAAK2vC,QAAQ+K,aAAa7yC,EAAMygE,OAChC,IAAIn3D,GAAQnR,KAAK2vC,QAAQ0+C,kBAAkB/+E,QAAQzH,EACtC,KAATsJ,GACAnR,KAAK2vC,QAAQ0+C,kBAAkBj9E,OAAOD,EAAO,GACjDnR,KAAK2vC,QAAQqvD,qBAAuBh/F,KAAK2vC,QAAQ0+C,kBAAkBjtF,SAGvEpB,KAAK+8F,uBAAyB,SAAS9vC,GAEnC,IAAK,GADDgyC,GAAaj/F,KAAK2vC,QAAQ0+C,kBACrB/qF,EAAI2pD,EAAO7rD,OAAQkC,KAAO,CAC/B,GAAIuE,GAAQolD,EAAO3pD,EACnB,IAAKuE,EAAMygE,OAAX,CAEAtoE,KAAK2vC,QAAQ+K,aAAa7yC,EAAMygE,OAChC,IAAIn3D,GAAQ8tF,EAAW3vF,QAAQzH,EAClB,KAATsJ,GACA8tF,EAAW7tF,OAAOD,EAAO,IAEjCnR,KAAK2vC,QAAQqvD,qBAAuBC,EAAW79F,QAGnDpB,KAAK89F,YAAc,SAASl2E,GACxB5nB,KAAKw8F,mBAAmB50E,EAAE/f,OAC1B7H,KAAKssC,SAAS2wC,eACdj9E,KAAKssC,SAAS4xC,qBAGlBl+E,KAAK+9F,eAAiB,SAASn2E,GAC3B5nB,KAAK+8F,uBAAuBn1E,EAAEqlC,QAC9BjtD,KAAKssC,SAAS2wC,eACdj9E,KAAKssC,SAAS4xC,qBAGlBl+E,KAAKg+F,eAAiB,SAASp2E,GACvB5nB,KAAKmzC,oBAETnzC,KAAKmzC,mBAAoB,EAEzBnzC,KAAK6zC,SAAS,mBACd7zC,KAAKm4E,WAAW/yB,mBAAmBJ,EAAS40B,iBAC5C55E,KAAKglD,SAAS5T,kBAAkB,OAAQpxC,KAAKk/F,oBAE7Cl/F,KAAKssC,SAAS2wC,eACdj9E,KAAKssC,SAAS4xC,sBAGlBl+E,KAAKi+F,gBAAkB,SAASr2E,GACxB5nB,KAAK2vC,QAAQ4tD,YAAY4B,gBAE7Bn/F,KAAKmzC,mBAAoB,EAEzBnzC,KAAKy0C,WAAW,mBAChBz0C,KAAKm4E,WAAWjzB,sBAAsBF,EAAS40B,iBAE/C55E,KAAKglD,SAAShG,qBAAqB,OAAQh/C,KAAKk/F,oBAChDl/F,KAAKssC,SAAS2wC,eACdj9E,KAAKssC,SAAS4xC,oBACdl+E,KAAKuwC,MAAM,qBAGfvwC,KAAKk/F,mBAAqB,SAASt3E,GAC/B,GAAIwV,GAAUxV,EAAEwV,QACZj1B,EAASyf,EAAEzf,MACf,IAAKA,EAAOo1F,YAAZ,CAEA,GAAKngE,EAAQg4C,kBAI2B,WAA7Bh4C,EAAQg4C,kBACf1hD,EAASvrB,EAAOi3F,iBAAiBhiE,EAASxV,EAAEjY,MACR,eAA7BytB,EAAQg4C,kBACf1hD,EAASvrB,EAAOi3F,iBAAiBhiE,EAASxV,EAAEjY,MAAM,GACd,UAA7BytB,EAAQg4C,mBACfjtE,EAAO2vE,sBACPpkD,EAAS0J,EAAQnpB,KAAK9L,EAAQyf,EAAEjY,WAEhC+jB,EAAS0J,EAAQg4C,kBAAkBjtE,EAAQyf,EAAEjY,cAZjB,CAC5B,GAAI+jB,GAAS0J,EAAQnpB,KAAK9L,EAAQyf,EAAEjY,SACpCxH,GAAOo1F,YAAYlrF,SAASlK,EAAOo1F,YAAYxjD,mBAC/C5xC,EAAOo1F,YAAYiB,yBAWvB,MAAO9qE,KAEX1zB,KAAKo/F,iBAAmB,SAAS/hE,EAAK1tB,EAAM9O,GACxC,IAAIb,KAAK8hF,uBAAT,CAEA,GAMIpuD,GANA2rE,EAAYx+F,GAAWA,EAAQw+F,UAC/BC,EAAsB,GAAXz+F,GAAmBA,GAAWA,EAAQy+F,SACjD3vD,EAAU3vC,KAAK2vC,QACf1rC,EAAYjE,KAAKiE,UACjBmpD,EAAYnpD,EAAUmpD,UACtBH,GAAUoyC,EAAYp7F,EAAYmpD,GAAWH,MAGjD,KAAKA,EAAO7rD,OACR,MAAOi8B,GAAIppB,KAAOopB,EAAIppB,KAAKjU,KAAM2P,OAAc0tB,EAAIr9B,KAAM2P,MAE7D,IAAI4vF,GAAMt7F,EAAUq6C,cACpBr6C,GAAUq6C,iBAEV,IAAIq+C,GAAS,GAAI70C,GAAUnY,EAC3B3vC,MAAK8hF,wBAAyB,CAC9B,KAAK,GAAIx+E,GAAI2pD,EAAO7rD,OAAQkC,KAAM,CAC9B,GAAIg8F,EACA,KAAOh8F,EAAI,GAAK2pD,EAAO3pD,GAAGqxB,MAAMyd,KAAO6a,EAAO3pD,EAAI,GAAG+uC,IAAID,KACrD9uC,GAERq5F,GAAOhiD,kBAAkBsS,EAAO3pD,IAChCq5F,EAAOxrF,MAAQ7N,EACftD,KAAKiE,UAAY0rC,EAAQ1rC,UAAY04F,CACrC,IAAI6C,GAAYniE,EAAIppB,KAAOopB,EAAIppB,KAAKjU,KAAM2P,OAAc0tB,EAAIr9B,KAAM2P,MAC7D+jB,IAAwBxvB,SAAds7F,IACX9rE,EAAS8rE,GACb7C,EAAO5iD,gBAAgBkT,EAAO3pD,IAElCq5F,EAAOl3C,SAEPzlD,KAAKiE,UAAY0rC,EAAQ1rC,UAAYA,EACrCjE,KAAK8hF,wBAAyB,EAC9B79E,EAAUq6C,eAAiBihD,EAC3Bt7F,EAAUu6F,wBAEV,IAAIiB,GAAOz/F,KAAKssC,SAASqlD,gBAMzB,OALA3xF,MAAKw7E,iBACLx7E,KAAK27E,oBACD8jB,GAAQA,EAAKltE,MAAQktE,EAAK5S,IAC1B7sF,KAAKssC,SAAS+sC,iBAAiBomB,EAAKltE,MAEjCmB,IAEX1zB,KAAK83E,oBAAsB,WAClB93E,KAAKmzC,oBAAqBnzC,KAAK8hF,wBAEpC9hF,KAAKu9F,YAAYlwC,iBAGrBrtD,KAAKq+E,gBAAkB,WACnB,GAAIl4E,GAAO,EACX,IAAInG,KAAKmzC,oBAAsBnzC,KAAK8hF,uBAAwB,CAGxD,IAAK,GAFD70B,GAASjtD,KAAKu9F,YAAYnwC,UAAUH,OACpCyyC,KACKp8F,EAAI,EAAGA,EAAI2pD,EAAO7rD,OAAQkC,IAC/Bo8F,EAAI1wF,KAAKhP,KAAK2vC,QAAQsM,aAAagR,EAAO3pD,IAE9C,IAAI43D,GAAKl7D,KAAK2vC,QAAQoY,cAAc8R,qBACpC1zD,GAAOu5F,EAAIlwF,KAAK0rD,GACZ/0D,EAAK/E,SAAWs+F,EAAIt+F,OAAS,GAAK85D,EAAG95D,SACrC+E,EAAO,QACHnG,MAAKiE,UAAUgZ,YACvB9W,EAAOnG,KAAK2vC,QAAQsM,aAAaj8C,KAAK8yC,qBAE1C,OAAO3sC,IAGXnG,KAAKm+F,wBAA0B,SAASv2E,EAAGxE,GACvC,GAAIpjB,KAAKmzC,oBAAsBnzC,KAAK8hF,uBAAwB,CACxD,GAAIj6E,GAAQ7H,KAAKu9F,YAAYtwC,OAAO,EACpC,IAAIjtD,KAAKu9F,YAAYtgF,WAAamG,GAAUpjB,KAAKu9F,YAAYn6E,OACzD,MACJ,IAAIyR,GAAMzR,GAAUpjB,KAAKu9F,YAAYn6E,OAC/Bvb,EAAMqW,QAAUrW,EAAM8sB,MAAQ9sB,EAAMwqC,IAAMxqC,EAAM8sB,MAChD9sB,EAAMqW,MACP89E,GAAYnnE,EAAKzR,IAClBpjB,KAAKu9F,YAAYlwC,cAAcrtD,KAAKu9F,YAAYxjD,qBAG5D/5C,KAAK2uC,QAAU,SAASxoC,GACpB,IAAInG,KAAK0vC,UAAT,CAIA,GAAI9nB,IAAKzhB,KAAMA,EAGf,IAFAnG,KAAK0+C,QAAQ,QAAS92B,GACtBzhB,EAAOyhB,EAAEzhB,MACJnG,KAAKmzC,mBAAqBnzC,KAAK8hF,uBAChC,MAAO9hF,MAAKg1B,OAAO7uB,EAEvB,IAAIuoB,GAAQvoB,EAAK8K,MAAM,cACnBg8C,EAASjtD,KAAKiE,UAAUmpD,UAAUH,MAEtC,IAAIv+B,EAAMttB,OAAS6rD,EAAO7rD,QAAUstB,EAAMttB,OAAS,IAAMstB,EAAM,GAC3D,MAAO1uB,MAAKglD,SAAS/wC,KAAK,eAAgBjU,KAAMmG,EAEpD,KAAK,GAAI7C,GAAI2pD,EAAO7rD,OAAQkC,KAAM,CAC9B,GAAIuE,GAAQolD,EAAO3pD,EACduE,GAAMoV,WACPjd,KAAK2vC,QAAQ1a,OAAOptB,GAExB7H,KAAK2vC,QAAQ3a,OAAOntB,EAAM8sB,MAAOjG,EAAMprB,OAG/CtD,KAAKuxE,QAAU,SAASC,EAAQ3wE,EAAS8+F,GAGrC,GAFA9+F,EAAUA,MACVA,EAAQ2wE,OAASA,GAAU3wE,EAAQ2wE,OACbttE,QAAlBrD,EAAQ2wE,OAAqB,CAC7B,GAAI3pE,GAAQ7H,KAAKiE,UAAUgZ,UACrBjd,KAAKiE,UAAU6wC,eACf90C,KAAKiE,UAAU+rC,UACrBnvC,GAAQ2wE,OAASxxE,KAAK2vC,QAAQsM,aAAap0C,GAE/C7H,KAAKq4E,QAAQx2E,IAAIhB,EAEjB,IAAIosD,GAASjtD,KAAKq4E,QAAQ9G,QAAQvxE,KAAK2vC,QACvC,KAAKsd,EAAO7rD,OACR,MAAO,EAEXpB,MAAK04C,iBAAmB,CACxB,IAAIz0C,GAAYjE,KAAKu9F,WAEhBoC,IACD17F,EAAUopD,cAAcJ,EAAO,GAEnC,KAAK,GAAI3pD,GAAI2pD,EAAO7rD,OAAQkC,KACxBW,EAAUoO,SAAS46C,EAAO3pD,IAAI,EAMlC,OALIuE,IAAS5D,EAAUmpD,UAAUwR,aAAa/2D,EAAM8sB,QAChD1wB,EAAUoO,SAASxK,GAAO,GAE9B7H,KAAK04C,iBAAmB,EAEjBuU,EAAO7rD,QAElBpB,KAAKo9F,gBAAkB,SAAS56B,EAAKo9B,GACjC,GAAI/3F,GAAQ7H,KAAKiE,UAAU81C,kBACvB+O,EAAcjhD,EAAMqW,QAAUrW,EAAMwqC,IAEpCwtD,EAAa7/F,KAAK2vC,QAAQgY,yBAAyB9/C,EAAMqW,OACzDle,MAAKiE,UAAUqkD,iBACfu3C,EAAWttD,OAASvyC,KAAKiE,UAAUqkD,eAEvC,IAAIN,GAAOhoD,KAAK2vC,QAAQwb,yBAAyB00C,EAAWztD,IAAMowB,EAAKq9B,EAAWttD,OAElF,IAAK1qC,EAAMoV,UAIP,GAAImG,GAAS4kC,MAHb,IAAIq0C,GAAer8F,KAAK2vC,QAAQgY,yBAAyBmB,EAAcjhD,EAAMwqC,IAAMxqC,EAAM8sB,OACrFvR,EAASpjB,KAAK2vC,QAAQwb,yBAAyBkxC,EAAajqD,IAAMowB,EAAK65B,EAAa9pD,OAK5F,IAAIuW,EAAa,CACb,GAAI+6B,GAAW19B,EAAMoB,WAAWS,EAAM5kC,EACtCygE,GAAS3lE,OAAS2lE,EAASlvD,UACxB,CACH,GAAIkvD,GAAW19B,EAAMoB,WAAWnkC,EAAQ4kC,EACxC67B,GAAS3lE,OAAS2lE,EAASxxC,IAI/B,GADAwxC,EAASh3B,cAAgBgzC,EAAWttD,OAC/BvyC,KAAKiE,UAAUkvC,mBAGhB,GAAIysD,EACA,GAAIE,GAAWj4F,EAAMqW,WAHzBle,MAAKiE,UAAUoO,SAASxK,EAM5B7H,MAAKiE,UAAUoO,SAASwxE,GACpBic,GACA9/F,KAAKiE,UAAUy6D,eAAeohC,IAEtC9/F,KAAKs3E,oBAAsB,SAAS9U,GAKhC,IAAK,GAJD7yB,GAAU3vC,KAAK2vC,QACfr9B,EAAMq9B,EAAQ4tD,YACd/8C,EAAMluC,EAAI26C,OAEL3pD,EAAIk9C,EAAIp/C,OAAQkC,KAAO,CAC5B,GAAIuE,GAAQ24C,EAAIl9C,EAChB,IAAIuE,EAAMoV,UAAW,CACjB,GAAI8iF,GAAMpwD,EAAQmF,aAAajtC,EAAM8sB,MAAMyd,IAAKvqC,EAAM8sB,MAAM4d,OAC5D1qC,GAAM8sB,MAAMyd,IAAM2tD,EAAIprE,MAAMyd,IAC5BvqC,EAAM8sB,MAAM4d,OAASwtD,EAAIprE,MAAM4d,OAC/B1qC,EAAMwqC,IAAID,IAAM2tD,EAAI1tD,IAAID,IACxBvqC,EAAMwqC,IAAIE,OAASwtD,EAAI1tD,IAAIE,QAGnCjgC,EAAIksF,wBAGJ,KAAK,GADDwB,MACK18F,EAAIk9C,EAAIp/C,OAAQkC,KAAO,CAC5B,GAAIuE,GAAQ24C,EAAIl9C,EAChB08F,GAAMrmF,QAAQg2B,EAAQsM,aAAap0C,IAG7B,EAAN26D,EACAw9B,EAAMrmF,QAAQqmF,EAAMtwE,OAEpBswE,EAAMhxF,KAAKgxF,EAAM/iE,QAErB,KAAK,GAAI35B,GAAIk9C,EAAIp/C,OAAQkC,KAAO,CAC5B,GAAIuE,GAAQ24C,EAAIl9C,GACZy8F,EAAMl4F,EAAMuO,OAChBu5B,GAAQxrB,QAAQtc,EAAOm4F,EAAM18F,IAC7BuE,EAAM8sB,MAAMyd,IAAM2tD,EAAIprE,MAAMyd,IAC5BvqC,EAAM8sB,MAAM4d,OAASwtD,EAAIprE,MAAM4d,SAGvCvyC,KAAKs9F,WAAa,SAAS96B,EAAKo9B,EAAMK,GAClC,GAAItwD,GAAU3vC,KAAK2vC,QACfr9B,EAAMq9B,EAAQ4tD,YAEd11F,EAAQyK,EAAIynC,iBAChB,KAAIlyC,EAAMoV,YACNpV,EAAQ8nC,EAAQmF,aAAajtC,EAAM8sB,MAAMyd,IAAKvqC,EAAM8sB,MAAM4d,QAC1D1qC,EAAMqW,OAAgB,IAAPskD,EAAY36D,EAAM8sB,MAAQ9sB,EAAMwqC,IAC/CryC,KAAKu9F,YAAYlrF,SAASxK,IACtBo4F,GAJR,CAOA,GAAIzuB,GAAS7hC,EAAQsM,aAAap0C,GAE9Bg8E,EAAWxS,EAAK1hC,EAAS6hC,EAAQhP,EACjCqhB,KACAA,EAAS3lE,OAAgB,IAAPskD,EAAYqhB,EAASlvD,MAAQkvD,EAASxxC,IACxDryC,KAAK04C,iBAAmB,EACxB14C,KAAK2vC,QAAQ6xB,OAAOqiB,GACpB7jF,KAAKu9F,YAAYlrF,SAASwxE,GAC1B7jF,KAAK04C,iBAAmB,EACxB14C,KAAKssC,SAAS2H,qBAAqB,KAAM,KAEzC2rD,GACA5/F,KAAKu9F,YAAY7+B,eAAe72D,EAAMqW,UAE9Cle,KAAKy9F,aAAe,WAChB,GAAI9tD,GAAU3vC,KAAK2vC,QACfr9B,EAAMq9B,EAAQ4tD,YACdtwC,EAAS36C,EAAI26C,OACb7a,EAAM,GACN8tD,EAAgBjzC,EAAOr3B,OAAO,SAASvI,GACvC,MAAIA,GAAEnP,OAAOk0B,KAAOA,GACT,OACXA,EAAM/kB,EAAEnP,OAAOk0B,MAGnB,IAAK6a,EAAO7rD,QAAU8+F,EAAc9+F,QAAU6rD,EAAO7rD,OAAS,EAyBvD,CACH8+F,EAAc/lF,QAAQ,SAASkT,GAC3B/a,EAAIosD,eAAerxC,EAAEnP,SAGzB,IAAIiiF,GAAS,EACTC,EAAWhqC,EAAAA,EACXiqC,EAAepzC,EAAOt3B,IAAI,SAAStI,GACnC,GAAI3sB,GAAI2sB,EAAEnP,OACN0P,EAAO+hB,EAAQ8U,QAAQ/jD,EAAE0xC,KACzBkuD,EAAc1yE,EAAKoB,OAAOtuB,EAAE6xC,QAAQ7tC,OAAO,MAQ/C,OAPmB,IAAf47F,IACAA,EAAc,GAEd5/F,EAAE6xC,OAAS4tD,IACXA,EAASz/F,EAAE6xC,QACG6tD,EAAdE,IACAF,EAAWE,GACRA,GAEXrzC,GAAO9yC,QAAQ,SAASkT,EAAG/pB,GACvB,GAAI5C,GAAI2sB,EAAEnP,OACNoT,EAAI6uE,EAASz/F,EAAE6xC,OACfksC,EAAI4hB,EAAa/8F,GAAK88F,CACtB9uE,GAAImtD,EACJ9uC,EAAQ3a,OAAOt0B,EAAG2qC,EAAK3B,aAAa,IAAKpY,EAAImtD,IAE7C9uC,EAAQ1a,OAAO,GAAIkxB,GAAMzlD,EAAE0xC,IAAK1xC,EAAE6xC,OAAQ7xC,EAAE0xC,IAAK1xC,EAAE6xC,OAASjhB,EAAImtD,IAEpEpxD,EAAEsH,MAAM4d,OAASllB,EAAEglB,IAAIE,OAAS4tD,EAChC9yE,EAAEsH,MAAMyd,IAAM/kB,EAAEglB,IAAID,IAAM1xC,EAAE0xC,IAC5B/kB,EAAEnP,OAASmP,EAAEglB,MAEjB//B,EAAIqoC,kBAAkBsS,EAAO,IAC7BjtD,KAAKssC,SAAS2wC,eACdj9E,KAAKssC,SAAS4xC,wBA5D+C,CAC7D,GAAIr2E,GAAQ7H,KAAKiE,UAAU+rC,WACvBuwD,EAAK14F,EAAM8sB,MAAMyd,IAAKouD,EAAK34F,EAAMwqC,IAAID,IACrCquD,EAAaF,GAAMC,CACvB,IAAIC,EAAY,CACZ,GACI7yE,GADAnlB,EAAMzI,KAAK2vC,QAAQiH,WAEvB,GACIhpB,GAAO5tB,KAAK2vC,QAAQ8U,QAAQ+7C,SACvB,OAAOnxF,KAAKue,MAAW4yE,EAAK/3F,EACrC,GACImlB,GAAO5tB,KAAK2vC,QAAQ8U,QAAQ87C,SACvB,OAAOlxF,KAAKue,MAAW2yE,EAAK,EAE5B,GAALA,IAAQA,EAAK,GACbC,GAAM/3F,IAAK+3F,EAAK/3F,EAAM,GAE9B,GAAIimB,GAAQ1uB,KAAK2vC,QAAQxW,IAAI8hC,YAAYslC,EAAIC,EAC7C9xE,GAAQ1uB,KAAK0gG,aAAahyE,EAAO+xE,GACjCzgG,KAAK2vC,QAAQxW,IAAInE,QAAQod,IAAKmuD,EAAIhuD,OAAQ,GAAI7jB,EAAMlf,KAAK,MAAQ,MAC5DixF,IACD54F,EAAM8sB,MAAM4d,OAAS,EACrB1qC,EAAMwqC,IAAIE,OAAS7jB,EAAMA,EAAMttB,OAAS,GAAGA,QAE/CpB,KAAKiE,UAAUgsC,SAASpoC,KAwChC7H,KAAK0gG,aAAe,SAAShyE,EAAOiyE,GAgChC,QAAS1pC,GAAOp3C,GACZ,MAAOwrB,GAAK3B,aAAa,IAAK7pB,GAGlC,QAAS+gF,GAAUpgG,GACf,MAAQA,GAAE,GAAYy2D,EAAO4pC,GAAUrgG,EAAE,GACnCy2D,EAAO6pC,EAAQtgG,EAAE,GAAGY,OAAS2/F,GAC7BvgG,EAAE,GAAG2jB,QAAQ,aAAc,OAFlB3jB,EAAE,GAIrB,QAASwgG,GAAWxgG,GAChB,MAAQA,GAAE,GAAYy2D,EAAO4pC,EAASC,EAAQtgG,EAAE,GAAGY,QAAUZ,EAAE,GACzDy2D,EAAO8pC,EAAM,KACbvgG,EAAE,GAAG2jB,QAAQ,aAAc,OAFlB3jB,EAAE,GAIrB,QAASygG,GAAQzgG,GACb,MAAQA,GAAE,GAAYy2D,EAAO4pC,GAAUrgG,EAAE,GACnCy2D,EAAO8pC,GACPvgG,EAAE,GAAG2jB,QAAQ,aAAc,OAFlB3jB,EAAE,GA9CrB,GACIqgG,GAAQC,EAAOC,EADfG,GAAgB,EAAMC,GAAiB,CAG3C,OAAOzyE,GAAMiH,IAAI,SAAS/H,GACtB,GAAIptB,GAAIotB,EAAKre,MAAM,0BACnB,OAAK/O,GAGS,MAAVqgG,GACAA,EAASrgG,EAAE,GAAGY,OACd0/F,EAAQtgG,EAAE,GAAGY,OACb2/F,EAAOvgG,EAAE,GAAGY,OACLZ,IAGPqgG,EAASC,EAAQC,GAAQvgG,EAAE,GAAGY,OAASZ,EAAE,GAAGY,OAASZ,EAAE,GAAGY,SAC1D+/F,GAAiB,GACjBN,GAAUrgG,EAAE,GAAGY,SACf8/F,GAAgB,GAEhBL,EAASrgG,EAAE,GAAGY,SACdy/F,EAASrgG,EAAE,GAAGY,QACd0/F,EAAQtgG,EAAE,GAAGY,SACb0/F,EAAQtgG,EAAE,GAAGY,QACb2/F,EAAOvgG,EAAE,GAAGY,SACZ2/F,EAAOvgG,EAAE,GAAGY,QAETZ,IArBKotB,KAsBb+H,IAAIgrE,EAAYC,EACfM,EAAgBC,EAAiBH,EAAaJ,EAAYK,MAsBnE1gG,KAAKy3E,EAAOv2E,WAMf7B,EAAQs+F,gBAAkB,SAASt2E,GAC/B,GAAI+nB,GAAU/nB,EAAE+nB,OACZA,KAAYA,EAAQ4tD,cACpB5tD,EAAQ0+C,qBACR1+C,EAAQ1rC,UAAUy6F,iBAClB/uD,EAAQ4tD,YAAc5tD,EAAQ1rC,WAElCjE,KAAKu9F,YAAc5tD,GAAWA,EAAQ4tD,WAEtC,IAAIxjB,GAAanyD,EAAEmyD,UACfA,KACAA,EAAWwjB,YAAYr+C,IAAI,WAAYl/C,KAAK89F,aAC5C/jB,EAAWwjB,YAAYr+C,IAAI,cAAel/C,KAAK+9F,gBAC/ChkB,EAAWwjB,YAAYr+C,IAAI,cAAel/C,KAAKg+F,gBAC/CjkB,EAAWwjB,YAAYr+C,IAAI,eAAgBl/C,KAAKi+F,iBAChDlkB,EAAWwjB,YAAYv1C,KAAK9I,IAAI,SAAWl/C,KAAKm+F,yBAChDpkB,EAAWwjB,YAAYn6E,OAAO87B,IAAI,SAAWl/C,KAAKm+F,0BAGlDxuD,IACAA,EAAQ4tD,YAAY3vF,GAAG,WAAY5N,KAAK89F,aACxCnuD,EAAQ4tD,YAAY3vF,GAAG,cAAe5N,KAAK+9F,gBAC3CpuD,EAAQ4tD,YAAY3vF,GAAG,cAAe5N,KAAKg+F,gBAC3CruD,EAAQ4tD,YAAY3vF,GAAG,eAAgB5N,KAAKi+F,iBAC5CtuD,EAAQ4tD,YAAYv1C,KAAKp6C,GAAG,SAAW5N,KAAKm+F,yBAC5CxuD,EAAQ4tD,YAAYn6E,OAAOxV,GAAG,SAAW5N,KAAKm+F,0BAG9CxuD,GAAW3vC,KAAKmzC,mBAAqBxD,EAAQ1rC,UAAUkvC,oBACnDxD,EAAQ1rC,UAAUkvC,kBAClBnzC,KAAKg+F,iBAELh+F,KAAKi+F,oBA8CjBr+F,EAAQg+F,YAAcA,EAGtBxtE,EAAS,YAAY6xB,cAAc+1B,EAAOv2E,UAAW,UACjD2/F,mBACIv/F,IAAK,SAASiuC,GACV8tD,EAAY59F,MACR8vC,GACA9vC,KAAK4N,GAAG,gBAAiB5N,KAAK69F,6BAC9B79F,KAAK4N,GAAG,YAAayjC,KAErBrxC,KAAKk/C,IAAI,gBAAiBl/C,KAAK69F,6BAC/B79F,KAAKk/C,IAAI,YAAa7N,KAG9BlsC,OAAO,OAQf+G,IAAIpM,OAAO,8BAA8B,UAAU,UAAU,SAAS,aAAc,SAASswB,EAAUxwB,EAASC,GAChH,YAEA,IAAIsmD,GAAQ/1B,EAAS,eAAe+1B,MAEhCk7C,EAAWzhG,EAAQyhG,SAAW,cAElC,WAEIrhG,KAAKshG,mBAAqB,KAC1BthG,KAAKuhG,kBAAoB,KACzBvhG,KAAK0iE,cAAgB,SAAS/yB,EAASy2C,EAAWh0C,GAC9C,GAAIxkB,GAAO+hB,EAAQ8U,QAAQrS,EAC3B,OAAIpyC,MAAKshG,mBAAmBjyF,KAAKue,GACtB,QACM,gBAAbw4D,GACOpmF,KAAKuhG,mBACLvhG,KAAKuhG,kBAAkBlyF,KAAKue,GAC5B,MACJ,IAGX5tB,KAAK2iE,mBAAqB,SAAShzB,EAASy2C,EAAWh0C,GACnD,MAAO,OAGXpyC,KAAKwhG,iBAAmB,SAAS7xD,EAASyC,EAAKG,GAC3C,GAAIv+B,GAAK,KACL4Z,EAAO+hB,EAAQ8U,QAAQrS,GACvBqvD,EAAa7zE,EAAKlpB,OAAOsP,EAC7B,IAAkB,IAAdytF,EAAJ,CAQA,IALA,GAAIp7C,GAAc9T,GAAU3kB,EAAKxsB,OAC7Bu1C,EAAShH,EAAQiH,YACjBwP,EAAWhU,EACXkU,EAASlU,IAEJA,EAAMuE,GAAQ,CACnB,GAAIt4B,GAAQsxB,EAAQ8U,QAAQrS,GAAK1tC,OAAOsP,EAExC,IAAa,IAATqK,EAAJ,CAGA,GAAaojF,GAATpjF,EACA,KAEJioC,GAASlU,GAGb,GAAIkU,EAASF,EAAU,CACnB,GAAIG,GAAY5W,EAAQ8U,QAAQ6B,GAAQllD,MACxC,OAAO,IAAI+kD,GAAMC,EAAUC,EAAaC,EAAQC,MAIxDvmD,KAAK0hG,oBAAsB,SAAS/xD,EAAS20B,EAASlyB,EAAKG,EAAQgyB,GAC/D,GAAI5vC,IAASyd,IAAKA,EAAKG,OAAQA,EAAS,GACpCF,EAAM1C,EAAQs0B,oBAAoBK,EAAS3vC,EAAO4vC,EACtD,IAAKlyB,EAAL,CAGA,GAAImxB,GAAK7zB,EAAQ0U,YAAYhS,EAAID,IAQjC,OAPU,OAANoxB,IACAA,EAAK7zB,EAAQ+yB,cAAcrwB,EAAID,MAEzB,SAANoxB,GAAiBnxB,EAAID,IAAMzd,EAAMyd,MACjCC,EAAID,MACJC,EAAIE,OAAS5C,EAAQ8U,QAAQpS,EAAID,KAAKhxC,QAEnC+kD,EAAMoB,WAAW5yB,EAAO0d,KAGnCryC,KAAK2hG,oBAAsB,SAAShyD,EAAS20B,EAASlyB,EAAKG,EAAQgyB,GAC/D,GAAIlyB,IAAOD,IAAKA,EAAKG,OAAQA,GACzB5d,EAAQgb,EAAQu0B,oBAAoBI,EAASjyB,EAEjD,OAAK1d,IAGLA,EAAM4d,SACNF,EAAIE,SAEI4T,EAAMoB,WAAW5yB,EAAO0d,IANhC,UAQL9xC,KAAK8gG,EAAS5/F,aAIjByK,IAAIpM,OAAO,sBAAsB,UAAU,UAAU,SAAS,eAAgB,SAASswB,EAAUxwB,EAASC,GAC1G,YAEAD,GAAQywB,QAAS,EACjBzwB,EAAQ0wB,SAAW,SACnB1wB,EAAQ2wB,QAAU,g9EA0HlB,IAAIxsB,GAAMqsB,EAAS,aACnBrsB,GAAIysB,gBAAgB5wB,EAAQ2wB,QAAS3wB,EAAQ0wB,YAG7CpkB,IAAIpM,OAAO,oBAAoB,UAAU,UAAU,SAAS,cAAc,cAAc,aAAc,SAASswB,EAAUxwB,EAASC,GAClI,YAOA,SAAS+hG,GAAYjyD,GACjB3vC,KAAK2vC,QAAUA,EACf3vC,KAAK2vC,QAAQkyD,cAAgB7hG,KAC7BA,KAAK2vC,QAAQggC,aAAe3vE,KAAK2vE,aACjC3vE,KAAK2vC,QAAQkhC,uBAAyB7wE,KAAK6wE,uBAC3C7wE,KAAK8hG,eAAiB9hG,KAAK8hG,eAAe3xE,KAAKnwB,MAC/CA,KAAK+hG,cAAgB/hG,KAAK+hG,cAAc5xE,KAAKnwB,MAC7CA,KAAKgiG,eAAiBhiG,KAAKgiG,eAAe7xE,KAAKnwB,MAC/CA,KAAK2vC,QAAQsyD,mBACbjiG,KAAKkiG,gBAAkBliG,KAAKkiG,gBAAgB/xE,KAAKnwB,MAEjDA,KAAK2vC,QAAQ/hC,GAAG,SAAU5N,KAAK8hG,gBAC/B9hG,KAAK2vC,QAAQ/hC,GAAG,eAAgB5N,KAAKkiG,iBAjBzC,GACIn+F,IADMqsB,EAAS,aACTA,EAAS,aACPA,GAAS,WAAW+1B,OAkBhC,WACInmD,KAAK2vE,aAAe,SAASv9B,GACzB,GAAIkT,EAKJ,OAHIA,GADAtlD,KAAK0sD,YACD1sD,KAAK0sD,YAAYta,IAAQpyC,KAAK0sD,YAAYta,GAAK6iB,UAAY,EAE3D,EACHj1D,KAAK+gE,cAAiB/gE,KAAKgmE,UAAU5zB,GAG/BpyC,KAAKgmE,UAAU5zB,GAAKhxC,OAAS,EAAIkkD,EAFjC,EAAIA,GAMnBtlD,KAAK6wE,uBAAyB,WAC1B,GAAID,GAAa,CAKjB,OAJA5wE,MAAK0sD,YAAYvyC,QAAQ,SAAS2wD,GAC1BA,GAAKA,EAAE7V,WACP2b,GAAa9F,EAAE7V,YAEhB2b,GAGX5wE,KAAKkiG,gBAAkB,SAASt6E,GAC5B5nB,KAAKwlD,OAAO59B,EAAEzf,SAGlBnI,KAAKwlD,OAAS,SAASr9C,GACfA,GAAWA,EAAO05F,eAAiB15F,EAAO05F,eAAiB7hG,MAC3DmI,EAAO05F,cAAcp8C,SAErBzlD,KAAKmI,QAAUA,IAGnBnI,KAAKylD,SACLzlD,KAAKmI,OAASA,EAEVA,IACAA,EAAO05F,cAAgB7hG,KACvBmI,EAAOmkC,SAAS1+B,GAAG,eAAgB5N,KAAKgiG,gBACxC75F,EAAOmkC,SAAS1+B,GAAG,cAAe5N,KAAK+hG,kBAG/C/hG,KAAKylD,OAAS,SAAS79B,GACnB,GAAIzf,GAASnI,KAAKmI,MAClB,IAAKA,EAAL,CAGAnI,KAAKmI,OAAS,KACdA,EAAO05F,cAAgB,KAEvB15F,EAAOmkC,SAAS4S,IAAI,eAAgBl/C,KAAKgiG,gBACzC75F,EAAOmkC,SAAS4S,IAAI,cAAel/C,KAAK+hG,cACxC,IAAIr1C,GAAc1sD,KAAK2vC,QAAQ+c,WAC/BA,IAAeA,EAAYvyC,QAAQ,SAAS2wD,GACpCA,GAAKA,EAAEpxC,IAAMoxC,EAAEpxC,GAAGl1B,aAClBsmE,EAAEq3B,aAAc,EAChBr3B,EAAEpxC,GAAGl1B,WAAWC,YAAYqmE,EAAEpxC,SAK1C15B,KAAK8hG,eAAiB,SAASl6E,GAC3B,GAAI8kC,GAAc1sD,KAAK2vC,QAAQ+c,WAC/B,IAAKA,EAAL,CAEA,GAAI6M,GAAQ3xC,EAAEplB,KACVqF,EAAQ0xD,EAAM1xD,MACdu+C,EAAWv+C,EAAM8sB,MAAMyd,IACvB9kB,EAAMzlB,EAAMwqC,IAAID,IAAMgU,CAE1B,IAAY,IAAR94B,OACG,IAAoB,cAAhBisC,EAAM/yD,QAA0C,eAAhB+yD,EAAM/yD,OAAyB,CACtE,GAAIuuB,GAAU23B,EAAYt7C,OAAOg1C,EAAW,EAAG94B,EAC/CyH,GAAQ5a,QAAQ,SAAS2wD,GACrBA,GAAK9qE,KAAKoiG,iBAAiBt3B,IAC5B9qE,MACHA,KAAKqiG,kBACF,CACH,GAAI1yF,GAAO,GAAIkU,OAAMyJ,EACrB3d,GAAKgK,QAAQysC,EAAU,GACvBsG,EAAYt7C,OAAOvB,MAAM68C,EAAa/8C,GACtC3P,KAAKqiG,iBAIbriG,KAAKqiG,YAAc,WACf,GAAI31C,GAAc1sD,KAAK2vC,QAAQ+c,WAC/B,IAAKA,EAAL,CACA,GAAI41C,IAAY,CAChB51C,GAAYvyC,QAAQ,SAAS2wD,EAAGxnE,GACxBwnE,IACAw3B,GAAY,EACZx3B,EAAE14B,IAAM9uC,KAGZg/F,IACAtiG,KAAK2vC,QAAQ+c,YAAc,QAGnC1sD,KAAKuiG,cAAgB,SAASz3B,GACrB9qE,KAAK2vC,QAAQ+c,cACd1sD,KAAK2vC,QAAQ+c,YAAc,GAAI7oC,OAAM7jB,KAAK2vC,QAAQiH,cAEtD52C,KAAK2vC,QAAQ+c,YAAYoe,EAAE14B,KAAO04B,CAElC,IAAIx+B,GAAWtsC,KAAKmI,OAAOmkC,QA0B3B,OAzBIw+B,GAAE/0B,OAAS+0B,EAAEpxC,KACboxC,EAAEpxC,GAAK31B,EAAImF,cAAc,OACzB4hE,EAAEpxC,GAAGxgB,UAAY4xD,EAAE/0B,MAEnB+0B,EAAEpxC,KACF31B,EAAI41B,YAAYmxC,EAAEpxC,GAAI,2BACtBoxC,EAAEpxC,GAAG5sB,MAAMsuB,SAAW,WACtB0vC,EAAEpxC,GAAG5sB,MAAM01F,OAAS,EACpBl2D,EAAS1rC,UAAU4E,YAAYslE,EAAEpxC,IACjCoxC,EAAEq3B,aAAc,GAGfr3B,EAAE23B,cACH33B,EAAEpxC,GAAG5sB,MAAM01F,OAAS,GAEnB13B,EAAE43B,cACH53B,EAAE43B,YAAc53B,EAAEpxC,GAAGpa,cAEP,MAAdwrD,EAAE7V,WACF6V,EAAE7V,SAAW6V,EAAE43B,YAAcp2D,EAAS2M,YAAYD,YAEtDh5C,KAAK2vC,QAAQY,MAAM,cAAe/tC,MAAMmyB,OAAOyd,IAAK04B,EAAE14B,QAEtDpyC,KAAKqiG,cACLriG,KAAK+hG,cAAc,KAAMz1D,GAClBw+B,GAGX9qE,KAAKoiG,iBAAmB,SAASt3B,GAI7B,GAHAA,EAAEq3B,aAAc,EACZr3B,EAAEpxC,IAAMoxC,EAAEpxC,GAAGl1B,YACbsmE,EAAEpxC,GAAGl1B,WAAWC,YAAYqmE,EAAEpxC,IAC9BoxC,EAAE3iE,QAAU2iE,EAAE3iE,OAAO6oE,QAAS,IAC9BlG,EAAE3iE,OAAO6oE,UACX,MAAMppD,IACJ5nB,KAAK2vC,QAAQ+c,cACb1sD,KAAK2vC,QAAQ+c,YAAYoe,EAAE14B,KAAOluC,QACtClE,KAAK2vC,QAAQY,MAAM,cAAe/tC,MAAMmyB,OAAOyd,IAAK04B,EAAE14B,QACtDpyC,KAAKqiG,eAGTriG,KAAK2iG,gBAAkB,SAAS73B,GAC5B9qE,KAAK2vC,QAAQsyD,gBAAgBjzF,KAAK87D,GAClC9qE,KAAKmI,QAAUnI,KAAKmI,OAAOmkC,SAASsvC,cAGxC57E,KAAKgiG,eAAiB,SAASp6E,EAAG0kB,GAC9B,GAAIs2D,GAAiB5iG,KAAK2vC,QAAQsyD,gBAC9Bv/F,EAAS4pC,EAAS2M,WAEtB,IAAK2pD,GAAmBA,EAAexhG,OAAvC,CAEA,IAAK,GADDoH,GAAM4tD,EAAAA,EACD9yD,EAAI,EAAGA,EAAIs/F,EAAexhG,OAAQkC,IAAK,CAC5C,GAAIwnE,GAAI83B,EAAet/F,EAClBwnE,GAAEq3B,cACHr3B,EAAEq3B,aAAc,EAChB71D,EAAS1rC,UAAU4E,YAAYslE,EAAEpxC,KAGrCoxC,EAAExlB,EAAIwlB,EAAEpxC,GAAGpa,aAENwrD,EAAE+3B,aACH/3B,EAAEA,EAAIA,EAAEpxC,GAAG4B,YACXwvC,EAAEF,YAAcriE,KAAK+/E,KAAKxd,EAAEA,EAAIpoE,EAAOw2C,gBAG3C,IAAI+b,GAAW6V,EAAExlB,EAAI5iD,EAAOs2C,UACxB8xB,GAAEg4B,YACF7tC,GAAYj1D,KAAK2vC,QAAQigC,gBAAgB9E,EAAE14B,KAC5B,EAAX6iB,IACAA,EAAW,IAEf6V,EAAE7V,UAAYA,IACd6V,EAAE7V,SAAWA,EACT6V,EAAE14B,IAAM5pC,IACRA,EAAMsiE,EAAE14B,MAGhB5pC,GAAO4tD,EAAAA,IACPp2D,KAAK2vC,QAAQY,MAAM,cAAe/tC,MAAMmyB,OAAOyd,IAAK5pC,MACpDxI,KAAK2vC,QAAQo7B,gBAAkB,MAEnC/qE,KAAK2vC,QAAQsyD,qBAGjBjiG,KAAK+hG,cAAgB,SAASn6E,EAAG0kB,GAC7B,GAAI5pC,GAAS4pC,EAAS2M,YAClByT,EAAc1sD,KAAK2vC,QAAQ+c,WAC/B,IAAKA,EAAL,CAKA,IAHA,GAAIv5C,GAAQ5K,KAAKC,IAAIxI,KAAKqnD,SAAU3kD,EAAO2kD,UACvC9d,EAAOhhC,KAAKE,IAAIzI,KAAKsnD,QAAS5kD,EAAO4kD,QAASoF,EAAYtrD,QAEvD+R,EAAQ,IAAMu5C,EAAYv5C,IAC7BA,GAEJnT,MAAKqnD,SAAW3kD,EAAO2kD,SACvBrnD,KAAKsnD,QAAU5kD,EAAO4kD,QAEtBhb,EAAS6N,aAAaz3C,OAASA,CAC/B,KAAK,GAAIY,GAAI6P,EAAYo2B,GAALjmC,EAAWA,IAAK,CAChC,GAAIwnE,GAAIpe,EAAYppD,EACpB,IAAKwnE,GAAMA,EAAEpxC,GAAb,CAEKoxC,EAAEq3B,cACHr3B,EAAEq3B,aAAc,EAChB71D,EAAS1rC,UAAU4E,YAAYslE,EAAEpxC,IAErC,IAAI5yB,GAAMwlC,EAAS6N,aAAa8zC,kBAAkB77C,IAAK9uC,EAAGivC,OAAO,IAAI,GAAMzrC,GACtEgkE,GAAEg4B,YACHh8F,GAAOpE,EAAOs2C,WAAah5C,KAAK2vC,QAAQigC,gBAAgB9E,EAAE14B,MAC9D04B,EAAEpxC,GAAG5sB,MAAMhG,IAAMA,EAAMpE,EAAOioC,OAAS,IAEvC,IAAIh6B,GAAOm6D,EAAE23B,YAAc,EAAIn2D,EAAS86C,WACnCtc,GAAE+3B,aACHlyF,GAAQ27B,EAASz7B,YACrBi6D,EAAEpxC,GAAG5sB,MAAM6D,KAAOA,EAAO,KAErBm6D,EAAE+3B,WACF/3B,EAAEpxC,GAAG5sB,MAAMyqC,MAAQjL,EAASolD,UAAUv7C,WAAa,KAEnD20B,EAAEpxC,GAAG5sB,MAAMyqC,MAAQ,SAKhCh3C,KAAKqhG,EAAYngG,WAGpB7B,EAAQgiG,YAAcA,IAItB11F,IAAIpM,OAAO,wBAAwB,UAAU,UAAU,SAAS,mBAAmB,cAAc,aAAc,SAASswB,EAAUxwB,EAASC,GAC3I,YAKA,SAASkjG,GAAa7/E,EAAOsuD,EAAQwxB,GAIjC,IAHA,GAAI7vF,GAAQ,EACRo2B,EAAOrmB,EAAM9hB,OAAS,EAEVmoC,GAATp2B,GAAe,CAClB,GAAI4yD,GAAO5yD,EAAQo2B,GAAS,EACxB9oC,EAAIuiG,EAAWxxB,EAAQtuD,EAAM6iD,GACjC,IAAItlE,EAAI,EACJ0S,EAAQ4yD,EAAM,MACb,CAAA,KAAQ,EAAJtlE,GAGL,MAAOslE,EAFPx8B,GAAOw8B,EAAM,GAIrB,QAAS5yD,EAAQ,GAGrB,QAAS8vF,GAAgBtzD,EAASyC,EAAKowB,GACnC,GAAIsG,GAAcn5B,EAAQo5B,iBAAiBjyD,KAAKqvC,EAAMH,cACtD,IAAK8iB,EAAY1nE,OAAjB,CAGA,GAAIkC,GAAIy/F,EAAaj6B,GAAc12B,IAAKA,EAAKG,OAAQ,IAAK4T,EAAMH,cACxD,GAAJ1iD,IACAA,GAAKA,EAAI,GAETA,GAAKwlE,EAAY1nE,OAAS,EAC1BkC,EAAIk/D,EAAM,EAAI,EAAIsG,EAAY1nE,OAAS,EAC5B,IAANkC,GAAiB,EAANk/D,IAChBl/D,EAAIwlE,EAAY1nE,OAAS,EAE7B,IAAIm1C,GAAauyB,EAAYxlE,EAC7B,IAAKizC,GAAeisB,EAApB,CAGA,GAAIjsB,EAAWnE,MAAQA,EAAK,CACxB,EACImE,GAAauyB,EAAYxlE,GAAKk/D,SACzBjsB,GAAcA,EAAWnE,MAAQA,EAC1C,KAAKmE,EACD,MAAOuyB,GAAY56C,QAI3B,GAAIK,KACJ6jB,GAAMmE,EAAWnE,GACjB,GACI7jB,GAAc,EAANi0C,EAAU,UAAY,QAAQjsB,GACtCA,EAAauyB,EAAYxlE,GAAKk/D,SACzBjsB,GAAcA,EAAWnE,KAAOA,EACzC,OAAO7jB,GAAQntB,QAAUmtB,IAtD7B,GAAIqzE,GAAcxxE,EAAS,mBAAmBwxE,YAC1C79F,EAAMqsB,EAAS,cACf+1B,EAAQ/1B,EAAS,YAAY+1B,KAuDjCvmD,GAAQi1E,gBAAkB,SAAS1sE,EAAQq6D,GACvC,GAAI7yB,GAAUxnC,EAAOwnC,OAChBA,GAAQkyD,gBACTlyD,EAAQkyD,cAAgB,GAAID,GAAYjyD,GACxCA,EAAQkyD,cAAcr8C,OAAOr9C,GAGjC,IAAI0sB,GAAM1sB,EAAOk0E,oBACbjqC,EAAMvd,EAAIud,IACV8wD,EAAYvzD,EAAQ+c,aAAe/c,EAAQ+c,YAAYta,EACvD8wD,GACAA,EAAUlyB,UAEV5+B,GAAOowB,CAEX,IACI2gC,GADAr6B,EAAcm6B,EAAgBtzD,EAASyC,EAAKowB,EAEhD,IAAIsG,EAAa,CACb,GAAIvyB,GAAauyB,EAAY,EAC7Bj0C,GAAI0d,QAAUgE,EAAW1hB,KAAmC,gBAArB0hB,GAAWhE,OAC5CgE,EAAW1hB,IAAIuuE,GACf7sD,EAAWhE,SAAW,EAC5B1d,EAAIud,IAAMmE,EAAWnE,IACrB+wD,EAAah7F,EAAOmkC,SAASmL,aAAahB,aAAa5hB,EAAIud,SACxD,CAAA,GAAI8wD,EACP,MAEAC,IACIh9F,MAAO,eACPgD,UAAW,UAGnBhB,EAAOwnC,QAAQ6xB,OAAO3sC,EAAIud,KAC1BjqC,EAAOlE,UAAU+uC,eAAene,EAEhC,IAAIi2C,IACA14B,IAAKvd,EAAIud,IACTywD,YAAY,EACZJ,aAAa,EACb/oE,GAAI31B,EAAImF,cAAc,QAEtBwwB,EAAKoxC,EAAEpxC,GAAGl0B,YAAYzB,EAAImF,cAAc,QACxCm6F,EAAQv4B,EAAEpxC,GAAGl0B,YAAYzB,EAAImF,cAAc,OAC/Cm6F,GAAMl6F,UAAY,sBAAwBg6F,EAAWh6F,SAErD,IAAIwH,GAAOxI,EAAOmkC,SAAS6N,aACtB8zC,iBAAiBp5D,GAAKlkB,IAC3B0yF,GAAMv2F,MAAM6D,KAAOA,EAAOxI,EAAOmkC,SAAS86C,YAAc,EAAI,KAE5Dtc,EAAEpxC,GAAGvwB,UAAY,uBACjBuwB,EAAGvwB,UAAY,gBAAkBg6F,EAAWh6F,UAC5CuwB,EAAGxgB,UAAYiqF,EAAWh9F,KAAKqJ,KAAK,QAEpCkqB,EAAGl0B,YAAYzB,EAAImF,cAAc,OAEjC,IAAI+7C,GAAK,SAASjH,EAAG3Y,EAAQ7B,GACzB,MAAe,KAAX6B,GAA+B,QAAd7B,GAAqC,WAAdA,EAA5C,QACIsnC,EAAEkG,WACM5zC,QAAS,SAIzB0tC,GAAEkG,QAAU,WACJ7oE,EAAOiwE,cAActgC,iBAEzB3vC,EAAOgwE,WAAWjzB,sBAAsBD,GACxCtV,EAAQkyD,cAAcO,iBAAiBt3B,GACvC3iE,EAAO+2C,IAAI,kBAAmB4rB,EAAEkG,SAChC7oE,EAAO+2C,IAAI,gBAAiB4rB,EAAEkG,SAC9B7oE,EAAO+2C,IAAI,UAAW4rB,EAAEkG,SACxB7oE,EAAO+2C,IAAI,SAAU4rB,EAAEkG,WAG3B7oE,EAAOgwE,WAAW/yB,mBAAmBH,GACrC98C,EAAOyF,GAAG,kBAAmBk9D,EAAEkG,SAC/B7oE,EAAOyF,GAAG,gBAAiBk9D,EAAEkG,SAC7B7oE,EAAOyF,GAAG,UAAWk9D,EAAEkG,SACvB7oE,EAAOyF,GAAG,SAAUk9D,EAAEkG,SAEtB7oE,EAAOwnC,QAAQkyD,cAAcU,cAAcz3B,GAE3CA,EAAEpxC,GAAG5vB,YAAc3B,EAAOvC,MAAMuqB,KAAKhoB,GAErCA,EAAOmkC,SAAS2H,qBAAqB,KAAM,IAAM/sC,OAAQ4jE,EAAEpxC,GAAGpa,gBAIlEvb,EAAIysB,gBAAgB,w5BAiCjB,MAIHtkB,IAAIpM,OAAO,WAAW,UAAU,UAAU,SAAS,yBAAyB,cAAc,gBAAgB,aAAa,mBAAmB,kBAAkB,uBAAuB,2BAA2B,4BAA4B,kBAAkB,mBAAmB,6BAA6B,qBAAqB,uBAAuB,cAAe,SAASswB,EAAUxwB,EAASC,GACnY,YAEAuwB,GAAS,uBAET,IAAIrsB,GAAMqsB,EAAS,aACfrnB,EAAQqnB,EAAS,eAEjB4nD,EAAS5nD,EAAS,YAAY4nD,OAC9BnT,EAAcz0C,EAAS,kBAAkBy0C,YACzCwhB,EAAcj2D,EAAS,iBAAiBi2D,YACxCid,EAAWlzE,EAAS,sBAAsB6gE,eAC9C7gE,GAAS,0BACTA,EAAS,2BACTA,EAAS,iBACTA,EAAS,kBACTA,EAAS,4BACTA,EAAS,oBACTA,EAAS,sBAETxwB,EAAQ8C,OAAS0tB,EAAS,YAC1BxwB,EAAQwwB,SAAWA,EACnBxwB,EAAQmN,KAAO,SAAS2sB,GACpB,GAAkB,gBAAR,GAAkB,CACxB,GAAI6pE,GAAM7pE,CAEV,IADAA,EAAKzwB,SAASu6F,eAAeD,IACxB7pE,EACD,KAAM,IAAI34B,OAAM,4BAA8BwiG,GAGtD,GAAI7pE,GAAMA,EAAG+pE,KAAO/pE,EAAG+pE,IAAIt7F,iBAAkB6vE,GACzC,MAAOt+C,GAAG+pE,IAAIt7F,MAElB,IAAIhD,GAAQ,EACZ,IAAIu0B,GAAM,kBAAkBrqB,KAAKqqB,EAAGgqE,SAAU,CAC1C,GAAIC,GAAUjqE,CACdv0B,GAAQw+F,EAAQx+F,MAChBu0B,EAAK31B,EAAImF,cAAc,OACvBy6F,EAAQn/F,WAAWm3B,aAAajC,EAAIiqE,OAEpCx+F,GAAQpB,EAAIiP,aAAa0mB,GACzBA,EAAGxgB,UAAY,EAGnB,IAAIigB,GAAMv5B,EAAQgkG,kBAAkBz+F,GAEhCgD,EAAS,GAAI6vE,GAAO,GAAIsrB,GAAS5pE,GACrCvxB,GAAOswE,WAAWt/C,EAElB,IAAIsqE,IACAx6F,SAAUkwB,EACVhxB,OAAQA,EACR4zE,SAAU5zE,EAAO2F,OAAOqiB,KAAKhoB,EAAQ,MASzC,OAPIw7F,KAASF,EAAIl3F,SAAWo3F,GAC5B56F,EAAMi9B,YAAYt4B,OAAQ,SAAU+1F,EAAI1nB,UACxC5zE,EAAOyF,GAAG,UAAW,WACjB7E,EAAMo9B,eAAez4B,OAAQ,SAAU+1F,EAAI1nB,UAC3C0nB,EAAIt7F,OAAOvH,UAAU6iG,IAAM,OAE/Bt7F,EAAOvH,UAAU6iG,IAAMt7F,EAAOs7F,IAAMA,EAC7Bt7F,GAEXvI,EAAQgkG,kBAAoB,SAASz9F,EAAMzE,GACvC,GAAIy3B,GAAM,GAAI0rC,GAAY1+D,EAAMzE,EAEhC,OADAy3B,GAAIwtC,eAAe,GAAI0f,IAChBltD,GAEXv5B,EAAQilE,YAAcA,EACtBjlE,EAAQymF,YAAcA,IAEV,WACIn6E,IAAIkkB,UAAU,WAAY,SAAS3gB,GAC/BA,GAAKA,EAAE/M,OAAO08C,MAAK,GACd1xC,OAAOxB,MACRwB,OAAOxB,IAAMuD,EACjB,KAAK,GAAIN,KAAOM,GAAOA,EAAE9K,eAAewK,KACpCzB,OAAOxB,IAAIiD,GAAOM,EAAEN,SAI5CtP,EAAOD,QAAU8N,OAAOxB,IAAIkkB,SAAS,YAIhC,SAASvwB,EAAQD,EAASM,GAE/BgM,IAAIpM,OAAO,iCAAiC,UAAU,UAAU,SAAS,cAAc,iCAAkC,SAASswB,EAAUxwB,EAASC,GACrJ,YAEA,IAAI28B,GAAMpM,EAAS,cACf0/B,EAAqB1/B,EAAS,0BAA0B0/B,mBAExD+zC,EAAqB,WACrB7jG,KAAK+vD,QACDp7B,QAEQjI,MAAQ,WACRwF,MAAQ,gDAERxF,MAAQ,SACRwF,MAAQ,IACRtmB,KAAQ,WAER8gB,MAAQ,mBACRwF,MAAQ,yBAERxF,MAAQ,mBACRwF,MAAQ,oDAERxF,MAAQ,4BACRwF,MAAQ,sBAERxF,MAAQ,kBACRwF,MAAQ,uCAERxF,MAAQ,kBACRwF,MAAQ,cAERxF,MAAQ,eACRwF,MAAQ,UAERxF,MAAQ,eACRwF,MAAQ,YAERxF,MAAQ,OACRwF,MAAQ,SAGhB/O,SAEQuJ,MAAQ,2BACRwF,MAAQ,uDAERxF,MAAQ,SACRwF,MAAQ,cAERxF,MAAQ,SACRwF,MAAQ,IACRtmB,KAAQ,UAER8gB,MAAQ,SACRwF,MAAQ,GACRtmB,KAAQ,WAOxB4wB,GAAIP,SAAS4nE,EAAoB/zC,GAEjClwD,EAAQikG,mBAAqBA,IAG7B33F,IAAIpM,OAAO,mCAAmC,UAAU,UAAU,SAAS,aAAc,SAASswB,EAAUxwB,EAASC,GACrH,YAEA,IAAIsmD,GAAQ/1B,EAAS,YAAY+1B,MAE7B29C,EAAuB,cAE3B,WAEI9jG,KAAK+3D,aAAe,SAASnqC,EAAM/nB,GAC/B,MAAM,QAAQwJ,KAAKue,GAGZ,SAASve,KAAKxJ,IAFV,GAKf7F,KAAKg4D,YAAc,SAAS7+B,EAAKiZ,GAC7B,GAAIxkB,GAAOuL,EAAIsrB,QAAQrS,GACnB7iC,EAAQqe,EAAKre,MAAM,WAEvB,KAAKA,EAAO,MAAO,EAEnB,IAAIgjC,GAAShjC,EAAM,GAAGnO,OAClB2iG,EAAe5qE,EAAImpC,qBAAqBlwB,IAAKA,EAAKG,OAAQA,GAE9D,KAAKwxD,GAAgBA,EAAa3xD,KAAOA,EAAK,MAAO,EAErD,IAAIilB,GAASr3D,KAAK83D,WAAW3+B,EAAIsrB,QAAQs/C,EAAa3xD,KACtDjZ,GAAIhV,QAAQ,GAAIgiC,GAAM/T,EAAK,EAAGA,EAAKG,EAAO,GAAI8kB,IAGlDr3D,KAAK83D,WAAa,SAASlqC,GACvB,MAAOA,GAAKre,MAAM,QAAQ,MAG/BhP,KAAKujG,EAAqBriG,WAE7B7B,EAAQkkG,qBAAuBA,IAG/B53F,IAAIpM,OAAO,6BAA6B,UAAU,UAAU,SAAS,cAAc,qBAAqB,qBAAqB,gBAAiB,SAASswB,EAAUxwB,EAASC,GAC1K,YAEA,IAUImkG,GAVAxnE,EAAMpM,EAAS,iBACfmhC,EAAYnhC,EAAS,gBAAgBmhC,UACrC+C,EAAgBlkC,EAAS,wBAAwBkkC,cACjDjpB,EAAOjb,EAAS,kBAEhB6zE,GACC,OAAQ,eAAgB,wBACzBC,GACC,OAAQ,eAAgB,uBAAwB,WAGjDC,KACAC,EAAc,SAASj8F,GACvB,GAAI9H,GAAK,EAMT,OALI8H,GAAOo1F,cACPl9F,EAAK8H,EAAOlE,UAAUkN,MAClBgzF,EAAa3xF,YAAcrK,EAAOo1F,YAAY/qF,aAC9C2xF,GAAgB3xF,WAAYrK,EAAOo1F,YAAY/qF,cAEnD2xF,EAAa9jG,GACN2jG,EAAUG,EAAa9jG,QAClC2jG,EAAUG,EAAa9jG,IACnBgkG,qBAAsB,EACtBC,gBAAiB,GACjBC,oBAAqB,GACrBC,sBAAuB,EACvBC,iBAAkB,GAClBC,uBAAwB,GACxBC,qBAAsB,MAI1BC,EAAkB,WAClB5kG,KAAKyG,IAAI,SAAU,YAAa,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAASxpC,GACrE,GAAI+X,GAAS/V,EAAOk0E,oBAChBzuD,EAAO+hB,EAAQxW,IAAIsrB,QAAQvmC,EAAOk0B,IACtC,IAAY,KAARjsC,EAAa,CACbi+F,EAAYj8F,EACZ,IAAIlE,GAAYkE,EAAO2qC,oBACnB+xD,EAAWl1D,EAAQxW,IAAI8iB,aAAah4C,EACxC,IAAiB,KAAb4gG,GAAgC,MAAbA,GAAoB18F,EAAOo4E,2BAC9C,OACIp6E,KAAM,IAAM0+F,EAAW,IACvB5gG,WAAW,EAEZ,IAAI2gG,EAAgBE,gBAAgB38F,EAAQwnC,GAC/C,MAAI,WAAWtgC,KAAKue,EAAK1P,EAAOq0B,UAAYpqC,EAAOgrC,mBAC/CyxD,EAAgBG,iBAAiB58F,EAAQwnC,EAAS,MAE9CxpC,KAAM,KACNlC,WAAY,EAAG,MAGnB2gG,EAAgBI,kBAAkB78F,EAAQwnC,EAAS,MAE/CxpC,KAAM,IACNlC,WAAY,EAAG,SAIxB,IAAY,KAARkC,EAAa,CACpBi+F,EAAYj8F,EACZ,IAAI88F,GAAYr3E,EAAKxJ,UAAUlG,EAAOq0B,OAAQr0B,EAAOq0B,OAAS,EAC9D,IAAiB,KAAb0yD,EAAkB,CAClB,GAAIC,GAAWv1D,EAAQu0B,oBAAoB,KAAM3xB,OAAQr0B,EAAOq0B,OAAS,EAAGH,IAAKl0B,EAAOk0B,KACxF,IAAiB,OAAb8yD,GAAqBN,EAAgBO,sBAAsBjnF,EAAQ0P,EAAMznB,GAEzE,MADAy+F,GAAgBQ,0BAEZj/F,KAAM,GACNlC,WAAY,EAAG,SAIxB,CAAA,GAAY,MAARkC,GAAwB,QAARA,EAAgB,CACvCi+F,EAAYj8F,EACZ,IAAIk9F,GAAU,EACVT,GAAgBU,uBAAuBpnF,EAAQ0P,KAC/Cy3E,EAAUh6D,EAAK3B,aAAa,IAAKs6D,EAAQQ,uBACzCI,EAAgBW,4BAEpB,IAAIN,GAAYr3E,EAAKxJ,UAAUlG,EAAOq0B,OAAQr0B,EAAOq0B,OAAS,EAC9D,IAAkB,MAAd0yD,EAAmB,CACnB,GAAIlB,GAAep0D,EAAQ2yB,qBAAqBlwB,IAAKl0B,EAAOk0B,IAAKG,OAAQr0B,EAAOq0B,OAAO,GAAI,IAC3F,KAAKwxD,EACA,MAAO,KACZ,IAAIyB,GAAcxlG,KAAK83D,WAAWnoB,EAAQ8U,QAAQs/C,EAAa3xD,UAC5D,CAAA,IAAIizD,EAIP,WADAT,GAAgBW,2BAFhB,IAAIC,GAAcxlG,KAAK83D,WAAWlqC,GAKtC,GAAIypC,GAASmuC,EAAc71D,EAAQy3B,cAEnC,QACIjhE,KAAM,KAAOkxD,EAAS,KAAOmuC,EAAcH,EAC3CphG,WAAY,EAAGozD,EAAOj2D,OAAQ,EAAGi2D,EAAOj2D,SAG5CwjG,EAAgBW,+BAIxBvlG,KAAKyG,IAAI,SAAU,WAAY,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAAS9nC,GACpE,GAAIg9F,GAAWl1D,EAAQxW,IAAI8iB,aAAap0C,EACxC,KAAKA,EAAMktC,eAA6B,KAAZ8vD,EAAiB,CACzCT,EAAYj8F,EACZ,IAAIylB,GAAO+hB,EAAQxW,IAAIsrB,QAAQ58C,EAAM8sB,MAAMyd,KACvC6yD,EAAYr3E,EAAKxJ,UAAUvc,EAAMwqC,IAAIE,OAAQ1qC,EAAMwqC,IAAIE,OAAS,EACpE,IAAiB,KAAb0yD,EAEA,MADAp9F,GAAMwqC,IAAIE,SACH1qC,CAEPm8F,GAAQQ,2BAKpBxkG,KAAKyG,IAAI,SAAU,YAAa,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAASxpC,GACrE,GAAY,KAARA,EAAa,CACbi+F,EAAYj8F,EACZ,IAAIlE,GAAYkE,EAAO2qC,oBACnB+xD,EAAWl1D,EAAQxW,IAAI8iB,aAAah4C,EACxC,IAAiB,KAAb4gG,GAAmB18F,EAAOo4E,2BAC1B,OACIp6E,KAAM,IAAM0+F,EAAW,IACvB5gG,WAAW,EAEZ,IAAI2gG,EAAgBE,gBAAgB38F,EAAQwnC,GAE/C,MADAi1D,GAAgBG,iBAAiB58F,EAAQwnC,EAAS,MAE9CxpC,KAAM,KACNlC,WAAY,EAAG,QAGpB,IAAY,KAARkC,EAAa,CACpBi+F,EAAYj8F,EACZ,IAAI+V,GAAS/V,EAAOk0E,oBAChBzuD,EAAO+hB,EAAQxW,IAAIsrB,QAAQvmC,EAAOk0B,KAClC6yD,EAAYr3E,EAAKxJ,UAAUlG,EAAOq0B,OAAQr0B,EAAOq0B,OAAS,EAC9D,IAAiB,KAAb0yD,EAAkB,CAClB,GAAIC,GAAWv1D,EAAQu0B,oBAAoB,KAAM3xB,OAAQr0B,EAAOq0B,OAAS,EAAGH,IAAKl0B,EAAOk0B,KACxF,IAAiB,OAAb8yD,GAAqBN,EAAgBO,sBAAsBjnF,EAAQ0P,EAAMznB,GAEzE,MADAy+F,GAAgBQ,0BAEZj/F,KAAM,GACNlC,WAAY,EAAG,QAOnCjE,KAAKyG,IAAI,SAAU,WAAY,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAAS9nC,GACpE,GAAIg9F,GAAWl1D,EAAQxW,IAAI8iB,aAAap0C,EACxC,KAAKA,EAAMktC,eAA6B,KAAZ8vD,EAAiB,CACzCT,EAAYj8F,EACZ,IAAIylB,GAAO+hB,EAAQxW,IAAIsrB,QAAQ58C,EAAM8sB,MAAMyd,KACvC6yD,EAAYr3E,EAAKxJ,UAAUvc,EAAM8sB,MAAM4d,OAAS,EAAG1qC,EAAM8sB,MAAM4d,OAAS,EAC5E,IAAiB,KAAb0yD,EAEA,MADAp9F,GAAMwqC,IAAIE,SACH1qC,KAKnB7H,KAAKyG,IAAI,WAAY,YAAa,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAASxpC,GACvE,GAAY,KAARA,EAAa,CACbi+F,EAAYj8F,EACZ,IAAIlE,GAAYkE,EAAO2qC,oBACnB+xD,EAAWl1D,EAAQxW,IAAI8iB,aAAah4C,EACxC,IAAiB,KAAb4gG,GAAmB18F,EAAOo4E,2BAC1B,OACIp6E,KAAM,IAAM0+F,EAAW,IACvB5gG,WAAW,EAEZ,IAAI2gG,EAAgBE,gBAAgB38F,EAAQwnC,GAE/C,MADAi1D,GAAgBG,iBAAiB58F,EAAQwnC,EAAS,MAE9CxpC,KAAM,KACNlC,WAAY,EAAG,QAGpB,IAAY,KAARkC,EAAa,CACpBi+F,EAAYj8F,EACZ,IAAI+V,GAAS/V,EAAOk0E,oBAChBzuD,EAAO+hB,EAAQxW,IAAIsrB,QAAQvmC,EAAOk0B,KAClC6yD,EAAYr3E,EAAKxJ,UAAUlG,EAAOq0B,OAAQr0B,EAAOq0B,OAAS,EAC9D,IAAiB,KAAb0yD,EAAkB,CAClB,GAAIC,GAAWv1D,EAAQu0B,oBAAoB,KAAM3xB,OAAQr0B,EAAOq0B,OAAS,EAAGH,IAAKl0B,EAAOk0B,KACxF,IAAiB,OAAb8yD,GAAqBN,EAAgBO,sBAAsBjnF,EAAQ0P,EAAMznB,GAEzE,MADAy+F,GAAgBQ,0BAEZj/F,KAAM,GACNlC,WAAY,EAAG,QAOnCjE,KAAKyG,IAAI,WAAY,WAAY,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAAS9nC,GACtE,GAAIg9F,GAAWl1D,EAAQxW,IAAI8iB,aAAap0C,EACxC,KAAKA,EAAMktC,eAA6B,KAAZ8vD,EAAiB,CACzCT,EAAYj8F,EACZ,IAAIylB,GAAO+hB,EAAQxW,IAAIsrB,QAAQ58C,EAAM8sB,MAAMyd,KACvC6yD,EAAYr3E,EAAKxJ,UAAUvc,EAAM8sB,MAAM4d,OAAS,EAAG1qC,EAAM8sB,MAAM4d,OAAS,EAC5E,IAAiB,KAAb0yD,EAEA,MADAp9F,GAAMwqC,IAAIE,SACH1qC,KAKnB7H,KAAKyG,IAAI,iBAAkB,YAAa,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAASxpC,GAC7E,GAAY,KAARA,GAAuB,KAARA,EAAa,CAC5Bi+F,EAAYj8F,EACZ,IAAI2G,GAAQ3I,EACRlC,EAAYkE,EAAO2qC,oBACnB+xD,EAAWl1D,EAAQxW,IAAI8iB,aAAah4C,EACxC,IAAiB,KAAb4gG,GAAgC,MAAbA,GAAgC,KAAZA,GAAmB18F,EAAOo4E,2BACjE,OACIp6E,KAAM2I,EAAQ+1F,EAAW/1F,EACzB7K,WAAW,EAGf,IAAIia,GAAS/V,EAAOk0E,oBAChBzuD,EAAO+hB,EAAQxW,IAAIsrB,QAAQvmC,EAAOk0B,KAClCqzD,EAAW73E,EAAKxJ,UAAUlG,EAAOq0B,OAAO,EAAGr0B,EAAOq0B,OACtD,IAAgB,MAAZkzD,EACA,MAAO,KAMX,KAAK,GAHQ/4E,GADTuiC,EAAStf,EAAQilB,UAAU3wD,EAAU0wB,MAAMyd,KAC3CrmC,EAAM,EACN25F,EAAW,GAEN/yE,EAAI,EAAGA,EAAIs8B,EAAO7tD,SACvBsrB,EAAQuiC,EAAOt8B,GACG,UAAdjG,EAAM1hB,KACR06F,EAAW,GACS,EAAXA,IACTA,EAAWh5E,EAAMvnB,MAAMmK,QAAQR,MAE5B4d,EAAMvnB,MAAM/D,OAAS2K,EAAO9H,EAAU0wB,MAAM4d,SAPlB5f,IAU/B5mB,GAAOkjD,EAAOt8B,GAAGxtB,MAAM/D,MAE3B,KAAKsrB,GAAqB,EAAXg5E,GAA+B,YAAfh5E,EAAM1hB,OAAsC,WAAf0hB,EAAM1hB,MAAuB/G,EAAU0wB,MAAM4d,SAAW7lB,EAAMvnB,MAAM/D,OAAO2K,EAAI,GAAM2gB,EAAMvnB,MAAM+wB,YAAYpnB,KAAW4d,EAAMvnB,MAAM/D,OAAO,GAAM,CACzM,IAAKwjG,EAAgBE,gBAAgB38F,EAAQwnC,GACzC,MACJ,QACIxpC,KAAM2I,EAAQA,EACd7K,WAAY,EAAE,IAEf,GAAIyoB,GAAwB,WAAfA,EAAM1hB,KAAmB,CACzC,GAAIi6F,GAAYr3E,EAAKxJ,UAAUlG,EAAOq0B,OAAQr0B,EAAOq0B,OAAS,EAC9D,IAAI0yD,GAAan2F,EACb,OACI3I,KAAM,GACNlC,WAAY,EAAG,QAQvCjE,KAAKyG,IAAI,iBAAkB,WAAY,SAAS2mB,EAAO5mB,EAAQ2B,EAAQwnC,EAAS9nC,GAC5E,GAAIg9F,GAAWl1D,EAAQxW,IAAI8iB,aAAap0C,EACxC,KAAKA,EAAMktC,gBAA8B,KAAZ8vD,GAA+B,KAAZA,GAAkB,CAC9DT,EAAYj8F,EACZ,IAAIylB,GAAO+hB,EAAQxW,IAAIsrB,QAAQ58C,EAAM8sB,MAAMyd,KACvC6yD,EAAYr3E,EAAKxJ,UAAUvc,EAAM8sB,MAAM4d,OAAS,EAAG1qC,EAAM8sB,MAAM4d,OAAS,EAC5E,IAAI0yD,GAAaJ,EAEb,MADAh9F,GAAMwqC,IAAIE,SACH1qC,KAQvB+8F,GAAgBE,gBAAkB,SAAS38F,EAAQwnC,GAC/C,GAAIzxB,GAAS/V,EAAOk0E,oBAChB7kB,EAAW,GAAIlD,GAAc3kB,EAASzxB,EAAOk0B,IAAKl0B,EAAOq0B,OAC7D,KAAKvyC,KAAK2lG,gBAAgBnuC,EAAStC,mBAAqB,OAAQ+uC,GAAwB;AACpF,GAAI2B,GAAY,GAAItxC,GAAc3kB,EAASzxB,EAAOk0B,IAAKl0B,EAAOq0B,OAAS,EACvE,KAAKvyC,KAAK2lG,gBAAgBC,EAAU1wC,mBAAqB,OAAQ+uC,GAC7D,OAAO,EAGf,MADAzsC,GAASxC,cACFwC,EAASrC,uBAAyBj3C,EAAOk0B,KAC5CpyC,KAAK2lG,gBAAgBnuC,EAAStC,mBAAqB,OAAQgvC,IAGnEU,EAAgBe,gBAAkB,SAASj5E,EAAOuuB,GAC9C,MAAOA,GAAM3rC,QAAQod,EAAM1hB,MAAQ0hB,GAAS,IAGhDk4E,EAAgBG,iBAAmB,SAAS58F,EAAQwnC,EAAS20B,GACzD,GAAIpmD,GAAS/V,EAAOk0E,oBAChBzuD,EAAO+hB,EAAQxW,IAAIsrB,QAAQvmC,EAAOk0B,IACjCpyC,MAAKmlG,sBAAsBjnF,EAAQ0P,EAAMo2E,EAAQO,oBAAoB,MACtEP,EAAQK,qBAAuB,GACnCL,EAAQM,gBAAkBpmF,EAAOk0B,IACjC4xD,EAAQO,oBAAsBjgC,EAAU12C,EAAKoB,OAAO9Q,EAAOq0B,QAC3DyxD,EAAQK,wBAGZO,EAAgBI,kBAAoB,SAAS78F,EAAQwnC,EAAS20B,GAC1D,GAAIpmD,GAAS/V,EAAOk0E,oBAChBzuD,EAAO+hB,EAAQxW,IAAIsrB,QAAQvmC,EAAOk0B,IACjCpyC,MAAKslG,uBAAuBpnF,EAAQ0P,KACrCo2E,EAAQQ,sBAAwB,GACpCR,EAAQS,iBAAmBvmF,EAAOk0B,IAClC4xD,EAAQU,uBAAyB92E,EAAKoB,OAAO,EAAG9Q,EAAOq0B,QAAU+xB,EACjE0/B,EAAQW,qBAAuB/2E,EAAKoB,OAAO9Q,EAAOq0B,QAClDyxD,EAAQQ,yBAGZI,EAAgBO,sBAAwB,SAASjnF,EAAQ0P,EAAM02C,GAC3D,MAAO0/B,GAAQK,qBAAuB,GAClCnmF,EAAOk0B,MAAQ4xD,EAAQM,iBACvBhgC,IAAY0/B,EAAQO,oBAAoB,IACxC32E,EAAKoB,OAAO9Q,EAAOq0B,UAAYyxD,EAAQO,qBAG/CK,EAAgBU,uBAAyB,SAASpnF,EAAQ0P,GACtD,MAAOo2E,GAAQQ,sBAAwB,GACnCtmF,EAAOk0B,MAAQ4xD,EAAQS,kBACvB72E,EAAKoB,OAAO9Q,EAAOq0B,UAAYyxD,EAAQW,sBACvC/2E,EAAKoB,OAAO,EAAG9Q,EAAOq0B,SAAWyxD,EAAQU,wBAGjDE,EAAgBQ,uBAAyB,WACrCpB,EAAQO,oBAAsBP,EAAQO,oBAAoBv1E,OAAO,GACjEg1E,EAAQK,wBAGZO,EAAgBW,0BAA4B,WACpCvB,IACAA,EAAQQ,sBAAwB,EAChCR,EAAQS,iBAAmB,KAMnCjoE,EAAIP,SAAS2oE,EAAiBrzC,GAE9B3xD,EAAQglG,gBAAkBA,IAG1B14F,IAAIpM,OAAO,2BAA2B,UAAU,UAAU,SAAS,cAAc,YAAY,8BAA+B,SAASswB,EAAUxwB,EAASC,GACxJ,YAEA,IAAI28B,GAAMpM,EAAS,iBACf+1B,EAAQ/1B,EAAS,eAAe+1B,MAChC0/C,EAAez1E,EAAS,eAAeixE,SAEvCA,EAAWzhG,EAAQyhG,SAAW,SAASyE,GACnCA,IACA9lG,KAAKshG,mBAAqB,GAAIrxF,QAC1BjQ,KAAKshG,mBAAmBxuE,OAAO3O,QAAQ,YAAa,IAAM2hF,EAAanxE,QAE3E30B,KAAKuhG,kBAAoB,GAAItxF,QACzBjQ,KAAKuhG,kBAAkBzuE,OAAO3O,QAAQ,YAAa,IAAM2hF,EAAazzD,OAIlF7V,GAAIP,SAASolE,EAAUwE,GAEvB,WAEI7lG,KAAKshG,mBAAqB,8BAC1BthG,KAAKuhG,kBAAoB,kCAEzBvhG,KAAK2iE,mBAAqB,SAAShzB,EAASy2C,EAAWh0C,EAAK2zD,GACxD,GAAIn4E,GAAO+hB,EAAQ8U,QAAQrS,GACvB7iC,EAAQqe,EAAKre,MAAMvP,KAAKshG,mBAC5B,IAAI/xF,EAAO,CACP,GAAIjM,GAAIiM,EAAM4B,KAEd,IAAI5B,EAAM,GACN,MAAOvP,MAAK0hG,oBAAoB/xD,EAASpgC,EAAM,GAAI6iC,EAAK9uC,EAE5D,IAAIuE,GAAQ8nC,EAAQ4yB,oBAAoBnwB,EAAK9uC,EAAIiM,EAAM,GAAGnO,OAAQ,EASlE,OAPIyG,KAAUA,EAAMktC,gBACZgxD,EACAl+F,EAAQ7H,KAAKgmG,gBAAgBr2D,EAASyC,GAClB,OAAbg0C,IACPv+E,EAAQ,OAGTA,EAGX,GAAkB,cAAdu+E,EAAJ,CAGA,GAAI72E,GAAQqe,EAAKre,MAAMvP,KAAKuhG,kBAC5B,IAAIhyF,EAAO,CACP,GAAIjM,GAAIiM,EAAM4B,MAAQ5B,EAAM,GAAGnO,MAE/B,OAAImO,GAAM,GACCvP,KAAK2hG,oBAAoBhyD,EAASpgC,EAAM,GAAI6iC,EAAK9uC,GAErDqsC,EAAQ4yB,oBAAoBnwB,EAAK9uC,EAAG,OAInDtD,KAAKgmG,gBAAkB,SAASr2D,EAASyC,GACrC,GAAIxkB,GAAO+hB,EAAQ8U,QAAQrS,GACvB6zD,EAAcr4E,EAAKlpB,OAAO,MAC1B0hD,EAAWhU,EACXiU,EAAcz4B,EAAKxsB,MACvBgxC,IAAY,CAGZ,KAFA,GAAIkU,GAASlU,EACTuE,EAAShH,EAAQiH,cACZxE,EAAMuE,GAAQ,CACnB/oB,EAAO+hB,EAAQ8U,QAAQrS,EACvB,IAAIilB,GAASzpC,EAAKlpB,OAAO,KACzB,IAAe,KAAX2yD,EAAJ,CAEA,GAAK4uC,EAAc5uC,EACf,KACJ,IAAI6uC,GAAWlmG,KAAK2iE,mBAAmBhzB,EAAS,MAAOyC,EAEvD,IAAI8zD,EAAU,CACV,GAAIA,EAASvxE,MAAMyd,KAAOgU,EACtB,KACG,IAAI8/C,EAASnxD,cAChB3C,EAAM8zD,EAAS7zD,IAAID,QAChB,IAAI6zD,GAAe5uC,EACtB,MAGR/Q,EAASlU,GAGb,MAAO,IAAI+T,GAAMC,EAAUC,EAAaC,EAAQ3W,EAAQ8U,QAAQ6B,GAAQllD,UAG7Eb,KAAK8gG,EAAS5/F,aAIjByK,IAAIpM,OAAO,iBAAiB,UAAU,UAAU,SAAS,cAAc,gBAAgB,gCAAgC,kCAAkC,4BAA4B,0BAA0B,4BAA6B,SAASswB,EAAUxwB,EAASC,GACxQ,YAEA,IAAI28B,GAAMpM,EAAS,cACfw0C,EAAWx0C,EAAS,UAAUolC,KAC9BnF,EAAiBjgC,EAAS,0BAA0ByzE,mBACpDC,EAAuB1zE,EAAS,4BAA4B0zE,qBAC5Dc,EAAkBx0E,EAAS,sBAAsBw0E,gBACjDuB,EAAiB/1E,EAAS,oBAAoBixE,SAC9CvJ,EAAe1nE,EAAS,2BAA2B0nE,aAEnDtiC,EAAO,WACPx1D,KAAKqwD,eAAiBA,EACtBrwD,KAAKomG,SAAW,GAAItC,GACpB9jG,KAAKy1D,WAAa,GAAImvC,GACtB5kG,KAAKgqE,aAAe,GAAIm8B,GAE5B3pE,GAAIP,SAASu5B,EAAMoP,GAEnB,WAEI5kE,KAAK43D,kBAAoB,SAASxqC,EAAOQ,EAAMiqC,GAC3C,GAAIR,GAASr3D,KAAK83D,WAAWlqC,EAE7B,IAAa,SAATR,EAAkB,CAClB,GAAI7d,GAAQqe,EAAKre,MAAM,kBACnBA,KACA8nD,GAAUQ,GAIlB,MAAOR,IAGXr3D,KAAK+3D,aAAe,SAAS3qC,EAAOQ,EAAM/nB,GACtC,MAAO7F,MAAKomG,SAASruC,aAAanqC,EAAM/nB,IAG5C7F,KAAKg4D,YAAc,SAAS5qC,EAAO+L,EAAKiZ,GACpCpyC,KAAKomG,SAASpuC,YAAY7+B,EAAKiZ,IAGnCpyC,KAAKi4D,aAAe,SAAStoB,GACzB,GAAI02D,GAAS,GAAIvO,IAAc,OAAQ53F,EAAoB,IAAK,aAWhE,OAVAmmG,GAAOzM,iBAAiBjqD,EAAQoY,eAEhCs+C,EAAOz4F,GAAG,QAAS,SAASga,GACxB+nB,EAAQk5B,gBAAgBjhD,EAAEplB,SAG9B6jG,EAAOz4F,GAAG,KAAM,WACZ+hC,EAAQq5B,qBAGLq9B,GAIXrmG,KAAKk5D,IAAM,iBACZ34D,KAAKi1D,EAAK/zD,WAEb7B,EAAQ41D,KAAOA,KAMV,SAAS31D,EAAQD,EAASM,GAE/BgM,IAAIpM,OAAO,qBAAqB,UAAU,UAAU,SAAS,cAAc,eAAe,gBAAgB,4BAA4B,gBAAiB,SAASswB,EAAUxwB,EAASC,GACnL,YAEA,IAAIkE,GAAMqsB,EAAS,cACfib,EAAOjb,EAAS,eAChBrnB,EAAQqnB,EAAS,gBACjBk2E,EAAe,0oGA+If9zB,EAAcpiD,EAAS,4BAA4BoiD,YACnD7tB,EAAUv0B,EAAS,cAEvBrsB,GAAIysB,gBAAgB81E,EAAc,gBAElC,IAAIvwD,GAAO,mqCAkBH5xB,QAAQ,QAAS,KAErBvgB,EAAY,SAASuE,EAAQN,EAAO0+F,GACpC,GAAIC,GAAMziG,EAAImF,cAAc,MAC5Bs9F,GAAIttF,UAAY68B,EAChB/1C,KAAKiT,QAAUuzF,EAAI1zF,WAEnB9S,KAAK61C,QACL71C,KAAKymG,UAAUt+F,KAGnB,WACInI,KAAKymG,UAAY,SAASt+F,GACtBA,EAAO4C,UAAY/K,KACnBmI,EAAOvH,UAAU4E,YAAYxF,KAAKiT,SAClCjT,KAAKmI,OAASA,GAGlBnI,KAAK0mG,cAAgB,SAASC,GAC1B3mG,KAAK+K,UAAY47F,EAAG7gG,cAAc,oBAClC9F,KAAK4mG,WAAaD,EAAG7gG,cAAc,qBACnC9F,KAAK6mG,cAAgBF,EAAG7gG,cAAc,uBACtC9F,KAAK8mG,aAAeH,EAAG7gG,cAAc,6BACrC9F,KAAK+mG,oBAAsBJ,EAAG7gG,cAAc,gCAC5C9F,KAAKgnG,gBAAkBL,EAAG7gG,cAAc,6BACxC9F,KAAKinG,YAAcjnG,KAAK+K,UAAUjF,cAAc,qBAChD9F,KAAKknG,aAAelnG,KAAK4mG,WAAW9gG,cAAc,sBAGtD9F,KAAK61C,MAAQ,WACT,GAAI8wD,GAAK3mG,KAAKiT,OAEdjT,MAAK0mG,cAAcC,EAEnB,IAAIQ,GAAQnnG,IACZ+I,GAAMi9B,YAAY2gE,EAAI,YAAa,SAAS/+E,GACxC/e,WAAW,WACPs+F,EAAMC,YAAYxhG,SACnB,GACHmD,EAAM8C,gBAAgB+b,KAE1B7e,EAAMi9B,YAAY2gE,EAAI,QAAS,SAAS/+E,GACpC,GAAI7K,GAAI6K,EAAEve,QAAUue,EAAElH,WAClBla,EAASuW,EAAE6iC,aAAa,SACxBp5C,IAAU2gG,EAAM3gG,GAChB2gG,EAAM3gG,KACD2gG,EAAME,aAAariD,SAASx+C,IACjC2gG,EAAME,aAAariD,SAASx+C,GAAQyN,KAAKkzF,GAC7Cp+F,EAAM8C,gBAAgB+b,KAG1B7e,EAAM0/B,sBAAsBk+D,EAAI,SAAS/+E,EAAGyd,EAAQh6B,GAChD,GAAIm4B,GAAYmhB,EAAQphB,gBAAgBl4B,GACpC+xB,EAAU+pE,EAAME,aAAatzB,eAAe1uC,EAAQ7B,EACpDpG,IAAWA,EAAQnpB,OACnBmpB,EAAQnpB,KAAKkzF,GACbp+F,EAAMq9B,UAAUxe,MAIxB5nB,KAAKo5D,UAAY/tB,EAAKH,YAAY,WAC9Bi8D,EAAM91B,MAAK,GAAO,KAGtBtoE,EAAMi9B,YAAYhmC,KAAKinG,YAAa,QAAS,WACzCE,EAAM/tC,UAAUpuB,SAAS,MAE7BjiC,EAAMi9B,YAAYhmC,KAAKinG,YAAa,QAAS,WACzCE,EAAMC,YAAcD,EAAMF,YAC1BE,EAAMF,YAAY9hG,OAASgiG,EAAMvyF,cAErC7L,EAAMi9B,YAAYhmC,KAAKknG,aAAc,QAAS,WAC1CC,EAAMC,YAAcD,EAAMD,aAC1BC,EAAMF,YAAY9hG,OAASgiG,EAAMvyF,eAGzC5U,KAAKsnG,kBAAoB,GAAI90B,KACzBO,QAAS,MACTzwE,KAAM,iBACN2R,KAAM,SAAS9L,GACXA,EAAO4C,UAAU8P,WAGzB7a,KAAKqnG,aAAe,GAAI70B,GACxBxyE,KAAKqnG,aAAaxzB,UACd0zB,2CAA4C,SAASZ,GACjD,GAAIa,GAAYb,EAAGa,WAAab,EAAGa,SACnCb,GAAGC,WAAW95F,MAAM0a,QAAUggF,EAAY,GAAK,OAC/Cb,EAAGa,EAAY,eAAiB,eAAe5hG,SAEnD6hG,mBAAoB,SAASd,GACzBA,EAAGxxB,YAEPuyB,+BAAgC,SAASf,GACrCA,EAAGgB,YAEPxkE,IAAO,SAASwjE,GACZ99F,WAAW,WAAa89F,EAAG9rF,UAE/B+sF,OAAU,SAASjB,GACXA,EAAGS,aAAeT,EAAGO,cACrBP,EAAGxiF,UACPwiF,EAAGxxB,YAEP0yB,eAAgB,SAASlB,GACjBA,EAAGS,aAAeT,EAAGO,cACrBP,EAAGxiF,UACPwiF,EAAGgB,YAEPG,aAAc,SAASnB,GACfA,EAAGS,aAAeT,EAAGO,cACrBP,EAAGhjB,aACPgjB,EAAGp1B,WAEPw2B,IAAO,SAASpB,IACXA,EAAGS,aAAeT,EAAGO,aAAeP,EAAGM,YAAcN,EAAGO,cAActhG,WAI/E5F,KAAKqnG,aAAa30B,cACdpwE,KAAM,mBACNywE,SAAUhqC,IAAK,cAAe4rC,IAAK,yBACnC1gE,KAAM,SAAS0yF,GACXA,EAAGG,aAAakB,SAAWrB,EAAGG,aAAakB,QAC3CrB,EAAGsB,kBAGP3lG,KAAM,sBACNywE,SAAUhqC,IAAK,cAAe4rC,IAAK,yBACnC1gE,KAAM,SAAS0yF,GACXA,EAAGI,oBAAoBiB,SAAWrB,EAAGI,oBAAoBiB,QACzDrB,EAAGsB,kBAGP3lG,KAAM,mBACNywE,SAAUhqC,IAAK,cAAe4rC,IAAK,yBACnC1gE,KAAM,SAAS0yF,GACXA,EAAGK,gBAAgBgB,SAAWrB,EAAGK,gBAAgBgB,QACjDrB,EAAGsB,mBAIXjoG,KAAKioG,aAAe,WAChBlkG,EAAI+1B,YAAY95B,KAAK8mG,aAAc,UAAW9mG,KAAK8mG,aAAakB,SAChEjkG,EAAI+1B,YAAY95B,KAAKgnG,gBAAiB,UAAWhnG,KAAKgnG,gBAAgBgB,SACtEjkG,EAAI+1B,YAAY95B,KAAK+mG,oBAAqB,UAAW/mG,KAAK+mG,oBAAoBiB,SAC9EhoG,KAAKqxE,MAAK,GAAO,IAGrBrxE,KAAK4U,UAAY,SAASZ,GACtBhU,KAAKmI,OAAOwnC,QAAQ/6B,UAAUZ,GAAMhU,KAAKmI,OAAOkwE,QAAQ32B,SAAS1tC,IACjEhU,KAAKmI,OAAOmkC,SAAS4xC,qBAEzBl+E,KAAKqxE,KAAO,SAASkB,EAAaT,GAC9B,GAAIjqE,GAAQ7H,KAAKmI,OAAOkpE,KAAKrxE,KAAKinG,YAAY9hG,OAC1CotE,YAAaA,EACbT,UAAWA,EACXplC,MAAM,EACNjC,OAAQzqC,KAAK8mG,aAAakB,QAC1B31B,cAAeryE,KAAK+mG,oBAAoBiB,QACxC71B,UAAWnyE,KAAKgnG,gBAAgBgB,UAEhCE,GAAWrgG,GAAS7H,KAAKinG,YAAY9hG,KACzCpB,GAAI+1B,YAAY95B,KAAK+K,UAAW,cAAem9F,GAC/CloG,KAAKmI,OAAOooC,MAAM,iBAAmBhhC,OAAQ24F,IAC7CloG,KAAK4U,aAET5U,KAAKm1E,SAAW,WACZn1E,KAAKqxE,MAAK,GAAM,IAEpBrxE,KAAK2nG,SAAW,WACZ3nG,KAAKqxE,MAAK,GAAM,IAEpBrxE,KAAKuxE,QAAU,WACX,GAAI1pE,GAAQ7H,KAAKmI,OAAOopE,QAAQvxE,KAAKinG,YAAY9hG,OAC7CslC,OAAQzqC,KAAK8mG,aAAakB,QAC1B31B,cAAeryE,KAAK+mG,oBAAoBiB,QACxC71B,UAAWnyE,KAAKgnG,gBAAgBgB,UAEhCE,GAAWrgG,GAAS7H,KAAKinG,YAAY9hG,KACzCpB,GAAI+1B,YAAY95B,KAAK+K,UAAW,cAAem9F,GAC/CloG,KAAKmI,OAAOooC,MAAM,iBAAmBhhC,OAAQ24F,IAC7CloG,KAAK4U,YACL5U,KAAK6a,QAET7a,KAAKmkB,QAAU,WACNnkB,KAAKmI,OAAO0yC,eACb76C,KAAKmI,OAAOgc,QAAQnkB,KAAKknG,aAAa/hG,QAE9CnF,KAAKmoG,mBAAqB,WACjBnoG,KAAKmI,OAAO0yC,gBACb76C,KAAKmI,OAAOgc,QAAQnkB,KAAKknG,aAAa/hG,OACtCnF,KAAKm1E,aAGbn1E,KAAK2jF,WAAa,WACT3jF,KAAKmI,OAAO0yC,eACb76C,KAAKmI,OAAOw7E,WAAW3jF,KAAKknG,aAAa/hG,QAGjDnF,KAAK6a,KAAO,WACR7a,KAAKiT,QAAQnG,MAAM0a,QAAU,OAC7BxnB,KAAKmI,OAAOgwE,WAAWjzB,sBAAsBllD,KAAKsnG,mBAClDtnG,KAAKmI,OAAOvC,SAEhB5F,KAAK4jB,KAAO,SAASze,EAAOqiG,GACxBxnG,KAAKiT,QAAQnG,MAAM0a,QAAU,GAC7BxnB,KAAK4mG,WAAW95F,MAAM0a,QAAUggF,EAAY,GAAK,OAEjDxnG,KAAKwnG,UAAYA,EAEbriG,IACAnF,KAAKinG,YAAY9hG,MAAQA,GAC7BnF,KAAKinG,YAAYrhG,QACjB5F,KAAKinG,YAAYv7F,SAEjB1L,KAAKmI,OAAOgwE,WAAW/yB,mBAAmBplD,KAAKsnG,oBAGnDtnG,KAAKitC,UAAY,WACb,GAAIvT,GAAKzwB,SAASikC,aAClB,OAAOxT,IAAM15B,KAAKinG,aAAevtE,GAAM15B,KAAKknG,gBAEjD3mG,KAAKqD,EAAUnC,WAElB7B,EAAQgE,UAAYA,EAEpBhE,EAAQwxE,OAAS,SAASjpE,EAAQq/F,GAC9B,GAAIb,GAAKx+F,EAAO4C,WAAa,GAAInH,GAAUuE,EAC3Cw+F,GAAG/iF,KAAKzb,EAAOwnC,QAAQsM,eAAgBurD,MAI3B,WACIt7F,IAAIkkB,UAAU,qBAAsB,kBAMnD,SAASvwB,EAAQD,EAASM,GAE/BL,EAAOD,QAAQS,GAAK,uBACpBR,EAAOD,QAAQ67C,IAAM;EAIhB,SAAS57C,EAAQD,EAASM,GAE/BL,EAAOD,QAAU,WAAa,KAAM,IAAImB,OAAM,oCAKzC,SAASlB,EAAQD,EAASM,IAEH,SAAS0wB,GAErC,QAASw3E,KACP,GAAGx3E,EAAO+nE,KACR,IAEE,MADA,IAAIA,OAAM,SAAU3tF,KAAM,eACnB2tF,KACP,MAAM31F,IAGV,GAAIqlG,GAAUz3E,EAAOmpE,mBACPnpE,EAAOopE,gBACPppE,EAAO03E,aAErB,OAAO,UAAS3nD,EAAO4nD,GACrB,GAAIC,GAAU,GAAIH,GACdI,EAAUF,EAAIE,QACdz9F,EAAOu9F,EAAIv9F,IAEf,IAAGy9F,EAAS,IAAI,GAAInlG,GAAI,EAAGgqB,EAAMqzB,EAAMv/C,OAAYksB,EAAJhqB,IAAWA,EACxDklG,EAAQtyF,OAAOyqC,EAAMr9C,GAAImlG,OACpB,KAAI,GAAInlG,GAAI,EAAGgqB,EAAMqzB,EAAMv/C,OAAYksB,EAAJhqB,IAAWA,EACnDklG,EAAQtyF,OAAOyqC,EAAMr9C,GAGvB,OAAO0H,GAAOw9F,EAAQtO,QAAQlvF,GAAQw9F,EAAQtO,WAzBJr6F,EAAOD,QAAUwoG,MA6BlC7nG,KAAKX,EAAU,WAAa,MAAOI" +} \ No newline at end of file diff --git a/daliuge-translator/dlg/dropmake/web/lg_editor.html b/daliuge-translator/dlg/dropmake/web/lg_editor.html index 7572cec19..9807f915b 100644 --- a/daliuge-translator/dlg/dropmake/web/lg_editor.html +++ b/daliuge-translator/dlg/dropmake/web/lg_editor.html @@ -1,1632 +1,1726 @@  -Logical Graph Editor - - - - - - - - - - - - - - - + + + + + + + + + function loadFromRemoteJson(lgName, node) { + //given a logical graph name, get its JSON from the server + //alert("Previous lg name = " + window.curr_lg_name); + //alert("Requesting " + lgName.toString()); + $.ajax({ + url: "/jsonbody?lg_name=" + lgName.toString(), + type: 'get', + error: function (XMLHttpRequest, textStatus, errorThrown) { + if (404 == XMLHttpRequest.status) { + alert('Server cannot locate logical graph file ' + lgName.toString()) + } else { + alert('status:' + XMLHttpRequest.status + ', status text: ' + XMLHttpRequest.statusText); + } + }, + success: function (data) { + //console.log(data); + myDiagram.model = go.Model.fromJson(data); + save(); + window.curr_lg_name = lgName; + window.curr_lg_node = node; + //console.log(window.curr_lg_name); + //var loadButton = document.getElementById("LoadButton"); + if (window.load_button) { + window.load_button.disabled = true; + } + } + }); + } + + // add an SVG rendering of the diagram at the end of this page + function makeSVG() { + var svg = myDiagram.makeSvg({ + scale: 1.0 + }); + svg.style.border = "1px solid black"; + obj = document.getElementById("SVGArea"); + obj.appendChild(svg); + if (obj.children.length > 0) { + obj.replaceChild(svg, obj.children[0]); + } + } + + function makePNG() { + var svg = myDiagram.makeImage({ + scale: 1.0, + background: "White", + details: 1.0 + }); + svg.style.border = "1px solid black"; + obj = document.getElementById("SVGArea"); + obj.appendChild(svg); + if (obj.children.length > 0) { + obj.replaceChild(svg, obj.children[0]); + } + } + + function setButtonStatus(obj) { + btt = document.getElementById("pngButton"); + if ("PNG" == obj.innerHTML) { + btt.disabled = false; + } else { + btt.disabled = true; + } + } + + function makeInspector() { + //alert("inspector is called"); + var alist = ["location", "clean"]; + var inspector = new Inspector('myInspector', myDiagram, + { + acceptButton: true, + resetButton: true, + + + /* + propertyNames: { + "Node": alist + }, + */ + + + + + // example predicate, only show data objects: + inspectPredicate: function (value) { + return !(value instanceof go.GraphObject) + } + + + }); + + + window.inspector = inspector; + } + +
    -
    +

    Palette

    - +
    -
    +
    - +
    -
    +
    - +
    -
    +
    - +
    -
    +
    @@ -1673,16 +1767,16 @@ - + @@ -1694,58 +1788,58 @@ - + - + - - - + + --> - + - + - - + + @@ -1758,147 +1852,148 @@ - - + + - - - + + +
    - +
    Minimise data movement and balance loads given the number of nodes
    # of nodes # of nodes
    Node label - +
    + Edge cut + Total Communication Volume +
    Load balancing%Load balancing%
    - - - + + + - +
    Minimise execution time and resources given node capacitiesMinimise execution time and resources given node capacities
    Node label - +
    CPUs per node -   +  
    Memory per node -  Megabytes +  Megabytes
    - - + + - - + +
    @@ -1910,72 +2005,78 @@
    - +

    Logical Graphs

    -
      +
        -
        +
        -
        - - - - - - - Mouse-over a Node to view its ports. - Drag from these ports to create new Links. - Selecting a Node and then clicking its TextBlock will allow - you to edit text (except on the Start and End Nodes).
        Any issues please email chen DOT wu AT icrar DOT org - - - - +
        + + + + + + + Mouse-over a Node to view its ports. + Drag from these ports to create new Links. + Selecting a Node and then clicking its TextBlock will allow + you to edit text (except on the Start and End Nodes).
        Any issues please email chen DOT wu AT icrar DOT org + + + +
        diff --git a/daliuge-translator/dlg/dropmake/web/lg_web.py b/daliuge-translator/dlg/dropmake/web/lg_web.py index 41e86b9d7..f9fdb82d9 100644 --- a/daliuge-translator/dlg/dropmake/web/lg_web.py +++ b/daliuge-translator/dlg/dropmake/web/lg_web.py @@ -26,13 +26,15 @@ import logging import optparse import os -import traceback import signal import sys import threading import time +import traceback import warnings +import bottle +import pkg_resources from bottle import ( route, request, @@ -43,14 +45,12 @@ response, HTTPResponse, ) -import bottle -import pkg_resources -from ... import common, restutils -from ...clients import CompositeManagerClient from ..pg_generator import unroll, partition, GraphException from ..pg_manager import PGManager from ..scheduler import SchedulerException +from ... import common, restutils +from ...clients import CompositeManagerClient def file_as_string(fname, enc="utf8"): @@ -376,7 +376,7 @@ def gen_pgt(): pgt_view_json_name=pgt_id, partition_info=part_info, title="Physical Graph Template%s" - % ("" if num_partitions == 0 else "Partitioning"), + % ("" if num_partitions == 0 else "Partitioning"), ) except GraphException as ge: response.status = 500 @@ -584,6 +584,7 @@ def format_epilog(self, formatter): # Simple and easy def handler(*_args): raise KeyboardInterrupt + signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler) diff --git a/daliuge-translator/dlg/dropmake/web/matrix_vis.html b/daliuge-translator/dlg/dropmake/web/matrix_vis.html index 1f12d03df..6d7f3ca48 100644 --- a/daliuge-translator/dlg/dropmake/web/matrix_vis.html +++ b/daliuge-translator/dlg/dropmake/web/matrix_vis.html @@ -1,192 +1,203 @@ - - - - + + + - - - diff --git a/daliuge-translator/dlg/dropmake/web/pg_viewer.html b/daliuge-translator/dlg/dropmake/web/pg_viewer.html index 553b77d4c..1de0b3fca 100644 --- a/daliuge-translator/dlg/dropmake/web/pg_viewer.html +++ b/daliuge-translator/dlg/dropmake/web/pg_viewer.html @@ -1,575 +1,586 @@ -Physical Graph Template Viewer - - - - - - - + + + + function rebuildGraph() { + var minNodes = document.getElementById("minNodes").value; + minNodes = parseInt(minNodes, 10); + + var maxNodes = document.getElementById("maxNodes").value; + maxNodes = parseInt(maxNodes, 10); + + generateDigraph(minNodes, maxNodes); + } + + function generateDigraph(minNodes, maxNodes) { + myDiagram.startTransaction("generateDigraph"); + // replace the diagram's model's nodeDataArray + generateNodes(minNodes, maxNodes); + // replace the diagram's model's linkDataArray + generateLinks(); + // force a diagram layout + layout(); + myDiagram.commitTransaction("generateDigraph"); + } + + // Creates a random number of randomly colored nodes. + function generateNodes(minNodes, maxNodes) { + var nodeArray = []; + // get the values from the fields and create a random number of nodes within the range + var min = parseInt(minNodes, 10); + var max = parseInt(maxNodes, 10); + if (isNaN(min)) min = 0; + if (isNaN(max) || max < min) max = min; + var numNodes = Math.floor(Math.random() * (max - min + 1)) + min; + var i; + for (i = 0; i < numNodes; i++) { + var cat; + if (i % 2 == 0) { + cat = "Data" + } else { + cat = "Component" + } + nodeArray.push({ + key: i, + text: i.toString(), + //fill: go.Brush.randomColor(), + category: cat + }); + } + + // randomize the node data + for (i = 0; i < nodeArray.length; i++) { + var swap = Math.floor(Math.random() * nodeArray.length); + var temp = nodeArray[swap]; + nodeArray[swap] = nodeArray[i]; + nodeArray[i] = temp; + } + + // set the nodeDataArray to this array of objects + myDiagram.model.nodeDataArray = nodeArray; + } + + // Create some link data + function generateLinks() { + if (myDiagram.nodes.count < 2) return; + var linkArray = []; + var nit = myDiagram.nodes; + var nodes = new go.List(go.Node); + nodes.addAll(nit); + for (var i = 0; i < nodes.count - 1; i++) { + var from = nodes.elt(i); + var numto = Math.floor(1 + (Math.random() * 3) / 2); + for (var j = 0; j < numto; j++) { + var idx = Math.floor(i + 5 + Math.random() * 10); + if (idx >= nodes.count) idx = i + (Math.random() * (nodes.count - i)) | 0; + var to = nodes.elt(idx); + linkArray.push({from: from.data.key, to: to.data.key}); + } + } + myDiagram.model.linkDataArray = linkArray; + } + + function layout() { + myDiagram.startTransaction("change Layout"); + var lay = myDiagram.layout; + + var direction = getRadioValue("direction"); + direction = parseFloat(direction, 10); + lay.direction = direction; + + //var layerSpacing = document.getElementById("layerSpacing").value; + var layerSpacing = 25; //parseFloat(layerSpacing, 10); + lay.layerSpacing = layerSpacing; + + //var columnSpacing = document.getElementById("columnSpacing").value; + var columnSpacing = 25; //parseFloat(columnSpacing, 10); + lay.columnSpacing = columnSpacing; + + /* + var cycleRemove = getRadioValue("cycleRemove"); + if (cycleRemove === "CycleDepthFirst") lay.cycleRemoveOption = go.LayeredDigraphLayout.CycleDepthFirst; + else if (cycleRemove === "CycleGreedy") lay.cycleRemoveOption = go.LayeredDigraphLayout.CycleGreedy; + */ + lay.cycleRemoveOption = go.LayeredDigraphLayout.CycleDepthFirst; + + /* + var layering = getRadioValue("layering"); + if (layering === "LayerOptimalLinkLength") lay.layeringOption = go.LayeredDigraphLayout.LayerOptimalLinkLength; + else if (layering === "LayerLongestPathSource") lay.layeringOption = go.LayeredDigraphLayout.LayerLongestPathSource; + else if (layering === "LayerLongestPathSink") lay.layeringOption = go.LayeredDigraphLayout.LayerLongestPathSink; + */ + lay.layeringOption = go.LayeredDigraphLayout.LayerOptimalLinkLength; + + /* + var initialize = getRadioValue("initialize"); + if (initialize === "InitDepthFirstOut") lay.initializeOption = go.LayeredDigraphLayout.InitDepthFirstOut; + else if (initialize === "InitDepthFirstIn") lay.initializeOption = go.LayeredDigraphLayout.InitDepthFirstIn; + else if (initialize === "InitNaive") lay.initializeOption = go.LayeredDigraphLayout.InitNaive; + */ + lay.initializeOption = go.LayeredDigraphLayout.InitDepthFirstIn; + + /* + var aggressive = getRadioValue("aggressive"); + if (aggressive === "AggressiveLess") lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveLess; + else if (aggressive === "AggressiveNone") lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveNone; + else if (aggressive === "AggressiveMore") lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveMore; + */ + lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveLess; + + //TODO implement pack option + var pack = document.getElementsByName("pack"); + var packing = 0; + for (var i = 0; i < pack.length; i++) { + if (pack[i].checked) packing = packing | parseInt(pack[i].value, 10); + } + lay.packOption = packing; + + /* + var setsPortSpots = document.getElementById("setsPortSpots"); + lay.setsPortSpots = setsPortSpots.checked; + */ + lay.setsPortSpots = true; + + myDiagram.commitTransaction("change Layout"); + } + + function getRadioValue(name) { + var radio = document.getElementsByName(name); + for (var i = 0; i < radio.length; i++) + if (radio[i].checked) return radio[i].value; + } + + function genGanttChart() { + url = "/show_gantt_chart?pgt_id={{pgt_view_json_name}}" + window.open(url) + } + + function genScheduleChart() { + url = "/show_schedule_mat?pgt_id={{pgt_view_json_name}}" + window.open(url) + } + + function makePNG() { + //zoomToFit(); + + //var svg = myDiagram.makeSvg({ + var rect_w = myDiagram.viewportBounds.width; + var rect_h = myDiagram.viewportBounds.height; + var img_w = myDiagram.documentBounds.width; + var img_h = myDiagram.documentBounds.height; + + w_ratio = rect_w / img_w; + h_ratio = rect_h / img_h; + + var scale_f = Math.min(1.0, Math.min(w_ratio, h_ratio)); + + var svg = myDiagram.makeImage({ + scale: scale_f, + background: "White", + details: 1.0 + }); + svg.style.border = "1px solid black"; + obj = document.getElementById("SVGArea"); + obj.appendChild(svg); + if (obj.children.length > 0) { + obj.replaceChild(svg, obj.children[0]); + } + } + + function zoomToFit() { + myDiagram.zoomToFit() + // console.log(myDiagram.viewportBounds.width.toString()); + // console.log('\n'); + // console.log(myDiagram.viewportBounds.height.toString()); + // console.log('\n -----'); + // console.log(myDiagram.documentBounds.width.toString()); + // console.log('\n'); + // console.log(myDiagram.documentBounds.height.toString()); + } + +
        -
        +
        - {{title}}
        {{partition_info}}
        - + {{title}}
        {{partition_info}}
        +
        - + Rotate: - Right (0) - Down (90) - Left (180) - Up (270)
        - + Right (0) + Down (90) + Left (180) + Up (270)
        + Pack: - PackMedian - PackStraighten - PackExpand
        - + PackMedian + PackStraighten + PackExpand
        +
        -
        -
        -
        - -
        -
        - - - - -
        +
        +
        +
        + +
        +
        + + + + +
        -
        +
        -
        +


        -
        - - DALiuGE Manager host: - - DALiuGE Manager port: -
        - - + + + DALiuGE Manager host: + + DALiuGE Manager port: +
        + +
        -
        +
        diff --git a/daliuge-translator/dlg/translator/__init__.py b/daliuge-translator/dlg/translator/__init__.py index b6940c8bf..e7c6fa8b8 100644 --- a/daliuge-translator/dlg/translator/__init__.py +++ b/daliuge-translator/dlg/translator/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 76b33bb62..f98369e58 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -56,8 +56,8 @@ def unroll(lg_path, oid_prefix, zerorun=False, app=None): _param_types = {'min_goal': int, 'ptype': int, 'max_load_imb': int, - 'max_cpu': int, 'time_greedy': float, 'deadline': int, - 'topk': int, 'swarm_size': int, 'max_mem': int} + 'max_cpu': int, 'time_greedy': float, 'deadline': int, + 'topk': int, 'swarm_size': int, 'max_mem': int} def parse_partition_algo_params(algo_params): @@ -72,13 +72,12 @@ def parse_partition_algo_params(algo_params): def partition(pgt, opts): - from ..dropmake import pg_generator algo_params = parse_partition_algo_params(opts.algo_params or []) pg = pg_generator.partition(pgt, algo=opts.algo, num_partitions=opts.partitions, - num_islands=opts.islands, partition_label='partition', - **algo_params) + num_islands=opts.islands, partition_label='partition', + **algo_params) logger.info("PG spec is calculated!") return pg @@ -104,6 +103,7 @@ def _setup_output(opts): def dump(obj): with _open_o(opts.output) as f: json.dump(obj, f, indent=None if opts.format is None else 2) + return dump @@ -151,9 +151,12 @@ def _add_unroll_options(parser): parser.add_option('-p', '--oid-prefix', action="store", dest='oid_prefix', type="string", help='Prefix to use for generated OIDs', default='1') parser.add_option("-z", "--zerorun", action="store_true", - dest="zerorun", help="Generate a Physical Graph Template that takes no time to run", default=False) + dest="zerorun", help="Generate a Physical Graph Template that takes no time to run", + default=False) parser.add_option("--app", action="store", type="int", - dest="app", help="Force an app to be used in the Physical Graph. 0=Don't force, 1=SleepApp, 2=SleepAndCopy", default=0) + dest="app", + help="Force an app to be used in the Physical Graph. 0=Don't force, 1=SleepApp, 2=SleepAndCopy", + default=0) apps = ( None, 'dlg.apps.simple.SleepApp', @@ -163,7 +166,6 @@ def _add_unroll_options(parser): def dlg_unroll(parser, args): - # Unroll Logical Graph tool.add_logging_options(parser) _add_output_options(parser) @@ -176,7 +178,6 @@ def dlg_unroll(parser, args): def _add_partition_options(parser): - from ..dropmake import pg_generator parser.add_option("-N", "--partitions", action="store", type="int", dest="partitions", help="Number of partitions to generate", default=1) @@ -189,7 +190,6 @@ def _add_partition_options(parser): def dlg_partition(parser, args): - tool.add_logging_options(parser) _add_output_options(parser) _add_partition_options(parser) @@ -206,7 +206,6 @@ def dlg_partition(parser, args): def dlg_unroll_and_partition(parser, args): - tool.add_logging_options(parser) _add_output_options(parser) apps = _add_unroll_options(parser) @@ -220,7 +219,6 @@ def dlg_unroll_and_partition(parser, args): def dlg_map(parser, args): - from .. import constants tool.add_logging_options(parser) @@ -228,11 +226,13 @@ def dlg_map(parser, args): parser.add_option('-H', '--host', action='store', dest='host', help='The host we connect to to deploy the graph', default='localhost') parser.add_option("-p", "--port", action="store", type="int", - dest='port', help='The port we connect to to deploy the graph', default=constants.ISLAND_DEFAULT_REST_PORT) + dest='port', help='The port we connect to to deploy the graph', + default=constants.ISLAND_DEFAULT_REST_PORT) parser.add_option('-P', '--physical-graph-template', action='store', dest='pgt_path', type='string', help='Path to the Physical Graph to submit (default: stdin)', default='-') parser.add_option("-N", "--nodes", action="store", - dest="nodes", help="The nodes where the Physical Graph will be distributed, comma-separated", default=None) + dest="nodes", help="The nodes where the Physical Graph will be distributed, comma-separated", + default=None) parser.add_option("-i", "--islands", action="store", type="int", dest="islands", help="Number of islands to use during the partitioning", default=1) (opts, args) = parser.parse_args(args) @@ -259,7 +259,6 @@ def dlg_map(parser, args): def dlg_submit(parser, args): - from ..manager import constants # Submit Physical Graph @@ -267,7 +266,8 @@ def dlg_submit(parser, args): parser.add_option('-H', '--host', action='store', dest='host', help='The host we connect to to deploy the graph', default='localhost') parser.add_option("-p", "--port", action="store", type="int", - dest='port', help='The port we connect to to deploy the graph', default=constants.ISLAND_DEFAULT_REST_PORT) + dest='port', help='The port we connect to to deploy the graph', + default=constants.ISLAND_DEFAULT_REST_PORT) parser.add_option('-P', '--physical-graph', action='store', dest='pg_path', type='string', help='Path to the Physical Graph to submit (default: stdin)', default='-') parser.add_option('-s', '--session-id', action='store', dest='session_id', type='string', @@ -284,6 +284,7 @@ def dlg_submit(parser, args): with _open_i(opts.pg_path) as f: submit(json.load(f), opts) + def register_commands(): tool.cmdwrap('lgweb', 'A Web server for the Logical Graph Editor', 'dlg.dropmake.web.lg_web:run') tool.cmdwrap('submit', 'Submits a Physical Graph to a Drop Manager', dlg_submit) @@ -291,4 +292,4 @@ def register_commands(): tool.cmdwrap('unroll', 'Unrolls a Logical Graph into a Physical Graph Template', dlg_unroll) tool.cmdwrap('partition', 'Divides a Physical Graph Template into N logical partitions', dlg_partition) tool.cmdwrap('unroll-and-partition', 'unroll + partition', dlg_unroll_and_partition) - tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', fill) \ No newline at end of file + tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', fill) diff --git a/daliuge-translator/setup.py b/daliuge-translator/setup.py index 71ee88c39..e0b574e32 100644 --- a/daliuge-translator/setup.py +++ b/daliuge-translator/setup.py @@ -107,7 +107,7 @@ def write_version_info(): license="LGPLv2+", install_requires=install_requires, packages=find_packages(), - entry_points = { + entry_points={ 'dlg.tool_commands': ['translator=dlg.translator.tool_commands'] }, test_suite="test", diff --git a/daliuge-translator/test/__init__.py b/daliuge-translator/test/__init__.py index c5c2f0ace..6a270caa5 100644 --- a/daliuge-translator/test/__init__.py +++ b/daliuge-translator/test/__init__.py @@ -21,7 +21,6 @@ # def __setupTestLogging(): - import os import logging @@ -34,5 +33,6 @@ def __setupTestLogging(): else: logging.root.addHandler(logging.NullHandler()) + __setupTestLogging() -del __setupTestLogging \ No newline at end of file +del __setupTestLogging diff --git a/daliuge-translator/test/dropmake/__init__.py b/daliuge-translator/test/dropmake/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-translator/test/dropmake/__init__.py +++ b/daliuge-translator/test/dropmake/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json b/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json index 774fba021..c863efce4 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json +++ b/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json @@ -1,58 +1,822 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Start", "text":"Start", "key":-14, "loc":"-679.999999999993 -276.0000000000005"}, -{"category":"Comment", "text":"Chiles Simple LG:\ndata partition is explicit ", "key":-10, "loc":"266.7812500000001 -548"}, -{"category":"Comment", "text":"Split by freq", "key":-23, "loc":"-182.21874999999972 -582.0000000000006"}, -{"category":"memory", "text":"Day1", "data_volume":100, "key":-25, "loc":"-507.328125 -539"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-26, "loc":"-316.328125 -539"}, -{"category":"memory", "text":"Day1-Split1", "data_volume":5, "key":-27, "loc":"-76.328125 -539"}, -{"category":"memory", "text":"Data", "data_volume":30, "key":-3, "loc":"295.671875 -266"}, -{"category":"Component", "text":"CLEAN", "execution_time":100, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"148.671875 -261"}, -{"category":"memory", "text":"Day2", "data_volume":100, "key":-11, "loc":"-514.328125 -401"}, -{"category":"memory", "text":"Day3", "data_volume":100, "key":-12, "loc":"-516.328125 -292"}, -{"category":"memory", "text":"Day4", "data_volume":100, "key":-13, "loc":"-521.328125 -176"}, -{"category":"memory", "text":"Day5", "data_volume":100, "key":-15, "loc":"-514.328125 -92"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-16, "loc":"-319.328125 -397"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-17, "loc":"-326.328125 -300"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-18, "loc":"-321.328125 -189"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-19, "loc":"-333.328125 -90"}, -{"category":"memory", "text":"Day2-Split1", "data_volume":5, "key":-20, "loc":"-73.328125 -386"}, -{"category":"memory", "text":"Day3-Split1", "data_volume":5, "key":-21, "loc":"-70.328125 -281"}, -{"category":"memory", "text":"Day4-Split1", "data_volume":5, "key":-22, "loc":"-79.328125 -182"}, -{"category":"memory", "text":"Day5-Split1", "data_volume":5, "key":-24, "loc":"-81.328125 -87"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%{param1}", "key":-28, "loc":"-628.328125 -603"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%param2", "key":-29, "loc":"-626.328125 -488"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%{param1.param2}", "key":-30, "loc":"-624.328125 -374"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%{param4.what}", "key":-31, "loc":"-606.328125 -258"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-32, "loc":"-608.328125 -153"} - ], - "linkDataArray": [ -{"from":-25, "to":-26, "fromPort":"R", "toPort":"L", "points":[-474.9240474700928,-539,-464.9240474700928,-539,-407.61230754852295,-539,-407.61230754852295,-539,-350.3005676269531,-539,-340.3005676269531,-539]}, -{"from":-26, "to":-27, "fromPort":"R", "toPort":"L", "points":[-292.3556823730469,-539,-282.3556823730469,-539,-214.5426845550537,-539,-214.5426845550537,-539,-146.72968673706055,-539,-136.72968673706055,-539]}, -{"from":-2, "to":-3, "fromPort":"R", "toPort":"L", "points":[181.61353302001953,-261,191.61353302001953,-261,223.46294689178467,-261,223.46294689178467,-266,255.3123607635498,-266,265.3123607635498,-266]}, -{"from":-27, "to":-2, "fromPort":"R", "toPort":"T", "points":[-15.926563262939453,-539,-5.926563262939453,-539,148.671875,-539,148.671875,-413.21886215209963,148.671875,-287.4377243041992,148.671875,-277.4377243041992]}, -{"from":-11, "to":-16, "fromPort":"R", "toPort":"L", "points":[-481.9240474700928,-401,-471.9240474700928,-401,-412.61230754852295,-401,-412.61230754852295,-397,-353.3005676269531,-397,-343.3005676269531,-397]}, -{"from":-12, "to":-17, "fromPort":"R", "toPort":"L", "points":[-483.9240474700928,-292,-473.9240474700928,-292,-417.11230754852295,-292,-417.11230754852295,-300,-360.3005676269531,-300,-350.3005676269531,-300]}, -{"from":-13, "to":-18, "fromPort":"R", "toPort":"L", "points":[-488.9240474700928,-176,-478.9240474700928,-176,-417.11230754852295,-176,-417.11230754852295,-189,-355.3005676269531,-189,-345.3005676269531,-189]}, -{"from":-15, "to":-19, "fromPort":"R", "toPort":"L", "points":[-481.9240474700928,-92,-471.9240474700928,-92,-419.61230754852295,-92,-419.61230754852295,-90,-367.3005676269531,-90,-357.3005676269531,-90]}, -{"from":-16, "to":-20, "fromPort":"R", "toPort":"L", "points":[-295.3556823730469,-397,-285.3556823730469,-397,-214.5426845550537,-397,-214.5426845550537,-386,-143.72968673706055,-386,-133.72968673706055,-386]}, -{"from":-17, "to":-21, "fromPort":"R", "toPort":"L", "points":[-302.3556823730469,-300,-292.3556823730469,-300,-216.5426845550537,-300,-216.5426845550537,-281,-140.72968673706055,-281,-130.72968673706055,-281]}, -{"from":-18, "to":-22, "fromPort":"R", "toPort":"L", "points":[-297.3556823730469,-189,-287.3556823730469,-189,-218.5426845550537,-189,-218.5426845550537,-182,-149.72968673706055,-182,-139.72968673706055,-182]}, -{"from":-19, "to":-24, "fromPort":"R", "toPort":"L", "points":[-309.3556823730469,-90,-299.3556823730469,-90,-225.5426845550537,-90,-225.5426845550537,-87,-151.72968673706055,-87,-141.72968673706055,-87]}, -{"from":-20, "to":-2, "fromPort":"R", "toPort":"L", "points":[-12.926563262939453,-386,-2.926563262939453,-386,51.40182685852051,-386,51.40182685852051,-261,105.73021697998047,-261,115.73021697998047,-261]}, -{"from":-21, "to":-2, "fromPort":"R", "toPort":"L", "points":[-9.926563262939453,-281,0.07343673706054688,-281,52.90182685852051,-281,52.90182685852051,-261,105.73021697998047,-261,115.73021697998047,-261]}, -{"from":-22, "to":-2, "fromPort":"R", "toPort":"B", "points":[-18.926563262939453,-182,-8.926563262939453,-182,148.671875,-182,148.671875,-208.28113784790037,148.671875,-234.56227569580076,148.671875,-244.56227569580076]}, -{"from":-24, "to":-2, "fromPort":"R", "toPort":"B", "points":[-20.926563262939453,-87,-10.926563262939453,-87,148.671875,-87,148.671875,-160.78113784790037,148.671875,-234.56227569580076,148.671875,-244.56227569580076]}, -{"from":-14, "to":-28, "fromPort":"T", "toPort":"L", "points":[-679.999999999993,-296.0000000000005,-679.999999999993,-306.0000000000005,-679.999999999993,-603,-671.9698944091762,-603,-663.9397888183594,-603,-653.9397888183594,-603]}, -{"from":-28, "to":-25, "fromPort":"R", "toPort":"T", "points":[-602.7164611816406,-603,-592.7164611816406,-603,-507.328125,-603,-507.328125,-584.2188621520996,-507.328125,-565.4377243041993,-507.328125,-555.4377243041993]}, -{"from":-14, "to":-29, "fromPort":"T", "toPort":"L", "points":[-679.999999999993,-296.0000000000005,-679.999999999993,-306.0000000000005,-679.999999999993,-488.00000000000006,-670.9698944091762,-488.00000000000006,-661.9397888183594,-488.00000000000006,-651.9397888183594,-488.00000000000006]}, -{"from":-14, "to":-30, "fromPort":"T", "toPort":"L", "points":[-679.999999999993,-296.0000000000005,-679.999999999993,-306.0000000000005,-679.999999999993,-374.00000000000006,-669.9698944091762,-374.00000000000006,-659.9397888183594,-374.00000000000006,-649.9397888183594,-374.00000000000006]}, -{"from":-14, "to":-31, "fromPort":"R", "toPort":"L", "points":[-646.0998840331961,-276.0000000000005,-636.0998840331961,-276.0000000000005,-636.0998840331961,-267.0000000000003,-641.9397888183594,-267.0000000000003,-641.9397888183594,-258.00000000000006,-631.9397888183594,-258.00000000000006]}, -{"from":-14, "to":-32, "fromPort":"B", "toPort":"L", "points":[-679.999999999993,-256.0000000000005,-679.999999999993,-246.0000000000005,-679.999999999993,-153.00000000000006,-661.9698944091762,-153.00000000000006,-643.9397888183594,-153.00000000000006,-633.9397888183594,-153.00000000000006]}, -{"from":-31, "to":-13, "fromPort":"R", "toPort":"L", "points":[-580.7164611816406,-258.00000000000006,-570.7164611816406,-258.00000000000006,-567.2243318557739,-258.00000000000006,-567.2243318557739,-176,-563.7322025299072,-176,-553.7322025299072,-176]}, -{"from":-29, "to":-11, "fromPort":"R", "toPort":"L", "points":[-600.7164611816406,-488.00000000000006,-590.7164611816406,-488.00000000000006,-573.7243318557739,-488.00000000000006,-573.7243318557739,-401,-556.7322025299072,-401,-546.7322025299072,-401]}, -{"from":-30, "to":-12, "fromPort":"R", "toPort":"L", "points":[-598.7164611816406,-374.00000000000006,-588.7164611816406,-374.00000000000006,-573.7243318557739,-374.00000000000006,-573.7243318557739,-292,-558.7322025299072,-292,-548.7322025299072,-292]}, -{"from":-32, "to":-15, "fromPort":"R", "toPort":"L", "points":[-582.7164611816406,-153.00000000000006,-572.7164611816406,-153.00000000000006,-564.7243318557739,-153.00000000000006,-564.7243318557739,-92,-556.7322025299072,-92,-546.7322025299072,-92]} - ]} + "nodeDataArray": [ + { + "category": "Start", + "text": "Start", + "key": -14, + "loc": "-679.999999999993 -276.0000000000005" + }, + { + "category": "Comment", + "text": "Chiles Simple LG:\ndata partition is explicit ", + "key": -10, + "loc": "266.7812500000001 -548" + }, + { + "category": "Comment", + "text": "Split by freq", + "key": -23, + "loc": "-182.21874999999972 -582.0000000000006" + }, + { + "category": "memory", + "text": "Day1", + "data_volume": 100, + "key": -25, + "loc": "-507.328125 -539" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -26, + "loc": "-316.328125 -539" + }, + { + "category": "memory", + "text": "Day1-Split1", + "data_volume": 5, + "key": -27, + "loc": "-76.328125 -539" + }, + { + "category": "memory", + "text": "Data", + "data_volume": 30, + "key": -3, + "loc": "295.671875 -266" + }, + { + "category": "Component", + "text": "CLEAN", + "execution_time": 100, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "148.671875 -261" + }, + { + "category": "memory", + "text": "Day2", + "data_volume": 100, + "key": -11, + "loc": "-514.328125 -401" + }, + { + "category": "memory", + "text": "Day3", + "data_volume": 100, + "key": -12, + "loc": "-516.328125 -292" + }, + { + "category": "memory", + "text": "Day4", + "data_volume": 100, + "key": -13, + "loc": "-521.328125 -176" + }, + { + "category": "memory", + "text": "Day5", + "data_volume": 100, + "key": -15, + "loc": "-514.328125 -92" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -16, + "loc": "-319.328125 -397" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -17, + "loc": "-326.328125 -300" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -18, + "loc": "-321.328125 -189" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -19, + "loc": "-333.328125 -90" + }, + { + "category": "memory", + "text": "Day2-Split1", + "data_volume": 5, + "key": -20, + "loc": "-73.328125 -386" + }, + { + "category": "memory", + "text": "Day3-Split1", + "data_volume": 5, + "key": -21, + "loc": "-70.328125 -281" + }, + { + "category": "memory", + "text": "Day4-Split1", + "data_volume": 5, + "key": -22, + "loc": "-79.328125 -182" + }, + { + "category": "memory", + "text": "Day5-Split1", + "data_volume": 5, + "key": -24, + "loc": "-81.328125 -87" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%{param1}", + "key": -28, + "loc": "-628.328125 -603" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%param2", + "key": -29, + "loc": "-626.328125 -488" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%{param1.param2}", + "key": -30, + "loc": "-624.328125 -374" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%{param4.what}", + "key": -31, + "loc": "-606.328125 -258" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -32, + "loc": "-608.328125 -153" + } + ], + "linkDataArray": [ + { + "from": -25, + "to": -26, + "fromPort": "R", + "toPort": "L", + "points": [ + -474.9240474700928, + -539, + -464.9240474700928, + -539, + -407.61230754852295, + -539, + -407.61230754852295, + -539, + -350.3005676269531, + -539, + -340.3005676269531, + -539 + ] + }, + { + "from": -26, + "to": -27, + "fromPort": "R", + "toPort": "L", + "points": [ + -292.3556823730469, + -539, + -282.3556823730469, + -539, + -214.5426845550537, + -539, + -214.5426845550537, + -539, + -146.72968673706055, + -539, + -136.72968673706055, + -539 + ] + }, + { + "from": -2, + "to": -3, + "fromPort": "R", + "toPort": "L", + "points": [ + 181.61353302001953, + -261, + 191.61353302001953, + -261, + 223.46294689178467, + -261, + 223.46294689178467, + -266, + 255.3123607635498, + -266, + 265.3123607635498, + -266 + ] + }, + { + "from": -27, + "to": -2, + "fromPort": "R", + "toPort": "T", + "points": [ + -15.926563262939453, + -539, + -5.926563262939453, + -539, + 148.671875, + -539, + 148.671875, + -413.21886215209963, + 148.671875, + -287.4377243041992, + 148.671875, + -277.4377243041992 + ] + }, + { + "from": -11, + "to": -16, + "fromPort": "R", + "toPort": "L", + "points": [ + -481.9240474700928, + -401, + -471.9240474700928, + -401, + -412.61230754852295, + -401, + -412.61230754852295, + -397, + -353.3005676269531, + -397, + -343.3005676269531, + -397 + ] + }, + { + "from": -12, + "to": -17, + "fromPort": "R", + "toPort": "L", + "points": [ + -483.9240474700928, + -292, + -473.9240474700928, + -292, + -417.11230754852295, + -292, + -417.11230754852295, + -300, + -360.3005676269531, + -300, + -350.3005676269531, + -300 + ] + }, + { + "from": -13, + "to": -18, + "fromPort": "R", + "toPort": "L", + "points": [ + -488.9240474700928, + -176, + -478.9240474700928, + -176, + -417.11230754852295, + -176, + -417.11230754852295, + -189, + -355.3005676269531, + -189, + -345.3005676269531, + -189 + ] + }, + { + "from": -15, + "to": -19, + "fromPort": "R", + "toPort": "L", + "points": [ + -481.9240474700928, + -92, + -471.9240474700928, + -92, + -419.61230754852295, + -92, + -419.61230754852295, + -90, + -367.3005676269531, + -90, + -357.3005676269531, + -90 + ] + }, + { + "from": -16, + "to": -20, + "fromPort": "R", + "toPort": "L", + "points": [ + -295.3556823730469, + -397, + -285.3556823730469, + -397, + -214.5426845550537, + -397, + -214.5426845550537, + -386, + -143.72968673706055, + -386, + -133.72968673706055, + -386 + ] + }, + { + "from": -17, + "to": -21, + "fromPort": "R", + "toPort": "L", + "points": [ + -302.3556823730469, + -300, + -292.3556823730469, + -300, + -216.5426845550537, + -300, + -216.5426845550537, + -281, + -140.72968673706055, + -281, + -130.72968673706055, + -281 + ] + }, + { + "from": -18, + "to": -22, + "fromPort": "R", + "toPort": "L", + "points": [ + -297.3556823730469, + -189, + -287.3556823730469, + -189, + -218.5426845550537, + -189, + -218.5426845550537, + -182, + -149.72968673706055, + -182, + -139.72968673706055, + -182 + ] + }, + { + "from": -19, + "to": -24, + "fromPort": "R", + "toPort": "L", + "points": [ + -309.3556823730469, + -90, + -299.3556823730469, + -90, + -225.5426845550537, + -90, + -225.5426845550537, + -87, + -151.72968673706055, + -87, + -141.72968673706055, + -87 + ] + }, + { + "from": -20, + "to": -2, + "fromPort": "R", + "toPort": "L", + "points": [ + -12.926563262939453, + -386, + -2.926563262939453, + -386, + 51.40182685852051, + -386, + 51.40182685852051, + -261, + 105.73021697998047, + -261, + 115.73021697998047, + -261 + ] + }, + { + "from": -21, + "to": -2, + "fromPort": "R", + "toPort": "L", + "points": [ + -9.926563262939453, + -281, + 0.07343673706054688, + -281, + 52.90182685852051, + -281, + 52.90182685852051, + -261, + 105.73021697998047, + -261, + 115.73021697998047, + -261 + ] + }, + { + "from": -22, + "to": -2, + "fromPort": "R", + "toPort": "B", + "points": [ + -18.926563262939453, + -182, + -8.926563262939453, + -182, + 148.671875, + -182, + 148.671875, + -208.28113784790037, + 148.671875, + -234.56227569580076, + 148.671875, + -244.56227569580076 + ] + }, + { + "from": -24, + "to": -2, + "fromPort": "R", + "toPort": "B", + "points": [ + -20.926563262939453, + -87, + -10.926563262939453, + -87, + 148.671875, + -87, + 148.671875, + -160.78113784790037, + 148.671875, + -234.56227569580076, + 148.671875, + -244.56227569580076 + ] + }, + { + "from": -14, + "to": -28, + "fromPort": "T", + "toPort": "L", + "points": [ + -679.999999999993, + -296.0000000000005, + -679.999999999993, + -306.0000000000005, + -679.999999999993, + -603, + -671.9698944091762, + -603, + -663.9397888183594, + -603, + -653.9397888183594, + -603 + ] + }, + { + "from": -28, + "to": -25, + "fromPort": "R", + "toPort": "T", + "points": [ + -602.7164611816406, + -603, + -592.7164611816406, + -603, + -507.328125, + -603, + -507.328125, + -584.2188621520996, + -507.328125, + -565.4377243041993, + -507.328125, + -555.4377243041993 + ] + }, + { + "from": -14, + "to": -29, + "fromPort": "T", + "toPort": "L", + "points": [ + -679.999999999993, + -296.0000000000005, + -679.999999999993, + -306.0000000000005, + -679.999999999993, + -488.00000000000006, + -670.9698944091762, + -488.00000000000006, + -661.9397888183594, + -488.00000000000006, + -651.9397888183594, + -488.00000000000006 + ] + }, + { + "from": -14, + "to": -30, + "fromPort": "T", + "toPort": "L", + "points": [ + -679.999999999993, + -296.0000000000005, + -679.999999999993, + -306.0000000000005, + -679.999999999993, + -374.00000000000006, + -669.9698944091762, + -374.00000000000006, + -659.9397888183594, + -374.00000000000006, + -649.9397888183594, + -374.00000000000006 + ] + }, + { + "from": -14, + "to": -31, + "fromPort": "R", + "toPort": "L", + "points": [ + -646.0998840331961, + -276.0000000000005, + -636.0998840331961, + -276.0000000000005, + -636.0998840331961, + -267.0000000000003, + -641.9397888183594, + -267.0000000000003, + -641.9397888183594, + -258.00000000000006, + -631.9397888183594, + -258.00000000000006 + ] + }, + { + "from": -14, + "to": -32, + "fromPort": "B", + "toPort": "L", + "points": [ + -679.999999999993, + -256.0000000000005, + -679.999999999993, + -246.0000000000005, + -679.999999999993, + -153.00000000000006, + -661.9698944091762, + -153.00000000000006, + -643.9397888183594, + -153.00000000000006, + -633.9397888183594, + -153.00000000000006 + ] + }, + { + "from": -31, + "to": -13, + "fromPort": "R", + "toPort": "L", + "points": [ + -580.7164611816406, + -258.00000000000006, + -570.7164611816406, + -258.00000000000006, + -567.2243318557739, + -258.00000000000006, + -567.2243318557739, + -176, + -563.7322025299072, + -176, + -553.7322025299072, + -176 + ] + }, + { + "from": -29, + "to": -11, + "fromPort": "R", + "toPort": "L", + "points": [ + -600.7164611816406, + -488.00000000000006, + -590.7164611816406, + -488.00000000000006, + -573.7243318557739, + -488.00000000000006, + -573.7243318557739, + -401, + -556.7322025299072, + -401, + -546.7322025299072, + -401 + ] + }, + { + "from": -30, + "to": -12, + "fromPort": "R", + "toPort": "L", + "points": [ + -598.7164611816406, + -374.00000000000006, + -588.7164611816406, + -374.00000000000006, + -573.7243318557739, + -374.00000000000006, + -573.7243318557739, + -292, + -558.7322025299072, + -292, + -548.7322025299072, + -292 + ] + }, + { + "from": -32, + "to": -15, + "fromPort": "R", + "toPort": "L", + "points": [ + -582.7164611816406, + -153.00000000000006, + -572.7164611816406, + -153.00000000000006, + -564.7243318557739, + -153.00000000000006, + -564.7243318557739, + -92, + -556.7322025299072, + -92, + -546.7322025299072, + -92 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/logical_graphs/cont_img.json b/daliuge-translator/test/dropmake/logical_graphs/cont_img.json index 11ef68203..5b8f7cf5e 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/cont_img.json +++ b/daliuge-translator/test/dropmake/logical_graphs/cont_img.json @@ -1,102 +1,1335 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Comment", "loc":"315.0000000000002 -102", "text":"Continuum Imaging Pipeline", "key":-13, "clean_para":"eeww"}, -{"category":"Branch", "text":"Self-Cal\nConverge?", "key":-6, "loc":"-372.99999999999994 214", "group":-57}, -{"category":"Component", "text":"Update GSM", "key":-15, "loc":"-355.00000000000006 95.00000000000018", "group":-57}, -{"category":"Component", "text":"Update LSM", "key":-17, "loc":"-329.9999999999997 372.99999999999983", "group":-57}, -{"category":"Component", "text":"Cal. Source\nFinding", "key":-18, "loc":"-316 457.00000000000006", "group":-57}, -{"category":"Component", "text":"Image Plane\nSpectral Averaging", "key":-19, "loc":"-300.0000000000001 564.0000000000001", "group":-57}, -{"category":"Component", "text":"Predict 01", "key":-12, "loc":"-213 112.00000000000011", "group":-57}, -{"category":"Component", "text":"Solve", "key":-16, "loc":"-32 222.99999999999997", "group":-57}, -{"category":"Component", "text":"Correct", "key":-20, "loc":"95.00000000000003 180.00000000000009", "group":-57}, -{"category":"Component", "text":"Subtract", "key":-21, "loc":"245.9999999999999 241.0000000000001", "group":-57}, -{"category":"Component", "text":"Flag", "key":-22, "loc":"375.0000000000001 34", "group":-57}, -{"category":"Component", "text":"iFFT", "key":-23, "loc":"-167.00000000000023 523.9999999999999", "group":-46}, -{"category":"Component", "text":"deGrid", "key":-24, "loc":"-93.00000000000001 392.00000000000006", "group":-46}, -{"category":"Component", "text":"Subtract", "key":-25, "loc":"102.00000000000023 420.0000000000003", "group":-46}, -{"category":"Component", "text":"Flag", "key":-26, "loc":"143.00000000000065 353.99999999999955", "group":-46}, -{"category":"Component", "text":"FFT", "key":-28, "loc":"381.9999999999999 473.99999999999983", "group":-46}, -{"category":"Component", "text":"Subtract \ncompnt frm\nimg plane", "key":-32, "loc":"61.01612472534181 524.4822916666666", "group":-43}, -{"category":"End", "text":"End", "key":-29, "loc":"63.999999999999915 -103.99999999999999"}, -{"category":"memory", "text":"Calibration\nParameters", "data_volume":5, "key":-35, "loc":"-160.32812500000006 222.9999999999999", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-36, "loc":"-444.3281249999999 428.0000000000001", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-37, "loc":"-440.32812500000006 525.0000000000002", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-38, "loc":"-87.328125 111.99999999999994", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-39, "loc":"24.671874999999986 115", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-40, "loc":"159.67187500000003 118.99999999999997", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-41, "loc":"292.6718749999999 34.000000000000085", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-42, "loc":"375.67187499999994 250", "group":-57}, -{"category":"Loop", "text":"Minor Cycle", "isGroup":true, "num_of_iter":3, "key":-43, "loc":"106.88589859008792 524.4822916666666", "group":-46}, -{"category":"Component", "text":"Identify\nComponent", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"260.67187500000006 521.9999999999998", "group":-43}, -{"category":"memory", "text":"Model", "data_volume":5, "group_end":1, "key":-44, "loc":"-56.32812500000003 524.9999999999999", "group":-43}, -{"category":"memory", "text":"Image", "data_volume":5, "group_end":1, "key":-45, "loc":"381.67187500000006 533.9999999999998", "group":-46}, -{"category":"Loop", "text":"Major Cycle", "isGroup":true, "num_of_iter":2, "key":-46, "loc":"155.19133663177493 434.53887812296546", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-47, "loc":"-167.32812499999997 420.9999999999998", "group":-46}, -{"category":"memory", "text":"Model Vis", "data_volume":5, "group_end":0, "key":-48, "loc":"-8.328125000000014 420.0000000000001", "group":-46}, -{"category":"memory", "text":"Residul Vis", "data_volume":5, "group_end":0, "key":-49, "loc":"215.67187499999991 417.9999999999999", "group":-46}, -{"category":"memory", "text":"FRV", "data_volume":5, "group_end":1, "key":-50, "loc":"283.67187499999983 356.00000000000006", "group":-46}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-51, "loc":"381.671875 413.00000000000006", "group":-46}, -{"category":"Component", "text":"Grid", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-52, "loc":"381.6718750000001 357.9999999999999", "group":-46}, -{"category":"memory", "text":"CC", "data_volume":5, "group_end":0, "key":-53, "loc":"157.671875 523.0000000000001", "group":-43}, -{"category":"memory", "text":"GSM", "data_volume":5, "group_end":0, "key":-54, "loc":"-337.32812500000017 -4.999999999999986", "group":-57}, -{"category":"memory", "text":"Raw Vis", "data_volume":5, "group_end":0, "key":-56, "loc":"102.671875 236", "group":-57}, -{"category":"Loop", "text":"Self-Cal Cycle", "isGroup":true, "num_of_iter":2, "key":-57, "loc":"-29.341320037841797 283.46886215209963"}, -{"category":"memory", "text":"LSM", "data_volume":5, "group_end":1, "key":-3, "loc":"-500.328125 331", "group":-57}, -{"category":"Component", "text":"Check Conv", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-58, "loc":"-524.328125 44", "group":-57}, -{"category":"memory", "text":"result", "data_volume":5, "group_end":0, "key":-59, "loc":"-467.328125 147", "group":-57}, -{"category":"memory", "text":"Start Data ", "data_volume":5, "group_end":0, "key":-55, "loc":"-315.328125 -124"}, -{"category":"Start", "text":"Start", "key":-1, "loc":"-314.328125 -193"}, -{"category":"Component", "text":"Predict 02", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-60, "loc":"121.671875 35", "group":-57}, -{"category":"Comment", "text":"Cycle Entry 2", "key":-61, "loc":"84.671875 -2", "group":-57}, -{"category":"Comment", "text":"Cycle Entry 1", "key":-62, "loc":"-457.328125 -1", "group":-57}, -{"category":"Comment", "text":"Cycle End ", "key":-63, "loc":"-491.328125 286", "group":-57}, -{"category":"Comment", "text":"Cycle End ", "key":-64, "loc":"242.671875 325", "group":-46}, -{"category":"Comment", "text":"Cycle Entry", "key":-65, "loc":"461.671875 356", "group":-46} - ], - "linkDataArray": [ -{"from":-15, "to":-54, "fromPort":"T", "toPort":"B", "points":[-355.0000000000002,78.56227569580095,-355.0000000000002,68.56227569580095,-355.0000000000002,45.000000000000085,-337.328125,45.000000000000085,-337.328125,21.43772430419923,-337.328125,11.437724304199229]}, -{"from":-18, "to":-36, "fromPort":"L", "toPort":"B", "points":[-362.7963333129884,457,-372.7963333129884,457,-444.328125,457,-444.328125,455.71886215209963,-444.328125,454.4377243041992,-444.328125,444.4377243041992]}, -{"from":-60, "to":-21, "fromPort":"R", "toPort":"T", "points":[163.17472076416016,35,173.17472076416016,35,245.9999999999999,35,245.9999999999999,124.78113784790047,245.9999999999999,214.56227569580093,245.9999999999999,224.56227569580093]}, -{"from":-23, "to":-47, "fromPort":"T", "toPort":"B", "points":[-167.00000000000017,507.56227569580074,-167.00000000000017,497.56227569580074,-167.00000000000017,472.5,-167.328125,472.5,-167.328125,447.4377243041992,-167.328125,437.4377243041992]}, -{"from":-25, "to":-49, "fromPort":"R", "toPort":"L", "points":[137.79776763916033,420.0000000000003,147.79776763916033,420.0000000000003,147.79776763916033,419.0000000000001,145.7803192138671,419.0000000000001,145.7803192138671,417.9999999999999,155.7803192138671,417.9999999999999]}, -{"from":-26, "to":-50, "fromPort":"R", "toPort":"L", "points":[165.75912475586,353.9999999999999,175.75912475586,353.9999999999999,178,353.9999999999999,178,356.00000000000006,244.84688949584944,356.00000000000006,254.84688949584944,356.00000000000006]}, -{"from":-22, "to":-42, "fromPort":"B", "toPort":"T", "points":[374.9999999999999,50.43772430419914,374.9999999999999,60.43772430419914,374.9999999999999,141.99999999999997,375.671875,141.99999999999997,375.671875,223.5622756958008,375.671875,233.5622756958008]}, -{"from":-6, "to":-15, "fromPort":"T", "toPort":"B", "visible":true, "points":[-373,177.74910278320306,-373,167.74910278320306,-373,144.59341354370122,-355.0000000000002,144.59341354370122,-355.0000000000002,121.43772430419938,-355.0000000000002,111.43772430419938]}, -{"from":-6, "to":-12, "fromPort":"R", "toPort":"L", "visible":true, "points":[-296.7820587158203,213.99999999999994,-286.7820587158203,213.99999999999994,-275.64245223999023,213.99999999999994,-275.64245223999023,112.00000000000013,-264.50284576416016,112.00000000000013,-254.50284576416016,112.00000000000013], "text":"No"}, -{"from":-56, "to":-25, "fromPort":"B", "toPort":"T", "points":[102.671875,252.4377243041992,102.671875,262.4377243041992,102.671875,328.0000000000001,102.00000000000023,328.0000000000001,102.00000000000023,393.5622756958011,102.00000000000023,403.5622756958011]}, -{"from":-16, "to":-35, "fromPort":"L", "toPort":"R", "points":[-58.83570861816406,222.9999999999999,-68.83570861816406,222.9999999999999,-79.37219047546387,222.9999999999999,-79.37219047546387,222.9999999999998,-89.90867233276367,222.9999999999998,-99.90867233276367,222.9999999999998]}, -{"from":-35, "to":-24, "fromPort":"B", "toPort":"T", "points":[-160.328125,247.37544860839824,-160.328125,257.37544860839824,-160.328125,260,-93,260,-93,365.56227569580113,-93,375.56227569580113]}, -{"from":-36, "to":-17, "fromPort":"T", "toPort":"L", "points":[-444.328125,411.5622756958008,-444.328125,401.5622756958008,-444.328125,372.99999999999983,-416.7862854003905,372.99999999999983,-389.2444458007811,372.99999999999983,-379.2444458007811,372.99999999999983]}, -{"from":-19, "to":-37, "fromPort":"L", "toPort":"B", "points":[-370.43267822265625,563.9999999999999,-380.43267822265625,563.9999999999999,-440.328125,563.9999999999999,-440.328125,557.7188621520995,-440.328125,551.4377243041992,-440.328125,541.4377243041992]}, -{"from":-37, "to":-18, "fromPort":"R", "toPort":"B", "points":[-409.9686107635498,525,-399.9686107635498,525,-316.0000000000001,525,-316.0000000000001,508.18772430419926,-316.0000000000001,491.37544860839853,-316.0000000000001,481.3754486083985]}, -{"from":-12, "to":-38, "fromPort":"R", "toPort":"L", "points":[-171.49715423583984,112.00000000000013,-161.49715423583984,112.00000000000013,-144.59239673614502,112.00000000000013,-144.59239673614502,112.00000000000001,-127.6876392364502,112.00000000000001,-117.6876392364502,112.00000000000001]}, -{"from":-38, "to":-16, "fromPort":"R", "toPort":"T", "points":[-56.968610763549805,112.00000000000001,-46.968610763549805,112.00000000000001,-32,112.00000000000001,-32,154.28113784790034,-32,196.56227569580068,-32,206.56227569580068]}, -{"from":-16, "to":-39, "fromPort":"R", "toPort":"B", "points":[-5.1642913818359375,222.9999999999999,4.8357086181640625,222.9999999999999,24.671875,222.9999999999999,24.671875,182.21886215209958,24.671875,141.43772430419924,24.671875,131.43772430419924]}, -{"from":-39, "to":-20, "fromPort":"R", "toPort":"T", "points":[55.031389236450195,115.00000000000001,65.0313892364502,115.00000000000001,95,115.00000000000001,95,134.28113784790045,95,153.5622756958009,95,163.5622756958009]}, -{"from":-20, "to":-40, "fromPort":"R", "toPort":"B", "points":[127.5300521850586,180.0000000000001,137.5300521850586,180.0000000000001,159.671875,180.0000000000001,159.671875,162.7188621520997,159.671875,145.43772430419924,159.671875,135.43772430419924]}, -{"from":-40, "to":-21, "fromPort":"R", "toPort":"L", "points":[190.0313892364502,119.00000000000001,200.0313892364502,119.00000000000001,200.11681079864496,119.00000000000001,200.11681079864496,241.00000000000014,200.20223236083973,241.00000000000014,210.20223236083973,241.00000000000014]}, -{"from":-21, "to":-41, "fromPort":"R", "toPort":"B", "points":[281.79776763916004,241.00000000000014,291.79776763916004,241.00000000000014,292.671875,241.00000000000014,292.671875,150.7188621520997,292.671875,60.43772430419923,292.671875,50.43772430419923]}, -{"from":-41, "to":-22, "fromPort":"R", "toPort":"L", "points":[323.0313892364502,34.000000000000014,333.0313892364502,34.000000000000014,337.63613224029535,34.000000000000014,337.63613224029535,33.99999999999993,342.2408752441405,33.99999999999993,352.2408752441405,33.99999999999993]}, -{"from":-2, "to":-53, "fromPort":"L", "toPort":"R", "points":[214.27639007568365,521.9999999999998,204.27639007568365,521.9999999999998,197.84099197387698,521.9999999999998,197.84099197387698,523.0000000000001,191.4055938720703,523.0000000000001,181.4055938720703,523.0000000000001]}, -{"from":-32, "to":-44, "fromPort":"L", "toPort":"R", "points":[15.859012603759766,524.4822916666668,5.859012603759766,524.4822916666668,-1.7508373260498047,524.4822916666668,-1.7508373260498047,525,-9.360687255859375,525,-19.360687255859375,525]}, -{"from":-28, "to":-45, "fromPort":"B", "toPort":"T", "points":[381.9999999999999,490.4377243041992,381.9999999999999,500.4377243041992,381.9999999999999,504,381.671875,504,381.671875,507.56227569580074,381.671875,517.5622756958007]}, -{"from":-45, "to":-2, "fromPort":"L", "toPort":"R", "points":[344.69101905822754,534,334.69101905822754,534,325.879189491272,534,325.879189491272,522,317.0673599243164,522,307.0673599243164,522]}, -{"from":-44, "to":-23, "fromPort":"L", "toPort":"R", "points":[-93.29556274414062,525,-103.29556274414062,525,-118.36735534667977,525,-118.36735534667977,524,-133.43914794921892,524,-143.43914794921892,524]}, -{"from":-45, "to":-19, "fromPort":"B", "toPort":"R", "points":[381.671875,550.4377243041992,381.671875,560.4377243041992,381.671875,572,381.671875,572,381.671875,580,-212,580,-212,563.9999999999999,-219.56732177734375,563.9999999999999,-229.56732177734375,563.9999999999999]}, -{"from":-47, "to":-24, "fromPort":"T", "toPort":"L", "points":[-167.328125,404.5622756958008,-167.328125,394.5622756958008,-167.328125,392.00000000000034,-150.4144172668457,392.00000000000034,-133.5007095336914,392.00000000000034,-123.5007095336914,392.00000000000034]}, -{"from":-48, "to":-25, "fromPort":"R", "toPort":"L", "points":[44.93762588500975,420.0000000000001,54.93762588500975,420.0000000000001,55.56992912292489,420.0000000000001,55.56992912292489,420.0000000000003,56.202232360840014,420.0000000000003,66.20223236084001,420.0000000000003]}, -{"from":-49, "to":-26, "fromPort":"T", "toPort":"B", "points":[215.67187499999991,401.5622756958007,215.67187499999991,391.5622756958007,215.67187499999991,385.9999999999999,143.00000000000063,385.9999999999999,143.00000000000063,380.4377243041991,143.00000000000063,370.4377243041991]}, -{"from":-51, "to":-28, "fromPort":"B", "toPort":"T", "points":[381.671875,429.4377243041992,381.671875,439.4377243041992,381.671875,443.5,381.9999999999999,443.5,381.9999999999999,447.5622756958008,381.9999999999999,457.5622756958008]}, -{"from":-42, "to":-52, "fromPort":"B", "toPort":"T", "points":[375.671875,266.4377243041992,375.671875,276.4377243041992,375.671875,304,381.671875,304,381.671875,331.5622756958008,381.671875,341.5622756958008]}, -{"from":-52, "to":-51, "fromPort":"B", "toPort":"T", "points":[381.671875,374.4377243041992,381.671875,384.4377243041992,381.671875,385.5,381.671875,385.5,381.671875,386.5622756958008,381.671875,396.5622756958008]}, -{"from":-53, "to":-32, "fromPort":"L", "toPort":"R", "points":[133.9381561279297,523.0000000000001,123.93815612792969,523.0000000000001,120.05569648742676,523.0000000000001,120.05569648742676,524.4822916666666,116.17323684692384,524.4822916666666,106.17323684692384,524.4822916666666]}, -{"from":-54, "to":-29, "fromPort":"R", "toPort":"L", "points":[-305.95750617980957,-4.999999999999989,-295.95750617980957,-4.999999999999989,-134.04723086180513,-4.999999999999989,-134.04723086180513,-103.99999999999999,27.863044456199333,-103.99999999999999,37.86304445619933,-103.99999999999999]}, -{"from":-24, "to":-48, "fromPort":"R", "toPort":"T", "points":[-62.499290466308594,392.00000000000034,-52.499290466308594,392.00000000000034,-8.328125000000014,392.00000000000034,-8.328125000000014,392.7811378479006,-8.328125000000014,393.5622756958009,-8.328125000000014,403.5622756958009]}, -{"from":-17, "to":-3, "fromPort":"T", "toPort":"R", "points":[-329.99999999999983,356.5622756958006,-329.99999999999983,346.5622756958006,-329.99999999999983,331,-395.2437858581542,331,-460.4875717163086,331,-470.4875717163086,331]}, -{"from":-58, "to":-59, "fromPort":"B", "toPort":"L", "points":[-524.328125,60.43772430419922,-524.328125,70.43772430419922,-524.328125,147,-518.5535154342651,147,-512.7789058685303,147,-502.7789058685303,147]}, -{"from":-59, "to":-6, "fromPort":"B", "toPort":"L", "points":[-467.328125,163.43772430419924,-467.328125,173.43772430419924,-467.328125,213.99999999999994,-463.27303314208984,213.99999999999994,-459.2179412841797,213.99999999999994,-449.2179412841797,213.99999999999994]}, -{"from":-55, "to":-58, "fromPort":"L", "toPort":"T", "points":[-369.1083450317383,-123.99999999999999,-379.1083450317383,-123.99999999999999,-380,-123.99999999999999,-380,-123.99999999999999,-524.328125,-123.99999999999999,-524.328125,17.562275695800782,-524.328125,27.562275695800782]}, -{"from":-1, "to":-55, "fromPort":"B", "toPort":"T", "points":[-314.328125,-173,-314.328125,-163,-314.328125,-156.7188621520996,-315.328125,-156.7188621520996,-315.328125,-150.4377243041992,-315.328125,-140.4377243041992]} - ]} + "nodeDataArray": [ + { + "category": "Comment", + "loc": "315.0000000000002 -102", + "text": "Continuum Imaging Pipeline", + "key": -13, + "clean_para": "eeww" + }, + { + "category": "Branch", + "text": "Self-Cal\nConverge?", + "key": -6, + "loc": "-372.99999999999994 214", + "group": -57 + }, + { + "category": "Component", + "text": "Update GSM", + "key": -15, + "loc": "-355.00000000000006 95.00000000000018", + "group": -57 + }, + { + "category": "Component", + "text": "Update LSM", + "key": -17, + "loc": "-329.9999999999997 372.99999999999983", + "group": -57 + }, + { + "category": "Component", + "text": "Cal. Source\nFinding", + "key": -18, + "loc": "-316 457.00000000000006", + "group": -57 + }, + { + "category": "Component", + "text": "Image Plane\nSpectral Averaging", + "key": -19, + "loc": "-300.0000000000001 564.0000000000001", + "group": -57 + }, + { + "category": "Component", + "text": "Predict 01", + "key": -12, + "loc": "-213 112.00000000000011", + "group": -57 + }, + { + "category": "Component", + "text": "Solve", + "key": -16, + "loc": "-32 222.99999999999997", + "group": -57 + }, + { + "category": "Component", + "text": "Correct", + "key": -20, + "loc": "95.00000000000003 180.00000000000009", + "group": -57 + }, + { + "category": "Component", + "text": "Subtract", + "key": -21, + "loc": "245.9999999999999 241.0000000000001", + "group": -57 + }, + { + "category": "Component", + "text": "Flag", + "key": -22, + "loc": "375.0000000000001 34", + "group": -57 + }, + { + "category": "Component", + "text": "iFFT", + "key": -23, + "loc": "-167.00000000000023 523.9999999999999", + "group": -46 + }, + { + "category": "Component", + "text": "deGrid", + "key": -24, + "loc": "-93.00000000000001 392.00000000000006", + "group": -46 + }, + { + "category": "Component", + "text": "Subtract", + "key": -25, + "loc": "102.00000000000023 420.0000000000003", + "group": -46 + }, + { + "category": "Component", + "text": "Flag", + "key": -26, + "loc": "143.00000000000065 353.99999999999955", + "group": -46 + }, + { + "category": "Component", + "text": "FFT", + "key": -28, + "loc": "381.9999999999999 473.99999999999983", + "group": -46 + }, + { + "category": "Component", + "text": "Subtract \ncompnt frm\nimg plane", + "key": -32, + "loc": "61.01612472534181 524.4822916666666", + "group": -43 + }, + { + "category": "End", + "text": "End", + "key": -29, + "loc": "63.999999999999915 -103.99999999999999" + }, + { + "category": "memory", + "text": "Calibration\nParameters", + "data_volume": 5, + "key": -35, + "loc": "-160.32812500000006 222.9999999999999", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -36, + "loc": "-444.3281249999999 428.0000000000001", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -37, + "loc": "-440.32812500000006 525.0000000000002", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -38, + "loc": "-87.328125 111.99999999999994", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -39, + "loc": "24.671874999999986 115", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -40, + "loc": "159.67187500000003 118.99999999999997", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -41, + "loc": "292.6718749999999 34.000000000000085", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -42, + "loc": "375.67187499999994 250", + "group": -57 + }, + { + "category": "Loop", + "text": "Minor Cycle", + "isGroup": true, + "num_of_iter": 3, + "key": -43, + "loc": "106.88589859008792 524.4822916666666", + "group": -46 + }, + { + "category": "Component", + "text": "Identify\nComponent", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "260.67187500000006 521.9999999999998", + "group": -43 + }, + { + "category": "memory", + "text": "Model", + "data_volume": 5, + "group_end": 1, + "key": -44, + "loc": "-56.32812500000003 524.9999999999999", + "group": -43 + }, + { + "category": "memory", + "text": "Image", + "data_volume": 5, + "group_end": 1, + "key": -45, + "loc": "381.67187500000006 533.9999999999998", + "group": -46 + }, + { + "category": "Loop", + "text": "Major Cycle", + "isGroup": true, + "num_of_iter": 2, + "key": -46, + "loc": "155.19133663177493 434.53887812296546", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -47, + "loc": "-167.32812499999997 420.9999999999998", + "group": -46 + }, + { + "category": "memory", + "text": "Model Vis", + "data_volume": 5, + "group_end": 0, + "key": -48, + "loc": "-8.328125000000014 420.0000000000001", + "group": -46 + }, + { + "category": "memory", + "text": "Residul Vis", + "data_volume": 5, + "group_end": 0, + "key": -49, + "loc": "215.67187499999991 417.9999999999999", + "group": -46 + }, + { + "category": "memory", + "text": "FRV", + "data_volume": 5, + "group_end": 1, + "key": -50, + "loc": "283.67187499999983 356.00000000000006", + "group": -46 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -51, + "loc": "381.671875 413.00000000000006", + "group": -46 + }, + { + "category": "Component", + "text": "Grid", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -52, + "loc": "381.6718750000001 357.9999999999999", + "group": -46 + }, + { + "category": "memory", + "text": "CC", + "data_volume": 5, + "group_end": 0, + "key": -53, + "loc": "157.671875 523.0000000000001", + "group": -43 + }, + { + "category": "memory", + "text": "GSM", + "data_volume": 5, + "group_end": 0, + "key": -54, + "loc": "-337.32812500000017 -4.999999999999986", + "group": -57 + }, + { + "category": "memory", + "text": "Raw Vis", + "data_volume": 5, + "group_end": 0, + "key": -56, + "loc": "102.671875 236", + "group": -57 + }, + { + "category": "Loop", + "text": "Self-Cal Cycle", + "isGroup": true, + "num_of_iter": 2, + "key": -57, + "loc": "-29.341320037841797 283.46886215209963" + }, + { + "category": "memory", + "text": "LSM", + "data_volume": 5, + "group_end": 1, + "key": -3, + "loc": "-500.328125 331", + "group": -57 + }, + { + "category": "Component", + "text": "Check Conv", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -58, + "loc": "-524.328125 44", + "group": -57 + }, + { + "category": "memory", + "text": "result", + "data_volume": 5, + "group_end": 0, + "key": -59, + "loc": "-467.328125 147", + "group": -57 + }, + { + "category": "memory", + "text": "Start Data ", + "data_volume": 5, + "group_end": 0, + "key": -55, + "loc": "-315.328125 -124" + }, + { + "category": "Start", + "text": "Start", + "key": -1, + "loc": "-314.328125 -193" + }, + { + "category": "Component", + "text": "Predict 02", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -60, + "loc": "121.671875 35", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle Entry 2", + "key": -61, + "loc": "84.671875 -2", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle Entry 1", + "key": -62, + "loc": "-457.328125 -1", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle End ", + "key": -63, + "loc": "-491.328125 286", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle End ", + "key": -64, + "loc": "242.671875 325", + "group": -46 + }, + { + "category": "Comment", + "text": "Cycle Entry", + "key": -65, + "loc": "461.671875 356", + "group": -46 + } + ], + "linkDataArray": [ + { + "from": -15, + "to": -54, + "fromPort": "T", + "toPort": "B", + "points": [ + -355.0000000000002, + 78.56227569580095, + -355.0000000000002, + 68.56227569580095, + -355.0000000000002, + 45.000000000000085, + -337.328125, + 45.000000000000085, + -337.328125, + 21.43772430419923, + -337.328125, + 11.437724304199229 + ] + }, + { + "from": -18, + "to": -36, + "fromPort": "L", + "toPort": "B", + "points": [ + -362.7963333129884, + 457, + -372.7963333129884, + 457, + -444.328125, + 457, + -444.328125, + 455.71886215209963, + -444.328125, + 454.4377243041992, + -444.328125, + 444.4377243041992 + ] + }, + { + "from": -60, + "to": -21, + "fromPort": "R", + "toPort": "T", + "points": [ + 163.17472076416016, + 35, + 173.17472076416016, + 35, + 245.9999999999999, + 35, + 245.9999999999999, + 124.78113784790047, + 245.9999999999999, + 214.56227569580093, + 245.9999999999999, + 224.56227569580093 + ] + }, + { + "from": -23, + "to": -47, + "fromPort": "T", + "toPort": "B", + "points": [ + -167.00000000000017, + 507.56227569580074, + -167.00000000000017, + 497.56227569580074, + -167.00000000000017, + 472.5, + -167.328125, + 472.5, + -167.328125, + 447.4377243041992, + -167.328125, + 437.4377243041992 + ] + }, + { + "from": -25, + "to": -49, + "fromPort": "R", + "toPort": "L", + "points": [ + 137.79776763916033, + 420.0000000000003, + 147.79776763916033, + 420.0000000000003, + 147.79776763916033, + 419.0000000000001, + 145.7803192138671, + 419.0000000000001, + 145.7803192138671, + 417.9999999999999, + 155.7803192138671, + 417.9999999999999 + ] + }, + { + "from": -26, + "to": -50, + "fromPort": "R", + "toPort": "L", + "points": [ + 165.75912475586, + 353.9999999999999, + 175.75912475586, + 353.9999999999999, + 178, + 353.9999999999999, + 178, + 356.00000000000006, + 244.84688949584944, + 356.00000000000006, + 254.84688949584944, + 356.00000000000006 + ] + }, + { + "from": -22, + "to": -42, + "fromPort": "B", + "toPort": "T", + "points": [ + 374.9999999999999, + 50.43772430419914, + 374.9999999999999, + 60.43772430419914, + 374.9999999999999, + 141.99999999999997, + 375.671875, + 141.99999999999997, + 375.671875, + 223.5622756958008, + 375.671875, + 233.5622756958008 + ] + }, + { + "from": -6, + "to": -15, + "fromPort": "T", + "toPort": "B", + "visible": true, + "points": [ + -373, + 177.74910278320306, + -373, + 167.74910278320306, + -373, + 144.59341354370122, + -355.0000000000002, + 144.59341354370122, + -355.0000000000002, + 121.43772430419938, + -355.0000000000002, + 111.43772430419938 + ] + }, + { + "from": -6, + "to": -12, + "fromPort": "R", + "toPort": "L", + "visible": true, + "points": [ + -296.7820587158203, + 213.99999999999994, + -286.7820587158203, + 213.99999999999994, + -275.64245223999023, + 213.99999999999994, + -275.64245223999023, + 112.00000000000013, + -264.50284576416016, + 112.00000000000013, + -254.50284576416016, + 112.00000000000013 + ], + "text": "No" + }, + { + "from": -56, + "to": -25, + "fromPort": "B", + "toPort": "T", + "points": [ + 102.671875, + 252.4377243041992, + 102.671875, + 262.4377243041992, + 102.671875, + 328.0000000000001, + 102.00000000000023, + 328.0000000000001, + 102.00000000000023, + 393.5622756958011, + 102.00000000000023, + 403.5622756958011 + ] + }, + { + "from": -16, + "to": -35, + "fromPort": "L", + "toPort": "R", + "points": [ + -58.83570861816406, + 222.9999999999999, + -68.83570861816406, + 222.9999999999999, + -79.37219047546387, + 222.9999999999999, + -79.37219047546387, + 222.9999999999998, + -89.90867233276367, + 222.9999999999998, + -99.90867233276367, + 222.9999999999998 + ] + }, + { + "from": -35, + "to": -24, + "fromPort": "B", + "toPort": "T", + "points": [ + -160.328125, + 247.37544860839824, + -160.328125, + 257.37544860839824, + -160.328125, + 260, + -93, + 260, + -93, + 365.56227569580113, + -93, + 375.56227569580113 + ] + }, + { + "from": -36, + "to": -17, + "fromPort": "T", + "toPort": "L", + "points": [ + -444.328125, + 411.5622756958008, + -444.328125, + 401.5622756958008, + -444.328125, + 372.99999999999983, + -416.7862854003905, + 372.99999999999983, + -389.2444458007811, + 372.99999999999983, + -379.2444458007811, + 372.99999999999983 + ] + }, + { + "from": -19, + "to": -37, + "fromPort": "L", + "toPort": "B", + "points": [ + -370.43267822265625, + 563.9999999999999, + -380.43267822265625, + 563.9999999999999, + -440.328125, + 563.9999999999999, + -440.328125, + 557.7188621520995, + -440.328125, + 551.4377243041992, + -440.328125, + 541.4377243041992 + ] + }, + { + "from": -37, + "to": -18, + "fromPort": "R", + "toPort": "B", + "points": [ + -409.9686107635498, + 525, + -399.9686107635498, + 525, + -316.0000000000001, + 525, + -316.0000000000001, + 508.18772430419926, + -316.0000000000001, + 491.37544860839853, + -316.0000000000001, + 481.3754486083985 + ] + }, + { + "from": -12, + "to": -38, + "fromPort": "R", + "toPort": "L", + "points": [ + -171.49715423583984, + 112.00000000000013, + -161.49715423583984, + 112.00000000000013, + -144.59239673614502, + 112.00000000000013, + -144.59239673614502, + 112.00000000000001, + -127.6876392364502, + 112.00000000000001, + -117.6876392364502, + 112.00000000000001 + ] + }, + { + "from": -38, + "to": -16, + "fromPort": "R", + "toPort": "T", + "points": [ + -56.968610763549805, + 112.00000000000001, + -46.968610763549805, + 112.00000000000001, + -32, + 112.00000000000001, + -32, + 154.28113784790034, + -32, + 196.56227569580068, + -32, + 206.56227569580068 + ] + }, + { + "from": -16, + "to": -39, + "fromPort": "R", + "toPort": "B", + "points": [ + -5.1642913818359375, + 222.9999999999999, + 4.8357086181640625, + 222.9999999999999, + 24.671875, + 222.9999999999999, + 24.671875, + 182.21886215209958, + 24.671875, + 141.43772430419924, + 24.671875, + 131.43772430419924 + ] + }, + { + "from": -39, + "to": -20, + "fromPort": "R", + "toPort": "T", + "points": [ + 55.031389236450195, + 115.00000000000001, + 65.0313892364502, + 115.00000000000001, + 95, + 115.00000000000001, + 95, + 134.28113784790045, + 95, + 153.5622756958009, + 95, + 163.5622756958009 + ] + }, + { + "from": -20, + "to": -40, + "fromPort": "R", + "toPort": "B", + "points": [ + 127.5300521850586, + 180.0000000000001, + 137.5300521850586, + 180.0000000000001, + 159.671875, + 180.0000000000001, + 159.671875, + 162.7188621520997, + 159.671875, + 145.43772430419924, + 159.671875, + 135.43772430419924 + ] + }, + { + "from": -40, + "to": -21, + "fromPort": "R", + "toPort": "L", + "points": [ + 190.0313892364502, + 119.00000000000001, + 200.0313892364502, + 119.00000000000001, + 200.11681079864496, + 119.00000000000001, + 200.11681079864496, + 241.00000000000014, + 200.20223236083973, + 241.00000000000014, + 210.20223236083973, + 241.00000000000014 + ] + }, + { + "from": -21, + "to": -41, + "fromPort": "R", + "toPort": "B", + "points": [ + 281.79776763916004, + 241.00000000000014, + 291.79776763916004, + 241.00000000000014, + 292.671875, + 241.00000000000014, + 292.671875, + 150.7188621520997, + 292.671875, + 60.43772430419923, + 292.671875, + 50.43772430419923 + ] + }, + { + "from": -41, + "to": -22, + "fromPort": "R", + "toPort": "L", + "points": [ + 323.0313892364502, + 34.000000000000014, + 333.0313892364502, + 34.000000000000014, + 337.63613224029535, + 34.000000000000014, + 337.63613224029535, + 33.99999999999993, + 342.2408752441405, + 33.99999999999993, + 352.2408752441405, + 33.99999999999993 + ] + }, + { + "from": -2, + "to": -53, + "fromPort": "L", + "toPort": "R", + "points": [ + 214.27639007568365, + 521.9999999999998, + 204.27639007568365, + 521.9999999999998, + 197.84099197387698, + 521.9999999999998, + 197.84099197387698, + 523.0000000000001, + 191.4055938720703, + 523.0000000000001, + 181.4055938720703, + 523.0000000000001 + ] + }, + { + "from": -32, + "to": -44, + "fromPort": "L", + "toPort": "R", + "points": [ + 15.859012603759766, + 524.4822916666668, + 5.859012603759766, + 524.4822916666668, + -1.7508373260498047, + 524.4822916666668, + -1.7508373260498047, + 525, + -9.360687255859375, + 525, + -19.360687255859375, + 525 + ] + }, + { + "from": -28, + "to": -45, + "fromPort": "B", + "toPort": "T", + "points": [ + 381.9999999999999, + 490.4377243041992, + 381.9999999999999, + 500.4377243041992, + 381.9999999999999, + 504, + 381.671875, + 504, + 381.671875, + 507.56227569580074, + 381.671875, + 517.5622756958007 + ] + }, + { + "from": -45, + "to": -2, + "fromPort": "L", + "toPort": "R", + "points": [ + 344.69101905822754, + 534, + 334.69101905822754, + 534, + 325.879189491272, + 534, + 325.879189491272, + 522, + 317.0673599243164, + 522, + 307.0673599243164, + 522 + ] + }, + { + "from": -44, + "to": -23, + "fromPort": "L", + "toPort": "R", + "points": [ + -93.29556274414062, + 525, + -103.29556274414062, + 525, + -118.36735534667977, + 525, + -118.36735534667977, + 524, + -133.43914794921892, + 524, + -143.43914794921892, + 524 + ] + }, + { + "from": -45, + "to": -19, + "fromPort": "B", + "toPort": "R", + "points": [ + 381.671875, + 550.4377243041992, + 381.671875, + 560.4377243041992, + 381.671875, + 572, + 381.671875, + 572, + 381.671875, + 580, + -212, + 580, + -212, + 563.9999999999999, + -219.56732177734375, + 563.9999999999999, + -229.56732177734375, + 563.9999999999999 + ] + }, + { + "from": -47, + "to": -24, + "fromPort": "T", + "toPort": "L", + "points": [ + -167.328125, + 404.5622756958008, + -167.328125, + 394.5622756958008, + -167.328125, + 392.00000000000034, + -150.4144172668457, + 392.00000000000034, + -133.5007095336914, + 392.00000000000034, + -123.5007095336914, + 392.00000000000034 + ] + }, + { + "from": -48, + "to": -25, + "fromPort": "R", + "toPort": "L", + "points": [ + 44.93762588500975, + 420.0000000000001, + 54.93762588500975, + 420.0000000000001, + 55.56992912292489, + 420.0000000000001, + 55.56992912292489, + 420.0000000000003, + 56.202232360840014, + 420.0000000000003, + 66.20223236084001, + 420.0000000000003 + ] + }, + { + "from": -49, + "to": -26, + "fromPort": "T", + "toPort": "B", + "points": [ + 215.67187499999991, + 401.5622756958007, + 215.67187499999991, + 391.5622756958007, + 215.67187499999991, + 385.9999999999999, + 143.00000000000063, + 385.9999999999999, + 143.00000000000063, + 380.4377243041991, + 143.00000000000063, + 370.4377243041991 + ] + }, + { + "from": -51, + "to": -28, + "fromPort": "B", + "toPort": "T", + "points": [ + 381.671875, + 429.4377243041992, + 381.671875, + 439.4377243041992, + 381.671875, + 443.5, + 381.9999999999999, + 443.5, + 381.9999999999999, + 447.5622756958008, + 381.9999999999999, + 457.5622756958008 + ] + }, + { + "from": -42, + "to": -52, + "fromPort": "B", + "toPort": "T", + "points": [ + 375.671875, + 266.4377243041992, + 375.671875, + 276.4377243041992, + 375.671875, + 304, + 381.671875, + 304, + 381.671875, + 331.5622756958008, + 381.671875, + 341.5622756958008 + ] + }, + { + "from": -52, + "to": -51, + "fromPort": "B", + "toPort": "T", + "points": [ + 381.671875, + 374.4377243041992, + 381.671875, + 384.4377243041992, + 381.671875, + 385.5, + 381.671875, + 385.5, + 381.671875, + 386.5622756958008, + 381.671875, + 396.5622756958008 + ] + }, + { + "from": -53, + "to": -32, + "fromPort": "L", + "toPort": "R", + "points": [ + 133.9381561279297, + 523.0000000000001, + 123.93815612792969, + 523.0000000000001, + 120.05569648742676, + 523.0000000000001, + 120.05569648742676, + 524.4822916666666, + 116.17323684692384, + 524.4822916666666, + 106.17323684692384, + 524.4822916666666 + ] + }, + { + "from": -54, + "to": -29, + "fromPort": "R", + "toPort": "L", + "points": [ + -305.95750617980957, + -4.999999999999989, + -295.95750617980957, + -4.999999999999989, + -134.04723086180513, + -4.999999999999989, + -134.04723086180513, + -103.99999999999999, + 27.863044456199333, + -103.99999999999999, + 37.86304445619933, + -103.99999999999999 + ] + }, + { + "from": -24, + "to": -48, + "fromPort": "R", + "toPort": "T", + "points": [ + -62.499290466308594, + 392.00000000000034, + -52.499290466308594, + 392.00000000000034, + -8.328125000000014, + 392.00000000000034, + -8.328125000000014, + 392.7811378479006, + -8.328125000000014, + 393.5622756958009, + -8.328125000000014, + 403.5622756958009 + ] + }, + { + "from": -17, + "to": -3, + "fromPort": "T", + "toPort": "R", + "points": [ + -329.99999999999983, + 356.5622756958006, + -329.99999999999983, + 346.5622756958006, + -329.99999999999983, + 331, + -395.2437858581542, + 331, + -460.4875717163086, + 331, + -470.4875717163086, + 331 + ] + }, + { + "from": -58, + "to": -59, + "fromPort": "B", + "toPort": "L", + "points": [ + -524.328125, + 60.43772430419922, + -524.328125, + 70.43772430419922, + -524.328125, + 147, + -518.5535154342651, + 147, + -512.7789058685303, + 147, + -502.7789058685303, + 147 + ] + }, + { + "from": -59, + "to": -6, + "fromPort": "B", + "toPort": "L", + "points": [ + -467.328125, + 163.43772430419924, + -467.328125, + 173.43772430419924, + -467.328125, + 213.99999999999994, + -463.27303314208984, + 213.99999999999994, + -459.2179412841797, + 213.99999999999994, + -449.2179412841797, + 213.99999999999994 + ] + }, + { + "from": -55, + "to": -58, + "fromPort": "L", + "toPort": "T", + "points": [ + -369.1083450317383, + -123.99999999999999, + -379.1083450317383, + -123.99999999999999, + -380, + -123.99999999999999, + -380, + -123.99999999999999, + -524.328125, + -123.99999999999999, + -524.328125, + 17.562275695800782, + -524.328125, + 27.562275695800782 + ] + }, + { + "from": -1, + "to": -55, + "fromPort": "B", + "toPort": "T", + "points": [ + -314.328125, + -173, + -314.328125, + -163, + -314.328125, + -156.7188621520996, + -315.328125, + -156.7188621520996, + -315.328125, + -150.4377243041992, + -315.328125, + -140.4377243041992 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json index 1dbd129fa..063b957a4 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json +++ b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json @@ -1 +1,1160 @@ -{"copiesArrayObjects": true, "linkToPortIdProperty": "toPort", "linkFromPortIdProperty": "fromPort", "linkDataArray": [{"toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", "points": [224.375, 309, 224.375, 319, 224.375, 319, 236, 319, 236, 374.399609375, 232.203125, 374.399609375, 242.203125, 374.399609375], "from": -20, "to": -4}, {"toPort": "input_string", "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", "points": [426.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 428, 332, 428, 332, 529.399609375, 329.203125, 529.399609375, 339.203125, 529.399609375], "from": -4, "to": -22}, {"toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 532, 529.399609375, 532, 529.399609375, 548, 529.399609375, 548, 476, 468, 476, 468, 397.899609375, 469.703125, 397.899609375, 479.703125, 397.899609375], "from": -22, "to": -7}, {"toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 580, 484, 580, 484, 646.899609375, 481.703125, 646.899609375, 491.703125, 646.899609375], "from": -22, "to": -8}, {"toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", "fromPort": "output_string", "points": [154.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 124, 36, 124, 36, 192.899609375, 35.703125, 192.899609375, 45.703125, 192.899609375], "from": -5, "to": -6}, {"toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", "points": [230.390625, 192.899609375, 240.390625, 192.899609375, 244, 192.899609375, 244, 192.899609375, 260, 192.899609375, 260, 140, 20, 140, 20, 266, 165.859375, 266, 175.859375, 266], "from": -6, "to": -20}, {"toPort": "6539b8fc-633b-4431-9149-8625ca6cde6a", "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", "points": [1139.069722498308, 132, 1149.069722498308, 132, 1149.069722498308, 194.1998046875, 1103.703125, 194.1998046875, 1103.703125, 256.399609375, 1113.703125, 256.399609375], "from": -23, "to": -12}, {"toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", "fromPort": "34d5dd7a-3f90-4309-b7fc-120b47dd053d", "points": [1298.390625, 256.399609375, 1308.390625, 256.399609375, 1308.390625, 358.6998046875, 1118.203125, 358.6998046875, 1118.203125, 459.399609375, 1128.203125, 459.399609375], "from": -12, "to": -11}, {"toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", "to": -23, "points": [664.390625, 397.899609375, 674.390625, 397.899609375, 676, 397.899609375, 676, 132, 764.859375, 132, 774.859375, 132], "from": -7, "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1"}, {"toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", "points": [823.375, 175, 823.375, 185, 823.375, 188, 823.375, 188, 823.375, 231.899609375, 823.703125, 231.899609375, 833.703125, 231.899609375], "from": -23, "to": -14}, {"toPort": "input_string", "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", "points": [1018.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 284, 828, 284, 828, 339.399609375, 827.203125, 339.399609375, 837.203125, 339.399609375], "from": -14, "to": -13}, {"toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", "fromPort": "output_string", "points": [1021.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 396, 828, 396, 828, 452.899609375, 828.703125, 452.899609375, 838.703125, 452.899609375], "from": -13, "to": -15}, {"toPort": "5599e2ee-707e-4337-b983-bd90005bc35b", "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034", "points": [1023.390625, 452.899609375, 1033.390625, 452.899609375, 1036, 452.899609375, 1036, 452.899609375, 1077.03125, 452.899609375, 1077.03125, 185, 1077.03125, 175], "from": -15, "to": -23}], "nodeDataArray": [{"category": "memory", "loc": "479.703125 373.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -7, "text": "image per freq", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10"}]}, {"category": "SplitData", "loc": "208.203125 292", "isData": false, "outputPorts": [{"IdText": "string", "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3"}], "outputLocalPorts": [{"IdText": "string", "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6"}], "text": "ms-transform", "colour": " #DDAD00", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 491, "class": "go.Size", "height": 398}, "inputLocalPorts": [{"IdText": "string", "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988"}], "isGroup": true, "key": -20, "fields": [{"text": "Number of copies", "name": "num_of_copies", "value": "4"}, {"text": "Scatter axis", "name": "scatter_axis", "value": "time"}], "categoryType": "GroupComponent", "type": "Scatter", "inputPorts": [{"IdText": "string", "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "mstransform.sh"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "BashShellApp", "loc": "339.203125 505", "group": -20, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -22, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "242.203125 350", "group": -20, "outputPorts": [{"IdText": "string", "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -4, "text": "buffer", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "111b3131-57a7-4023-ab14-ca67f6eec728"}]}, {"category": "memory", "loc": "491.703125 622.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -8, "text": "clean statistics", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "d5653abf-b12f-4d97-ac15-d26702b20748"}]}, {"category": "BashShellApp", "loc": "-29.796875 45", "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -5, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "file", "loc": "45.703125 168.5", "outputPorts": [{"IdText": "string", "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -6, "text": "MeasurementSet", "type": "File Drop", "inputPorts": [{"IdText": "string", "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2"}]}, {"category": "DataGather", "loc": "807.203125 158", "type": "Gather", "isData": false, "outputPorts": [{"IdText": "string", "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7"}], "outputLocalPorts": [{"IdText": "string", "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec"}], "text": "ImageConcat", "colour": " #D35400", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 285, "class": "go.Size", "height": 333}, "inputLocalPorts": [{"IdText": "string", "Id": "5599e2ee-707e-4337-b983-bd90005bc35b"}], "isGroup": true, "key": -23, "fields": [{"text": "Number of inputs", "name": "num_of_inputs", "value": "2"}, {"text": "Gather axis", "name": "gather_axis", "value": "frequency"}], "categoryType": "GroupComponent", "inputPorts": [{"IdText": "string", "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "imconcat"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "End", "loc": "1128.203125 435", "type": "End", "outputPorts": [], "isData": false, "fields": [], "colour": " #CB4335", "canHaveOutputs": false, "canHaveInputs": true, "isGroup": false, "key": -11, "text": "Enter label", "categoryType": "ControlComponent", "inputPorts": [{"IdText": "string", "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da"}]}, {"category": "file", "loc": "1113.703125 232", "type": "File Drop", "outputPorts": [{"IdText": "string", "Id": "34d5dd7a-3f90-4309-b7fc-120b47dd053d"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -12, "text": "Cube", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "6539b8fc-633b-4431-9149-8625ca6cde6a"}]}, {"category": "BashShellApp", "loc": "837.203125 315", "group": -23, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "type": "Shell App", "isGroup": false, "key": -13, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "833.703125 207.5", "type": "Memory Drop", "outputPorts": [{"IdText": "string", "Id": "6942fe35-99ae-4911-9e99-aead7b13de16"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -14, "text": "Enter label", "group": -23, "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411"}]}, {"category": "memory", "loc": "838.703125 428.5", "group": -23, "outputPorts": [{"IdText": "string", "Id": "69b3949c-536f-455d-acd0-eee91e24a034"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -15, "text": "Enter label", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d"}]}], "modelData": {"fileType": "graph"}, "class": "go.GraphLinksModel", "copiesArrays": true} \ No newline at end of file +{ + "copiesArrayObjects": true, + "linkToPortIdProperty": "toPort", + "linkFromPortIdProperty": "fromPort", + "linkDataArray": [ + { + "toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", + "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", + "points": [ + 224.375, + 309, + 224.375, + 319, + 224.375, + 319, + 236, + 319, + 236, + 374.399609375, + 232.203125, + 374.399609375, + 242.203125, + 374.399609375 + ], + "from": -20, + "to": -4 + }, + { + "toPort": "input_string", + "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", + "points": [ + 426.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 428, + 332, + 428, + 332, + 529.399609375, + 329.203125, + 529.399609375, + 339.203125, + 529.399609375 + ], + "from": -4, + "to": -22 + }, + { + "toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 532, + 529.399609375, + 532, + 529.399609375, + 548, + 529.399609375, + 548, + 476, + 468, + 476, + 468, + 397.899609375, + 469.703125, + 397.899609375, + 479.703125, + 397.899609375 + ], + "from": -22, + "to": -7 + }, + { + "toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 580, + 484, + 580, + 484, + 646.899609375, + 481.703125, + 646.899609375, + 491.703125, + 646.899609375 + ], + "from": -22, + "to": -8 + }, + { + "toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", + "fromPort": "output_string", + "points": [ + 154.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 124, + 36, + 124, + 36, + 192.899609375, + 35.703125, + 192.899609375, + 45.703125, + 192.899609375 + ], + "from": -5, + "to": -6 + }, + { + "toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", + "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", + "points": [ + 230.390625, + 192.899609375, + 240.390625, + 192.899609375, + 244, + 192.899609375, + 244, + 192.899609375, + 260, + 192.899609375, + 260, + 140, + 20, + 140, + 20, + 266, + 165.859375, + 266, + 175.859375, + 266 + ], + "from": -6, + "to": -20 + }, + { + "toPort": "6539b8fc-633b-4431-9149-8625ca6cde6a", + "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", + "points": [ + 1139.069722498308, + 132, + 1149.069722498308, + 132, + 1149.069722498308, + 194.1998046875, + 1103.703125, + 194.1998046875, + 1103.703125, + 256.399609375, + 1113.703125, + 256.399609375 + ], + "from": -23, + "to": -12 + }, + { + "toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", + "fromPort": "34d5dd7a-3f90-4309-b7fc-120b47dd053d", + "points": [ + 1298.390625, + 256.399609375, + 1308.390625, + 256.399609375, + 1308.390625, + 358.6998046875, + 1118.203125, + 358.6998046875, + 1118.203125, + 459.399609375, + 1128.203125, + 459.399609375 + ], + "from": -12, + "to": -11 + }, + { + "toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", + "to": -23, + "points": [ + 664.390625, + 397.899609375, + 674.390625, + 397.899609375, + 676, + 397.899609375, + 676, + 132, + 764.859375, + 132, + 774.859375, + 132 + ], + "from": -7, + "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1" + }, + { + "toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", + "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", + "points": [ + 823.375, + 175, + 823.375, + 185, + 823.375, + 188, + 823.375, + 188, + 823.375, + 231.899609375, + 823.703125, + 231.899609375, + 833.703125, + 231.899609375 + ], + "from": -23, + "to": -14 + }, + { + "toPort": "input_string", + "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", + "points": [ + 1018.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 284, + 828, + 284, + 828, + 339.399609375, + 827.203125, + 339.399609375, + 837.203125, + 339.399609375 + ], + "from": -14, + "to": -13 + }, + { + "toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", + "fromPort": "output_string", + "points": [ + 1021.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 396, + 828, + 396, + 828, + 452.899609375, + 828.703125, + 452.899609375, + 838.703125, + 452.899609375 + ], + "from": -13, + "to": -15 + }, + { + "toPort": "5599e2ee-707e-4337-b983-bd90005bc35b", + "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034", + "points": [ + 1023.390625, + 452.899609375, + 1033.390625, + 452.899609375, + 1036, + 452.899609375, + 1036, + 452.899609375, + 1077.03125, + 452.899609375, + 1077.03125, + 185, + 1077.03125, + 175 + ], + "from": -15, + "to": -23 + } + ], + "nodeDataArray": [ + { + "category": "memory", + "loc": "479.703125 373.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -7, + "text": "image per freq", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10" + } + ] + }, + { + "category": "SplitData", + "loc": "208.203125 292", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6" + } + ], + "text": "ms-transform", + "colour": " #DDAD00", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 491, + "class": "go.Size", + "height": 398 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988" + } + ], + "isGroup": true, + "key": -20, + "fields": [ + { + "text": "Number of copies", + "name": "num_of_copies", + "value": "4" + }, + { + "text": "Scatter axis", + "name": "scatter_axis", + "value": "time" + } + ], + "categoryType": "GroupComponent", + "type": "Scatter", + "inputPorts": [ + { + "IdText": "string", + "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "mstransform.sh" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "BashShellApp", + "loc": "339.203125 505", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -22, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "242.203125 350", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -4, + "text": "buffer", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "111b3131-57a7-4023-ab14-ca67f6eec728" + } + ] + }, + { + "category": "memory", + "loc": "491.703125 622.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -8, + "text": "clean statistics", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "d5653abf-b12f-4d97-ac15-d26702b20748" + } + ] + }, + { + "category": "BashShellApp", + "loc": "-29.796875 45", + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -5, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "file", + "loc": "45.703125 168.5", + "outputPorts": [ + { + "IdText": "string", + "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -6, + "text": "MeasurementSet", + "type": "File Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2" + } + ] + }, + { + "category": "DataGather", + "loc": "807.203125 158", + "type": "Gather", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec" + } + ], + "text": "ImageConcat", + "colour": " #D35400", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 285, + "class": "go.Size", + "height": 333 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "5599e2ee-707e-4337-b983-bd90005bc35b" + } + ], + "isGroup": true, + "key": -23, + "fields": [ + { + "text": "Number of inputs", + "name": "num_of_inputs", + "value": "2" + }, + { + "text": "Gather axis", + "name": "gather_axis", + "value": "frequency" + } + ], + "categoryType": "GroupComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "imconcat" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "End", + "loc": "1128.203125 435", + "type": "End", + "outputPorts": [], + "isData": false, + "fields": [], + "colour": " #CB4335", + "canHaveOutputs": false, + "canHaveInputs": true, + "isGroup": false, + "key": -11, + "text": "Enter label", + "categoryType": "ControlComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da" + } + ] + }, + { + "category": "file", + "loc": "1113.703125 232", + "type": "File Drop", + "outputPorts": [ + { + "IdText": "string", + "Id": "34d5dd7a-3f90-4309-b7fc-120b47dd053d" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -12, + "text": "Cube", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "6539b8fc-633b-4431-9149-8625ca6cde6a" + } + ] + }, + { + "category": "BashShellApp", + "loc": "837.203125 315", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "type": "Shell App", + "isGroup": false, + "key": -13, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "833.703125 207.5", + "type": "Memory Drop", + "outputPorts": [ + { + "IdText": "string", + "Id": "6942fe35-99ae-4911-9e99-aead7b13de16" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -14, + "text": "Enter label", + "group": -23, + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411" + } + ] + }, + { + "category": "memory", + "loc": "838.703125 428.5", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "69b3949c-536f-455d-acd0-eee91e24a034" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -15, + "text": "Enter label", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d" + } + ] + } + ], + "modelData": { + "fileType": "graph" + }, + "class": "go.GraphLinksModel", + "copiesArrays": true +} \ No newline at end of file diff --git a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json index a98e57ae4..8a5e43c97 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json +++ b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json @@ -1 +1,886 @@ -{"copiesArrayObjects": true, "linkToPortIdProperty": "toPort", "linkFromPortIdProperty": "fromPort", "linkDataArray": [{"toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", "points": [224.375, 309, 224.375, 319, 224.375, 319, 236, 319, 236, 374.399609375, 232.203125, 374.399609375, 242.203125, 374.399609375], "from": -20, "to": -4}, {"toPort": "input_string", "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", "points": [426.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 428, 332, 428, 332, 529.399609375, 329.203125, 529.399609375, 339.203125, 529.399609375], "from": -4, "to": -22}, {"toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 532, 529.399609375, 532, 529.399609375, 548, 529.399609375, 548, 476, 468, 476, 468, 397.899609375, 469.703125, 397.899609375, 479.703125, 397.899609375], "from": -22, "to": -7}, {"toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 580, 484, 580, 484, 646.899609375, 481.703125, 646.899609375, 491.703125, 646.899609375], "from": -22, "to": -8}, {"toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", "fromPort": "output_string", "points": [154.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 124, 36, 124, 36, 192.899609375, 35.703125, 192.899609375, 45.703125, 192.899609375], "from": -5, "to": -6}, {"toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", "points": [230.390625, 192.899609375, 240.390625, 192.899609375, 244, 192.899609375, 244, 192.899609375, 260, 192.899609375, 260, 140, 20, 140, 20, 266, 165.859375, 266, 175.859375, 266], "from": -6, "to": -20}, {"toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", "to": -23, "points": [664.390625, 397.899609375, 674.390625, 397.899609375, 676, 397.899609375, 676, 132, 764.859375, 132, 774.859375, 132], "from": -7, "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1"}, {"toPort": "e53d93aa-2141-4d1b-b126-c21d204e9989", "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", "points": [1054.0697224983078, 132, 1064.0697224983078, 132, 1064.0697224983078, 203.9498046875, 1009.703125, 203.9498046875, 1009.703125, 275.899609375, 1019.703125, 275.899609375], "from": -23, "to": -10}, {"toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", "fromPort": "61a22f9c-5232-409e-b54b-36d64e2c977e", "points": [1204.390625, 275.899609375, 1214.390625, 275.899609375, 1214.390625, 275.899609375, 1214.390625, 420, 1044, 420, 1044, 552.399609375, 1047.203125, 552.399609375, 1057.203125, 552.399609375], "from": -10, "to": -11}], "nodeDataArray": [{"category": "memory", "loc": "479.703125 373.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -7, "text": "image per freq", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10"}]}, {"category": "SplitData", "loc": "208.203125 292", "type": "Scatter", "isData": false, "outputPorts": [{"IdText": "string", "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3"}], "outputLocalPorts": [{"IdText": "string", "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6"}], "text": "ms-transform", "colour": " #DDAD00", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 491, "class": "go.Size", "height": 398}, "inputLocalPorts": [{"IdText": "string", "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988"}], "isGroup": true, "key": -20, "fields": [{"text": "Number of copies", "name": "num_of_copies", "value": "4"}, {"text": "Scatter axis", "name": "scatter_axis", "value": "time"}], "categoryType": "GroupComponent", "inputPorts": [{"IdText": "string", "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "mstransform.sh"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "BashShellApp", "loc": "339.203125 505", "group": -20, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "type": "Shell App", "isGroup": false, "key": -22, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "242.203125 350", "group": -20, "outputPorts": [{"IdText": "string", "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -4, "text": "buffer", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "111b3131-57a7-4023-ab14-ca67f6eec728"}]}, {"category": "memory", "loc": "491.703125 622.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -8, "text": "clean statistics", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "d5653abf-b12f-4d97-ac15-d26702b20748"}]}, {"category": "BashShellApp", "loc": "-29.796875 45", "type": "Shell App", "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "isGroup": false, "key": -5, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "file", "loc": "45.703125 168.5", "type": "File Drop", "outputPorts": [{"IdText": "string", "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -6, "text": "MeasurementSet", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2"}]}, {"category": "DataGather", "loc": "807.203125 158", "isData": false, "outputPorts": [{"IdText": "string", "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7"}], "outputLocalPorts": [{"IdText": "string", "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec"}], "text": "ImageConcat", "colour": " #D35400", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 200, "class": "go.Size", "height": 232}, "inputLocalPorts": [{"IdText": "string", "Id": "5599e2ee-707e-4337-b983-bd90005bc35b"}], "isGroup": true, "key": -23, "fields": [{"text": "Number of inputs", "name": "num_of_inputs", "value": "2"}, {"text": "Gather axis", "name": "gather_axis", "value": "frequency"}], "categoryType": "GroupComponent", "type": "Gather", "inputPorts": [{"IdText": "string", "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "imconcat"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "End", "loc": "1057.203125 528", "outputPorts": [], "isData": false, "fields": [], "colour": " #CB4335", "canHaveOutputs": false, "canHaveInputs": true, "categoryType": "ControlComponent", "isGroup": false, "key": -11, "text": "Enter label", "type": "End", "inputPorts": [{"IdText": "string", "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da"}]}, {"category": "memory", "loc": "1019.703125 251.5", "outputPorts": [{"IdText": "string", "Id": "61a22f9c-5232-409e-b54b-36d64e2c977e"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -10, "text": "Cube", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "e53d93aa-2141-4d1b-b126-c21d204e9989"}]}], "modelData": {"fileType": "graph"}, "class": "go.GraphLinksModel", "copiesArrays": true} \ No newline at end of file +{ + "copiesArrayObjects": true, + "linkToPortIdProperty": "toPort", + "linkFromPortIdProperty": "fromPort", + "linkDataArray": [ + { + "toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", + "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", + "points": [ + 224.375, + 309, + 224.375, + 319, + 224.375, + 319, + 236, + 319, + 236, + 374.399609375, + 232.203125, + 374.399609375, + 242.203125, + 374.399609375 + ], + "from": -20, + "to": -4 + }, + { + "toPort": "input_string", + "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", + "points": [ + 426.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 428, + 332, + 428, + 332, + 529.399609375, + 329.203125, + 529.399609375, + 339.203125, + 529.399609375 + ], + "from": -4, + "to": -22 + }, + { + "toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 532, + 529.399609375, + 532, + 529.399609375, + 548, + 529.399609375, + 548, + 476, + 468, + 476, + 468, + 397.899609375, + 469.703125, + 397.899609375, + 479.703125, + 397.899609375 + ], + "from": -22, + "to": -7 + }, + { + "toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 580, + 484, + 580, + 484, + 646.899609375, + 481.703125, + 646.899609375, + 491.703125, + 646.899609375 + ], + "from": -22, + "to": -8 + }, + { + "toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", + "fromPort": "output_string", + "points": [ + 154.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 124, + 36, + 124, + 36, + 192.899609375, + 35.703125, + 192.899609375, + 45.703125, + 192.899609375 + ], + "from": -5, + "to": -6 + }, + { + "toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", + "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", + "points": [ + 230.390625, + 192.899609375, + 240.390625, + 192.899609375, + 244, + 192.899609375, + 244, + 192.899609375, + 260, + 192.899609375, + 260, + 140, + 20, + 140, + 20, + 266, + 165.859375, + 266, + 175.859375, + 266 + ], + "from": -6, + "to": -20 + }, + { + "toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", + "to": -23, + "points": [ + 664.390625, + 397.899609375, + 674.390625, + 397.899609375, + 676, + 397.899609375, + 676, + 132, + 764.859375, + 132, + 774.859375, + 132 + ], + "from": -7, + "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1" + }, + { + "toPort": "e53d93aa-2141-4d1b-b126-c21d204e9989", + "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", + "points": [ + 1054.0697224983078, + 132, + 1064.0697224983078, + 132, + 1064.0697224983078, + 203.9498046875, + 1009.703125, + 203.9498046875, + 1009.703125, + 275.899609375, + 1019.703125, + 275.899609375 + ], + "from": -23, + "to": -10 + }, + { + "toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", + "fromPort": "61a22f9c-5232-409e-b54b-36d64e2c977e", + "points": [ + 1204.390625, + 275.899609375, + 1214.390625, + 275.899609375, + 1214.390625, + 275.899609375, + 1214.390625, + 420, + 1044, + 420, + 1044, + 552.399609375, + 1047.203125, + 552.399609375, + 1057.203125, + 552.399609375 + ], + "from": -10, + "to": -11 + } + ], + "nodeDataArray": [ + { + "category": "memory", + "loc": "479.703125 373.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -7, + "text": "image per freq", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10" + } + ] + }, + { + "category": "SplitData", + "loc": "208.203125 292", + "type": "Scatter", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6" + } + ], + "text": "ms-transform", + "colour": " #DDAD00", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 491, + "class": "go.Size", + "height": 398 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988" + } + ], + "isGroup": true, + "key": -20, + "fields": [ + { + "text": "Number of copies", + "name": "num_of_copies", + "value": "4" + }, + { + "text": "Scatter axis", + "name": "scatter_axis", + "value": "time" + } + ], + "categoryType": "GroupComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "mstransform.sh" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "BashShellApp", + "loc": "339.203125 505", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "type": "Shell App", + "isGroup": false, + "key": -22, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "242.203125 350", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -4, + "text": "buffer", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "111b3131-57a7-4023-ab14-ca67f6eec728" + } + ] + }, + { + "category": "memory", + "loc": "491.703125 622.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -8, + "text": "clean statistics", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "d5653abf-b12f-4d97-ac15-d26702b20748" + } + ] + }, + { + "category": "BashShellApp", + "loc": "-29.796875 45", + "type": "Shell App", + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "isGroup": false, + "key": -5, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "file", + "loc": "45.703125 168.5", + "type": "File Drop", + "outputPorts": [ + { + "IdText": "string", + "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -6, + "text": "MeasurementSet", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2" + } + ] + }, + { + "category": "DataGather", + "loc": "807.203125 158", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec" + } + ], + "text": "ImageConcat", + "colour": " #D35400", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 200, + "class": "go.Size", + "height": 232 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "5599e2ee-707e-4337-b983-bd90005bc35b" + } + ], + "isGroup": true, + "key": -23, + "fields": [ + { + "text": "Number of inputs", + "name": "num_of_inputs", + "value": "2" + }, + { + "text": "Gather axis", + "name": "gather_axis", + "value": "frequency" + } + ], + "categoryType": "GroupComponent", + "type": "Gather", + "inputPorts": [ + { + "IdText": "string", + "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "imconcat" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "End", + "loc": "1057.203125 528", + "outputPorts": [], + "isData": false, + "fields": [], + "colour": " #CB4335", + "canHaveOutputs": false, + "canHaveInputs": true, + "categoryType": "ControlComponent", + "isGroup": false, + "key": -11, + "text": "Enter label", + "type": "End", + "inputPorts": [ + { + "IdText": "string", + "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da" + } + ] + }, + { + "category": "memory", + "loc": "1019.703125 251.5", + "outputPorts": [ + { + "IdText": "string", + "Id": "61a22f9c-5232-409e-b54b-36d64e2c977e" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -10, + "text": "Cube", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "e53d93aa-2141-4d1b-b126-c21d204e9989" + } + ] + } + ], + "modelData": { + "fileType": "graph" + }, + "class": "go.GraphLinksModel", + "copiesArrays": true +} \ No newline at end of file diff --git a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json index 85a55de77..4a5ff4008 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json +++ b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json @@ -1 +1,1065 @@ -{"copiesArrayObjects": true, "linkToPortIdProperty": "toPort", "linkFromPortIdProperty": "fromPort", "linkDataArray": [{"toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", "points": [224.375, 309, 224.375, 319, 224.375, 319, 236, 319, 236, 374.399609375, 232.203125, 374.399609375, 242.203125, 374.399609375], "from": -20, "to": -4}, {"toPort": "input_string", "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", "points": [426.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 428, 332, 428, 332, 529.399609375, 329.203125, 529.399609375, 339.203125, 529.399609375], "from": -4, "to": -22}, {"toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 532, 529.399609375, 532, 529.399609375, 548, 529.399609375, 548, 476, 468, 476, 468, 397.899609375, 469.703125, 397.899609375, 479.703125, 397.899609375], "from": -22, "to": -7}, {"toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 580, 484, 580, 484, 646.899609375, 481.703125, 646.899609375, 491.703125, 646.899609375], "from": -22, "to": -8}, {"toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", "fromPort": "output_string", "points": [154.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 124, 36, 124, 36, 192.899609375, 35.703125, 192.899609375, 45.703125, 192.899609375], "from": -5, "to": -6}, {"toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", "points": [230.390625, 192.899609375, 240.390625, 192.899609375, 244, 192.899609375, 244, 192.899609375, 260, 192.899609375, 260, 140, 20, 140, 20, 266, 165.859375, 266, 175.859375, 266], "from": -6, "to": -20}, {"toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", "to": -23, "points": [664.390625, 397.899609375, 674.390625, 397.899609375, 676, 397.899609375, 676, 132, 764.859375, 132, 774.859375, 132], "from": -7, "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1"}, {"toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", "points": [823.375, 175, 823.375, 185, 823.375, 188, 823.375, 188, 823.375, 231.899609375, 823.703125, 231.899609375, 833.703125, 231.899609375], "from": -23, "to": -14}, {"toPort": "input_string", "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", "points": [1018.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 284, 828, 284, 828, 339.399609375, 827.203125, 339.399609375, 837.203125, 339.399609375], "from": -14, "to": -13}, {"toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", "fromPort": "output_string", "points": [1021.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 396, 828, 396, 828, 452.899609375, 828.703125, 452.899609375, 838.703125, 452.899609375], "from": -13, "to": -15}, {"toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", "to": -11, "points": [1023.390625, 452.899609375, 1033.390625, 452.899609375, 1036, 452.899609375, 1036, 459.399609375, 1118.203125, 459.399609375, 1128.203125, 459.399609375], "from": -15, "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034"}], "nodeDataArray": [{"category": "memory", "loc": "479.703125 373.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -7, "text": "image per freq", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10"}]}, {"category": "SplitData", "loc": "208.203125 292", "isData": false, "outputPorts": [{"IdText": "string", "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3"}], "outputLocalPorts": [{"IdText": "string", "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6"}], "text": "ms-transform", "colour": " #DDAD00", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 491, "class": "go.Size", "height": 398}, "inputLocalPorts": [{"IdText": "string", "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988"}], "isGroup": true, "key": -20, "fields": [{"text": "Number of copies", "name": "num_of_copies", "value": "4"}, {"text": "Scatter axis", "name": "scatter_axis", "value": "time"}], "categoryType": "GroupComponent", "type": "Scatter", "inputPorts": [{"IdText": "string", "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "mstransform.sh"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "BashShellApp", "loc": "339.203125 505", "group": -20, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -22, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "242.203125 350", "group": -20, "outputPorts": [{"IdText": "string", "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -4, "text": "buffer", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "111b3131-57a7-4023-ab14-ca67f6eec728"}]}, {"category": "memory", "loc": "491.703125 622.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -8, "text": "clean statistics", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "d5653abf-b12f-4d97-ac15-d26702b20748"}]}, {"category": "BashShellApp", "loc": "-29.796875 45", "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -5, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "file", "loc": "45.703125 168.5", "outputPorts": [{"IdText": "string", "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -6, "text": "MeasurementSet", "type": "File Drop", "inputPorts": [{"IdText": "string", "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2"}]}, {"category": "DataGather", "loc": "807.203125 158", "type": "Gather", "isData": false, "outputPorts": [{"IdText": "string", "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7"}], "outputLocalPorts": [{"IdText": "string", "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec"}], "text": "ImageConcat", "colour": " #D35400", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 285, "class": "go.Size", "height": 333}, "inputLocalPorts": [{"IdText": "string", "Id": "5599e2ee-707e-4337-b983-bd90005bc35b"}], "isGroup": true, "key": -23, "fields": [{"text": "Number of inputs", "name": "num_of_inputs", "value": "2"}, {"text": "Gather axis", "name": "gather_axis", "value": "frequency"}], "categoryType": "GroupComponent", "inputPorts": [{"IdText": "string", "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "imconcat"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "End", "loc": "1128.203125 435", "type": "End", "outputPorts": [], "isData": false, "fields": [], "colour": " #CB4335", "canHaveOutputs": false, "canHaveInputs": true, "isGroup": false, "key": -11, "text": "Enter label", "categoryType": "ControlComponent", "inputPorts": [{"IdText": "string", "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da"}]}, {"category": "BashShellApp", "loc": "837.203125 315", "group": -23, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "type": "Shell App", "isGroup": false, "key": -13, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "833.703125 207.5", "group": -23, "outputPorts": [{"IdText": "string", "Id": "6942fe35-99ae-4911-9e99-aead7b13de16"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -14, "text": "Enter label", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411"}]}, {"category": "memory", "loc": "838.703125 428.5", "group": -23, "outputPorts": [{"IdText": "string", "Id": "69b3949c-536f-455d-acd0-eee91e24a034"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -15, "text": "Enter label", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d"}]}], "modelData": {"fileType": "graph"}, "class": "go.GraphLinksModel", "copiesArrays": true} \ No newline at end of file +{ + "copiesArrayObjects": true, + "linkToPortIdProperty": "toPort", + "linkFromPortIdProperty": "fromPort", + "linkDataArray": [ + { + "toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", + "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", + "points": [ + 224.375, + 309, + 224.375, + 319, + 224.375, + 319, + 236, + 319, + 236, + 374.399609375, + 232.203125, + 374.399609375, + 242.203125, + 374.399609375 + ], + "from": -20, + "to": -4 + }, + { + "toPort": "input_string", + "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", + "points": [ + 426.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 428, + 332, + 428, + 332, + 529.399609375, + 329.203125, + 529.399609375, + 339.203125, + 529.399609375 + ], + "from": -4, + "to": -22 + }, + { + "toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 532, + 529.399609375, + 532, + 529.399609375, + 548, + 529.399609375, + 548, + 476, + 468, + 476, + 468, + 397.899609375, + 469.703125, + 397.899609375, + 479.703125, + 397.899609375 + ], + "from": -22, + "to": -7 + }, + { + "toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 580, + 484, + 580, + 484, + 646.899609375, + 481.703125, + 646.899609375, + 491.703125, + 646.899609375 + ], + "from": -22, + "to": -8 + }, + { + "toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", + "fromPort": "output_string", + "points": [ + 154.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 124, + 36, + 124, + 36, + 192.899609375, + 35.703125, + 192.899609375, + 45.703125, + 192.899609375 + ], + "from": -5, + "to": -6 + }, + { + "toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", + "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", + "points": [ + 230.390625, + 192.899609375, + 240.390625, + 192.899609375, + 244, + 192.899609375, + 244, + 192.899609375, + 260, + 192.899609375, + 260, + 140, + 20, + 140, + 20, + 266, + 165.859375, + 266, + 175.859375, + 266 + ], + "from": -6, + "to": -20 + }, + { + "toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", + "to": -23, + "points": [ + 664.390625, + 397.899609375, + 674.390625, + 397.899609375, + 676, + 397.899609375, + 676, + 132, + 764.859375, + 132, + 774.859375, + 132 + ], + "from": -7, + "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1" + }, + { + "toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", + "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", + "points": [ + 823.375, + 175, + 823.375, + 185, + 823.375, + 188, + 823.375, + 188, + 823.375, + 231.899609375, + 823.703125, + 231.899609375, + 833.703125, + 231.899609375 + ], + "from": -23, + "to": -14 + }, + { + "toPort": "input_string", + "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", + "points": [ + 1018.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 284, + 828, + 284, + 828, + 339.399609375, + 827.203125, + 339.399609375, + 837.203125, + 339.399609375 + ], + "from": -14, + "to": -13 + }, + { + "toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", + "fromPort": "output_string", + "points": [ + 1021.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 396, + 828, + 396, + 828, + 452.899609375, + 828.703125, + 452.899609375, + 838.703125, + 452.899609375 + ], + "from": -13, + "to": -15 + }, + { + "toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", + "to": -11, + "points": [ + 1023.390625, + 452.899609375, + 1033.390625, + 452.899609375, + 1036, + 452.899609375, + 1036, + 459.399609375, + 1118.203125, + 459.399609375, + 1128.203125, + 459.399609375 + ], + "from": -15, + "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034" + } + ], + "nodeDataArray": [ + { + "category": "memory", + "loc": "479.703125 373.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -7, + "text": "image per freq", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10" + } + ] + }, + { + "category": "SplitData", + "loc": "208.203125 292", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6" + } + ], + "text": "ms-transform", + "colour": " #DDAD00", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 491, + "class": "go.Size", + "height": 398 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988" + } + ], + "isGroup": true, + "key": -20, + "fields": [ + { + "text": "Number of copies", + "name": "num_of_copies", + "value": "4" + }, + { + "text": "Scatter axis", + "name": "scatter_axis", + "value": "time" + } + ], + "categoryType": "GroupComponent", + "type": "Scatter", + "inputPorts": [ + { + "IdText": "string", + "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "mstransform.sh" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "BashShellApp", + "loc": "339.203125 505", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -22, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "242.203125 350", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -4, + "text": "buffer", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "111b3131-57a7-4023-ab14-ca67f6eec728" + } + ] + }, + { + "category": "memory", + "loc": "491.703125 622.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -8, + "text": "clean statistics", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "d5653abf-b12f-4d97-ac15-d26702b20748" + } + ] + }, + { + "category": "BashShellApp", + "loc": "-29.796875 45", + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -5, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "file", + "loc": "45.703125 168.5", + "outputPorts": [ + { + "IdText": "string", + "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -6, + "text": "MeasurementSet", + "type": "File Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2" + } + ] + }, + { + "category": "DataGather", + "loc": "807.203125 158", + "type": "Gather", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec" + } + ], + "text": "ImageConcat", + "colour": " #D35400", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 285, + "class": "go.Size", + "height": 333 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "5599e2ee-707e-4337-b983-bd90005bc35b" + } + ], + "isGroup": true, + "key": -23, + "fields": [ + { + "text": "Number of inputs", + "name": "num_of_inputs", + "value": "2" + }, + { + "text": "Gather axis", + "name": "gather_axis", + "value": "frequency" + } + ], + "categoryType": "GroupComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "imconcat" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "End", + "loc": "1128.203125 435", + "type": "End", + "outputPorts": [], + "isData": false, + "fields": [], + "colour": " #CB4335", + "canHaveOutputs": false, + "canHaveInputs": true, + "isGroup": false, + "key": -11, + "text": "Enter label", + "categoryType": "ControlComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da" + } + ] + }, + { + "category": "BashShellApp", + "loc": "837.203125 315", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "type": "Shell App", + "isGroup": false, + "key": -13, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "833.703125 207.5", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "6942fe35-99ae-4911-9e99-aead7b13de16" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -14, + "text": "Enter label", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411" + } + ] + }, + { + "category": "memory", + "loc": "838.703125 428.5", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "69b3949c-536f-455d-acd0-eee91e24a034" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -15, + "text": "Enter label", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d" + } + ] + } + ], + "modelData": { + "fileType": "graph" + }, + "class": "go.GraphLinksModel", + "copiesArrays": true +} \ No newline at end of file diff --git a/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json b/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json index 85e1dea79..ef5728ead 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json +++ b/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json @@ -1,78 +1,1180 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Comment", "loc":"471.00000000000017 -377.0000000000003", "text":"LOFAR Standard", "key":-13}, -{"category":"memory", "text":"Calibrator \nDB", "key":-22, "loc":"-546.2187499999995 -145.9999999999998"}, -{"category":"memory", "text":"GSM", "key":-5, "loc":"390.78125000000017 -185.00000000000028"}, -{"category":"Start", "text":"Start", "key":-1, "loc":"-273.21875 -445"}, -{"category":"Variables", "text":"Global Variables", "columnDefinitions":[ {"attr":"name", "text":"Var name", "column":0},{"attr":"value", "text":"Value", "column":1},{"attr":"unit", "text":"Unit", "column":2} ], "var_list":[ {"columns":[ {"attr":"name", "text":"num_sub_band"},{"attr":"value", "text":"80"},{"attr":"unit", "text":""} ]},{"columns":[ {"attr":"name", "text":"num_beam"},{"attr":"value", "text":"2"},{"attr":"unit", "text":""} ]},{"columns":[ {"attr":"name", "text":"num_time_slice"},{"attr":"value", "text":"9"},{"attr":"unit", "text":""} ]},{"columns":[ {"attr":"name", "text":"num_subb_per_img"},{"attr":"value", "text":"10"},{"attr":"unit", "text":""} ]} ], "key":-54, "loc":"79.67187499999966 -474.99999999999994"}, -{"category":"memory", "text":"Cal Beam\nMS file", "data_volume":100, "key":-63, "loc":"-376.330987930298 -117.51546071370467", "group":-38}, -{"category":"memory", "text":"Flagged n\n Avged", "data_volume":25, "key":-36, "loc":"-377.828125 118.98453928629512", "group":-38}, -{"category":"SplitData", "text":"Scatter by Channel", "isGroup":true, "num_of_splits":"4", "scatter_axis":"frequency", "key":-38, "loc":"-287.3309879302981 3.4081855773920324", "group":-12}, -{"category":"memory", "text":"Cal Beam \nVis stream", "data_volume":100, "key":-3, "loc":"-376.5106678009031 -251.230443827312", "group":-38}, -{"category":"memory", "text":"Target Beam\nVis stream", "data_volume":100, "key":-42, "loc":"-198.35711097717325 -253.23044382731177", "group":-38}, -{"category":"Component", "text":"Data Writer", "execution_time":5, "Arg01":"MS_path=/home/lofar", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"-376.3309879302975 -186.51546071370456", "group":-38}, -{"category":"Component", "text":"Data Writer", "execution_time":5, "Arg01":"MS_path=/home/lofar", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-43, "loc":"-198.3309879302981 -173.5154607137047", "group":-38}, -{"category":"memory", "text":"Target Beam\nMS file", "data_volume":100, "key":-44, "loc":"-197.33098793029768 -95.5154607137047", "group":-38}, -{"category":"Component", "text":"NDPPP\nFlagging +\n Subtract + Average ", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-45, "loc":"-377.33098793029836 -41.51546071370474", "group":-38}, -{"category":"Component", "text":"NDPPP\nFlagging +\n Subtract + Average ", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-46, "loc":"-197.33098793029774 27.484539286295266", "group":-38}, -{"category":"memory", "text":"Flagged n\n Avged", "data_volume":25, "key":-47, "loc":"-196.8281250000002 108.98453928629526", "group":-38}, -{"category":"memory", "text":"Gain Table", "data_volume":5, "key":-53, "loc":"-380.8281249999997 267.9845392862951", "group":-38}, -{"category":"SplitData", "text":"Scatter by Timeslice", "isGroup":true, "num_of_splits":"2", "scatter_axis":"time", "key":-12, "loc":"-273.2414979934695 -10.713640594482968"}, -{"category":"Component", "text":"Gain Calibration", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-39, "loc":"-379.8281250000001 192.9845392862954", "group":-38}, -{"category":"Component", "text":"BBS Apply \nGain Cal", "execution_time":20, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-55, "loc":"-196.82812500000009 184.9845392862955", "group":-38}, -{"category":"GroupBy", "text":"Group By", "isGroup":true, "num_of_inputs":"${num_channel} * ${num_beam}", "gather_axis":"frequency", "group_by":"-38", "key":-14, "loc":"55.96484375000006 -323.19443918863976"}, -{"category":"memory", "text":"Calibrated\nMS file", "key":-57, "data_volume":25, "loc":"-198.03515625 257.4688420613602", "group":-38}, -{"category":"Comment", "text":"", "key":-16, "loc":"-101.328125 149", "group":-12}, -{"category":"memory", "text":"Local SM + \nA-team sources", "key":-35, "loc":"142.78124999999997 -41.999999999999716"}, -{"category":"Component", "text":"MakeSourceDB", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-52, "loc":"142.67187500000045 109.99999999999991"}, -{"category":"memory", "text":"LSM", "key":-33, "loc":"142.78124999999997 214.00000000000009"}, -{"category":"Component", "text":"Extract LSM", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-51, "loc":"142.67187499999974 -185.00000000000023"}, -{"category":"DataGather", "text":"Gather ", "isGroup":true, "num_of_inputs":"2", "gather_axis":"group id", "key":-41, "loc":"465.5623029067058 69.50000000000024"}, -{"category":"Component", "text":"Source finding", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-49, "loc":"428.6718749999992 -26.00000000000027", "group":-15}, -{"category":"memory", "text":"Image", "data_volume":5, "key":-48, "loc":"388.67196146526703 39.65525156656861", "group":-15}, -{"category":"Component", "text":"DD Calibration", "execution_time":20, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-56, "loc":"505.6718750000001 236.00000000000045", "group":-15}, -{"category":"Branch", "text":"DD Cal \nDone?", "key":-6, "loc":"404.6718750000004 128.99999999999997", "group":-15}, -{"category":"Component", "text":"AWImager", "execution_time":50, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-40, "loc":"518.6718750000003 38.999999999999986", "group":-15}, -{"category":"Loop", "text":"Loop", "isGroup":true, "num_of_iter":3, "key":-15, "loc":"465.5623029067058 105.00000000000011", "group":-41}, -{"category":"End", "text":"End", "key":-9, "loc":"266.7812500000001 221.9999999999999"}, -{"category":"memory", "text":"DD \nGain Tables", "data_volume":5, "group_end":1, "key":-50, "loc":"517.671875 128", "group":-15}, -{"category":"Component", "text":"Combine", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-37, "loc":"398.671875 -101", "group":-41}, -{"category":"memory", "text":"Combined", "data_volume":5, "group_end":0, "key":-58, "loc":"521.671875 -103", "group":-41} - ], - "linkDataArray": [ -{"from":-39, "to":-53, "fromPort":"B", "toPort":"T", "points":[-379.828125,209.42226359049462,-379.828125,219.42226359049462,-379.828125,230.4845392862954,-380.8281249999998,230.4845392862954,-380.8281249999998,241.54681498209618,-380.8281249999998,251.54681498209618]}, -{"from":-53, "to":-55, "fromPort":"R", "toPort":"L", "points":[-323.4866657257077,267.9845392862954,-313.4866657257077,267.9845392862954,-281.92707157135,267.9845392862954,-281.92707157135,184.9845392862954,-250.36747741699222,184.9845392862954,-240.36747741699222,184.9845392862954]}, -{"from":-63, "to":-45, "fromPort":"B", "toPort":"T", "points":[-376.3309879302979,-93.14001210530625,-376.3309879302979,-83.14001210530625,-376.8309879302979,-83.14001210530625,-376.8309879302979,-83.82863362630238,-377.3309879302979,-83.82863362630238,-377.3309879302979,-73.82863362630238]}, -{"from":-22, "to":-45, "fromPort":"B", "toPort":"L", "points":[-546.2187499999995,-121.62455139160147,-546.2187499999995,-111.62455139160147,-546.2187499999995,-41.51546071370475,-502.43681049346924,-41.51546071370475,-458.654870986939,-41.51546071370475,-448.654870986939,-41.51546071370475]}, -{"from":-45, "to":-36, "fromPort":"B", "toPort":"T", "points":[-377.33098793029785,-9.202287801107062,-377.33098793029785,0.7977121988929383,-377.33098793029785,42.703401438394856,-377.8281250000002,42.703401438394856,-377.8281250000002,84.60909067789677,-377.8281250000002,94.60909067789677]}, -{"from":-36, "to":-39, "fromPort":"B", "toPort":"T", "points":[-377.8281250000002,143.35998789469363,-377.8281250000002,153.35998789469363,-377.8281250000002,159.9534014383949,-379.82812499999994,159.9534014383949,-379.82812499999994,166.54681498209618,-379.82812499999994,176.54681498209618]}, -{"from":-3, "to":-2, "fromPort":"B", "toPort":"T", "points":[-376.51066780090315,-226.85499521891336,-376.51066780090315,-216.85499521891336,-376.51066780090315,-214.9040901184086,-376.33098793029745,-214.9040901184086,-376.33098793029745,-212.95318501790382,-376.33098793029745,-202.95318501790382]}, -{"from":-2, "to":-63, "fromPort":"B", "toPort":"T", "points":[-376.3309879302974,-170.07773640950538,-376.3309879302974,-160.07773640950538,-376.3309879302974,-155.98432286580424,-376.33098793029785,-155.98432286580424,-376.33098793029785,-151.8909093221031,-376.33098793029785,-141.8909093221031]}, -{"from":-42, "to":-43, "fromPort":"B", "toPort":"T", "points":[-198.35711097717316,-228.85499521891336,-198.35711097717316,-218.85499521891336,-198.35711097717316,-209.4040901184087,-198.3309879302979,-209.4040901184087,-198.3309879302979,-199.95318501790402,-198.3309879302979,-189.95318501790402]}, -{"from":-43, "to":-44, "fromPort":"B", "toPort":"T", "points":[-198.3309879302979,-157.07773640950558,-198.3309879302979,-147.07773640950558,-198.3309879302979,-138.48432286580436,-197.33098793029794,-138.48432286580436,-197.33098793029794,-129.89090932210314,-197.33098793029794,-119.89090932210314]}, -{"from":-44, "to":-46, "fromPort":"B", "toPort":"T", "points":[-197.33098793029794,-71.14001210530627,-197.33098793029794,-61.14001210530627,-197.33098793029794,-37.98432286580433,-197.33098793029785,-37.98432286580433,-197.33098793029785,-14.828633626302398,-197.33098793029785,-4.828633626302398]}, -{"from":-22, "to":-46, "fromPort":"B", "toPort":"L", "points":[-546.2187499999995,-121.62455139160147,-546.2187499999995,-111.62455139160147,-546.2187499999995,27.484539286295266,-412.43681049346895,27.484539286295266,-278.65487098693836,27.484539286295266,-268.65487098693836,27.484539286295266]}, -{"from":-46, "to":-47, "fromPort":"B", "toPort":"T", "points":[-197.33098793029785,59.79771219889292,-197.33098793029785,69.79771219889292,-197.33098793029785,72.20340143839489,-196.8281250000001,72.20340143839489,-196.8281250000001,74.60909067789686,-196.8281250000001,84.60909067789686]}, -{"from":-47, "to":-55, "fromPort":"B", "toPort":"T", "points":[-196.8281250000001,133.35998789469375,-196.8281250000001,143.35998789469375,-196.8281250000001,146.98453928629533,-196.82812500000006,146.98453928629533,-196.82812500000006,150.60909067789694,-196.82812500000006,160.60909067789694]}, -{"from":-55, "to":-57, "fromPort":"B", "toPort":"T", "points":[-196.82812500000006,209.3599878946938,-196.82812500000006,219.3599878946938,-196.82812500000006,221.22669067382782,-198.03515624999997,221.22669067382782,-198.03515624999997,223.09339345296183,-198.03515624999997,233.09339345296183]}, -{"from":-57, "to":-14, "fromPort":"R", "toPort":"B", "points":[-142.7293243408203,257.4688420613602,-132.7293243408203,257.4688420613602,-124,257.4688420613602,-124,257.4688420613602,-76,257.4688420613602,-76,-212,105.17157999915403,-212,105.17157999915403,-307.19443918863993,105.17157999915403,-317.19443918863993]}, -{"from":-52, "to":-33, "fromPort":"B", "toPort":"T", "points":[142.67187500000043,126.43772430419915,142.67187500000043,136.43772430419915,142.67187500000043,162,142.78124999999997,162,142.78124999999997,187.56227569580088,142.78124999999997,197.56227569580088]}, -{"from":-5, "to":-51, "fromPort":"L", "toPort":"R", "points":[350.28125000000017,-185.00000000000017,340.28125000000017,-185.00000000000017,270.6853942871093,-185.00000000000017,270.6853942871093,-185.00000000000023,201.0895385742185,-185.00000000000023,191.0895385742185,-185.00000000000023]}, -{"from":-51, "to":-35, "fromPort":"B", "toPort":"T", "points":[142.67187499999974,-168.562275695801,142.67187499999974,-158.562275695801,142.67187499999974,-120.45329322814938,142.78124999999997,-120.45329322814938,142.78124999999997,-82.34431076049776,142.78124999999997,-72.34431076049776]}, -{"from":-35, "to":-52, "fromPort":"R", "toPort":"T", "points":[206.27766418457028,-41.999999999999716,216.27766418457028,-41.999999999999716,216.27766418457028,39.95329322814951,142.67187500000045,39.95329322814951,142.67187500000045,83.5622756958007,142.67187500000045,93.5622756958007]}, -{"from":-35, "to":-46, "fromPort":"B", "toPort":"R", "points":[142.78124999999997,-11.655689239501676,142.78124999999997,-1.655689239501676,142.78124999999997,-4,142.78124999999997,-4,142.78124999999997,27.484539286295263,-115.87825965881348,27.484539286295263,-125.87825965881348,27.484539286295263]}, -{"from":-35, "to":-45, "fromPort":"L", "toPort":"R", "points":[79.28483581542966,-41.999999999999716,69.28483581542966,-41.999999999999716,-113.29671192169214,-41.999999999999716,-113.29671192169214,-41.51546071370472,-295.87825965881393,-41.51546071370472,-305.87825965881393,-41.51546071370472]}, -{"from":-1, "to":-3, "fromPort":"B", "toPort":"T", "points":[-273.21875,-425,-273.21875,-415,-273.21875,-412,-376.5106678009031,-412,-376.5106678009031,-285.6058924357104,-376.5106678009031,-275.6058924357104]}, -{"from":-1, "to":-42, "fromPort":"B", "toPort":"T", "points":[-273.21875,-425,-273.21875,-415,-273.21875,-412,-198.35711097717325,-412,-198.35711097717325,-287.6058924357102,-198.35711097717325,-277.6058924357102]}, -{"from":-14, "to":-41, "fromPort":"R", "toPort":"T", "points":[113.19174041371397,0.7279162766875871,123.19174041371397,0.7279162766875871,168.87385454440658,0.7279162766875871,168.87385454440658,-99.84113349749197,75.59860446345674,-99.84113349749197,75.59860446345674,-89.84113349749197]}, -{"from":-48, "to":-49, "fromPort":"T", "toPort":"B", "points":[388.67196146526703,23.2175272623694,388.67196146526703,13.217527262369401,388.67196146526703,6.82762578328418,428.6718749999995,6.82762578328418,428.6718749999995,0.4377243041989587,428.6718749999995,-9.562275695801041]}, -{"from":-48, "to":-6, "fromPort":"B", "toPort":"T", "points":[388.67196146526703,56.09297587076784,388.67196146526703,66.09297587076784,388.67196146526703,74.42103932698545,404.67187500000045,74.42103932698545,404.67187500000045,82.74910278320307,404.67187500000045,92.74910278320307]}, -{"from":-6, "to":-56, "fromPort":"B", "toPort":"L", "visible":true, "points":[404.67187500000045,165.25089721679683,404.67187500000045,175.25089721679683,404.67187500000045,236.00000000000045,422.09045791626005,236.00000000000045,439.50904083251964,236.00000000000045,449.50904083251964,236.00000000000045], "text":"No"}, -{"from":-40, "to":-48, "fromPort":"L", "toPort":"R", "points":[475.5512695312502,38.999999999999986,465.5512695312502,38.999999999999986,450.60204346914486,38.999999999999986,450.60204346914486,39.65525156656862,435.6528174070395,39.65525156656862,425.6528174070395,39.65525156656862]}, -{"from":-6, "to":-9, "fromPort":"L", "toPort":"T", "visible":true, "points":[352.92778015136764,128.99999999999994,342.92778015136764,128.99999999999994,332,128.99999999999994,332,128.99999999999994,266.7812500000001,128.99999999999994,266.7812500000001,191.9999999999999,266.7812500000001,201.9999999999999]}, -{"from":-56, "to":-50, "fromPort":"T", "toPort":"B", "points":[505.6718750000001,219.56227569580125,505.6718750000001,209.56227569580125,505.6718750000001,185.96886215209983,517.671875,185.96886215209983,517.671875,162.37544860839841,517.671875,152.37544860839841]}, -{"from":-37, "to":-58, "fromPort":"R", "toPort":"L", "points":[436.5061569213867,-100.99999999999999,446.5061569213867,-100.99999999999999,451.44279956817627,-100.99999999999999,451.44279956817627,-103,456.3794422149658,-103,466.3794422149658,-103]}, -{"from":-58, "to":-40, "fromPort":"B", "toPort":"T", "points":[521.671875,-86.56227569580079,521.671875,-76.56227569580079,521.671875,-32.000000000000014,518.6718750000002,-32.000000000000014,518.6718750000002,12.562275695800764,518.6718750000002,22.562275695800764]} - ]} + "nodeDataArray": [ + { + "category": "Comment", + "loc": "471.00000000000017 -377.0000000000003", + "text": "LOFAR Standard", + "key": -13 + }, + { + "category": "memory", + "text": "Calibrator \nDB", + "key": -22, + "loc": "-546.2187499999995 -145.9999999999998" + }, + { + "category": "memory", + "text": "GSM", + "key": -5, + "loc": "390.78125000000017 -185.00000000000028" + }, + { + "category": "Start", + "text": "Start", + "key": -1, + "loc": "-273.21875 -445" + }, + { + "category": "Variables", + "text": "Global Variables", + "columnDefinitions": [ + { + "attr": "name", + "text": "Var name", + "column": 0 + }, + { + "attr": "value", + "text": "Value", + "column": 1 + }, + { + "attr": "unit", + "text": "Unit", + "column": 2 + } + ], + "var_list": [ + { + "columns": [ + { + "attr": "name", + "text": "num_sub_band" + }, + { + "attr": "value", + "text": "80" + }, + { + "attr": "unit", + "text": "" + } + ] + }, + { + "columns": [ + { + "attr": "name", + "text": "num_beam" + }, + { + "attr": "value", + "text": "2" + }, + { + "attr": "unit", + "text": "" + } + ] + }, + { + "columns": [ + { + "attr": "name", + "text": "num_time_slice" + }, + { + "attr": "value", + "text": "9" + }, + { + "attr": "unit", + "text": "" + } + ] + }, + { + "columns": [ + { + "attr": "name", + "text": "num_subb_per_img" + }, + { + "attr": "value", + "text": "10" + }, + { + "attr": "unit", + "text": "" + } + ] + } + ], + "key": -54, + "loc": "79.67187499999966 -474.99999999999994" + }, + { + "category": "memory", + "text": "Cal Beam\nMS file", + "data_volume": 100, + "key": -63, + "loc": "-376.330987930298 -117.51546071370467", + "group": -38 + }, + { + "category": "memory", + "text": "Flagged n\n Avged", + "data_volume": 25, + "key": -36, + "loc": "-377.828125 118.98453928629512", + "group": -38 + }, + { + "category": "SplitData", + "text": "Scatter by Channel", + "isGroup": true, + "num_of_splits": "4", + "scatter_axis": "frequency", + "key": -38, + "loc": "-287.3309879302981 3.4081855773920324", + "group": -12 + }, + { + "category": "memory", + "text": "Cal Beam \nVis stream", + "data_volume": 100, + "key": -3, + "loc": "-376.5106678009031 -251.230443827312", + "group": -38 + }, + { + "category": "memory", + "text": "Target Beam\nVis stream", + "data_volume": 100, + "key": -42, + "loc": "-198.35711097717325 -253.23044382731177", + "group": -38 + }, + { + "category": "Component", + "text": "Data Writer", + "execution_time": 5, + "Arg01": "MS_path=/home/lofar", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "-376.3309879302975 -186.51546071370456", + "group": -38 + }, + { + "category": "Component", + "text": "Data Writer", + "execution_time": 5, + "Arg01": "MS_path=/home/lofar", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -43, + "loc": "-198.3309879302981 -173.5154607137047", + "group": -38 + }, + { + "category": "memory", + "text": "Target Beam\nMS file", + "data_volume": 100, + "key": -44, + "loc": "-197.33098793029768 -95.5154607137047", + "group": -38 + }, + { + "category": "Component", + "text": "NDPPP\nFlagging +\n Subtract + Average ", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -45, + "loc": "-377.33098793029836 -41.51546071370474", + "group": -38 + }, + { + "category": "Component", + "text": "NDPPP\nFlagging +\n Subtract + Average ", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -46, + "loc": "-197.33098793029774 27.484539286295266", + "group": -38 + }, + { + "category": "memory", + "text": "Flagged n\n Avged", + "data_volume": 25, + "key": -47, + "loc": "-196.8281250000002 108.98453928629526", + "group": -38 + }, + { + "category": "memory", + "text": "Gain Table", + "data_volume": 5, + "key": -53, + "loc": "-380.8281249999997 267.9845392862951", + "group": -38 + }, + { + "category": "SplitData", + "text": "Scatter by Timeslice", + "isGroup": true, + "num_of_splits": "2", + "scatter_axis": "time", + "key": -12, + "loc": "-273.2414979934695 -10.713640594482968" + }, + { + "category": "Component", + "text": "Gain Calibration", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -39, + "loc": "-379.8281250000001 192.9845392862954", + "group": -38 + }, + { + "category": "Component", + "text": "BBS Apply \nGain Cal", + "execution_time": 20, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -55, + "loc": "-196.82812500000009 184.9845392862955", + "group": -38 + }, + { + "category": "GroupBy", + "text": "Group By", + "isGroup": true, + "num_of_inputs": "${num_channel} * ${num_beam}", + "gather_axis": "frequency", + "group_by": "-38", + "key": -14, + "loc": "55.96484375000006 -323.19443918863976" + }, + { + "category": "memory", + "text": "Calibrated\nMS file", + "key": -57, + "data_volume": 25, + "loc": "-198.03515625 257.4688420613602", + "group": -38 + }, + { + "category": "Comment", + "text": "", + "key": -16, + "loc": "-101.328125 149", + "group": -12 + }, + { + "category": "memory", + "text": "Local SM + \nA-team sources", + "key": -35, + "loc": "142.78124999999997 -41.999999999999716" + }, + { + "category": "Component", + "text": "MakeSourceDB", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -52, + "loc": "142.67187500000045 109.99999999999991" + }, + { + "category": "memory", + "text": "LSM", + "key": -33, + "loc": "142.78124999999997 214.00000000000009" + }, + { + "category": "Component", + "text": "Extract LSM", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -51, + "loc": "142.67187499999974 -185.00000000000023" + }, + { + "category": "DataGather", + "text": "Gather ", + "isGroup": true, + "num_of_inputs": "2", + "gather_axis": "group id", + "key": -41, + "loc": "465.5623029067058 69.50000000000024" + }, + { + "category": "Component", + "text": "Source finding", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -49, + "loc": "428.6718749999992 -26.00000000000027", + "group": -15 + }, + { + "category": "memory", + "text": "Image", + "data_volume": 5, + "key": -48, + "loc": "388.67196146526703 39.65525156656861", + "group": -15 + }, + { + "category": "Component", + "text": "DD Calibration", + "execution_time": 20, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -56, + "loc": "505.6718750000001 236.00000000000045", + "group": -15 + }, + { + "category": "Branch", + "text": "DD Cal \nDone?", + "key": -6, + "loc": "404.6718750000004 128.99999999999997", + "group": -15 + }, + { + "category": "Component", + "text": "AWImager", + "execution_time": 50, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -40, + "loc": "518.6718750000003 38.999999999999986", + "group": -15 + }, + { + "category": "Loop", + "text": "Loop", + "isGroup": true, + "num_of_iter": 3, + "key": -15, + "loc": "465.5623029067058 105.00000000000011", + "group": -41 + }, + { + "category": "End", + "text": "End", + "key": -9, + "loc": "266.7812500000001 221.9999999999999" + }, + { + "category": "memory", + "text": "DD \nGain Tables", + "data_volume": 5, + "group_end": 1, + "key": -50, + "loc": "517.671875 128", + "group": -15 + }, + { + "category": "Component", + "text": "Combine", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -37, + "loc": "398.671875 -101", + "group": -41 + }, + { + "category": "memory", + "text": "Combined", + "data_volume": 5, + "group_end": 0, + "key": -58, + "loc": "521.671875 -103", + "group": -41 + } + ], + "linkDataArray": [ + { + "from": -39, + "to": -53, + "fromPort": "B", + "toPort": "T", + "points": [ + -379.828125, + 209.42226359049462, + -379.828125, + 219.42226359049462, + -379.828125, + 230.4845392862954, + -380.8281249999998, + 230.4845392862954, + -380.8281249999998, + 241.54681498209618, + -380.8281249999998, + 251.54681498209618 + ] + }, + { + "from": -53, + "to": -55, + "fromPort": "R", + "toPort": "L", + "points": [ + -323.4866657257077, + 267.9845392862954, + -313.4866657257077, + 267.9845392862954, + -281.92707157135, + 267.9845392862954, + -281.92707157135, + 184.9845392862954, + -250.36747741699222, + 184.9845392862954, + -240.36747741699222, + 184.9845392862954 + ] + }, + { + "from": -63, + "to": -45, + "fromPort": "B", + "toPort": "T", + "points": [ + -376.3309879302979, + -93.14001210530625, + -376.3309879302979, + -83.14001210530625, + -376.8309879302979, + -83.14001210530625, + -376.8309879302979, + -83.82863362630238, + -377.3309879302979, + -83.82863362630238, + -377.3309879302979, + -73.82863362630238 + ] + }, + { + "from": -22, + "to": -45, + "fromPort": "B", + "toPort": "L", + "points": [ + -546.2187499999995, + -121.62455139160147, + -546.2187499999995, + -111.62455139160147, + -546.2187499999995, + -41.51546071370475, + -502.43681049346924, + -41.51546071370475, + -458.654870986939, + -41.51546071370475, + -448.654870986939, + -41.51546071370475 + ] + }, + { + "from": -45, + "to": -36, + "fromPort": "B", + "toPort": "T", + "points": [ + -377.33098793029785, + -9.202287801107062, + -377.33098793029785, + 0.7977121988929383, + -377.33098793029785, + 42.703401438394856, + -377.8281250000002, + 42.703401438394856, + -377.8281250000002, + 84.60909067789677, + -377.8281250000002, + 94.60909067789677 + ] + }, + { + "from": -36, + "to": -39, + "fromPort": "B", + "toPort": "T", + "points": [ + -377.8281250000002, + 143.35998789469363, + -377.8281250000002, + 153.35998789469363, + -377.8281250000002, + 159.9534014383949, + -379.82812499999994, + 159.9534014383949, + -379.82812499999994, + 166.54681498209618, + -379.82812499999994, + 176.54681498209618 + ] + }, + { + "from": -3, + "to": -2, + "fromPort": "B", + "toPort": "T", + "points": [ + -376.51066780090315, + -226.85499521891336, + -376.51066780090315, + -216.85499521891336, + -376.51066780090315, + -214.9040901184086, + -376.33098793029745, + -214.9040901184086, + -376.33098793029745, + -212.95318501790382, + -376.33098793029745, + -202.95318501790382 + ] + }, + { + "from": -2, + "to": -63, + "fromPort": "B", + "toPort": "T", + "points": [ + -376.3309879302974, + -170.07773640950538, + -376.3309879302974, + -160.07773640950538, + -376.3309879302974, + -155.98432286580424, + -376.33098793029785, + -155.98432286580424, + -376.33098793029785, + -151.8909093221031, + -376.33098793029785, + -141.8909093221031 + ] + }, + { + "from": -42, + "to": -43, + "fromPort": "B", + "toPort": "T", + "points": [ + -198.35711097717316, + -228.85499521891336, + -198.35711097717316, + -218.85499521891336, + -198.35711097717316, + -209.4040901184087, + -198.3309879302979, + -209.4040901184087, + -198.3309879302979, + -199.95318501790402, + -198.3309879302979, + -189.95318501790402 + ] + }, + { + "from": -43, + "to": -44, + "fromPort": "B", + "toPort": "T", + "points": [ + -198.3309879302979, + -157.07773640950558, + -198.3309879302979, + -147.07773640950558, + -198.3309879302979, + -138.48432286580436, + -197.33098793029794, + -138.48432286580436, + -197.33098793029794, + -129.89090932210314, + -197.33098793029794, + -119.89090932210314 + ] + }, + { + "from": -44, + "to": -46, + "fromPort": "B", + "toPort": "T", + "points": [ + -197.33098793029794, + -71.14001210530627, + -197.33098793029794, + -61.14001210530627, + -197.33098793029794, + -37.98432286580433, + -197.33098793029785, + -37.98432286580433, + -197.33098793029785, + -14.828633626302398, + -197.33098793029785, + -4.828633626302398 + ] + }, + { + "from": -22, + "to": -46, + "fromPort": "B", + "toPort": "L", + "points": [ + -546.2187499999995, + -121.62455139160147, + -546.2187499999995, + -111.62455139160147, + -546.2187499999995, + 27.484539286295266, + -412.43681049346895, + 27.484539286295266, + -278.65487098693836, + 27.484539286295266, + -268.65487098693836, + 27.484539286295266 + ] + }, + { + "from": -46, + "to": -47, + "fromPort": "B", + "toPort": "T", + "points": [ + -197.33098793029785, + 59.79771219889292, + -197.33098793029785, + 69.79771219889292, + -197.33098793029785, + 72.20340143839489, + -196.8281250000001, + 72.20340143839489, + -196.8281250000001, + 74.60909067789686, + -196.8281250000001, + 84.60909067789686 + ] + }, + { + "from": -47, + "to": -55, + "fromPort": "B", + "toPort": "T", + "points": [ + -196.8281250000001, + 133.35998789469375, + -196.8281250000001, + 143.35998789469375, + -196.8281250000001, + 146.98453928629533, + -196.82812500000006, + 146.98453928629533, + -196.82812500000006, + 150.60909067789694, + -196.82812500000006, + 160.60909067789694 + ] + }, + { + "from": -55, + "to": -57, + "fromPort": "B", + "toPort": "T", + "points": [ + -196.82812500000006, + 209.3599878946938, + -196.82812500000006, + 219.3599878946938, + -196.82812500000006, + 221.22669067382782, + -198.03515624999997, + 221.22669067382782, + -198.03515624999997, + 223.09339345296183, + -198.03515624999997, + 233.09339345296183 + ] + }, + { + "from": -57, + "to": -14, + "fromPort": "R", + "toPort": "B", + "points": [ + -142.7293243408203, + 257.4688420613602, + -132.7293243408203, + 257.4688420613602, + -124, + 257.4688420613602, + -124, + 257.4688420613602, + -76, + 257.4688420613602, + -76, + -212, + 105.17157999915403, + -212, + 105.17157999915403, + -307.19443918863993, + 105.17157999915403, + -317.19443918863993 + ] + }, + { + "from": -52, + "to": -33, + "fromPort": "B", + "toPort": "T", + "points": [ + 142.67187500000043, + 126.43772430419915, + 142.67187500000043, + 136.43772430419915, + 142.67187500000043, + 162, + 142.78124999999997, + 162, + 142.78124999999997, + 187.56227569580088, + 142.78124999999997, + 197.56227569580088 + ] + }, + { + "from": -5, + "to": -51, + "fromPort": "L", + "toPort": "R", + "points": [ + 350.28125000000017, + -185.00000000000017, + 340.28125000000017, + -185.00000000000017, + 270.6853942871093, + -185.00000000000017, + 270.6853942871093, + -185.00000000000023, + 201.0895385742185, + -185.00000000000023, + 191.0895385742185, + -185.00000000000023 + ] + }, + { + "from": -51, + "to": -35, + "fromPort": "B", + "toPort": "T", + "points": [ + 142.67187499999974, + -168.562275695801, + 142.67187499999974, + -158.562275695801, + 142.67187499999974, + -120.45329322814938, + 142.78124999999997, + -120.45329322814938, + 142.78124999999997, + -82.34431076049776, + 142.78124999999997, + -72.34431076049776 + ] + }, + { + "from": -35, + "to": -52, + "fromPort": "R", + "toPort": "T", + "points": [ + 206.27766418457028, + -41.999999999999716, + 216.27766418457028, + -41.999999999999716, + 216.27766418457028, + 39.95329322814951, + 142.67187500000045, + 39.95329322814951, + 142.67187500000045, + 83.5622756958007, + 142.67187500000045, + 93.5622756958007 + ] + }, + { + "from": -35, + "to": -46, + "fromPort": "B", + "toPort": "R", + "points": [ + 142.78124999999997, + -11.655689239501676, + 142.78124999999997, + -1.655689239501676, + 142.78124999999997, + -4, + 142.78124999999997, + -4, + 142.78124999999997, + 27.484539286295263, + -115.87825965881348, + 27.484539286295263, + -125.87825965881348, + 27.484539286295263 + ] + }, + { + "from": -35, + "to": -45, + "fromPort": "L", + "toPort": "R", + "points": [ + 79.28483581542966, + -41.999999999999716, + 69.28483581542966, + -41.999999999999716, + -113.29671192169214, + -41.999999999999716, + -113.29671192169214, + -41.51546071370472, + -295.87825965881393, + -41.51546071370472, + -305.87825965881393, + -41.51546071370472 + ] + }, + { + "from": -1, + "to": -3, + "fromPort": "B", + "toPort": "T", + "points": [ + -273.21875, + -425, + -273.21875, + -415, + -273.21875, + -412, + -376.5106678009031, + -412, + -376.5106678009031, + -285.6058924357104, + -376.5106678009031, + -275.6058924357104 + ] + }, + { + "from": -1, + "to": -42, + "fromPort": "B", + "toPort": "T", + "points": [ + -273.21875, + -425, + -273.21875, + -415, + -273.21875, + -412, + -198.35711097717325, + -412, + -198.35711097717325, + -287.6058924357102, + -198.35711097717325, + -277.6058924357102 + ] + }, + { + "from": -14, + "to": -41, + "fromPort": "R", + "toPort": "T", + "points": [ + 113.19174041371397, + 0.7279162766875871, + 123.19174041371397, + 0.7279162766875871, + 168.87385454440658, + 0.7279162766875871, + 168.87385454440658, + -99.84113349749197, + 75.59860446345674, + -99.84113349749197, + 75.59860446345674, + -89.84113349749197 + ] + }, + { + "from": -48, + "to": -49, + "fromPort": "T", + "toPort": "B", + "points": [ + 388.67196146526703, + 23.2175272623694, + 388.67196146526703, + 13.217527262369401, + 388.67196146526703, + 6.82762578328418, + 428.6718749999995, + 6.82762578328418, + 428.6718749999995, + 0.4377243041989587, + 428.6718749999995, + -9.562275695801041 + ] + }, + { + "from": -48, + "to": -6, + "fromPort": "B", + "toPort": "T", + "points": [ + 388.67196146526703, + 56.09297587076784, + 388.67196146526703, + 66.09297587076784, + 388.67196146526703, + 74.42103932698545, + 404.67187500000045, + 74.42103932698545, + 404.67187500000045, + 82.74910278320307, + 404.67187500000045, + 92.74910278320307 + ] + }, + { + "from": -6, + "to": -56, + "fromPort": "B", + "toPort": "L", + "visible": true, + "points": [ + 404.67187500000045, + 165.25089721679683, + 404.67187500000045, + 175.25089721679683, + 404.67187500000045, + 236.00000000000045, + 422.09045791626005, + 236.00000000000045, + 439.50904083251964, + 236.00000000000045, + 449.50904083251964, + 236.00000000000045 + ], + "text": "No" + }, + { + "from": -40, + "to": -48, + "fromPort": "L", + "toPort": "R", + "points": [ + 475.5512695312502, + 38.999999999999986, + 465.5512695312502, + 38.999999999999986, + 450.60204346914486, + 38.999999999999986, + 450.60204346914486, + 39.65525156656862, + 435.6528174070395, + 39.65525156656862, + 425.6528174070395, + 39.65525156656862 + ] + }, + { + "from": -6, + "to": -9, + "fromPort": "L", + "toPort": "T", + "visible": true, + "points": [ + 352.92778015136764, + 128.99999999999994, + 342.92778015136764, + 128.99999999999994, + 332, + 128.99999999999994, + 332, + 128.99999999999994, + 266.7812500000001, + 128.99999999999994, + 266.7812500000001, + 191.9999999999999, + 266.7812500000001, + 201.9999999999999 + ] + }, + { + "from": -56, + "to": -50, + "fromPort": "T", + "toPort": "B", + "points": [ + 505.6718750000001, + 219.56227569580125, + 505.6718750000001, + 209.56227569580125, + 505.6718750000001, + 185.96886215209983, + 517.671875, + 185.96886215209983, + 517.671875, + 162.37544860839841, + 517.671875, + 152.37544860839841 + ] + }, + { + "from": -37, + "to": -58, + "fromPort": "R", + "toPort": "L", + "points": [ + 436.5061569213867, + -100.99999999999999, + 446.5061569213867, + -100.99999999999999, + 451.44279956817627, + -100.99999999999999, + 451.44279956817627, + -103, + 456.3794422149658, + -103, + 466.3794422149658, + -103 + ] + }, + { + "from": -58, + "to": -40, + "fromPort": "B", + "toPort": "T", + "points": [ + 521.671875, + -86.56227569580079, + 521.671875, + -76.56227569580079, + 521.671875, + -32.000000000000014, + 518.6718750000002, + -32.000000000000014, + 518.6718750000002, + 12.562275695800764, + 518.6718750000002, + 22.562275695800764 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json b/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json index b95c6b514..adcca7489 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json +++ b/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json @@ -1,39 +1,458 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Start", "text":"Start", "key":-1, "loc":"-754.3281250000008 -817.0000000000003"}, -{"category":"memory", "text":"Data2", "data_volume":5, "key":-3, "loc":"-1038.3281250000005 -608.0000000000002"}, -{"category":"SplitData", "text":"Scatter1", "isGroup":true, "num_of_splits":"5", "scatter_axis":"time", "key":-12, "loc":"-765.8664207458503 -514.6218261718749"}, -{"category":"SplitData", "text":"Scatter2", "isGroup":true, "num_of_splits":"4", "scatter_axis":"frequency", "key":-5, "loc":"-800.3281250000013 -537.9999999999997", "group":-12}, -{"category":"Component", "text":"Component1", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"-800.3281250000013 -540.9999999999994", "group":-5}, -{"category":"memory", "text":"Data1", "data_volume":5, "key":-8, "loc":"-800.3281250000001 -594.9999999999997", "group":-5}, -{"category":"memory", "text":"Data3", "data_volume":5, "key":-10, "loc":"-800.3281249999995 -480.99999999999955", "group":-5}, -{"category":"Component", "text":"Component4", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-21, "loc":"-1135.3281249999998 -469.9999999999997", "group":-24}, -{"category":"Component", "text":"Component", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-22, "loc":"-721.328125 -400", "group":-12}, -{"category":"memory", "text":"Data5", "data_volume":5, "key":-23, "loc":"-1137.3281249999995 -407", "group":-24}, -{"category":"DataGather", "text":"Gather", "isGroup":true, "num_of_inputs":2, "gather_axis":"frequency", "key":-24, "loc":"-1135.3281249999998 -438.4999999999999"}, -{"category":"GroupBy", "text":"Group By 2", "isGroup":true, "group_key":-5, "group_axis":"frequency", "key":-14, "loc":"-800.328125 -265"}, -{"category":"Component", "text":"Component 2", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-20, "loc":"-800.328125 -265", "group":-14}, -{"category":"DataGather", "text":"Gather", "isGroup":true, "num_of_inputs":2, "gather_axis":"frequency", "key":-25, "loc":"-380.81971359252907 -289"}, -{"category":"memory", "text":"Data4", "data_volume":5, "key":-27, "loc":"-396.32812499999955 -253", "group":-25}, -{"category":"GroupBy", "text":"Group By 1", "isGroup":true, "group_key":-5, "group_axis":"frequency", "key":-28, "loc":"-555.3281249999995 -566.0000000000001"}, -{"category":"Comment", "text":"All data within each group\nis processed by Cpnt2", "key":-16, "loc":"-971.328125 -311"}, -{"category":"Comment", "text":"Data gathered from every 2 groups\nis processed by Cpnt3", "key":-19, "loc":"-335.328125 -416"}, -{"category":"Component", "text":"Component3", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-29, "loc":"-380.328125 -325", "group":-25}, -{"category":"Comment", "text":"Data of the same group_key value on the group_axis is gathered inside the same group", "key":-26, "loc":"-480.328125 -656"}, -{"category":"Comment", "text":"Sorry this is NOT Lofar Calibration pipeline", "key":-17, "loc":"-1130.328125 -825"} - ], - "linkDataArray": [ -{"from":-1, "to":-8, "fromPort":"B", "toPort":"T", "points":[-754.3281250000009,-797.0000000000003,-754.3281250000009,-787.0000000000003,-754.3281250000009,-704.2188621520996,-800.3281250000001,-704.2188621520996,-800.3281250000001,-621.4377243041989,-800.3281250000001,-611.4377243041989]}, -{"from":-3, "to":-2, "fromPort":"R", "toPort":"L", "points":[-1002.8728713989262,-608.0000000000002,-992.8728713989262,-608.0000000000002,-992.8728713989262,-608.0000000000002,-992.8728713989262,-540.9999999999992,-860.800201416017,-540.9999999999992,-850.800201416017,-540.9999999999992]}, -{"from":-8, "to":-2, "fromPort":"B", "toPort":"T", "points":[-800.3281250000001,-578.5622756958005,-800.3281250000001,-568.5622756958005,-800.3281250000001,-567.9999999999995,-800.3281250000014,-567.9999999999995,-800.3281250000014,-567.4377243041985,-800.3281250000014,-557.4377243041985]}, -{"from":-2, "to":-10, "fromPort":"B", "toPort":"T", "points":[-800.3281250000014,-524.5622756958,-800.3281250000014,-514.5622756958,-800.3281250000014,-510.99999999999943,-800.3281249999995,-510.99999999999943,-800.3281249999995,-507.43772430419875,-800.3281249999995,-497.43772430419875]}, -{"from":-21, "to":-23, "fromPort":"B", "toPort":"T", "points":[-1135.3281249999998,-453.5622756958002,-1135.3281249999998,-443.5622756958002,-1135.3281249999998,-438.4999999999997,-1137.3281249999998,-438.4999999999997,-1137.3281249999998,-433.4377243041992,-1137.3281249999998,-423.4377243041992]}, -{"from":-10, "to":-22, "fromPort":"R", "toPort":"T", "points":[-764.8728713989253,-480.9999999999996,-754.8728713989253,-480.9999999999996,-748,-480.9999999999996,-748,-480.9999999999996,-721.328125,-480.9999999999996,-721.328125,-426.4377243041992,-721.328125,-416.4377243041992]}, -{"from":-10, "to":-24, "fromPort":"L", "toPort":"R", "points":[-835.7833786010738,-480.99999999999955,-845.7833786010738,-480.99999999999955,-852,-480.99999999999955,-852,-480.99999999999955,-876,-480.99999999999955,-876,-453.1632812499999,-1068.8560485839841,-453.1632812499999,-1078.8560485839841,-453.1632812499999]}, -{"from":-10, "to":-14, "fromPort":"B", "toPort":"T", "points":[-800.3281249999995,-464.56227569580034,-800.3281249999995,-454.56227569580034,-800.3281249999995,-444,-800.3281249999995,-444,-800.3281249999995,-364,-796.9580968196937,-364,-796.9580968196937,-326.76428680419923,-796.9580968196937,-316.76428680419923]}, -{"from":-10, "to":-28, "fromPort":"R", "toPort":"L", "points":[-764.8728713989253,-480.99999999999955,-754.8728713989253,-480.99999999999955,-748,-480.99999999999955,-748,-480.99999999999955,-660,-480.99999999999955,-660,-580.6632812500003,-571.3281249999993,-580.6632812500003,-561.3281249999993,-580.6632812500003]}, -{"from":-28, "to":-25, "fromPort":"B", "toPort":"L", "points":[-33.83535590729249,-61.207674232613215,-33.83535590729249,-51.207674232613215,-33.83535590729249,9.13475769039826,-89.62485198496458,9.13475769039826,-89.62485198496458,-47.06727364578387,-79.62485198496458,-47.06727364578387]}, -{"from":-29, "to":-27, "fromPort":"B", "toPort":"T", "points":[-380.328125,-308.5622756958008,-380.328125,-298.5622756958008,-380.328125,-288.99999999999994,-396.32812499999955,-288.99999999999994,-396.32812499999955,-279.4377243041991,-396.32812499999955,-269.4377243041991]} - ]} + "nodeDataArray": [ + { + "category": "Start", + "text": "Start", + "key": -1, + "loc": "-754.3281250000008 -817.0000000000003" + }, + { + "category": "memory", + "text": "Data2", + "data_volume": 5, + "key": -3, + "loc": "-1038.3281250000005 -608.0000000000002" + }, + { + "category": "SplitData", + "text": "Scatter1", + "isGroup": true, + "num_of_splits": "5", + "scatter_axis": "time", + "key": -12, + "loc": "-765.8664207458503 -514.6218261718749" + }, + { + "category": "SplitData", + "text": "Scatter2", + "isGroup": true, + "num_of_splits": "4", + "scatter_axis": "frequency", + "key": -5, + "loc": "-800.3281250000013 -537.9999999999997", + "group": -12 + }, + { + "category": "Component", + "text": "Component1", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "-800.3281250000013 -540.9999999999994", + "group": -5 + }, + { + "category": "memory", + "text": "Data1", + "data_volume": 5, + "key": -8, + "loc": "-800.3281250000001 -594.9999999999997", + "group": -5 + }, + { + "category": "memory", + "text": "Data3", + "data_volume": 5, + "key": -10, + "loc": "-800.3281249999995 -480.99999999999955", + "group": -5 + }, + { + "category": "Component", + "text": "Component4", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -21, + "loc": "-1135.3281249999998 -469.9999999999997", + "group": -24 + }, + { + "category": "Component", + "text": "Component", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -22, + "loc": "-721.328125 -400", + "group": -12 + }, + { + "category": "memory", + "text": "Data5", + "data_volume": 5, + "key": -23, + "loc": "-1137.3281249999995 -407", + "group": -24 + }, + { + "category": "DataGather", + "text": "Gather", + "isGroup": true, + "num_of_inputs": 2, + "gather_axis": "frequency", + "key": -24, + "loc": "-1135.3281249999998 -438.4999999999999" + }, + { + "category": "GroupBy", + "text": "Group By 2", + "isGroup": true, + "group_key": -5, + "group_axis": "frequency", + "key": -14, + "loc": "-800.328125 -265" + }, + { + "category": "Component", + "text": "Component 2", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -20, + "loc": "-800.328125 -265", + "group": -14 + }, + { + "category": "DataGather", + "text": "Gather", + "isGroup": true, + "num_of_inputs": 2, + "gather_axis": "frequency", + "key": -25, + "loc": "-380.81971359252907 -289" + }, + { + "category": "memory", + "text": "Data4", + "data_volume": 5, + "key": -27, + "loc": "-396.32812499999955 -253", + "group": -25 + }, + { + "category": "GroupBy", + "text": "Group By 1", + "isGroup": true, + "group_key": -5, + "group_axis": "frequency", + "key": -28, + "loc": "-555.3281249999995 -566.0000000000001" + }, + { + "category": "Comment", + "text": "All data within each group\nis processed by Cpnt2", + "key": -16, + "loc": "-971.328125 -311" + }, + { + "category": "Comment", + "text": "Data gathered from every 2 groups\nis processed by Cpnt3", + "key": -19, + "loc": "-335.328125 -416" + }, + { + "category": "Component", + "text": "Component3", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -29, + "loc": "-380.328125 -325", + "group": -25 + }, + { + "category": "Comment", + "text": "Data of the same group_key value on the group_axis is gathered inside the same group", + "key": -26, + "loc": "-480.328125 -656" + }, + { + "category": "Comment", + "text": "Sorry this is NOT Lofar Calibration pipeline", + "key": -17, + "loc": "-1130.328125 -825" + } + ], + "linkDataArray": [ + { + "from": -1, + "to": -8, + "fromPort": "B", + "toPort": "T", + "points": [ + -754.3281250000009, + -797.0000000000003, + -754.3281250000009, + -787.0000000000003, + -754.3281250000009, + -704.2188621520996, + -800.3281250000001, + -704.2188621520996, + -800.3281250000001, + -621.4377243041989, + -800.3281250000001, + -611.4377243041989 + ] + }, + { + "from": -3, + "to": -2, + "fromPort": "R", + "toPort": "L", + "points": [ + -1002.8728713989262, + -608.0000000000002, + -992.8728713989262, + -608.0000000000002, + -992.8728713989262, + -608.0000000000002, + -992.8728713989262, + -540.9999999999992, + -860.800201416017, + -540.9999999999992, + -850.800201416017, + -540.9999999999992 + ] + }, + { + "from": -8, + "to": -2, + "fromPort": "B", + "toPort": "T", + "points": [ + -800.3281250000001, + -578.5622756958005, + -800.3281250000001, + -568.5622756958005, + -800.3281250000001, + -567.9999999999995, + -800.3281250000014, + -567.9999999999995, + -800.3281250000014, + -567.4377243041985, + -800.3281250000014, + -557.4377243041985 + ] + }, + { + "from": -2, + "to": -10, + "fromPort": "B", + "toPort": "T", + "points": [ + -800.3281250000014, + -524.5622756958, + -800.3281250000014, + -514.5622756958, + -800.3281250000014, + -510.99999999999943, + -800.3281249999995, + -510.99999999999943, + -800.3281249999995, + -507.43772430419875, + -800.3281249999995, + -497.43772430419875 + ] + }, + { + "from": -21, + "to": -23, + "fromPort": "B", + "toPort": "T", + "points": [ + -1135.3281249999998, + -453.5622756958002, + -1135.3281249999998, + -443.5622756958002, + -1135.3281249999998, + -438.4999999999997, + -1137.3281249999998, + -438.4999999999997, + -1137.3281249999998, + -433.4377243041992, + -1137.3281249999998, + -423.4377243041992 + ] + }, + { + "from": -10, + "to": -22, + "fromPort": "R", + "toPort": "T", + "points": [ + -764.8728713989253, + -480.9999999999996, + -754.8728713989253, + -480.9999999999996, + -748, + -480.9999999999996, + -748, + -480.9999999999996, + -721.328125, + -480.9999999999996, + -721.328125, + -426.4377243041992, + -721.328125, + -416.4377243041992 + ] + }, + { + "from": -10, + "to": -24, + "fromPort": "L", + "toPort": "R", + "points": [ + -835.7833786010738, + -480.99999999999955, + -845.7833786010738, + -480.99999999999955, + -852, + -480.99999999999955, + -852, + -480.99999999999955, + -876, + -480.99999999999955, + -876, + -453.1632812499999, + -1068.8560485839841, + -453.1632812499999, + -1078.8560485839841, + -453.1632812499999 + ] + }, + { + "from": -10, + "to": -14, + "fromPort": "B", + "toPort": "T", + "points": [ + -800.3281249999995, + -464.56227569580034, + -800.3281249999995, + -454.56227569580034, + -800.3281249999995, + -444, + -800.3281249999995, + -444, + -800.3281249999995, + -364, + -796.9580968196937, + -364, + -796.9580968196937, + -326.76428680419923, + -796.9580968196937, + -316.76428680419923 + ] + }, + { + "from": -10, + "to": -28, + "fromPort": "R", + "toPort": "L", + "points": [ + -764.8728713989253, + -480.99999999999955, + -754.8728713989253, + -480.99999999999955, + -748, + -480.99999999999955, + -748, + -480.99999999999955, + -660, + -480.99999999999955, + -660, + -580.6632812500003, + -571.3281249999993, + -580.6632812500003, + -561.3281249999993, + -580.6632812500003 + ] + }, + { + "from": -28, + "to": -25, + "fromPort": "B", + "toPort": "L", + "points": [ + -33.83535590729249, + -61.207674232613215, + -33.83535590729249, + -51.207674232613215, + -33.83535590729249, + 9.13475769039826, + -89.62485198496458, + 9.13475769039826, + -89.62485198496458, + -47.06727364578387, + -79.62485198496458, + -47.06727364578387 + ] + }, + { + "from": -29, + "to": -27, + "fromPort": "B", + "toPort": "T", + "points": [ + -380.328125, + -308.5622756958008, + -380.328125, + -298.5622756958008, + -380.328125, + -288.99999999999994, + -396.32812499999955, + -288.99999999999994, + -396.32812499999955, + -279.4377243041991, + -396.32812499999955, + -269.4377243041991 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/test_lg_fill.py b/daliuge-translator/test/dropmake/test_lg_fill.py index 86a11ceb4..12eb84349 100644 --- a/daliuge-translator/test/dropmake/test_lg_fill.py +++ b/daliuge-translator/test/dropmake/test_lg_fill.py @@ -20,15 +20,16 @@ # MA 02111-1307 USA # -import unittest +import json import os -import pkg_resources +import unittest +import pkg_resources from dlg.dropmake import pg_generator -import json lg_dir = pkg_resources.resource_filename(__name__, 'logical_graphs') # @UndefinedVariable + class LGFillTest(unittest.TestCase): def test_fill_lg(self): @@ -43,4 +44,4 @@ def test_fill_lg(self): with open(os.path.join(lg_dir, 'chiles_simple.json')) as f: lg = pg_generator.fill(json.load(f), params) for node_idx, value in zip((20, 21, 22, 23), ('1', '2', 'True', 'hi')): - self.assertEqual(lg['nodeDataArray'][node_idx]['Arg10'], value) \ No newline at end of file + self.assertEqual(lg['nodeDataArray'][node_idx]['Arg10'], value) diff --git a/daliuge-translator/test/dropmake/test_lgweb.py b/daliuge-translator/test/dropmake/test_lgweb.py index 441eeb51b..b8fee3fe9 100644 --- a/daliuge-translator/test/dropmake/test_lgweb.py +++ b/daliuge-translator/test/dropmake/test_lgweb.py @@ -26,9 +26,7 @@ import unittest import pkg_resources - import six.moves.urllib_parse as urllib # @UnresolvedImport - from dlg import common from dlg.common import tool from dlg.restutils import RestClient, RestClientException @@ -36,6 +34,7 @@ lg_dir = pkg_resources.resource_filename(__name__, '.') # @UndefinedVariable lgweb_port = 8000 + class TestLGWeb(unittest.TestCase): def setUp(self): @@ -52,7 +51,8 @@ def tearDown(self): unittest.TestCase.tearDown(self) def _generate_pgt(self, c): - c._GET('/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') + c._GET( + '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') def test_get_lgjson(self): @@ -100,16 +100,19 @@ def test_gen_pgt(self): c = RestClient('localhost', lgweb_port, 10) # doesn't exist! - self.assertRaises(RestClientException, c._GET, '/gen_pgt?lg_name=doesnt_exist.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') + self.assertRaises(RestClientException, c._GET, + '/gen_pgt?lg_name=doesnt_exist.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') # unknown algorithm - self.assertRaises(RestClientException, c._GET, '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=noidea') + self.assertRaises(RestClientException, c._GET, + '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=noidea') # this should work now self._generate_pgt(c) def test_get_pgtjson(self): c = RestClient('localhost', lgweb_port, 10) - c._GET('/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') + c._GET( + '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') # doesn't exist self.assertRaises(RestClientException, c._get_json, '/pgt_jsonbody?pgt_name=unknown.json') @@ -137,7 +140,7 @@ def test_get_pgt_post(self): 'par_label': 'Partition', 'max_load_imb': 100, 'max_cpu': 8 - } + } # POST form to /gen_pgt try: @@ -169,7 +172,6 @@ def test_pg_viewer(self): # also fine, PGT exists c._GET('/pg_viewer?pgt_view_name=logical_graphs/chiles_simple1_pgt.json') - def _test_pgt_action(self, path, unknown_fails): c = RestClient('localhost', lgweb_port, 10) diff --git a/daliuge-translator/test/dropmake/test_pg_gen.py b/daliuge-translator/test/dropmake/test_pg_gen.py index 27e86676b..78c6035dd 100644 --- a/daliuge-translator/test/dropmake/test_pg_gen.py +++ b/daliuge-translator/test/dropmake/test_pg_gen.py @@ -19,46 +19,49 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -import unittest, pkg_resources +import unittest -from dlg.dropmake.pg_generator import LG, PGT, MetisPGTP, MySarkarPGTP,\ - MinNumPartsPGTP, GPGTNoNeedMergeException +import pkg_resources +from dlg.dropmake.pg_generator import LG, PGT, MetisPGTP, MySarkarPGTP, \ + MinNumPartsPGTP, GPGTNoNeedMergeException """ python -m unittest test.dropmake.test_pg_gen """ + def get_lg_fname(lg_name): return pkg_resources.resource_filename(__name__, 'logical_graphs/{0}'.format(lg_name)) # @UndefinedVariable + class TestPGGen(unittest.TestCase): def test_pg_generator(self): fp = get_lg_fname('lofar_std.json') - #fp = '/Users/Chen/proj/dfms/dfms/lg/web/lofar_std.json' + # fp = '/Users/Chen/proj/dfms/dfms/lg/web/lofar_std.json' lg = LG(fp) self.assertEqual(len(lg._done_dict.keys()), 36) drop_list = lg.unroll_to_tpl() - #print json.dumps(drop_list, indent=2) - #pprint.pprint(drop_list) - #pprint.pprint(dict(lg._drop_dict)) - #input_dict = defaultdict(list) - #lg.to_pg_tpl(input_dict) + # print json.dumps(drop_list, indent=2) + # pprint.pprint(drop_list) + # pprint.pprint(dict(lg._drop_dict)) + # input_dict = defaultdict(list) + # lg.to_pg_tpl(input_dict) def test_pg_test(self): fp = get_lg_fname('test_grpby_gather.json') lg = LG(fp) lg.unroll_to_tpl() - #input_dict = defaultdict(list) - #lg.to_pg_tpl(input_dict) - #pprint.pprint(dict(lg._drop_dict)) + # input_dict = defaultdict(list) + # lg.to_pg_tpl(input_dict) + # pprint.pprint(dict(lg._drop_dict)) def test_pgt_to_json(self): fp = get_lg_fname('lofar_std.json') lg = LG(fp) drop_list = lg.unroll_to_tpl() pgt = PGT(drop_list) - #print pgt.to_gojs_json() + # print pgt.to_gojs_json() def test_metis_pgtp(self): lgnames = ['lofar_std.json', 'test_grpby_gather.json', 'chiles_simple.json'] @@ -79,7 +82,7 @@ def test_metis_pgtp_gen_pg(self): lg = LG(fp) drop_list = lg.unroll_to_tpl() pgtp = MetisPGTP(drop_list, 3, merge_parts=True) - #pgtp.json + # pgtp.json pgtp.to_gojs_json(visual=False) pg_spec = pgtp.to_pg_spec(node_list) # with open('/tmp/met_{0}_pgspec.json'.format(lgn.split('.')[0]), 'w') as f: @@ -121,7 +124,7 @@ def test_mysarkar_pgtp_gen_pg(self): lg = LG(fp) drop_list = lg.unroll_to_tpl() pgtp = MySarkarPGTP(drop_list, 3, merge_parts=True) - #pgtp.json + # pgtp.json pgtp.to_gojs_json(visual=False) pg_spec = pgtp.to_pg_spec(node_list) @@ -137,7 +140,7 @@ def test_mysarkar_pgtp_gen_pg_island(self): pgtp = MySarkarPGTP(drop_list, None, merge_parts=True) pgtp.to_gojs_json(visual=False) nb_islands = 2 - #print(lgn) + # print(lgn) try: pgtp.merge_partitions(len(node_list) - nb_islands, form_island=False) except GPGTNoNeedMergeException as ge: @@ -147,7 +150,7 @@ def test_mysarkar_pgtp_gen_pg_island(self): def test_minnumparts_pgtp(self): lgnames = ['lofar_std.json', 'test_grpby_gather.json', 'chiles_simple.json'] - #tgt_partnum = [15, 15, 10, 10, 5] + # tgt_partnum = [15, 15, 10, 10, 5] tgt_deadline = [200, 300, 90, 80, 160] for i, lgn in enumerate(lgnames): fp = get_lg_fname(lgn) diff --git a/daliuge-translator/test/dropmake/test_scheduler.py b/daliuge-translator/test/dropmake/test_scheduler.py index 88c3d9def..63e8de299 100644 --- a/daliuge-translator/test/dropmake/test_scheduler.py +++ b/daliuge-translator/test/dropmake/test_scheduler.py @@ -24,32 +24,32 @@ import pkg_resources import psutil - from dlg.dropmake.pg_generator import LG from dlg.dropmake.scheduler import (Scheduler, MySarkarScheduler, DAGUtil, -Partition, MinNumPartsScheduler, PSOScheduler, SAScheduler, MCTSScheduler) - + Partition, MinNumPartsScheduler, PSOScheduler, SAScheduler, MCTSScheduler) if 'DALIUGE_TESTS_RUNLONGTESTS' in os.environ: skip_long_tests = not bool(os.environ['DALIUGE_TESTS_RUNLONGTESTS']) else: if ((psutil.Process().username().lower() in ('chen', 'cwu')) and - bool(int(os.environ.get('TEST_PSO_SCHEDULER', 0)))): + bool(int(os.environ.get('TEST_PSO_SCHEDULER', 0)))): skip_long_tests = False else: skip_long_tests = True + def get_lg_fname(lg_name): return pkg_resources.resource_filename(__name__, 'logical_graphs/{0}'.format(lg_name)) # @UndefinedVariable + class TestScheduler(unittest.TestCase): def test_incremental_antichain(self): part = Partition(100, 8) G = part._dag - assert(part.probe_max_dop(1, 2, True, True, True) == DAGUtil.get_max_dop(part._dag)) + assert (part.probe_max_dop(1, 2, True, True, True) == DAGUtil.get_max_dop(part._dag)) G.add_edge(2, 3) - assert(part.probe_max_dop(2, 3, False, True, True) == DAGUtil.get_max_dop(part._dag)) + assert (part.probe_max_dop(2, 3, False, True, True) == DAGUtil.get_max_dop(part._dag)) # G.add_edge(1, 4) # assert(part.probe_max_dop(1, 4, False, True, True) == DAGUtil.get_max_dop(part._dag)) # G.add_edge(2, 5) @@ -90,7 +90,7 @@ def test_mysarkar_scheduler(self): part.schedule.schedule_matrix DAGUtil.ganttchart_matrix(part.schedule._dag, part.schedule._topo_sort) """ - #mys.merge_partitions(numparts) + # mys.merge_partitions(numparts) @unittest.skipIf(skip_long_tests, "Skipping because they take too long. Chen to eventually shorten them") def test_pso_scheduler(self): diff --git a/daliuge-translator/test/test_tool.py b/daliuge-translator/test/test_tool.py index 2b3a5c37d..8015bea08 100644 --- a/daliuge-translator/test/test_tool.py +++ b/daliuge-translator/test/test_tool.py @@ -24,16 +24,15 @@ import unittest import pkg_resources - -from dlg.common import tool from dlg import common +from dlg.common import tool class TestTool(unittest.TestCase): def test_pipeline(self): """A pipeline from an LG all the way to a finished graph execution""" - lg = pkg_resources.resource_filename( # @UndefinedVariable + lg = pkg_resources.resource_filename( # @UndefinedVariable 'test.dropmake', 'logical_graphs/lofar_std.json') fill = tool.start_process('fill', ['-L', lg], stdout=subprocess.PIPE) @@ -48,4 +47,4 @@ def test_pipeline(self): # It's valid JSON content, and actually a physical graph mapped_graph = json.loads(common.b2s(mapped_graph)) self.assertTrue(list(common.get_roots(mapped_graph))) - self.assertTrue(list(common.get_leaves(mapped_graph))) \ No newline at end of file + self.assertTrue(list(common.get_leaves(mapped_graph))) diff --git a/docs/api/apps.rst b/docs/api/apps.rst index a6c434a2f..87b1bd085 100644 --- a/docs/api/apps.rst +++ b/docs/api/apps.rst @@ -1,4 +1,3 @@ - .. _api.dlg.apps: dlg.apps diff --git a/docs/conf.py b/docs/conf.py index 4188b0162..823173b2e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,12 +13,12 @@ # serve to show the default. import os -import shlex import subprocess import sys read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True' + def prepare_for_docs(path): # Run "python setup.py build" to generate the version.py files, and make # packages available for documenting their APIs @@ -27,11 +27,11 @@ def prepare_for_docs(path): if read_the_docs_build: subprocess.Popen([sys.executable, 'setup.py', 'build'], cwd=path).wait() + prepare_for_docs('../daliuge-common') prepare_for_docs('../daliuge-translator') prepare_for_docs('../daliuge-runtime') - # Mock the rest of the external modules we need so the API autodoc # gets correctly generated try: @@ -39,18 +39,19 @@ def prepare_for_docs(path): except: from mock import Mock as MagicMock + class Mock(MagicMock): @classmethod def __getattr__(cls, _): return MagicMock() + MOCK_MODULES = ("boto3", "botocore", "bottle", "configobj", "crc32c", "dill", - "docker", "lockfile", "metis", "netifaces", "networkx", "numpy", - "paramiko", "paramiko.client", "paramiko.rsakey", "psutil", - "pyswarm", "python-daemon", "pyzmq", "scp", "zeroconf", "zerorpc") + "docker", "lockfile", "metis", "netifaces", "networkx", "numpy", + "paramiko", "paramiko.client", "paramiko.rsakey", "psutil", + "pyswarm", "python-daemon", "pyzmq", "scp", "zeroconf", "zerorpc") sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) - # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. @@ -75,7 +76,7 @@ def __getattr__(cls, _): source_suffix = '.rst' # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' @@ -108,9 +109,9 @@ def __getattr__(cls, _): # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -118,27 +119,27 @@ def __getattr__(cls, _): # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True @@ -159,26 +160,26 @@ def __getattr__(cls, _): # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -188,62 +189,62 @@ def __getattr__(cls, _): # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -#html_extra_path = [] +# html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' +# html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} +# html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' +# html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'daliugedoc' @@ -251,46 +252,46 @@ def __getattr__(cls, _): # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', -# Latex figure (float) alignment -#'figure_align': 'htbp', + # Latex figure (float) alignment + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'daliuge.tex', u'daliuge Documentation', - u'ICRAR', 'manual'), + (master_doc, 'daliuge.tex', u'daliuge Documentation', + u'ICRAR', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- @@ -303,7 +304,7 @@ def __getattr__(cls, _): ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -312,19 +313,19 @@ def __getattr__(cls, _): # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'daliuge', u'daliuge Documentation', - author, 'daliuge', 'One line description of project.', - 'Miscellaneous'), + (master_doc, 'daliuge', u'daliuge Documentation', + author, 'daliuge', 'One line description of project.', + 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False diff --git a/docs/index.rst b/docs/index.rst index da12c7019..6f0aef01e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ .. daliuge documentation master file, created by - sphinx-quickstart on Mon Feb 8 16:19:47 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. +sphinx-quickstart on Mon Feb 8 16:19:47 2016. +You can adapt this file completely to your liking, but it should at least +contain the root `toctree` directive. |daliuge| ######### diff --git a/docs/intro.rst b/docs/intro.rst index f5f00aef2..216776e83 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -1,4 +1,3 @@ - .. _intro: Introduction diff --git a/docs/managers.rst b/docs/managers.rst index 2285ba142..1bacf0ab6 100644 --- a/docs/managers.rst +++ b/docs/managers.rst @@ -1,4 +1,3 @@ - .. _drop.managers: DROP Managers diff --git a/docs/reference.rst b/docs/reference.rst index cab9e6b97..87ee37580 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -1,4 +1,3 @@ - .. _overview.refs: References From 020287bbd89a12256742f6e3489127f627171cdb Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 May 2020 16:03:18 +0800 Subject: [PATCH 004/484] Code cleanup --- .travis.yml | 24 +- OpenAPI/tests/managers_test_client.py | 1 - OpenAPI/tests/translator_test_client.py | 3 +- daliuge-common/dlg/__init__.py | 2 +- daliuge-common/dlg/clients.py | 14 +- daliuge-common/dlg/common/__init__.py | 10 +- daliuge-common/dlg/common/network.py | 9 +- daliuge-common/dlg/common/osutils.py | 3 +- daliuge-common/dlg/common/streams.py | 4 +- daliuge-common/dlg/common/tool.py | 17 +- daliuge-common/dlg/constants.py | 9 +- daliuge-common/dlg/exceptions.py | 13 +- daliuge-common/dlg/restutils.py | 23 +- daliuge-common/dlg/version_helper.py | 4 +- daliuge-common/setup.py | 2 + daliuge-runtime/dlg/__init__.py | 2 +- daliuge-runtime/dlg/apps/__init__.py | 3 +- daliuge-runtime/dlg/apps/archiving.py | 12 +- daliuge-runtime/dlg/apps/bash_shell_app.py | 37 +- daliuge-runtime/dlg/apps/crc.py | 4 +- daliuge-runtime/dlg/apps/dockerapp.py | 54 +- daliuge-runtime/dlg/apps/dynlib.py | 2 +- daliuge-runtime/dlg/apps/fileimport.py | 12 +- daliuge-runtime/dlg/apps/mpi.py | 17 +- daliuge-runtime/dlg/apps/pyfunc.py | 9 +- daliuge-runtime/dlg/apps/scp.py | 6 +- daliuge-runtime/dlg/apps/simple.py | 3 +- daliuge-runtime/dlg/apps/socket_listener.py | 3 +- daliuge-runtime/dlg/apps/spead_receiver.py | 22 +- daliuge-runtime/dlg/dask_emulation.py | 22 +- daliuge-runtime/dlg/deploy/common.py | 12 +- .../dlg/deploy/pawsey/dfms_monitor.py | 44 +- .../dlg/deploy/pawsey/dfms_proxy.py | 32 +- .../dlg/deploy/pawsey/ipython_notebook_toc.js | 106 +- daliuge-runtime/dlg/deploy/pawsey/remotes.py | 6 +- .../dlg/deploy/pawsey/scale_test.py | 118 +- .../dlg/deploy/pawsey/slurm_utils.py | 6 +- .../dlg/deploy/pawsey/start_dfms_cluster.py | 80 +- .../dlg/deploy/utils/monitor_replayer.py | 84 +- daliuge-runtime/dlg/drop.py | 104 +- daliuge-runtime/dlg/droputils.py | 45 +- daliuge-runtime/dlg/event.py | 5 +- daliuge-runtime/dlg/graph_loader.py | 60 +- daliuge-runtime/dlg/io.py | 71 +- daliuge-runtime/dlg/lifecycle/__init__.py | 2 +- daliuge-runtime/dlg/lifecycle/dlm.py | 23 +- daliuge-runtime/dlg/lifecycle/hsm/__init__.py | 2 +- daliuge-runtime/dlg/lifecycle/hsm/manager.py | 4 +- daliuge-runtime/dlg/lifecycle/hsm/store.py | 25 +- daliuge-runtime/dlg/lifecycle/registry.py | 35 +- daliuge-runtime/dlg/manager/client.py | 3 +- daliuge-runtime/dlg/manager/cmdline.py | 55 +- .../dlg/manager/composite_manager.py | 17 +- daliuge-runtime/dlg/manager/constants.py | 3 +- daliuge-runtime/dlg/manager/drop_manager.py | 2 +- daliuge-runtime/dlg/manager/node_manager.py | 26 +- daliuge-runtime/dlg/manager/proc_daemon.py | 40 +- daliuge-runtime/dlg/manager/replay.py | 8 +- daliuge-runtime/dlg/manager/rest.py | 103 +- daliuge-runtime/dlg/manager/session.py | 26 +- daliuge-runtime/dlg/manager/web/dim.html | 211 +- daliuge-runtime/dlg/manager/web/dm.html | 127 +- daliuge-runtime/dlg/manager/web/session.html | 539 +- .../dlg/manager/web/static/css/session.css | 124 +- .../fonts/glyphicons-halflings-regular.svg | 825 +- .../dlg/manager/web/static/js/dm.js | 778 +- daliuge-runtime/dlg/ngaslite.py | 8 +- daliuge-runtime/dlg/remote.py | 19 +- .../dlg/reproducibility/__jnit__.py | 2 +- daliuge-runtime/dlg/restserver.py | 4 +- daliuge-runtime/dlg/rpc.py | 61 +- daliuge-runtime/dlg/runtime/__init__.py | 6 +- daliuge-runtime/dlg/runtime/tool_commands.py | 10 +- daliuge-runtime/dlg/shoreClient.py | 62 +- daliuge-runtime/dlg/testutils.py | 7 +- daliuge-runtime/dlg/utils.py | 57 +- daliuge-runtime/fabfile/APPspecific.py | 96 +- daliuge-runtime/fabfile/__init__.py | 7 - daliuge-runtime/setup.py | 4 +- daliuge-runtime/test/__init__.py | 4 +- daliuge-runtime/test/apps/__init__.py | 2 +- daliuge-runtime/test/apps/test_bash.py | 15 +- daliuge-runtime/test/apps/test_crc.py | 3 +- daliuge-runtime/test/apps/test_docker.py | 20 +- daliuge-runtime/test/apps/test_dynlib.py | 7 +- daliuge-runtime/test/apps/test_dynlib2.py | 7 +- daliuge-runtime/test/apps/test_fileimport.py | 23 +- daliuge-runtime/test/apps/test_pyfunc.py | 32 +- daliuge-runtime/test/apps/test_simple.py | 2 +- daliuge-runtime/test/apps/test_socket.py | 11 +- daliuge-runtime/test/apps/test_spead.py | 9 +- daliuge-runtime/test/deploy/test_common.py | 16 +- .../test/deploy/test_slurm_utils.py | 1 + daliuge-runtime/test/graphs/complex.js | 306 +- daliuge-runtime/test/integrate/__init__.py | 2 +- .../test/integrate/chiles/__init__.py | 2 +- .../test/integrate/chiles/chilesdo.py | 94 +- .../test/integrate/chiles/chilesdoapp.py | 75 +- .../test/integrate/chiles/chilesdospec.py | 108 +- .../integrate/chiles/chilesdospec_docker.py | 107 +- .../test/integrate/example_split.py | 25 +- daliuge-runtime/test/integrate/freq_split.py | 85 +- .../integrate/msconverter/ms_converter.py | 24 +- daliuge-runtime/test/lifecycle/__init__.py | 2 +- daliuge-runtime/test/lifecycle/test_dlm.py | 7 +- .../test/lifecycle/test_registry.py | 12 +- daliuge-runtime/test/manager/__init__.py | 2 +- daliuge-runtime/test/manager/test_daemon.py | 29 +- daliuge-runtime/test/manager/test_dim.py | 47 +- daliuge-runtime/test/manager/test_dm.py | 22 +- daliuge-runtime/test/manager/test_mm.py | 53 +- daliuge-runtime/test/manager/test_rest.py | 22 +- .../test/manager/test_scalability.py | 17 +- daliuge-runtime/test/manager/testutils.py | 8 +- daliuge-runtime/test/memoryUsage.py | 17 +- daliuge-runtime/test/test_JsonDrop.py | 2 +- daliuge-runtime/test/test_S3Drop.py | 3 +- daliuge-runtime/test/test_dask_emulation.py | 32 +- daliuge-runtime/test/test_drop.py | 101 +- daliuge-runtime/test/test_droputils.py | 52 +- daliuge-runtime/test/test_graph_loader.py | 25 +- daliuge-runtime/test/test_io.py | 4 +- daliuge-runtime/test/test_session.py | 48 +- daliuge-runtime/test/test_tool.py | 2 +- daliuge-runtime/test/test_utils.py | 31 +- daliuge-translator/dlg/__init__.py | 2 +- daliuge-translator/dlg/dropmake/dm_utils.py | 8 +- .../dlg/dropmake/dropmake_api.py | 20 +- .../dlg/dropmake/pg_generator.py | 191 +- daliuge-translator/dlg/dropmake/pg_manager.py | 4 +- daliuge-translator/dlg/dropmake/pg_mapper.py | 13 +- .../dlg/dropmake/plot_lpl_parts.py | 36 +- daliuge-translator/dlg/dropmake/scheduler.py | 331 +- .../dlg/dropmake/stage_scheduler.py | 7 +- .../dlg/dropmake/utils/__init__.py | 1 - .../dlg/dropmake/utils/anneal.py | 30 +- .../dlg/dropmake/utils/antichains.py | 110 +- .../dlg/dropmake/utils/bash_parameter.py | 18 +- .../dlg/dropmake/utils/heft/base.py | 21 +- .../dlg/dropmake/utils/heft/dlg_heft.py | 41 +- .../dlg/dropmake/utils/heft/test.py | 88 +- daliuge-translator/dlg/dropmake/utils/mcts.py | 22 +- .../dlg/dropmake/web/Inspector_test.css | 116 +- .../dlg/dropmake/web/Inspector_test.js | 2042 +- .../dlg/dropmake/web/__init__.py | 1 - daliuge-translator/dlg/dropmake/web/go.js | 35734 +++++++++++++++- .../dlg/dropmake/web/jquery.min.map | 1212 +- .../dlg/dropmake/web/jsoneditor.map | 3227 +- .../dlg/dropmake/web/lg_editor.html | 3589 +- daliuge-translator/dlg/dropmake/web/lg_web.py | 13 +- .../dlg/dropmake/web/matrix_vis.html | 365 +- .../dlg/dropmake/web/pg_viewer.html | 1115 +- daliuge-translator/dlg/translator/__init__.py | 2 +- .../dlg/translator/tool_commands.py | 35 +- daliuge-translator/setup.py | 2 +- daliuge-translator/test/__init__.py | 4 +- daliuge-translator/test/dropmake/__init__.py | 2 +- .../logical_graphs/chiles_simple.json | 876 +- .../dropmake/logical_graphs/cont_img.json | 1433 +- .../dropmake/logical_graphs/eagle_gather.json | 1161 +- .../logical_graphs/eagle_gather_empty.json | 887 +- .../logical_graphs/eagle_gather_simple.json | 1066 +- .../dropmake/logical_graphs/lofar_std.json | 1254 +- .../logical_graphs/test_grpby_gather.json | 493 +- .../test/dropmake/test_lg_fill.py | 9 +- .../test/dropmake/test_lgweb.py | 18 +- .../test/dropmake/test_pg_gen.py | 37 +- .../test/dropmake/test_scheduler.py | 14 +- daliuge-translator/test/test_tool.py | 7 +- docs/api/apps.rst | 1 - docs/conf.py | 123 +- docs/index.rst | 6 +- docs/intro.rst | 1 - docs/managers.rst | 1 - docs/reference.rst | 1 - .../constants.py | 5 +- 176 files changed, 52843 insertions(+), 8910 deletions(-) rename {daliuge-runtime/dlg/reproducibility => reproducibility}/constants.py (56%) diff --git a/.travis.yml b/.travis.yml index a19f06201..08723dd54 100644 --- a/.travis.yml +++ b/.travis.yml @@ -43,28 +43,28 @@ matrix: # We want to use docker during the tests services: - - docker + - docker # Try to speed up builds by caching our dependencies cache: pip before_install: - - pip install -U coveralls pytest pytest-cov - - pip install -U setuptools pip wheel + - pip install -U coveralls pytest pytest-cov + - pip install -U setuptools pip wheel install: - - pip install -e daliuge-common/ - - test -n "$NO_DLG_TRANSLATOR" || pip install -e daliuge-translator/ - - test -n "$NO_DLG_RUNTIME" || pip install -e daliuge-runtime/ + - pip install -e daliuge-common/ + - test -n "$NO_DLG_TRANSLATOR" || pip install -e daliuge-translator/ + - test -n "$NO_DLG_RUNTIME" || pip install -e daliuge-runtime/ # run the tests, making sure subprocesses generate coverage information script: - - COVFILES= - - test -n "$NO_DLG_TRANSLATOR" || { (cd daliuge-translator && py.test --cov) && COVFILES+=" daliuge-translator/.coverage"; } - - test -n "$NO_DLG_RUNTIME" || { (cd daliuge-runtime && py.test --cov) && COVFILES+=" daliuge-runtime/.coverage"; } - - coverage combine $COVFILES - - test -z "$TEST_OPENAPI" || (cd OpenAPI/tests && ./test_managers_openapi.sh) + - COVFILES= + - test -n "$NO_DLG_TRANSLATOR" || { (cd daliuge-translator && py.test --cov) && COVFILES+=" daliuge-translator/.coverage"; } + - test -n "$NO_DLG_RUNTIME" || { (cd daliuge-runtime && py.test --cov) && COVFILES+=" daliuge-runtime/.coverage"; } + - coverage combine $COVFILES + - test -z "$TEST_OPENAPI" || (cd OpenAPI/tests && ./test_managers_openapi.sh) # Publish to coveralls (only once per commit, so only using one environment) after_success: - - coveralls + - coveralls diff --git a/OpenAPI/tests/managers_test_client.py b/OpenAPI/tests/managers_test_client.py index cb026f139..8d0b6b298 100644 --- a/OpenAPI/tests/managers_test_client.py +++ b/OpenAPI/tests/managers_test_client.py @@ -1,7 +1,6 @@ import composite_manager_client as cmc import node_manager_client as nmc - nm_config = nmc.Configuration() nm_config.host = "127.0.0.1:8000" dim_config = cmc.Configuration() diff --git a/OpenAPI/tests/translator_test_client.py b/OpenAPI/tests/translator_test_client.py index 2e9be115b..9405dba1e 100644 --- a/OpenAPI/tests/translator_test_client.py +++ b/OpenAPI/tests/translator_test_client.py @@ -2,7 +2,6 @@ import translator_client as tc - translator_config = tc.Configuration() translator_config.host = "127.0.0.1:8084" @@ -12,7 +11,7 @@ with tc.ApiClient(translator_config) as translator_client: translator = tc.DefaultApi(translator_client) html_content = translator.gen_pgt(json_data=graph, - lg_name='test', algo='metis', num_islands=1) + lg_name='test', algo='metis', num_islands=1) print(html_content) html_content = translator.gen_pg( pgt_id='test', dlg_mgr_host='127.0.0.1', dlg_mgr_port=8001) diff --git a/daliuge-common/dlg/__init__.py b/daliuge-common/dlg/__init__.py index cfb3574be..74d07706f 100644 --- a/daliuge-common/dlg/__init__.py +++ b/daliuge-common/dlg/__init__.py @@ -21,4 +21,4 @@ # # Declaring this as a namespace package -__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment \ No newline at end of file +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment diff --git a/daliuge-common/dlg/clients.py b/daliuge-common/dlg/clients.py index 81690ba64..5d99de6b8 100644 --- a/daliuge-common/dlg/clients.py +++ b/daliuge-common/dlg/clients.py @@ -27,10 +27,10 @@ from . import constants from .restutils import RestClient - logger = logging.getLogger(__name__) compress = os.environ.get('DALIUGE_COMPRESSED_JSON', True) + class BaseDROPManagerClient(RestClient): """ Base class for REST clients that talk to the DROP managers. @@ -97,7 +97,8 @@ def graph(self, sessionId): the DROP specifications. """ graph = self._get_json('/sessions/%s/graph' % (urllib.quote(sessionId),)) - logger.debug('Successfully read graph (%d nodes) from session %s on %s:%s', len(graph), sessionId, self.host, self.port) + logger.debug('Successfully read graph (%d nodes) from session %s on %s:%s', len(graph), sessionId, self.host, + self.port) return graph def sessions(self): @@ -142,10 +143,12 @@ def graph_size(self, sessionId): getGraphSize = graph_size getGraph = graph + class NodeManagerClient(BaseDROPManagerClient): """ A NodeManager REST client """ + def __init__(self, host='localhost', port=constants.NODE_DEFAULT_REST_PORT, timeout=10): super(NodeManagerClient, self).__init__(host=host, port=port, timeout=timeout) @@ -158,6 +161,7 @@ def trigger_drops(self, sessionId, drop_uids): def shutdown_node_manager(self): self._GET('/shutdown') + class CompositeManagerClient(BaseDROPManagerClient): def nodes(self): @@ -169,19 +173,23 @@ def add_node(self, node): def remove_node(self, node): self._DELETE('/nodes/%s' % (node,)) + class DataIslandManagerClient(CompositeManagerClient): """ A DataIslandManager REST client """ + def __init__(self, host='localhost', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=10): super(DataIslandManagerClient, self).__init__(host=host, port=port, timeout=timeout) + class MasterManagerClient(CompositeManagerClient): """ A MasterManager REST client """ + def __init__(self, host='localhost', port=constants.MASTER_DEFAULT_REST_PORT, timeout=10): super(MasterManagerClient, self).__init__(host=host, port=port, timeout=timeout) def create_island(self, island_host, nodes): - self._post_json('/managers/%s/dataisland' % (urllib.quote(island_host)), {'nodes': nodes}) \ No newline at end of file + self._post_json('/managers/%s/dataisland' % (urllib.quote(island_host)), {'nodes': nodes}) diff --git a/daliuge-common/dlg/common/__init__.py b/daliuge-common/dlg/common/__init__.py index a161fc6bd..1b56134a7 100644 --- a/daliuge-common/dlg/common/__init__.py +++ b/daliuge-common/dlg/common/__init__.py @@ -22,8 +22,8 @@ """Common utilities used by daliuge packages""" import sys -from .osutils import terminate_or_kill, wait_or_kill from .network import check_port, connect_to, portIsClosed, portIsOpen, write_to +from .osutils import terminate_or_kill, wait_or_kill from .streams import ZlibCompressedStream, JSONStream STORAGE_TYPES = {'memory', 'file', 'ngas', 'null', 'json'} @@ -59,6 +59,7 @@ class dropdict(dict): repositories where graph templates are expected to be found by the DROPManager. """ + def _addSomething(self, other, key): if key not in self: self[key] = [] @@ -67,14 +68,19 @@ def _addSomething(self, other, key): def addConsumer(self, other): self._addSomething(other, 'consumers') + def addStreamingConsumer(self, other): self._addSomething(other, 'streamingConsumers') + def addInput(self, other): self._addSomething(other, 'inputs') + def addStreamingInput(self, other): self._addSomething(other, 'streamingInputs') + def addOutput(self, other): self._addSomething(other, 'outputs') + def addProducer(self, other): self._addSomething(other, 'producers') @@ -138,4 +144,4 @@ def get_leaves(pg_spec): if dropspec.get('consumers', None) or dropspec.get('streamingConsumers', None): nonleaves.add(oid) - return all_oids - nonleaves \ No newline at end of file + return all_oids - nonleaves diff --git a/daliuge-common/dlg/common/network.py b/daliuge-common/dlg/common/network.py index 4a9e151db..665efab4d 100644 --- a/daliuge-common/dlg/common/network.py +++ b/daliuge-common/dlg/common/network.py @@ -19,15 +19,15 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import contextlib import errno import logging import socket import time -import contextlib - logger = logging.getLogger(__name__) + def check_port(host, port, timeout=0, checking_open=True, return_socket=False): """ Checks that the port specified by ``host``:``port`` is either open or @@ -127,12 +127,14 @@ def portIsClosed(host, port, timeout): """ return check_port(host, port, timeout=timeout, checking_open=False) + def portIsOpen(host, port, timeout=0): """ Checks if a given ``host``/``port`` is open, with a given ``timeout``. """ return check_port(host, port, timeout=timeout, checking_open=True) + def connect_to(host, port, timeout=None): """ Connects to ``host``:``port`` within the given timeout and return the @@ -144,6 +146,7 @@ def connect_to(host, port, timeout=None): raise socket.timeout() return s + def write_to(host, port, data, timeout=None): """ Connects to ``host``:``port`` within the given timeout and write the given @@ -151,4 +154,4 @@ def write_to(host, port, data, timeout=None): """ sock = connect_to(host, port, timeout=timeout) with contextlib.closing(sock): - sock.send(data) \ No newline at end of file + sock.send(data) diff --git a/daliuge-common/dlg/common/osutils.py b/daliuge-common/dlg/common/osutils.py index 9464a5512..8e073e15b 100644 --- a/daliuge-common/dlg/common/osutils.py +++ b/daliuge-common/dlg/common/osutils.py @@ -24,9 +24,9 @@ import math import time - logger = logging.getLogger(__name__) + def terminate_or_kill(proc, timeout): """ Terminates a process and waits until it has completed its execution within @@ -41,6 +41,7 @@ def terminate_or_kill(proc, timeout): proc.terminate() wait_or_kill(proc, timeout) + def wait_or_kill(proc, timeout, period=0.1): waitLoops = 0 max_loops = math.ceil(timeout / period) diff --git a/daliuge-common/dlg/common/streams.py b/daliuge-common/dlg/common/streams.py index f9a3e492e..fc26bd8a2 100644 --- a/daliuge-common/dlg/common/streams.py +++ b/daliuge-common/dlg/common/streams.py @@ -160,12 +160,12 @@ def read(self, n=-1): if self.isiter: try: - i,obj = next(self.objects) + i, obj = next(self.objects) json_out = b'[' if i == 0 else b',' json_out += json.dumps(obj).encode('latin1') except StopIteration: json_out = b']' - self.isiter = False # not nice, but prevents more reads + self.isiter = False # not nice, but prevents more reads else: json_out = json.dumps(self.objects).encode('latin1') diff --git a/daliuge-common/dlg/common/tool.py b/daliuge-common/dlg/common/tool.py index c88bb1659..1c7372b1c 100644 --- a/daliuge-common/dlg/common/tool.py +++ b/daliuge-common/dlg/common/tool.py @@ -30,7 +30,6 @@ import pkg_resources - logger = logging.getLogger(__name__) @@ -42,7 +41,6 @@ def add_logging_options(parser): def setup_logging(opts): - levels = [ logging.NOTSET, logging.DEBUG, @@ -63,7 +61,8 @@ def setup_logging(opts): # Let's configure logging now # We use stderr for loggin because stdout is the default output file # for several operations - fmt = logging.Formatter("%(asctime)-15s [%(levelname)5.5s] [%(threadName)15.15s] %(name)s#%(funcName)s:%(lineno)s %(message)s") + fmt = logging.Formatter( + "%(asctime)-15s [%(levelname)5.5s] [%(threadName)15.15s] %(name)s#%(funcName)s:%(lineno)s %(message)s") fmt.converter = time.gmtime streamHdlr = logging.StreamHandler(sys.stderr) streamHdlr.setFormatter(fmt) @@ -72,8 +71,9 @@ def setup_logging(opts): commands = {} -def cmdwrap(cmdname, desc, f): + +def cmdwrap(cmdname, desc, f): # If it's not a callable we assume it's a string # in which case we lazy-load the module:function when it gets called if not callable(f): @@ -84,11 +84,13 @@ def __call__(self, *args, **kwargs): modname, fname = orig_f.split(':') module = importlib.import_module(modname) return getattr(module, fname)(*args, **kwargs) + f = Importer() def wrapped(*args, **kwargs): parser = optparse.OptionParser(description=desc) f(parser, *args, **kwargs) + commands[cmdname] = (desc, wrapped) @@ -97,22 +99,25 @@ def version(parser, args): print("Version: %s" % version) print("Git version: %s" % git_version) + cmdwrap('version', 'Reports the DALiuGE version and exits', version) + def _load_commands(): for entry_point in pkg_resources.iter_entry_points('dlg.tool_commands'): entry_point.load().register_commands() + def print_usage(prgname): print('Usage: %s [command] [options]' % (prgname)) print('') - print('\n'.join(['Commands are:'] + ['\t%-25.25s%s' % (cmdname,desc_and_f[0]) for cmdname,desc_and_f in sorted(commands.items())])) + print('\n'.join(['Commands are:'] + ['\t%-25.25s%s' % (cmdname, desc_and_f[0]) for cmdname, desc_and_f in + sorted(commands.items())])) print('') print('Try %s [command] --help for more details' % (prgname)) def run(args=sys.argv): - _load_commands() # Manually parse the first argument, which will be diff --git a/daliuge-common/dlg/constants.py b/daliuge-common/dlg/constants.py index 511548506..eac9bafa0 100644 --- a/daliuge-common/dlg/constants.py +++ b/daliuge-common/dlg/constants.py @@ -21,16 +21,16 @@ # # Constants used throughout the manager package -DEFAULT_PORTS = {'NODE_DEFAULT_REST_PORT': 8000, +DEFAULT_PORTS = {'NODE_DEFAULT_REST_PORT': 8000, 'ISLAND_DEFAULT_REST_PORT': 8001, 'MASTER_DEFAULT_REST_PORT': 8002, 'REPLAY_DEFAULT_REST_PORT': 8500, 'DAEMON_DEFAULT_REST_PORT': 9000, 'NODE_DEFAULT_EVENTS_PORT': 5555, - 'NODE_DEFAULT_RPC_PORT': 6666} + 'NODE_DEFAULT_RPC_PORT': 6666} # just for backwards compatibility -NODE_DEFAULT_REST_PORT = DEFAULT_PORTS['NODE_DEFAULT_REST_PORT'] +NODE_DEFAULT_REST_PORT = DEFAULT_PORTS['NODE_DEFAULT_REST_PORT'] ISLAND_DEFAULT_REST_PORT = DEFAULT_PORTS['ISLAND_DEFAULT_REST_PORT'] MASTER_DEFAULT_REST_PORT = DEFAULT_PORTS['MASTER_DEFAULT_REST_PORT'] @@ -38,7 +38,6 @@ DAEMON_DEFAULT_REST_PORT = DEFAULT_PORTS['DAEMON_DEFAULT_REST_PORT'] - # Others ports used by the Node Managers NODE_DEFAULT_EVENTS_PORT = DEFAULT_PORTS['NODE_DEFAULT_EVENTS_PORT'] -NODE_DEFAULT_RPC_PORT = DEFAULT_PORTS['NODE_DEFAULT_RPC_PORT'] +NODE_DEFAULT_RPC_PORT = DEFAULT_PORTS['NODE_DEFAULT_RPC_PORT'] diff --git a/daliuge-common/dlg/exceptions.py b/daliuge-common/dlg/exceptions.py index c4e07e643..23f57961f 100644 --- a/daliuge-common/dlg/exceptions.py +++ b/daliuge-common/dlg/exceptions.py @@ -24,15 +24,18 @@ In particular DaliugeException should be the root of all our exceptions. """ + class DaliugeException(Exception): """ The parent of all exceptions thrown by Daliuge """ + class InvalidDropException(DaliugeException): """ An exception thrown when a Drop is created with a set of invalid arguments. """ + def __init__(self, drop, reason): DaliugeException.__init__(self, drop, reason) if isinstance(drop, (list, tuple)): @@ -46,11 +49,13 @@ def __init__(self, drop, reason): def __str__(self, *args, **kwargs): return self.msg + class InvalidRelationshipException(DaliugeException): """ An exception thrown when a relationship between two Drops has been instructed but is invalid in nature. """ + def __init__(self, rel, reason): DaliugeException.__init__(self, rel, reason) self.rel = rel @@ -60,12 +65,14 @@ def __init__(self, rel, reason): def __str__(self, *args, **kwargs): return self.msg + class InvalidGraphException(DaliugeException): """ An exception thrown when an invalid graph, or part of a graph, is given to Daliuge. """ + class NoDropException(DaliugeException): """ An exception thrown when a Drop UID is pointing to a non-existing Drop @@ -82,6 +89,7 @@ def __str__(self): ret += ". Reason: %s" % (self._reason) return ret + class NoSessionException(DaliugeException): """ An exception thrown when a session ID is pointing to a non-existing session @@ -98,6 +106,7 @@ def __str__(self): ret += ". Reason: %s" % (self._reason) return ret + class SessionAlreadyExistsException(DaliugeException): """ An exception thrown when a session ID is pointing to an existing session @@ -115,14 +124,16 @@ def __str__(self): ret += ". Reason: %s" % (self._reason) return ret + class InvalidSessionState(DaliugeException): """ An exception thrown when an operation is requested on a session that is not in the expected state for that operation. """ + class SubManagerException(DaliugeException): """ An exception thrown by composite drop managers when there was an error invoking one of their underlying drop managers. - """ \ No newline at end of file + """ diff --git a/daliuge-common/dlg/restutils.py b/daliuge-common/dlg/restutils.py index cd82bcbb7..bf31fe3b4 100644 --- a/daliuge-common/dlg/restutils.py +++ b/daliuge-common/dlg/restutils.py @@ -33,7 +33,6 @@ from . import exceptions from .exceptions import DaliugeException, SubManagerException - logger = logging.getLogger(__name__) @@ -41,18 +40,20 @@ class ThreadingWSGIServer(SocketServer.ThreadingMixIn, wsgiref.simple_server.WSG daemon_threads = True allow_reuse_address = True + class LoggingWSGIRequestHandler(wsgiref.simple_server.WSGIRequestHandler): def log_message(self, fmt, *args): logger.debug(fmt, *args) + class RestServerWSGIServer: - def __init__(self, wsgi_app, listen = '127.0.0.1', port = 8080): + def __init__(self, wsgi_app, listen='127.0.0.1', port=8080): self.wsgi_app = wsgi_app self.listen = listen self.port = port self.server = wsgiref.simple_server.make_server(self.listen, - self.port, self.wsgi_app, server_class=ThreadingWSGIServer, - handler_class=LoggingWSGIRequestHandler) + self.port, self.wsgi_app, server_class=ThreadingWSGIServer, + handler_class=LoggingWSGIRequestHandler) def serve_forever(self): self.server.serve_forever() @@ -61,11 +62,13 @@ def server_close(self): self.server.shutdown() self.server.server_close() + class RestClientException(DaliugeException): """ Exception thrown by the RestClient """ + def hexdigits(n): digits = 0 while n: @@ -73,16 +76,20 @@ def hexdigits(n): n //= 16 return digits + def chunk(data): return ("%x" % len(data)).encode('ascii') + b'\r\n' + data + b'\r\n' + class chunked(object): """ A reader that returns chunked HTTP content """ + def __init__(self, content): self.content = content self.finished = False + def read(self, n): if self.finished: return b'' @@ -93,6 +100,7 @@ def read(self, n): return b"0\r\n\r\n" return chunk(data) + class RestClient(object): """ The base class for our REST clients @@ -112,14 +120,15 @@ def _close(self): self._conn.close() __del__ = _close + def __enter__(self): return self + def __exit__(self, typ, value, traceback): self._close() if typ: raise value - def _get_json(self, url): ret = self._GET(url) return json.load(ret) if ret else None @@ -183,7 +192,7 @@ def _request(self, url, method, content=None, headers={}): eargs = error['args'] if etype == SubManagerException: - for host,args in eargs.items(): + for host, args in eargs.items(): subetype = getattr(exceptions, args['type']) subargs = args['args'] eargs[host] = subetype(*subargs) @@ -199,4 +208,4 @@ def _request(self, url, method, content=None, headers={}): if not self._resp.length: return None - return codecs.getreader('utf-8')(self._resp) \ No newline at end of file + return codecs.getreader('utf-8')(self._resp) diff --git a/daliuge-common/dlg/version_helper.py b/daliuge-common/dlg/version_helper.py index 1ea42a457..82eb34dd3 100644 --- a/daliuge-common/dlg/version_helper.py +++ b/daliuge-common/dlg/version_helper.py @@ -22,6 +22,7 @@ import os import subprocess + def get_git_version(): out = subprocess.check_output(["git", "rev-parse", "HEAD"]) return out.strip().decode("ascii") @@ -40,6 +41,7 @@ def get_version_info(version, is_release): def version_as_string(version_tuple): return "%d.%d.%d" % version_tuple + def write_version_info(version_tuple, version_file, is_release): tpl = """ # THIS FILE IS GENERATED BY version_helper.py @@ -62,4 +64,4 @@ def write_version_info(version_tuple, version_file, is_release): "is_release": is_release, } f.write(info.strip()) - return full_version \ No newline at end of file + return full_version diff --git a/daliuge-common/setup.py b/daliuge-common/setup.py index 7d0bb6e2a..e4a71a149 100644 --- a/daliuge-common/setup.py +++ b/daliuge-common/setup.py @@ -37,6 +37,7 @@ VERSION_FILE = "dlg/common/version.py" RELEASE = True + def do_versioning(): # Avoid importing, the package doesn't exist as such yet with open(os.path.join('dlg', 'version_helper.py')) as f: @@ -45,6 +46,7 @@ def do_versioning(): exec(code, _globals) return _globals['write_version_info'](VERSION, VERSION_FILE, RELEASE) + install_requires = [ # 1.10 contains an important race-condition fix on lazy-loaded modules "six>=1.10", diff --git a/daliuge-runtime/dlg/__init__.py b/daliuge-runtime/dlg/__init__.py index cfb3574be..74d07706f 100644 --- a/daliuge-runtime/dlg/__init__.py +++ b/daliuge-runtime/dlg/__init__.py @@ -21,4 +21,4 @@ # # Declaring this as a namespace package -__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment \ No newline at end of file +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment diff --git a/daliuge-runtime/dlg/apps/__init__.py b/daliuge-runtime/dlg/apps/__init__.py index 469348ad8..2c065c3bf 100644 --- a/daliuge-runtime/dlg/apps/__init__.py +++ b/daliuge-runtime/dlg/apps/__init__.py @@ -25,7 +25,8 @@ are based on the :class:`BarrierAppDROP`. """ + def get_include_dir(): """The path that C/C++ applications need to add to use the dlg.h header""" import os - return os.path.dirname(__file__) \ No newline at end of file + return os.path.dirname(__file__) diff --git a/daliuge-runtime/dlg/apps/archiving.py b/daliuge-runtime/dlg/apps/archiving.py index c95a77964..6f1e67bb2 100644 --- a/daliuge-runtime/dlg/apps/archiving.py +++ b/daliuge-runtime/dlg/apps/archiving.py @@ -36,7 +36,8 @@ class ExternalStoreApp(BarrierAppDROP): shouldn't contain any output, making it a leaf node of the physical graph where it resides. """ - compontent_meta = dlg_component('ExternalStoreApp', 'An application that takes its input DROP (which must be one, and only one) ' + compontent_meta = dlg_component('ExternalStoreApp', + 'An application that takes its input DROP (which must be one, and only one) ' 'and creates a copy of it in a completely external store, from the point ' 'of view of the DALiuGE framework.', [dlg_batch_input('binary/*', [])], @@ -61,6 +62,7 @@ def store(self, inputDrop): `inputDrop` into an external store. """ + class NgasArchivingApp(ExternalStoreApp): ''' An ExternalStoreApp class that takes its input DROP and archives it in @@ -70,7 +72,8 @@ class NgasArchivingApp(ExternalStoreApp): new NGAS client process. This way we can read the different storage types supported by the framework, and not only filesystem objects. ''' - compontent_meta = dlg_component('NgasArchivingApp', 'An ExternalStoreApp class that takes its input DROP and archives it in ' + compontent_meta = dlg_component('NgasArchivingApp', + 'An ExternalStoreApp class that takes its input DROP and archives it in ' 'an NGAS server. It currently deals with non-container DROPs only.', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], @@ -92,7 +95,8 @@ def store(self, inDrop): try: ngasIO = NgasIO(self.ngasSrv, inDrop.uid, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, size) except ImportError: - ngasIO = NgasLiteIO(self.ngasSrv, inDrop.uid, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, size) + ngasIO = NgasLiteIO(self.ngasSrv, inDrop.uid, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, + size) ngasIO.open(OpenMode.OPEN_WRITE) @@ -103,4 +107,4 @@ def store(self, inDrop): ngasIO.write(buff) if len(buff) != 4096: break - ngasIO.close() \ No newline at end of file + ngasIO.close() diff --git a/daliuge-runtime/dlg/apps/bash_shell_app.py b/daliuge-runtime/dlg/apps/bash_shell_app.py index 8017e53e3..6f895ef05 100644 --- a/daliuge-runtime/dlg/apps/bash_shell_app.py +++ b/daliuge-runtime/dlg/apps/bash_shell_app.py @@ -38,6 +38,7 @@ import threading import time import types + import six from .. import droputils, utils @@ -47,9 +48,9 @@ from ..meta import dlg_string_param, dlg_component, dlg_batch_input, \ dlg_batch_output, dlg_streaming_input - logger = logging.getLogger(__name__) + def mesage_stdouts(prefix, stdout, stderr, enc='utf8'): msg = prefix if not stdout and not stderr: @@ -61,6 +62,7 @@ def mesage_stdouts(prefix, stdout, stderr, enc='utf8'): msg += "\n==STDERR==\n" + utils.b2s(stderr, enc) return msg + def close_and_remove(fo, fname): fo.close() try: @@ -69,6 +71,7 @@ def close_and_remove(fo, fname): except OSError: logger.exception("Error while removing %s", fname) + def prepare_output_channel(this_node, out_drop): """ Prepares an output channel that will serve as the stdout of a bash command. @@ -109,6 +112,7 @@ def prepare_output_channel(this_node, out_drop): logger.debug("Received connection from %r", csockaddr) return csock + def prepare_input_channel(data): """ Prepares an input channel that will serve as the stdin of a bash command. @@ -124,7 +128,7 @@ def prepare_input_channel(data): # Return an object that runs pipe.read on read() # and close_and_remove on close() - chan = lambda: None # a simple object where attributes can be set! + chan = lambda: None # a simple object where attributes can be set! chan.read = pipe.read chan.fileno = pipe.fileno chan.close = types.MethodType(lambda s: close_and_remove(pipe, pipe_name), chan) @@ -158,7 +162,7 @@ def initialize(self, **kwargs): raise InvalidDropException(self, 'No command specified, cannot create BashShellApp') def _run_bash(self, inputs, outputs, stdin=None, - stdout=subprocess.PIPE): + stdout=subprocess.PIPE): """ Runs the given `cmd`. If any `inputs` and/or `outputs` are given (dictionaries of uid:drop elements) they are used to replace any placeholder @@ -178,12 +182,12 @@ def _run_bash(self, inputs, outputs, stdin=None, # self.run_bash(self._command, self.uid, session_id, *args, **kwargs) # Replace inputs/outputs in command line with paths or data URLs - fsInputs = {uid: i for uid,i in inputs.items() if droputils.has_path(i)} - fsOutputs = {uid: o for uid,o in outputs.items() if droputils.has_path(o)} + fsInputs = {uid: i for uid, i in inputs.items() if droputils.has_path(i)} + fsOutputs = {uid: o for uid, o in outputs.items() if droputils.has_path(o)} cmd = droputils.replace_path_placeholders(cmd, fsInputs, fsOutputs) - dataURLInputs = {uid: i for uid,i in inputs.items() if not droputils.has_path(i)} - dataURLOutputs = {uid: o for uid,o in outputs.items() if not droputils.has_path(o)} + dataURLInputs = {uid: i for uid, i in inputs.items() if not droputils.has_path(i)} + dataURLOutputs = {uid: o for uid, o in outputs.items() if not droputils.has_path(o)} cmd = droputils.replace_dataurl_placeholders(cmd, dataURLInputs, dataURLOutputs) # Pass down daliuge-specific information to the subprocesses as environment variables @@ -215,7 +219,7 @@ def _run_bash(self, inputs, outputs, stdin=None, pcode = process.returncode end = time.time() - logger.info("Finished in %.3f [s] with exit code %d", (end-start), pcode) + logger.info("Finished in %.3f [s] with exit code %d", (end - start), pcode) if pcode == 0 and logger.isEnabledFor(logging.DEBUG): logger.debug(mesage_stdouts("Command finished successfully", pstdout, pstderr)) @@ -234,6 +238,7 @@ def cancel(self): except: logger.exception("Error while terminating process %r", self.proc) + class StreamingInputBashAppBase(BashShellBase, AppDROP): """ Base class for bash command applications that consume a stream of incoming @@ -275,6 +280,7 @@ def execute(self, data): self._this_finished = True self.notify_if_finished() + # # Now the actual 4 classes: # * batch @@ -296,21 +302,24 @@ class BashShellApp(BashShellBase, BarrierAppDROP): def run(self): self._run_bash(self._inputs, self._outputs) + class StreamingOutputBashApp(BashShellBase, BarrierAppDROP): """ Like BashShellApp, but its stdout is a stream of data that is fed into the next application. """ compontent_meta = dlg_component('StreamingOutputBashApp', 'Like BashShellApp, but its stdout is a stream ' - 'of data that is fed into the next application.', + 'of data that is fed into the next application.', [dlg_batch_input('text/*', [])], [dlg_batch_output('text/*', [])], [dlg_streaming_input('text/*')]) + def run(self): with contextlib.closing(prepare_output_channel(self.node, self.outputs[0])) as outchan: self._run_bash(self._inputs, {}, stdout=outchan) logger.debug("Closed output channel") + class StreamingInputBashApp(StreamingInputBashAppBase): """ An app that runs a bash command that consumes data from stdin. @@ -320,7 +329,8 @@ class StreamingInputBashApp(StreamingInputBashAppBase): to establish the streaming channel. This information is also used to kick this application off. """ - compontent_meta = dlg_component('StreamingInputBashApp', 'An app that runs a bash command that consumes data from stdin.', + compontent_meta = dlg_component('StreamingInputBashApp', + 'An app that runs a bash command that consumes data from stdin.', [dlg_batch_input('text/*', [])], [dlg_batch_output('text/*', [])], [dlg_streaming_input('text/*')]) @@ -330,19 +340,22 @@ def run(self, data): self._run_bash({}, self._outputs, stdin=inchan) logger.debug("Closed input channel") + class StreamingInputOutputBashApp(StreamingInputBashAppBase): """ Like StreamingInputBashApp, but its stdout is also a stream of data that is fed into the next application. """ - compontent_meta = dlg_component('StreamingInputOutputBashApp', 'Like StreamingInputBashApp, but its stdout is also a ' + compontent_meta = dlg_component('StreamingInputOutputBashApp', + 'Like StreamingInputBashApp, but its stdout is also a ' 'stream of data that is fed into the next application.', [dlg_batch_input('text/*', [])], [dlg_batch_output('text/*', [])], [dlg_streaming_input('text/*')]) + def run(self, data): with contextlib.closing(prepare_input_channel(data)) as inchan: with contextlib.closing(prepare_output_channel(self.node, self.outputs[0])) as outchan: self._run_bash({}, {}, stdout=outchan, stdin=inchan) logger.debug("Closed output channel") - logger.debug("Closed input channel") \ No newline at end of file + logger.debug("Closed input channel") diff --git a/daliuge-runtime/dlg/apps/crc.py b/daliuge-runtime/dlg/apps/crc.py index 98a017b78..586d95199 100644 --- a/daliuge-runtime/dlg/apps/crc.py +++ b/daliuge-runtime/dlg/apps/crc.py @@ -24,9 +24,9 @@ """ import six +from dlg.ddap_protocol import AppDROPStates from ..drop import BarrierAppDROP, AppDROP -from dlg.ddap_protocol import AppDROPStates from ..meta import dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input try: @@ -43,7 +43,7 @@ class CRCApp(BarrierAppDROP): not something really intended to be used in a production system ''' compontent_meta = dlg_component('CRCApp', 'A BarrierAppDROP that calculates the ' - 'CRC of the single DROP it consumes', + 'CRC of the single DROP it consumes', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) diff --git a/daliuge-runtime/dlg/apps/dockerapp.py b/daliuge-runtime/dlg/apps/dockerapp.py index 6f1a5f86a..b9530cb54 100644 --- a/daliuge-runtime/dlg/apps/dockerapp.py +++ b/daliuge-runtime/dlg/apps/dockerapp.py @@ -29,14 +29,13 @@ import threading import time -from configobj import ConfigObj import docker +from configobj import ConfigObj from .. import utils, droputils from ..drop import BarrierAppDROP from ..exceptions import InvalidDropException - logger = logging.getLogger(__name__) DLG_ROOT = '/dlg_root' @@ -64,6 +63,7 @@ def waitForIp(self, timeout=None): self._evt.wait(timeout) return self._uid, self._containerIp + class DockerApp(BarrierAppDROP): """ A BarrierAppDROP that represents a process running in a container @@ -225,7 +225,8 @@ def initialize(self, **kwargs): else: host_path, container_path = binding.split(':') if not os.path.exists(host_path): - raise InvalidDropException(self, "'Path %s doesn't exist, cannot use as additional volume binding" % (host_path,)) + raise InvalidDropException(self, "'Path %s doesn't exist, cannot use as additional volume binding" % ( + host_path,)) self._additionalBindings[host_path] = container_path logger.info("%r with image '%s' and command '%s' created", self, self._image, self._command) @@ -239,7 +240,7 @@ def initialize(self, **kwargs): start = time.time() c.images.pull(self._image) end = time.time() - logger.debug("Took %.2f [s] to pull image '%s'", (end-start), self._image) + logger.debug("Took %.2f [s] to pull image '%s'", (end - start), self._image) else: logger.debug("Image '%s' found, no need to pull it", self._image) c.api.close() @@ -279,12 +280,12 @@ def run(self): iitems = self._inputs.items() oitems = self._outputs.items() - fsInputs = {uid: i for uid,i in iitems if droputils.has_path(i)} - fsOutputs = {uid: o for uid,o in oitems if droputils.has_path(o)} - dockerInputs = {uid: DockerPath(DLG_ROOT + i.path) for uid,i in fsInputs.items()} - dockerOutputs = {uid: DockerPath(DLG_ROOT + o.path) for uid,o in fsOutputs.items()} - dataURLInputs = {uid: i for uid,i in iitems if not droputils.has_path(i)} - dataURLOutputs = {uid: o for uid,o in oitems if not droputils.has_path(o)} + fsInputs = {uid: i for uid, i in iitems if droputils.has_path(i)} + fsOutputs = {uid: o for uid, o in oitems if droputils.has_path(o)} + dockerInputs = {uid: DockerPath(DLG_ROOT + i.path) for uid, i in fsInputs.items()} + dockerOutputs = {uid: DockerPath(DLG_ROOT + o.path) for uid, o in fsOutputs.items()} + dataURLInputs = {uid: i for uid, i in iitems if not droputils.has_path(i)} + dataURLOutputs = {uid: o for uid, o in oitems if not droputils.has_path(o)} cmd = droputils.replace_path_placeholders(self._command, dockerInputs, dockerOutputs) cmd = droputils.replace_dataurl_placeholders(cmd, dataURLInputs, dataURLOutputs) @@ -293,9 +294,10 @@ def run(self): # directory, maintaining the rest of their original paths. # Outputs are bound only up to their dirname (see class doc for details) # Volume bindings are setup for FileDROPs and DirectoryContainers only - binds = [ i.path + ":" + dockerInputs[uid].path for uid,i in fsInputs.items()] - binds += [os.path.dirname(o.path) + ":" + os.path.dirname(dockerOutputs[uid].path) for uid,o in fsOutputs.items()] - binds += [host_path + ":" + container_path for host_path, container_path in self._additionalBindings.items()] + binds = [i.path + ":" + dockerInputs[uid].path for uid, i in fsInputs.items()] + binds += [os.path.dirname(o.path) + ":" + os.path.dirname(dockerOutputs[uid].path) for uid, o in + fsOutputs.items()] + binds += [host_path + ":" + container_path for host_path, container_path in self._additionalBindings.items()] logger.debug("Volume bindings: %r", binds) # Wait until the DockerApps this application runtime depends on have @@ -309,9 +311,9 @@ def run(self): # useful to make sure that the USER environment variable is set in those # cases (e.g., casapy requires this to correctly operate) user = self._user - env = {} + env = {} if user is not None: - env = {'USER':user} + env = {'USER': user} if self._ensureUserAndSwitch is True: # Append commands that will make sure a user is present with the @@ -322,7 +324,10 @@ def run(self): createUserAndGo = "id -u {0} &> /dev/null || adduser --uid {0} r; ".format(uid) for dirname in set([os.path.dirname(x.path) for x in dockerOutputs.values()]): createUserAndGo += 'chown -R {0}.{0} "{1}"; '.format(uid, dirname) - createUserAndGo += "cd; su -l $(getent passwd {0} | cut -f1 -d:) -c /bin/bash -c '{1}'".format(uid, utils.escapeQuotes(cmd, doubleQuotes=False)) + createUserAndGo += "cd; su -l $(getent passwd {0} | cut -f1 -d:) -c /bin/bash -c '{1}'".format(uid, + utils.escapeQuotes( + cmd, + doubleQuotes=False)) cmd = createUserAndGo @@ -341,11 +346,11 @@ def rm(container): # Create container container = c.containers.create( - self._image, - cmd, - volumes=binds, - user=user, - environment=env, + self._image, + cmd, + volumes=binds, + user=user, + environment=env, ) self._containerId = cId = container.id logger.info("Created container %s for %r", cId, self) @@ -372,12 +377,13 @@ def rm(container): self._exitCode = x end = time.time() - logger.info("Container %s finished in %.2f [s] with exit code %d", cId, (end-start), self._exitCode) + logger.info("Container %s finished in %.2f [s] with exit code %d", cId, (end - start), self._exitCode) if self._exitCode == 0 and logger.isEnabledFor(logging.DEBUG): stdout = container.logs(stream=False, stdout=True, stderr=False) stderr = container.logs(stream=False, stdout=False, stderr=True) - logger.debug("Container %s finished successfully, output follows.\n==STDOUT==\n%s==STDERR==\n%s", cId, stdout, stderr) + logger.debug("Container %s finished successfully, output follows.\n==STDOUT==\n%s==STDERR==\n%s", cId, + stdout, stderr) elif self._exitCode != 0: stdout = container.logs(stream=False, stdout=True, stderr=False) stderr = container.logs(stream=False, stdout=False, stderr=True) @@ -404,4 +410,4 @@ def _kwargs_from_env(cls, ssl_version=None, assert_hostname=False): config_file_name = os.path.join(utils.getDlgDir(), 'dlg.settings') if os.path.exists(config_file_name): return ConfigObj(config_file_name) - return {} \ No newline at end of file + return {} diff --git a/daliuge-runtime/dlg/apps/dynlib.py b/daliuge-runtime/dlg/apps/dynlib.py index c61cc3f4a..ead403e5d 100644 --- a/daliuge-runtime/dlg/apps/dynlib.py +++ b/daliuge-runtime/dlg/apps/dynlib.py @@ -34,7 +34,6 @@ from ..drop import AppDROP, BarrierAppDROP from ..exceptions import InvalidDropException - logger = logging.getLogger(__name__) _read_cb_type = ctypes.CFUNCTYPE( @@ -336,6 +335,7 @@ def addStreamingInput(self, streamingInputDrop, back=True): class DynlibApp(DynlibAppBase, BarrierAppDROP): """Loads a dynamic library into the current process and runs it""" + def initialize(self, **kwargs): super(DynlibApp, self).initialize(**kwargs) self.ranks = self._getArg(kwargs, 'rank', None) diff --git a/daliuge-runtime/dlg/apps/fileimport.py b/daliuge-runtime/dlg/apps/fileimport.py index 8fa51a313..65d4fe992 100644 --- a/daliuge-runtime/dlg/apps/fileimport.py +++ b/daliuge-runtime/dlg/apps/fileimport.py @@ -23,11 +23,12 @@ import os import uuid -from ..drop import ContainerDROP -from ..drop import FileDROP from dlg.meta import dlg_string_param, dlg_list_param, dlg_component, \ dlg_batch_input, dlg_batch_output, dlg_streaming_input +from ..drop import ContainerDROP +from ..drop import FileDROP + class FileImportApp(ContainerDROP): """ @@ -36,7 +37,8 @@ class FileImportApp(ContainerDROP): is created which contains the path to the file. The FileDROP is then added to the FileImportApp (ContainerDROP) """ - compontent_meta = dlg_component('FileImportApp', 'Recursively scans a directory (dirname) and checks for files with ' + compontent_meta = dlg_component('FileImportApp', + 'Recursively scans a directory (dirname) and checks for files with ' 'a particular extension (ext). If a match is made then a FileDROP ' 'is created which contains the path to the file. The FileDROP is then added ' 'to the FileImportApp (ContainerDROP)', @@ -69,7 +71,7 @@ def _scan_and_import_files(self): path = '{0}/{1}'.format(root, f) fd = FileDROP(str(uuid.uuid1()), str(uuid.uuid1()), - filepath = path, - check_filepath_exists = True) + filepath=path, + check_filepath_exists=True) self._children.append(fd) fd._parent = self diff --git a/daliuge-runtime/dlg/apps/mpi.py b/daliuge-runtime/dlg/apps/mpi.py index 84e31a373..b1e5f3046 100644 --- a/daliuge-runtime/dlg/apps/mpi.py +++ b/daliuge-runtime/dlg/apps/mpi.py @@ -29,9 +29,9 @@ from ..drop import BarrierAppDROP from ..exceptions import InvalidDropException - logger = logging.getLogger(__name__) + class MPIApp(BarrierAppDROP): """ An application drop representing an MPI job. @@ -78,13 +78,14 @@ def run(self): vendor, version = MPI.get_vendor() # @UndefinedVariable info = MPI.Info.Create() # @UndefinedVariable logger.debug("MPI vendor is %s, version %s", vendor, '.'.join([str(x) for x in version])) # @UndefinedVariable - comm_children = MPI.COMM_SELF.Spawn(cmd, args=args, maxprocs=self._maxprocs, errcodes=errcodes, info=info) # @UndefinedVariable + comm_children = MPI.COMM_SELF.Spawn(cmd, args=args, maxprocs=self._maxprocs, errcodes=errcodes, + info=info) # @UndefinedVariable n_children = comm_children.Get_remote_size() logger.info("%d MPI children apps spawned, gathering exit data", n_children) if self._use_wrapper: - children_data = comm_children.gather(('','', 0), root=MPI.ROOT) # @UndefinedVariable + children_data = comm_children.gather(('', '', 0), root=MPI.ROOT) # @UndefinedVariable exit_codes = [x[2] for x in children_data] logger.info("Exit codes gathered from children processes: %r", exit_codes) @@ -93,7 +94,8 @@ def run(self): if code == 0: continue any_failed = True - logger.error("stdout/stderr follow for rank %d:\nSTDOUT\n======\n%s\n\nSTDERR\n======\n%s", rank, stdout, stderr) + logger.error("stdout/stderr follow for rank %d:\nSTDOUT\n======\n%s\n\nSTDERR\n======\n%s", rank, + stdout, stderr) if any_failed: raise Exception("One or more MPI children didn't exit cleanly") @@ -103,7 +105,6 @@ def run(self): # When we are called by the MPIApp def module_as_main(): - # Get the parent communicator before anything else happens # This way we ensure the communicator is valid from mpi4py import MPI @@ -119,7 +120,8 @@ def handle(signNo, stack_frame): # argv[0] is the name of this module # argv[1:] is the actual command + args try: - proc = subprocess.Popen(sys.argv[1:], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, close_fds=False) + proc = subprocess.Popen(sys.argv[1:], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, + close_fds=False) stdout, stderr = proc.communicate() code = proc.returncode except Exception as e: @@ -128,5 +130,6 @@ def handle(signNo, stack_frame): # Gather the results in the spawner rank and good bye parent_comm.gather((stdout, stderr, code), root=0) + if __name__ == '__main__': - module_as_main() \ No newline at end of file + module_as_main() diff --git a/daliuge-runtime/dlg/apps/pyfunc.py b/daliuge-runtime/dlg/apps/pyfunc.py index f6638531c..d9ccb6f11 100644 --- a/daliuge-runtime/dlg/apps/pyfunc.py +++ b/daliuge-runtime/dlg/apps/pyfunc.py @@ -35,19 +35,20 @@ from ..drop import BarrierAppDROP from ..exceptions import InvalidDropException - _getargsspec = inspect.getargspec if six.PY2 else inspect.getfullargspec logger = logging.getLogger(__name__) + def serialize_data(d): return utils.b2s(base64.b64encode(pickle.dumps(d))) + def deserialize_data(d): return pickle.loads(base64.b64decode(six.b(d))) -def serialize_func(f): +def serialize_func(f): if isinstance(f, six.string_types): parts = f.split('.') f = getattr(importlib.import_module('.'.join(parts[:-1])), parts[-1]) @@ -77,9 +78,11 @@ def import_using_name(app, fname): except AttributeError: raise InvalidDropException(app, 'Module %s has no member %s' % (modname, fname)) + def import_using_code(code): return dill.loads(code) + class PyFuncApp(BarrierAppDROP): """ An application that wraps a simple python function. @@ -152,4 +155,4 @@ def run(self): if len(outputs) == 1: result = [result] for r, o in zip(result, outputs): - o.write(pickle.dumps(r)) # @UndefinedVariable \ No newline at end of file + o.write(pickle.dumps(r)) # @UndefinedVariable diff --git a/daliuge-runtime/dlg/apps/scp.py b/daliuge-runtime/dlg/apps/scp.py index 58789b6b5..e201c66a5 100644 --- a/daliuge-runtime/dlg/apps/scp.py +++ b/daliuge-runtime/dlg/apps/scp.py @@ -19,11 +19,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # -from ..remote import copyTo, copyFrom from ..drop import BarrierAppDROP, ShoreDROP, NgasDROP, InMemoryDROP, \ NullDROP, RDBMSDrop, ContainerDROP from ..meta import dlg_string_param, dlg_component, dlg_batch_input, \ dlg_batch_output, dlg_streaming_input +from ..remote import copyTo, copyFrom class ScpApp(BarrierAppDROP): @@ -41,7 +41,7 @@ class ScpApp(BarrierAppDROP): two I/O DROPs. """ compontent_meta = dlg_component('ScpApp', 'A BarrierAppDROP that copies the content of its single ' - 'input onto its single output via SSHs scp protocol.', + 'input onto its single output via SSHs scp protocol.', [dlg_batch_input('binary/*', [ShoreDROP, NgasDROP, InMemoryDROP, NullDROP, RDBMSDrop, ContainerDROP])], [dlg_batch_output('binary/*', [ShoreDROP, NgasDROP, InMemoryDROP, @@ -96,4 +96,4 @@ def run(self): username=self.remoteUser, pkeyPath=self.pkeyPath, timeout=self.timeout) else: copyFrom(inp.node, inp.path, localPath=out.path, recursive=recursive, - username=self.remoteUser, pkeyPath=self.pkeyPath, timeout=self.timeout) \ No newline at end of file + username=self.remoteUser, pkeyPath=self.pkeyPath, timeout=self.timeout) diff --git a/daliuge-runtime/dlg/apps/simple.py b/daliuge-runtime/dlg/apps/simple.py index 9e8c9c9b2..0f9849420 100644 --- a/daliuge-runtime/dlg/apps/simple.py +++ b/daliuge-runtime/dlg/apps/simple.py @@ -36,6 +36,7 @@ class NullBarrierApp(BarrierAppDROP): [dlg_streaming_input('binary/*')]) """A BarrierAppDrop that doesn't perform any work""" + def run(self): pass @@ -88,4 +89,4 @@ class SleepAndCopyApp(SleepApp, CopyApp): def run(self): SleepApp.run(self) - CopyApp.run(self) \ No newline at end of file + CopyApp.run(self) diff --git a/daliuge-runtime/dlg/apps/socket_listener.py b/daliuge-runtime/dlg/apps/socket_listener.py index 4a14ca508..079bf6b79 100644 --- a/daliuge-runtime/dlg/apps/socket_listener.py +++ b/daliuge-runtime/dlg/apps/socket_listener.py @@ -34,7 +34,6 @@ from ..meta import dlg_string_param, dlg_int_param, dlg_bool_param, \ dlg_component, dlg_batch_output, dlg_batch_input, dlg_streaming_input - logger = logging.getLogger(__name__) @@ -105,4 +104,4 @@ def addInput(self, inputDrop, back=True): def addStreamingInput(self, streamingInputDrop, back=True): raise InvalidRelationshipException(DROPRel(streamingInputDrop.uid, DROPLinkType.STREAMING_INPUT, self.uid), - "SocketListenerApp should have no inputs") \ No newline at end of file + "SocketListenerApp should have no inputs") diff --git a/daliuge-runtime/dlg/apps/spead_receiver.py b/daliuge-runtime/dlg/apps/spead_receiver.py index 96086c104..4dd4143b1 100644 --- a/daliuge-runtime/dlg/apps/spead_receiver.py +++ b/daliuge-runtime/dlg/apps/spead_receiver.py @@ -32,9 +32,9 @@ from ..drop import BarrierAppDROP - logger = logging.getLogger(__name__) + class SpeadReceiverApp(BarrierAppDROP): """ A BarrierAppDROP that listens for data using the SPEAD protocol. @@ -55,21 +55,21 @@ def initialize(self, **kwargs): super(SpeadReceiverApp, self).initialize(**kwargs) # Basic connectivity parameters - self._host = self._getArg(kwargs, 'host', 'localhost') - self._port = self._getArg(kwargs, 'port', 1111) - self._itemId = self._getArg(kwargs, 'itemId', 0x1000) + self._host = self._getArg(kwargs, 'host', 'localhost') + self._port = self._getArg(kwargs, 'port', 1111) + self._itemId = self._getArg(kwargs, 'itemId', 0x1000) # Performance tuning - self._maxPacketSize = self._getArg(kwargs, 'maxPacketSize', 9200) + self._maxPacketSize = self._getArg(kwargs, 'maxPacketSize', 9200) self._socketBufferSize = self._getArg(kwargs, 'socketBufferSize', 8388608) - self._maxHeaps = self._getArg(kwargs, 'maxHeaps', 4) + self._maxHeaps = self._getArg(kwargs, 'maxHeaps', 4) # Memory and thread pool tuning - self._mpLower = self._getArg(kwargs, 'mpLower', 4096) - self._mpUpper = self._getArg(kwargs, 'mpUpper', 4096*8) - self._mpMaxFree = self._getArg(kwargs, 'mpMaxFree', 10) - self._mpInitial = self._getArg(kwargs, 'mpInitial', 1) - self._tpThreads = self._getArg(kwargs, 'tpThreads', 1) + self._mpLower = self._getArg(kwargs, 'mpLower', 4096) + self._mpUpper = self._getArg(kwargs, 'mpUpper', 4096 * 8) + self._mpMaxFree = self._getArg(kwargs, 'mpMaxFree', 10) + self._mpInitial = self._getArg(kwargs, 'mpInitial', 1) + self._tpThreads = self._getArg(kwargs, 'tpThreads', 1) def run(self): diff --git a/daliuge-runtime/dlg/dask_emulation.py b/daliuge-runtime/dlg/dask_emulation.py index 97e3946da..e2ec53c63 100644 --- a/daliuge-runtime/dlg/dask_emulation.py +++ b/daliuge-runtime/dlg/dask_emulation.py @@ -37,9 +37,9 @@ from .drop import BarrierAppDROP from .exceptions import InvalidDropException - logger = logging.getLogger(__name__) + class ResultTransmitter(BarrierAppDROP): '''Collects data from all inputs and transmits it to whomever connects to the given host/port''' @@ -76,7 +76,6 @@ def read_result(x): def _get_client(**kwargs): - if 'client' in kwargs: return kwargs['client'] @@ -87,9 +86,11 @@ def _get_client(**kwargs): timeout = kwargs.get('timeout', None) return NodeManagerClient(host, port, timeout) + def _is_list_of_delayeds(x): return isinstance(x, (list, tuple)) and len(x) > 0 and isinstance(x[0], _DataDrop) + def compute(value, **kwargs): """Returns the result of the (possibly) delayed computation by sending the graph to a Drop Manager and waiting for the result to arrive back""" @@ -103,7 +104,9 @@ def compute(value, **kwargs): # Add one final application that will wait for all results # and transmit them back to us transmitter_oid = '-1' - transmitter = dropdict({'type': 'app', 'app': 'dlg.dask_emulation.ResultTransmitter', 'oid': transmitter_oid, 'port': port, 'nm': 'result transmitter'}) + transmitter = dropdict( + {'type': 'app', 'app': 'dlg.dask_emulation.ResultTransmitter', 'oid': transmitter_oid, 'port': port, + 'nm': 'result transmitter'}) for leaf_oid in droputils.get_leaves(graph.values()): graph[leaf_oid].addConsumer(transmitter) graph[transmitter_oid] = transmitter @@ -127,8 +130,8 @@ def compute(value, **kwargs): logger.info("Received %r from graph computation", ret) return ret -class _DelayedDrop(object): +class _DelayedDrop(object): _drop_count = 0 def __init__(self, producer=None): @@ -210,9 +213,11 @@ def _add_upstream(self, upstream): class _Listifier(BarrierAppDROP): """Returns a list with all objects as contents""" + def run(self): self.outputs[0].write(pickle.dumps([pickle.loads(droputils.allDropContents(x)) for x in self.inputs])) + class _DelayedDrops(_DelayedDrop): """One or more _DelayedDrops treated as a single item""" @@ -223,7 +228,6 @@ def __init__(self, *drops): logger.debug("Created %r", self) def _to_physical_graph(self, visited, graph): - output = _DataDrop(producer=self) output._append_to_graph(visited, graph) @@ -251,6 +255,7 @@ def make_dropdict(self): def __repr__(self): return "<_DelayedDrops n=%d>" % (len(self.drops),) + class _AppDrop(_DelayedDrop): """Defines a PyFuncApp drop for a given function `f`""" @@ -320,7 +325,10 @@ def __call__(self, *args, **kwargs): def __repr__(self): return "<_DelayedApp fname=%s, nout=%s>" % (self.fname, str(self.nout)) + _no_data = object() + + class _DataDrop(_DelayedDrop): """Defines an in-memory drop""" @@ -343,6 +351,7 @@ def __repr__(self): return "<_DataDrop, pydata=%r>" % (self.pydata,) return "<_DataDrop, producer=%r>" % self.producer + class _DataDropSequence(_DataDrop): """One or more _DataDrops that can be subscribed""" @@ -364,6 +373,7 @@ def __getitem__(self, i): def __repr__(self): return "<_DataDropSequence nout=%d, producer=%r>" % (self.nout, self.producer) + def delayed(x, *args, **kwargs): """Like dask.delayed, but quietly swallowing anything other than `nout`""" if 'nout' in kwargs: @@ -374,4 +384,4 @@ def delayed(x, *args, **kwargs): nout = None if callable(x): return _AppDrop(x, nout=nout) - return _DataDrop(pydata=x) \ No newline at end of file + return _DataDrop(pydata=x) diff --git a/daliuge-runtime/dlg/deploy/common.py b/daliuge-runtime/dlg/deploy/common.py index 7c38e20f3..7d9fcbe86 100644 --- a/daliuge-runtime/dlg/deploy/common.py +++ b/daliuge-runtime/dlg/deploy/common.py @@ -19,6 +19,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import itertools import json import logging import os @@ -28,11 +29,10 @@ from ..manager import constants from ..manager.client import BaseDROPManagerClient from ..manager.session import SessionStates -import itertools - logger = logging.getLogger(__name__) + class _StatusDumper(BaseDROPManagerClient): """A client that dumps the graph status each time a session is queried""" @@ -65,6 +65,7 @@ def session(self, session_id): def _is_end_state(session_status): return session_status in (SessionStates.FINISHED, SessionStates.CANCELLED) + def _get_client(host, port, timeout, status_dump_path=None): kwargs = {'host': host, 'port': port, 'timeout': timeout} clazz = BaseDROPManagerClient @@ -81,7 +82,8 @@ def _get(status): if isinstance(status[0], list): status = list(itertools.chain(*status)) return status - x = _get(session['status']) + + x = _get(session['status']) return x @@ -92,6 +94,7 @@ def _session_finished(session): return _is_end_state(session_status) return all(_is_end_state(s) for s in session_status) + def monitor_sessions(session_id=None, poll_interval=10, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60, status_dump_path=None): @@ -114,6 +117,7 @@ def monitor_sessions(session_id=None, poll_interval=10, host='127.0.0.1', return {s['sessionId']: _session_status(s) for s in sessions} time.sleep(poll_interval) + def submit(pg, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60, skip_deploy=False, session_id=None): """ @@ -131,4 +135,4 @@ def submit(pg, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, if not skip_deploy: client.deploy_session(session_id, completed_uids=completed_uids) logger.info("Session %s deployed", session_id) - return session_id \ No newline at end of file + return session_id diff --git a/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py b/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py index d29b38f5a..d32847e54 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py +++ b/daliuge-runtime/dlg/deploy/pawsey/dfms_monitor.py @@ -53,7 +53,6 @@ from ...utils import b2s - BUFF_SIZE = 16384 outstanding_conn = 20 default_publication_port = 20000 @@ -65,6 +64,7 @@ delimit = b'@#%!$' dl = len(delimit) + def recvall(sock, count): buf = b'' while count: @@ -75,11 +75,13 @@ def recvall(sock, count): count -= len(newbuf) return buf + def send_to_proxy(sock, data): length = len(data) sock.sendall(struct.pack('!I', length)) sock.sendall(data) + def recv_from_proxy(sock): lengthbuf = recvall(sock, 4) if (lengthbuf is None): @@ -87,6 +89,7 @@ def recv_from_proxy(sock): length, = struct.unpack('!I', lengthbuf) return recvall(sock, length) + # HTTP support to get the list of available proxies class Handler(BaseHTTPServer.BaseHTTPRequestHandler): def setup(self): @@ -111,7 +114,8 @@ def do_GET(self): self.wfile.write(b"No proxies available yet") return - aEls = ['{1} @ {0}:{2}'.format(host,b2s(proxyId),client_port) for proxyId, client_port in self.monitor.proxy_ids.items()] + aEls = ['{1} @ {0}:{2}'.format(host, b2s(proxyId), client_port) for + proxyId, client_port in self.monitor.proxy_ids.items()] html = '
      • '.join(aEls) html = '
        • ' + html + '
        ' self.wfile.write(six.b(html)) @@ -122,16 +126,20 @@ def do_GET(self): self.end_headers() self.wfile.write(json.dumps(self.monitor.proxy_ids, indent=2)) + class Server(BaseHTTPServer.HTTPServer): def __init__(self, monitor): self.monitor = monitor BaseHTTPServer.HTTPServer.__init__(self, (monitor.host, monitor.publication_port), Handler) + sockandaddr = collections.namedtuple('sockandaddr', 'sock addr') + class Monitor: - def __init__(self, host='0.0.0.0', proxy_port=default_proxy_port, client_base_port=default_client_base_port, publication_port=default_publication_port): + def __init__(self, host='0.0.0.0', proxy_port=default_proxy_port, client_base_port=default_client_base_port, + publication_port=default_publication_port): """ host: listening host (string) proxy_port: port exposed to the DALiuGE proxy (int) @@ -155,7 +163,7 @@ def __init__(self, host='0.0.0.0', proxy_port=default_proxy_port, client_base_po self.client_port_to_proxy_port = {} # To save the tags we attach to each client socket - self.tag_dict = {} # k - socket hash, v - socket tag + self.tag_dict = {} # k - socket hash, v - socket tag # Proxy IDs to client ports. We publish that information in publication_port self.proxy_ids = {} @@ -285,7 +293,7 @@ def remove_client_socket(self, sock): def remove_proxy_socket(self, sock): - for proxyport,saa in self.proxy_sockets.items(): + for proxyport, saa in self.proxy_sockets.items(): if saa.sock == sock: break @@ -347,7 +355,7 @@ def on_proxy_connected(self, sock): proxy_id = proxy_id.strip() proxy_id_str = b2s(proxy_id) if proxy_id in self.proxy_ids or \ - proxy_id.startswith(b'GET ') or proxy_id.startswith(b'POST '): + proxy_id.startswith(b'GET ') or proxy_id.startswith(b'POST '): logger.info('Proxy identified as %s, rejecting', proxy_id_str) proxysock.sendall(b'0') self.close_socket(proxysock, True) @@ -447,7 +455,7 @@ def on_client_data(self, sock): logger.debug("Received data from client %s", tag_str) proxy_port = self.client_port_to_proxy_port[sock.getsockname()[1]] proxy_socket = None - for port,proxy_sock in self.proxy_sockets.items(): + for port, proxy_sock in self.proxy_sockets.items(): if port == proxy_port: proxy_socket = proxy_sock.sock break @@ -464,21 +472,21 @@ def on_client_data(self, sock): def run(parser, args): - parser.add_option("-H", "--host", action="store", type="string", - dest="host", help="The network interface the monitor is bind", - default='0.0.0.0') + dest="host", help="The network interface the monitor is bind", + default='0.0.0.0') parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="monitor_port", help = "The monitor port exposed to the DALiuGE proxy", - default=default_proxy_port) + dest="monitor_port", help="The monitor port exposed to the DALiuGE proxy", + default=default_proxy_port) parser.add_option("-c", "--client_port", action="store", type="int", - dest="client_port", help = "The proxy port exposed to the client", - default=default_client_base_port) + dest="client_port", help="The proxy port exposed to the client", + default=default_client_base_port) parser.add_option("-p", "--publication_port", action="store", type="int", - dest="publication_port", help="Port used to publish the list of proxies for clients to look at", default=default_publication_port) + dest="publication_port", help="Port used to publish the list of proxies for clients to look at", + default=default_publication_port) parser.add_option("-d", "--debug", - action="store_true", dest="debug", default=False, - help="Whether to log debug info") + action="store_true", dest="debug", default=False, + help="Whether to log debug info") (options, args) = parser.parse_args(args) if (options.debug): @@ -492,4 +500,4 @@ def run(parser, args): server.main_loop() except KeyboardInterrupt: logger.warning("Ctrl C - Stopping DALiuGE Monitor server") - sys.exit(1) \ No newline at end of file + sys.exit(1) diff --git a/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py b/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py index 18ac0bc41..30a128a06 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py +++ b/daliuge-runtime/dlg/deploy/pawsey/dfms_proxy.py @@ -36,10 +36,11 @@ -------------------------------------------------------------------------------- """ +import logging import select import socket import struct -import sys, logging +import sys import time import six @@ -58,6 +59,7 @@ delimit = b'@#%!$' dl = len(delimit) + def recvall(sock, count): buf = b'' while count: @@ -68,11 +70,13 @@ def recvall(sock, count): count -= len(newbuf) return buf + def send_to_monitor(sock, data): length = len(data) sock.sendall(struct.pack('!I', length)) sock.sendall(data) + def recv_from_monitor(sock): lengthbuf = recvall(sock, 4) if (lengthbuf is None): @@ -80,8 +84,10 @@ def recv_from_monitor(sock): length, = struct.unpack('!I', lengthbuf) return recvall(sock, length) + class ProxyServer: - def __init__(self, proxy_id, dlg_host, monitor_host, dlg_port=default_dlg_port, monitor_port=default_dlg_monitor_port): + def __init__(self, proxy_id, dlg_host, monitor_host, dlg_port=default_dlg_port, + monitor_port=default_dlg_monitor_port): self._proxy_id = proxy_id if len(proxy_id) <= 80 else proxy_id[:80] self._dlg_host = dlg_host self._dlg_port = dlg_port @@ -95,7 +101,7 @@ def connect_to_host(self, server, port): while True: if retry_count >= conn_retry_count: logger.error("Retry connecting to DALiuGE monitor exhausted, quit") - #sys.exit(2) + # sys.exit(2) try: the_socket = socket.create_connection((server, port)) the_socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) @@ -136,7 +142,7 @@ def loop(self): if (just_re_connected): just_re_connected = False inputready, _, _ = select.select( - inputlist + list(self._dlg_sock_dict.values()), [], [], delay) + inputlist + list(self._dlg_sock_dict.values()), [], [], delay) for the_socket in inputready: if (just_re_connected): continue @@ -191,23 +197,25 @@ def loop(self): if (len(data) == 0): self.close_dlg_socket(the_socket, tag) + def run(parser, args): ''' Entry point for the dlg proxy command ''' parser.add_option("-d", "--dlg_host", action="store", type="string", - dest="dlg_host", help="DALiuGE Node Manager host IP (required)") + dest="dlg_host", help="DALiuGE Node Manager host IP (required)") parser.add_option("-m", "--monitor_host", action="store", type="string", - dest="monitor_host", help="Monitor host IP (required)") + dest="monitor_host", help="Monitor host IP (required)") parser.add_option("-l", "--log_dir", action="store", type="string", - dest="log_dir", help="Log directory (optional)", default='.') + dest="log_dir", help="Log directory (optional)", default='.') parser.add_option("-f", "--dlg_port", action="store", type="int", - dest="dlg_port", help = "The port the DALiuGE Node Manager is running on", default=default_dlg_port) + dest="dlg_port", help="The port the DALiuGE Node Manager is running on", default=default_dlg_port) parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="monitor_port", help = "The port the DALiuGE monitor is running on", default=default_dlg_monitor_port) + dest="monitor_port", help="The port the DALiuGE monitor is running on", + default=default_dlg_monitor_port) parser.add_option("-b", "--debug", - action="store_true", dest="debug", default=False, - help="Whether to log debug info") + action="store_true", dest="debug", default=False, + help="Whether to log debug info") parser.add_option("-i", "--id", action="store", type="string", dest="id", help="The ID of this proxy for on the monitor side (required)", default=None) (options, args) = parser.parse_args(args) @@ -225,4 +233,4 @@ def run(parser, args): server.loop() except KeyboardInterrupt: logger.warning("Ctrl C - Stopping DALiuGE Proxy server") - sys.exit(1) \ No newline at end of file + sys.exit(1) diff --git a/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js b/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js index e089cc132..53874f518 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js +++ b/daliuge-runtime/dlg/deploy/pawsey/ipython_notebook_toc.js @@ -1,67 +1,77 @@ // Converts integer to roman numeral // Adapted from: https://kmahelona.github.io/ipython_notebook_goodies/ipython_notebook_toc.js function romanize(num) { - var lookup = {M:1000,CM:900,D:500,CD:400,C:100,XC:90,L:50,XL:40,X:10,IX:9,V:5,IV:4,I:1}, - roman = '', - i; - for ( i in lookup ) { - while ( num >= lookup[i] ) { - roman += i; - num -= lookup[i]; - } - } - return ''; - } + var lookup = {M: 1000, CM: 900, D: 500, CD: 400, C: 100, XC: 90, L: 50, XL: 40, X: 10, IX: 9, V: 5, IV: 4, I: 1}, + roman = '', + i; + for (i in lookup) { + while (num >= lookup[i]) { + roman += i; + num -= lookup[i]; + } + } + return ''; +} // Builds a
          Table of Contents from all in DOM -function createTOC(){ +function createTOC() { var toc = ""; var level = 0; var levels = {} $('#toc').html(''); - $(":header").each(function(i){ - if (this.id=='tocheading'){return;} - - titleText = this.innerHTML; - openLevel = this.tagName[1]; - - if (levels[openLevel]){ - levels[openLevel] += 1; - } else{ - levels[openLevel] = 1; - } - - if (openLevel > level) { - toc += (new Array(openLevel - level + 1)).join('
            '); - } else if (openLevel < level) { - toc += (new Array(level - openLevel + 1)).join("
          "); - for (i=level;i>openLevel;i--){levels[i]=0;} - } - - level = parseInt(openLevel); - - - if (this.id==''){this.id = this.innerHTML.replace(/ /g,"-")} - var anchor = this.id; - - toc += '
        • ' + romanize(levels[openLevel].toString()) + ' ' + titleText - + '
        • '; - - }); - - + $(":header").each(function (i) { + if (this.id == 'tocheading') { + return; + } + + titleText = this.innerHTML; + openLevel = this.tagName[1]; + + if (levels[openLevel]) { + levels[openLevel] += 1; + } else { + levels[openLevel] = 1; + } + + if (openLevel > level) { + toc += (new Array(openLevel - level + 1)).join('
            '); + } else if (openLevel < level) { + toc += (new Array(level - openLevel + 1)).join("
          "); + for (i = level; i > openLevel; i--) { + levels[i] = 0; + } + } + + level = parseInt(openLevel); + + + if (this.id == '') { + this.id = this.innerHTML.replace(/ /g, "-") + } + var anchor = this.id; + + toc += '
        • ' + romanize(levels[openLevel].toString()) + ' ' + titleText + + '
        • '; + + }); + + if (level) { - toc += (new Array(level + 1)).join("
        "); + toc += (new Array(level + 1)).join(""); } - + $('#toc').append(toc); -}; +} // Executes the createToc function -setTimeout(function(){createTOC();},100); +setTimeout(function () { + createTOC(); +}, 100); // Rebuild to TOC every minute -setInterval(function(){createTOC();},60000); +setInterval(function () { + createTOC(); +}, 60000); diff --git a/daliuge-runtime/dlg/deploy/pawsey/remotes.py b/daliuge-runtime/dlg/deploy/pawsey/remotes.py index 83ed8ac73..4539aa003 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/remotes.py +++ b/daliuge-runtime/dlg/deploy/pawsey/remotes.py @@ -27,9 +27,9 @@ from . import slurm_utils - logger = logging.getLogger(__name__) + class Remote(object): def __init__(self, options, my_ip): @@ -172,9 +172,9 @@ def __init__(self, options, my_ip): rank = ips.index(my_ip) self._set_world(rank, len(ips), ips) + class DALiuGEHybridRemote(DALiuGERemote): """Like DALiuGERemote, but initializes MPI as well""" def __init__(self, options, my_ip): - from mpi4py import MPI # @UnusedImport - super(DALiuGEHybridRemote, self).__init__(options, my_ip) \ No newline at end of file + super(DALiuGEHybridRemote, self).__init__(options, my_ip) diff --git a/daliuge-runtime/dlg/deploy/pawsey/scale_test.py b/daliuge-runtime/dlg/deploy/pawsey/scale_test.py index 48eeddd0d..ae473055c 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/scale_test.py +++ b/daliuge-runtime/dlg/deploy/pawsey/scale_test.py @@ -40,7 +40,6 @@ from ... import utils from ...runtime import __git_version__ as git_commit - sub_tpl_str = """#!/bin/bash --login #SBATCH --nodes=$NUM_NODES @@ -62,6 +61,7 @@ default_aws_mon_host = 'sdp-dfms.ddns.net' default_aws_mon_port = 8898 + class DefaultConfig(object): def __init__(self): self._dict = dict() @@ -78,6 +78,7 @@ def setpar(self, k, v): def getpar(self, k): return self._dict.get(k) + class GalaxyMWAConfig(DefaultConfig): def __init__(self): super(GalaxyMWAConfig, self).__init__() @@ -85,6 +86,7 @@ def __init__(self): def init_list(self): return ['mwaops', '/group/mwaops/cwu/dfms/logs'] + class GalaxyASKAPConfig(DefaultConfig): def __init__(self): super(GalaxyASKAPConfig, self).__init__() @@ -92,6 +94,7 @@ def __init__(self): def init_list(self): return ['astronomy856', '/group/astronomy856/cwu/dfms/logs'] + class MagnusConfig(DefaultConfig): def __init__(self): super(MagnusConfig, self).__init__() @@ -99,22 +102,25 @@ def __init__(self): def init_list(self): return ['pawsey0129', '/group/pawsey0129/daliuge_logs'] + class TianHe2Config(DefaultConfig): def __init__(self): super(TianHe2Config, self).__init__() - def init_list(self): #TODO please fill in + def init_list(self): # TODO please fill in return ['SHAO', '/group/shao/daliuge_logs'] + class ConfigFactory(): - mapping = {'galaxy_mwa':GalaxyMWAConfig, 'galaxy_askap':GalaxyASKAPConfig, - 'magnus':MagnusConfig, 'galaxy':GalaxyASKAPConfig} + mapping = {'galaxy_mwa': GalaxyMWAConfig, 'galaxy_askap': GalaxyASKAPConfig, + 'magnus': MagnusConfig, 'galaxy': GalaxyASKAPConfig} @staticmethod def create_config(facility=None): facility = facility.lower() if (facility is not None) else facility return ConfigFactory.mapping.get(facility)() + class PawseyClient(object): """ parameters we can control: @@ -168,9 +174,9 @@ def __init__(self, log_root=None, acc=None, @property def num_daliuge_nodes(self): if (self._run_proxy): - ret = self._num_nodes - 1 # exclude the proxy node + ret = self._num_nodes - 1 # exclude the proxy node else: - ret = self._num_nodes - 0 # exclude the data island node? + ret = self._num_nodes - 0 # exclude the data island node? if (ret <= 0): raise Exception("Not enough nodes {0} to run DALiuGE.".format(self._num_nodes)) return ret @@ -179,7 +185,7 @@ def get_log_dirname(self): """ (pipeline name_)[Nnum_of_daliuge_nodes]_[time_stamp] """ - dtstr = datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S") #.%f + dtstr = datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S") # .%f return "{0}_N{1}_{2}".format(self._pip_name, self.num_daliuge_nodes, dtstr) def label_job_dur(self): @@ -203,7 +209,8 @@ def submit_job(self): pardict['ACCOUNT'] = self._acc pardict['PY_BIN'] = sys.executable pardict['LOG_DIR'] = lgdir - pardict['GRAPH_PAR'] = '-L "{0}"'.format(self._lg) if self._lg else '-P "{0}"'.format(self._pg) if self._pg else '' + pardict['GRAPH_PAR'] = '-L "{0}"'.format(self._lg) if self._lg else '-P "{0}"'.format( + self._pg) if self._pg else '' pardict['PROXY_PAR'] = '-m %s -o %d' % (self._mon_host, self._mon_port) if self._run_proxy else '' pardict['GRAPH_VIS_PAR'] = '-d' if self._graph_vis else '' pardict['LOGV_PAR'] = '-v %d' % self._logv @@ -222,19 +229,21 @@ def submit_job(self): with open(os.path.join(lgdir, 'git_commit.txt'), 'w') as gf: gf.write(git_commit) - os.chdir(lgdir) # so that slurm logs will be dumped here + os.chdir(lgdir) # so that slurm logs will be dumped here print(subprocess.check_output(['sbatch', job_file])) + class LogEntryPair(object): """ """ + def __init__(self, name, gstart, gend): self._name = name - self._gstart = gstart + 2 # group 0 is the whole matching line, group 1 is the catchall + self._gstart = gstart + 2 # group 0 is the whole matching line, group 1 is the catchall self._gend = gend + 2 self._start_time = None self._end_time = None - self._other = dict() # hack + self._other = dict() # hack def get_timestamp(self, line): """ @@ -262,8 +271,8 @@ def check_end(self, match, line): def get_duration(self): if ((self._start_time is None) or (self._end_time is None)): - #print "Cannot calc duration for '{0}': start_time:{1}, end_time:{2}".format(self._name, - #self._start_time, self._end_time) + # print "Cannot calc duration for '{0}': start_time:{1}, end_time:{2}".format(self._name, + # self._start_time, self._end_time) return None return (self._end_time - self._start_time) @@ -302,29 +311,29 @@ class LogParser(object): """ dim_kl = ['Start to unroll', - 'Unroll completed for {0} with # of Drops', - 'Start to translate', - 'Translation completed for', - 'PG spec is calculated', - 'Creating Session {0} in all hosts', - 'Successfully created session {0} in all hosts', - 'Separating graph', - 'Removed (and sanitized) {0} inter-dm relationships', - 'Adding individual graphSpec of session {0} to each DM', - 'Successfully added individual graphSpec of session {0} to each DM', - 'Deploying Session {0} in all hosts', - 'Successfully deployed session {0} in all hosts', - 'Establishing {0} drop relationships', - 'Established all drop relationships {0} in', - 'Moving Drops to COMPLETED right away', - 'Successfully triggered drops', - 'Got a node list with {0} node managers'] + 'Unroll completed for {0} with # of Drops', + 'Start to translate', + 'Translation completed for', + 'PG spec is calculated', + 'Creating Session {0} in all hosts', + 'Successfully created session {0} in all hosts', + 'Separating graph', + 'Removed (and sanitized) {0} inter-dm relationships', + 'Adding individual graphSpec of session {0} to each DM', + 'Successfully added individual graphSpec of session {0} to each DM', + 'Deploying Session {0} in all hosts', + 'Successfully deployed session {0} in all hosts', + 'Establishing {0} drop relationships', + 'Established all drop relationships {0} in', + 'Moving Drops to COMPLETED right away', + 'Successfully triggered drops', + 'Got a node list with {0} node managers'] nm_kl = [ - 'Starting Pyro4 Daemon for session', # Logged by the old master branch - 'Creating DROPs for session', # Drops are being created - 'Session {0} is now RUNNING', # All drops created and ready - 'Session {0} finished' # All drops executed + 'Starting Pyro4 Daemon for session', # Logged by the old master branch + 'Creating DROPs for session', # Drops are being created + 'Session {0} is now RUNNING', # All drops created and ready + 'Session {0} finished' # All drops executed ] kwords = dict() @@ -355,7 +364,7 @@ def build_dim_log_entry_pairs(self): def build_nm_log_entry_pairs(self): return [LogEntryPair(name, g1, g2) for name, g1, g2 in ( - ('completion_time_old', 0, 3), # Old master branch + ('completion_time_old', 0, 3), # Old master branch ('completion_time', 2, 3), ('node_deploy_time', 1, 2), )] @@ -467,7 +476,7 @@ def parse(self, out_csv=None): actual_num_nm = num_node_mgrs or theory_num_nm if actual_num_nm != num_finished_sess: print("Pipeline %s is not complete: %d != %d." % (pip_name, actual_num_nm, num_finished_sess)) - #return + # return else: failed_nodes = theory_num_nm - actual_num_nm num_nodes -= failed_nodes @@ -484,9 +493,10 @@ def parse(self, out_csv=None): indexed_leps = {lep._name: lep for lep in log_entry_pairs} deploy_time = indexed_leps['node_deploy_time'].get_duration() - if (deploy_time is None): # since some node managers failed to start + if (deploy_time is None): # since some node managers failed to start continue - exec_time = indexed_leps['completion_time'].get_duration() or indexed_leps['completion_time_old'].get_duration() + exec_time = indexed_leps['completion_time'].get_duration() or indexed_leps[ + 'completion_time_old'].get_duration() if (exec_time is None): continue real_exec_time = exec_time - (max_node_deploy_time - deploy_time) @@ -496,9 +506,9 @@ def parse(self, out_csv=None): temp_nm = [str(max_exec_time)] ret = [user_name, socket.gethostname().split('-')[0], pip_name, do_date, - num_nodes, num_drops, git_commit] + num_nodes, num_drops, git_commit] ret = [str(x) for x in ret] - num_dims = num_dims if num_dims == 1 else num_dims - 1 #exclude master manager + num_dims = num_dims if num_dims == 1 else num_dims - 1 # exclude master manager add_line = ','.join(ret + temp_dim + temp_nm + [str(int(num_dims))]) if (out_csv is not None): with open(out_csv, 'a') as of: @@ -509,8 +519,8 @@ def parse(self, out_csv=None): def check_log_dir(self, log_dir): possible_logs = [ - os.path.join(log_dir, '0', 'dlgDIM.log'), - os.path.join(log_dir, '0', 'dlgMM.log') + os.path.join(log_dir, '0', 'dlgDIM.log'), + os.path.join(log_dir, '0', 'dlgMM.log') ] for dim_log_f in possible_logs: if (os.path.exists(dim_log_f)): @@ -522,6 +532,7 @@ def check_log_dir(self, log_dir): return True return False + if __name__ == '__main__': parser = optparse.OptionParser() @@ -534,22 +545,23 @@ def check_log_dir(self, log_dir): parser.add_option("-L", "--logical-graph", action="store", type="string", dest="logical_graph", help="The filename of the logical graph to deploy", default=None) parser.add_option("-P", "--physical-graph", action="store", type="string", - dest="physical_graph", help="The filename of the physical graph (template) to deploy", default=None) + dest="physical_graph", help="The filename of the physical graph (template) to deploy", + default=None) parser.add_option("-t", "--job-dur", action="store", type="int", dest="job_dur", help="job duration in minutes", default=30) parser.add_option("-n", "--num_nodes", action="store", type="int", dest="num_nodes", help="number of compute nodes requested", default=5) parser.add_option('-i', '--graph_vis', action='store_true', - dest='graph_vis', help='Whether to visualise graph (poll status)', default=False) + dest='graph_vis', help='Whether to visualise graph (poll status)', default=False) parser.add_option('-p', '--run_proxy', action='store_true', - dest='run_proxy', help='Whether to attach proxy server for real-time monitoring', default=False) + dest='run_proxy', help='Whether to attach proxy server for real-time monitoring', default=False) parser.add_option("-m", "--monitor_host", action="store", type="string", - dest="mon_host", help="Monitor host IP (optional)", default=default_aws_mon_host) + dest="mon_host", help="Monitor host IP (optional)", default=default_aws_mon_host) parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="mon_port", help="The port to bind DALiuGE monitor", default=default_aws_mon_port) + dest="mon_port", help="The port to bind DALiuGE monitor", default=default_aws_mon_port) parser.add_option("-v", "--verbose-level", action="store", type="int", - dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", - default=1) + dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", + default=1) parser.add_option("-c", "--csvoutput", action="store", dest="csv_output", help="CSV output file to keep the log analysis result") parser.add_option("-z", "--zerorun", action="store_true", @@ -557,13 +569,15 @@ def check_log_dir(self, log_dir): parser.add_option("-y", "--sleepncopy", action="store_true", dest="sleepncopy", help="Whether include COPY in the default Component drop", default=False) parser.add_option("-T", "--max-threads", action="store", type="int", - dest="max_threads", help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) + dest="max_threads", + help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) parser.add_option('-s', '--num_islands', action='store', type='int', - dest='num_islands', default=1, help='The number of Data Islands') + dest='num_islands', default=1, help='The number of Data Islands') parser.add_option("-u", "--all_nics", action="store_true", dest="all_nics", help="Listen on all NICs for a node manager", default=False) parser.add_option("-S", "--check_with_session", action="store_true", - dest="check_with_session", help="Check for node managers' availability by creating/destroy a session", default=False) + dest="check_with_session", + help="Check for node managers' availability by creating/destroy a session", default=False) (opts, args) = parser.parse_args(sys.argv) if (opts.action == 2): diff --git a/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py b/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py index c313acfc5..f84add407 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py +++ b/daliuge-runtime/dlg/deploy/pawsey/slurm_utils.py @@ -23,6 +23,7 @@ class ListTokens(object): STRING, COMMA, RANGE_SEP, MULTICASE_START, MULTICASE_END = range(5) + def _list_tokenizer(s): buff = [] for char in s: @@ -51,8 +52,8 @@ def _list_tokenizer(s): yield ListTokens.STRING, ''.join(buff) buff = [] -def _parse_list_tokens(token_iter): +def _parse_list_tokens(token_iter): def finish_element(sub_values, range_start): if sub_values: values.extend(sub_values) @@ -93,6 +94,7 @@ def finish_element(sub_values, range_start): else: values.append(value) + def list_as_string(s): """'a008,b[072-073,076]' --> ['a008', 'b072', 'b073', 'b076']""" - return _parse_list_tokens(iter(_list_tokenizer(s))) \ No newline at end of file + return _parse_list_tokens(iter(_list_tokenizer(s))) diff --git a/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py b/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py index 2a59bd3f9..9462f851d 100644 --- a/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py +++ b/daliuge-runtime/dlg/deploy/pawsey/start_dfms_cluster.py @@ -49,8 +49,7 @@ from ...manager import cmdline from ...manager.client import NodeManagerClient from ...manager.constants import NODE_DEFAULT_REST_PORT, \ -ISLAND_DEFAULT_REST_PORT, MASTER_DEFAULT_REST_PORT - + ISLAND_DEFAULT_REST_PORT, MASTER_DEFAULT_REST_PORT DIM_WAIT_TIME = 60 MM_WAIT_TIME = DIM_WAIT_TIME @@ -64,6 +63,7 @@ "test.graphsRepository.SleepAndCopyApp", ) + def check_host(host, port, timeout=5, check_with_session=False): """ Checks if a given host/port is up and running (i.e., it is open). @@ -83,6 +83,7 @@ def check_host(host, port, timeout=5, check_with_session=False): except: return False + def check_hosts(ips, port, timeout=None, check_with_session=False, retry=1): """ Check that the given list of IPs are all up in the given port within the @@ -107,6 +108,7 @@ def check_and_add(ip): return [ip for ip in up if ip] + def get_ip_via_ifconfig(iface_index): out = subprocess.check_output('ifconfig') ifaces_info = list(filter(None, out.split(b'\n\n'))) @@ -114,12 +116,14 @@ def get_ip_via_ifconfig(iface_index): for line in ifaces_info[iface_index].splitlines(): line = line.strip() if line.startswith(b'inet'): - return utils.b2s(line.split()[1]) + return utils.b2s(line.split()[1]) raise ValueError('Interace %d is not an IP interface' % iface_index) + def get_ip_via_netifaces(iface_index): return utils.get_local_ip_addr()[iface_index][0] + def start_node_mgr(log_dir, my_ip, logv=1, max_threads=0, host=None, event_listeners=''): """ Start node manager @@ -132,6 +136,7 @@ def start_node_mgr(log_dir, my_ip, logv=1, max_threads=0, host=None, event_liste '--event-listeners', event_listeners] return cmdline.dlgNM(optparse.OptionParser(), args) + def start_dim(node_list, log_dir, origin_ip, logv=1): """ Start data island manager @@ -144,6 +149,7 @@ def start_dim(node_list, log_dir, origin_ip, logv=1): logger.info('Island manager process started with pid %d', proc.pid) return proc + def start_mm(node_list, log_dir, logv=1): """ Start master manager @@ -160,20 +166,25 @@ def start_mm(node_list, log_dir, logv=1): def _stop(endpoints): def _the_stop(endpoint): common.BaseDROPManagerClient(endpoint[0], endpoint[1]).stop() + tp = multiprocessing.pool.ThreadPool(min(50, len(endpoints))) tp.map(_the_stop, endpoints) tp.close() tp.join() + def stop_nms(ips): _stop([(ip, NODE_DEFAULT_REST_PORT) for ip in ips]) + def stop_dims(ips): _stop([(ip, ISLAND_DEFAULT_REST_PORT) for ip in ips]) + def stop_mm(ip): _stop([(ip, MASTER_DEFAULT_REST_PORT)]) + def submit_and_monitor(pg, opts, port): def _task(): dump_path = None @@ -187,6 +198,7 @@ def _task(): break except: logger.exception('Monitoring failed, restarting it') + t = threading.Thread(target=_task) t.start() return t @@ -207,6 +219,7 @@ def start_proxy(dlg_host, dlg_port, monitor_host, monitor_port): logger.exception("DALiuGE proxy terminated unexpectedly") sys.exit(1) + def modify_pg(pgt, modifier): parts = modifier.split(',') func = utils.get_symbol(parts[0]) @@ -214,6 +227,7 @@ def modify_pg(pgt, modifier): kwargs = dict(map(lambda x: x.split('='), filter(lambda x: '=' in x, parts[1:]))) return func(pgt, *args, **kwargs) + def get_pg(opts, nms, dims): """Gets the Physical Graph that is eventually submitted to the cluster, if any""" @@ -229,7 +243,7 @@ def get_pg(opts, nms, dims): num_partitions=num_nms, num_islands=num_dims, **algo_params) - del unrolled # quickly dispose of potentially big object + del unrolled # quickly dispose of potentially big object else: with open(opts.physical_graph, 'rb') as f: pgt = json.load(f) @@ -247,10 +261,12 @@ def get_pg(opts, nms, dims): json.dump(pg, f) return pg + def get_ip(opts): find_ip = get_ip_via_ifconfig if opts.use_ifconfig else get_ip_via_netifaces return find_ip(opts.interface) + def get_remote(opts): my_ip = get_ip(opts) if opts.remote_mechanism == 'mpi': @@ -259,44 +275,47 @@ def get_remote(opts): return remotes.DALiuGERemote(opts, my_ip) elif opts.remote_mechanism == 'dlg-hybrid': return remotes.DALiuGEHybridRemote(opts, my_ip) - else: # == 'slurm' + else: # == 'slurm' return remotes.SlurmRemote(opts, my_ip) -def main(): +def main(): parser = optparse.OptionParser() parser.add_option("-l", "--log_dir", action="store", type="string", - dest="log_dir", help="Log directory (required)") + dest="log_dir", help="Log directory (required)") # if this parameter is present, it means we want to get monitored parser.add_option("-m", "--monitor_host", action="store", type="string", - dest="monitor_host", help="Monitor host IP (optional)") + dest="monitor_host", help="Monitor host IP (optional)") parser.add_option("-o", "--monitor_port", action="store", type="int", - dest="monitor_port", help="Monitor port", - default=dfms_proxy.default_dlg_monitor_port) + dest="monitor_port", help="Monitor port", + default=dfms_proxy.default_dlg_monitor_port) parser.add_option("-v", "--verbose-level", action="store", type="int", - dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", - default=1) + dest="verbose_level", help="Verbosity level (1-3) of the DIM/NM logging", + default=1) parser.add_option("-z", "--zerorun", action="store_true", dest="zerorun", help="Generate a physical graph that takes no time to run", default=False) parser.add_option("--app", action="store", type="int", dest="app", help="The app to use in the PG. 1=SleepApp (default), 2=SleepAndCopy", default=0) parser.add_option("-t", "--max-threads", action="store", type="int", - dest="max_threads", help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) + dest="max_threads", + help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) parser.add_option("-L", "--logical-graph", action="store", type="string", dest="logical_graph", help="The filename of the logical graph to deploy", default=None) parser.add_option("-P", "--physical-graph", action="store", type="string", - dest="physical_graph", help="The filename of the physical graph (template) to deploy", default=None) + dest="physical_graph", help="The filename of the physical graph (template) to deploy", + default=None) parser.add_option('-s', '--num_islands', action='store', type='int', - dest='num_islands', default=1, help='The number of Data Islands') + dest='num_islands', default=1, help='The number of Data Islands') parser.add_option('-d', '--dump', action='store_true', - dest='dump', help = 'dump file base name?', default=False) + dest='dump', help='dump file base name?', default=False) parser.add_option("-i", "--interface", type="int", - help="Index of network interface to use as the external interface/address for each host", default=0) + help="Index of network interface to use as the external interface/address for each host", + default=0) parser.add_option('--part-algo', type="string", dest='part_algo', help='Partition algorithms', default='metis') @@ -310,26 +329,31 @@ def main(): dest="all_nics", help="Listen on all NICs for a node manager", default=False) parser.add_option('--check-interfaces', action='store_true', - dest='check_interfaces', help = 'Run a small network interfaces test and exit', default=False) + dest='check_interfaces', help='Run a small network interfaces test and exit', default=False) parser.add_option('--collect-interfaces', action='store_true', - dest='collect_interfaces', help = 'Collect all interfaces and exit', default=False) + dest='collect_interfaces', help='Collect all interfaces and exit', default=False) parser.add_option('--use-ifconfig', action='store_true', - dest='use_ifconfig', help='Use ifconfig to find a suitable external interface/address for each host', default=False) + dest='use_ifconfig', + help='Use ifconfig to find a suitable external interface/address for each host', default=False) parser.add_option("-S", "--check_with_session", action="store_true", - dest="check_with_session", help="Check for node managers' availability by creating/destroy a session", default=False) + dest="check_with_session", + help="Check for node managers' availability by creating/destroy a session", default=False) parser.add_option("--event-listeners", action="store", type="string", - dest="event_listeners", help="A colon-separated list of event listener classes to be used", default='') + dest="event_listeners", help="A colon-separated list of event listener classes to be used", + default='') parser.add_option("--sleep-after-execution", action="store", type="int", - dest="sleep_after_execution", help="Sleep time interval after graph execution finished", default=0) + dest="sleep_after_execution", help="Sleep time interval after graph execution finished", + default=0) parser.add_option('--pg-modifiers', help=('A colon-separated list of python functions that modify a PG before submission. ' 'Each specification is in the form of [,[arg1=]val1][,[arg2=]val2]...'), default='') - parser.add_option('-r', '--remote-mechanism', help='The mechanism used by this script to coordinate remote processes', + parser.add_option('-r', '--remote-mechanism', + help='The mechanism used by this script to coordinate remote processes', choices=['mpi', 'slurm', 'dlg', 'dlg-hybrid'], default='mpi') (options, _) = parser.parse_args() @@ -352,7 +376,6 @@ def main(): print(' '.join(ips)) sys.exit(0) - if bool(options.logical_graph) == bool(options.physical_graph): parser.error("Either a logical graph or physical graph filename must be specified") for p in (options.logical_graph, options.physical_graph): @@ -390,9 +413,9 @@ def main(): if remote.is_nm: start_node_mgr(log_dir, remote.my_ip, logv=logv, - max_threads=options.max_threads, - host=None if options.all_nics else remote.my_ip, - event_listeners=options.event_listeners) + max_threads=options.max_threads, + host=None if options.all_nics else remote.my_ip, + event_listeners=options.event_listeners) elif options.num_islands == 1: if remote.is_proxy: @@ -437,5 +460,6 @@ def main(): utils.wait_or_kill(proc, 1e8, period=5) stop_nms(remote.nm_ips) + if __name__ == '__main__': main() diff --git a/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py b/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py index 0703e4217..9291c547b 100644 --- a/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py +++ b/daliuge-runtime/dlg/deploy/utils/monitor_replayer.py @@ -32,25 +32,32 @@ this module also depends on networkx (included in Daliuge), which produces the edge list that becomes input for gephi vis tool. """ -import pygraphviz as pgv -import networkx as nx -import json, os, logging, optparse, sys, commands, filecmp +import filecmp +import json +import logging +import optparse +import os +import sqlite3 as dbdrv +import sys from collections import defaultdict from datetime import datetime as dt from xml.etree.ElementTree import ElementTree -import sqlite3 as dbdrv + +import commands +import networkx as nx import numpy as np +import pygraphviz as pgv logger = logging.getLogger(__name__) ORIGINAL_COLOR = (87, 87, 87) YELLOW_COLOR = (255, 255, 0) -#GREEN_COLOR = (102, 255, 178) +# GREEN_COLOR = (102, 255, 178) GREEN_COLOR = (0, 255, 0) RED_COLOR = (255, 0, 0) BLUE_COLOR = (102, 178, 255) -#TODO place java class in the current dir, and include it in Git repo +# TODO place java class in the current dir, and include it in Git repo java_cmd = "java -classpath /tmp/classes:/Users/Chen/proj/gephi-toolkit/gephi-toolkit-0.9.1-all.jar dlg.deploy.utils.export_graph" sql_create_status = """\ @@ -66,6 +73,7 @@ GROUP BY oid """ + class GraphPlayer(object): def __init__(self, graph_path, status_path): for fp in [graph_path, status_path]: @@ -74,7 +82,8 @@ def __init__(self, graph_path, status_path): if (not os.path.exists(fp)): raise Exception("JSON file not found: {0}".format(fp)) self.oid_gnid_dict = dict() - self.node_graph_dict = defaultdict(list) # k - node-ip, v - a list of tuple of (graph node_id, downstream drop ids) + self.node_graph_dict = defaultdict( + list) # k - node-ip, v - a list of tuple of (graph node_id, downstream drop ids) self.gnid_ip_dict = dict() self.status_path = status_path with open(graph_path) as f: @@ -90,16 +99,16 @@ def __init__(self, graph_path, status_path): def status_to_colour(self, st): st = int(st) - if (st == 0): #INITIALIZED or NOT_RUN + if (st == 0): # INITIALIZED or NOT_RUN r, g, b = ORIGINAL_COLOR - elif (st == 1): # WRITING or RUNNING - #logger.debug("running") + elif (st == 1): # WRITING or RUNNING + # logger.debug("running") r, g, b = YELLOW_COLOR - elif (st == 2): # COMPLETED or FINISHED - #logger.debug("completed") + elif (st == 2): # COMPLETED or FINISHED + # logger.debug("completed") r, g, b = GREEN_COLOR - elif (st == 3): # ERROR - #logger.debug("error") + elif (st == 3): # ERROR + # logger.debug("error") r, g, b = RED_COLOR else: r, g, b = BLUE_COLOR @@ -134,7 +143,8 @@ def parse_status(self, gexf_file, out_dir=None, remove_gexf=False): with open(self.status_path) as f: for i, line in enumerate(f): colour_dict = dict() - colour_dict['{}'] = '\n' % (ORIGINAL_COLOR[0], ORIGINAL_COLOR[1], ORIGINAL_COLOR[2]) + colour_dict['{}'] = '\n' % ( + ORIGINAL_COLOR[0], ORIGINAL_COLOR[1], ORIGINAL_COLOR[2]) output_lines = [] pgs = json.loads(line) ts = pgs['ts'] @@ -150,22 +160,22 @@ def parse_status(self, gexf_file, out_dir=None, remove_gexf=False): output_lines.append(gexf_line) else: if (gexf_line.find(" -1): - #logger.debug("Starting with viz color") + # logger.debug("Starting with viz color") if (node_id is None): raise Exception("wrong order") output_lines.append(colour_dict[node_id]) else: if (gexf_line.find(" - #38345 + # + # 38345 node_id = gexf_line.split()[1].split('=')[1][1:-1] output_lines.append(gexf_line) # each line generate a new file new_gexf = '{0}/{1}.gexf'.format(out_dir, ts) with open(new_gexf, 'w') as fo: for new_line in output_lines: - #fo.write('{0}{1}'.format(new_line, os.linesep)) - #fo.write('{0}{1}'.format(new_line, '\n')) + # fo.write('{0}{1}'.format(new_line, os.linesep)) + # fo.write('{0}{1}'.format(new_line, '\n')) fo.write(new_line) logger.info("GEXF file '{0}' is generated".format(new_gexf)) new_png = new_gexf.split('.gexf')[0] + '.png' @@ -182,7 +192,7 @@ def parse_status(self, gexf_file, out_dir=None, remove_gexf=False): def get_downstream_drop_ids(self, dropspec): if (dropspec['type'] == 'app'): - ds_kw = 'outputs' #down stream key word + ds_kw = 'outputs' # down stream key word elif (dropspec['type'] == 'plain'): ds_kw = 'consumers' else: @@ -197,7 +207,7 @@ def build_node_graph(self): A graph contains all compute nodes and their relationships """ G = pgv.AGraph(strict=False, directed=True) - temp_dict = defaultdict(int) #key - from_to_ip, val - counter + temp_dict = defaultdict(int) # key - from_to_ip, val - counter for i, ip in enumerate(self.node_graph_dict.keys()): G.add_node(ip, shape='rect', label='%d' % i) @@ -224,8 +234,8 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): # convert grep_log_file to csv if (out_dir is None): out_dir = os.path.dirname(gexf_file) - #grep_log_file = '{0}/statelog.txt'.format(out_dir) - #cmd = "" + # grep_log_file = '{0}/statelog.txt'.format(out_dir) + # cmd = "" csv_file = '{0}/csv_file.csv'.format(out_dir) sqlite_file = '{0}/sqlite_file.sqlite'.format(out_dir) @@ -235,7 +245,7 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): with open(csv_file, "w") as fo: for line in alllines: ts = line.split('[DEBUG]')[0].split('dlgNM.log:')[1].strip() - ts = int(dt.strptime(ts,'%Y-%m-%d %H:%M:%S,%f').strftime('%s')) + ts = int(dt.strptime(ts, '%Y-%m-%d %H:%M:%S,%f').strftime('%s')) oid = line.split('oid=')[1].split()[0] state = line.split()[-1] fo.write('{0},{1},{2},{3}'.format(ts, oid, state, os.linesep)) @@ -293,8 +303,8 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): drops = cur.fetchall() cur.close() - #build a dictionary - drop_dict = dict() # key - gnid, value: drop status + # build a dictionary + drop_dict = dict() # key - gnid, value: drop status for drop in drops: gnid = self.oid_gnid_dict[drop[1]] drop_dict[gnid] = drop[2] @@ -325,7 +335,6 @@ def get_state_changes(self, gexf_file, grep_log_file, steps=400, out_dir=None): if (ret[0] != 0): logger.error("Fail to print png from %s to %s: %s" % (last_gexf, new_png, ret[1])) - def build_drop_subgraphs(self, node_range='[0:20]'): pass @@ -338,7 +347,7 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): else: G = nx.Graph() do_subgraph = False - subgraph_dict = defaultdict(list) # k - node-ip, v - a list of graph nodes + subgraph_dict = defaultdict(list) # k - node-ip, v - a list of graph nodes oid_gnid_dict = dict() for i, oid in enumerate(self.pg_spec.keys()): @@ -350,15 +359,15 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): ip = dropspec['node'] subgraph_dict[ip].append(gid) if (dropspec['type'] == 'app'): - G.add_node(gid, shape='rect', label='')#, fixedsize=True, hight=.05, width=.05) - elif (dropspec['type'] == 'plain'): #parallelogram - G.add_node(gid, shape='circle', label='')#, fixedsize=True, hight=.05, width=.05) + G.add_node(gid, shape='rect', label='') # , fixedsize=True, hight=.05, width=.05) + elif (dropspec['type'] == 'plain'): # parallelogram + G.add_node(gid, shape='circle', label='') # , fixedsize=True, hight=.05, width=.05) logger.info("Graph nodes added") for dropspec in self.pg_spec.itervalues(): gid = oid_gnid_dict[dropspec['oid']] if (dropspec['type'] == 'app'): - ds_kw = 'outputs' #down stream key word + ds_kw = 'outputs' # down stream key word elif (dropspec['type'] == 'plain'): ds_kw = 'consumers' else: @@ -372,11 +381,12 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): for i, subgraph_nodes in enumerate(subgraph_dict.values()): # we don't care about the subgraph label or rank subgraph = G.add_subgraph(subgraph_nodes, label='%d' % i, name="cluster_%d" % i, rank="same") - subgraph.graph_attr['rank']='same' + subgraph.graph_attr['rank'] = 'same' logger.info("Subgraph added") return G + if __name__ == '__main__': """ 1. create edge list from 'monitor_g.log' @@ -407,9 +417,9 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): parser.add_option("-d", "--dot_file", action="store", type="string", dest="dot_file", help="output do file", default=None) parser.add_option('-s', '--subgraph', action='store_true', - dest='subgraph', help = 'create subgraph per node', default=False) + dest='subgraph', help='create subgraph per node', default=False) parser.add_option('-e', '--edgelist', action='store_true', - dest='edgelist', help = 'store edge list instead of dot file', default=False) + dest='edgelist', help='store edge list instead of dot file', default=False) parser.add_option("-r", "--grep_log_file", action="store", type="string", dest="grep_log_file", help="grep log file", default=None) @@ -435,7 +445,7 @@ def build_drop_fullgraphs(self, do_subgraph=False, graph_lib='pygraphviz'): sys.exit(1) gp = GraphPlayer(options.graph_path, options.status_path) - #gp.parse_status(options.gexf_file, out_dir=options.gexf_output_dir) + # gp.parse_status(options.gexf_file, out_dir=options.gexf_output_dir) gp.get_state_changes(options.gexf_file, options.grep_log_file, out_dir=options.gexf_output_dir) """ g = gp.build_node_graph() diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 55eb3d199..78de60684 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -23,22 +23,22 @@ Module containing the core DROP classes. """ -from abc import ABCMeta, abstractmethod import base64 import collections import contextlib import errno import heapq import importlib +import inspect import logging import math import os import random +import re import shutil import threading import time -import re -import inspect +from abc import ABCMeta, abstractmethod import six from six import BytesIO @@ -48,27 +48,30 @@ from .event import EventFirer from .exceptions import InvalidDropException, InvalidRelationshipException from .io import OpenMode, FileIO, MemoryIO, NgasIO, ErrorIO, NullIO, ShoreIO -from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking from .meta import dlg_float_param, dlg_int_param, dlg_list_param, \ dlg_string_param, dlg_bool_param, dlg_dict_param -from .reproducibility import constants +from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking # Opt into using per-drop checksum calculation checksum_disabled = 'DLG_DISABLE_CHECKSUM' in os.environ try: from crc32c import crc32 # @UnusedImport + _checksumType = ChecksumTypes.CRC_32C except: from binascii import crc32 # @Reimport - _checksumType = ChecksumTypes.CRC_32 + _checksumType = ChecksumTypes.CRC_32 logger = logging.getLogger(__name__) + class ListAsDict(list): """A list that adds drop UIDs to a set as they get appended to the list""" + def __init__(self, my_set): self.set = my_set + def append(self, drop): super(ListAsDict, self).append(drop) self.set.add(drop.uid) @@ -76,9 +79,10 @@ def append(self, drop): track_current_drop = object_tracking('drop') -#=============================================================================== + +# =============================================================================== # DROP classes follow -#=============================================================================== +# =============================================================================== class AbstractDROP(EventFirer): @@ -196,10 +200,10 @@ def __init__(self, oid, uid, **kwargs): self._streamingConsumers = ListAsDict(self._streamingConsumers_uids) self._refCount = 0 - self._refLock = threading.Lock() + self._refLock = threading.Lock() self._location = None - self._parent = None - self._status = None + self._parent = None + self._status = None self._statusLock = threading.RLock() # Current and target phases. @@ -219,9 +223,9 @@ def __init__(self, oid, uid, **kwargs): # this information. # Note also that the setters of these two properties also allow to set # a value on them, but only if they are None - self._checksum = None + self._checksum = None self._checksumType = None - self._size = None + self._size = None self._merkleRoot = None self._committed = False @@ -272,7 +276,7 @@ def __init__(self, oid, uid, **kwargs): # Expected lifespan for this object, used by to expire them if 'lifespan' in kwargs and 'expireAfterUse' in kwargs: raise InvalidDropException(self, "%r specifies both `lifespan` and `expireAfterUse`" \ - "but they are mutually exclusive" % (self,)) + "but they are mutually exclusive" % (self,)) self._expireAfterUse = self._getArg(kwargs, 'expireAfterUse', False) self._expirationDate = -1 @@ -292,7 +296,7 @@ def __init__(self, oid, uid, **kwargs): # Sub-class initialization; mark ourselves as INITIALIZED after that self.initialize(**kwargs) - self._status = DROPStates.INITIALIZED # no need to use synchronised self.status here + self._status = DROPStates.INITIALIZED # no need to use synchronised self.status here def _extract_attributes(self, **kwargs): @@ -303,7 +307,7 @@ def getmembers(object, predicate=None): yield k, v # Take a class dlg defined parameter class attribute and create an instanced attribute on object - for attr_name, obj in getmembers(self, lambda a: not(inspect.isfunction(a) or isinstance(a, property))): + for attr_name, obj in getmembers(self, lambda a: not (inspect.isfunction(a) or isinstance(a, property))): if isinstance(obj, dlg_float_param): value = kwargs.get(attr_name, obj.default_value) if value is not None: @@ -715,7 +719,7 @@ def status(self, value): return self._status = value - self._fire('status', status = value) + self._fire('status', status=value) @property def parent(self): @@ -733,7 +737,7 @@ def parent(self, parent): logger.warning("A parent is already set in %r, overwriting with new value" % (self,)) if parent: prevParent = self._parent - self._parent = parent # a parent is a container + self._parent = parent # a parent is a container if hasattr(parent, 'addChild') and self not in parent.children: try: parent.addChild(self) @@ -744,7 +748,7 @@ def get_consumers_nodes(self): """ Gets the physical node address(s) of the consumer of this drop. """ - return [cons.node for cons in self._consumers] +\ + return [cons.node for cons in self._consumers] + \ [cons.node for cons in self._streamingConsumers] @property @@ -862,7 +866,8 @@ def producerFinished(self, uid, drop_state): nProd = len(self._producers) if nFinished > nProd: - raise Exception("More producers finished that registered in DROP %r: %d > %d" % (self, nFinished, nProd)) + raise Exception( + "More producers finished that registered in DROP %r: %d > %d" % (self, nFinished, nProd)) elif nFinished == nProd: finished = True @@ -904,7 +909,7 @@ def addStreamingConsumer(self, streamingConsumer, back=True): # Add if not already present if scuid in self._streamingConsumers_uids: return - logger.debug('Adding new streaming streaming consumer for %r: %s' %(self, streamingConsumer)) + logger.debug('Adding new streaming streaming consumer for %r: %s' % (self, streamingConsumer)) self._streamingConsumers.append(streamingConsumer) # Automatic back-reference @@ -980,6 +985,7 @@ def node(self): def dataIsland(self): return self._dataIsland + class PathBasedDrop(object): """Base class for data drops that handle paths (i.e., file and directory drops)""" @@ -1013,6 +1019,7 @@ def get_dir(self, dirname): def path(self): return self._path + class FileDROP(AbstractDROP, PathBasedDrop): """ A DROP that points to data stored in a mounted filesystem. @@ -1124,7 +1131,7 @@ def delete(self): @property def dataURL(self): - hostname = os.uname()[1] # TODO: change when necessary + hostname = os.uname()[1] # TODO: change when necessary return "file://" + hostname + self._path @@ -1156,7 +1163,7 @@ class NgasDROP(AbstractDROP): ngasConnectTimeout = dlg_int_param('ngasConnectTimeout', 2) def initialize(self, **kwargs): - pass + pass def getIO(self): return NgasIO(self.ngasSrv, self.uid, port=self.ngasPort, @@ -1225,7 +1232,6 @@ def initialize(self, **kwargs): # The table this Drop points at self._db_table = kwargs.pop('dbtable') - def getIO(self): # This Drop cannot be accessed directly return ErrorIO() @@ -1243,10 +1249,10 @@ def insert(self, vals): """ with self._connection() as c: with self._cursor(c) as cur: - # vals is a dictionary, its keys are the column names and its # values are the values to insert - sql = "INSERT into %s (%s) VALUES (%s)" % (self._db_table, ','.join(vals.keys()), ','.join(['{}']*len(vals))) + sql = "INSERT into %s (%s) VALUES (%s)" % ( + self._db_table, ','.join(vals.keys()), ','.join(['{}'] * len(vals))) sql, vals = prepare_sql(sql, self._db_drv.paramstyle, list(vals.values())) logger.debug('Executing SQL with parameters: %s / %r', sql, vals) cur.execute(sql, vals) @@ -1298,9 +1304,9 @@ def initialize(self, **kwargs): super(ContainerDROP, self).initialize(**kwargs) self._children = [] - #=========================================================================== + # =========================================================================== # No data-related operations should actually be called in Container DROPs - #=========================================================================== + # =========================================================================== def getIO(self): return ErrorIO() @@ -1342,7 +1348,7 @@ def exists(self): if self._children: # TODO: Or should it be all()? Depends on what the exact contract of # "exists" is - return any([c.exists() for c in self._children]) + return any([c.exists() for c in self._children]) return True @@ -1385,13 +1391,13 @@ def delete(self): def exists(self): return os.path.isdir(self._path) -#=============================================================================== + +# =============================================================================== # AppDROP classes follow -#=============================================================================== +# =============================================================================== class AppDROP(ContainerDROP): - ''' An AppDROP is a DROP representing an application that reads data from one or more DROPs (its inputs), and writes data onto one or more @@ -1428,12 +1434,12 @@ def initialize(self, **kwargs): # Input and output objects are later referenced by their *index* # (relative to the order in which they were added to this object) # Therefore we use an ordered dict to keep the insertion order. - self._inputs = collections.OrderedDict() + self._inputs = collections.OrderedDict() self._outputs = collections.OrderedDict() # Same as above, only that these correspond to the 'streaming' version # of the consumers - self._streamingInputs = collections.OrderedDict() + self._streamingInputs = collections.OrderedDict() # An AppDROP has a second, separate state machine indicating its # execution status. @@ -1629,7 +1635,7 @@ def dropCompleted(self, uid, drop_state): if (error_len + ok_len) == n_eff_inputs: # calculate the number of errors that have already occurred - percent_failed = math.floor((error_len/float(n_eff_inputs)) * 100) + percent_failed = math.floor((error_len / float(n_eff_inputs)) * 100) logger.debug("Error on inputs for %r: %d/%d", self, percent_failed, self.input_error_threshold) @@ -1639,7 +1645,7 @@ def dropCompleted(self, uid, drop_state): self, percent_failed, self.input_error_threshold) self.execStatus = AppDROPStates.ERROR - self.status = DROPStates.ERROR + self.status = DROPStates.ERROR self._notifyAppIsFinished() else: self.async_execute() @@ -1702,11 +1708,13 @@ def run(self): def exists(self): return True + class BarrierAppDROP(InputFiredAppDROP): """ A BarrierAppDROP is an InputFireAppDROP that waits for all its inputs to complete, effectively blocking the flow of the graph execution. """ + def initialize(self, **kwargs): # Blindly override existing value if any kwargs['n_effective_inputs'] = -1 @@ -1718,13 +1726,13 @@ def initialize(self, **kwargs): # (e.g., one uses `addConsumer` to add a DROPLinkeType.CONSUMER DROP into # another) LINKTYPE_1TON_APPEND_METHOD = { - DROPLinkType.CONSUMER: 'addConsumer', + DROPLinkType.CONSUMER: 'addConsumer', DROPLinkType.STREAMING_CONSUMER: 'addStreamingConsumer', - DROPLinkType.INPUT: 'addInput', - DROPLinkType.STREAMING_INPUT: 'addStreamingInput', - DROPLinkType.OUTPUT: 'addOutput', - DROPLinkType.CHILD: 'addChild', - DROPLinkType.PRODUCER: 'addProducer' + DROPLinkType.INPUT: 'addInput', + DROPLinkType.STREAMING_INPUT: 'addStreamingInput', + DROPLinkType.OUTPUT: 'addOutput', + DROPLinkType.CHILD: 'addChild', + DROPLinkType.PRODUCER: 'addProducer' } # Same as above, but for N-to-1 relationships, in which case we indicate not a @@ -1734,13 +1742,13 @@ def initialize(self, **kwargs): } LINKTYPE_1TON_BACK_APPEND_METHOD = { - DROPLinkType.CONSUMER: 'addInput', + DROPLinkType.CONSUMER: 'addInput', DROPLinkType.STREAMING_CONSUMER: 'addStreamingInput', - DROPLinkType.INPUT: 'addConsumer', - DROPLinkType.STREAMING_INPUT: 'addStreamingConsumer', - DROPLinkType.OUTPUT: 'addProducer', - DROPLinkType.CHILD: 'setParent', - DROPLinkType.PRODUCER: 'addOutput' + DROPLinkType.INPUT: 'addConsumer', + DROPLinkType.STREAMING_INPUT: 'addStreamingConsumer', + DROPLinkType.OUTPUT: 'addProducer', + DROPLinkType.CHILD: 'setParent', + DROPLinkType.PRODUCER: 'addOutput' } LINKTYPE_NTO1_BACK_APPEND_METHOD = { diff --git a/daliuge-runtime/dlg/droputils.py b/daliuge-runtime/dlg/droputils.py index 45bef91d1..8865b2166 100644 --- a/daliuge-runtime/dlg/droputils.py +++ b/daliuge-runtime/dlg/droputils.py @@ -31,30 +31,32 @@ import six +from . import common from .ddap_protocol import DROPStates from .drop import AppDROP from .io import IOForURL, OpenMode -from . import common - logger = logging.getLogger(__name__) # Used to check whether a command specifies via UID reference the path or # data URL of an input or output -indexed_ipath_pattern = re.compile(r".*%i\[.+\].*") -indexed_opath_pattern = re.compile(r".*%o\[.+\].*") +indexed_ipath_pattern = re.compile(r".*%i\[.+\].*") +indexed_opath_pattern = re.compile(r".*%o\[.+\].*") indexed_idataurl_pattern = re.compile(r".*%iDataURL\[.+\].*") indexed_odataurl_pattern = re.compile(r".*%oDataURL\[.+\].*") + class EvtConsumer(object): ''' Small utility class that sets the internal flag of the given threading.Event object when consuming a DROP. Used throughout the tests as a barrier to wait until all DROPs of a given graph have executed. ''' + def __init__(self, evt, expected_states=[]): self._evt = evt self._expected_states = expected_states or (DROPStates.COMPLETED, DROPStates.ERROR) + def handleEvent(self, e): if e.status in self._expected_states: self._evt.set() @@ -81,12 +83,14 @@ def __init__(self, test, drops, timeout=1, expected_states=[]): self._test = test self._timeout = timeout self._evts = [] + def __enter__(self): for drop in self._drops: evt = threading.Event() drop.subscribe(EvtConsumer(evt, expected_states=self._expected_states), 'status') self._evts.append(evt) return self + def __exit__(self, typ, value, tb): if typ is not None: traceback.print_tb(tb) @@ -112,6 +116,7 @@ def allDropContents(drop, bufsize=4096): drop.close(desc) return buf.getvalue() + def copyDropContents(source, target, bufsize=4096): ''' Manually copies data from one DROP into another, in bufsize steps @@ -124,6 +129,7 @@ def copyDropContents(source, target, bufsize=4096): buf = read(desc, bufsize) source.close(desc) + def getUpstreamObjects(drop): """ Returns a list of all direct "upstream" DROPs for the given @@ -144,6 +150,7 @@ def getUpstreamObjects(drop): upObjs += drop.producers return upObjs + def getDownstreamObjects(drop): """ Returns a list of all direct "downstream" DROPs for the given @@ -163,15 +170,17 @@ def getDownstreamObjects(drop): downObjs += drop.streamingConsumers return downObjs + def getLeafNodes(nodes): """ Returns a list of all the "leaf nodes" of the graph pointed by `nodes`. `nodes` is either a single DROP, or a list of DROPs. """ nodes = listify(nodes) - return [drop for drop,_ in breadFirstTraverse(nodes) if not getDownstreamObjects(drop)] + return [drop for drop, _ in breadFirstTraverse(nodes) if not getDownstreamObjects(drop)] + -def depthFirstTraverse(node, visited = []): +def depthFirstTraverse(node, visited=[]): """ Depth-first iterator for a DROP graph. @@ -191,6 +200,7 @@ def depthFirstTraverse(node, visited = []): for x in depthFirstTraverse(drop, visited): yield x + def breadFirstTraverse(toVisit): """ Breadth-first iterator for a DROP graph. @@ -209,7 +219,6 @@ def breadFirstTraverse(toVisit): # See how many arguments we should used when calling func while toVisit: - # Pay the node a visit node = toVisit.popleft() dependencies = getDownstreamObjects(node) @@ -220,6 +229,7 @@ def breadFirstTraverse(toVisit): visited.update(next_visits) toVisit += next_visits + def listify(o): """ If `o` is already a list return it as is; if `o` is a tuple returns a list @@ -232,6 +242,7 @@ def listify(o): return list(o) return [o] + class DROPFile(object): """ A file-like object (currently only supporting the read() operation, more to @@ -249,6 +260,7 @@ class DROPFile(object): Objects of this class can also be used in a `with` context. """ + def __init__(self, drop): self._drop = drop self._io = IOForURL(drop.dataURL) @@ -296,6 +308,7 @@ def read(self, size=4096): def __enter__(self): self.open() return self + def __exit__(self, typ, value, traceback): self.close() @@ -303,6 +316,7 @@ def __del__(self): if not self._isClosed: self.close() + def has_path(x): """Returns `True` if `x` has a `path` attribute""" try: @@ -311,6 +325,7 @@ def has_path(x): except: return False + def replace_path_placeholders(cmd, inputs, outputs): """ Replaces any placeholder found in ``cmd`` with the path of the respective @@ -326,11 +341,11 @@ def replace_path_placeholders(cmd, inputs, outputs): logger.debug('Replacing cmd %s with placeholders with I/O uids: %r, %r', cmd, inputs.keys(), outputs.keys()) - for x,i in enumerate(inputs.values()): + for x, i in enumerate(inputs.values()): pathRef = "%%i%d" % (x,) if pathRef in cmd: cmd = cmd.replace(pathRef, i.path) - for x,o in enumerate(outputs.values()): + for x, o in enumerate(outputs.values()): pathRef = "%%o%d" % (x) if pathRef in cmd: cmd = cmd.replace(pathRef, o.path) @@ -348,6 +363,7 @@ def replace_path_placeholders(cmd, inputs, outputs): return cmd + def replace_dataurl_placeholders(cmd, inputs, outputs): """ Replaces any placeholder found in ``cmd`` with the dataURL property of the @@ -364,20 +380,20 @@ def replace_dataurl_placeholders(cmd, inputs, outputs): # bind their data via volumes into the docker container. Instead they # communicate their dataURL via command-line replacement - for x,i in enumerate(inputs.values()): + for x, i in enumerate(inputs.values()): dataUrlRef = "%%iDataURL%d" % (x,) if dataUrlRef in cmd: cmd = cmd.replace(dataUrlRef, i.dataURL) - for x,o in enumerate(outputs.values()): + for x, o in enumerate(outputs.values()): dataUrlRef = "%%oDataURL%d" % (x,) if dataUrlRef in cmd: cmd = cmd.replace(dataUrlRef, o.dataURL) - for uid,i in inputs.items(): + for uid, i in inputs.items(): dataURLRef = "%%iDataURL[%s]" % (uid,) if dataURLRef in cmd: cmd = cmd.replace(dataURLRef, i.dataURL) - for uid,o in outputs.items(): + for uid, o in outputs.items(): dataURLRef = "%%oDataURL[%s]" % (uid,) if dataURLRef in cmd: cmd = cmd.replace(dataUrlRef, o.dataURL) @@ -386,6 +402,7 @@ def replace_dataurl_placeholders(cmd, inputs, outputs): return cmd + # Easing the transition from single- to multi-package get_leaves = common.get_leaves -get_roots = common.get_roots \ No newline at end of file +get_roots = common.get_roots diff --git a/daliuge-runtime/dlg/event.py b/daliuge-runtime/dlg/event.py index 5c4b16e3c..afc70d4a8 100644 --- a/daliuge-runtime/dlg/event.py +++ b/daliuge-runtime/dlg/event.py @@ -23,9 +23,9 @@ import collections import logging - logger = logging.getLogger(__name__) + class Event(object): """ An event sent through the DALiuGE framework. @@ -42,6 +42,7 @@ def __init__(self): def __repr__(self, *args, **kwargs): return '' % (self.__dict__) + class EventFirer(object): """ An object that fires events. @@ -107,4 +108,4 @@ def _fireEvent(self, eventType, **attrs): setattr(e, k, v) for l in listeners: - l.handleEvent(e) \ No newline at end of file + l.handleEvent(e) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index 25e1690ec..ae511cf2a 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -37,17 +37,17 @@ from .exceptions import InvalidGraphException from .json_drop import JsonDROP - STORAGE_TYPES = { 'memory': InMemoryDROP, - 'file' : FileDROP, - 'ngas' : NgasDROP, - 'null' : NullDROP, - 'json' : JsonDROP, + 'file': FileDROP, + 'ngas': NgasDROP, + 'null': NullDROP, + 'json': JsonDROP, } try: from .s3_drop import S3DROP + STORAGE_TYPES['s3'] = S3DROP except ImportError: pass @@ -55,13 +55,13 @@ # Dictionary for the key used to store 1-to-N relationships between DROPs # in the the DROP specification format __TOMANY = { - DROPLinkType.CONSUMER: 'consumers', + DROPLinkType.CONSUMER: 'consumers', DROPLinkType.STREAMING_CONSUMER: 'streamingConsumers', - DROPLinkType.INPUT: 'inputs', - DROPLinkType.STREAMING_INPUT: 'streamingInputs', - DROPLinkType.OUTPUT: 'outputs', - DROPLinkType.CHILD: 'children', - DROPLinkType.PRODUCER: 'producers', + DROPLinkType.INPUT: 'inputs', + DROPLinkType.STREAMING_INPUT: 'streamingInputs', + DROPLinkType.OUTPUT: 'outputs', + DROPLinkType.CHILD: 'children', + DROPLinkType.PRODUCER: 'producers', } # Same for above, but for n-to-1 relationships @@ -70,11 +70,12 @@ } # Both also contain the reverse mapping -__TOMANY.update({v:k for k,v in __TOMANY.items()}) -__TOONE.update({v:k for k,v in __TOONE.items()}) +__TOMANY.update({v: k for k, v in __TOMANY.items()}) +__TOONE.update({v: k for k, v in __TOONE.items()}) logger = logging.getLogger(__name__) + def addLink(linkType, lhDropSpec, rhOID, force=False): """ Adds a link from `lhDropSpec` to point to `rhOID`. The link type (e.g., a @@ -159,12 +160,14 @@ def removeUnmetRelationships(dropSpecList): return unmetRelationships + def check_dropspec(n, dropSpec): if 'oid' not in dropSpec: raise InvalidGraphException("Drop #%d is missing its 'oid' argument: %r" % (n, dropSpec)) if 'type' not in dropSpec: raise InvalidGraphException("Drop %s is missing its 'type' argument" % (dropSpec['oid'])) + def loadDropSpecs(dropSpecList): """ Loads the DROP definitions from `dropSpectList`, checks that @@ -176,8 +179,7 @@ def loadDropSpecs(dropSpecList): # Step #1: Check the DROP specs and collect them dropSpecs = {} - for n,dropSpec in enumerate(dropSpecList): - + for n, dropSpec in enumerate(dropSpecList): # 'type' and 'oit' are mandatory check_dropspec(n, dropSpec) dropType = dropSpec['type'] @@ -199,7 +201,7 @@ def loadDropSpecs(dropSpecList): # relationship list but doesn't exist in the list of DROPs for oid in dropSpec[rel]: dropSpecs[oid] - # N-1 relationships + # N-1 relationships elif rel in __TOONE: # See comment above dropSpecs[dropSpec[rel]] @@ -207,15 +209,14 @@ def loadDropSpecs(dropSpecList): # Done! return dropSpecs -def createGraphFromDropSpecList(dropSpecList, session=None): +def createGraphFromDropSpecList(dropSpecList, session=None): logger.debug("Found %d DROP definitions", len(dropSpecList)) # Step #1: create the actual DROPs drops = collections.OrderedDict() logger.info("Creating %d drops", len(dropSpecList)) - for n,dropSpec in enumerate(dropSpecList): - + for n, dropSpec in enumerate(dropSpecList): check_dropspec(n, dropSpec) dropType = dropSpec.pop('type') @@ -262,9 +263,10 @@ def createGraphFromDropSpecList(dropSpecList, session=None): return roots + def _createPlain(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) # 'storage' is mandatory storageType = STORAGE_TYPES[dropSpec['storage']] @@ -272,9 +274,10 @@ def _createPlain(dropSpec, dryRun=False, session=None): return return storageType(oid, uid, dlg_session=session, **kwargs) + def _createContainer(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) # if no 'container' is specified, we default to ContainerDROP if 'container' in dropSpec: @@ -285,7 +288,7 @@ def _createContainer(dropSpec, dryRun=False, session=None): if parts[0] == 'dfms': parts[0] = 'dlg' - module = importlib.import_module('.'.join(parts[:-1])) + module = importlib.import_module('.'.join(parts[:-1])) containerType = getattr(module, parts[-1]) else: containerType = ContainerDROP @@ -295,28 +298,30 @@ def _createContainer(dropSpec, dryRun=False, session=None): return containerType(oid, uid, dlg_session=session, **kwargs) + def _createSocket(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) if dryRun: return return SocketListenerApp(oid, uid, dlg_session=session, **kwargs) + def _createApp(dropSpec, dryRun=False, session=None): oid, uid = _getIds(dropSpec) - kwargs = _getKwargs(dropSpec) + kwargs = _getKwargs(dropSpec) del kwargs['app'] appName = dropSpec['app'] - parts = appName.split('.') + parts = appName.split('.') # Support old "dfms..." package names (pre-Oct2017) if parts[0] == 'dfms': parts[0] = 'dlg' try: - module = importlib.import_module('.'.join(parts[:-1])) + module = importlib.import_module('.'.join(parts[:-1])) appType = getattr(module, parts[-1]) except (ImportError, AttributeError): raise InvalidGraphException("drop %s specifies non-existent application: %s" % (oid, appName,)) @@ -325,6 +330,7 @@ def _createApp(dropSpec, dryRun=False, session=None): return return appType(oid, uid, dlg_session=session, **kwargs) + def _getIds(dropSpec): # uid is copied from oid if not explicitly given oid = dropSpec['oid'] @@ -333,6 +339,7 @@ def _getIds(dropSpec): uid = dropSpec['uid'] return oid, uid + def _getKwargs(dropSpec): kwargs = dict(dropSpec) del kwargs['oid'] @@ -340,6 +347,7 @@ def _getKwargs(dropSpec): del kwargs['uid'] return kwargs + __CREATION_FUNCTIONS = { 'plain': _createPlain, 'container': _createContainer, diff --git a/daliuge-runtime/dlg/io.py b/daliuge-runtime/dlg/io.py index 2809717dc..5c225a259 100644 --- a/daliuge-runtime/dlg/io.py +++ b/daliuge-runtime/dlg/io.py @@ -19,22 +19,23 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # -from abc import abstractmethod, ABCMeta import logging import os +from abc import abstractmethod, ABCMeta -from six import BytesIO import six.moves.urllib.parse as urlparse # @UnresolvedImport +from six import BytesIO from . import ngaslite from . import shoreClient - logger = logging.getLogger(__name__) + class OpenMode: OPEN_WRITE, OPEN_READ = range(2) + class DataIO(object): """ A class used to read/write data stored in a particular kind of storage in an @@ -115,16 +116,21 @@ def delete(self): """ @abstractmethod - def _open(self, **kwargs): pass + def _open(self, **kwargs): + pass @abstractmethod - def _read(self, count, **kwargs): pass + def _read(self, count, **kwargs): + pass @abstractmethod - def _write(self, data, **kwargs): pass + def _write(self, data, **kwargs): + pass @abstractmethod - def _close(self, **kwargs): pass + def _close(self, **kwargs): + pass + class NullIO(DataIO): """ @@ -149,6 +155,7 @@ def exists(self): def delete(self): pass + class ErrorIO(DataIO): """ An DataIO method that throws exceptions if any of its methods is invoked @@ -172,6 +179,7 @@ def exists(self): def delete(self): raise NotImplementedError() + class MemoryIO(DataIO): """ A DataIO class that reads/write from/into the BytesIO object given at @@ -206,6 +214,7 @@ def exists(self): def delete(self): self._buf.close() + class FileIO(DataIO): def __init__(self, filename, **kwargs): @@ -236,9 +245,10 @@ def exists(self): def delete(self): os.unlink(self._fnm) + class ShoreIO(DataIO): - def __init__(self, doid, column, row, rows = 1, address = None, **kwargs): + def __init__(self, doid, column, row, rows=1, address=None, **kwargs): super(ShoreIO, self).__init__() self._doid = doid self._column = column @@ -276,8 +286,6 @@ def delete(self): pass - - class NgasIO(DataIO): ''' A DROP whose data is finally stored into NGAS. Since NGAS doesn't @@ -285,7 +293,7 @@ class NgasIO(DataIO): in a file on the local filesystem and then move it to the NGAS destination ''' - def __init__(self, hostname, fileId, port = 7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): + def __init__(self, hostname, fileId, port=7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): # Check that we actually have the NGAMS client libraries try: @@ -295,12 +303,12 @@ def __init__(self, hostname, fileId, port = 7777, ngasConnectTimeout=2, ngasTime raise super(NgasIO, self).__init__() - self._ngasSrv = hostname - self._ngasPort = port + self._ngasSrv = hostname + self._ngasPort = port self._ngasConnectTimeout = ngasConnectTimeout - self._ngasTimeout = ngasTimeout - self._fileId = fileId - self._length = length + self._ngasTimeout = ngasTimeout + self._fileId = fileId + self._length = length def _getClient(self): from ngamsPClient import ngamsPClient # @UnresolvedImport @@ -320,10 +328,10 @@ def _close(self, **kwargs): client = self._desc if self._mode == OpenMode.OPEN_WRITE: reply, msg, _, _ = client._httpPost( - client.getHost(), client.getPort(), 'QARCHIVE', - 'application/octet-stream', dataRef=self._buf, - pars=[['filename',self._fileId]], dataSource='BUFFER', - dataSize=self._writtenDataSize) + client.getHost(), client.getPort(), 'QARCHIVE', + 'application/octet-stream', dataRef=self._buf, + pars=[['filename', self._fileId]], dataSource='BUFFER', + dataSize=self._writtenDataSize) self._buf = None if reply != 200: # Probably msg is not enough, we need to unpack the status XML doc @@ -349,7 +357,8 @@ def exists(self): return status.getStatus() == ngamsLib.ngamsCore.NGAMS_SUCCESS def delete(self): - pass # We never delete stuff from NGAS + pass # We never delete stuff from NGAS + class NgasLiteIO(DataIO): ''' @@ -361,14 +370,14 @@ class NgasLiteIO(DataIO): that this class will throw an error if its `exists` method is invoked. ''' - def __init__(self, hostname, fileId, port = 7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): + def __init__(self, hostname, fileId, port=7777, ngasConnectTimeout=2, ngasTimeout=2, length=-1): super(NgasLiteIO, self).__init__() - self._ngasSrv = hostname - self._ngasPort = port + self._ngasSrv = hostname + self._ngasPort = port self._ngasConnectTimeout = ngasConnectTimeout - self._ngasTimeout = ngasTimeout - self._fileId = fileId - self._length = length + self._ngasTimeout = ngasTimeout + self._fileId = fileId + self._length = length def _getClient(self): from ngamsPClient import ngamsPClient # @UnresolvedImport @@ -376,7 +385,8 @@ def _getClient(self): def _open(self, **kwargs): if self._mode == OpenMode.OPEN_WRITE: - return ngaslite.beingArchive(self._ngasSrv, self._fileId, port=self._ngasPort, timeout=self._ngasTimeout, length=self._length) + return ngaslite.beingArchive(self._ngasSrv, self._fileId, port=self._ngasPort, timeout=self._ngasTimeout, + length=self._length) return ngaslite.retrieve(self._ngasSrv, self._fileId, port=self._ngasPort, timeout=self._ngasTimeout) def _close(self, **kwargs): @@ -399,7 +409,8 @@ def exists(self): raise NotImplementedError("This method is not supported by this class") def delete(self): - pass # We never delete stuff from NGAS + pass # We never delete stuff from NGAS + def IOForURL(url): """ @@ -412,7 +423,7 @@ def IOForURL(url): hostname = url.netloc filename = url.path if hostname == 'localhost' or hostname == '127.0.0.1' or \ - hostname == os.uname()[1]: + hostname == os.uname()[1]: io = FileIO(filename) elif url.scheme == 'null': io = NullIO() diff --git a/daliuge-runtime/dlg/lifecycle/__init__.py b/daliuge-runtime/dlg/lifecycle/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/dlg/lifecycle/__init__.py +++ b/daliuge-runtime/dlg/lifecycle/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/dlg/lifecycle/dlm.py b/daliuge-runtime/dlg/lifecycle/dlm.py index fa7ae3a60..65b9cd21a 100644 --- a/daliuge-runtime/dlg/lifecycle/dlm.py +++ b/daliuge-runtime/dlg/lifecycle/dlm.py @@ -130,14 +130,15 @@ from ..ddap_protocol import DROPStates, DROPPhases, AppDROPStates from ..drop import ContainerDROP - logger = logging.getLogger(__name__) + class DataLifecycleManagerBackgroundTask(threading.Thread): ''' A thread that periodically runs some of the methods on the given DLM until signaled to stop ''' + def __init__(self, dlm, period, finishedEvent): threading.Thread.__init__(self, name="DLMBackgroundTask") self._dlm = dlm @@ -153,6 +154,7 @@ def run(self): break self.doTask(dlm) + class DROPChecker(DataLifecycleManagerBackgroundTask): ''' A thread that performs several checks on existing DROPs @@ -166,6 +168,7 @@ def doTask(self, dlm): # if they are not found dlm.deleteLostDrops() + class DROPGarbageCollector(DataLifecycleManagerBackgroundTask): ''' A thread that performs "garbage collection" of DROPs; that is, it physically @@ -176,6 +179,7 @@ def doTask(self, dlm): # The names says it all dlm.deleteExpiredDrops() + class DROPMover(DataLifecycleManagerBackgroundTask): ''' A thread that automatically moves DROPs between layers of the HSM. @@ -187,6 +191,7 @@ class DROPMover(DataLifecycleManagerBackgroundTask): def doTask(self, dlm): dlm.moveDropsAround() + class DropEventListener(object): def __init__(self, dlm): @@ -199,6 +204,7 @@ def handleEvent(self, event): if event.status == DROPStates.COMPLETED: self._dlm.handleCompletedDrop(event.uid) + class DataLifecycleManager(object): def __init__(self, **kwargs): @@ -216,7 +222,7 @@ def __init__(self, **kwargs): if 'checkPeriod' in kwargs: self._checkPeriod = float(kwargs['checkPeriod']) - self._cleanupPeriod = 10*self._checkPeriod + self._cleanupPeriod = 10 * self._checkPeriod if 'cleanupPeriod' in kwargs: self._cleanupPeriod = float(kwargs['cleanupPeriod']) @@ -254,7 +260,6 @@ def __enter__(self): def __exit__(self, typ, value, traceback): self.cleanup() - def _deleteDrop(self, drop): logger.debug("Deleting DROP %r", drop) drop.delete() @@ -283,12 +288,12 @@ def expireCompletedDrops(self): # (if no lifespan was specified for the DROP, its expiration # date will be -1 and it will be skipped) elif drop.expirationDate == -1 or \ - now <= drop.expirationDate: + now <= drop.expirationDate: continue if drop.isBeingRead(): logger.info("%r has expired but is currently being read, " \ - "will skip expiration for the time being", drop) + "will skip expiration for the time being", drop) continue # Finally! @@ -338,7 +343,8 @@ def deleteLostDrops(self): definitelyLost = True if definitelyLost: - logger.error("No available replica found for DROP %s/%s, the data is DEFINITELY LOST", drop.oid, drop.uid) + logger.error("No available replica found for DROP %s/%s, the data is DEFINITELY LOST", drop.oid, + drop.uid) drop.phase = DROPPhases.LOST self._reg.setDropPhase(drop, drop.phase) @@ -491,7 +497,8 @@ def getDropUids(self, drop): def _replicate(self, drop, store): # Dummy, but safe, new UID - newUid = 'uid:' + ''.join([random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10)]) + newUid = 'uid:' + ''.join( + [random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(10)]) logger.debug('Creating new DROP with uid %s from %r', newUid, drop) @@ -501,4 +508,4 @@ def _replicate(self, drop, store): logger.debug('%r successfully replicated to %r', drop, newDrop) - return newDrop, newUid \ No newline at end of file + return newDrop, newUid diff --git a/daliuge-runtime/dlg/lifecycle/hsm/__init__.py b/daliuge-runtime/dlg/lifecycle/hsm/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/dlg/lifecycle/hsm/__init__.py +++ b/daliuge-runtime/dlg/lifecycle/hsm/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/dlg/lifecycle/hsm/manager.py b/daliuge-runtime/dlg/lifecycle/hsm/manager.py index c82fde11e..31330e2e1 100644 --- a/daliuge-runtime/dlg/lifecycle/hsm/manager.py +++ b/daliuge-runtime/dlg/lifecycle/hsm/manager.py @@ -30,9 +30,9 @@ from ..hsm import store - logger = logging.getLogger(__name__) + class HierarchicalStorageManager(object): def __init__(self): @@ -51,4 +51,4 @@ def getSlowestStore(self): """ :return store.AbstractStore: """ - return self._stores[-1] \ No newline at end of file + return self._stores[-1] diff --git a/daliuge-runtime/dlg/lifecycle/hsm/store.py b/daliuge-runtime/dlg/lifecycle/hsm/store.py index b5892bdd2..7ab929004 100644 --- a/daliuge-runtime/dlg/lifecycle/hsm/store.py +++ b/daliuge-runtime/dlg/lifecycle/hsm/store.py @@ -27,18 +27,18 @@ @author: rtobar ''' -from abc import ABCMeta, abstractmethod import json import logging import os +from abc import ABCMeta, abstractmethod import psutil from ...drop import FileDROP, InMemoryDROP, NgasDROP - logger = logging.getLogger(__name__) + class AbstractStore(object): """ The abstract store implementation, see the subclasses for details @@ -58,7 +58,7 @@ def updateSpaces(self): if logger.isEnabledFor(logging.DEBUG): avail = self.getAvailableSpace() total = self.getTotalSpace() - perc = avail*100./total + perc = avail * 100. / total logger.debug("Available/Total space on %s: %d/%d (%.2f %%)" % (self, avail, total, perc)) pass @@ -88,6 +88,7 @@ def createDrop(self, oid, uid, **kwargs): def _updateSpaces(self): pass + class FileSystemStore(AbstractStore): """ A filesystem store implementation. It requires a mount point at construction @@ -95,6 +96,7 @@ class FileSystemStore(AbstractStore): device fully. It creates FileDROPs that live directly in the root of the filesystem, and monitors the usage of the filesystem. """ + def __init__(self, mountPoint, savingDir=None): super(FileSystemStore, self).__init__() @@ -121,7 +123,7 @@ def _updateSpaces(self): fragmentSize = stat.f_bsize totalSpace = blocks * fragmentSize - availableSpace=freeBlocks * blockSize + availableSpace = freeBlocks * blockSize self._setTotalSpace(totalSpace) self._setAvailableSpace(availableSpace) @@ -132,6 +134,7 @@ def createDrop(self, oid, uid, **kwargs): def __str__(self): return self._mountPoint + class MemoryStore(AbstractStore): """ A store that uses RAM memory as its storage mechanism. It creates @@ -153,11 +156,13 @@ def createDrop(self, oid, uid, **kwargs): def __str__(self): return 'Memory' + class NgasStore(AbstractStore): """ A store that a given NGAS server as its storage mechanism. It creates NgasDROPs and monitors the disks usage of the NGAS system. """ + def __init__(self, host=None, port=None, initialCheck=True): try: @@ -190,7 +195,7 @@ def _updateSpaces(self): # col14 = bytes_stored totalAvailable += float(disk['col13']) totalStored += int(disk['col14']) - totalAvailable *= 1024**2 # to bytes + totalAvailable *= 1024 ** 2 # to bytes # TODO: Check if these computations are correct, I'm not sure if the # quantities stored by NGAS should be interpreted like this, or @@ -199,7 +204,7 @@ def _updateSpaces(self): self._setAvailableSpace(totalAvailable) def createDrop(self, oid, uid, **kwargs): - kwargs['ngasSrv'] = self._host + kwargs['ngasSrv'] = self._host kwargs['ngasPort'] = self._port return NgasDROP(oid, uid, **kwargs) @@ -210,6 +215,7 @@ def _getClient(self): def __str__(self): return "NGAS@%s:%d" % (self._host, self._port) + class DirectoryStore(AbstractStore): """ A store similar to the FileSystemStore that doesn't actually act on @@ -234,10 +240,11 @@ def __init__(self, dirName, initialize=False): sizeFile = os.path.join(dirName, self.__SIZE_FILE) if not initialize and not os.path.isfile(sizeFile): - raise Exception("No %s file under %s, cannot determine available space for DirectoryStore" % (self.__SIZE_FILE, dirName)) + raise Exception("No %s file under %s, cannot determine available space for DirectoryStore" % ( + self.__SIZE_FILE, dirName)) else: # Should be used only for testing - size = 1024**3 + size = 1024 ** 3 logger.info('Initializing %s with size %d. THIS SHOULD ONLY BE USED DURING TESTING', sizeFile, size) self.prepareDirectory(dirName, size) @@ -280,4 +287,4 @@ def prepareDirectory(dirName, size): f.write(str(size)) def __str__(self): - return "dir:%s" % (self._dirName) \ No newline at end of file + return "dir:%s" % (self._dirName) diff --git a/daliuge-runtime/dlg/lifecycle/registry.py b/daliuge-runtime/dlg/lifecycle/registry.py index 477712430..524ae0c5d 100644 --- a/daliuge-runtime/dlg/lifecycle/registry.py +++ b/daliuge-runtime/dlg/lifecycle/registry.py @@ -31,26 +31,27 @@ @author: rtobar ''' -from abc import abstractmethod, ABCMeta import importlib import logging import time +from abc import abstractmethod, ABCMeta from ..ddap_protocol import DROPPhases from ..utils import prepare_sql - logger = logging.getLogger(__name__) + class DROP(object): - oid = None - phase = DROPPhases.GAS - instances = [] + oid = None + phase = DROPPhases.GAS + instances = [] accessTimes = [] + class DROPInstance(object): - oid = None - uid = None + oid = None + uid = None storage = None @@ -106,11 +107,12 @@ def _checkDropIsInRegistry(self, oid): if not oid in self._drops: raise Exception('DROP %s is not present in the registry' % (oid)) + class InMemoryRegistry(Registry): def __init__(self): super(InMemoryRegistry, self).__init__() - self._drops= {} + self._drops = {} def addDrop(self, drop): ''' @@ -118,8 +120,8 @@ def addDrop(self, drop): ''' # Check that the DROP is not in the registry dropRow = DROP() - dropRow.oid = drop.oid - dropRow.phase = drop.phase + dropRow.oid = drop.oid + dropRow.phase = drop.phase dropRow.instances = {drop.uid: drop} self._drops[dropRow.oid] = dropRow @@ -150,6 +152,7 @@ def getLastAccess(self, oid): else: return -1 + class RDBMSRegistry(Registry): def __init__(self, dbModuleName, *connArgs): @@ -219,7 +222,8 @@ def addDrop(self, drop, conn=None): def addDropInstance(self, drop, conn=None): with self.transactional(self, conn) as conn: cur = conn.cursor() - self.execute(cur, 'INSERT INTO dlg_dropinstance (oid, uid, dataRef) VALUES ({0},{1},{2})', (drop.oid, drop.uid, drop.dataURL)) + self.execute(cur, 'INSERT INTO dlg_dropinstance (oid, uid, dataRef) VALUES ({0},{1},{2})', + (drop.oid, drop.uid, drop.dataURL)) cur.close() def getDropUids(self, drop, conn=None): @@ -239,15 +243,18 @@ def setDropPhase(self, drop, phase, conn=None): def recordNewAccess(self, oid, conn=None): with self.transactional(self, conn) as conn: cur = conn.cursor() - self.execute(cur, 'INSERT INTO dlg_dropaccesstime (oid, accessTime) VALUES ({0},{1})', (oid, self._dbmod.TimestampFromTicks(time.time()))) + self.execute(cur, 'INSERT INTO dlg_dropaccesstime (oid, accessTime) VALUES ({0},{1})', + (oid, self._dbmod.TimestampFromTicks(time.time()))) cur.close() def getLastAccess(self, oid, conn=None): with self.transactional(self, conn) as conn: cur = conn.cursor() - self.execute(cur, 'SELECT accessTime FROM dlg_dropaccesstime WHERE oid = {0} ORDER BY accessTime DESC LIMIT 1', (oid,)) + self.execute(cur, + 'SELECT accessTime FROM dlg_dropaccesstime WHERE oid = {0} ORDER BY accessTime DESC LIMIT 1', + (oid,)) row = cur.fetchone() cur.close() if row is None: return -1 - return row[0] \ No newline at end of file + return row[0] diff --git a/daliuge-runtime/dlg/manager/client.py b/daliuge-runtime/dlg/manager/client.py index 0a0c16dab..0a7be9a78 100644 --- a/daliuge-runtime/dlg/manager/client.py +++ b/daliuge-runtime/dlg/manager/client.py @@ -22,9 +22,8 @@ """Backwards compatibility for client""" from .. import clients - BaseDROPManagerClient = clients.BaseDROPManagerClient NodeManagerClient = clients.NodeManagerClient CompositeManagerClient = clients.CompositeManagerClient DataIslandManagerClient = clients.DataIslandManagerClient -MasterManagerClient = clients.MasterManagerClient \ No newline at end of file +MasterManagerClient = clients.MasterManagerClient diff --git a/daliuge-runtime/dlg/manager/cmdline.py b/daliuge-runtime/dlg/manager/cmdline.py index d8b23263d..3f5a79b16 100644 --- a/daliuge-runtime/dlg/manager/cmdline.py +++ b/daliuge-runtime/dlg/manager/cmdline.py @@ -44,10 +44,10 @@ from .. import utils from ..runtime import version - _terminating = False -def launchServer(opts): + +def launchServer(opts): # we might be called via __main__, but we want a nice logger name logger = logging.getLogger(__name__) dmName = opts.dmType.__name__ @@ -80,29 +80,32 @@ def handle_signal(signNo, stack_frame): def addCommonOptions(parser, defaultPort): parser.add_option("-H", "--host", action="store", type="string", - dest="host", help = "The host to bind this instance on", default='localhost') + dest="host", help="The host to bind this instance on", default='localhost') parser.add_option("-P", "--port", action="store", type="int", - dest="port", help = "The port to bind this instance on", default=defaultPort) + dest="port", help="The port to bind this instance on", default=defaultPort) parser.add_option("-m", "--max-request-size", action="store", type="int", dest="maxreqsize", help="The maximum allowed HTTP request size, in MB", default=10) parser.add_option("-d", "--daemon", action="store_true", dest="daemon", help="Run as daemon", default=False) - parser.add_option( "--cwd", action="store_true", + parser.add_option("--cwd", action="store_true", dest="cwd", help="Short for '-w .'", default=False) parser.add_option("-w", "--work-dir", help="Working directory, defaults to '/' in daemon mode, '.' in interactive mode", default=None) parser.add_option("-s", "--stop", action="store_true", dest="stop", help="Stop an instance running as daemon", default=False) - parser.add_option( "--status", action="store_true", + parser.add_option("--status", action="store_true", dest="status", help="Checks if there is daemon process actively running", default=False) parser.add_option("-T", "--timeout", action="store", - dest="timeout", type="float", help="Timeout used when checking for the daemon process", default=10) + dest="timeout", type="float", help="Timeout used when checking for the daemon process", + default=10) parser.add_option("-v", "--verbose", action="count", dest="verbose", help="Become more verbose. The more flags, the more verbose") parser.add_option("-q", "--quiet", action="count", dest="quiet", help="Be less verbose. The more flags, the quieter") parser.add_option("-l", "--log-dir", action="store", type="string", - dest="logdir", help="The directory where the logging files will be stored", default=utils.getDlgLogsDir()) + dest="logdir", help="The directory where the logging files will be stored", + default=utils.getDlgLogsDir()) + def commonOptionsCheck(options, parser): # These are all exclusive @@ -118,8 +121,8 @@ def commonOptionsCheck(options, parser): if options.cwd and options.work_dir: parser.error("--cwd and -w/--work-dir cannot be specified together. Prefer -w") -def start(options, parser): +def start(options, parser): # Perform common option checks commonOptionsCheck(options, parser) @@ -130,9 +133,9 @@ def start(options, parser): if options.daemon: # Make sure the PID file will be created without problems - pidDir = utils.getDlgPidDir() + pidDir = utils.getDlgPidDir() utils.createDirIfMissing(pidDir) - pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) + pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) working_dir = options.work_dir if not working_dir: @@ -148,7 +151,7 @@ def start(options, parser): # Stop daemon? elif options.stop: pidDir = utils.getDlgPidDir() - pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) + pidfile = os.path.join(pidDir, "dlg%s.pid" % (options.dmAcronym)) pid = PIDLockFile(pidfile).read_pid() if pid is None: sys.stderr.write('Cannot read PID file, is there an instance running?\n') @@ -173,6 +176,7 @@ def start(options, parser): os.chdir(working_dir) launchServer(options) + def setupLogging(opts): if logging.root.handlers: # Mmmm, somebody already did some logging, it shouldn't have been us @@ -240,17 +244,21 @@ def dlgNM(parser, args): # Parse command-line and check options addCommonOptions(parser, NODE_DEFAULT_REST_PORT) parser.add_option("-I", "--no-log-ids", action="store_true", - dest="no_log_ids", help="Do not add associated session IDs and Drop UIDs to log statements", default=False) + dest="no_log_ids", help="Do not add associated session IDs and Drop UIDs to log statements", + default=False) parser.add_option("--no-dlm", action="store_true", dest="noDLM", help="Don't start the Data Lifecycle Manager on this NodeManager", default=False) parser.add_option("--dlg-path", action="store", type="string", - dest="dlgPath", help="Path where more DALiuGE-related libraries can be found", default="~/.dlg/lib") + dest="dlgPath", help="Path where more DALiuGE-related libraries can be found", + default="~/.dlg/lib") parser.add_option("--error-listener", action="store", type="string", dest="errorListener", help="The error listener class to be used", default=None) parser.add_option("--event-listeners", action="store", type="string", - dest="event_listeners", help="A colon-separated list of event listener classes to be used", default='') + dest="event_listeners", help="A colon-separated list of event listener classes to be used", + default='') parser.add_option("-t", "--max-threads", action="store", type="int", - dest="max_threads", help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) + dest="max_threads", + help="Max thread pool size used for executing drops. 0 (default) means no pool.", default=0) (options, args) = parser.parse_args(args) # Add DM-specific options @@ -269,6 +277,7 @@ def dlgNM(parser, args): start(options, parser) + def dlgCompositeManager(parser, args, dmType, acronym, dmPort, dmRestServer): """ Common entry point for the dlgDIM and dlgMM command-line scripts. It @@ -279,11 +288,14 @@ def dlgCompositeManager(parser, args, dmType, acronym, dmPort, dmRestServer): # Parse command-line and check options addCommonOptions(parser, dmPort) parser.add_option("-N", "--nodes", action="store", type="string", - dest="nodes", help = "Comma-separated list of node names managed by this %s" % (acronym), default="") + dest="nodes", help="Comma-separated list of node names managed by this %s" % (acronym), + default="") parser.add_option("-k", "--ssh-pkey-path", action="store", type="string", - dest="pkeyPath", help = "Path to the private SSH key to use when connecting to the nodes", default=None) + dest="pkeyPath", help="Path to the private SSH key to use when connecting to the nodes", + default=None) parser.add_option("--dmCheckTimeout", action="store", type="int", - dest="dmCheckTimeout", help="Maximum timeout used when automatically checking for DM presence", default=10) + dest="dmCheckTimeout", help="Maximum timeout used when automatically checking for DM presence", + default=10) (options, args) = parser.parse_args(args) # Add DIM-specific options @@ -295,18 +307,21 @@ def dlgCompositeManager(parser, args, dmType, acronym, dmPort, dmRestServer): start(options, parser) + def dlgDIM(parser, args): """ Entry point for the dlg dim command """ dlgCompositeManager(parser, args, DataIslandManager, 'DIM', ISLAND_DEFAULT_REST_PORT, CompositeManagerRestServer) + def dlgMM(parser, args): """ Entry point for the dlg mm command """ dlgCompositeManager(parser, args, MasterManager, 'MM', MASTER_DEFAULT_REST_PORT, MasterManagerRestServer) + def dlgReplay(parser, args): """ Entry point for the dlg replay command @@ -332,4 +347,4 @@ def dlgReplay(parser, args): options.dmAcronym = 'RP' options.restType = ReplayManagerServer - start(options, parser) \ No newline at end of file + start(options, parser) diff --git a/daliuge-runtime/dlg/manager/composite_manager.py b/daliuge-runtime/dlg/manager/composite_manager.py index 383b6e3d2..2f03d3a25 100644 --- a/daliuge-runtime/dlg/manager/composite_manager.py +++ b/daliuge-runtime/dlg/manager/composite_manager.py @@ -30,22 +30,22 @@ from .client import NodeManagerClient from .constants import ISLAND_DEFAULT_REST_PORT, NODE_DEFAULT_REST_PORT from .drop_manager import DROPManager -from .. import remote, graph_loader +from .. import graph_loader from ..ddap_protocol import DROPRel from ..exceptions import InvalidGraphException, DaliugeException, \ SubManagerException from ..utils import portIsOpen - logger = logging.getLogger(__name__) + def uid_for_drop(dropSpec): if 'uid' in dropSpec: return dropSpec['uid'] return dropSpec['oid'] -def sanitize_relations(interDMRelations, graph): +def sanitize_relations(interDMRelations, graph): # TODO: Big change required to remove this hack here # # Values in the interDMRelations array use OIDs to identify drops. @@ -72,12 +72,14 @@ def sanitize_relations(interDMRelations, graph): newDMRelations.append(new_rel) interDMRelations[:] = newDMRelations + def group_by_node(uids, graph): uids_by_node = collections.defaultdict(list) for uid in uids: uids_by_node[graph[uid]['node']].append(uid) return uids_by_node + class CompositeManager(DROPManager): """ A DROPManager that in turn manages DROPManagers (sigh...). @@ -123,10 +125,10 @@ def __init__(self, dmPort, partitionAttr, subDmId, dmHosts=[], pkeyPath=None, dm self._dmHosts = dmHosts self._graph = {} self._drop_rels = {} - self._sessionIds = [] # TODO: it's still unclear how sessions are managed at the composite-manager level + self._sessionIds = [] # TODO: it's still unclear how sessions are managed at the composite-manager level self._pkeyPath = pkeyPath self._dmCheckTimeout = dmCheckTimeout - n_threads = max(1,min(len(dmHosts),20)) + n_threads = max(1, min(len(dmHosts), 20)) self._tp = multiprocessing.pool.ThreadPool(n_threads) # The list of bottom-level nodes that are covered by this manager @@ -333,7 +335,8 @@ def addGraphSpec(self, sessionId, graphSpec): # Create the individual graphs on each DM now that they are correctly # separated. logger.info('Adding individual graphSpec of session %s to each DM', sessionId) - self.replicate(sessionId, self._addGraphSpec, "appending graphSpec to individual DMs", iterable=perPartition.items()) + self.replicate(sessionId, self._addGraphSpec, "appending graphSpec to individual DMs", + iterable=perPartition.items()) logger.info('Successfully added individual graphSpec of session %s to each DM', sessionId) def _deploySession(self, dm, host, sessionId): @@ -413,6 +416,7 @@ def getGraphSize(self, sessionId): self.replicate(sessionId, self._getGraphSize, "getting the graph size", collect=allCounts) return sum(allCounts) + class DataIslandManager(CompositeManager): """ The DataIslandManager, which manages a number of NodeManagers. @@ -434,6 +438,7 @@ def add_node(self, node): CompositeManager.add_node(self, node) self._dmHosts.append(node) + class MasterManager(CompositeManager): """ The MasterManager, which manages a number of DataIslandManagers. diff --git a/daliuge-runtime/dlg/manager/constants.py b/daliuge-runtime/dlg/manager/constants.py index 67698ffe6..ed6500138 100644 --- a/daliuge-runtime/dlg/manager/constants.py +++ b/daliuge-runtime/dlg/manager/constants.py @@ -22,7 +22,6 @@ """Backwards compatibility for constants""" from .. import constants - DEFAULT_PORTS = constants.DEFAULT_PORTS NODE_DEFAULT_REST_PORT = constants.NODE_DEFAULT_REST_PORT ISLAND_DEFAULT_REST_PORT = constants.ISLAND_DEFAULT_REST_PORT @@ -30,4 +29,4 @@ REPLAY_DEFAULT_REST_PORT = constants.REPLAY_DEFAULT_REST_PORT DAEMON_DEFAULT_REST_PORT = constants.DAEMON_DEFAULT_REST_PORT NODE_DEFAULT_EVENTS_PORT = constants.NODE_DEFAULT_EVENTS_PORT -NODE_DEFAULT_RPC_PORT = constants.NODE_DEFAULT_RPC_PORT \ No newline at end of file +NODE_DEFAULT_RPC_PORT = constants.NODE_DEFAULT_RPC_PORT diff --git a/daliuge-runtime/dlg/manager/drop_manager.py b/daliuge-runtime/dlg/manager/drop_manager.py index e09a710b9..d3148c164 100644 --- a/daliuge-runtime/dlg/manager/drop_manager.py +++ b/daliuge-runtime/dlg/manager/drop_manager.py @@ -120,4 +120,4 @@ def getGraphSize(self, sessionId): """ Returns the number of drops contained in the physical graph attached to ``sessionId``. - """ \ No newline at end of file + """ diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index c5656abf5..542589b3f 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -42,13 +42,13 @@ from .. import rpc, utils from ..ddap_protocol import DROPStates from ..drop import AppDROP -from ..exceptions import NoSessionException, SessionAlreadyExistsException,\ +from ..exceptions import NoSessionException, SessionAlreadyExistsException, \ DaliugeException from ..lifecycle.dlm import DataLifecycleManager - logger = logging.getLogger(__name__) + class NMDropEventListener(object): def __init__(self, nm, session_id): @@ -59,6 +59,7 @@ def handleEvent(self, event): event.session_id = self._session_id self._nm.publish_event(event) + class LogEvtListener(object): def handleEvent(self, event): if event.type == 'status': @@ -66,6 +67,7 @@ def handleEvent(self, event): elif event.type == 'execStatus': logger.debug('AppDrop uid=%s, oid=%s changed to execState %s', event.uid, event.oid, event.execStatus) + class ErrorStatusListener(object): """An event listener that passes down the erroneous drop to an error handler""" @@ -111,7 +113,7 @@ def __init__(self, dlgPath=None, error_listener=None, event_listeners=[], - max_threads = 0): + max_threads=0): self._dlm = DataLifecycleManager() if useDLM else None self._sessions = {} @@ -303,7 +305,6 @@ def call_drop(self, sessionId, uid, method, *args): class ZMQPubSubMixIn(object): - subscription = collections.namedtuple('subscription', 'endpoint finished_evt') def __init__(self, host, events_port): @@ -332,17 +333,17 @@ def start(self): pubsock_created = threading.Event() subsock_created = threading.Event() - self._zmqpubthread = threading.Thread(target = self._zmq_pub_thread, name="ZMQ evtpub", args=(pubsock_created,)) + self._zmqpubthread = threading.Thread(target=self._zmq_pub_thread, name="ZMQ evtpub", args=(pubsock_created,)) self._zmqpubthread.start() if not pubsock_created.wait(timeout): raise Exception("Failed to create PUB ZMQ socket in %d seconds" % (timeout,)) - self._zmqsubthread = threading.Thread(target = self._zmq_sub_thread, name="ZMQ evtsub", args=(subsock_created,)) + self._zmqsubthread = threading.Thread(target=self._zmq_sub_thread, name="ZMQ evtsub", args=(subsock_created,)) self._zmqsubthread.start() if not subsock_created.wait(timeout): raise Exception("Failed to create PUB ZMQ socket in %d seconds" % (timeout,)) - self._zmqsubqthread = threading.Thread(target = self._zmq_sub_queue_thread, name="ZMQ evtsubq") + self._zmqsubqthread = threading.Thread(target=self._zmq_sub_queue_thread, name="ZMQ evtsubq") self._zmqsubqthread.start() def shutdown(self): @@ -370,7 +371,7 @@ def _zmq_pub_thread(self, sock_created): import zmq pub = self._zmqctx.socket(zmq.PUB) # @UndefinedVariable - pub.set_hwm(0) # Never drop messages that should be sent + pub.set_hwm(0) # Never drop messages that should be sent endpoint = "tcp://%s:%d" % (utils.zmq_safe(self._events_host), self._events_port) pub.bind(endpoint) logger.info("Listening for events via ZeroMQ on %s", endpoint) @@ -386,7 +387,7 @@ def _zmq_pub_thread(self, sock_created): while self._pubsub_running: try: - pub.send_pyobj(obj, flags = zmq.NOBLOCK) # @UndefinedVariable + pub.send_pyobj(obj, flags=zmq.NOBLOCK) # @UndefinedVariable break except zmq.error.Again: logger.debug("Got an 'Again' when publishing event") @@ -419,7 +420,7 @@ def _zmq_sub_thread(self, sock_created): pass try: - evt = sub.recv_pyobj(flags = zmq.NOBLOCK) # @UndefinedVariable + evt = sub.recv_pyobj(flags=zmq.NOBLOCK) # @UndefinedVariable self._recvevts.put(evt) except zmq.error.Again: time.sleep(0.01) @@ -431,9 +432,12 @@ def _zmq_sub_thread(self, sock_created): # So far we currently support ZMQ only for event publishing EventMixIn = ZMQPubSubMixIn + + # Load the corresponding RPC classes and finish the construciton of NodeManager class RpcMixIn(rpc.RPCClient, rpc.RPCServer): pass + # Final NodeManager class class NodeManager(EventMixIn, RpcMixIn, NodeManagerBase): @@ -443,4 +447,4 @@ def __init__(self, useDLM=True, dlgPath=None, error_listener=None, event_listene host = host or '127.0.0.1' EventMixIn.__init__(self, host, events_port) RpcMixIn.__init__(self, host, rpc_port) - NodeManagerBase.__init__(self, useDLM, dlgPath, error_listener, event_listeners, max_threads) \ No newline at end of file + NodeManagerBase.__init__(self, useDLM, dlgPath, error_listener, event_listeners, max_threads) diff --git a/daliuge-runtime/dlg/manager/proc_daemon.py b/daliuge-runtime/dlg/manager/proc_daemon.py index 94a713365..efb6f2e58 100644 --- a/daliuge-runtime/dlg/manager/proc_daemon.py +++ b/daliuge-runtime/dlg/manager/proc_daemon.py @@ -38,9 +38,9 @@ from .. import utils from ..restserver import RestServer - logger = logging.getLogger(__name__) + def get_tool(): # This import is performed at runtime to avoid a circular dependency # at import time with the tool module, which imports this module @@ -48,11 +48,13 @@ def get_tool(): from ..common import tool return tool + def _get_address(zeroconf_service_info): if tuple(map(int, zc.__version__.split('.')))[:2] >= (0, 23): return zeroconf_service_info.addresses[0] return zeroconf_service_info.address + class DlgDaemon(RestServer): """ The DALiuGE Daemon @@ -84,14 +86,14 @@ def __init__(self, master=False, noNM=False, disable_zeroconf=False, verbosity=0 # Starting managers app = self.app - app.post('/managers/node', callback=self.rest_startNM) + app.post('/managers/node', callback=self.rest_startNM) app.post('/managers/dataisland', callback=self.rest_startDIM) - app.post('/managers/master', callback=self.rest_startMM) + app.post('/managers/master', callback=self.rest_startMM) # Querying about managers - app.get('/managers/node', callback=self.rest_getNMInfo) + app.get('/managers/node', callback=self.rest_getNMInfo) app.get('/managers/dataisland', callback=self.rest_getDIMInfo) - app.get('/managers/master', callback=self.rest_getMMInfo) + app.get('/managers/master', callback=self.rest_getMMInfo) # Automatically start those that we need if master: @@ -134,6 +136,7 @@ def _stop_rest_server(self, timeout): # done with it logger.debug("Stopping the web server") ioloop_stopped = threading.Event() + def stop_ioloop(): self._ioloop.stop() ioloop_stopped.set() @@ -173,11 +176,12 @@ def startNM(self): # by the Master Manager if self._zeroconf: addrs = utils.get_local_ip_addr() - self._nm_info = utils.register_service(self._zeroconf, 'NodeManager', socket.gethostname(), addrs[0][0], constants.NODE_DEFAULT_REST_PORT) + self._nm_info = utils.register_service(self._zeroconf, 'NodeManager', socket.gethostname(), addrs[0][0], + constants.NODE_DEFAULT_REST_PORT) def startDIM(self, nodes): tool = get_tool() - args = ['--host', '0.0.0.0'] + args = ['--host', '0.0.0.0'] args += self._verbosity_as_cmdline() if nodes: args += ['--nodes', ",".join(nodes)] @@ -187,7 +191,7 @@ def startDIM(self, nodes): def startMM(self): tool = get_tool() - args = ['--host', '0.0.0.0'] + args = ['--host', '0.0.0.0'] args += self._verbosity_as_cmdline() logger.info("Starting Master Drop Manager with args: %s" % (" ".join(args))) self._mm_proc = tool.start_process('mm', args) @@ -198,6 +202,7 @@ def startMM(self): if self._zeroconf: mm_client = client.MasterManagerClient() node_managers = {} + def nm_callback(zeroconf, service_type, name, state_change): info = zeroconf.get_service_info(service_type, name) if state_change is zc.ServiceStateChange.Added: @@ -207,7 +212,7 @@ def nm_callback(zeroconf, service_type, name, state_change): logger.info("Found a new Node Manager on %s:%d, will add it to the MM" % (server, port)) mm_client.add_node(server) elif state_change is zc.ServiceStateChange.Removed: - server,port = node_managers[name] + server, port = node_managers[name] logger.info("Node Manager on %s:%d disappeared, removing it from the MM" % (server, port)) # Don't bother to remove it if we're shutting down. This way @@ -223,15 +228,15 @@ def nm_callback(zeroconf, service_type, name, state_change): def _verbosity_as_cmdline(self): if self._verbosity > 0: - return ["-" + "v"*self._verbosity] + return ["-" + "v" * self._verbosity] elif self._verbosity < 0: - return ["-" + "q"*(-self._verbosity)] + return ["-" + "q" * (-self._verbosity)] return () # Rest interface def _rest_start_manager(self, proc, start_method): if proc is not None: - bottle.abort(409, 'The Drop Manager is already running') # Conflict + bottle.abort(409, 'The Drop Manager is already running') # Conflict start_method() def _rest_get_manager_info(self, proc): @@ -266,13 +271,15 @@ def rest_getMMInfo(self): terminating = False + + def run_with_cmdline(parser, args): parser.add_option('-m', '--master', action='store_true', dest="master", help="Start this DALiuGE daemon as the master daemon", default=False) parser.add_option("--no-nm", action="store_true", - dest="noNM", help = "Don't start a NodeDropManager by default", default=False) + dest="noNM", help="Don't start a NodeDropManager by default", default=False) parser.add_option("--no-zeroconf", action="store_true", - dest="noZC", help = "Don't enable zeroconf on this DALiuGE daemon", default=False) + dest="noZC", help="Don't enable zeroconf on this DALiuGE daemon", default=False) parser.add_option("-v", "--verbose", action="count", dest="verbose", help="Become more verbose. The more flags, the more verbose", default=0) parser.add_option("-q", "--quiet", action="count", @@ -296,10 +303,11 @@ def handle_signal(signalNo, stack_frame): logger.info("Received signal %d, will stop the daemon now" % (signalNo,)) terminating = True daemon.stop(10) - signal.signal(signal.SIGINT, handle_signal) + + signal.signal(signal.SIGINT, handle_signal) signal.signal(signal.SIGTERM, handle_signal) # Go, go, go! t = threading.Thread(target=daemon.start, args=('0.0.0.0', constants.DAEMON_DEFAULT_REST_PORT)) t.start() - signal.pause() \ No newline at end of file + signal.pause() diff --git a/daliuge-runtime/dlg/manager/replay.py b/daliuge-runtime/dlg/manager/replay.py index c96c45ba6..d08c79920 100644 --- a/daliuge-runtime/dlg/manager/replay.py +++ b/daliuge-runtime/dlg/manager/replay.py @@ -30,13 +30,13 @@ from .session import SessionStates from ..exceptions import NoSessionException, InvalidSessionState - logger = logging.getLogger(__name__) build_step = 3 deploy_step = 6 run_step = 7 + class ReplayManager(DROPManager): def __init__(self, graph_file, status_file): @@ -67,10 +67,13 @@ def __del__(self): # Only queries are supported by the replay manager def createSession(self, sessionId): raise NotImplementedError() + def addGraphSpec(self, sessionId, graphSpec): raise NotImplementedError() + def deploySession(self, sessionId, completedDrops=[]): raise NotImplementedError() + def destroySession(self, sessionId): raise NotImplementedError() @@ -134,6 +137,7 @@ def getGraphSize(self, session_id): def getSessionIds(self): return [self._session_id] + class ReplayManagerServer(ManagerRestServer): def initializeSpecifics(self, app): @@ -148,4 +152,4 @@ def visualizeDM(self): return bottle.template(tpl, serverUrl=serverUrl, dmType=self.dm.__class__.__name__, - reset='true') \ No newline at end of file + reset='true') diff --git a/daliuge-runtime/dlg/manager/rest.py b/daliuge-runtime/dlg/manager/rest.py index 5ae6f62cf..0ad5fbbeb 100644 --- a/daliuge-runtime/dlg/manager/rest.py +++ b/daliuge-runtime/dlg/manager/rest.py @@ -41,15 +41,15 @@ from ..restserver import RestServer from ..restutils import RestClient, RestClientException - logger = logging.getLogger(__name__) + def file_as_string(fname, enc='utf8'): - b = pkg_resources.resource_string(__name__, fname) # @UndefinedVariable + b = pkg_resources.resource_string(__name__, fname) # @UndefinedVariable return utils.b2s(b, enc) -def daliuge_aware(func): +def daliuge_aware(func): @functools.wraps(func) def fwrapper(*args, **kwargs): try: @@ -81,7 +81,7 @@ def fwrapper(*args, **kwargs): status = 555 eargs = {} # args[1] is a dictionary of host:exception - for host,subex in e.args[1].items(): + for host, subex in e.args[1].items(): eargs[host] = {'type': subex.__class__.__name__, 'args': subex.args} elif isinstance(e, DaliugeException): status, eargs = 555, e.args @@ -94,6 +94,7 @@ def fwrapper(*args, **kwargs): return fwrapper + class ManagerRestServer(RestServer): """ An object that wraps a DataManager and exposes its methods via a REST @@ -115,22 +116,22 @@ def __init__(self, dm, maxreqsize=10): # Mappings app = self.app - app.post( '/api/stop', callback=self.stop_manager) - app.post( '/api/sessions', callback=self.createSession) - app.get( '/api/sessions', callback=self.getSessions) - app.get( '/api/sessions/', callback=self.getSessionInformation) - app.delete('/api/sessions/', callback=self.destroySession) - app.get( '/api/sessions//status', callback=self.getSessionStatus) - app.post( '/api/sessions//deploy', callback=self.deploySession) - app.post( '/api/sessions//cancel', callback=self.cancelSession) - app.get( '/api/sessions//graph', callback=self.getGraph) - app.get( '/api/sessions//graph/size', callback=self.getGraphSize) - app.get( '/api/sessions//graph/status', callback=self.getGraphStatus) - app.post( '/api/sessions//graph/append', callback=self.addGraphParts) + app.post('/api/stop', callback=self.stop_manager) + app.post('/api/sessions', callback=self.createSession) + app.get('/api/sessions', callback=self.getSessions) + app.get('/api/sessions/', callback=self.getSessionInformation) + app.delete('/api/sessions/', callback=self.destroySession) + app.get('/api/sessions//status', callback=self.getSessionStatus) + app.post('/api/sessions//deploy', callback=self.deploySession) + app.post('/api/sessions//cancel', callback=self.cancelSession) + app.get('/api/sessions//graph', callback=self.getGraph) + app.get('/api/sessions//graph/size', callback=self.getGraphSize) + app.get('/api/sessions//graph/status', callback=self.getGraphStatus) + app.post('/api/sessions//graph/append', callback=self.addGraphParts) # The non-REST mappings that serve HTML-related content app.route('/static/', callback=self.server_static) - app.get( '/session', callback=self.visualizeSession) + app.get('/session', callback=self.visualizeSession) # sub-class specifics self.initializeSpecifics(app) @@ -146,7 +147,7 @@ def _stop_manager(self): self.dm.shutdown() self.stop() logger.info("Thanks for using our %s, come back again :-)" % - (self.dm.__class__.__name__)) + (self.dm.__class__.__name__)) @daliuge_aware def stop_manager(self): @@ -161,7 +162,8 @@ def createSession(self): def sessions(self): sessions = [] for sessionId in self.dm.getSessionIds(): - sessions.append({'sessionId':sessionId, 'status':self.dm.getSessionStatus(sessionId), 'size': self.dm.getGraphSize(sessionId)}) + sessions.append({'sessionId': sessionId, 'status': self.dm.getSessionStatus(sessionId), + 'size': self.dm.getGraphSize(sessionId)}) return sessions @daliuge_aware @@ -187,7 +189,7 @@ def deploySession(self, sessionId): completedDrops = [] if 'completed' in bottle.request.forms: completedDrops = bottle.request.forms['completed'].split(',') - self.dm.deploySession(sessionId,completedDrops=completedDrops) + self.dm.deploySession(sessionId, completedDrops=completedDrops) @daliuge_aware def cancelSession(self, sessionId): @@ -222,9 +224,9 @@ def addGraphParts(self, sessionId): graph_parts = bottle.json_loads(json_content.read()) self.dm.addGraphSpec(sessionId, graph_parts) - #=========================================================================== + # =========================================================================== # non-REST methods - #=========================================================================== + # =========================================================================== def server_static(self, filepath): staticRoot = pkg_resources.resource_filename(__name__, '/web/static') # @UndefinedVariable return bottle.static_file(filepath, root=staticRoot) @@ -244,6 +246,7 @@ def visualizeSession(self): serverUrl=serverUrl, dmType=self.dm.__class__.__name__) + class NMRestServer(ManagerRestServer): """ A REST server for NodeManagers. It includes mappings for NM-specific @@ -251,13 +254,13 @@ class NMRestServer(ManagerRestServer): """ def initializeSpecifics(self, app): - app.get( '/api', callback=self.getNMStatus) - app.post( '/api/sessions//graph/link', callback=self.linkGraphParts) - app.post( '/api/sessions//subscriptions', callback=self.add_node_subscriptions) - app.post( '/api/sessions//trigger', callback=self.trigger_drops) + app.get('/api', callback=self.getNMStatus) + app.post('/api/sessions//graph/link', callback=self.linkGraphParts) + app.post('/api/sessions//subscriptions', callback=self.add_node_subscriptions) + app.post('/api/sessions//trigger', callback=self.trigger_drops) # The non-REST mappings that serve HTML-related content - app.get( '/', callback=self.visualizeDM) - app.get( '/api/shutdown', callback=self.shutdown_node_manager) + app.get('/', callback=self.visualizeDM) + app.get('/api/shutdown', callback=self.shutdown_node_manager) @daliuge_aware def shutdown_node_manager(self): @@ -291,9 +294,9 @@ def trigger_drops(self, sessionId): return self.dm.trigger_drops(sessionId, bottle.request.json) - #=========================================================================== + # =========================================================================== # non-REST methods - #=========================================================================== + # =========================================================================== def visualizeDM(self): tpl = file_as_string('web/dm.html') urlparts = bottle.request.urlparts @@ -303,6 +306,7 @@ def visualizeDM(self): dmType=self.dm.__class__.__name__, reset='false') + class CompositeManagerRestServer(ManagerRestServer): """ A REST server for DataIslandManagers. It includes mappings for DIM-specific @@ -310,20 +314,20 @@ class CompositeManagerRestServer(ManagerRestServer): """ def initializeSpecifics(self, app): - app.get( '/api', callback=self.getCMStatus) - app.get( '/api/nodes', callback=self.getCMNodes) - app.post( '/api/nodes/', callback=self.addCMNode) - app.delete('/api/nodes/', callback=self.removeCMNode) + app.get('/api', callback=self.getCMStatus) + app.get('/api/nodes', callback=self.getCMNodes) + app.post('/api/nodes/', callback=self.addCMNode) + app.delete('/api/nodes/', callback=self.removeCMNode) # Query forwarding to sub-nodes - app.get( '/api/nodes//sessions', callback=self.getNodeSessions) - app.get( '/api/nodes//sessions/', callback=self.getNodeSessionInformation) - app.get( '/api/nodes//sessions//status', callback=self.getNodeSessionStatus) - app.get( '/api/nodes//sessions//graph', callback=self.getNodeGraph) - app.get( '/api/nodes//sessions//graph/status', callback=self.getNodeGraphStatus) + app.get('/api/nodes//sessions', callback=self.getNodeSessions) + app.get('/api/nodes//sessions/', callback=self.getNodeSessionInformation) + app.get('/api/nodes//sessions//status', callback=self.getNodeSessionStatus) + app.get('/api/nodes//sessions//graph', callback=self.getNodeGraph) + app.get('/api/nodes//sessions//graph/status', callback=self.getNodeGraphStatus) # The non-REST mappings that serve HTML-related content - app.get( '/', callback=self.visualizeDIM) + app.get('/', callback=self.visualizeDIM) @daliuge_aware def getCMStatus(self): @@ -376,21 +380,22 @@ def getNodeGraphStatus(self, node, sessionId): with NodeManagerClient(host=node) as dm: return dm.graph_status(sessionId) - #=========================================================================== + # =========================================================================== # non-REST methods - #=========================================================================== + # =========================================================================== def visualizeDIM(self): tpl = file_as_string('web/dim.html') urlparts = bottle.request.urlparts selectedNode = bottle.request.params['node'] if 'node' in bottle.request.params else '' serverUrl = urlparts.scheme + '://' + urlparts.netloc return bottle.template(tpl, - dmType=self.dm.__class__.__name__, - dmPort=self.dm.dmPort, - serverUrl=serverUrl, - dmHosts=json.dumps(self.dm.dmHosts), - nodes=json.dumps(self.dm.nodes), - selectedNode=selectedNode) + dmType=self.dm.__class__.__name__, + dmPort=self.dm.dmPort, + serverUrl=serverUrl, + dmHosts=json.dumps(self.dm.dmHosts), + nodes=json.dumps(self.dm.nodes), + selectedNode=selectedNode) + class MasterManagerRestServer(CompositeManagerRestServer): @@ -404,4 +409,4 @@ def initializeSpecifics(self, app): def createDataIsland(self, host): with RestClient(host=host, port=constants.DAEMON_DEFAULT_REST_PORT, timeout=10) as c: c._post_json('/managers/dataisland', bottle.request.body.read()) - self.dm.addDmHost(host) \ No newline at end of file + self.dm.addDmHost(host) diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index 99904f1b2..bd381aa8c 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -39,9 +39,9 @@ from ..exceptions import InvalidSessionState, InvalidGraphException, \ NoDropException, DaliugeException - logger = logging.getLogger(__name__) + class SessionStates: """ An enumeration of the different states in which a Session can be found at @@ -49,6 +49,7 @@ class SessionStates: """ PRISTINE, BUILDING, DEPLOYING, RUNNING, FINISHED, CANCELLED = range(6) + class LeavesCompletionListener(object): def __init__(self, leaves, session): @@ -59,13 +60,15 @@ def __init__(self, leaves, session): def handleEvent(self, evt): # TODO: be thread-safe self._completed += 1 - logger.debug("%d/%d leaf drops completed on session %s", self._completed, self._nexpected, self._session.sessionId) + logger.debug("%d/%d leaf drops completed on session %s", self._completed, self._nexpected, + self._session.sessionId) if self._completed == self._nexpected: self._session.finish() track_current_session = utils.object_tracking('session') + class Session(object): """ A DROP graph execution. @@ -86,8 +89,8 @@ class Session(object): def __init__(self, sessionId, nm=None): self._sessionId = sessionId - self._graph = {} # key: oid, value: dropSpec dictionary - self._drops = {} # key: oid, value: actual drop object + self._graph = {} # key: oid, value: dropSpec dictionary + self._drops = {} # key: oid, value: actual drop object self._statusLock = threading.Lock() self._roots = [] self._proxyinfo = [] @@ -141,7 +144,8 @@ def addGraphSpec(self, graphSpec): status = self.status if status not in (SessionStates.PRISTINE, SessionStates.BUILDING): - raise InvalidSessionState("Can't add graphs to this session since it isn't in the PRISTINE or BUILDING status: %d" % (status)) + raise InvalidSessionState( + "Can't add graphs to this session since it isn't in the PRISTINE or BUILDING status: %d" % (status)) self.status = SessionStates.BUILDING @@ -199,7 +203,7 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): # in reality this particular session is managing nothing status = self.status if (self._graph and status != SessionStates.BUILDING) or \ - (not self._graph and status != SessionStates.PRISTINE): + (not self._graph and status != SessionStates.PRISTINE): raise InvalidSessionState("Can't deploy this session in its current status: %d" % (status)) if not self._graph and completedDrops: @@ -218,7 +222,7 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): self._roots = graph_loader.createGraphFromDropSpecList(self._graph.values(), session=self) logger.info("%d drops successfully created", len(self._graph)) - for drop,_ in droputils.breadFirstTraverse(self._roots): + for drop, _ in droputils.breadFirstTraverse(self._roots): # Register them self._drops[drop.uid] = drop @@ -249,7 +253,7 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): # Foreach if foreach: logger.info("Invoking 'foreach' on each drop") - for drop,_ in droputils.breadFirstTraverse(self._roots): + for drop, _ in droputils.breadFirstTraverse(self._roots): foreach(drop) logger.info("'foreach' invoked for each drop") @@ -279,7 +283,7 @@ def _run(self, worker): self.finish() def trigger_drops(self, uids): - for drop,downStreamDrops in droputils.breadFirstTraverse(self._roots): + for drop, downStreamDrops in droputils.breadFirstTraverse(self._roots): downStreamDrops[:] = [dsDrop for dsDrop in downStreamDrops if isinstance(dsDrop, AbstractDROP)] if drop.uid in uids: if isinstance(drop, InputFiredAppDROP): @@ -304,7 +308,7 @@ def deliver_event(self, evt): def add_node_subscriptions(self, relationships): evt_consumer = (DROPLinkType.CONSUMER, DROPLinkType.STREAMING_CONSUMER, DROPLinkType.OUTPUT) - evt_producer = (DROPLinkType.INPUT, DROPLinkType.STREAMING_INPUT, DROPLinkType.PRODUCER) + evt_producer = (DROPLinkType.INPUT, DROPLinkType.STREAMING_INPUT, DROPLinkType.PRODUCER) for host, droprels in relationships.items(): @@ -332,7 +336,7 @@ def add_node_subscriptions(self, relationships): # We are in the event receiver side if (rel.rel in evt_consumer and rel.lhs is local_uid) or \ - (rel.rel in evt_producer and rel.rhs is local_uid): + (rel.rel in evt_producer and rel.rhs is local_uid): dropsubs[remote_uid].add(local_uid) self._dropsubs.update(dropsubs) diff --git a/daliuge-runtime/dlg/manager/web/dim.html b/daliuge-runtime/dlg/manager/web/dim.html index 4ec4fe8b3..f1058c8e8 100644 --- a/daliuge-runtime/dlg/manager/web/dim.html +++ b/daliuge-runtime/dlg/manager/web/dim.html @@ -1,113 +1,134 @@ - - {{dmType}} - - - - - - - + + {{dmType}} + + + + + + +
        - - -
        -

        Sessions

        - - - - - - - - - - - -
        Session IDState# DropsDetails
        - - -
        + -
        -

        Nodes

        - - - - - - - - -
        NodeDetails
        - -
        +
        +

        Sessions

        + + + + + + + + + + + +
        Session IDState# DropsDetails
        + + +
        + +
        +

        Nodes

        + + + + + + + + +
        NodeDetails
        + +
        \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/dm.html b/daliuge-runtime/dlg/manager/web/dm.html index 035a098a7..12819398b 100644 --- a/daliuge-runtime/dlg/manager/web/dm.html +++ b/daliuge-runtime/dlg/manager/web/dm.html @@ -1,75 +1,88 @@ - - {{dmType}} - - - - - - - + + {{dmType}} + + + + + + +
        -

        {{dmType}}

        +

        {{dmType}}

        -

        Sessions

        - - - - - - - - - - - - -
        Session IDState# DropsDetailsActions
        - - - +

        Sessions

        + + + + + + + + + + + + +
        Session IDState# DropsDetailsActions
        + + +
        \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/session.html b/daliuge-runtime/dlg/manager/web/session.html index 42a31a28e..c31a69b9d 100644 --- a/daliuge-runtime/dlg/manager/web/session.html +++ b/daliuge-runtime/dlg/manager/web/session.html @@ -2,279 +2,304 @@ - - Session '{{sessionId}}' - - - - - - - - - + + Session '{{sessionId}}' + + + + + + + + +
        - - -

        Status:

        - - - - -
        - - - - - - - - -
        OIDStatus
        -
        + + +

        Status:

        + + + + +
        + + + + + + + + +
        OIDStatus
        +
        - + + +
        - +
        \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/static/css/session.css b/daliuge-runtime/dlg/manager/web/static/css/session.css index 1ff920ddd..8eb7bc705 100644 --- a/daliuge-runtime/dlg/manager/web/static/css/session.css +++ b/daliuge-runtime/dlg/manager/web/static/css/session.css @@ -1,139 +1,139 @@ body { - position: fixed; - top: 0; - bottom: 0; - left: 0; - right: 0; - margin: 0; - padding: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serf; - background: #fff; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + margin: 0; + padding: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serf; + background: #fff; } @-webkit-keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } + 0%, 50%, 100% { + opacity: 1; + } - 25%, 75% { - opacity: 0.2; - } + 25%, 75% { + opacity: 0.2; + } } @keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } + 0%, 50%, 100% { + opacity: 1; + } - 25%, 75% { - opacity: 0.2; - } + 25%, 75% { + opacity: 0.2; + } } .warn { - -webkit-animation-duration: 5s; - -webkit-animation-fill-mode: both; - -webkit-animation-iteration-count: 1; - -webkit-animation-name: flash; - animation-duration: 5s; - animation-fill-mode: both; - animation-iteration-count: 1; - animation-name: flash; + -webkit-animation-duration: 5s; + -webkit-animation-fill-mode: both; + -webkit-animation-iteration-count: 1; + -webkit-animation-name: flash; + animation-duration: 5s; + animation-fill-mode: both; + animation-iteration-count: 1; + animation-name: flash; } div.graph, div.progress { - width: 100%; - height: 100%; + width: 100%; + height: 100%; } svg { - width: 100%; - height: 100%; - overflow: hidden; + width: 100%; + height: 100%; + overflow: hidden; } .node rect, .node polygon { - stroke-width: 2.0px; - stroke: #bbb; + stroke-width: 2.0px; + stroke: #bbb; } /* DROP states */ .node.initialized :first-child, rect.initialized { - fill: #ffe; + fill: #ffe; } .node.writing :first-child, rect.writing { - fill: #ecde7b; + fill: #ecde7b; } .node.completed :first-child, rect.completed { - fill: #7bdc7b; + fill: #7bdc7b; } .node.expired :first-child, rect.expired { - fill: #700000; + fill: #700000; } .node.cancelled :first-child, rect.cancelled { - fill: #cccccc; + fill: #cccccc; } .node.deleted :first-child, rect.deleted { - color: #700000; + color: #700000; } /* AppDROP states */ .node.not_run :first-child, rect.not_run { - fill: #ffe; + fill: #ffe; } .node.running :first-child, rect.running { - fill: #ecde7b; + fill: #ecde7b; } .node.finished :first-child, rect.finished { - fill: #7bdc7b; + fill: #7bdc7b; } .node.error :first-child, rect.error { - fill: #e44f33; + fill: #e44f33; } .node.container polygon { - stroke-dasharray: 5; + stroke-dasharray: 5; } .node g div { - width: 180px; - height: 60px; - color: #000; - overflow: hidden; + width: 180px; + height: 60px; + color: #000; + overflow: hidden; } -.node polygon+g div div { - padding-left: 20% +.node polygon + g div div { + padding-left: 20% } -.node rect+g div div { - padding-left: 2% +.node rect + g div div { + padding-left: 2% } .edgeLabel text { - width: 50px; - fill: #fff; + width: 50px; + fill: #fff; } .edgePath path { - stroke: #999; - stroke-width: 1.5px; - fill: #999; + stroke: #999; + stroke-width: 1.5px; + fill: #999; } .notes { - font-size: 90%; + font-size: 90%; } .drop-label span { - display: block; + display: block; } \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg b/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg index 94fb5490a..2ba280f41 100644 --- a/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg +++ b/daliuge-runtime/dlg/manager/web/static/fonts/glyphicons-halflings-regular.svg @@ -1,288 +1,543 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/daliuge-runtime/dlg/manager/web/static/js/dm.js b/daliuge-runtime/dlg/manager/web/static/js/dm.js index 2a4f5dc9d..f8fc917bd 100644 --- a/daliuge-runtime/dlg/manager/web/static/js/dm.js +++ b/daliuge-runtime/dlg/manager/web/static/js/dm.js @@ -20,266 +20,294 @@ // MA 02111-1307 USA // -var SESSION_STATUS = ['Pristine', 'Building', 'Deploying', 'Running', 'Finished', 'Cancelled'] -var STATUS_CLASSES = ['initialized', 'writing', 'completed', 'error', 'expired', 'deleted', 'cancelled'] +var SESSION_STATUS = ['Pristine', 'Building', 'Deploying', 'Running', 'Finished', 'Cancelled'] +var STATUS_CLASSES = ['initialized', 'writing', 'completed', 'error', 'expired', 'deleted', 'cancelled'] var EXECSTATUS_CLASSES = ['not_run', 'running', 'finished', 'error', 'cancelled'] -var TYPE_CLASSES = ['app', 'container', 'socket', 'plain'] -var TYPE_SHAPES = {app:'rect', container:'parallelogram', socket:'parallelogram', plain:'parallelogram'} +var TYPE_CLASSES = ['app', 'container', 'socket', 'plain'] +var TYPE_SHAPES = {app: 'rect', container: 'parallelogram', socket: 'parallelogram', plain: 'parallelogram'} var TO_MANY_LTR_RELS = ['consumers', 'streamingConsumers', 'outputs'] var TO_MANY_RTL_RELS = ['inputs', 'streamingInputs', 'producers'] -function get_status_name(s) -{ - if (typeof s.execStatus != 'undefined') { - return EXECSTATUS_CLASSES[s.execStatus]; - } - else { - return STATUS_CLASSES[s.status]; - } +function get_status_name(s) { + if (typeof s.execStatus != 'undefined') { + return EXECSTATUS_CLASSES[s.execStatus]; + } else { + return STATUS_CLASSES[s.status]; + } } function uniqueSessionStatus(status) { - // If we are querying one of the Composite Managers (like the DIM or the MM) - // we need to reduce the individual session status to a single one for display - if( status != null && typeof status === 'object' ) { - - // Reduce, reduce, reduce - while( true ) { - - // Get the values from the status object - status = Object.keys(status).map(function(k){return status[k]}); - - // If the values in the resulting array are not objects then - // we already hit the bottom level and we have simply numbers - // in the array - if ( typeof status[0] !== 'object' ) { - break; - } - - // Otherwise, we create an object which consists on the merged - // objects contained in the array - // e.g., [{a:'b'}, {b:'c'}] -> {a:'b', b:'c'} - // After that we're OK for the next iteration - status = status.reduce( - function(prev, v, idx, array) { - if( idx == 0 ) { return v; } - for (var attrname in prev) { - v[attrname] = prev[attrname]; - } - return v; - } - ) - } - - // Reduce to single common value if possible - // "Finished" and "Running" reduce to "Running" - // Otherwise we reduce to -1, which we interpret as "Indeterminate" - return status.reduce( - function(prev, v, idx, array) { - if( prev == -1 ) { return -1; } - else if( prev == 3 && v == 4 || prev == 4 && v == 3 ) { return 3; } - return (prev == v) ? v : -1; - } - ); - } - - // otherwise we simply return the status, which should be an integer - return status; + // If we are querying one of the Composite Managers (like the DIM or the MM) + // we need to reduce the individual session status to a single one for display + if (status != null && typeof status === 'object') { + + // Reduce, reduce, reduce + while (true) { + + // Get the values from the status object + status = Object.keys(status).map(function (k) { + return status[k] + }); + + // If the values in the resulting array are not objects then + // we already hit the bottom level and we have simply numbers + // in the array + if (typeof status[0] !== 'object') { + break; + } + + // Otherwise, we create an object which consists on the merged + // objects contained in the array + // e.g., [{a:'b'}, {b:'c'}] -> {a:'b', b:'c'} + // After that we're OK for the next iteration + status = status.reduce( + function (prev, v, idx, array) { + if (idx == 0) { + return v; + } + for (var attrname in prev) { + v[attrname] = prev[attrname]; + } + return v; + } + ) + } + + // Reduce to single common value if possible + // "Finished" and "Running" reduce to "Running" + // Otherwise we reduce to -1, which we interpret as "Indeterminate" + return status.reduce( + function (prev, v, idx, array) { + if (prev == -1) { + return -1; + } else if (prev == 3 && v == 4 || prev == 4 && v == 3) { + return 3; + } + return (prev == v) ? v : -1; + } + ); + } + + // otherwise we simply return the status, which should be an integer + return status; } function sessionStatusToString(status) { - return (status == -1) ? 'Indeterminate' : SESSION_STATUS[status]; + return (status == -1) ? 'Indeterminate' : SESSION_STATUS[status]; } function getRender() { - var render = new dagreD3.render(); - - // Add our custom shape (parallelogram, similar to the PIP PDR document) - render.shapes().parallelogram = function(parent, bbox, node) { - var w = bbox.width, - h = bbox.height, - points = [ - { x: 0, y: 0}, - { x: w*0.8, y: 0}, - { x: w, y: -h}, - { x: w*0.2, y: -h}, - ]; - var shapeSvg = parent.insert("polygon", ":first-child") - .attr("points", points.map(function(d) { return d.x + "," + d.y; }).join(" ")) - .attr("transform", "translate(" + (-w/2) + "," + (h/2) + ")"); - - node.intersect = function(point) { - return dagreD3.intersect.polygon(node, points, point); - }; - - return shapeSvg; - }; - - return render; + var render = new dagreD3.render(); + + // Add our custom shape (parallelogram, similar to the PIP PDR document) + render.shapes().parallelogram = function (parent, bbox, node) { + var w = bbox.width, + h = bbox.height, + points = [ + {x: 0, y: 0}, + {x: w * 0.8, y: 0}, + {x: w, y: -h}, + {x: w * 0.2, y: -h}, + ]; + var shapeSvg = parent.insert("polygon", ":first-child") + .attr("points", points.map(function (d) { + return d.x + "," + d.y; + }).join(" ")) + .attr("transform", "translate(" + (-w / 2) + "," + (h / 2) + ")"); + + node.intersect = function (point) { + return dagreD3.intersect.polygon(node, points, point); + }; + + return shapeSvg; + }; + + return render; } function loadSessions(serverUrl, tbodyEl, refreshBtn, selectedNode, delay) { - refreshBtn.attr('disabled'); - - // Support for node query forwarding - var url = serverUrl + '/api'; - if( selectedNode ) { - url += '/nodes/' + selectedNode; - } - url += '/sessions'; - - var sessionLink = function(s) { - var url = 'session?sessionId=' + s; - if( selectedNode ) { url += '&node=' + selectedNode; } - return url; - }; - - var cancelBtnSessionId = function(s) { - console.log(hashCode(s)) - return "cancelBtn" + hashCode(s); - }; - - var hashCode = function(s){ - return s.split("").reduce(function(a,b){a=((a<<5)-a)+b.charCodeAt(0);return a&a},0); - } - - d3.json(url, function (error, response){ - if( error ) { - console.error(error) - refreshBtn.attr('disabled', null); - return - } - - var sessions = response; - sessions.sort(function comp(a,b) { - return (a.sessionId < b.sessionId) ? -1 : (a.sessionId > b.sessionId); - }); - console.log(sessions[0]); - var rows = tbodyEl.selectAll('tr').data(sessions); - rows.exit().transition().delay(0).duration(500).style('opacity',0.0).remove(); - rows.enter().append('tr').style('opacity', 0.0).transition().delay(0).duration(500).style('opacity',1.0); - - var idCells = rows.selectAll('td.id').data(function values(s) { return [s.sessionId]; }); - idCells.enter().append('td').classed('id', true).text(String) - idCells.text(String) - idCells.exit().remove() - - var statusCells = rows.selectAll('td.status').data(function values(s) { return [uniqueSessionStatus(s.status)]; }); - statusCells.enter().append('td').classed('status', true).text(function(s) { return sessionStatusToString(s); }) - statusCells.text(function(s) {return sessionStatusToString(s)}) - statusCells.exit().remove() - - var sizeCells = rows.selectAll('td.size').data(function values(s) { return [s.size]; }); - sizeCells.enter().append('td').classed('size', true).text(String) - sizeCells.text(String) - sizeCells.exit().remove() - - statusCells = rows.selectAll('td.details').data(function values(s) { return [s.sessionId]; }); - statusCells.enter().append('td').classed('details', true) - .append('a').attr('href', sessionLink) - .append('span').classed('glyphicon glyphicon-share-alt', true) - statusCells.select('a').attr('href', sessionLink) - statusCells.exit().remove() - - var actionCells = rows.selectAll('td.actions').data(function values(s) { return [s.sessionId]; }); - actionCells.enter().append('td').classed('actions', true) + refreshBtn.attr('disabled'); + + // Support for node query forwarding + var url = serverUrl + '/api'; + if (selectedNode) { + url += '/nodes/' + selectedNode; + } + url += '/sessions'; + + var sessionLink = function (s) { + var url = 'session?sessionId=' + s; + if (selectedNode) { + url += '&node=' + selectedNode; + } + return url; + }; + + var cancelBtnSessionId = function (s) { + console.log(hashCode(s)) + return "cancelBtn" + hashCode(s); + }; + + var hashCode = function (s) { + return s.split("").reduce(function (a, b) { + a = ((a << 5) - a) + b.charCodeAt(0); + return a & a + }, 0); + } + + d3.json(url, function (error, response) { + if (error) { + console.error(error) + refreshBtn.attr('disabled', null); + return + } + + var sessions = response; + sessions.sort(function comp(a, b) { + return (a.sessionId < b.sessionId) ? -1 : (a.sessionId > b.sessionId); + }); + console.log(sessions[0]); + var rows = tbodyEl.selectAll('tr').data(sessions); + rows.exit().transition().delay(0).duration(500).style('opacity', 0.0).remove(); + rows.enter().append('tr').style('opacity', 0.0).transition().delay(0).duration(500).style('opacity', 1.0); + + var idCells = rows.selectAll('td.id').data(function values(s) { + return [s.sessionId]; + }); + idCells.enter().append('td').classed('id', true).text(String) + idCells.text(String) + idCells.exit().remove() + + var statusCells = rows.selectAll('td.status').data(function values(s) { + return [uniqueSessionStatus(s.status)]; + }); + statusCells.enter().append('td').classed('status', true).text(function (s) { + return sessionStatusToString(s); + }) + statusCells.text(function (s) { + return sessionStatusToString(s) + }) + statusCells.exit().remove() + + var sizeCells = rows.selectAll('td.size').data(function values(s) { + return [s.size]; + }); + sizeCells.enter().append('td').classed('size', true).text(String) + sizeCells.text(String) + sizeCells.exit().remove() + + statusCells = rows.selectAll('td.details').data(function values(s) { + return [s.sessionId]; + }); + statusCells.enter().append('td').classed('details', true) + .append('a').attr('href', sessionLink) + .append('span').classed('glyphicon glyphicon-share-alt', true) + statusCells.select('a').attr('href', sessionLink) + statusCells.exit().remove() + + var actionCells = rows.selectAll('td.actions').data(function values(s) { + return [s.sessionId]; + }); + actionCells.enter().append('td').classed('actions', true) .append("button").attr('id', cancelBtnSessionId) .attr('type', 'button').attr('class', 'btn btn-default').text('Cancel') - actionCells.select('button') - actionCells.exit().remove() - - sessions.forEach(function(session) { - console.log(session) - var cancelSessionBtn = d3.select("#cancelBtn" + hashCode(session.sessionId)); - // Listeners for the cancelSession button - cancelSessionBtn.on('click', function() { cancel_session(serverUrl, session.sessionId, cancelSessionBtn); } ); - }) - - refreshBtn.attr('disabled', null); - - if( !(typeof delay === 'undefined') ) { - d3.timer(function(){ - loadSessions(serverUrl, tbodyEl, refreshBtn, selectedNode, delay); - return true; - }, delay); - } - }); + actionCells.select('button') + actionCells.exit().remove() + + sessions.forEach(function (session) { + console.log(session) + var cancelSessionBtn = d3.select("#cancelBtn" + hashCode(session.sessionId)); + // Listeners for the cancelSession button + cancelSessionBtn.on('click', function () { + cancel_session(serverUrl, session.sessionId, cancelSessionBtn); + }); + }) + + refreshBtn.attr('disabled', null); + + if (!(typeof delay === 'undefined')) { + d3.timer(function () { + loadSessions(serverUrl, tbodyEl, refreshBtn, selectedNode, delay); + return true; + }, delay); + } + }); } function promptNewSession(serverUrl, tbodyEl, refreshBtn) { - bootbox.prompt("Session ID", function(sessionId) { - if( sessionId == null ) { - return; - } - var xhr = d3.xhr(serverUrl + '/api/sessions'); - xhr.header("Content-Type", "application/json"); - xhr.post(JSON.stringify({sessionId: sessionId}), function(error, data) { - if( error != null ) { - console.error(error) - bootbox.alert('An error occurred while creating session ' + sessionId + ': ' + error.responseText) - return - } - loadSessions(serverUrl, tbodyEl, refreshBtn, null) - }); - }); + bootbox.prompt("Session ID", function (sessionId) { + if (sessionId == null) { + return; + } + var xhr = d3.xhr(serverUrl + '/api/sessions'); + xhr.header("Content-Type", "application/json"); + xhr.post(JSON.stringify({sessionId: sessionId}), function (error, data) { + if (error != null) { + console.error(error) + bootbox.alert('An error occurred while creating session ' + sessionId + ': ' + error.responseText) + return + } + loadSessions(serverUrl, tbodyEl, refreshBtn, null) + }); + }); } function drawGraphForDrops(g, drawGraph, oids, doSpecs) { - // Keep track of modifications to see if we need to re-draw - var modified = false; - - // #1: create missing nodes in the graph - // Because oids is sorted, they will be created in oid order - var time0 = new Date().getTime(); - for(var idx in oids) { - var doSpec = doSpecs[oids[idx]]; - modified |= _addNode(g, doSpec); - } - - var time1 = new Date().getTime(); - console.log('Took %d [ms] to create the nodes', (time1 - time0)) - - // #2: establish missing relationships - for(var idx in oids) { - var doSpec = doSpecs[oids[idx]]; - var lhOid = doSpec.oid; - - // x-to-many relationships producing lh->rh edges - for(var relIdx in TO_MANY_LTR_RELS) { - var rel = TO_MANY_LTR_RELS[relIdx]; - if( rel in doSpec ) { - for(var rhOid in doSpec[rel]) { - modified |= _addEdge(g, lhOid, doSpec[rel][rhOid]); - } - } - } - // x-to-many relationships producing rh->lh edges - for(var relIdx in TO_MANY_RTL_RELS) { - var rel = TO_MANY_RTL_RELS[relIdx]; - if( rel in doSpec ) { - for(var rhOid in doSpec[rel]) { - modified |= _addEdge(g, doSpec[rel][rhOid], lhOid); - } - } - } - // there currently are no x-to-one relationships producing rh->lh edges - // there currently are no x-to-one relationships producing lh->rh edges - } - - var time2 = new Date().getTime(); - console.log('Took %d [ms] to create the edges', (time2 - time1)) - - if( modified ) { - drawGraph(); - } - - var time3 = new Date().getTime(); - console.log('Took %d [ms] to draw the hole thing', (time3 - time2)) + // Keep track of modifications to see if we need to re-draw + var modified = false; + + // #1: create missing nodes in the graph + // Because oids is sorted, they will be created in oid order + var time0 = new Date().getTime(); + for (var idx in oids) { + var doSpec = doSpecs[oids[idx]]; + modified |= _addNode(g, doSpec); + } + + var time1 = new Date().getTime(); + console.log('Took %d [ms] to create the nodes', (time1 - time0)) + + // #2: establish missing relationships + for (var idx in oids) { + var doSpec = doSpecs[oids[idx]]; + var lhOid = doSpec.oid; + + // x-to-many relationships producing lh->rh edges + for (var relIdx in TO_MANY_LTR_RELS) { + var rel = TO_MANY_LTR_RELS[relIdx]; + if (rel in doSpec) { + for (var rhOid in doSpec[rel]) { + modified |= _addEdge(g, lhOid, doSpec[rel][rhOid]); + } + } + } + // x-to-many relationships producing rh->lh edges + for (var relIdx in TO_MANY_RTL_RELS) { + var rel = TO_MANY_RTL_RELS[relIdx]; + if (rel in doSpec) { + for (var rhOid in doSpec[rel]) { + modified |= _addEdge(g, doSpec[rel][rhOid], lhOid); + } + } + } + // there currently are no x-to-one relationships producing rh->lh edges + // there currently are no x-to-one relationships producing lh->rh edges + } + + var time2 = new Date().getTime(); + console.log('Took %d [ms] to create the edges', (time2 - time1)) + + if (modified) { + drawGraph(); + } + + var time3 = new Date().getTime(); + console.log('Took %d [ms] to draw the hole thing', (time3 - time2)) } @@ -299,108 +327,106 @@ function drawGraphForDrops(g, drawGraph, oids, doSpecs) { function startStatusQuery(serverUrl, sessionId, selectedNode, graph_update_handler, status_update_handler, delay) { - // Support for node query forwarding - var url = serverUrl + '/api'; - if( selectedNode ) { - url += '/nodes/' + selectedNode; - } - url += '/sessions/' + sessionId; - - function updateGraph() { - - d3.json(url, function(error, sessionInfo) { - - if (error) { - console.error(error); - return; - } - - var doSpecs = sessionInfo['graph']; - var status = uniqueSessionStatus(sessionInfo['status']); - d3.select('#session-status').text(sessionStatusToString(status)); - - var oids = Object.keys(doSpecs); - if( oids.length > 0 ) { - // Get sorted oids - oids.sort(); - graph_update_handler(oids, doSpecs); - } - - // During PRISITINE and BUILDING we need to update the graph structure - // During DEPLOYING we call ourselves again anyway, because we need - // to know when we go to RUNNING. - // During RUNNING (or potentially FINISHED/CANCELLED, if the execution is - // extremely fast) we need to start updating the status of the graph - if (status == 3 || status == 4 || status == 5) { - startGraphStatusUpdates(serverUrl, sessionId, selectedNode, delay, - status_update_handler); - } - else if( status == 0 || status == 1 || status == 2 || status == -1 ){ - // schedule a new JSON request - d3.timer(updateGraph, delay); - } - - }) - // This makes d3.timer invoke us only once - return true; - } - d3.timer(updateGraph); + // Support for node query forwarding + var url = serverUrl + '/api'; + if (selectedNode) { + url += '/nodes/' + selectedNode; + } + url += '/sessions/' + sessionId; + + function updateGraph() { + + d3.json(url, function (error, sessionInfo) { + + if (error) { + console.error(error); + return; + } + + var doSpecs = sessionInfo['graph']; + var status = uniqueSessionStatus(sessionInfo['status']); + d3.select('#session-status').text(sessionStatusToString(status)); + + var oids = Object.keys(doSpecs); + if (oids.length > 0) { + // Get sorted oids + oids.sort(); + graph_update_handler(oids, doSpecs); + } + + // During PRISITINE and BUILDING we need to update the graph structure + // During DEPLOYING we call ourselves again anyway, because we need + // to know when we go to RUNNING. + // During RUNNING (or potentially FINISHED/CANCELLED, if the execution is + // extremely fast) we need to start updating the status of the graph + if (status == 3 || status == 4 || status == 5) { + startGraphStatusUpdates(serverUrl, sessionId, selectedNode, delay, + status_update_handler); + } else if (status == 0 || status == 1 || status == 2 || status == -1) { + // schedule a new JSON request + d3.timer(updateGraph, delay); + } + + }) + // This makes d3.timer invoke us only once + return true; + } + + d3.timer(updateGraph); } function _addNode(g, doSpec) { - if( g.hasNode(g) ) { - return false; - } - - var typeClass = doSpec.type; - var typeShape = TYPE_SHAPES[doSpec.type]; - var notes = ''; - if( doSpec.type == 'app' ) { - var nameParts = doSpec.app.split('.'); - notes = nameParts[nameParts.length - 1]; - } - else if( doSpec.type == 'plain' ) { - notes = 'storage: ' + doSpec.storage; - } - else if( doSpec.type == 'socket' ) { - notes = 'port: ' + doSpec.port; - } - if( doSpec.nm ) { - notes += '
        ' + doSpec.nm - } - - var oid = doSpec.oid; - var html = '
        '; - html += '' + oid + ''; - html += '' + notes + ''; - html += "
        "; - g.setNode(oid, { - labelType: "html", - label: html, - rx: 5, - ry: 5, - padding: 0, - class: typeClass, - shape: typeShape - }); - return true; + if (g.hasNode(g)) { + return false; + } + + var typeClass = doSpec.type; + var typeShape = TYPE_SHAPES[doSpec.type]; + var notes = ''; + if (doSpec.type == 'app') { + var nameParts = doSpec.app.split('.'); + notes = nameParts[nameParts.length - 1]; + } else if (doSpec.type == 'plain') { + notes = 'storage: ' + doSpec.storage; + } else if (doSpec.type == 'socket') { + notes = 'port: ' + doSpec.port; + } + if (doSpec.nm) { + notes += '
        ' + doSpec.nm + } + + var oid = doSpec.oid; + var html = '
        '; + html += '' + oid + ''; + html += '' + notes + ''; + html += "
        "; + g.setNode(oid, { + labelType: "html", + label: html, + rx: 5, + ry: 5, + padding: 0, + class: typeClass, + shape: typeShape + }); + return true; } function _addEdge(g, fromOid, toOid) { - if( g.hasEdge(fromOid, toOid) ) { - return false; - } - if( !g.hasNode(fromOid) ) { - console.error('No DROP found with oid ' + fromOid); - return false; - } - if( !g.hasNode(toOid) ) { - console.error('No DROP found with oid ' + toOid); - return false; - } - g.setEdge(fromOid, toOid, {width: 40}); - return true; + if (g.hasEdge(fromOid, toOid)) { + return false; + } + if (!g.hasNode(fromOid)) { + console.error('No DROP found with oid ' + fromOid); + return false; + } + if (!g.hasNode(toOid)) { + console.error('No DROP found with oid ' + toOid); + return false; + } + g.setEdge(fromOid, toOid, {width: 40}); + return true; } @@ -412,53 +438,55 @@ function _addEdge(g, fromOid, toOid) { function startGraphStatusUpdates(serverUrl, sessionId, selectedNode, delay, status_update_handler) { - // Support for node query forwarding - var url = serverUrl + '/api'; - if( selectedNode ) { - url += '/nodes/' + selectedNode; - } - url += '/sessions/' + sessionId + '/graph/status'; - - function updateStates() { - d3.json(url, function(error, response) { - if (error) { - console.error(error); - return; - } - - // Change from {B:{status:2,execStatus:0}, A:{status:1}, ...} - // to [{status:1},{status:2,execStatus:0}...] - // (i.e., sort by key and get values only) - var keys = Object.keys(response); - keys.sort(); - var statuses = keys.map(function(k) {return response[k]}); - - // This works assuming that the status list comes in the same order - // that the graph was created, which is true - // Anyway, we could double-check in the future - status_update_handler(statuses); - - var allCompleted = statuses.reduce(function(prevVal, curVal, idx, arr) { - var cur_status = get_status_name(curVal); - return prevVal && (cur_status == 'completed' || cur_status == 'error' || cur_status == 'cancelled'); - }, true); - if (!allCompleted) { - d3.timer(updateStates, delay); - } - else { - // A final update on the session's status - d3.json(serverUrl + '/api/sessions/' + sessionId + '/status', function(error, status) { - if (error) { - console.error(error); - return; - } - d3.select('#session-status').text(sessionStatusToString(uniqueSessionStatus(status))); - }); - } - }) - return true; - } - d3.timer(updateStates); + // Support for node query forwarding + var url = serverUrl + '/api'; + if (selectedNode) { + url += '/nodes/' + selectedNode; + } + url += '/sessions/' + sessionId + '/graph/status'; + + function updateStates() { + d3.json(url, function (error, response) { + if (error) { + console.error(error); + return; + } + + // Change from {B:{status:2,execStatus:0}, A:{status:1}, ...} + // to [{status:1},{status:2,execStatus:0}...] + // (i.e., sort by key and get values only) + var keys = Object.keys(response); + keys.sort(); + var statuses = keys.map(function (k) { + return response[k] + }); + + // This works assuming that the status list comes in the same order + // that the graph was created, which is true + // Anyway, we could double-check in the future + status_update_handler(statuses); + + var allCompleted = statuses.reduce(function (prevVal, curVal, idx, arr) { + var cur_status = get_status_name(curVal); + return prevVal && (cur_status == 'completed' || cur_status == 'error' || cur_status == 'cancelled'); + }, true); + if (!allCompleted) { + d3.timer(updateStates, delay); + } else { + // A final update on the session's status + d3.json(serverUrl + '/api/sessions/' + sessionId + '/status', function (error, status) { + if (error) { + console.error(error); + return; + } + d3.select('#session-status').text(sessionStatusToString(uniqueSessionStatus(status))); + }); + } + }) + return true; + } + + d3.timer(updateStates); } /** @@ -488,7 +516,7 @@ function cancel_session(serverUrl, sessionId, cancelSessionBtn) { var url = serverUrl + '/api'; url += '/sessions/' + sessionId; - d3.json(url, function(error, sessionInfo) { + d3.json(url, function (error, sessionInfo) { if (error) { //bootbox.alert(error); @@ -504,7 +532,7 @@ function cancel_session(serverUrl, sessionId, cancelSessionBtn) { d3.json(url).post(function (error, response) { // We don't expect a response so ignoring it. - if( error ) { + if (error) { console.error(error) return } diff --git a/daliuge-runtime/dlg/ngaslite.py b/daliuge-runtime/dlg/ngaslite.py index f127e35b2..eb677489c 100644 --- a/daliuge-runtime/dlg/ngaslite.py +++ b/daliuge-runtime/dlg/ngaslite.py @@ -42,9 +42,11 @@ def retrieve(host, fileId, port=7777, timeout=None): conn.request('GET', '/RETRIEVE?file_id=' + fileId) response = conn.getresponse() if response.status != httplib.OK: - raise Exception("Error while RETRIEVE-ing %s from %s:%d: %d %s" % (fileId, host, port, response.status, response.msg)) + raise Exception( + "Error while RETRIEVE-ing %s from %s:%d: %d %s" % (fileId, host, port, response.status, response.msg)) return response + def beingArchive(host, fileId, port=7777, timeout=0, length=-1): """ Opens a connecting to the NGAS server located at `host`:`port` and sends out @@ -63,10 +65,12 @@ def beingArchive(host, fileId, port=7777, timeout=0, length=-1): conn.endheaders() return conn + def finishArchive(conn, fileId): """ Checks that an archiving started by `beginArchive` went on successfully. """ response = conn.getresponse() if response.status != httplib.OK: - raise Exception("Error while QARCHIVE-ing %s to %s:%d: %d %s" % (fileId, conn.host, conn.port, response.status, response.msg)) \ No newline at end of file + raise Exception("Error while QARCHIVE-ing %s to %s:%d: %d %s" % ( + fileId, conn.host, conn.port, response.status, response.msg)) diff --git a/daliuge-runtime/dlg/remote.py b/daliuge-runtime/dlg/remote.py index 50f46fbe2..c3e15a926 100644 --- a/daliuge-runtime/dlg/remote.py +++ b/daliuge-runtime/dlg/remote.py @@ -27,24 +27,24 @@ import os import time +import scp from paramiko.client import SSHClient, AutoAddPolicy from paramiko.rsakey import RSAKey -import scp - logger = logging.getLogger(__name__) + def execRemoteWithClient(client, command, timeout=None, bufsize=-1): """ Executes `command` using the given SSH `client`. """ chan = client.get_transport().open_session() chan.settimeout(timeout) - chan.exec_command('/bin/bash -l -c "%s"' % (command.replace('"','\"'))) + chan.exec_command('/bin/bash -l -c "%s"' % (command.replace('"', '\"'))) # Otherwise do something like this: - #chan.get_pty(width=80, height=24) - #chan.invoke_shell() - #chan.sendall(command + "\n") + # chan.get_pty(width=80, height=24) + # chan.invoke_shell() + # chan.sendall(command + "\n") # Wait until the command has finished execution and return the full contents # of the stdout and stderr @@ -63,6 +63,7 @@ def execRemoteWithClient(client, command, timeout=None, bufsize=-1): stderr = f.read() return stdout, stderr, exitStatus + def execRemote(host, command, username=None, timeout=None, bufsize=-1): """ Executes `command` on `host`. If `username` is provided, the command will @@ -72,6 +73,7 @@ def execRemote(host, command, username=None, timeout=None, bufsize=-1): with createClient(host, username) as client: return execRemoteWithClient(client, command, timeout, bufsize) + def createClient(host, username=None, pkeyPath=None): """ Creates an SSH client object that can be used to perform SSH-related @@ -84,10 +86,12 @@ def createClient(host, username=None, pkeyPath=None): client.connect(host, username=username, pkey=pkey) return client + def __scpProgress(filename, size, sent): if size == sent: logger.debug("Finished scp-ing %s (%d bytes)", filename, sent) + def copyFrom(host, remotePath, localPath='.', recursive=False, username=None, pkeyPath=None, timeout=None): """ Copies the files located at `host`:`remotePath` to `localPath` connecting @@ -101,6 +105,7 @@ def copyFrom(host, remotePath, localPath='.', recursive=False, username=None, pk scpClient.get(remote_path=remotePath, local_path=localPath, recursive=recursive) client.close() + def copyTo(host, localFiles, remotePath='.', recursive=False, username=None, pkeyPath=None, timeout=None): """ Copies the files located at `localPath` to `host`:`remotePath` connecting @@ -112,4 +117,4 @@ def copyTo(host, localFiles, remotePath='.', recursive=False, username=None, pke client = createClient(host, username=username, pkeyPath=pkeyPath) with scp.SCPClient(client.get_transport(), progress=__scpProgress, socket_timeout=timeout) as scpClient: scpClient.put(localFiles, remote_path=remotePath, recursive=recursive) - client.close() \ No newline at end of file + client.close() diff --git a/daliuge-runtime/dlg/reproducibility/__jnit__.py b/daliuge-runtime/dlg/reproducibility/__jnit__.py index 23a4d8be3..f56e77e7d 100644 --- a/daliuge-runtime/dlg/reproducibility/__jnit__.py +++ b/daliuge-runtime/dlg/reproducibility/__jnit__.py @@ -21,4 +21,4 @@ # """ This package contains code resources required to integrate reproduciblity measure into DALiuGE. -""" \ No newline at end of file +""" diff --git a/daliuge-runtime/dlg/restserver.py b/daliuge-runtime/dlg/restserver.py index e08bc2cbc..e1dc5d188 100644 --- a/daliuge-runtime/dlg/restserver.py +++ b/daliuge-runtime/dlg/restserver.py @@ -23,11 +23,11 @@ import bottle - from .restutils import RestServerWSGIServer logger = logging.getLogger(__name__) + class RestServer(object): """ The base class for our REST servers @@ -52,4 +52,4 @@ def stop(self, timeout=None): logger.info("Stopping REST server") self._server.server_close() self.app.close() - self._server = None \ No newline at end of file + self._server = None diff --git a/daliuge-runtime/dlg/rpc.py b/daliuge-runtime/dlg/rpc.py index a6cc040ec..bc26253b4 100644 --- a/daliuge-runtime/dlg/rpc.py +++ b/daliuge-runtime/dlg/rpc.py @@ -31,23 +31,25 @@ import logging import os import threading -import time from six.moves import queue as Queue # @UnresolvedImport from . import utils from .exceptions import DaliugeException - logger = logging.getLogger(__name__) + class RPCObject(object): """Base class for all RCP clients and server""" + def start(self): self.rpc_running = True + def shutdown(self): self.rpc_running = False + class RPCClientBase(RPCObject): """Base class for all RPC clients""" @@ -62,12 +64,13 @@ def get_drop_attribute(self, hostname, port, session_id, uid, name): class remote_method(object): def __del__(self): closer() + def __call__(self, *args): return client.call_drop(session_id, uid, name, *args) # Shortcut to avoid extra calls known_methods = () - #known_methods = ('open', 'read', 'write', 'close') + # known_methods = ('open', 'read', 'write', 'close') closeit = False try: if name in known_methods or client.has_method(session_id, uid, name): @@ -78,8 +81,10 @@ def __call__(self, *args): if closeit: closer() + class RPCServerBase(RPCObject): """Base class for all RPC server""" + def __init__(self, host, port): self._rpc_host = host self._rpc_port = port @@ -130,10 +135,13 @@ def __make_call(self, method, *args): if x.is_exception: raise x.value return x.value + def call_drop(self, session_id, uid, name, *args): return self.__make_call('call_drop', session_id, uid, name, *args) + def get_drop_property(self, session_id, uid, name): return self.__make_call('get_drop_property', session_id, uid, name) + def has_method(self, session_id, uid, name): return self.__make_call('has_method', session_id, uid, name) @@ -150,7 +158,7 @@ def run_zrpcclient(self, host, port, req_queue): # and generates the same channel IDs, confusing the server import zerorpc ctx = zerorpc.Context() - client = zerorpc.Client("tcp://%s:%d" % (host,port), context=ctx) + client = zerorpc.Client("tcp://%s:%d" % (host, port), context=ctx) forwarder = gevent.spawn(self.forward_requests, req_queue, client) gevent.joinall([forwarder]) @@ -188,6 +196,7 @@ def get_rpc_client(self, hostname, port): # No closing function since clients are long-lived return client, lambda: None + class ZeroRPCServer(RPCServerBase): """ZeroRPC server support""" @@ -202,7 +211,8 @@ def start(self): # Starts the single-threaded ZeroRPC server for RPC requests timeout = 30 server_started = threading.Event() - self._zrpcserverthread = threading.Thread(target=self.run_zrpcserver, name="ZeroRPC server", args=(self._rpc_host, self._rpc_port, server_started)) + self._zrpcserverthread = threading.Thread(target=self.run_zrpcserver, name="ZeroRPC server", + args=(self._rpc_host, self._rpc_port, server_started)) self._zrpcserverthread.start() if not server_started.wait(timeout): raise Exception("ZeroRPC server didn't start within %d seconds" % (timeout,)) @@ -240,7 +250,7 @@ def shutdown(self): self._zrpcserverthread.join() -class RPyCClient(RPCClientBase): # pragma: no cover +class RPyCClient(RPCClientBase): # pragma: no cover """RPyC client support""" def get_rpc_client(self, hostname, port): @@ -248,7 +258,8 @@ def get_rpc_client(self, hostname, port): client = rpyc.connect(hostname, port) return client.root, client.close -class RPyCServer(RPCServerBase): # pragma: no cover + +class RPyCServer(RPCServerBase): # pragma: no cover """RPyC server support""" def start(self): @@ -258,15 +269,18 @@ def start(self): from rpyc.utils.server import ThreadedServer nm = self + class NMService(rpyc.Service): def exposed_call_drop(self, session_id, uid, name, *args): return nm.call_drop(session_id, uid, name, *args) + def exposed_get_drop_property(self, session_id, uid, name): return nm.get_drop_attribute(session_id, uid, name) + def exposed_has_method(self, session_id, uid, name): return nm.has_method(session_id, uid, name) - self._rpycserver = ThreadedServer(NMService, hostname=self._rpc_host, port=self._rpc_port) # ThreadPoolServer + self._rpycserver = ThreadedServer(NMService, hostname=self._rpc_host, port=self._rpc_port) # ThreadPoolServer # Starts the single-threaded RPyC server for RPC requests self._rpycserverthread = threading.Thread(target=self._rpycserver.start, name="RPyC server") @@ -278,7 +292,8 @@ def shutdown(self): self._rpycserver.close() self._rpycserverthread.join() -class PyroRPCClient(RPCClientBase): # pragma: no cover + +class PyroRPCClient(RPCClientBase): # pragma: no cover """Pyro client support""" def get_rpc_client(self, hostname, port): @@ -287,7 +302,8 @@ def get_rpc_client(self, hostname, port): proxy = Pyro4.Proxy(uri) return proxy, proxy._pyroRelease -class PyroRPCServer(RPCServerBase): # pragma: no cover + +class PyroRPCServer(RPCServerBase): # pragma: no cover """Base Pyro server support. Subclasses support different server types""" def start(self): @@ -346,7 +362,7 @@ def setup_serpent(): from .event import Event def __pyro4_class_to_dict(o): - d = {'__class__' : o.__class__.__name__, '__module__': o.__class__.__module__} + d = {'__class__': o.__class__.__name__, '__module__': o.__class__.__module__} d.update(o.__dict__) return d @@ -368,7 +384,7 @@ def setup_pickle(): Pyro4.config.SERIALIZERS_ACCEPTED = ['pickle'] # We could also do one or the other depending on the major version of python - #setup_serpent() + # setup_serpent() setup_pickle() # In Pyro4 >= 4.46 the default for this option changed to True, which would @@ -381,7 +397,8 @@ def setup_pickle(): # than enough Pyro4.config.COMMTIMEOUT = 60 -class MultiplexPyroRPCServer(PyroRPCServer): # pragma: no cover + +class MultiplexPyroRPCServer(PyroRPCServer): # pragma: no cover """Pyro server support with mutliplex server type""" def setup_pyro(self): @@ -389,7 +406,8 @@ def setup_pyro(self): import Pyro4 Pyro4.config.SERVERTYPE = 'multiplex' -class ThreadedPyroRPCServer(PyroRPCServer): # pragma: no cover + +class ThreadedPyroRPCServer(PyroRPCServer): # pragma: no cover """Pyro server support with multithreaded server type""" def setup_pyro(self): @@ -400,18 +418,21 @@ def setup_pyro(self): if hasattr(Pyro4.config, 'THREADPOOL_ALLOW_QUEUE'): Pyro4.config.THREADPOOL_ALLOW_QUEUE = False + # Check which rpc backend should be exposed rpc_lib = os.environ.get('DALIUGE_RPC', 'zerorpc') -if rpc_lib in ('pyro', 'pyro-multiplex'): # pragma: no cover +if rpc_lib in ('pyro', 'pyro-multiplex'): # pragma: no cover RPCServer, RPCClient = MultiplexPyroRPCServer, PyroRPCClient -elif rpc_lib == 'pyro-threaded': # pragma: no cover +elif rpc_lib == 'pyro-threaded': # pragma: no cover RPCServer, RPCClient = ThreadedPyroRPCServer, PyroRPCClient elif rpc_lib == 'zerorpc': RPCServer, RPCClient = ZeroRPCServer, ZeroRPCClient -elif rpc_lib == 'rpyc': # pragma: no cover +elif rpc_lib == 'rpyc': # pragma: no cover RPCServer, RPCClient = RPyCServer, RPyCClient -else: # pragma: no cover - raise DaliugeException("Unknown RPC lib %s, use one of pyro, pyro-multiplex, pyro-threaded, zerorpc, rpyc" % (rpc_lib,)) +else: # pragma: no cover + raise DaliugeException( + "Unknown RPC lib %s, use one of pyro, pyro-multiplex, pyro-threaded, zerorpc, rpyc" % (rpc_lib,)) + class DropProxy(object): """ @@ -439,4 +460,4 @@ def __getattr__(self, name): return self.rpc_client.get_drop_attribute(self.hostname, self.port, self.session_id, self.uid, name) def __repr__(self): - return '' % (self.uid, self.session_id, self.hostname, self.port) \ No newline at end of file + return '' % (self.uid, self.session_id, self.hostname, self.port) diff --git a/daliuge-runtime/dlg/runtime/__init__.py b/daliuge-runtime/dlg/runtime/__init__.py index a1f21c8b0..aae38834d 100644 --- a/daliuge-runtime/dlg/runtime/__init__.py +++ b/daliuge-runtime/dlg/runtime/__init__.py @@ -24,11 +24,11 @@ the system. """ + # It is of utmost importance that this is the *first* thing we do any time # we load daliuge up. Most modules in daliuge that have a logger create it at # import time, so we need to perform this setup before doing any other imports def setup_logger_class(): - # Doc building is failing due with "ValueError: Empty module name" in # "from . import drop" further below, which I can't easily explain. # Just skip this setup in RTD for the time being @@ -75,10 +75,10 @@ def makeRecord(self, *args, **kwargs): return record logging.setLoggerClass(_DlgLogger) + + setup_logger_class() del setup_logger_class from .version import git_version as __git_version__ from .version import version as __version__ -from ..apps import get_include_dir -from ..dask_emulation import delayed diff --git a/daliuge-runtime/dlg/runtime/tool_commands.py b/daliuge-runtime/dlg/runtime/tool_commands.py index 844b2b34d..fe859e073 100644 --- a/daliuge-runtime/dlg/runtime/tool_commands.py +++ b/daliuge-runtime/dlg/runtime/tool_commands.py @@ -22,16 +22,20 @@ from ..common import tool + def include_dir(_parser, _args): from . import get_include_dir print(get_include_dir()) + def register_commands(): tool.cmdwrap('nm', 'Starts a Node Manager', 'dlg.manager.cmdline:dlgNM') tool.cmdwrap('dim', 'Starts a Drop Island Manager', 'dlg.manager.cmdline:dlgDIM') tool.cmdwrap('mm', 'Starts a Master Manager', 'dlg.manager.cmdline:dlgMM') tool.cmdwrap('replay', 'Starts a Replay Manager', 'dlg.manager.cmdline:dlgReplay') tool.cmdwrap('daemon', 'Starts a DALiuGE Daemon process', 'dlg.manager.proc_daemon:run_with_cmdline') - tool.cmdwrap('proxy', 'A reverse proxy to be used in restricted environments to contact the Drop Managers', 'dlg.deploy.pawsey.dfms_proxy:run') - tool.cmdwrap('monitor', 'A proxy to be used in conjunction with the dlg proxy in restricted environments', 'dlg.deploy.pawsey.dfms_monitor:run') - tool.cmdwrap('include_dir', 'Print the directory where C header files can be found', include_dir) \ No newline at end of file + tool.cmdwrap('proxy', 'A reverse proxy to be used in restricted environments to contact the Drop Managers', + 'dlg.deploy.pawsey.dfms_proxy:run') + tool.cmdwrap('monitor', 'A proxy to be used in conjunction with the dlg proxy in restricted environments', + 'dlg.deploy.pawsey.dfms_monitor:run') + tool.cmdwrap('include_dir', 'Print the directory where C header files can be found', include_dir) diff --git a/daliuge-runtime/dlg/shoreClient.py b/daliuge-runtime/dlg/shoreClient.py index 5a8438940..3c4f98c2c 100644 --- a/daliuge-runtime/dlg/shoreClient.py +++ b/daliuge-runtime/dlg/shoreClient.py @@ -26,12 +26,14 @@ # jason.wang@icrar.org or jason.ruonan.wang@gmail.com import os + import six.moves.cPickle as pickle # @UnresolvedImport message_socket = None transport_socket = None isInited = False + def securityCheck(doid, column, row, rows): if type(row) is not int: print('ShoreClient Error: Please give a valid start row number') @@ -41,7 +43,8 @@ def securityCheck(doid, column, row, rows): return False return True -def shoreZmqInit(address = None): + +def shoreZmqInit(address=None): import zmq global message_socket global transport_socket @@ -50,7 +53,8 @@ def shoreZmqInit(address = None): message_address = address else: message_address = os.environ['SHORE_DAEMON_ADDRESS'] - transport_address = message_address.split(':')[0] + ':' + message_address.split(':')[1] + ':' + str(int(message_address.split(':')[2]) + 1) + transport_address = message_address.split(':')[0] + ':' + message_address.split(':')[1] + ':' + str( + int(message_address.split(':')[2]) + 1) context = zmq.Context() message_socket = context.socket(zmq.REQ) message_socket.connect(message_address) @@ -58,25 +62,27 @@ def shoreZmqInit(address = None): transport_socket.connect(transport_address) isInited = True + def shoreDelete(doid, column=None): if not isInited: shoreZmqInit() msg_send = { - 'operation' : 'delete', - 'doid' : doid, - 'column' : column, + 'operation': 'delete', + 'doid': doid, + 'column': column, } message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) return ret + def shoreQuery(doid, column=None): if not isInited: shoreZmqInit() msg_send = { - 'operation' : 'query', - 'doid' : doid, - 'column' : column, + 'operation': 'query', + 'doid': doid, + 'column': column, } message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) @@ -97,18 +103,19 @@ def shoreQuery(doid, column=None): return None return ret -def shoreGet(doid, column, row, rows = 1, slicer = None): - if not securityCheck(doid,column,row,rows): + +def shoreGet(doid, column, row, rows=1, slicer=None): + if not securityCheck(doid, column, row, rows): return None if not isInited: shoreZmqInit() msg_send = { - 'operation' : 'get', - 'doid' : doid, - 'column' : column, - 'row' : row, - 'rows' : rows + 'operation': 'get', + 'doid': doid, + 'column': column, + 'row': row, + 'rows': rows } message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) @@ -128,19 +135,18 @@ def shoreGet(doid, column, row, rows = 1, slicer = None): # transport if 'event_id' in ret: - pkg_dict = {'event_id':ret['event_id'],'operation':'get'} + pkg_dict = {'event_id': ret['event_id'], 'operation': 'get'} pkg_pickled = pickle.dumps(pkg_dict) transport_socket.send(pkg_pickled) ret = transport_socket.recv() ret = pickle.loads(ret) return ret -def shorePut(doid, column, row, data, rows = 1, slicer = None): - if not securityCheck(doid,column,row,rows): +def shorePut(doid, column, row, data, rows=1, slicer=None): + if not securityCheck(doid, column, row, rows): return None - if not isInited: shoreZmqInit() @@ -148,24 +154,22 @@ def shorePut(doid, column, row, data, rows = 1, slicer = None): dtype = data.dtype # message msg_send = { - 'operation' : 'put', - 'doid' : doid, - 'column' : column, - 'row' : row, + 'operation': 'put', + 'doid': doid, + 'column': column, + 'row': row, 'rows': rows, - 'shape' : shape, - 'datatype' : dtype, + 'shape': shape, + 'datatype': dtype, } if slicer: - msg_send['slicer']=slicer + msg_send['slicer'] = slicer message_socket.send(pickle.dumps(msg_send)) ret = pickle.loads(message_socket.recv()) # transport if 'event_id' in ret: - msg_send = {'event_id':ret['event_id'], 'data':data, 'operation':'put'} + msg_send = {'event_id': ret['event_id'], 'data': data, 'operation': 'put'} transport_socket.send(pickle.dumps(msg_send)) ret = transport_socket.recv() ret = pickle.loads(ret) - - diff --git a/daliuge-runtime/dlg/testutils.py b/daliuge-runtime/dlg/testutils.py index 6c1c9308b..8a857385e 100644 --- a/daliuge-runtime/dlg/testutils.py +++ b/daliuge-runtime/dlg/testutils.py @@ -22,10 +22,10 @@ import threading from dlg.manager import constants +from dlg.manager.composite_manager import DataIslandManager, MasterManager from dlg.manager.node_manager import NodeManager from dlg.manager.rest import NMRestServer, CompositeManagerRestServer from dlg.utils import portIsOpen -from dlg.manager.composite_manager import DataIslandManager, MasterManager class ManagerInfo(object): @@ -48,6 +48,7 @@ def stop(self): self.manager.shutdown() self.test.assertFalse(self.thread.is_alive()) + class ManagerStarter(object): def _start_manager_in_thread(self, port, manager_class, rest_class, @@ -69,6 +70,6 @@ def start_dim_in_thread(self, nm_hosts=['127.0.0.1'], port, DataIslandManager, CompositeManagerRestServer, nm_hosts) def start_mm_in_thread(self, nm_hosts=['127.0.0.1'], - port=constants.MASTER_DEFAULT_REST_PORT): + port=constants.MASTER_DEFAULT_REST_PORT): return self._start_manager_in_thread( - port, MasterManager, CompositeManagerRestServer, nm_hosts) \ No newline at end of file + port, MasterManager, CompositeManagerRestServer, nm_hosts) diff --git a/daliuge-runtime/dlg/utils.py b/daliuge-runtime/dlg/utils.py index 15bc43b68..19ee5e57e 100644 --- a/daliuge-runtime/dlg/utils.py +++ b/daliuge-runtime/dlg/utils.py @@ -38,9 +38,9 @@ from . import common - logger = logging.getLogger(__name__) + def timed_import(module_name): """Imports `module_name` and log how long it took to import it""" start = time.time() @@ -58,17 +58,19 @@ def get_local_ip_addr(): if_addrs = [(netifaces.ifaddresses(iface), iface) for iface in ifaces] if_inet_addrs = [(tup[0][PROTO], tup[1]) for tup in if_addrs if PROTO in tup[0]] iface_addrs = [(s['addr'], tup[1]) for tup in if_inet_addrs for s in tup[0] \ - if 'addr' in s and not s['addr'].startswith('127.')] + if 'addr' in s and not s['addr'].startswith('127.')] return iface_addrs + def get_all_ipv4_addresses(): """Get a list of all IPv4 interfaces found in this computer""" proto = netifaces.AF_INET return [addr['addr'] - for iface in netifaces.interfaces() - for iface_proto, addrs in netifaces.ifaddresses(iface).items() if proto == iface_proto - for addr in addrs if 'addr' in addr - ] + for iface in netifaces.interfaces() + for iface_proto, addrs in netifaces.ifaddresses(iface).items() if proto == iface_proto + for addr in addrs if 'addr' in addr + ] + def register_service(zc, service_type_name, service_name, ipaddr, port, protocol='tcp'): """ @@ -92,12 +94,14 @@ def register_service(zc, service_type_name, service_name, ipaddr, port, protocol zc.register_service(info) return info + def deregister_service(zc, info): """ ZeroConf: Deregister service """ zc.unregister_service(info) + def browse_service(zc, service_type_name, protocol, callback): """ ZeroConf: Browse for services based on service type and protocol @@ -115,6 +119,7 @@ def browse_service(zc, service_type_name, protocol, callback): browser = ServiceBrowser(zc, stn, handlers=[callback]) return browser + def zmq_safe(host_or_addr): """Converts `host_or_addr` to a format that is safe for ZMQ to use""" @@ -125,6 +130,7 @@ def zmq_safe(host_or_addr): # Return otherwise always an IP address return socket.gethostbyname(host_or_addr) + def to_externally_contactable_host(host, prefer_local=False): """ Turns `host`, which is an address used to bind a local service, @@ -153,6 +159,7 @@ def to_externally_contactable_host(host, prefer_local=False): # All addresses were loopbacks! let's return the last one raise a + def getDlgDir(): """ Returns the root of the directory structure used by the DALiuGE framework at @@ -162,6 +169,7 @@ def getDlgDir(): return os.environ['DLG_ROOT'] return os.path.join(os.path.expanduser("~"), ".dlg") + def getDlgPidDir(): """ Returns the location of the directory used by the DALiuGE framework to store @@ -170,6 +178,7 @@ def getDlgPidDir(): """ return os.path.join(getDlgDir(), 'pid') + def getDlgLogsDir(): """ Returns the location of the directory used by the DALiuGE framework to store @@ -178,6 +187,7 @@ def getDlgLogsDir(): """ return os.path.join(getDlgDir(), 'logs') + def createDirIfMissing(path): """ Creates the given directory if it doesn't exist @@ -188,10 +198,12 @@ def createDirIfMissing(path): if e.errno != errno.EEXIST: raise + def isabs(path): """Like os.path.isabs, but handles None""" return path and os.path.isabs(path) + def fname_to_pipname(fname): """ Converts a graph filename (assuming it's a .json file) to its "pipeline" @@ -202,17 +214,19 @@ def fname_to_pipname(fname): fname = fname[:-5] return fname + def escapeQuotes(s, singleQuotes=True, doubleQuotes=True): """ Escapes single and double quotes in a string. Useful to include commands in a shell invocation or similar. """ if singleQuotes: - s = s.replace("'","'\\''") + s = s.replace("'", "'\\''") if doubleQuotes: - s = s.replace('"','\\"') + s = s.replace('"', '\\"') return s + def prepare_sql(sql, paramstyle, data=()): """ Prepares the given SQL statement for proper execution depending on the @@ -241,17 +255,23 @@ def prepare_sql(sql, paramstyle, data=()): logger.debug('Generating %d markers with paramstyle = %s', n, paramstyle) - if paramstyle == 'qmark': markers = ['?' for i in range(n)] - elif paramstyle == 'numeric': markers = [':%d'%(i) for i in range(n)] - elif paramstyle == 'named': markers = [':n%d'%(i) for i in range(n)] - elif paramstyle == 'format': markers = [':%s' for i in range(n)] - elif paramstyle == 'pyformat': markers = [':%%(n%d)s'%(i) for i in range(n)] - else: raise Exception('Unknown paramstyle: %s' % (paramstyle)) + if paramstyle == 'qmark': + markers = ['?' for i in range(n)] + elif paramstyle == 'numeric': + markers = [':%d' % (i) for i in range(n)] + elif paramstyle == 'named': + markers = [':n%d' % (i) for i in range(n)] + elif paramstyle == 'format': + markers = [':%s' for i in range(n)] + elif paramstyle == 'pyformat': + markers = [':%%(n%d)s' % (i) for i in range(n)] + else: + raise Exception('Unknown paramstyle: %s' % (paramstyle)) sql = sql.format(*markers) if paramstyle in ['format', 'pyformat']: - data = {'n%d'%(i): d for i,d in enumerate(data)} + data = {'n%d' % (i): d for i, d in enumerate(data)} return (sql, data) @@ -264,6 +284,7 @@ def object_tracking(name): """ current_object = threading.local() + def track_current_drop(f): @functools.wraps(f) @@ -278,11 +299,13 @@ def _wrapper(*args, **kwargs): return f(*args, **kwargs) finally: setattr(current_object, name, previous) + return _wrapper track_current_drop.tlocal = current_object return track_current_drop + def get_symbol(name): """Gets the global symbol ``name``, which is an "absolute path" to a python name in the form of ``pkg.subpkg.subpkg.module.name``""" @@ -290,6 +313,7 @@ def get_symbol(name): module = importlib.import_module('.'.join(parts[:-1])) return getattr(module, parts[-1]) + class ZlibUncompressedStream(object): """ A class that reads gzip-compressed content and returns uncompressed content @@ -387,6 +411,7 @@ def read(self, n=-1): return b''.join(response) + # Backwards compatibility terminate_or_kill = common.terminate_or_kill wait_or_kill = common.wait_or_kill @@ -399,4 +424,4 @@ def read(self, n=-1): write_to = common.write_to JSONStream = common.JSONStream -ZlibCompressedStream = common.ZlibCompressedStream \ No newline at end of file +ZlibCompressedStream = common.ZlibCompressedStream diff --git a/daliuge-runtime/fabfile/APPspecific.py b/daliuge-runtime/fabfile/APPspecific.py index bad1af3f3..38e5397e5 100644 --- a/daliuge-runtime/fabfile/APPspecific.py +++ b/daliuge-runtime/fabfile/APPspecific.py @@ -26,16 +26,14 @@ NOTE: This requires modifications for the specific application where this fabfile is used. Please make sure not to use it without those modifications. """ -import os, sys -from fabric.state import env -from fabric.colors import red -from fabric.operations import local +import os + +from fabric.context_managers import cd from fabric.decorators import task, parallel -from fabric.context_managers import settings, cd -from fabric.contrib.files import exists, sed +from fabric.state import env from fabric.utils import abort -from fabric.contrib.console import confirm -#import urllib2 + +# import urllib2 # >>> All the settings below are kept in the special fabric environment # >>> dictionary called env. Don't change the names, only adjust the @@ -86,39 +84,39 @@ env.AWS_INSTANCES = 1 env.AWS_INSTANCE_TYPE = 't2.micro' env.AWS_KEY_NAME = 'icrar_{0}'.format(env.APP_USER) -env.AWS_SEC_GROUP = 'DALIUGE' # Security group -env.AWS_SEC_GROUP_PORTS = [22, 80, 8000, 8001] # ports to open -env.AWS_SUDO_USER = 'ec2-user' # required to install init scripts. +env.AWS_SEC_GROUP = 'DALIUGE' # Security group +env.AWS_SEC_GROUP_PORTS = [22, 80, 8000, 8001] # ports to open +env.AWS_SUDO_USER = 'ec2-user' # required to install init scripts. # Alpha-sorted packages per package manager env.pkgs = { - 'YUM_PACKAGES': [ - 'wget', - 'tar', - 'git', - 'gcc', - 'python36-devel', #this is the latest available with AWS Linux - ], - 'APT_PACKAGES': [ - 'tar', - 'wget', - 'gcc', - ], - 'SLES_PACKAGES': [ - 'wget', - 'gcc', - ], - 'BREW_PACKAGES': [ - 'wget', - 'gcc', - ], - 'PORT_PACKAGES': [ - 'wget', - 'gcc', - ], - 'APP_EXTRA_PYTHON_PACKAGES': [ - ], - } + 'YUM_PACKAGES': [ + 'wget', + 'tar', + 'git', + 'gcc', + 'python36-devel', # this is the latest available with AWS Linux + ], + 'APT_PACKAGES': [ + 'tar', + 'wget', + 'gcc', + ], + 'SLES_PACKAGES': [ + 'wget', + 'gcc', + ], + 'BREW_PACKAGES': [ + 'wget', + 'gcc', + ], + 'PORT_PACKAGES': [ + 'wget', + 'gcc', + ], + 'APP_EXTRA_PYTHON_PACKAGES': [ + ], +} # Don't re-export the tasks imported from other modules, only the ones defined # here @@ -130,16 +128,16 @@ env.APP_repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..')) # >>> The following lines need to be after the definitions above!!! -from fabfileTemplate.utils import sudo, info, success, default_if_empty, home, run -from fabfileTemplate.utils import overwrite_defaults, failure -from fabfileTemplate.system import check_command, get_linux_flavor, MACPORT_DIR -from fabfileTemplate.APPcommon import virtualenv, APP_doc_dependencies, APP_source_dir -from fabfileTemplate.APPcommon import APP_root_dir, extra_python_packages, APP_user, build -from fabfileTemplate.pkgmgr import check_brew_port, check_brew_cellar +from fabfileTemplate.utils import sudo, info, success, run +from fabfileTemplate.utils import overwrite_defaults +from fabfileTemplate.system import check_command, get_linux_flavor +from fabfileTemplate.APPcommon import virtualenv, APP_source_dir +from fabfileTemplate.APPcommon import APP_root_dir # get the settings from the fab environment if set on command line settings = overwrite_defaults(defaults) + def start_APP_and_check_status(): """ Starts the APP daemon process and checks that the server is up and running @@ -148,6 +146,7 @@ def start_APP_and_check_status(): virtualenv('dlg --help') success('dlg help is working...') + def sysinitstart_APP_and_check_status(): """ Starts the APP daemon process and checks that the server is up and running @@ -158,7 +157,6 @@ def sysinitstart_APP_and_check_status(): def APP_build_cmd(): - # The installation of the bsddb package (needed by ngamsCore) is in # particular difficult because it requires some flags to be passed on # (particularly if using MacOSX's port @@ -171,6 +169,7 @@ def APP_build_cmd(): return ' '.join(build_cmd) + def prepare_APP_data_dir(): """Creates a new APP root directory""" @@ -191,11 +190,12 @@ def prepare_APP_data_dir(): nrd) if res.return_code == 2: error = (nrd + " already exists. Specify APP_OVERWRITE_ROOT to " - "overwrite, or a different APP_ROOT_DIR location") + "overwrite, or a different APP_ROOT_DIR location") else: error = res abort(error) + def install_sysv_init_script(nsd, nuser, cfgfile): """ Install the APP init script for an operational deployment. @@ -229,6 +229,7 @@ def install_sysv_init_script(nsd, nuser, cfgfile): success("{0} init script installed".format(env.APP_NAME)) + @task @parallel def cleanup(): @@ -236,13 +237,14 @@ def cleanup(): run('rm -rf DALIUGE') run('if [ -f .bash_profile.orig ]; then mv .bash_profile.orig .bash_profile; fi') + def install_docker_compose(): pass + env.build_cmd = APP_build_cmd env.APP_init_install_function = install_sysv_init_script env.APP_start_check_function = start_APP_and_check_status env.sysinitAPP_start_check_function = sysinitstart_APP_and_check_status env.prepare_APP_data_dir = prepare_APP_data_dir env.APP_extra_sudo_function = install_docker_compose - diff --git a/daliuge-runtime/fabfile/__init__.py b/daliuge-runtime/fabfile/__init__.py index 598f76c63..06dc49df2 100644 --- a/daliuge-runtime/fabfile/__init__.py +++ b/daliuge-runtime/fabfile/__init__.py @@ -28,10 +28,3 @@ Other tasks, including lower-level tasks, can also be invoked. """ from . import APPspecific -from fabfileTemplate import APPcommon -from fabfileTemplate import aws -from fabfileTemplate import hl -from fabfileTemplate import pkgmgr -from fabfileTemplate import system -from fabfileTemplate import utils - diff --git a/daliuge-runtime/setup.py b/daliuge-runtime/setup.py index e11a3726d..1a0e2a7ad 100644 --- a/daliuge-runtime/setup.py +++ b/daliuge-runtime/setup.py @@ -112,6 +112,7 @@ def run(self): f.write("{0}/dist-packages".format(lp)) install.copy_file(self, PTH_FILE, os.path.join(self.install_lib, PTH_FILE)) + # Core requirements of DALiuGE # Keep alpha-sorted PLEASE! install_requires = [ @@ -165,7 +166,6 @@ def run(self): "aws": ["boto3"], } - setup( name="daliuge-runtime", version=get_version_info()[0], @@ -199,7 +199,7 @@ def run(self): "test.dropmake": ["logical_graphs/*.json"], "test.apps": ["dynlib_example.c", "dynlib_example2.c"], }, - entry_points = { + entry_points={ 'dlg.tool_commands': ['runtime=dlg.runtime.tool_commands'] }, install_requires=install_requires, diff --git a/daliuge-runtime/test/__init__.py b/daliuge-runtime/test/__init__.py index c5c2f0ace..6a270caa5 100644 --- a/daliuge-runtime/test/__init__.py +++ b/daliuge-runtime/test/__init__.py @@ -21,7 +21,6 @@ # def __setupTestLogging(): - import os import logging @@ -34,5 +33,6 @@ def __setupTestLogging(): else: logging.root.addHandler(logging.NullHandler()) + __setupTestLogging() -del __setupTestLogging \ No newline at end of file +del __setupTestLogging diff --git a/daliuge-runtime/test/apps/__init__.py b/daliuge-runtime/test/apps/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/apps/__init__.py +++ b/daliuge-runtime/test/apps/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/apps/test_bash.py b/daliuge-runtime/test/apps/test_bash.py index 1e2b2175d..dd7d07f7c 100644 --- a/daliuge-runtime/test/apps/test_bash.py +++ b/daliuge-runtime/test/apps/test_bash.py @@ -29,9 +29,8 @@ import unittest import six - from dlg import droputils -from dlg.apps.bash_shell_app import BashShellApp, StreamingInputBashApp,\ +from dlg.apps.bash_shell_app import BashShellApp, StreamingInputBashApp, \ StreamingOutputBashApp, StreamingInputOutputBashApp from dlg.ddap_protocol import DROPStates from dlg.drop import FileDROP, InMemoryDROP @@ -91,6 +90,7 @@ def test_envvars(self): # a fake session that has an ID class dummy(object): pass + session = dummy() session.sessionId = session_id @@ -106,6 +106,7 @@ def assert_envvar_is_there(varname, value): assert_envvar_is_there('DLG_UID', app_uid) assert_envvar_is_there('DLG_SESSION_ID', session_id) + class StreamingBashAppTests(unittest.TestCase): def test_single_pipe(self): @@ -142,9 +143,9 @@ def test_single_pipe(self): a.async_execute() # The application executed, finished, and its output was recorded - for drop in (a,b,c,d): + for drop in (a, b, c, d): self.assertEqual(DROPStates.COMPLETED, drop.status, "Drop %r not COMPLETED: %d" % (drop, drop.status)) - self.assertEqual([5,4,3,2,1], [int(x) for x in droputils.allDropContents(d).split(six.b('\n'))]) + self.assertEqual([5, 4, 3, 2, 1], [int(x) for x in droputils.allDropContents(d).split(six.b('\n'))]) # Clean up and go os.remove(output_fname) @@ -188,9 +189,9 @@ def test_two_simultaneous_pipes(self): a.async_execute() # The application executed, finished, and its output was recorded - for drop in (a,b,c,d,e,f): + for drop in (a, b, c, d, e, f): self.assertEqual(DROPStates.COMPLETED, drop.status) - self.assertEqual([1,2,3,4,5], [int(x) for x in droputils.allDropContents(f).strip().split(six.b('\n'))]) + self.assertEqual([1, 2, 3, 4, 5], [int(x) for x in droputils.allDropContents(f).strip().split(six.b('\n'))]) # Clean up and go - os.remove(output_fname) \ No newline at end of file + os.remove(output_fname) diff --git a/daliuge-runtime/test/apps/test_crc.py b/daliuge-runtime/test/apps/test_crc.py index 49a4da8df..8e85f1f43 100644 --- a/daliuge-runtime/test/apps/test_crc.py +++ b/daliuge-runtime/test/apps/test_crc.py @@ -27,7 +27,6 @@ import unittest import six - from dlg import droputils from dlg.apps.crc import CRCApp, crc32 from dlg.apps.dynlib import DynlibApp @@ -84,4 +83,4 @@ def test_with_dynlib(self): # Data and CRCs are the expected ones for what, who in (data, (a, c, f)), (crc, (e, h, j)): for drop in who: - self.assertEqual(what, droputils.allDropContents(drop)) \ No newline at end of file + self.assertEqual(what, droputils.allDropContents(drop)) diff --git a/daliuge-runtime/test/apps/test_docker.py b/daliuge-runtime/test/apps/test_docker.py index 514195a56..fcb433ff4 100644 --- a/daliuge-runtime/test/apps/test_docker.py +++ b/daliuge-runtime/test/apps/test_docker.py @@ -28,7 +28,6 @@ import configobj import docker import six - from dlg import droputils, utils from dlg.apps.dockerapp import DockerApp from dlg.drop import FileDROP, NgasDROP @@ -41,9 +40,9 @@ except: pass + @unittest.skipIf(docker_unavailable, "Docker daemon not available") class DockerTests(unittest.TestCase): - _temp = None _docker_available = False @@ -135,7 +134,7 @@ def test_quotedCommands(self): def assertMsgIsCorrect(msg, command): a = DockerApp('a', 'a', image='ubuntu:14.04', command=command) - b = FileDROP('b','b') + b = FileDROP('b', 'b') a.addOutput(b) with DROPWaiterCtx(self, b, 100): a.execute() @@ -162,7 +161,7 @@ def test_refer_to_io_by_uid(self): self._ngas_and_fs_io("echo -n '%iDataURL[a]' > %o[c]") def _ngas_and_fs_io(self, command): - a = NgasDROP('a', 'a') # not a filesystem-related DROP, we can reference its URL in the command-line + a = NgasDROP('a', 'a') # not a filesystem-related DROP, we can reference its URL in the command-line b = DockerApp('b', 'b', image="ubuntu:14.04", command=command) c = FileDROP('c', 'c') b.addInput(a) @@ -171,11 +170,10 @@ def _ngas_and_fs_io(self, command): a.setCompleted() self.assertEqual(six.b(a.dataURL), droputils.allDropContents(c)) - def test_additional_bindings(self): # Some additional stuff to bind into docker - tempDir = tempfile.mkdtemp() + tempDir = tempfile.mkdtemp() tempFile = tempfile.mktemp() with open(tempFile, 'w') as f: f.write('data') @@ -183,11 +181,11 @@ def test_additional_bindings(self): # One binding specifies the target path in the container, the other doesn't # so it defaults to the same path a = DockerApp( - 'a', - 'a', - image='ubuntu:14.04', - command="cp /opt/file %s" % (tempDir,), - additionalBindings=[tempDir, "%s:/opt/file" % (tempFile,)] + 'a', + 'a', + image='ubuntu:14.04', + command="cp /opt/file %s" % (tempDir,), + additionalBindings=[tempDir, "%s:/opt/file" % (tempFile,)] ) a.execute() diff --git a/daliuge-runtime/test/apps/test_dynlib.py b/daliuge-runtime/test/apps/test_dynlib.py index b350e397f..a042d85d3 100644 --- a/daliuge-runtime/test/apps/test_dynlib.py +++ b/daliuge-runtime/test/apps/test_dynlib.py @@ -25,14 +25,14 @@ import unittest import six - -from .setp_up import build_shared_library -from ..manager import test_dm from dlg import droputils from dlg.apps.dynlib import DynlibApp, DynlibStreamApp, DynlibProcApp from dlg.ddap_protocol import DROPRel, DROPLinkType, DROPStates from dlg.drop import InMemoryDROP, NullDROP +from .setp_up import build_shared_library +from ..manager import test_dm + _libname = "dynlib_example" _libfname = "libdynlib_example.so" _libpath = os.path.join(os.path.dirname(__file__), _libfname) @@ -115,7 +115,6 @@ def test_cancel_dynlibprocapp(self): class IntraNMMixIng(test_dm.NMTestsMixIn): - # Indicate which particular application should the test use app = None diff --git a/daliuge-runtime/test/apps/test_dynlib2.py b/daliuge-runtime/test/apps/test_dynlib2.py index 3780201bf..bab04300c 100644 --- a/daliuge-runtime/test/apps/test_dynlib2.py +++ b/daliuge-runtime/test/apps/test_dynlib2.py @@ -25,14 +25,14 @@ import unittest import six - -from .setp_up import build_shared_library -from ..manager import test_dm from dlg import droputils from dlg.apps.dynlib import DynlibApp, DynlibStreamApp, DynlibProcApp from dlg.ddap_protocol import DROPRel, DROPLinkType, DROPStates from dlg.drop import InMemoryDROP, NullDROP +from .setp_up import build_shared_library +from ..manager import test_dm + _libname = "dynlib_example2" _libfname = "libdynlib_example2.so" _libpath = os.path.join(os.path.dirname(__file__), _libfname) @@ -117,7 +117,6 @@ def test_cancel_dynlibprocapp(self): class IntraNMMixIng(test_dm.NMTestsMixIn): - # Indicate which particular application should the test use app = None diff --git a/daliuge-runtime/test/apps/test_fileimport.py b/daliuge-runtime/test/apps/test_fileimport.py index 68bfdc344..530637cbb 100644 --- a/daliuge-runtime/test/apps/test_fileimport.py +++ b/daliuge-runtime/test/apps/test_fileimport.py @@ -30,15 +30,14 @@ class FileImportAppTests(unittest.TestCase): - root = '/tmp/test_file_import' dirs = ['%s/files/' % root, '%s/empty/' % root] - files = ['%s%s' % (dirs[0],'test.fits'), - '%s%s' % (dirs[0],'test1.fits'), - '%s%s' % (dirs[0],'test2.txt')] + files = ['%s%s' % (dirs[0], 'test.fits'), + '%s%s' % (dirs[0], 'test1.fits'), + '%s%s' % (dirs[0], 'test2.txt')] def setUp(self): for d in self.dirs: @@ -51,21 +50,21 @@ def tearDown(self): shutil.rmtree(self.root) def test_import(self): - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = self.files[0], ext = ['.fits'])) - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = self.root, ext = [])) - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = self.root)) - self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname = '', ext = [])) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname=self.files[0], ext=['.fits'])) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname=self.root, ext=[])) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname=self.root)) + self.assertRaises(Exception, lambda: FileImportApp('a', 'b', dirname='', ext=[])) - a = FileImportApp('a', 'b', dirname = self.root, ext = ['.fits']) + a = FileImportApp('a', 'b', dirname=self.root, ext=['.fits']) self.assertEqual(len(a.children), 2) self.assertEqual(a.children[0].path in self.files, True) self.assertEqual(a.children[1].path in self.files, True) - a = FileImportApp('a', 'b', dirname = self.dirs[1], ext = ['.fits']) + a = FileImportApp('a', 'b', dirname=self.dirs[1], ext=['.fits']) self.assertEqual(len(a.children), 0) - a = FileImportApp('a', 'b', dirname = self.root, ext = ['.txt']) + a = FileImportApp('a', 'b', dirname=self.root, ext=['.txt']) self.assertEqual(len(a.children), 1) - a = FileImportApp('a', 'b', dirname = self.root, ext = ['.hdf5']) + a = FileImportApp('a', 'b', dirname=self.root, ext=['.hdf5']) self.assertEqual(len(a.children), 0) diff --git a/daliuge-runtime/test/apps/test_pyfunc.py b/daliuge-runtime/test/apps/test_pyfunc.py index 8d7c222bb..ec67efd8e 100644 --- a/daliuge-runtime/test/apps/test_pyfunc.py +++ b/daliuge-runtime/test/apps/test_pyfunc.py @@ -27,8 +27,6 @@ import six import six.moves.cPickle as pickle # @UnresolvedImport - -from ..manager import test_dm from dlg import droputils from dlg.apps import pyfunc from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType @@ -36,26 +34,31 @@ from dlg.droputils import DROPWaiterCtx from dlg.exceptions import InvalidDropException +from ..manager import test_dm logger = logging.getLogger(__name__) + def func1(arg1): return arg1 + def func2(arg1): return arg1 * 2; + def func3(): return ['b', 'c', 'd'] + def func_with_defaults(a, b=10, c=20, x=30, y=40, z=50): """Returns a - b * c + (y - x) * z. Default is a + 300""" res = a - b * c + (y - x) * z logger.info("%r - %r * %r + (%r - %r) * %r = %r", a, b, c, y, x, z, res) return res -def _PyFuncApp(oid, uid, f, **kwargs): +def _PyFuncApp(oid, uid, f, **kwargs): fname = None if isinstance(f, six.string_types): fname = f = "test.apps.test_pyfunc." + f @@ -67,6 +70,7 @@ def _PyFuncApp(oid, uid, f, **kwargs): func_defaults=fdefaults, **kwargs) + class TestPyFuncApp(unittest.TestCase): def test_missing_function_param(self): @@ -82,7 +86,8 @@ def test_function_invalid_module(self): def test_function_invalid_fname(self): # The function lives in an unknown module/package - self.assertRaises(InvalidDropException, pyfunc.PyFuncApp, 'a', 'a', func_name='test.apps.test_pyfunc.doesnt_exist') + self.assertRaises(InvalidDropException, pyfunc.PyFuncApp, 'a', 'a', + func_name='test.apps.test_pyfunc.doesnt_exist') def test_valid_creation(self): _PyFuncApp('a', 'a', 'func1') @@ -121,8 +126,10 @@ def test_func2(self): def test_inner_func(self): n = random.randint(0, 1e6) + def f(x): return x + 2 + self._test_simple_functions(f, n, n + 2) def test_lambda(self): @@ -131,8 +138,10 @@ def test_lambda(self): def test_inner_func_with_closure(self): n = random.randint(0, 1e6) + def f(x): return x + n + self._test_simple_functions(f, n, n + n) def test_lambda_with_closure(self): @@ -235,6 +244,7 @@ def test_defaults_args_and_kwargs(self): self._test_defaults(0, 1, 1, x=40) self._test_defaults(249, 1, 2, x=35) + class PyFuncAppIntraNMTest(test_dm.NMTestsMixIn, unittest.TestCase): def test_input_in_remote_nm(self): @@ -248,9 +258,9 @@ def test_input_in_remote_nm(self): | A --|----|-> B --> C | ======= ============= """ - g1 = [{"oid":"A", "type":"plain", "storage": "memory"}] - g2 = [{"oid":"B", "type":"app", "app":"dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}, - {"oid":"C", "type":"plain", "storage": "memory", "producers":["B"]}] + g1 = [{"oid": "A", "type": "plain", "storage": "memory"}] + g2 = [{"oid": "B", "type": "app", "app": "dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}, + {"oid": "C", "type": "plain", "storage": "memory", "producers": ["B"]}] rels = [DROPRel('A', DROPLinkType.INPUT, 'B')] a_data = os.urandom(32) c_data = self._test_runGraphInTwoNMs(g1, g2, rels, pickle.dumps(a_data), None) @@ -266,10 +276,10 @@ def test_output_in_remote_nm(self): | A --> B --|----|-> C | ============= ======= """ - g1 = [{"oid":"A", "type":"plain", "storage": "memory", "consumers": ['B']}, - {"oid":"B", "type":"app", "app":"dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}] - g2 = [{"oid":"C", "type":"plain", "storage": "memory"}] + g1 = [{"oid": "A", "type": "plain", "storage": "memory", "consumers": ['B']}, + {"oid": "B", "type": "app", "app": "dfms.apps.pyfunc.PyFuncApp", "func_name": __name__ + '.func1'}] + g2 = [{"oid": "C", "type": "plain", "storage": "memory"}] rels = [DROPRel('B', DROPLinkType.PRODUCER, 'C')] a_data = os.urandom(32) c_data = self._test_runGraphInTwoNMs(g1, g2, rels, pickle.dumps(a_data), None) - self.assertEqual(a_data, pickle.loads(c_data)) \ No newline at end of file + self.assertEqual(a_data, pickle.loads(c_data)) diff --git a/daliuge-runtime/test/apps/test_simple.py b/daliuge-runtime/test/apps/test_simple.py index 6d39892c4..bbd6e9b98 100644 --- a/daliuge-runtime/test/apps/test_simple.py +++ b/daliuge-runtime/test/apps/test_simple.py @@ -89,4 +89,4 @@ def test_copyapp(self): self._test_copyapp(CopyApp) def test_sleepandcopyapp(self): - self._test_copyapp(SleepAndCopyApp) \ No newline at end of file + self._test_copyapp(SleepAndCopyApp) diff --git a/daliuge-runtime/test/apps/test_socket.py b/daliuge-runtime/test/apps/test_socket.py index eda24e405..72e65004a 100644 --- a/daliuge-runtime/test/apps/test_socket.py +++ b/daliuge-runtime/test/apps/test_socket.py @@ -19,17 +19,16 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import os import unittest -from dlg import utils from dlg import droputils +from dlg import utils from dlg.apps.socket_listener import SocketListenerApp -from dlg.drop import InMemoryDROP from dlg.ddap_protocol import DROPStates +from dlg.drop import InMemoryDROP from dlg.droputils import DROPWaiterCtx from test.test_drop import SumupContainerChecksum -import os - try: from crc32c import crc32 # @UnusedImport @@ -64,11 +63,11 @@ def _test_socket_listener(self, **kwargs): # Create the socket, write, and close the connection, allowing # A to move to COMPLETED - with DROPWaiterCtx(self, d, 3): # That's plenty of time + with DROPWaiterCtx(self, d, 3): # That's plenty of time a.async_execute() utils.write_to(host, port, data, 1) - for drop in [a,b,c,d]: + for drop in [a, b, c, d]: self.assertEqual(DROPStates.COMPLETED, drop.status) # Our expectations are fulfilled! diff --git a/daliuge-runtime/test/apps/test_spead.py b/daliuge-runtime/test/apps/test_spead.py index 657ea42e4..3488e49a5 100644 --- a/daliuge-runtime/test/apps/test_spead.py +++ b/daliuge-runtime/test/apps/test_spead.py @@ -41,15 +41,14 @@ class TestSpeadReceiverApp(unittest.TestCase): @unittest.skipIf(USE_SPEAD is False, "skipping test") def test_speadApp(self): - port = 1111 itemId = 0x2000 thread_pool = spead2.ThreadPool() self._stream = spead2.send.UdpStream(thread_pool, "localhost", port, spead2.send.StreamConfig(rate=1e7)) - a = SpeadReceiverApp('a','a',port=port, itemId=itemId) - b = InMemoryDROP('b','b') + a = SpeadReceiverApp('a', 'a', port=port, itemId=itemId) + b = InMemoryDROP('b', 'b') a.addOutput(b) size = 1024 @@ -58,12 +57,12 @@ def test_speadApp(self): msg = os.urandom(size) with DROPWaiterCtx(self, b, timeout=1): ig = spead2.send.ItemGroup(flavour=spead2.Flavour(4, 64, 48)) - item = ig.add_item(itemId, 'main_data', 'a char array', shape=(size,), format=[('c',8)]) + item = ig.add_item(itemId, 'main_data', 'a char array', shape=(size,), format=[('c', 8)]) item.value = msg self._stream.send_heap(ig.get_heap()) self._stream.send_heap(ig.get_end()) - for drop in a,b: + for drop in a, b: self.assertEqual(DROPStates.COMPLETED, drop.status) self.assertEqual(size, b.size) diff --git a/daliuge-runtime/test/deploy/test_common.py b/daliuge-runtime/test/deploy/test_common.py index 39483505d..f01f446af 100644 --- a/daliuge-runtime/test/deploy/test_common.py +++ b/daliuge-runtime/test/deploy/test_common.py @@ -32,9 +32,9 @@ class CommonTestsBase(ManagerStarter): def _submit(self): - pg = [{"oid":"A", "type":"plain", "storage": "memory"}, - {"oid":"B", "type":"app", "app": "dlg.apps.simple.SleepApp", "inputs": ["A"], "outputs":["C"]}, - {"oid":"C", "type":"plain", "storage": "memory"}] + pg = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "inputs": ["A"], "outputs": ["C"]}, + {"oid": "C", "type": "plain", "storage": "memory"}] for drop in pg: drop['node'] = '127.0.0.1' drop['island'] = '127.0.0.1' @@ -62,13 +62,13 @@ def test_monitor_with_dumping(self): dump_path = tempfile.mktemp() session_id = self._submit() status = common.monitor_sessions(session_id=session_id, poll_interval=0.1, - port=self.port, status_dump_path=dump_path) + port=self.port, status_dump_path=dump_path) self.assert_session_finished(status) self.assertTrue(os.path.exists(dump_path)) os.remove(dump_path) -class TestDeployCommonNM(CommonTestsBase, unittest.TestCase): +class TestDeployCommonNM(CommonTestsBase, unittest.TestCase): port = constants.NODE_DEFAULT_REST_PORT def assert_session_finished(self, status): @@ -82,8 +82,8 @@ def tearDown(self): self.nm_info.stop() super(TestDeployCommonNM, self).tearDown() -class TestDeployCommonDIM(TestDeployCommonNM, unittest.TestCase): +class TestDeployCommonDIM(TestDeployCommonNM, unittest.TestCase): port = constants.ISLAND_DEFAULT_REST_PORT def assert_session_finished(self, status): @@ -97,8 +97,8 @@ def tearDown(self): self.dim_info.stop() super(TestDeployCommonDIM, self).tearDown() -class TestDeployCommonMM(TestDeployCommonDIM, unittest.TestCase): +class TestDeployCommonMM(TestDeployCommonDIM, unittest.TestCase): port = constants.MASTER_DEFAULT_REST_PORT def setUp(self): @@ -107,4 +107,4 @@ def setUp(self): def tearDown(self): self.mm_info.stop() - super(TestDeployCommonMM, self).tearDown() \ No newline at end of file + super(TestDeployCommonMM, self).tearDown() diff --git a/daliuge-runtime/test/deploy/test_slurm_utils.py b/daliuge-runtime/test/deploy/test_slurm_utils.py index 940e3ce30..bdeb6c3b9 100644 --- a/daliuge-runtime/test/deploy/test_slurm_utils.py +++ b/daliuge-runtime/test/deploy/test_slurm_utils.py @@ -24,6 +24,7 @@ from dlg.deploy.pawsey import slurm_utils + class TestSlurmUtils(unittest.TestCase): def assert_list_as_string(self, s, expected_list): diff --git a/daliuge-runtime/test/graphs/complex.js b/daliuge-runtime/test/graphs/complex.js index e8ca7d024..61373c45e 100644 --- a/daliuge-runtime/test/graphs/complex.js +++ b/daliuge-runtime/test/graphs/complex.js @@ -1,155 +1,155 @@ [ - { - "oid": "SL_A", - "type": "socket", - "port": 1111, - "reuse_addr": true, - "outputs": ["A"] - }, - { - "oid": "SL_B", - "type": "socket", - "port": 1112, - "reuse_addr": true, - "outputs": ["B"] - }, - { - "oid": "SL_C", - "type": "socket", - "port": 1113, - "reuse_addr": true, - "outputs": ["C"] - }, - { - "oid": "SL_D", - "type": "socket", - "port": 1114, - "reuse_addr": true, - "outputs": ["D"] - }, - { - "oid": "A", - "type": "plain", - "storage": "memory", - "consumers": ["E"] - }, - { - "oid": "B", - "type": "plain", - "storage": "memory", - "consumers": ["I"] - }, - { - "oid": "C", - "type": "plain", - "storage": "memory", - "consumers": ["F"] - }, - { - "oid": "D", - "type": "plain", - "storage": "memory", - "consumers": ["F"] - }, - { - "oid": "E", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["G"] - }, - { - "oid": "F", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["H"] - }, - { - "oid": "G", - "type": "plain", - "storage": "memory", - "consumers": ["I"] - }, - { - "oid": "H", - "type": "plain", - "storage": "memory", - "consumers": ["I"] - }, - { - "oid": "I", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["J"] - }, - { - "oid": "J", - "type": "plain", - "storage": "memory", - "consumers": ["L", "M"] - }, - { - "oid": "SL_K", - "type": "socket", - "port": 1115, - "reuse_addr": true, - "outputs": ["K"] - }, - { - "oid": "K", - "type": "plain", - "storage": "memory", - "consumers": ["M"] - }, - { - "oid": "L", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["N", "O"] - }, - { - "oid": "M", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["P"] - }, - { - "oid": "N", - "type": "plain", - "storage": "memory", - "consumers": ["Q"] - }, - { - "oid": "O", - "type": "plain", - "storage": "memory", - "consumers": ["R"] - }, - { - "oid": "P", - "type": "plain", - "storage": "memory", - "consumers": ["R"] - }, - { - "oid": "Q", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["S"] - }, - { - "oid": "R", - "type": "app", - "app": "dlg.apps.simple.SleepAndCopyApp", - "outputs": ["T"] - }, - { - "oid": "S", - "type": "plain", - "storage": "memory" - }, - { - "oid": "T", - "type": "plain", - "storage": "memory" - } + { + "oid": "SL_A", + "type": "socket", + "port": 1111, + "reuse_addr": true, + "outputs": ["A"] + }, + { + "oid": "SL_B", + "type": "socket", + "port": 1112, + "reuse_addr": true, + "outputs": ["B"] + }, + { + "oid": "SL_C", + "type": "socket", + "port": 1113, + "reuse_addr": true, + "outputs": ["C"] + }, + { + "oid": "SL_D", + "type": "socket", + "port": 1114, + "reuse_addr": true, + "outputs": ["D"] + }, + { + "oid": "A", + "type": "plain", + "storage": "memory", + "consumers": ["E"] + }, + { + "oid": "B", + "type": "plain", + "storage": "memory", + "consumers": ["I"] + }, + { + "oid": "C", + "type": "plain", + "storage": "memory", + "consumers": ["F"] + }, + { + "oid": "D", + "type": "plain", + "storage": "memory", + "consumers": ["F"] + }, + { + "oid": "E", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["G"] + }, + { + "oid": "F", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["H"] + }, + { + "oid": "G", + "type": "plain", + "storage": "memory", + "consumers": ["I"] + }, + { + "oid": "H", + "type": "plain", + "storage": "memory", + "consumers": ["I"] + }, + { + "oid": "I", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["J"] + }, + { + "oid": "J", + "type": "plain", + "storage": "memory", + "consumers": ["L", "M"] + }, + { + "oid": "SL_K", + "type": "socket", + "port": 1115, + "reuse_addr": true, + "outputs": ["K"] + }, + { + "oid": "K", + "type": "plain", + "storage": "memory", + "consumers": ["M"] + }, + { + "oid": "L", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["N", "O"] + }, + { + "oid": "M", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["P"] + }, + { + "oid": "N", + "type": "plain", + "storage": "memory", + "consumers": ["Q"] + }, + { + "oid": "O", + "type": "plain", + "storage": "memory", + "consumers": ["R"] + }, + { + "oid": "P", + "type": "plain", + "storage": "memory", + "consumers": ["R"] + }, + { + "oid": "Q", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["S"] + }, + { + "oid": "R", + "type": "app", + "app": "dlg.apps.simple.SleepAndCopyApp", + "outputs": ["T"] + }, + { + "oid": "S", + "type": "plain", + "storage": "memory" + }, + { + "oid": "T", + "type": "plain", + "storage": "memory" + } ] \ No newline at end of file diff --git a/daliuge-runtime/test/integrate/__init__.py b/daliuge-runtime/test/integrate/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/integrate/__init__.py +++ b/daliuge-runtime/test/integrate/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/integrate/chiles/__init__.py b/daliuge-runtime/test/integrate/chiles/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/integrate/chiles/__init__.py +++ b/daliuge-runtime/test/integrate/chiles/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/integrate/chiles/chilesdo.py b/daliuge-runtime/test/integrate/chiles/chilesdo.py index 802c57faa..54b8faaae 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdo.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdo.py @@ -22,22 +22,20 @@ import logging import threading -from six.moves import queue as Queue # @UnresolvedImport - from dlg.drop import BarrierAppDROP - +from six.moves import queue as Queue # @UnresolvedImport logger = logging.getLogger(__name__) + class SourceFlux(BarrierAppDROP): def initialize(self, **kwargs): - + super(SourceFlux, self).initialize(**kwargs) self.casapy_path = self._getArg(kwargs, 'casapy_path', None) self.timeout = self._getArg(kwargs, 'timeout', 180) - def run(self): inp = self.inputs[0] @@ -47,7 +45,7 @@ def run(self): logger.info('Calculating source flux on %s.image' % (inp.path)) import drivecasa - casa = drivecasa.Casapy(casa_dir = self.casapy_path, timeout = self.timeout) + casa = drivecasa.Casapy(casa_dir=self.casapy_path, timeout=self.timeout) casa.run_script(['ia.open("'"%s"'")' % (inp.path + '.image')]) casa.run_script(['flux = ia.pixelvalue([128,128,0,179])["'"value"'"]["'"value"'"]']) casaout, _ = casa.run_script(['print flux']) @@ -65,37 +63,36 @@ def initialize(self, **kwargs): super(Clean, self).initialize(**kwargs) self.timeout = self._getArg(kwargs, 'timeout', 3600) - self.casapy_path = self._getArg(kwargs, 'casapy_path', None) + self.casapy_path = self._getArg(kwargs, 'casapy_path', None) self.clean_args = { - 'field': str(self._getArg(kwargs, 'field', None)), - 'mode': str(self._getArg(kwargs, 'mode', None)), - 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), - 'nchan': self._getArg(kwargs, 'nchan', None), - 'start': str(self._getArg(kwargs, 'start', None)), - 'width': str(self._getArg(kwargs, 'width', None)), - 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), - 'gain': self._getArg(kwargs, 'gain', None), - 'imsize': self._getArg(kwargs, 'imsize', None), - 'cell': [str(x) for x in self._getArg(kwargs, 'cell', [])], - 'phasecenter': str(self._getArg(kwargs, 'phasecenter', None)), - 'weighting': str(self._getArg(kwargs, 'weighting', None)), - 'usescratch': False } - + 'field': str(self._getArg(kwargs, 'field', None)), + 'mode': str(self._getArg(kwargs, 'mode', None)), + 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), + 'nchan': self._getArg(kwargs, 'nchan', None), + 'start': str(self._getArg(kwargs, 'start', None)), + 'width': str(self._getArg(kwargs, 'width', None)), + 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), + 'gain': self._getArg(kwargs, 'gain', None), + 'imsize': self._getArg(kwargs, 'imsize', None), + 'cell': [str(x) for x in self._getArg(kwargs, 'cell', [])], + 'phasecenter': str(self._getArg(kwargs, 'phasecenter', None)), + 'weighting': str(self._getArg(kwargs, 'weighting', None)), + 'usescratch': False} def invoke_clean(self, q, vis, outcube): import drivecasa try: script = [] - casa = drivecasa.Casapy(casa_dir = self.casapy_path, timeout = self.timeout) + casa = drivecasa.Casapy(casa_dir=self.casapy_path, timeout=self.timeout) drivecasa.commands.clean(script, - vis_paths = vis, - out_path = outcube, - niter = 0, - threshold_in_jy = 0, - other_clean_args = self.clean_args, - overwrite = True) + vis_paths=vis, + out_path=outcube, + niter=0, + threshold_in_jy=0, + other_clean_args=self.clean_args, + overwrite=True) casa.run_script(script) q.put(0) @@ -103,7 +100,6 @@ def invoke_clean(self, q, vis, outcube): q.put(-1) raise - def run(self): inp = self.inputs @@ -115,7 +111,7 @@ def run(self): logger.info("Cleaning %r" % (vis)) q = Queue.Queue() - t = threading.Thread(target = self.invoke_clean, args = (q, vis, out.path)) + t = threading.Thread(target=self.invoke_clean, args=(q, vis, out.path)) t.start() t.join() @@ -134,29 +130,28 @@ def initialize(self, **kwargs): self.casapy_path = self._getArg(kwargs, 'casapy_path', False) self.transform_args = { - 'regridms': self._getArg(kwargs, 'regridms', None), - 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), - 'mode': str(self._getArg(kwargs, 'mode', None)), - 'nchan': self._getArg(kwargs, 'nchan', None), - 'outframe': str(self._getArg(kwargs, 'outframe', None)), - 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), - 'veltype': 'radio', - 'start': str(self._getArg(kwargs, 'start', None)), - 'width': str(self._getArg(kwargs, 'width', None)), - 'spw': '', - 'combinespws': True, - 'nspw': 1, - 'createmms': False, - 'datacolumn': 'data' } - + 'regridms': self._getArg(kwargs, 'regridms', None), + 'restfreq': str(self._getArg(kwargs, 'restfreq', None)), + 'mode': str(self._getArg(kwargs, 'mode', None)), + 'nchan': self._getArg(kwargs, 'nchan', None), + 'outframe': str(self._getArg(kwargs, 'outframe', None)), + 'interpolation': str(self._getArg(kwargs, 'interpolation', None)), + 'veltype': 'radio', + 'start': str(self._getArg(kwargs, 'start', None)), + 'width': str(self._getArg(kwargs, 'width', None)), + 'spw': '', + 'combinespws': True, + 'nspw': 1, + 'createmms': False, + 'datacolumn': 'data'} def invoke_split(self, q, infile, outdir): import drivecasa try: script = [] - casa = drivecasa.Casapy(casa_dir = self.casapy_path, timeout = self.timeout) - drivecasa.commands.mstransform(script, infile, outdir, self.transform_args, overwrite = True) + casa = drivecasa.Casapy(casa_dir=self.casapy_path, timeout=self.timeout) + drivecasa.commands.mstransform(script, infile, outdir, self.transform_args, overwrite=True) casa.run_script(script) q.put(0) @@ -164,7 +159,6 @@ def invoke_split(self, q, infile, outdir): q.put(-1) raise - def run(self): inp = self.inputs[0] out = self.outputs[0] @@ -173,10 +167,10 @@ def run(self): logger.info('Splitting %s' % (inp.path)) q = Queue.Queue() - t = threading.Thread(target = self.invoke_split, args = (q, inp.path, out.path)) + t = threading.Thread(target=self.invoke_split, args=(q, inp.path, out.path)) t.start() t.join() - + result = q.get() if result != 0: raise Exception('Error splitting') diff --git a/daliuge-runtime/test/integrate/chiles/chilesdoapp.py b/daliuge-runtime/test/integrate/chiles/chilesdoapp.py index 510f2bd3f..e19762428 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdoapp.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdoapp.py @@ -21,8 +21,8 @@ # import os import sys -import uuid import threading +import uuid from dlg.drop import DirectoryContainer, InMemoryDROP @@ -36,11 +36,11 @@ CUBE_NAME = 'cube1408~1412' VIS = [ - (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', VIS_OUT + '20131025_951_4/'), - (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', VIS_OUT + '20131031_951_4/'), - (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', VIS_OUT + '20131121_946_6/'), - (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', VIS_OUT + '20140105_946_6/') - ] + (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', VIS_OUT + '20131025_951_4/'), + (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', VIS_OUT + '20131031_951_4/'), + (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', VIS_OUT + '20131121_946_6/'), + (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', VIS_OUT + '20140105_946_6/') +] class Barrier(object): @@ -51,7 +51,7 @@ def __init__(self, drop): def dropCompleted(self, drop, state): self._evt.set() - def wait(self, timeout = None): + def wait(self, timeout=None): return self._evt.wait(timeout) @@ -62,47 +62,47 @@ def wait(self, timeout = None): flux_out = InMemoryDROP(uuid.uuid1(), uuid.uuid1()) - flux = SourceFlux(uuid.uuid1(), uuid.uuid1(), casapy_path = CASAPY) + flux = SourceFlux(uuid.uuid1(), uuid.uuid1(), casapy_path=CASAPY) cl = Clean(uuid.uuid1(), - uuid.uuid1(), - field = 'deepfield', - mode = 'frequency', - restfreq = '1420.405752MHz', - nchan = -1, - start = '', - width = '', - interpolation = 'nearest', - gain = 0.1, - imsize = [256], - cell = ['1.0arcsec'], - phasecenter = '10h01m53.9,+02d24m52s', - weighting = 'natural', - casapy_path = CASAPY) - - image_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname = CUBE_OUT + CUBE_NAME, check_exists = False) + uuid.uuid1(), + field='deepfield', + mode='frequency', + restfreq='1420.405752MHz', + nchan=-1, + start='', + width='', + interpolation='nearest', + gain=0.1, + imsize=[256], + cell=['1.0arcsec'], + phasecenter='10h01m53.9,+02d24m52s', + weighting='natural', + casapy_path=CASAPY) + + image_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname=CUBE_OUT + CUBE_NAME, check_exists=False) cl.addOutput(image_out) flux.addInput(image_out) flux.addOutput(flux_out) for v in VIS: - vis_in = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname = v[0]) - split_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname = v[1], check_exists = False) + vis_in = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname=v[0]) + split_out = DirectoryContainer(uuid.uuid1(), uuid.uuid1(), dirname=v[1], check_exists=False) vis_in_a.append(vis_in) sp = Split(uuid.uuid1(), - uuid.uuid1(), - regridms = True, - restfreq = '1420.405752MHz', - mode = 'frequency', - nchan = 256, - outframe = 'lsrk', - interpolation = 'linear', - start = '1408 MHz', - width = '1412 kHz', - copy = False, - casapy_path = CASAPY) + uuid.uuid1(), + regridms=True, + restfreq='1420.405752MHz', + mode='frequency', + nchan=256, + outframe='lsrk', + interpolation='linear', + start='1408 MHz', + width='1412 kHz', + copy=False, + casapy_path=CASAPY) sp.addInput(vis_in) sp.addOutput(split_out) @@ -121,6 +121,7 @@ def wait(self, timeout = None): except Exception as e: import traceback + traceback.print_exc() sys.exit(-1) diff --git a/daliuge-runtime/test/integrate/chiles/chilesdospec.py b/daliuge-runtime/test/integrate/chiles/chilesdospec.py index fe5707201..c2ac53898 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdospec.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdospec.py @@ -24,12 +24,11 @@ from dlg.drop import dropdict - # Directories and paths -CASAPY = '/home/ec2-user/casa-release-4.4.0-el6/' -INPUTS_DIR = '/home/ec2-user/data/input' +CASAPY = '/home/ec2-user/casa-release-4.4.0-el6/' +INPUTS_DIR = '/home/ec2-user/data/input' OUTPUTS_DIR = '/home/ec2-user/data/output' -KEY_PATH = '/home/ec2-user/.ssh/aws-sdp-sydney.pem' +KEY_PATH = '/home/ec2-user/.ssh/aws-sdp-sydney.pem' # Internal AWS IP addresses. ch05 does the Clean-ing ch01 = '172.31.4.12' @@ -40,45 +39,46 @@ # Per-visibility parameters and resulting cube name VIS = [ - ('20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', '20131025_951_4', ch01), - ('20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', '20140105_946_6', ch02), - ('20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', '20131031_951_4', ch03), - ('20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', '20131121_946_6', ch04) - ] + ('20131025_951_4_FINAL_PRODUCTS/20131025_951_4_calibrated_deepfield.ms', '20131025_951_4', ch01), + ('20140105_946_6_FINAL_PRODUCTS/20140105_946_6_calibrated_deepfield.ms', '20140105_946_6', ch02), + ('20131031_951_4_FINAL_PRODUCTS/20131031_951_4_calibrated_deepfield.ms', '20131031_951_4', ch03), + ('20131121_946_6_FINAL_PRODUCTS/20131121_946_6_calibrated_deepfield.ms', '20131121_946_6', ch04) +] CUBE_NAME = 'cube1408~1412' def fileSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'plain', 'storage':'file'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'plain', 'storage': 'file'}) dropSpec.update(kwargs) - return dropSpec + return dropSpec def directorySpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'container', 'container':'dlg.drop.DirectoryContainer'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'container', 'container': 'dlg.drop.DirectoryContainer'}) dropSpec.update(kwargs) - return dropSpec + return dropSpec def fluxSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'test.integrate.chiles.chilesdo.SourceFlux'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'test.integrate.chiles.chilesdo.SourceFlux'}) dropSpec.update(kwargs) - return dropSpec + return dropSpec def splitSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'test.integrate.chiles.chilesdo.Split'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'test.integrate.chiles.chilesdo.Split'}) dropSpec.update(kwargs) return dropSpec def scpSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'dlg.apps.scp.ScpApp'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'dlg.apps.scp.ScpApp'}) dropSpec.update(kwargs) return dropSpec + def cleanSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'app', 'app':'test.integrate.chiles.chilesdo.Clean'}) + dropSpec = dropdict({'oid': str(uid), 'type': 'app', 'app': 'test.integrate.chiles.chilesdo.Clean'}) dropSpec.update(kwargs) return dropSpec @@ -87,58 +87,58 @@ def cleanSpec(uid, **kwargs): droplist = [] - flux_out = fileSpec('Flux', node = ch05, dirname = os.path.join(OUTPUTS_DIR)) + flux_out = fileSpec('Flux', node=ch05, dirname=os.path.join(OUTPUTS_DIR)) droplist.append(flux_out) - flux = fluxSpec('FluxExtractor', casapy_path = CASAPY, node = ch05) + flux = fluxSpec('FluxExtractor', casapy_path=CASAPY, node=ch05) droplist.append(flux) cl = cleanSpec('Cleaning', - field = 'deepfield', - mode = 'frequency', - restfreq = '1420.405752MHz', - nchan = -1, - start = '', - width = '', - interpolation = 'nearest', - gain = 0.1, - imsize = [256], - cell = ['1.0arcsec'], - phasecenter = '10h01m53.9,+02d24m52s', - weighting = 'natural', - casapy_path = CASAPY, - node = ch05) + field='deepfield', + mode='frequency', + restfreq='1420.405752MHz', + nchan=-1, + start='', + width='', + interpolation='nearest', + gain=0.1, + imsize=[256], + cell=['1.0arcsec'], + phasecenter='10h01m53.9,+02d24m52s', + weighting='natural', + casapy_path=CASAPY, + node=ch05) droplist.append(cl) - image_out = directorySpec('CleanedImage', dirname = os.path.join(OUTPUTS_DIR, CUBE_NAME), check_exists = False, node = ch05) + image_out = directorySpec('CleanedImage', dirname=os.path.join(OUTPUTS_DIR, CUBE_NAME), check_exists=False, + node=ch05) droplist.append(image_out) cl.addOutput(image_out) flux.addInput(image_out) flux.addOutput(flux_out) for i, v in enumerate(VIS): - - visDir = os.path.join(INPUTS_DIR, v[0]) - splitOutDir = os.path.join(OUTPUTS_DIR, v[1]) + visDir = os.path.join(INPUTS_DIR, v[0]) + splitOutDir = os.path.join(OUTPUTS_DIR, v[1]) splitCopyDir = os.path.join(INPUTS_DIR, v[1]) - node = v[2] + node = v[2] # vis -> SPLIT -> out -> scp -> out - vis_in = directorySpec('vis%d' % (i), dirname = visDir, node = node) + vis_in = directorySpec('vis%d' % (i), dirname=visDir, node=node) sp = splitSpec('Splitting_%d' % (i), - regridms = True, - restfreq = '1420.405752MHz', - mode = 'frequency', - nchan = 256, - outframe = 'lsrk', - interpolation = 'linear', - start = '1408MHz', - width = '1412kHz', - casapy_path = CASAPY, - node = node) - split_out = directorySpec('SplitOutput_%d' %(i), dirname = splitOutDir, check_exists = False, node = node) - scp = scpSpec('Scp_%d' % (i), node = node, pkeyPath = KEY_PATH, timeout=3600) - scpOut = directorySpec('SplitOutput_%d_Copy' % (i), dirname = splitCopyDir, check_exists = False, node = ch05) + regridms=True, + restfreq='1420.405752MHz', + mode='frequency', + nchan=256, + outframe='lsrk', + interpolation='linear', + start='1408MHz', + width='1412kHz', + casapy_path=CASAPY, + node=node) + split_out = directorySpec('SplitOutput_%d' % (i), dirname=splitOutDir, check_exists=False, node=node) + scp = scpSpec('Scp_%d' % (i), node=node, pkeyPath=KEY_PATH, timeout=3600) + scpOut = directorySpec('SplitOutput_%d_Copy' % (i), dirname=splitCopyDir, check_exists=False, node=ch05) # Establish relationships sp.addInput(vis_in) @@ -154,4 +154,4 @@ def cleanSpec(uid, **kwargs): droplist.append(scp) droplist.append(scpOut) - print(json.dumps(droplist, indent=2)) \ No newline at end of file + print(json.dumps(droplist, indent=2)) diff --git a/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py b/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py index 39dbbbbb0..61908c10a 100755 --- a/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py +++ b/daliuge-runtime/test/integrate/chiles/chilesdospec_docker.py @@ -1,4 +1,4 @@ - # +# # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) @@ -31,7 +31,6 @@ from dlg.drop import dropdict from dlg.manager.client import DataIslandManagerClient - LOCAL_FILES = os.path.dirname(os.path.realpath(__file__)) CASAPY = '/opt/casa-release-4.4.0-el6/' VIS_ROOT = '/opt/data/chiles/input/' @@ -41,45 +40,54 @@ # Internal AWS IP addresses. ch05 does the Clean-ing VIS = [ - (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS', VIS_OUT + '20131025_951_4/'), - (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS', VIS_OUT + '20131031_951_4/'), - (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS', VIS_OUT + '20131121_946_6/'), - (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS', VIS_OUT + '20140105_946_6/') - ] + (VIS_ROOT + '20131025_951_4_FINAL_PRODUCTS', VIS_OUT + '20131025_951_4/'), + (VIS_ROOT + '20131031_951_4_FINAL_PRODUCTS', VIS_OUT + '20131031_951_4/'), + (VIS_ROOT + '20131121_946_6_FINAL_PRODUCTS', VIS_OUT + '20131121_946_6/'), + (VIS_ROOT + '20140105_946_6_FINAL_PRODUCTS', VIS_OUT + '20140105_946_6/') +] + def fileDropSpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'plain', 'storage':'file', 'node': 'localhost', 'island': 'localhost'}) + dropSpec = dropdict( + {'oid': str(uid), 'type': 'plain', 'storage': 'file', 'node': 'localhost', 'island': 'localhost'}) dropSpec.update(kwargs) return dropSpec + def directorySpec(uid, **kwargs): - dropSpec = dropdict({'oid':str(uid), 'type':'container', 'container':'dlg.drop.DirectoryContainer', 'node': 'localhost', 'island': 'localhost'}) + dropSpec = dropdict( + {'oid': str(uid), 'type': 'container', 'container': 'dlg.drop.DirectoryContainer', 'node': 'localhost', + 'island': 'localhost'}) dropSpec.update(kwargs) return dropSpec + def casapyDockerAppSpec(uid, script): cmd = 'cd; ' + os.path.join(CASAPY, 'casapy') + ' --colors=NoColor --nologger --nogui -c "%s"' % (script) - return dropdict({'oid':str(uid), 'type':'app', 'app':'dlg.apps.dockerapp.DockerApp', - 'image':'dfms/casapy_centos7_dfms:0.1', - 'command':cmd, 'user': 'dfms', - 'node': 'localhost', 'island': 'localhost'}) + return dropdict({'oid': str(uid), 'type': 'app', 'app': 'dlg.apps.dockerapp.DockerApp', + 'image': 'dfms/casapy_centos7_dfms:0.1', + 'command': cmd, 'user': 'dfms', + 'node': 'localhost', 'island': 'localhost'}) + def fluxSpec(uid, **kwargs): - script = "ia.open('%i0.image');" + script = "ia.open('%i0.image');" script += "flux = ia.pixelvalue([128,128,0,179])['value']['value'];" script += "f = open('%o0','w'); f.write(str(flux)); f.close()" return casapyDockerAppSpec(uid, script) + def splitSpec(uid, **kwargs): transform_args = kwargs.copy() transform_args.update({ 'vis': "%i0", 'outputvis': "%o0" }) - script = "import shutil; shutil.rmtree('%o0', True); " + script = "import shutil; shutil.rmtree('%o0', True); " script += "mstransform(**{})".format(repr(transform_args)) return casapyDockerAppSpec(uid, script) + def cleanSpec(uid, **kwargs): clean_args = kwargs.copy() clean_args.update({ @@ -87,10 +95,10 @@ def cleanSpec(uid, **kwargs): 'mask': '', 'modelimage': '', 'imagename': '%o0', - 'vis': ['%i0','%i1','%i2','%i3'], + 'vis': ['%i0', '%i1', '%i2', '%i3'], 'threshold': '0Jy', }) - script = "import shutil; shutil.rmtree('%o0', True); " + script = "import shutil; shutil.rmtree('%o0', True); " script += "clean(**{})".format(repr(clean_args)) return casapyDockerAppSpec(uid, script) @@ -101,52 +109,52 @@ def cleanSpec(uid, **kwargs): sessionId = 'Chiles-Docker-%s' % (time.time(),) droplist = [] - flux_out = fileDropSpec('Flux', dirname = VIS_OUT) + flux_out = fileDropSpec('Flux', dirname=VIS_OUT) droplist.append(flux_out) flux = fluxSpec('FluxExtractor') droplist.append(flux) cl = cleanSpec('Cleaning', - field = 'deepfield', - mode = 'frequency', - restfreq = '1420.405752MHz', - nchan = -1, - start = '', - width = '', - interpolation = 'nearest', - gain = 0.1, - imsize = [256], - cell = ['1.0arcsec'], - phasecenter = '10h01m53.9,+02d24m52s', - weighting = 'natural', - usescratch = False) + field='deepfield', + mode='frequency', + restfreq='1420.405752MHz', + nchan=-1, + start='', + width='', + interpolation='nearest', + gain=0.1, + imsize=[256], + cell=['1.0arcsec'], + phasecenter='10h01m53.9,+02d24m52s', + weighting='natural', + usescratch=False) droplist.append(cl) - image_out = directorySpec('CleanedImage', dirname = CUBE_OUT + CUBE_NAME, check_exists = False) + image_out = directorySpec('CleanedImage', dirname=CUBE_OUT + CUBE_NAME, check_exists=False) droplist.append(image_out) cl.addOutput(image_out) flux.addInput(image_out) flux.addOutput(flux_out) for i, v in enumerate(VIS): - vis_in = directorySpec('vis%d' % (i), dirname = v[0], check_exists = False) - split_out = directorySpec('SplitOutput_%d' %(i), dirname = v[1], check_exists = False) + vis_in = directorySpec('vis%d' % (i), dirname=v[0], check_exists=False) + split_out = directorySpec('SplitOutput_%d' % (i), dirname=v[1], check_exists=False) sp = splitSpec('Splitting_%d' % (i), - regridms = True, - restfreq = '1420.405752MHz', - mode = 'frequency', - nchan = 256, - outframe = 'lsrk', - interpolation = 'linear', - start = '1408MHz', - width = '1412kHz', - veltype = 'radio', - spw = '', - combinespws = True, - nspw = 1, - createmms = False, - datacolumn = 'data' - ) + regridms=True, + restfreq='1420.405752MHz', + mode='frequency', + nchan=256, + outframe='lsrk', + interpolation='linear', + start='1408MHz', + width='1412kHz', + veltype='radio', + spw='', + combinespws=True, + nspw=1, + createmms=False, + datacolumn='data' + ) sp.addInput(vis_in) sp.addOutput(split_out) cl.addInput(split_out) @@ -162,6 +170,7 @@ def cleanSpec(uid, **kwargs): except Exception as e: import traceback + traceback.print_exc() sys.exit(-1) diff --git a/daliuge-runtime/test/integrate/example_split.py b/daliuge-runtime/test/integrate/example_split.py index b7bca136e..ed43883a6 100644 --- a/daliuge-runtime/test/integrate/example_split.py +++ b/daliuge-runtime/test/integrate/example_split.py @@ -5,25 +5,26 @@ To run it standalone, change the directories, which are now hardcoded """ -from sys import argv -import sys, os, datetime, time +import datetime +import os +import time if __name__ == '__main__': - + dt = datetime.datetime.now() timestr = dt.strftime('%Y-%m-%dT%H-%M-%S') - + ms_dir = '/scratch/partner1024/chiles/final_products/20131122_941_6_FINAL_PRODUCTS/13B-266.sb27261805.eb28549602.56618.334173599535_calibrated_deepfield.ms' - #ms_dir = '/scratch/jason/13B-266.sb28624226.eb28625769.56669.43262586805_calibrated_deepfield_adios.ms' + # ms_dir = '/scratch/jason/13B-266.sb28624226.eb28625769.56669.43262586805_calibrated_deepfield_adios.ms' log_dir = '/home/cwu/chiles/processing' - #log_dir = '/scratch/jason/tmp' + # log_dir = '/scratch/jason/tmp' output_vis = '/scratch/partner1024/chiles/split_vis/{0}'.format(timestr) - #output_vis = '/scratch/jason/tmp/split_vis/{0}'.format(timestr) + # output_vis = '/scratch/jason/tmp/split_vis/{0}'.format(timestr) log_file = '{0}/{1}_split_time.log'.format(log_dir, timestr) - + os.mkdir(output_vis) gap = 4 - + st = time.time() for i in range(1): mstransform(vis=ms_dir, @@ -42,12 +43,12 @@ nspw=1, createmms=False, datacolumn="data") - + tt = time.time() - st - f = open(log_file,'w') + f = open(log_file, 'w') f.write('total split time = {0} seconds'.format(tt)) f.close() - + """ mstransform(vis=/scratch/partner1024/chiles/final_products//20131025_951_4_FINAL_PRODUCTS/13B-266.sb27248272.eb28094627.56590.41308579861_calibrated_deepfield.ms, outputvis=/scratch/partner1024/chiles/split_vis/12345/20131025_951_4/vis_1024~1028, diff --git a/daliuge-runtime/test/integrate/freq_split.py b/daliuge-runtime/test/integrate/freq_split.py index 89c1b1d07..3f035bda9 100644 --- a/daliuge-runtime/test/integrate/freq_split.py +++ b/daliuge-runtime/test/integrate/freq_split.py @@ -5,10 +5,14 @@ chen.wu@icrar.org """ -import sys, os, datetime, subprocess, re, logging -from string import Template +import datetime +import logging +import os +import re +import subprocess +import sys from optparse import OptionParser - +from string import Template logger = logging.getLogger(__name__) @@ -31,6 +35,7 @@ datacolumn="data") """ + def freq_map(low_req, hi_req, *args): """ Ported from Chiles AWS code by R.Dodson (richard.dodson@icrar.org) @@ -88,7 +93,6 @@ def freq_map(low_req, hi_req, *args): '14~14' """ - # SpwID Name #Chans Frame Ch0(MHz) Ch0(MHz) Ch0(MHz)ChanWid(kHz) TotBW(kHz) BBC Num Corrs # 0 EVLA_L#A0C0#0 2048 TOPO 941.000 946.000 951.000 15.625 32000.0 12 RR LL # 1 EVLA_L#A0C0#1 2048 TOPO 973.000 978.000 983.000 15.625 32000.0 12 RR LL @@ -106,22 +110,22 @@ def freq_map(low_req, hi_req, *args): # 13 EVLA_L#A0C0#13 2048 TOPO 1357.000 1362.000 1367.000 15.625 32000.0 12 RR LL # 14 EVLA_L#A0C0#14 2048 TOPO 1389.000 1394.000 1399.000 15.625 32000.0 12 RR LL - f_tab = [[941.00, 946.00, 951.00], - [973.00, 978.00, 983.00], - [1005.00, 1010.00, 1015.00], - [1037.00, 1042.00, 1047.00], - [1069.00, 1074.00, 1079.00], - [1101.00, 1106.00, 1111.00], - [1133.00, 1138.00, 1143.00], - [1165.00, 1170.00, 1175.00], - [1197.00, 1202.00, 1207.00], - [1229.00, 1234.00, 1239.00], - [1261.00, 1266.00, 1271.00], - [1293.00, 1298.00, 1303.00], - [1325.00, 1330.00, 1335.00], - [1357.00, 1362.00, 1367.00], - [1389.00, 1394.00, 1399.00], - [1421.00, 1426.00, 1431.00]] + f_tab = [[941.00, 946.00, 951.00], + [973.00, 978.00, 983.00], + [1005.00, 1010.00, 1015.00], + [1037.00, 1042.00, 1047.00], + [1069.00, 1074.00, 1079.00], + [1101.00, 1106.00, 1111.00], + [1133.00, 1138.00, 1143.00], + [1165.00, 1170.00, 1175.00], + [1197.00, 1202.00, 1207.00], + [1229.00, 1234.00, 1239.00], + [1261.00, 1266.00, 1271.00], + [1293.00, 1298.00, 1303.00], + [1325.00, 1330.00, 1335.00], + [1357.00, 1362.00, 1367.00], + [1389.00, 1394.00, 1399.00], + [1421.00, 1426.00, 1431.00]] if_low = 0 if_hi = 14 @@ -129,31 +133,31 @@ def freq_map(low_req, hi_req, *args): ifn_hi = 2 if (args): - if (args[0] == 941): - ifn_low = 0 - ifn_hi = 0 - elif (args[0] == 946): - ifn_low = 1 - ifn_hi = 1 - elif (args[0] == 951): - ifn_low = 2 - ifn_hi = 2 + if (args[0] == 941): + ifn_low = 0 + ifn_hi = 0 + elif (args[0] == 946): + ifn_low = 1 + ifn_hi = 1 + elif (args[0] == 951): + ifn_low = 2 + ifn_hi = 2 for nif_low in range(0, 16): f = f_tab[nif_low] - #print nif_low,f + # print nif_low,f if ((f[ifn_low]) > ((low_req) - 2)): if_low = nif_low - 1 - #print 'Using '+str(if_low)+' for lower SPW edge' + # print 'Using '+str(if_low)+' for lower SPW edge' nif_low = 14 break for nif_hi in range(0, 16): f = f_tab[nif_hi] - #print nif_hi,f + # print nif_hi,f if (f[ifn_hi] > (hi_req + 2)): if_hi = nif_hi - 1 - #print 'Using '+str(if_hi)+' for upper SPW edge' + # print 'Using '+str(if_hi)+' for upper SPW edge' nif_hi = 14 break @@ -166,6 +170,7 @@ def freq_map(low_req, hi_req, *args): spw = "{0}~{1}".format(if_low, if_hi) return spw + def launch_mstransform(infile, outfile, no_chan, freq1, width_freq, spw_range, gen_script_dir, casa_bin_dir): @@ -198,6 +203,7 @@ def launch_mstransform(infile, outfile, no_chan, casa_process = subprocess.Popen(casapy_cmd.split()) return casa_process + def do_split(infile, outdir, min_freq, max_freq, step_freq, width_freq, work_dir, casa_bin_dir): """ @@ -222,7 +228,7 @@ def do_split(infile, outdir, min_freq, max_freq, freq2 = min_freq + step_freq bottom_edge = re.search('_[0-9]{3}_', infile) if (bottom_edge): - #e.g. 20131122_941_6_FINAL_PRODUCTS --> 941 + # e.g. 20131122_941_6_FINAL_PRODUCTS --> 941 bedge = bottom_edge.group(0) bedge = int(bedge[1:4]) else: @@ -231,7 +237,7 @@ def do_split(infile, outdir, min_freq, max_freq, casa_proc_list = [] gen_script_dir = "{0}/{1}".format(work_dir, timestr) - for i in range(steps): # potentially parallel + for i in range(steps): # potentially parallel spw_range = freq_map(freq1, freq2, bedge) if (rem and (i == steps - 1)): freq_range = "{0}~{1}".format(min_freq + i * step_freq, max_freq) @@ -251,7 +257,8 @@ def do_split(infile, outdir, min_freq, max_freq, freq2 += step_freq for csp in casa_proc_list: - csp.wait() # join all sub-processes before exiting + csp.wait() # join all sub-processes before exiting + if __name__ == "__main__": """ @@ -280,9 +287,9 @@ def do_split(infile, outdir, min_freq, max_freq, (options, args) = parser.parse_args() if (None == options.infile or - None == options.outdir or - None == options.work_dir or - None == options.casa_bin_dir): + None == options.outdir or + None == options.work_dir or + None == options.casa_bin_dir): parser.print_help() sys.exit(1) diff --git a/daliuge-runtime/test/integrate/msconverter/ms_converter.py b/daliuge-runtime/test/integrate/msconverter/ms_converter.py index f7682a616..c5d8c9547 100644 --- a/daliuge-runtime/test/integrate/msconverter/ms_converter.py +++ b/daliuge-runtime/test/integrate/msconverter/ms_converter.py @@ -1,19 +1,25 @@ import pyrap.tables as pt -oldtable='/scratch/jason/chiles_original.ms' -newtable='/scratch/jason/chiles_adios.ms' +oldtable = '/scratch/jason/chiles_original.ms' +newtable = '/scratch/jason/chiles_adios.ms' t = pt.table(oldtable) dmdef = t.getdminfo() -print 'Original Table: **************************' +print +'Original Table: **************************' for i in dmdef: - print i - print dmdef[i] + print + i + print + dmdef[i] dmdef['*17']['TYPE'] = 'AdiosStMan' -print 'New Table: ***********************' +print +'New Table: ***********************' for i in dmdef: - print i - print dmdef[i] + print + i + print + dmdef[i] -t.copy (newtable, True, True, dminfo=dmdef) +t.copy(newtable, True, True, dminfo=dmdef) diff --git a/daliuge-runtime/test/lifecycle/__init__.py b/daliuge-runtime/test/lifecycle/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/lifecycle/__init__.py +++ b/daliuge-runtime/test/lifecycle/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/lifecycle/test_dlm.py b/daliuge-runtime/test/lifecycle/test_dlm.py index 624cbf8e4..47bad1f9a 100644 --- a/daliuge-runtime/test/lifecycle/test_dlm.py +++ b/daliuge-runtime/test/lifecycle/test_dlm.py @@ -77,7 +77,6 @@ def test_dropCompleteTriggersReplication(self): self.assertEqual(1, len(manager.getDropUids(drop))) def test_expiringNormalDrop(self): - with dlm.DataLifecycleManager(checkPeriod=0.5) as manager: drop = FileDROP('oid:A', 'uid:A1', expectedSize=1, lifespan=0.5) manager.addDrop(drop) @@ -90,7 +89,6 @@ def test_expiringNormalDrop(self): self.assertEqual(DROPStates.EXPIRED, drop.status) - def test_lostDrop(self): with dlm.DataLifecycleManager(checkPeriod=0.5) as manager: drop = FileDROP('oid:A', 'uid:A1', expectedSize=1, lifespan=10, precious=False) @@ -150,7 +148,7 @@ def test_expireAfterUse(self): manager.addDrop(c) # Make sure all consumers are done - with DROPWaiterCtx(self, [c,d], 1): + with DROPWaiterCtx(self, [c, d], 1): a.setCompleted() b.setCompleted() @@ -163,5 +161,6 @@ def test_expireAfterUse(self): self.assertTrue(b.exists()) b.delete() + if __name__ == '__main__': - unittest.main() \ No newline at end of file + unittest.main() diff --git a/daliuge-runtime/test/lifecycle/test_registry.py b/daliuge-runtime/test/lifecycle/test_registry.py index 62fe849c2..35d3f193f 100644 --- a/daliuge-runtime/test/lifecycle/test_registry.py +++ b/daliuge-runtime/test/lifecycle/test_registry.py @@ -26,9 +26,9 @@ from dlg.drop import InMemoryDROP from dlg.lifecycle.registry import RDBMSRegistry - DBFILE = 'testing_dlm.db' + class TestRDBMSRegistry(unittest.TestCase): def setUp(self): @@ -36,8 +36,10 @@ def setUp(self): conn = sqlite3.connect(DBFILE) # @UndefinedVariable cur = conn.cursor() cur.execute('CREATE TABLE dlg_drop(oid varchar(64) PRIMARY KEY, phase integer)'); - cur.execute('CREATE TABLE dlg_dropinstance(uid varchar(64) PRIMARY KEY, oid varchar(64), dataRef varchar(128))'); - cur.execute('CREATE TABLE dlg_dropaccesstime(oid varchar(64), accessTime TIMESTAMP, PRIMARY KEY (oid, accessTime))'); + cur.execute( + 'CREATE TABLE dlg_dropinstance(uid varchar(64) PRIMARY KEY, oid varchar(64), dataRef varchar(128))'); + cur.execute( + 'CREATE TABLE dlg_dropaccesstime(oid varchar(64), accessTime TIMESTAMP, PRIMARY KEY (oid, accessTime))'); conn.close() def tearDown(self): @@ -58,7 +60,6 @@ def test_addDrop(self): conn.close() def test_addDropInstances(self): - a1 = InMemoryDROP('a', 'a1') a2 = InMemoryDROP('a', 'a2') registry = RDBMSRegistry('sqlite3', DBFILE) @@ -90,7 +91,6 @@ def test_addDropInstances(self): conn.close() def test_dropAccess(self): - a1 = InMemoryDROP('a', 'a1') registry = RDBMSRegistry('sqlite3', DBFILE) registry.addDrop(a1) @@ -98,4 +98,4 @@ def test_dropAccess(self): self.assertEqual(-1, registry.getLastAccess('a')) registry.recordNewAccess('a') - self.assertNotEqual(-1, registry.getLastAccess('a')) \ No newline at end of file + self.assertNotEqual(-1, registry.getLastAccess('a')) diff --git a/daliuge-runtime/test/manager/__init__.py b/daliuge-runtime/test/manager/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-runtime/test/manager/__init__.py +++ b/daliuge-runtime/test/manager/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-runtime/test/manager/test_daemon.py b/daliuge-runtime/test/manager/test_daemon.py index 1c2280463..7deea912d 100644 --- a/daliuge-runtime/test/manager/test_daemon.py +++ b/daliuge-runtime/test/manager/test_daemon.py @@ -24,13 +24,11 @@ import time import unittest -from six.moves import http_client as httplib # @UnresolvedImport - from dlg import utils, restutils from dlg.manager import constants from dlg.manager.client import MasterManagerClient from dlg.manager.proc_daemon import DlgDaemon - +from six.moves import http_client as httplib # @UnresolvedImport _TIMEOUT = 10 @@ -42,9 +40,11 @@ def create_daemon(self, *args, **kwargs): self._daemon = DlgDaemon(*args, **kwargs) if 'noNM' not in kwargs or not kwargs['noNM']: - self.assertTrue(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, _TIMEOUT), 'The NM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, _TIMEOUT), + 'The NM did not start successfully') if 'master' in kwargs and kwargs['master']: - self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), 'The MM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), + 'The MM did not start successfully') self._daemon_t = threading.Thread(target=lambda: self._daemon.start('localhost', 9000)) self._daemon_t.start() @@ -62,7 +62,7 @@ def create_daemon(self, *args, **kwargs): # To actually avoid this we need to do some actual HTTP talk, which will # ensure the server is actually serving requests, and therefore already # in the daemon's hand - #self.assertTrue(utils.portIsOpen('localhost', 9000, _TIMEOUT)) + # self.assertTrue(utils.portIsOpen('localhost', 9000, _TIMEOUT)) try: restutils.RestClient('localhost', 9000, 10)._GET('/anything') except restutils.RestClientException: @@ -74,7 +74,8 @@ def tearDown(self): self._daemon.stop(_TIMEOUT) self._daemon_t.join(_TIMEOUT) self.assertFalse(self._daemon_t.is_alive(), "Daemon running thread should have finished by now") - self.assertTrue(utils.portIsClosed('localhost', 9000, _TIMEOUT), 'DALiuGE Daemon REST interface should be off') + self.assertTrue(utils.portIsClosed('localhost', 9000, _TIMEOUT), + 'DALiuGE Daemon REST interface should be off') unittest.TestCase.tearDown(self) def test_nm_starts(self): @@ -88,8 +89,10 @@ def test_mm_starts(self): def test_nothing_starts(self): # Nothing should start now self.create_daemon(master=False, noNM=True, disable_zeroconf=True) - self.assertFalse(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, 0), 'NM started but it should not have') - self.assertFalse(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, 0), 'NM started but it should not have') + self.assertFalse(utils.portIsOpen('localhost', constants.NODE_DEFAULT_REST_PORT, 0), + 'NM started but it should not have') + self.assertFalse(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, 0), + 'NM started but it should not have') def test_start_master_via_rest(self): @@ -97,7 +100,8 @@ def test_start_master_via_rest(self): # Check that the master starts self._start('master', httplib.OK) - self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), 'The MM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.MASTER_DEFAULT_REST_PORT, _TIMEOUT), + 'The MM did not start successfully') def test_zeroconf_discovery(self): @@ -123,7 +127,8 @@ def test_start_dataisland_via_rest(self): # Check that the DataIsland starts with the given nodes self._start('dataisland', httplib.OK, {'nodes': nodes}) - self.assertTrue(utils.portIsOpen('localhost', constants.ISLAND_DEFAULT_REST_PORT, _TIMEOUT), 'The DIM did not start successfully') + self.assertTrue(utils.portIsOpen('localhost', constants.ISLAND_DEFAULT_REST_PORT, _TIMEOUT), + 'The DIM did not start successfully') def _start(self, manager_name, expected_code, payload=None): conn = httplib.HTTPConnection('localhost', 9000) @@ -144,4 +149,4 @@ def _get_nodes_from_master(self, timeout): nodes = mc.nodes() if nodes: return nodes - time.sleep(0.1) \ No newline at end of file + time.sleep(0.1) diff --git a/daliuge-runtime/test/manager/test_dim.py b/daliuge-runtime/test/manager/test_dim.py index 1195de9bb..1c4531657 100644 --- a/daliuge-runtime/test/manager/test_dim.py +++ b/daliuge-runtime/test/manager/test_dim.py @@ -26,7 +26,6 @@ import unittest import pkg_resources - from dlg import droputils from dlg import utils from dlg.common import tool @@ -36,9 +35,9 @@ from dlg.testutils import ManagerStarter from test.manager import testutils - hostname = 'localhost' + class LocalDimStarter(ManagerStarter): def setUp(self): @@ -52,12 +51,14 @@ def tearDown(self): self.dim.shutdown() super(LocalDimStarter, self).tearDown() + class TestDIM(LocalDimStarter, unittest.TestCase): def createSessionAndAddTypicalGraph(self, sessionId, sleepTime=0): - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname, 'consumers':['B']}, - {'oid':'B', 'type':'app', 'app':'dlg.apps.simple.SleepAndCopyApp', 'sleepTime':sleepTime, 'outputs':['C'], 'node':hostname}, - {'oid':'C', 'type':'plain', 'storage':'memory', 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname, 'consumers': ['B']}, + {'oid': 'B', 'type': 'app', 'app': 'dlg.apps.simple.SleepAndCopyApp', 'sleepTime': sleepTime, + 'outputs': ['C'], 'node': hostname}, + {'oid': 'C', 'type': 'plain', 'storage': 'memory', 'node': hostname}] self.dim.createSession(sessionId) self.assertEqual(0, self.dim.getGraphSize(sessionId)) self.dim.addGraphSpec(sessionId, graphSpec) @@ -74,15 +75,15 @@ def test_addGraphSpec(self): sessionId = 'lalo' # No node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory'}] self.assertRaises(Exception, self.dim.addGraphSpec, sessionId, graphSpec) # Wrong node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':'unknown_host'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': 'unknown_host'}] self.assertRaises(Exception, self.dim.addGraphSpec, sessionId, graphSpec) # OK - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname}] self.dim.createSession(sessionId) self.assertEqual(0, self.dim.getGraphSize(sessionId)) self.dim.addGraphSpec(sessionId, graphSpec) @@ -165,7 +166,7 @@ def test_getGraph(self): graphSpecFromDim = self.dim.getGraph(sessionId) self.assertEqual(3, len(graphSpecFromDim)) - for oid in ('A','B','C'): + for oid in ('A', 'B', 'C'): self.assertIn(oid, graphSpecFromDim) graphSepcFromDM = self.dm.getGraph(sessionId) self.assertDictEqual(graphSepcFromDM, graphSpecFromDim) @@ -207,9 +208,9 @@ def assertGraphStatus(sessionId, expectedStatus): self.dim.cancelSession(sessionId) - #a, c = [self.dm._sessions[sessionId].drops[x] for x in ('A', 'C')] - #data = os.urandom(10) - #with droputils.DROPWaiterCtx(self, c, 3): + # a, c = [self.dm._sessions[sessionId].drops[x] for x in ('A', 'C')] + # data = os.urandom(10) + # with droputils.DROPWaiterCtx(self, c, 3): # a.write(data) # a.setCompleted() assertGraphStatus(sessionId, DROPStates.CANCELLED) @@ -224,8 +225,8 @@ def test_fullRound(self): """ sessionId = 'lala' - restPort = 8888 - args = ['--port', str(restPort), '-N',hostname, '-qqq'] + restPort = 8888 + args = ['--port', str(restPort), '-N', hostname, '-qqq'] dimProcess = tool.start_process('dim', args) with testutils.terminating(dimProcess, 10): @@ -253,29 +254,33 @@ def test_fullRound(self): # Since the original complexGraph doesn't have node information # we need to add it manually before submitting -- otherwise it will # get rejected by the DIM. - with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable + with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable complexGraphSpec = json.load(codecs.getreader('utf-8')(f)) for dropSpec in complexGraphSpec: dropSpec['node'] = hostname testutils.post(self, '/sessions/%s/graph/append' % (sessionId), restPort, json.dumps(complexGraphSpec)) - self.assertEqual({hostname: SessionStates.BUILDING}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: SessionStates.BUILDING}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # Now we deploy the graph... - testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", mimeType='application/x-www-form-urlencoded') - self.assertEqual({hostname: SessionStates.RUNNING}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", + mimeType='application/x-www-form-urlencoded') + self.assertEqual({hostname: SessionStates.RUNNING}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # ...and write to all 5 root nodes that are listening in ports # starting at 1111 msg = os.urandom(10) for i in range(5): - utils.write_to('localhost', 1111+i, msg, 2), "Couldn't write data to localhost:%d" % (1111+i) + utils.write_to('localhost', 1111 + i, msg, 2), "Couldn't write data to localhost:%d" % (1111 + i) # Wait until the graph has finished its execution. We'll know # it finished by polling the status of the session while SessionStates.RUNNING in testutils.get(self, '/sessions/%s/status' % (sessionId), restPort).values(): time.sleep(0.2) - self.assertEqual({hostname: SessionStates.FINISHED}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: SessionStates.FINISHED}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) testutils.delete(self, '/sessions/%s' % (sessionId), restPort) sessions = testutils.get(self, '/sessions', restPort) - self.assertEqual(0, len(sessions)) \ No newline at end of file + self.assertEqual(0, len(sessions)) diff --git a/daliuge-runtime/test/manager/test_dm.py b/daliuge-runtime/test/manager/test_dm.py index 040d0cd9a..2737616b0 100644 --- a/daliuge-runtime/test/manager/test_dm.py +++ b/daliuge-runtime/test/manager/test_dm.py @@ -24,10 +24,9 @@ import unittest import six - from dlg import droputils -from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType from dlg.common import dropdict +from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType from dlg.drop import BarrierAppDROP from dlg.manager.node_manager import NodeManager @@ -36,7 +35,6 @@ except: from binascii import crc32 # @Reimport - hostname = "localhost" @@ -93,15 +91,15 @@ def tearDown(self): nm.shutdown() def _test_runGraphInTwoNMs( - self, - g1, - g2, - rels, - root_data, - leaf_data, - root_oids=("A",), - leaf_oid="C", - expected_failures=[], + self, + g1, + g2, + rels, + root_data, + leaf_data, + root_oids=("A",), + leaf_oid="C", + expected_failures=[], ): """Utility to run a graph in two Node Managers""" diff --git a/daliuge-runtime/test/manager/test_mm.py b/daliuge-runtime/test/manager/test_mm.py index 3d87c5f3d..dd1da491b 100644 --- a/daliuge-runtime/test/manager/test_mm.py +++ b/daliuge-runtime/test/manager/test_mm.py @@ -26,7 +26,6 @@ import unittest import pkg_resources - from dlg import droputils from dlg import utils from dlg.common import tool @@ -36,9 +35,9 @@ from dlg.testutils import ManagerStarter from test.manager import testutils - hostname = '127.0.0.1' + class DimAndNMStarter(ManagerStarter): def setUp(self): @@ -54,12 +53,15 @@ def tearDown(self): self.dim_info.stop() self.nm_info.stop() + class TestMM(DimAndNMStarter, unittest.TestCase): def createSessionAndAddTypicalGraph(self, sessionId, sleepTime=0): - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'island':hostname, 'node':hostname, 'consumers':['B']}, - {'oid':'B', 'type':'app', 'app':'dlg.apps.simple.SleepAndCopyApp', 'sleepTime':sleepTime, 'outputs':['C'], 'node':hostname, 'island':hostname}, - {'oid':'C', 'type':'plain', 'storage':'memory', 'island':hostname, 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'island': hostname, 'node': hostname, + 'consumers': ['B']}, + {'oid': 'B', 'type': 'app', 'app': 'dlg.apps.simple.SleepAndCopyApp', 'sleepTime': sleepTime, + 'outputs': ['C'], 'node': hostname, 'island': hostname}, + {'oid': 'C', 'type': 'plain', 'storage': 'memory', 'island': hostname, 'node': hostname}] self.mm.createSession(sessionId) self.mm.addGraphSpec(sessionId, graphSpec) @@ -74,23 +76,23 @@ def test_addGraphSpec(self): sessionId = 'lalo' # No node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory'}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # Wrong node specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':'unknown_host'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': 'unknown_host'}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # No island specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # Wrong island specified - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname, 'island':'unknown_host'}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname, 'island': 'unknown_host'}] self.assertRaises(Exception, self.mm.addGraphSpec, sessionId, graphSpec) # OK - graphSpec = [{'oid':'A', 'type':'plain', 'storage':'memory', 'node':hostname, 'island':hostname}] + graphSpec = [{'oid': 'A', 'type': 'plain', 'storage': 'memory', 'node': hostname, 'island': hostname}] self.mm.createSession(sessionId) self.mm.addGraphSpec(sessionId, graphSpec) @@ -140,9 +142,9 @@ def test_deployGraphWithCompletedDOs(self): def test_sessionStatus(self): def assertSessionStatus(sessionId, status): - sessionStatusMM = self.mm.getSessionStatus(sessionId) + sessionStatusMM = self.mm.getSessionStatus(sessionId) sessionStatusDIM = self.dim.getSessionStatus(sessionId) - sessionStatusNM = self.nm.getSessionStatus(sessionId) + sessionStatusNM = self.nm.getSessionStatus(sessionId) self.assertEqual(1, len(sessionStatusMM)) self.assertIn(hostname, sessionStatusMM) self.assertDictEqual(sessionStatusDIM, sessionStatusMM[hostname]) @@ -175,7 +177,7 @@ def test_getGraph(self): graphSpecFromMM = self.mm.getGraph(sessionId) self.assertEqual(3, len(graphSpecFromMM)) - for oid in ('A','B','C'): + for oid in ('A', 'B', 'C'): self.assertIn(oid, graphSpecFromMM) graphSepcFromNM = self.nm.getGraph(sessionId) graphSepcFromDIM = self.dim.getGraph(sessionId) @@ -215,9 +217,9 @@ def test_fullRound(self): """ sessionId = 'lala' - restPort = 8888 + restPort = 8888 - args = ['--port', str(restPort), '-N',hostname, '-qqq'] + args = ['--port', str(restPort), '-N', hostname, '-qqq'] mmProcess = tool.start_process('mm', args) with testutils.terminating(mmProcess, 10): @@ -245,30 +247,35 @@ def test_fullRound(self): # Since the original complexGraph doesn't have node information # we need to add it manually before submitting -- otherwise it will # get rejected by the DIM. - with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable + with pkg_resources.resource_stream('test', 'graphs/complex.js') as f: # @UndefinedVariable complexGraphSpec = json.load(codecs.getreader('utf-8')(f)) for dropSpec in complexGraphSpec: dropSpec['node'] = hostname dropSpec['island'] = hostname testutils.post(self, '/sessions/%s/graph/append' % (sessionId), restPort, json.dumps(complexGraphSpec)) - self.assertEqual({hostname: {hostname: SessionStates.BUILDING}}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: {hostname: SessionStates.BUILDING}}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # Now we deploy the graph... - testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", mimeType='application/x-www-form-urlencoded') - self.assertEqual({hostname: {hostname: SessionStates.RUNNING}}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + testutils.post(self, '/sessions/%s/deploy' % (sessionId), restPort, "completed=SL_A,SL_B,SL_C,SL_D,SL_K", + mimeType='application/x-www-form-urlencoded') + self.assertEqual({hostname: {hostname: SessionStates.RUNNING}}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) # ...and write to all 5 root nodes that are listening in ports # starting at 1111 msg = os.urandom(10) for i in range(5): - utils.write_to('localhost', 1111+i, msg, 2), "Couldn't write data to localhost:%d" % (1111+i) + utils.write_to('localhost', 1111 + i, msg, 2), "Couldn't write data to localhost:%d" % (1111 + i) # Wait until the graph has finished its execution. We'll know # it finished by polling the status of the session - while SessionStates.RUNNING in testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)[hostname].values(): + while SessionStates.RUNNING in testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)[ + hostname].values(): time.sleep(0.2) - self.assertEqual({hostname: {hostname: SessionStates.FINISHED}}, testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) + self.assertEqual({hostname: {hostname: SessionStates.FINISHED}}, + testutils.get(self, '/sessions/%s/status' % (sessionId), restPort)) testutils.delete(self, '/sessions/%s' % (sessionId), restPort) sessions = testutils.get(self, '/sessions', restPort) - self.assertEqual(0, len(sessions)) \ No newline at end of file + self.assertEqual(0, len(sessions)) diff --git a/daliuge-runtime/test/manager/test_rest.py b/daliuge-runtime/test/manager/test_rest.py index 5f7db1e99..edd0e8ca5 100644 --- a/daliuge-runtime/test/manager/test_rest.py +++ b/daliuge-runtime/test/manager/test_rest.py @@ -24,17 +24,17 @@ import unittest from dlg import exceptions +from dlg.exceptions import InvalidGraphException from dlg.manager import constants from dlg.manager.client import NodeManagerClient, DataIslandManagerClient +from dlg.manager.composite_manager import DataIslandManager from dlg.manager.node_manager import NodeManager from dlg.manager.rest import NMRestServer, CompositeManagerRestServer from dlg.restutils import RestClient -from dlg.manager.composite_manager import DataIslandManager -from dlg.exceptions import InvalidGraphException - hostname = 'localhost' + class TestRest(unittest.TestCase): def setUp(self): @@ -46,7 +46,8 @@ def setUp(self): self.dim = DataIslandManager(dmHosts=[hostname]) self._dim_server = CompositeManagerRestServer(self.dim) - self._dim_t = threading.Thread(target=self._dim_server.start, args=(hostname, constants.ISLAND_DEFAULT_REST_PORT)) + self._dim_t = threading.Thread(target=self._dim_server.start, + args=(hostname, constants.ISLAND_DEFAULT_REST_PORT)) self._dim_t.start() def tearDown(self): @@ -68,7 +69,6 @@ def test_index(self): c._GET('/session') def test_errtype(self): - sid = 'lala' c = NodeManagerClient(hostname) c.createSession(sid) @@ -83,24 +83,26 @@ def test_errtype(self): self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, [{}]) # invalid dropspec, app doesn't exist - self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist'}]) + self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, + [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist'}]) # invalid state, the graph status is only queried when the session is running self.assertRaises(exceptions.InvalidSessionState, c.getGraphStatus, sid) # valid dropspec, but the socket listener app doesn't allow inputs - c.addGraphSpec(sid, [{'type': 'socket', 'oid': 'a', 'inputs': ['b']}, {'oid': 'b', 'type': 'plain', 'storage': 'memory'}]) + c.addGraphSpec(sid, [{'type': 'socket', 'oid': 'a', 'inputs': ['b']}, + {'oid': 'b', 'type': 'plain', 'storage': 'memory'}]) self.assertRaises(exceptions.InvalidRelationshipException, c.deploySession, sid) # And here we point to an unexisting file, making an invalid drop c.destroySession(sid) c.createSession(sid) fname = tempfile.mktemp() - c.addGraphSpec(sid, [{'type': 'plain', 'storage': 'file', 'oid': 'a', 'filepath': fname, 'check_filepath_exists': True}]) + c.addGraphSpec(sid, [ + {'type': 'plain', 'storage': 'file', 'oid': 'a', 'filepath': fname, 'check_filepath_exists': True}]) self.assertRaises(exceptions.InvalidDropException, c.deploySession, sid) def test_recursive(self): - sid = 'lala' c = DataIslandManagerClient(hostname) c.createSession(sid) @@ -112,4 +114,4 @@ def test_recursive(self): c.addGraphSpec(sid, [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist', 'node': hostname}]) ex = cm.exception self.assertTrue(hostname in ex.args[0]) - self.assertTrue(isinstance(ex.args[0][hostname], InvalidGraphException)) \ No newline at end of file + self.assertTrue(isinstance(ex.args[0][hostname], InvalidGraphException)) diff --git a/daliuge-runtime/test/manager/test_scalability.py b/daliuge-runtime/test/manager/test_scalability.py index 743312117..9e1576bb9 100644 --- a/daliuge-runtime/test/manager/test_scalability.py +++ b/daliuge-runtime/test/manager/test_scalability.py @@ -28,12 +28,13 @@ from dlg.utils import terminate_or_kill from test.manager import testutils - logger = logging.getLogger(__name__) hostname = 'localhost' + def memory_drop(uid): - return dropdict({'node':hostname, 'oid':uid, 'uid':uid, 'type':'plain', 'storage':'memory'}) + return dropdict({'node': hostname, 'oid': uid, 'uid': uid, 'type': 'plain', 'storage': 'memory'}) + def create_graph(branches, drops_per_branch): graph = [] @@ -44,7 +45,8 @@ def create_graph(branches, drops_per_branch): data_uid = 'data_%d_branch_%d' % (i, branch) app_uid = 'app_%d_branch_%d' % (i, branch) data_drop = memory_drop(data_uid) - app_drop = dropdict({'node':hostname, 'oid':app_uid, 'uid':app_uid, 'type':'app', 'app':'dlg.apps.simple.SleepAndCopyApp', 'sleepTime':0}) + app_drop = dropdict({'node': hostname, 'oid': app_uid, 'uid': app_uid, 'type': 'app', + 'app': 'dlg.apps.simple.SleepAndCopyApp', 'sleepTime': 0}) data_drop.addConsumer(app_drop) graph.append(data_drop) graph.append(app_drop) @@ -63,6 +65,7 @@ def create_graph(branches, drops_per_branch): graph.append(final_drop) return graph, completed_uids + class TestBigGraph(unittest.TestCase): """ A small class that simply checks that the deployment of a considerable-sized @@ -80,10 +83,9 @@ def tearDown(self): unittest.TestCase.tearDown(self) def test_submit_hugegraph(self): - # Each branch contains a data drop and an app drop # All branches connect to a final data drop - drops_per_branch=5000 + drops_per_branch = 5000 branches = 5 n_drops = drops_per_branch * branches * 2 + 1 graph, completed_uids = create_graph(branches=branches, drops_per_branch=drops_per_branch) @@ -91,9 +93,8 @@ def test_submit_hugegraph(self): self._run_graph(graph, completed_uids, 5) def _run_graph(self, graph, completed_uids, timeout): - sessionId = 'lala' - restPort = 8888 + restPort = 8888 args = ['--port', str(restPort), '-N', hostname, '-qq'] c = client.NodeManagerClient(port=restPort) @@ -111,4 +112,4 @@ def _run_graph(self, graph, completed_uids, timeout): # A minute is more than enough, in my PC it takes around 4 or 5 [s] # A minute is also way less than the ~2 [h] we observed in AWS - self.assertLessEqual(delta, 60, "It took way too much time to create all drops") \ No newline at end of file + self.assertLessEqual(delta, 60, "It took way too much time to create all drops") diff --git a/daliuge-runtime/test/manager/testutils.py b/daliuge-runtime/test/manager/testutils.py index eef8ca2f5..40b8551fd 100644 --- a/daliuge-runtime/test/manager/testutils.py +++ b/daliuge-runtime/test/manager/testutils.py @@ -19,12 +19,11 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA # +import codecs import json import six.moves.http_client as httplib # @UnresolvedImport - from dlg import utils -import codecs def get(test, url, port): @@ -37,6 +36,7 @@ def get(test, url, port): conn.close() return jsonRes + def post(test, url, port, content=None, mimeType=None): conn = httplib.HTTPConnection('localhost', port, timeout=3) headers = {mimeType or 'Content-Type': 'application/json'} if content else {} @@ -45,6 +45,7 @@ def post(test, url, port, content=None, mimeType=None): test.assertEqual(httplib.OK, res.status) conn.close() + def delete(test, url, port): conn = httplib.HTTPConnection('localhost', port, timeout=3) conn.request('DELETE', '/api' + url) @@ -52,6 +53,7 @@ def delete(test, url, port): test.assertEqual(httplib.OK, res.status) conn.close() + class terminating(object): """ A context manager that makes sure a process always exits. @@ -66,4 +68,4 @@ def __enter__(self): def __exit__(self, typ, val, traceback): utils.terminate_or_kill(self.proc, self.timeout) - return False \ No newline at end of file + return False diff --git a/daliuge-runtime/test/memoryUsage.py b/daliuge-runtime/test/memoryUsage.py index 446a1775b..44d462222 100644 --- a/daliuge-runtime/test/memoryUsage.py +++ b/daliuge-runtime/test/memoryUsage.py @@ -25,8 +25,8 @@ """ import importlib -from optparse import OptionParser import sys +from optparse import OptionParser import psutil @@ -50,14 +50,15 @@ def measure(n, droptype): return mem2 - mem1, uTime2 - uTime1, sTime2 - sTime1 + if __name__ == '__main__': parser = OptionParser() - parser.add_option("--csv", action="store_true", dest="csv", help = "Output results in CSV format", default=False) + parser.add_option("--csv", action="store_true", dest="csv", help="Output results in CSV format", default=False) parser.add_option("-i", "--instances", action="store", type="int", - dest="instances", help = "Number of DROP instances to create and measure") + dest="instances", help="Number of DROP instances to create and measure") parser.add_option("-t", "--type", action="store", type="string", - dest="type", help = "DROP type to instantiate") + dest="type", help="DROP type to instantiate") (options, args) = parser.parse_args(sys.argv) if options.type is None: @@ -72,12 +73,14 @@ def measure(n, droptype): droptype = getattr(importlib.import_module(modname), classname) mem, uTime, sTime = measure(n, droptype) tTime = uTime + sTime - memAvg, uTimeAvg, sTimeAvg, tTimeAvg = [x/float(n) for x in (mem, uTime, sTime, tTime)] + memAvg, uTimeAvg, sTimeAvg, tTimeAvg = [x / float(n) for x in (mem, uTime, sTime, tTime)] if options.csv: - print("%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % (options.type, n, mem, uTime*1e3, sTime*1e3, tTime*1e3, memAvg, uTimeAvg*1e6, sTimeAvg*1e6, tTimeAvg*1e6)) + print("%s,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f" % ( + options.type, n, mem, uTime * 1e3, sTime * 1e3, tTime * 1e3, memAvg, uTimeAvg * 1e6, sTimeAvg * 1e6, + tTimeAvg * 1e6)) else: print("%d bytes used by %d %ss (%.2f bytes per DROP)" % (mem, n, droptype.__name__, memAvg)) print("Total time: %.2f msec (%.2f msec per DROP)" % (tTime, tTimeAvg)) print("User time: %.2f msec (%.2f msec per DROP)" % (uTime, uTimeAvg)) - print("System time: %.2f msec (%.2f msec per DROP)" % (sTime, sTimeAvg)) \ No newline at end of file + print("System time: %.2f msec (%.2f msec per DROP)" % (sTime, sTimeAvg)) diff --git a/daliuge-runtime/test/test_JsonDrop.py b/daliuge-runtime/test/test_JsonDrop.py index d1ece8672..4b9c5d51f 100644 --- a/daliuge-runtime/test/test_JsonDrop.py +++ b/daliuge-runtime/test/test_JsonDrop.py @@ -83,7 +83,7 @@ def setUpClass(cls): if not os.path.exists(DIR): os.makedirs(DIR) - #with open(os.path.join(DIR, 'oid___uid'), mode='w') as write_file: + # with open(os.path.join(DIR, 'oid___uid'), mode='w') as write_file: with open(os.path.join(DIR, 'uid'), mode='w') as write_file: write_file.write(FILE_TEXT) diff --git a/daliuge-runtime/test/test_S3Drop.py b/daliuge-runtime/test/test_S3Drop.py index f35205eb2..74be1dd38 100644 --- a/daliuge-runtime/test/test_S3Drop.py +++ b/daliuge-runtime/test/test_S3Drop.py @@ -20,6 +20,7 @@ # MA 02111-1307 USA # from unittest.case import skipIf + """ Test the S3 Drop """ @@ -62,4 +63,4 @@ def test_size(self): self.assertEqual(drop.size(), -1) # drop = S3DROP('oid:A', 'uid:A', profile_name=PROFILE, bucket='13b-266', key='13B-266.sb25386827.eb28551343.56619.33367407408_calibrated_deepfield.ms.tar') - # self.assertEqual(drop.size(), 734067056640) \ No newline at end of file + # self.assertEqual(drop.size(), 734067056640) diff --git a/daliuge-runtime/test/test_dask_emulation.py b/daliuge-runtime/test/test_dask_emulation.py index 7c2b05d29..328219b2f 100644 --- a/daliuge-runtime/test/test_dask_emulation.py +++ b/daliuge-runtime/test/test_dask_emulation.py @@ -24,12 +24,11 @@ import unittest import numpy as np -from six.moves import reduce # @UnresolvedImport - -from dlg.dask_emulation import delayed as dlg_delayed -from dlg.dask_emulation import compute as dlg_compute from dlg.common import tool +from dlg.dask_emulation import compute as dlg_compute +from dlg.dask_emulation import delayed as dlg_delayed from dlg.utils import terminate_or_kill +from six.moves import reduce # @UnresolvedImport try: from dask import delayed as dask_delayed @@ -41,52 +40,67 @@ def add(x, y): return x + y + def add_list(numbers): return reduce(add, numbers) + def subtract(x, y): return x - y + def subtract_list(numbers): return reduce(subtract, numbers) + def multiply(x, y): return x * y + def divide(x, y): return x / y + def partition(x): return x / 2, x - x / 2 + def sum_with_args(a, *args): """Returns a + kwargs['b'], or only a if no 'b' is found in kwargs""" return a + sum(args) + def sum_with_kwargs(a, **kwargs): """Returns a + kwargs['b'], or only a if no 'b' is found in kwargs""" b = kwargs.pop('b', 0) return a + b + def sum_with_args_and_kwarg(a, *args, **kwargs): """Returns a + kwargs['b'], or only a if no 'b' is found in kwargs""" b = kwargs.pop('b', 0) return a + sum(args) + b + class MyType(object): """A type that is serializable but not convertible to JSON""" + def __init__(self, x): self.x = x self.array = np.zeros(1) + + try: json.dumps(MyType(1)) assert False, "Should fail to serialize to JSON" except: pass + def sum_with_user_defined_default(a, b=MyType(10)): return a + b.x + class _TestDelayed(object): """Test definitions run under non-delayed, dlg_delayed and possibly dask_delayed contexts""" @@ -204,30 +218,40 @@ def test_with_iterable_nout_1(self): class TestNoDelayed(unittest.TestCase, _TestDelayed): """Non-delayed tests""" + def delayed(self, f, *_, **__): return f + def compute(self, val): return val + class TestDlgDelayed(_TestDelayed, unittest.TestCase): """dlg-base tests, they start/stop the node manager and use dlg_delayed""" + def delayed(self, f, *args, **kwargs): return dlg_delayed(f, *args, **kwargs) + def setUp(self): unittest.TestCase.setUp(self) env = os.environ.copy() env['PYTHONPATH'] = env.get('PYTHONPATH', '') + ":" + os.getcwd() self.dmProcess = tool.start_process('nm', env=env) + def compute(self, val): return dlg_compute(val) + def tearDown(self): terminate_or_kill(self.dmProcess, 5) unittest.TestCase.tearDown(self) + @unittest.skipIf(dask_delayed is None, 'dask is not available') class TestDaskDelayed(_TestDelayed, unittest.TestCase): """dask-base tests, they use dask_delayed""" + def delayed(self, f, *args, **kwargs): return dask_delayed(f, *args, **kwargs) + def compute(self, val): return dask_compute(val)[0] diff --git a/daliuge-runtime/test/test_drop.py b/daliuge-runtime/test/test_drop.py index 685de2891..2da883ed8 100644 --- a/daliuge-runtime/test/test_drop.py +++ b/daliuge-runtime/test/test_drop.py @@ -21,15 +21,14 @@ # import contextlib -import os, unittest +import os import random import shutil import sqlite3 import tempfile +import unittest import six -from six import BytesIO - from dlg import droputils from dlg.ddap_protocol import DROPStates, ExecutionMode, AppDROPStates from dlg.drop import FileDROP, AppDROP, InMemoryDROP, \ @@ -37,7 +36,7 @@ DirectoryContainer, ContainerDROP, InputFiredAppDROP, RDBMSDrop from dlg.droputils import DROPWaiterCtx from dlg.exceptions import InvalidDropException - +from six import BytesIO try: from crc32c import crc32 @@ -46,9 +45,11 @@ ONE_MB = 1024 ** 2 + def _start_ns_thread(ns_daemon): ns_daemon.requestLoop() + def isContainer(drop): # return isinstance(drop, ContainerDROP) # A Pyro-friendly way to check for a ContainerDROP is to see if @@ -59,12 +60,14 @@ def isContainer(drop): except AttributeError: return False + class SumupContainerChecksum(BarrierAppDROP): """ A dummy BarrierAppDROP that recursively sums up the checksums of all the individual DROPs it consumes, and then stores the final result in its output DROP """ + def run(self): crcSum = 0 for inputDrop in self.inputs: @@ -73,14 +76,15 @@ def run(self): outputDrop = self.outputs[0] outputDrop.write(six.b(str(crcSum))) + class TestDROP(unittest.TestCase): def setUp(self): """ library-specific setup """ - self._test_drop_sz = 16 # MB - self._test_block_sz = 2 # MB + self._test_drop_sz = 16 # MB + self._test_block_sz = 2 # MB self._test_num_blocks = self._test_drop_sz // self._test_block_sz self._test_block = os.urandom(self._test_block_sz * ONE_MB) @@ -113,7 +117,7 @@ def _test_write_withDropType(self, dropType): """ Test an AbstractDROP and a simple AppDROP (for checksum calculation) """ - a = dropType('oid:A', 'uid:A', expectedSize = self._test_drop_sz * ONE_MB) + a = dropType('oid:A', 'uid:A', expectedSize=self._test_drop_sz * ONE_MB) b = SumupContainerChecksum('oid:B', 'uid:B') c = InMemoryDROP('oid:C', 'uid:C') b.addInput(a) @@ -203,7 +207,7 @@ def run(self): a.setCompleted() # Get intermediate and final results and compare - actualRes = [] + actualRes = [] for i in [c, e, g]: actualRes.append(droputils.allDropContents(i)) map(lambda x, y: self.assertEqual(x, y), [cResExpected, eResExpected, gResExpected], actualRes) @@ -245,7 +249,7 @@ def branch_failure(self, tooManyFailures): hold the sum of B1, B2 and B3's checksums """ - #create file data objects + # create file data objects a1 = InMemoryDROP('oid:A1', 'uid:A1') a2 = InMemoryDROP('oid:A2', 'uid:A2') a3 = InMemoryDROP('oid:A3', 'uid:A3') @@ -259,16 +263,16 @@ def branch_failure(self, tooManyFailures): c3 = InMemoryDROP('oid:C3', 'uid:C3') # The final DROP that sums up the CRCs from the container DROP - d = SumupContainerChecksum('oid:D', 'uid:D', input_error_threshold = 33) + d = SumupContainerChecksum('oid:D', 'uid:D', input_error_threshold=33) e = InMemoryDROP('oid:E', 'uid:E') # Wire together - dropAList = [a1,a2,a3] - dropBList = [b1,b2,b3] - dropCList = [c1,c2,c3] - for dropA,dropB in zip(dropAList, dropBList): + dropAList = [a1, a2, a3] + dropBList = [b1, b2, b3] + dropCList = [c1, c2, c3] + for dropA, dropB in zip(dropAList, dropBList): dropA.addConsumer(dropB) - for dropB,dropC in zip(dropBList, dropCList): + for dropB, dropC in zip(dropBList, dropCList): dropB.addOutput(dropC) for dropC in dropCList: dropC.addConsumer(d) @@ -277,12 +281,14 @@ def branch_failure(self, tooManyFailures): # Write data into the initial "A" DROPs, which should trigger # the whole chain explained above with DROPWaiterCtx(self, e): - #for dropA in dropAList: # this should be parallel for - a1.write(b' '); a1.setCompleted() + # for dropA in dropAList: # this should be parallel for + a1.write(b' '); + a1.setCompleted() if tooManyFailures: a2.setError() else: - a2.write(b' '); a2.setCompleted() + a2.write(b' '); + a2.setCompleted() a3.setError() if tooManyFailures: @@ -327,7 +333,7 @@ def test_join(self): """ filelen = self._test_drop_sz * ONE_MB - #create file data objects + # create file data objects a1 = FileDROP('oid:A1', 'uid:A1', expectedSize=filelen) a2 = FileDROP('oid:A2', 'uid:A2', expectedSize=filelen) a3 = FileDROP('oid:A3', 'uid:A3', expectedSize=filelen) @@ -345,12 +351,12 @@ def test_join(self): e = InMemoryDROP('oid:E', 'uid:E') # Wire together - dropAList = [a1,a2,a3] - dropBList = [b1,b2,b3] - dropCList = [c1,c2,c3] - for dropA,dropB in map(lambda a,b: (a,b), dropAList, dropBList): + dropAList = [a1, a2, a3] + dropBList = [b1, b2, b3] + dropCList = [c1, c2, c3] + for dropA, dropB in map(lambda a, b: (a, b), dropAList, dropBList): dropA.addConsumer(dropB) - for dropB,dropC in map(lambda b,c: (b,c), dropBList, dropCList): + for dropB, dropC in map(lambda b, c: (b, c), dropBList, dropCList): dropB.addOutput(dropC) for dropC in dropCList: dropC.addConsumer(d) @@ -359,7 +365,7 @@ def test_join(self): # Write data into the initial "A" DROPs, which should trigger # the whole chain explained above with DROPWaiterCtx(self, e): - for dropA in dropAList: # this should be parallel for + for dropA in dropAList: # this should be parallel for for _ in range(self._test_num_blocks): dropA.write(self._test_block) @@ -410,12 +416,12 @@ def run(self): outputs[int(n) % 2].write(n + b" ") # Create DROPs - a = InMemoryDROP('oid:A', 'uid:A') - b = NumberWriterApp('oid:B', 'uid:B') - c = InMemoryDROP('oid:A', 'uid:A') + a = InMemoryDROP('oid:A', 'uid:A') + b = NumberWriterApp('oid:B', 'uid:B') + c = InMemoryDROP('oid:A', 'uid:A') d = OddAndEvenContainerApp('oid:D', 'uid:D') - e = InMemoryDROP('oid:E', 'uid:E') - f = InMemoryDROP('oid:F', 'uid:F') + e = InMemoryDROP('oid:E', 'uid:E') + f = InMemoryDROP('oid:F', 'uid:F') # Wire them together a.addConsumer(b) @@ -425,17 +431,16 @@ def run(self): d.addOutput(f) # Start the execution - with DROPWaiterCtx(self, [e,f]): + with DROPWaiterCtx(self, [e, f]): a.write(b'20') a.setCompleted() # Check the final results are correct - for drop in [a,b,c,d,e]: + for drop in [a, b, c, d, e]: self.assertEqual(drop.status, DROPStates.COMPLETED, "%r is not yet COMPLETED" % (drop)) self.assertEqual(b"0 2 4 6 8 10 12 14 16 18", droputils.allDropContents(e).strip()) self.assertEqual(b"1 3 5 7 9 11 13 15 17 19", droputils.allDropContents(f).strip()) - def test_dropWroteFromOutside(self): """ A different scenario to those tested above, in which the data @@ -555,11 +560,13 @@ class LastCharWriterApp(AppDROP): def initialize(self, **kwargs): super(LastCharWriterApp, self).initialize(**kwargs) self._lastByte = None + def dataWritten(self, uid, data): self.execStatus = AppDROPStates.RUNNING outputDrop = self.outputs[0] self._lastByte = data[-1:] outputDrop.write(self._lastByte) + def dropCompleted(self, uid, status): self.execStatus = AppDROPStates.FINISHED self._notifyAppIsFinished() @@ -586,13 +593,13 @@ def checkDropStates(aStatus, dStatus, eStatus, lastByte): if lastByte is not None: self.assertEqual(lastByte, b._lastByte) - checkDropStates(DROPStates.INITIALIZED , DROPStates.INITIALIZED, DROPStates.INITIALIZED, None) + checkDropStates(DROPStates.INITIALIZED, DROPStates.INITIALIZED, DROPStates.INITIALIZED, None) a.write(b'abcde') checkDropStates(DROPStates.WRITING, DROPStates.WRITING, DROPStates.INITIALIZED, b'e') a.write(b'fghij') checkDropStates(DROPStates.WRITING, DROPStates.WRITING, DROPStates.INITIALIZED, b'j') a.write(b'k') - with DROPWaiterCtx(self, [d,e]): + with DROPWaiterCtx(self, [d, e]): a.setCompleted() checkDropStates(DROPStates.COMPLETED, DROPStates.COMPLETED, DROPStates.COMPLETED, b'k') @@ -636,7 +643,7 @@ def test_directoryContainer(self): # Prepare our playground cwd = os.getcwd() os.chdir('/tmp') - dirname = "/tmp/.hidden" + dirname = "/tmp/.hidden" dirname2 = "/tmp/.hidden/inside" if not os.path.exists(dirname2): os.makedirs(dirname2) @@ -677,29 +684,31 @@ def test_multipleProducers(self): A test that checks that multiple-producers correctly drive the state of their shared output """ - class App(BarrierAppDROP): pass - a,b,c,d,e = [App(chr(ord('A') + i), chr(ord('A') + i)) for i in range(5)] + class App(BarrierAppDROP): + pass + + a, b, c, d, e = [App(chr(ord('A') + i), chr(ord('A') + i)) for i in range(5)] f = InMemoryDROP('F', 'F') - for drop in a,b,c,d,e: + for drop in a, b, c, d, e: drop.addOutput(f) self.assertEqual(DROPStates.INITIALIZED, f.status) - for drop in a,b,c,d,e: + for drop in a, b, c, d, e: self.assertEqual(AppDROPStates.NOT_RUN, drop.execStatus) # Run the first 4 ones, F should still be in INITIALIZED - for drop in a,b,c,d: + for drop in a, b, c, d: drop.execute() self.assertEqual(DROPStates.INITIALIZED, f.status) self.assertEqual(AppDROPStates.NOT_RUN, e.execStatus) - for drop in a,b,c,d: + for drop in a, b, c, d: self.assertEqual(AppDROPStates.FINISHED, drop.execStatus) # Run the final one, now F should be COMPLETED e.execute() self.assertEqual(DROPStates.COMPLETED, f.status) - for drop in a,b,c,d,e: + for drop in a, b, c, d, e: self.assertEqual(AppDROPStates.FINISHED, drop.execStatus) def test_eager_inputFired_app(self): @@ -721,9 +730,9 @@ def test_eager_inputFired_app(self): # 2 effective inputs, 4 outputs. Trigger 2 inputs and make sure the # app has run - a,b,c,d = [InMemoryDROP(str(i), str(i)) for i in range(4)] + a, b, c, d = [InMemoryDROP(str(i), str(i)) for i in range(4)] e = InputFiredAppDROP('e', 'e', n_effective_inputs=2) - for x in a,b,c,d: + for x in a, b, c, d: e.addInput(x) with DROPWaiterCtx(self, e, 5): @@ -742,6 +751,7 @@ class FailOnlyTheFirstTimeApp(BarrierAppDROP): def initialize(self, **kwargs): BarrierAppDROP.initialize(self, **kwargs) self.i = 0 + def run(self): if self.i == 0: self.i = 1 @@ -783,5 +793,6 @@ def test_rdbms_drop(self): finally: os.unlink(dbfile) + if __name__ == '__main__': unittest.main() diff --git a/daliuge-runtime/test/test_droputils.py b/daliuge-runtime/test/test_droputils.py index 9cbde346a..9dfc0ea7f 100644 --- a/daliuge-runtime/test/test_droputils.py +++ b/daliuge-runtime/test/test_droputils.py @@ -27,8 +27,6 @@ import unittest -import six - from dlg import droputils from dlg.common import dropdict from dlg.drop import InMemoryDROP, FileDROP, BarrierAppDROP @@ -48,16 +46,16 @@ def _createGraph(self): B, C, G and H are AppDOs. The names have been given in breadth-first order (although H has a dependency on I) """ - a = InMemoryDROP('a', 'a') - b = BarrierAppDROP('b', 'b') - c = BarrierAppDROP('c', 'c') - d = InMemoryDROP('d', 'd') - e = InMemoryDROP('e', 'e') - f = InMemoryDROP('f', 'f') - g = BarrierAppDROP('g', 'g') - h = BarrierAppDROP('h', 'h') - i = InMemoryDROP('i', 'i') - j = InMemoryDROP('j', 'j') + a = InMemoryDROP('a', 'a') + b = BarrierAppDROP('b', 'b') + c = BarrierAppDROP('c', 'c') + d = InMemoryDROP('d', 'd') + e = InMemoryDROP('e', 'e') + f = InMemoryDROP('f', 'f') + g = BarrierAppDROP('g', 'g') + h = BarrierAppDROP('h', 'h') + i = InMemoryDROP('i', 'i') + j = InMemoryDROP('j', 'j') a.addConsumer(b) a.addConsumer(c) @@ -123,7 +121,7 @@ def testDepthFirstSearch(self): Checks that our DFS method is correct """ a, b, c, d, e, f, g, h, i, j = self._createGraph() - nodesList = [drop for drop,_ in droputils.depthFirstTraverse(a)] + nodesList = [drop for drop, _ in droputils.depthFirstTraverse(a)] self.assertListEqual([a, b, d, g, i, h, j, c, e, f], nodesList) def testBreadthFirstSearch(self): @@ -131,7 +129,7 @@ def testBreadthFirstSearch(self): Checks that our BFS method is correct """ a, b, c, d, e, f, g, h, i, j = self._createGraph() - nodesList = [drop for drop,_ in droputils.breadFirstTraverse(a)] + nodesList = [drop for drop, _ in droputils.breadFirstTraverse(a)] self.assertListEqual([a, b, c, d, e, f, g, h, i, j], nodesList) def testGetEndNodes(self): @@ -165,11 +163,11 @@ def test_BFSWithFiltering(self): visitedNodes = [] for drop, downStreamDrops in droputils.breadFirstTraverse(a): - downStreamDrops[:] = [x for x in downStreamDrops if x.uid not in ('b','f')] + downStreamDrops[:] = [x for x in downStreamDrops if x.uid not in ('b', 'f')] visitedNodes.append(drop) self.assertEqual(5, len(visitedNodes)) - self.assertListEqual(visitedNodes, [a,c,e,h,j]) + self.assertListEqual(visitedNodes, [a, c, e, h, j]) def test_get_roots(self): """ @@ -179,8 +177,8 @@ def test_get_roots(self): """ A --> B """ - pg_spec = [{"oid":"A", "type":"plain", "storage":"memory", "consumers":["B"]}, - {"oid":"B", "type":"app", "app":"test.test_graph_loader.DummyApp"}] + pg_spec = [{"oid": "A", "type": "plain", "storage": "memory", "consumers": ["B"]}, + {"oid": "B", "type": "app", "app": "test.test_graph_loader.DummyApp"}] roots = droputils.get_roots(pg_spec) self.assertEqual(1, len(roots)) self.assertEqual('A', next(iter(roots))) @@ -189,8 +187,8 @@ def test_get_roots(self): A --> B The same, but now B references A """ - pg_spec = [{"oid":"A", "type":"plain", "storage":"memory"}, - {"oid":"B", "type":"app", "app":"test.test_graph_loader.DummyApp", "inputs": ["A"]}] + pg_spec = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "app", "app": "test.test_graph_loader.DummyApp", "inputs": ["A"]}] roots = droputils.get_roots(pg_spec) self.assertEqual(1, len(roots)) self.assertEqual('A', next(iter(roots))) @@ -200,12 +198,12 @@ def test_get_roots(self): |--> E --> F B --------------| """ - pg_spec = [{"oid":"A", "type":"plain", "storage": "memory"}, - {"oid":"B", "type":"plain", "storage": "memory"}, - {"oid":"C", "type":"app", "app":"dlg.apps.crc.CRCApp", "inputs": ['A']}, - {"oid":"D", "type":"plain", "storage": "memory", "producers": ["C"]}, - {"oid":"E", "type":"app", "app":"test.test_drop.SumupContainerChecksum", "inputs": ["D"]}, - {"oid":"F", "type":"plain", "storage": "memory", "producers":["E"]}] + pg_spec = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "plain", "storage": "memory"}, + {"oid": "C", "type": "app", "app": "dlg.apps.crc.CRCApp", "inputs": ['A']}, + {"oid": "D", "type": "plain", "storage": "memory", "producers": ["C"]}, + {"oid": "E", "type": "app", "app": "test.test_drop.SumupContainerChecksum", "inputs": ["D"]}, + {"oid": "F", "type": "plain", "storage": "memory", "producers": ["E"]}] roots = droputils.get_roots(pg_spec) self.assertEqual(2, len(roots)) self.assertListEqual(['A', 'B'], sorted(roots)) @@ -214,4 +212,4 @@ def test_get_roots(self): pg_spec_dropdicts = [dropdict(dropspec) for dropspec in pg_spec] roots = droputils.get_roots(pg_spec_dropdicts) self.assertEqual(2, len(roots)) - self.assertListEqual(['A', 'B'], sorted(roots)) \ No newline at end of file + self.assertListEqual(['A', 'B'], sorted(roots)) diff --git a/daliuge-runtime/test/test_graph_loader.py b/daliuge-runtime/test/test_graph_loader.py index 290ce4feb..4a1715446 100644 --- a/daliuge-runtime/test/test_graph_loader.py +++ b/daliuge-runtime/test/test_graph_loader.py @@ -30,18 +30,19 @@ # Used in the textual representation of the graphs in these tests class DummyApp(AppDROP): pass + class TestGraphLoader(unittest.TestCase): def test_singleMemoryDrop(self): - dropSpecList = [{"oid":"A", "type":"plain", "storage":"memory"}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "memory"}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] self.assertIsInstance(a, InMemoryDROP) self.assertEqual("A", a.oid) self.assertEqual("A", a.uid) def test_containerDrop(self): - dropSpecList = [{"oid":"A", "type":"plain", "storage":"memory"}, - {"oid":"B", "type":"container", "children":["A"]}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "memory"}, + {"oid": "B", "type": "container", "children": ["A"]}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] self.assertIsInstance(a, InMemoryDROP) self.assertEqual("A", a.oid) @@ -53,15 +54,16 @@ def test_containerDrop(self): self.assertEqual("B", b.uid) # A directory container - dropSpecList = [{"oid":"A", "type":"plain", "storage":"file", "dirname":"."}, - {"oid":"B", "type":"container", "container":"dlg.drop.DirectoryContainer", "children":["A"], "dirname":"."}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "file", "dirname": "."}, + {"oid": "B", "type": "container", "container": "dlg.drop.DirectoryContainer", "children": ["A"], + "dirname": "."}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] b = a.parent self.assertIsInstance(b, DirectoryContainer) def test_consumer(self): - dropSpecList = [{"oid":"A", "type":"plain", "storage":"memory", "consumers":["B"]}, - {"oid":"B", "type":"app", "app":"test.test_graph_loader.DummyApp"}] + dropSpecList = [{"oid": "A", "type": "plain", "storage": "memory", "consumers": ["B"]}, + {"oid": "B", "type": "app", "app": "test.test_graph_loader.DummyApp"}] a = graph_loader.createGraphFromDropSpecList(dropSpecList)[0] self.assertIsInstance(a, InMemoryDROP) self.assertEqual("A", a.oid) @@ -74,15 +76,14 @@ def test_consumer(self): self.assertEqual(a, b.inputs[0]) def test_removeUnmetRelationships(self): - # Unmet relationsips are # DROPRel(D, CONSUMER, A) # DROPRel(D, STREAMING_CONSUMER, C) # DROPRel(Z, PRODUCER, A) # DROPRel(X, PRODUCER, A) - graphDesc = [{'oid':'A', 'consumers':['B', 'D'], 'producers':['Z','X']}, - {'oid':'B', 'outputs':['C']}, - {'oid':'C', 'streamingConsumers':['D']}] + graphDesc = [{'oid': 'A', 'consumers': ['B', 'D'], 'producers': ['Z', 'X']}, + {'oid': 'B', 'outputs': ['C']}, + {'oid': 'C', 'streamingConsumers': ['D']}] unmetRelationships = graph_loader.removeUnmetRelationships(graphDesc) self.assertEqual(4, len(unmetRelationships)) @@ -98,4 +99,4 @@ def test_removeUnmetRelationships(self): self.assertEqual(1, len(a['consumers'])) self.assertEqual('B', a['consumers'][0]) self.assertFalse('producers' in a) - self.assertFalse('streamingConsumers' in c) \ No newline at end of file + self.assertFalse('streamingConsumers' in c) diff --git a/daliuge-runtime/test/test_io.py b/daliuge-runtime/test/test_io.py index 36dd35cb5..a42db9c97 100644 --- a/daliuge-runtime/test/test_io.py +++ b/daliuge-runtime/test/test_io.py @@ -20,8 +20,10 @@ # MA 02111-1307 USA # import unittest + from dlg.io import NullIO, OpenMode + class TestIO(unittest.TestCase): def test_invalidUseCases(self): @@ -42,4 +44,4 @@ def test_invalidUseCases(self): io.close() # It's OK to close it again - io.close() \ No newline at end of file + io.close() diff --git a/daliuge-runtime/test/test_session.py b/daliuge-runtime/test/test_session.py index 40435162e..88a88a624 100644 --- a/daliuge-runtime/test/test_session.py +++ b/daliuge-runtime/test/test_session.py @@ -22,9 +22,9 @@ import unittest from dlg.ddap_protocol import DROPLinkType, DROPStates, AppDROPStates -from dlg.manager.session import Session, SessionStates -from dlg.exceptions import InvalidGraphException from dlg.droputils import DROPWaiterCtx +from dlg.exceptions import InvalidGraphException +from dlg.manager.session import Session, SessionStates class TestSession(unittest.TestCase): @@ -34,7 +34,7 @@ def test_sessionStates(self): self.assertEqual(SessionStates.PRISTINE, s.status) self.assertRaises(Exception, s.linkGraphParts, '', '', 0) - s.addGraphSpec([{"oid":"A", "type":"container"}]) + s.addGraphSpec([{"oid": "A", "type": "container"}]) self.assertEqual(SessionStates.BUILDING, s.status) s.deploy() @@ -57,24 +57,26 @@ def test_sessionStates_noDrops(self): def test_addGraphSpec(self): with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"container"}]) - s.addGraphSpec([{"oid":"B", "type":"container"}]) - s.addGraphSpec([{"oid":"C", "type":"container"}]) + s.addGraphSpec([{"oid": "A", "type": "container"}]) + s.addGraphSpec([{"oid": "B", "type": "container"}]) + s.addGraphSpec([{"oid": "C", "type": "container"}]) # Adding an existing DROP - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"A", "type":"container"}]) + self.assertRaises(Exception, s.addGraphSpec, [{"oid": "A", "type": "container"}]) # Adding invalid specs - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"app"}]) # missing "storage" - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"plain", "storage":"invalid"}]) # invalid "storage" - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"invalid"}]) # invalid "type" - self.assertRaises(Exception, s.addGraphSpec, [{"oid":"D", "type":"app", "storage":"null", "outputs":["X"]}]) # missing X DROP + self.assertRaises(Exception, s.addGraphSpec, [{"oid": "D", "type": "app"}]) # missing "storage" + self.assertRaises(Exception, s.addGraphSpec, + [{"oid": "D", "type": "plain", "storage": "invalid"}]) # invalid "storage" + self.assertRaises(Exception, s.addGraphSpec, [{"oid": "D", "type": "invalid"}]) # invalid "type" + self.assertRaises(Exception, s.addGraphSpec, + [{"oid": "D", "type": "app", "storage": "null", "outputs": ["X"]}]) # missing X DROP def test_linking(self): with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"container"}]) - s.addGraphSpec([{"oid":"B", "type":"app", "storage":"null", "app":"dlg.apps.crc.CRCApp"}]) - s.addGraphSpec([{"oid":"C", "type":"container"}]) + s.addGraphSpec([{"oid": "A", "type": "container"}]) + s.addGraphSpec([{"oid": "B", "type": "app", "storage": "null", "app": "dlg.apps.crc.CRCApp"}]) + s.addGraphSpec([{"oid": "C", "type": "container"}]) # Link them now s.linkGraphParts('A', 'B', DROPLinkType.CONSUMER) @@ -96,9 +98,9 @@ def test_linking(self): def test_cancel(self): '''Cancels a whole graph execution''' with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"plain", "storage":"memory", 'consumers': ['B']}, - {"oid":"B", "type":"app", "app":"dlg.apps.simple.SleepApp", "sleepTime": 2}, - {"oid":"C", "type":"plain", "storage":"memory", 'producers': ['B']}]) + s.addGraphSpec([{"oid": "A", "type": "plain", "storage": "memory", 'consumers': ['B']}, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 2}, + {"oid": "C", "type": "plain", "storage": "memory", 'producers': ['B']}]) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) s.cancel() @@ -110,11 +112,11 @@ def test_cancel(self): def test_partial_cancel(self): '''Like test_cancel, but only part of the graph should be cancelled''' with Session('1') as s: - s.addGraphSpec([{"oid":"A", "type":"plain", "storage":"memory", 'consumers': ['B']}, - {"oid":"B", "type":"app", "app":"dlg.apps.simple.SleepApp", "sleepTime": 0}, - {"oid":"C", "type":"plain", "storage":"memory", 'producers': ['B'], 'consumers': ['D']}, - {"oid":"D", "type":"app", "app":"dlg.apps.simple.SleepApp", "sleepTime": 10}, - {"oid":"E", "type":"plain", "storage":"memory", 'producers': ['D']}]) + s.addGraphSpec([{"oid": "A", "type": "plain", "storage": "memory", 'consumers': ['B']}, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 0}, + {"oid": "C", "type": "plain", "storage": "memory", 'producers': ['B'], 'consumers': ['D']}, + {"oid": "D", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 10}, + {"oid": "E", "type": "plain", "storage": "memory", 'producers': ['D']}]) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) @@ -128,4 +130,4 @@ def test_partial_cancel(self): for uid in 'ABC': self.assertEqual(DROPStates.COMPLETED, s.drops[uid].status) for uid in 'DE': - self.assertEqual(DROPStates.CANCELLED, s.drops[uid].status) \ No newline at end of file + self.assertEqual(DROPStates.CANCELLED, s.drops[uid].status) diff --git a/daliuge-runtime/test/test_tool.py b/daliuge-runtime/test/test_tool.py index c61f41068..9eb2d1de2 100644 --- a/daliuge-runtime/test/test_tool.py +++ b/daliuge-runtime/test/test_tool.py @@ -33,7 +33,7 @@ def test_cmdhelp(self): """Checks that all dlg commands have a help""" for cmd in tool.commands: p = tool.start_process(cmd, ['-h'], - stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() common.wait_or_kill(p, timeout=10) self.assertEqual(0, p.returncode, 'cmd: %s, out: %s' % ( diff --git a/daliuge-runtime/test/test_utils.py b/daliuge-runtime/test/test_utils.py index 397ffdd7f..10e862931 100644 --- a/daliuge-runtime/test/test_utils.py +++ b/daliuge-runtime/test/test_utils.py @@ -27,7 +27,6 @@ import zlib import six - from dlg import utils @@ -40,7 +39,7 @@ def test_zlib_uncompressed_stream(self): f.write(zlib.compress(b'abc')) # Read parts from the beginning - for b,n in ((b'abc', 3), (b'ab', 2), (b'a', 1)): + for b, n in ((b'abc', 3), (b'ab', 2), (b'a', 1)): with open(fname, 'rb') as f: s = utils.ZlibUncompressedStream(f) self.assertEqual(b, s.read(n)) @@ -56,7 +55,7 @@ def test_zlib_uncompressed_stream(self): os.remove(fname) # Try now with bigger data sizes - for size in [2**x+y for x in range(3,18) for y in (-1,0,1)]: + for size in [2 ** x + y for x in range(3, 18) for y in (-1, 0, 1)]: original_bytes = os.urandom(size) compressed_bytes = zlib.compress(original_bytes) @@ -69,7 +68,7 @@ def test_zlib_uncompressed_stream(self): self.assertEqual(original_bytes, b) # Now read little by little - read_size = min(size//4, 1024); + read_size = min(size // 4, 1024); b = b'' compressed_stream = six.BytesIO(compressed_bytes) uncompressed_stream = utils.ZlibUncompressedStream(compressed_stream) @@ -78,7 +77,6 @@ def test_zlib_uncompressed_stream(self): self.assertEqual(size, len(b)) self.assertEqual(original_bytes, b) - def test_zlib_compressed_stream_writer(self): compressed_ref = zlib.compress(b'abcd') @@ -92,7 +90,7 @@ def test_zlib_compressed_stream_writer(self): self.assertEqual(compressed_ref[0:x], compressed[0:x]) # Try now with bigger data sizes - for size in [2**x+y for x in range(3,18) for y in (-1,0,1)]: + for size in [2 ** x + y for x in range(3, 18) for y in (-1, 0, 1)]: original_bytes = os.urandom(size) compressed_bytes = zlib.compress(original_bytes) @@ -105,7 +103,7 @@ def test_zlib_compressed_stream_writer(self): self.assertEqual(compressed_bytes, b) # Now read little by little - read_size = min(size//4, 1024) + read_size = min(size // 4, 1024) uncompressed_stream = six.BytesIO(original_bytes) compressed_stream = utils.ZlibCompressedStream(uncompressed_stream) b = b'' @@ -122,7 +120,7 @@ def test_zlib_streams_combined_zerobytes(self): def _test_zlib_streams_combined(self, gen_bytes): - sizes = [2**x+y for x in range(1,18) for y in (-1,0,1)] + sizes = [2 ** x + y for x in range(1, 18) for y in (-1, 0, 1)] for size in sizes: original_bytes = gen_bytes(size) @@ -140,7 +138,7 @@ def _test_zlib_streams_combined(self, gen_bytes): self.assertEqual(0, len(uncompressed_stream.read(100))) # Read with given number of bytes - for n in (1, len(original_bytes)//2, len(original_bytes)): + for n in (1, len(original_bytes) // 2, len(original_bytes)): these_bytes = original_bytes[0:n] @@ -157,17 +155,20 @@ def _test_zlib_streams_combined(self, gen_bytes): self.assertEqual(0, len(uncompressed_stream.read(100))) def test_json_stream_simple_sequence(self): - for s in ([0], [{}], ['a'], [{'oid':'A', 'type': 'plain'}]): + for s in ([0], [{}], ['a'], [{'oid': 'A', 'type': 'plain'}]): stream = utils.JSONStream(s) self.assertEqual(s, json.loads(stream.read(100).decode('utf8'))); def test_json_stream_sequences(self): - ref = [1,2,3] - objects_list = [1,2,3] - objects_tuple = (1,2,3) + ref = [1, 2, 3] + objects_list = [1, 2, 3] + objects_tuple = (1, 2, 3) + def objects_gen(): - yield 1; yield 2; yield 3 + yield 1; + yield 2; + yield 3 for objects in (objects_list, objects_tuple, objects_gen()): stream = utils.JSONStream(objects) @@ -192,4 +193,4 @@ def test_get_dlg_root(self): if old: os.environ['DLG_ROOT'] = old else: - del os.environ['DLG_ROOT'] \ No newline at end of file + del os.environ['DLG_ROOT'] diff --git a/daliuge-translator/dlg/__init__.py b/daliuge-translator/dlg/__init__.py index cfb3574be..74d07706f 100644 --- a/daliuge-translator/dlg/__init__.py +++ b/daliuge-translator/dlg/__init__.py @@ -21,4 +21,4 @@ # # Declaring this as a namespace package -__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment \ No newline at end of file +__path__ = __import__('pkgutil').extend_path(__path__, __name__) # @ReservedAssignment diff --git a/daliuge-translator/dlg/dropmake/dm_utils.py b/daliuge-translator/dlg/dropmake/dm_utils.py index 8b9b2ce52..936385caa 100644 --- a/daliuge-translator/dlg/dropmake/dm_utils.py +++ b/daliuge-translator/dlg/dropmake/dm_utils.py @@ -24,10 +24,10 @@ Dropmake utils """ +import copy import json import os import os.path as osp -import copy LG_VER_OLD = 1 LG_VER_EAGLE_CONVERTED = 2 @@ -502,9 +502,9 @@ def convert_construct(lgo): if "group" not in to_node and "group" not in gather_construct: cond1 = True elif ( - "group" in to_node - and "group" in gather_construct - and to_node["group"] == gather_construct["group"] + "group" in to_node + and "group" in gather_construct + and to_node["group"] == gather_construct["group"] ): cond1 = True else: diff --git a/daliuge-translator/dlg/dropmake/dropmake_api.py b/daliuge-translator/dlg/dropmake/dropmake_api.py index 99e2e004c..f5998d853 100644 --- a/daliuge-translator/dlg/dropmake/dropmake_api.py +++ b/daliuge-translator/dlg/dropmake/dropmake_api.py @@ -28,7 +28,6 @@ import os import sys import time - from optparse import OptionParser from .pg_generator import LG, MySarkarPGTP @@ -56,7 +55,7 @@ def gen_mysarkar_pgtp(lgfname, pgt_dir, num_islands=2, if (mpp): pgt.to_gojs_json(string_rep=False, visual=False) pgt.merge_partitions(num_islands, form_island=True, - island_type=1, visual=False) + island_type=1, visual=False) schedule_ett = time.time() re_dict = pgt.result() re_dict['unroll_time'] = '%.3f' % (unroll_ett - stt) @@ -67,6 +66,7 @@ def gen_mysarkar_pgtp(lgfname, pgt_dir, num_islands=2, print(part_info) return re_dict + if __name__ == '__main__': """ example usage: @@ -79,19 +79,19 @@ def gen_mysarkar_pgtp(lgfname, pgt_dir, num_islands=2, """ parser = OptionParser() parser.add_option("-l", "--lgfname", action="store", type="string", - dest="lgfname", help="logical graph full name") + dest="lgfname", help="logical graph full name") parser.add_option("-p", "--pgtdir", action="store", type="string", - dest="pgt_dir", help="Directory to dump pgt") + dest="pgt_dir", help="Directory to dump pgt") parser.add_option("-i", "--islands", action="store", type="int", - dest="num_islands", help="number of compute islands", - default=2) + dest="num_islands", help="number of compute islands", + default=2) parser.add_option("-c", "--cores", action="store", type="int", - dest="cores_per_node", default=2, - help="number of cores per compute node") + dest="cores_per_node", default=2, + help="number of cores per compute node") parser.add_option("-r", "--print", action="store_true", dest="print_result", - default=False, help="Print result on screen") + default=False, help="Print result on screen") parser.add_option("-d", "--dump_progress", action="store_true", dest="dump_progress", - default=False, help="Dump progress during scheduling") + default=False, help="Dump progress during scheduling") (options, args) = parser.parse_args() if (None == options.lgfname or None == options.pgt_dir): diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 03a24191e..e42a334ca 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -48,7 +48,6 @@ """ -from collections import defaultdict import collections import datetime import json @@ -58,25 +57,25 @@ import random import string import time +from collections import defaultdict from itertools import product import networkx as nx import numpy as np import six -from .scheduler import MySarkarScheduler, DAGUtil, MinNumPartsScheduler, PSOScheduler -from .utils.bash_parameter import BashCommand -from ..common import dropdict -from ..common import STORAGE_TYPES from .dm_utils import ( get_lg_ver_type, convert_construct, convert_fields, convert_mkn, LG_VER_EAGLE, - LG_VER_OLD, LG_VER_EAGLE_CONVERTED, ) +from .scheduler import MySarkarScheduler, DAGUtil, MinNumPartsScheduler, PSOScheduler +from .utils.bash_parameter import BashCommand +from ..common import STORAGE_TYPES +from ..common import dropdict logger = logging.getLogger(__name__) @@ -197,10 +196,10 @@ def add_child(self, lg_node): Add a group member """ if ( - lg_node.is_group() - and not (lg_node.is_scatter()) - and not (lg_node.is_loop()) - and not (lg_node.is_groupby()) + lg_node.is_group() + and not (lg_node.is_scatter()) + and not (lg_node.is_loop()) + and not (lg_node.is_groupby()) ): raise GInvalidNode( "Only Scatters or Loops can be nested, but {0} is neither".format( @@ -323,23 +322,23 @@ def is_dag_root(self): def is_start_listener(self): return ( - len(self.inputs) == 1 - and self.inputs[0].jd["category"] == "Start" - and self.jd["category"] in STORAGE_TYPES + len(self.inputs) == 1 + and self.inputs[0].jd["category"] == "Start" + and self.jd["category"] in STORAGE_TYPES ) def is_group_start(self): return ( - self.has_group() - and "group_start" in self.jd - and 1 == int(self.jd["group_start"]) + self.has_group() + and "group_start" in self.jd + and 1 == int(self.jd["group_start"]) ) def is_group_end(self): return ( - self.has_group() - and "group_end" in self.jd - and 1 == int(self.jd["group_end"]) + self.has_group() + and "group_end" in self.jd + and 1 == int(self.jd["group_end"]) ) def is_group(self): @@ -611,7 +610,7 @@ def _create_test_drop_spec(self, oid, rank, kwargs): if fp: kwargs["filepath"] = fp elif ( - drop_type == "Component" + drop_type == "Component" ): # default generic component becomes "sleep and copy" if "appclass" not in self.jd or len(self.jd["appclass"]) == 0: app_class = "dlg.apps.simple.SleepApp" @@ -989,7 +988,7 @@ def json(self): # return self.to_gojs_json() def merge_partitions( - self, new_num_parts, form_island=False, island_type=0, visual=False + self, new_num_parts, form_island=False, island_type=0, visual=False ): raise Exception("Not implemented. Call sub-class") @@ -1220,14 +1219,14 @@ class MetisPGTP(PGT): """ def __init__( - self, - drop_list, - num_partitions=1, - min_goal=0, - par_label="Partition", - ptype=0, - ufactor=10, - merge_parts=False, + self, + drop_list, + num_partitions=1, + min_goal=0, + par_label="Partition", + ptype=0, + ufactor=10, + merge_parts=False, ): """ num_partitions: number of partitions supplied by users (int) @@ -1455,7 +1454,7 @@ def to_gojs_json(self, string_rep=True, outdict=None, visual=False): return jsobj def merge_partitions( - self, new_num_parts, form_island=False, island_type=0, visual=False + self, new_num_parts, form_island=False, island_type=0, visual=False ): """ This is called during resource mapping - deploying partitioned PGT to @@ -1523,9 +1522,9 @@ def merge_partitions( self._num_parts_done = new_num_parts else: if ( - island_type == 1 - and (self.dag is not None) - and (self._metis_out is not None) + island_type == 1 + and (self.dag is not None) + and (self._metis_out is not None) ): # update intra-comp_island edge weight given it has a different # bandwith compared to inter-comp_island @@ -1564,12 +1563,12 @@ class MySarkarPGTP(PGT): """ def __init__( - self, - drop_list, - num_partitions=0, - par_label="Partition", - max_dop=8, - merge_parts=False, + self, + drop_list, + num_partitions=0, + par_label="Partition", + max_dop=8, + merge_parts=False, ): """ num_partitions: 0 - only do the initial logical partition @@ -1611,7 +1610,7 @@ def _extra_result(self, ret): ret["num_parts"] = self._num_parts_done def merge_partitions( - self, new_num_parts, form_island=False, island_type=0, visual=False + self, new_num_parts, form_island=False, island_type=0, visual=False ): """ This is called during resource mapping - deploying partitioned PGT to @@ -1678,7 +1677,7 @@ def merge_partitions( for e in self.dag.edges(data=True): # update edege weights within the same compute island if in_out_part_map.get( - key_dict[e[0]] - start_k, -0.1 + key_dict[e[0]] - start_k, -0.1 ) == in_out_part_map.get(key_dict[e[1]] - start_k, -0.2): # print("e[2]['weight'] =", e[2]['weight']) e[2]["weight"] /= self._bw_ratio @@ -1786,14 +1785,14 @@ def to_gojs_json(self, string_rep=True, outdict=None, visual=False): class MinNumPartsPGTP(MySarkarPGTP): def __init__( - self, - drop_list, - deadline, - num_partitions=0, - par_label="Partition", - max_dop=8, - merge_parts=False, - optimistic_factor=0.5, + self, + drop_list, + deadline, + num_partitions=0, + par_label="Partition", + max_dop=8, + merge_parts=False, + optimistic_factor=0.5, ): """ num_partitions: 0 - only do the initial logical partition @@ -1824,14 +1823,14 @@ def init_scheduler(self): class PSOPGTP(MySarkarPGTP): def __init__( - self, - drop_list, - par_label="Partition", - max_dop=8, - deadline=None, - topk=30, - swarm_size=40, - merge_parts=False, + self, + drop_list, + par_label="Partition", + max_dop=8, + deadline=None, + topk=30, + swarm_size=40, + merge_parts=False, ): """ PSO-based PGTP @@ -1913,9 +1912,9 @@ def __init__(self, f, ssid=None): for lgn in all_list: if ( - lgn.is_start() - and lgn.jd["category"] != "Comment" - and lgn.jd["category"] != "Description" + lgn.is_start() + and lgn.jd["category"] != "Comment" + and lgn.jd["category"] != "Description" ): if lgn.jd["category"] == "Variables": self._g_var.append(lgn) @@ -1960,9 +1959,9 @@ def validate_link(self, src, tgt): if src.is_gather(): if not ( - tgt.jd["category"] in APP_DROP_TYPES - and tgt.is_group_start() - and src.inputs[0].h_level == tgt.h_level + tgt.jd["category"] in APP_DROP_TYPES + and tgt.is_group_start() + and src.inputs[0].h_level == tgt.h_level ): raise GInvalidLink( "Gather {0}'s output {1} must be a Group-Start Component inside a Group with the same H level as Gather's input".format( @@ -2101,9 +2100,9 @@ def lgn_to_pgn(self, lgn, iid="0", lpcxt=None): self._lg_links.append(lk) else: for ( - gs + gs ) in ( - gs_list + gs_list ): # add artificial logical links to the "first" children lgn.add_input(gs) gs.add_output(lgn) @@ -2144,7 +2143,7 @@ def get_child_lp_ctx(idx): miid += "${0}".format("-".join(grp_h)) if ( - extra_links_drops and not lgn.is_loop() + extra_links_drops and not lgn.is_loop() ): # make GroupBy and Gather drops src_gdrop = lgn.make_single_drop(miid) self._drop_dict[lgn.id].append(src_gdrop) @@ -2175,7 +2174,7 @@ def _split_list(l, n): Yield successive n-sized chunks from l. """ for i in range(0, len(l), n): - yield l[i : i + n] + yield l[i: i + n] def _unroll_gather_as_output(self, slgn, tlgn, sdrops, tdrops, chunk_size, llink): if slgn.h_level < tlgn.h_level: @@ -2322,7 +2321,7 @@ def unroll_to_tpl(self): # 1. GroupBy's "natual" output must be a Scatter (i.e. group) # 2. Scatter "naturally" does not have output if ( - slgn.is_gather() and tlgn.gid != sid + slgn.is_gather() and tlgn.gid != sid ): # not the artifical link between gather and its own start child # gather iteration case, tgt must be a Group-Start Component # this is a way to manually sequentialise a Scatter that has a high DoP @@ -2337,7 +2336,7 @@ def unroll_to_tpl(self): if j >= tlgn.group.dop and j % tlgn.group.dop == 0: continue while j < (i + 2) * slgn.gather_width and j < tlgn.group.dop * ( - i + 1 + i + 1 ): gather_input_list = self._gather_cache[ga_drop["oid"]][1] # TODO merge this code into the function @@ -2369,11 +2368,11 @@ def unroll_to_tpl(self): if slgn.is_start_node() or tlgn.is_end_node(): continue elif ( - (slgn.group is not None) - and slgn.group.is_loop() - and slgn.gid == tlgn.gid - and slgn.is_group_end() - and tlgn.is_group_start() + (slgn.group is not None) + and slgn.group.is_loop() + and slgn.gid == tlgn.gid + and slgn.is_group_end() + and tlgn.is_group_start() ): # Re-link to the next iteration's start lsd = len(sdrops) @@ -2389,7 +2388,7 @@ def unroll_to_tpl(self): # pass loop_chunk_size = slgn.group.dop for i, chunk in enumerate( - self._split_list(sdrops, loop_chunk_size) + self._split_list(sdrops, loop_chunk_size) ): # logger.debug("{0} ** {1}".format(i, loop_chunk_size)) for j, sdrop in enumerate(chunk): @@ -2408,11 +2407,11 @@ def unroll_to_tpl(self): # if (i < lsd - 1): # self._link_drops(slgn, tlgn, sdrop, tdrops[i + 1]) elif ( - slgn.group is not None - and slgn.group.is_loop() - and tlgn.group is not None - and tlgn.group.is_loop() - and (not slgn.h_related(tlgn)) + slgn.group is not None + and slgn.group.is_loop() + and tlgn.group is not None + and tlgn.group.is_loop() + and (not slgn.h_related(tlgn)) ): # stepwise locking for links between two Loops for sdrop, tdrop in product(sdrops, tdrops): @@ -2421,10 +2420,10 @@ def unroll_to_tpl(self): else: lpaw = ("%s-%s" % (sid, tid)) in self_loop_aware_set if ( - slgn.group is not None - and slgn.group.is_loop() - and lpaw - and slgn.h_level > tlgn.h_level + slgn.group is not None + and slgn.group.is_loop() + and lpaw + and slgn.h_level > tlgn.h_level ): loop_iter = slgn.group.dop for i, chunk in enumerate(self._split_list(sdrops, chunk_size)): @@ -2433,10 +2432,10 @@ def unroll_to_tpl(self): if j % loop_iter == loop_iter - 1: self._link_drops(slgn, tlgn, sdrop, tdrops[i], lk) elif ( - tlgn.group is not None - and tlgn.group.is_loop() - and lpaw - and slgn.h_level < tlgn.h_level + tlgn.group is not None + and tlgn.group.is_loop() + and lpaw + and slgn.h_level < tlgn.h_level ): loop_iter = tlgn.group.dop for i, chunk in enumerate(self._split_list(tdrops, chunk_size)): @@ -2465,7 +2464,7 @@ def unroll_to_tpl(self): # the last bit of iid (current h id) is the local GrougBy key, i.e. inner most loop context id gby = src_ctx[-1] if ( - slgn.h_level - 2 == tlgn.h_level and tlgn.h_level > 0 + slgn.h_level - 2 == tlgn.h_level and tlgn.h_level > 0 ): # groupby itself is nested inside a scatter # group key consists of group context id + inner most loop context id gctx = "/".join(src_ctx[0:-2]) @@ -2656,13 +2655,13 @@ def known_algorithms(): def partition( - pgt, - algo, - num_partitions=1, - num_islands=1, - partition_label="partition", - show_gojs=False, - **algo_params + pgt, + algo, + num_partitions=1, + num_islands=1, + partition_label="partition", + show_gojs=False, + **algo_params ): """Partitions a Physical Graph Template""" diff --git a/daliuge-translator/dlg/dropmake/pg_manager.py b/daliuge-translator/dlg/dropmake/pg_manager.py index 96c226cbc..6dadea129 100644 --- a/daliuge-translator/dlg/dropmake/pg_manager.py +++ b/daliuge-translator/dlg/dropmake/pg_manager.py @@ -22,15 +22,15 @@ Refer to https://confluence.ska-sdp.org/display/PRODUCTTREE/C.1.2.4.4.4+DFM+Physical+Graph+Manager """ +import json import os -import threading, json +import threading import numpy as np from .pg_generator import GraphException from .scheduler import DAGUtil, SchedulerException - MAX_PGT_FN_CNT = 300 diff --git a/daliuge-translator/dlg/dropmake/pg_mapper.py b/daliuge-translator/dlg/dropmake/pg_mapper.py index 478b84d89..3158af4b3 100644 --- a/daliuge-translator/dlg/dropmake/pg_mapper.py +++ b/daliuge-translator/dlg/dropmake/pg_mapper.py @@ -61,23 +61,25 @@ """ from .pg_generator import GraphException + class ResourceCapability(object): """ Currently assume compute nodes are all homogeneous as defined in SDP Compute Island """ + def __init__(self, num_island, num_nodes_per_island, - num_cores_per_node, intra_inter_ratio): + num_cores_per_node, intra_inter_ratio): """ intra_inter_ratio: ratio between intra-island bandwith and inter-island bandwidth (integer and should be >= 1) """ if (intra_inter_ratio < 1): - raise GraphException('Invalid intra_inter_ratio {0}'\ - .format(intra_inter_ratio)) + raise GraphException('Invalid intra_inter_ratio {0}' \ + .format(intra_inter_ratio)) self._num_island = num_island self._num_nodes_pi = num_nodes_per_island - self._num_cores_pn = num_cores_per_node # per compute node + self._num_cores_pn = num_cores_per_node # per compute node self._island_ratio = float(intra_inter_ratio) self._ttnodes = num_island * num_nodes_per_island @@ -88,7 +90,7 @@ def bandwidth(self, nodeA, nodeB): if (nodeA >= self._ttnodes or nodeB >= self._ttnodes): raise GraphException('Invalid node id') gap = nodeA // self._num_nodes_pi - nodeB // self._num_nodes_pi - return self._island_ratio if gap == 0 else 1.0 + return self._island_ratio if gap == 0 else 1.0 def avg_comp_cost(self, drop, comp_node): """ @@ -106,5 +108,6 @@ def avg_comm_cost(self, drop_edge_weight): return (drop_edge_weight / 1.0 + drop_edge_weight / self._island_ratio) / 2 + class ResourceAvailability(ResourceCapability): pass diff --git a/daliuge-translator/dlg/dropmake/plot_lpl_parts.py b/daliuge-translator/dlg/dropmake/plot_lpl_parts.py index f05c7fe92..9fe16eb34 100644 --- a/daliuge-translator/dlg/dropmake/plot_lpl_parts.py +++ b/daliuge-translator/dlg/dropmake/plot_lpl_parts.py @@ -1,7 +1,11 @@ -import os, csv, itertools, sys -import pandas as pd -import numpy as np +import itertools +import os +import sys + import matplotlib.pyplot as plt +import numpy as np +import pandas as pd + def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): min_y = 1e6 @@ -12,7 +16,7 @@ def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): max_z = -1 fig = plt.figure() ax = fig.add_subplot(111) - #ax.set_title('Disk cache hits ratio as a function of disk capacity and replacement policy', fontsize=17) + # ax.set_title('Disk cache hits ratio as a function of disk capacity and replacement policy', fontsize=17) ax.set_xlabel('# of partitions', fontsize=16) ax.set_ylabel("PGT completion time (relative)", fontsize=16) ax.grid(True) @@ -34,17 +38,18 @@ def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): max_x = max(max_x, np.max(x)) min_z = min(min_z, np.min(z)) max_z = max(max_z, np.max(z)) - lbl = fn.split(prefix)[1].split(suffix)[0].replace('_', '')\ - .replace('img', '_img') + lbl = fn.split(prefix)[1].split(suffix)[0].replace('_', '') \ + .replace('img', '_img') print(lbl) lsn = linestyle.next() - lineobj = ax.plot(x, y, label=lbl, linestyle=lsn, linewidth=3)#, marker=marker.next(), markerfacecolor='white') + lineobj = ax.plot(x, y, label=lbl, linestyle=lsn, + linewidth=3) # , marker=marker.next(), markerfacecolor='white') ax2.plot(x, z, label='%s Median DoP' % (lbl), linestyle='', linewidth=3, - marker=marker.next(), markerfacecolor='None', markersize=7, - markeredgecolor=lineobj[0].get_color()) - #fig.gca().invert_xaxis() - legend = ax.legend(loc="upper left", shadow=False, prop={'size':15}) - legend = ax2.legend(loc="center left", shadow=False, prop={'size':15}) + marker=marker.next(), markerfacecolor='None', markersize=7, + markeredgecolor=lineobj[0].get_color()) + # fig.gca().invert_xaxis() + legend = ax.legend(loc="upper left", shadow=False, prop={'size': 15}) + legend = ax2.legend(loc="center left", shadow=False, prop={'size': 15}) ax.set_xlim([max_x + 10, min_x - 10]) ax.set_ylim([min_y - 10, max_y + 10]) ax2.set_ylim([min_z - 1, max_z + 1]) @@ -57,11 +62,12 @@ def plot_lpl_parts(folder, prefix='lpl_parts', suffix='.csv'): plt.show() -if __name__=="__main__": + +if __name__ == "__main__": if (len(sys.argv) == 2): fd = sys.argv[1] else: - fd = '/Users/Chen/Documents/logical_physical_mapping/Daliuge_paper'\ - '/DropMake_Paper' + fd = '/Users/Chen/Documents/logical_physical_mapping/Daliuge_paper' \ + '/DropMake_Paper' print(fd) plot_lpl_parts(fd) diff --git a/daliuge-translator/dlg/dropmake/scheduler.py b/daliuge-translator/dlg/dropmake/scheduler.py index 23b62338b..90eea891e 100644 --- a/daliuge-translator/dlg/dropmake/scheduler.py +++ b/daliuge-translator/dlg/dropmake/scheduler.py @@ -1,4 +1,3 @@ - # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) @@ -20,37 +19,38 @@ # MA 02111-1307 USA # +import copy import logging import os import platform import random import time -import copy -import pkg_resources +from collections import defaultdict import networkx as nx import numpy as np +import pkg_resources from pyswarm import pso -from collections import defaultdict from .utils.anneal import Annealer -from .utils.mcts import DAGTree, MCTS from .utils.antichains import get_max_weighted_antichain - +from .utils.mcts import DAGTree, MCTS from ..common import dropdict, get_roots - logger = logging.getLogger(__name__) DEBUG = 0 + class SchedulerException(Exception): pass + class Schedule(object): """ The scheduling solution with schedule-related properties """ + def __init__(self, dag, max_dop): self._dag = dag self._max_dop = max_dop if type(max_dop) == int else max_dop.get('num_cpus', 1) @@ -62,7 +62,7 @@ def __init__(self, dag, max_dop): @property def makespan(self): return self._lpl[1] - + @property def longest_path(self): return self._lpl[0] @@ -85,9 +85,9 @@ def schedule_matrix(self): lpl_c += ww logger.debug("lpl: %s", " -> ".join(lpl_str)) logger.debug("lplt = %d", int(lpl_c)) - + M = self._max_dop - #print("N (makespan) is ", N, "M is ", M) + # print("N (makespan) is ", N, "M is ", M) ma = np.zeros((M, N), dtype=int) pr = np.zeros((M), dtype=int) last_pid = -1 @@ -112,16 +112,19 @@ def schedule_matrix(self): found = i break if (found is None): - raise SchedulerException("Cannot find a idle PID, max_dop provided: {0}, actual max_dop: {1}\n Graph: {2}".format(M, - 'DAGUtil.get_max_dop(G)', G.nodes(data=True))) - #DAGUtil.get_max_dop(G), G.nodes(data=True))) + raise SchedulerException( + "Cannot find a idle PID, max_dop provided: {0}, actual max_dop: {1}\n Graph: {2}".format(M, + 'DAGUtil.get_max_dop(G)', + G.nodes( + data=True))) + # DAGUtil.get_max_dop(G), G.nodes(data=True))) curr_pid = found ma[curr_pid, stt:edt] = n pr[curr_pid] = edt last_pid = curr_pid prev_n = n self._sma = ma - #print(ma) + # print(ma) return self._sma @property @@ -134,8 +137,8 @@ def workload(self): ma = self.schedule_matrix c = [] for i in range(ma.shape[1]): - c.append(np.count_nonzero(ma[:,i])) - self._wkl = int(np.mean(np.array(c))) # since METIS only accepts integer + c.append(np.count_nonzero(ma[:, i])) + self._wkl = int(np.mean(np.array(c))) # since METIS only accepts integer return self._wkl @property @@ -145,6 +148,7 @@ def efficiency(self): """ return int(float(self.workload) / self._max_dop * 100) + class Partition(object): """ Logical partition, multiple (1 ~ N) of these can be placed onto a single @@ -152,6 +156,7 @@ class Partition(object): Logical partition can be nested, and it somewhat resembles the `dlg.manager.drop_manager` """ + def __init__(self, gid, max_dop): """ gid: cluster/partition id (string) @@ -160,7 +165,7 @@ def __init__(self, gid, max_dop): self._gid = gid self._dag = nx.DiGraph() self._ask_max_dop = max_dop - self._max_antichains = None # a list of max (width) antichains + self._max_antichains = None # a list of max (width) antichains self._lpl = None self._schedule = None self._max_dop = None @@ -201,9 +206,9 @@ def can_merge(self, that): else: return False - #TODO re-implement this performance hog! - #self._tmp_merge_dag = nx.compose(self._dag, that._dag) - #return DAGUtil.get_max_dop(self._tmp_merge_dag) <= self._ask_max_dop + # TODO re-implement this performance hog! + # self._tmp_merge_dag = nx.compose(self._dag, that._dag) + # return DAGUtil.get_max_dop(self._tmp_merge_dag) <= self._ask_max_dop def merge(self, that): if (self._tmp_merge_dag is not None): @@ -212,11 +217,10 @@ def merge(self, that): else: self._dag = nx.compose(self._dag, that._dag) - #self._max_dop - - #TODO add this performance hog! - #self._max_antichains = None + # self._max_dop + # TODO add this performance hog! + # self._max_antichains = None def can_add(self, u, v, gu, gv): """ @@ -235,8 +239,9 @@ def can_add(self, u, v, gu, gv): if (DEBUG): slow_max = DAGUtil.get_max_antichains(self._dag) fast_max = self._max_antichains - info = "Before: {0} - slow max: {1}, fast max: {2}, u: {3}, v: {4}, unew:{5}, vnew:{6}".format(self._dag.edges(), - slow_max, fast_max, u, v, unew, vnew) + info = "Before: {0} - slow max: {1}, fast max: {2}, u: {3}, v: {4}, unew:{5}, vnew:{6}".format( + self._dag.edges(), + slow_max, fast_max, u, v, unew, vnew) logger.debug(info) if (len(slow_max) != len(fast_max)): raise SchedulerException("ERROR - {0}".format(info)) @@ -249,9 +254,9 @@ def can_add(self, u, v, gu, gv): mydop = DAGUtil.get_max_dop(self._dag) else: mydop = self.probe_max_dop(u, v, unew, vnew) - #TODO - put the following code in a unit test! + # TODO - put the following code in a unit test! if (DEBUG): - mydop_slow = DAGUtil.get_max_dop(self._dag)# + mydop_slow = DAGUtil.get_max_dop(self._dag) # if (mydop_slow != mydop): err_msg = "u = {0}, v = {1}, unew = {2}, vnew = {3}".format(u, v, unew, vnew) raise SchedulerException("{2}: mydop = {0}, mydop_slow = {1}".format(mydop, mydop_slow, err_msg)) @@ -277,7 +282,7 @@ def add(self, u, v, gu, gv, sequential=False, global_dag=None): self._dag.add_node(v, weight=vw, num_cpus=gv['num_cpus']) self._dag.add_edge(u, v) - if (unew and vnew): # we know this is fast + if (unew and vnew): # we know this is fast self._max_antichains = DAGUtil.get_max_antichains(self._dag) self._max_dop = 1 else: @@ -309,7 +314,7 @@ def add(self, u, v, gu, gv, sequential=False, global_dag=None): global_dag.remove_edge(udo, v) self._max_dop = self.probe_max_dop(u, v, unew, vnew, update=True) - #self._max_dop = DAGUtil.get_max_dop(self._dag)# this is too slow! + # self._max_dop = DAGUtil.get_max_dop(self._dag)# this is too slow! def remove(self, n): """ @@ -355,8 +360,8 @@ def probe_max_dop(self, u, v, unew, vnew, update=False): raise SchedulerException("u v are both new/old") new_ac = [] md = 1 - for ma in self._max_antichains: # missing elements in the current max_antichains! - #incremental updates + for ma in self._max_antichains: # missing elements in the current max_antichains! + # incremental updates found = False for n in ma: if (n in ups): @@ -370,7 +375,7 @@ def probe_max_dop(self, u, v, unew, vnew, update=False): md = len(mma) elif (len(ma) > md): md = len(ma) - new_ac.append(ma) # carry over, then prune it + new_ac.append(ma) # carry over, then prune it if (len(new_ac) > 0): self._tmp_new_ac = (new_ac, md) if (update): @@ -378,10 +383,12 @@ def probe_max_dop(self, u, v, unew, vnew, update=False): return md else: raise SchedulerException("No antichains") + @property def cardinality(self): return len(self._dag.nodes()) + class DilworthPartition(Partition): """ Use Dilworth theorem to determine DoP @@ -405,6 +412,7 @@ class DilworthPartition(Partition): from growing dag """ + def __init__(self, gid, max_dop): super(DilworthPartition, self).__init__(gid, max_dop) self._bpg = nx.Graph() @@ -509,6 +517,7 @@ def merge(self, that): # we could recalcuate it again, but we are lazy! raise SchedulerException("can_merge was not probed before add()") + class WeightedDilworthPartition(DilworthPartition): """ The extensions on DilworthPartition @@ -539,6 +548,7 @@ class WeightedDilworthPartition(DilworthPartition): in the case of the CHILES2 pipeline. Some techniques may be applicable e.g. http://www.sciencedirect.com/science/article/pii/S0196677483710175 """ + def __init__(self, gid, max_dop, global_dag=None): super(WeightedDilworthPartition, self).__init__(gid, max_dop) self._global_dag = global_dag @@ -570,40 +580,40 @@ def get_nb_cpus(node_id): tmp_added = [] for el, elnew, elcpu in [(u, unew, ucpus), (v, vnew, vcpus)]: if (elnew): - el_des = nx.descendants(dag, el) # already a set + el_des = nx.descendants(dag, el) # already a set el_pred = set(dag.predecessors(el)) if (self._check_global_dag): - part_node_set = set(dag.node) # node set + part_node_set = set(dag.node) # node set self_set = set([el]) rem = part_node_set - el_des - self_set for rel in rem: - #check path on the global dag + # check path on the global dag if (nx.has_path(global_dag, el, rel)): el_des.add(rel) - #print("caught missing global edge 0") + # print("caught missing global edge 0") rem = part_node_set - el_pred - self_set for rel in rem: - #check path on the global dag + # check path on the global dag if (nx.has_path(global_dag, rel, el)): el_pred.add(rel) - #print("caught missing global edge 1") + # print("caught missing global edge 1") for i in range(elcpu): child_r = '{0}{1}_r'.format(el, i) self_bpg.add_node(child_r, bipartite=1) tmp_added.append(child_r) for uup in el_pred: for j in range(get_nb_cpus(uup)): - self_bpg.add_edge('{0}{1}_l'.\ - format(uup, j), child_r) + self_bpg.add_edge('{0}{1}_l'. \ + format(uup, j), child_r) child_l = '{0}{1}_l'.format(el, i) self_bpg.add_node(child_l, bipartite=0) tmp_added.append(child_l) for udown in el_des: for k in range(get_nb_cpus(udown)): - self_bpg.add_edge(child_l, '{0}{1}_r'.\ - format(udown, k)) + self_bpg.add_edge(child_l, '{0}{1}_r'. \ + format(udown, k)) mat = nx.bipartite.hopcroft_karp_matching(self_bpg) mydop = len(self_bpg.node) / 2 - len(mat) / 2 @@ -639,7 +649,7 @@ def get_nb_cpus(mdag, node_id): that = set(that_dag.nodes()) this_dag = self._dag this = set(this_dag.nodes()) - part_node_set = set(this_dag.node) # node set + part_node_set = set(this_dag.node) # node set def cross_over(one, one_dag, two, two_dag): for el in one: @@ -648,17 +658,17 @@ def cross_over(one, one_dag, two, two_dag): if (self._check_global_dag): rem = part_node_set - el_des - self_set for rel in rem: - #check path on the global dag + # check path on the global dag if (nx.has_path(global_dag, el, rel)): el_des.add(rel) - #print("caught missing global edge 2") + # print("caught missing global edge 2") for udown in el_des: if udown in two: # M x N cartesian product for i in range(get_nb_cpus(one_dag, el)): for j in range(get_nb_cpus(two_dag, udown)): self_bpg_tmp.add_edge('{0}{1}_l'.format(el, i), - '{0}{1}_r'.format(udown, j)) + '{0}{1}_r'.format(udown, j)) # match this_left with that_right cross_over(this, this_dag, that, that_dag) @@ -677,9 +687,11 @@ def cross_over(one, one_dag, two, two_dag): self._tmp_max_dop = mydop return canmerge + class MultiWeightPartition(Partition): """ """ + def __init__(self, gid, max_dops, w_attrs=['num_cpus'], global_dag=None): if (type(max_dops) == int): @@ -691,7 +703,7 @@ def __init__(self, gid, max_dops, w_attrs=['num_cpus'], self._tmp_max_dops = None self._global_dag = global_dag self._check_global_dag = global_dag is not None - self._tc = defaultdict(set) #transitive closure + self._tc = defaultdict(set) # transitive closure self._w_attrs = w_attrs self._tc_time = 0.0 self._ac_sort_time = 0.0 @@ -706,17 +718,16 @@ def _add_to_tc(self, tc, el, dag, tmp_dag_list): the dag after the topological sort is done """ stt = time.time() - el_des = nx.descendants(dag, el) # already a set + el_des = nx.descendants(dag, el) # already a set el_pred = set(dag.predecessors(el)) if (self._check_global_dag): - part_node_set = set(dag.node) - set([el]) # node set + part_node_set = set(dag.node) - set([el]) # node set rem = part_node_set - el_des global_dag = self._global_dag for rel in rem: if ((not rel in tc[el]) and - nx.has_path(global_dag, el, rel)): - + nx.has_path(global_dag, el, rel)): el_des.add(rel) tmp_dag_list.append((el, rel)) dag.add_edge(el, rel) @@ -724,8 +735,7 @@ def _add_to_tc(self, tc, el, dag, tmp_dag_list): rem = part_node_set - el_pred for rel in rem: if ((not el in tc[rel]) and - nx.has_path(global_dag, rel, el)): - + nx.has_path(global_dag, rel, el)): el_pred.add(rel) tmp_dag_list.append((rel, el)) dag.add_edge(rel, el) @@ -748,8 +758,8 @@ def _get_w_antichain_len(self, tc, dag): stt = time.time() dag_node = dag.node N = list(dag) - num_nodes = len(N) # nodes - I = {u: i for i, u in enumerate(N)} # node indices + num_nodes = len(N) # nodes + I = {u: i for i, u in enumerate(N)} # node indices def antichains(): """ @@ -770,10 +780,10 @@ def antichains(): while stack: x = stack.pop() new_antichain = antichain + [x] - #stt = time.time() + # stt = time.time() new_stack = [ t for t in stack if not ((t in tc[x]) or (x in tc[t]))] - #self._ac_mem_time += time.time() - stt + # self._ac_mem_time += time.time() - stt antichains_stacks.append((new_antichain, new_stack)) stt = time.time() @@ -908,12 +918,14 @@ def merge(self, that): # we could recalcuate it again, but we are lazy! raise SchedulerException("can_merge was not probed before add()") + class KFamilyPartition(Partition): """ A special case (K = 1) of the Maximum Weighted K-families based on the Theorem 3.1 in http://fmdb.cs.ucla.edu/Treports/930014.pdf """ + def __init__(self, gid, max_dop, global_dag=None): """ max_dop: dict with key: resource_attributes (string) @@ -927,7 +939,7 @@ def __init__(self, gid, max_dop, global_dag=None): pass else: raise SchedulerException('Invalid max_dop type: %r' % mtype) - + super(KFamilyPartition, self).__init__(gid, max_dop) self._bpg = nx.DiGraph() self._global_dag = global_dag @@ -951,20 +963,20 @@ def add_node(self, u): self._dag.add_node(u, **kwargs) for k in self._w_attr: self._tmp_max_dop[k] = get_max_weighted_antichain(self._dag, w_attr=k)[0] - self._max_dop = self._tmp_max_dop + self._max_dop = self._tmp_max_dop def can_merge(self, that, u, v): """ """ dag = nx.compose(self._dag, that._dag) - if (u is not None ): + if (u is not None): dag.add_edge(u, v) tmp_max_dop = copy.deepcopy(self._tmp_max_dop) for _w_attr in self._w_attr: mydop = get_max_weighted_antichain(dag, w_attr=_w_attr)[0] curr_max = max(self._max_dop[_w_attr], that._max_dop[_w_attr]) - + if (mydop <= curr_max): # if you don't increase DoP, we accept that immediately tmp_max_dop[_w_attr] = curr_max @@ -972,8 +984,8 @@ def can_merge(self, that, u, v): return False else: tmp_max_dop[_w_attr] = mydop - - self._tmp_max_dop = tmp_max_dop # only change it when returning True + + self._tmp_max_dop = tmp_max_dop # only change it when returning True return True def merge(self, that, u, v): @@ -982,12 +994,13 @@ def merge(self, that, u, v): self._dag.add_edge(u, v) if (self._tmp_max_dop is not None): self._max_dop = self._tmp_max_dop - #print("Gid %d just merged with DoP %d" % (self._gid, self._tmp_max_dop)) + # print("Gid %d just merged with DoP %d" % (self._gid, self._tmp_max_dop)) else: # we could recalcuate it again, but we are lazy! raise SchedulerException("can_merge was not probed before add()") -class Scheduler(object): + +class Scheduler(object): """ Static Scheduling consists of three steps: 1. partition the DAG into an optimal number (M) of partitions @@ -1008,9 +1021,9 @@ def __init__(self, drop_list, max_dop=8, dag=None): else: self._dag = dag self._max_dop = max_dop - self._parts = None # partitions - self._part_dict = dict() #{gid : part} - self._part_edges = [] # edges amongst all partitions + self._parts = None # partitions + self._part_dict = dict() # {gid : part} + self._part_edges = [] # edges amongst all partitions def partition_dag(self): raise SchedulerException("Not implemented. Try subclass instead") @@ -1036,9 +1049,9 @@ def merge_partitions(self, num_partitions, bal_cond=1): else: G.graph['node_weight_attr'] = 'cc' for part in self._parts: - #sc = part.schedule + # sc = part.schedule pdop = part._max_dop - #TODO add memory as one of the LB condition too + # TODO add memory as one of the LB condition too cc_eval = pdop if type(pdop) == int else pdop.get('num_cpus', 1) G.add_node(part.partition_id, cc=cc_eval) @@ -1047,30 +1060,30 @@ def merge_partitions(self, num_partitions, bal_cond=1): v = e[1] ugid = self._dag.node[u].get('gid', None) vgid = self._dag.node[v].get('gid', None) - G.add_edge(ugid, vgid) # repeating is fine + G.add_edge(ugid, vgid) # repeating is fine ew = self._dag.adj[u][v]['weight'] try: G[ugid][vgid]['weight'] += ew except KeyError: G[ugid][vgid]['weight'] = ew - #DAGUtil.metis_part(G, 15) + # DAGUtil.metis_part(G, 15) # since METIS does not allow zero edge weight, reset them to one for e in G.edges(data=True): if (e[2]['weight'] == 0): e[2]['weight'] = 1 - #logger.debug(G.nodes(data=True)) + # logger.debug(G.nodes(data=True)) (edgecuts, metis_parts) = metis.part_graph(G, nparts=num_partitions, ufactor=1) - for node, pt in zip(G.nodes(), metis_parts): # note min(pt) == 0 + for node, pt in zip(G.nodes(), metis_parts): # note min(pt) == 0 parent_id = pt + st_gid child_part = self._part_dict[node] child_part.parent_id = parent_id - #logger.debug("Part {0} --> Cluster {1}".format(child_part.partition_id, parent_id)) - #parent_part = Partition(parent_id, None) - #self._parts.append(parent_part) - #logger.debug("Edgecuts of merged partitions: ", edgecuts) + # logger.debug("Part {0} --> Cluster {1}".format(child_part.partition_id, parent_id)) + # parent_part = Partition(parent_id, None) + # self._parts.append(parent_part) + # logger.debug("Edgecuts of merged partitions: ", edgecuts) return edgecuts def map_partitions(self): @@ -1079,6 +1092,7 @@ def map_partitions(self): """ pass + class MySarkarScheduler(Scheduler): """ Based on "V. Sarkar, Partitioning and Scheduling Parallel Programs for Execution on @@ -1096,9 +1110,10 @@ class MySarkarScheduler(Scheduler): Similar ideas: http://stackoverflow.com/questions/3974731 """ + def __init__(self, drop_list, max_dop=8, dag=None, dump_progress=False): super(MySarkarScheduler, self).__init__(drop_list, max_dop=max_dop, dag=dag) - self._sspace = [3] * len(self._dag.edges()) # all edges are not zeroed + self._sspace = [3] * len(self._dag.edges()) # all edges are not zeroed self._dump_progress = dump_progress def override_cannot_add(self): @@ -1134,7 +1149,7 @@ def _merge_two_parts(self, ugid, vgid, """ # get the new part should we go ahead # the new part should be one of partu or partv - #print("\nMerging ugid %d and vgid %d, u %d and v %d" % (ugid, vgid, u, v)) + # print("\nMerging ugid %d and vgid %d, u %d and v %d" % (ugid, vgid, u, v)) l_gid = min(ugid, vgid) r_gid = max(ugid, vgid) part_new = g_dict[l_gid] @@ -1159,7 +1174,7 @@ def _merge_two_parts(self, ugid, vgid, for n in part._dag.nodes(): G.node[n]['gid'] = part._gid elif (p_gid == r_gid): - #index = len(parts) - i - 1 + # index = len(parts) - i - 1 index = i del g_dict[p_gid] @@ -1181,17 +1196,17 @@ def reduce_partitions(self, parts, g_dict, G): """ done_reduction = False num_reductions = 0 - #TODO consider other w_attrs other than CPUs! + # TODO consider other w_attrs other than CPUs! parts.sort(key=lambda x: x._max_dop['num_cpus']) while (not done_reduction): for i, partA in enumerate(parts): if (i < len(parts) - 1): partB = parts[i + 1] new_part = self._merge_two_parts(partA._gid, partB._gid, None, None, - None, None, g_dict, parts, G) + None, None, g_dict, parts, G) if (new_part is not None): num_reductions += 1 - break # force re-sorting + break # force re-sorting else: done_reduction = True logger.info('Performed reductions %d times', num_reductions) @@ -1210,7 +1225,7 @@ def partition_dag(self): el = sorted(G.edges(data=True), key=lambda ed: ed[2]['weight'] * -1) stt = time.time() topo_sorted = nx.topological_sort(G) - g_dict = self._part_dict#dict() #{gid : Partition} + g_dict = self._part_dict # dict() #{gid : Partition} curr_lpl = None parts = [] plots_data = [] @@ -1218,14 +1233,14 @@ def partition_dag(self): for n in G.nodes(data=True): n[1]['gid'] = st_gid - #part = DilworthPartition(st_gid, self._max_dop) - #part = WeightedDilworthPartition(st_gid, self._max_dop) - #part = WeightedDilworthPartition(st_gid, self._max_dop, G) - #part = MultiWeightPartition(st_gid, self._max_dop, global_dag=G) + # part = DilworthPartition(st_gid, self._max_dop) + # part = WeightedDilworthPartition(st_gid, self._max_dop) + # part = WeightedDilworthPartition(st_gid, self._max_dop, G) + # part = MultiWeightPartition(st_gid, self._max_dop, global_dag=G) part = KFamilyPartition(st_gid, self._max_dop, global_dag=G) part.add_node(n[0]) g_dict[st_gid] = part - parts.append(part) # will it get rejected? + parts.append(part) # will it get rejected? st_gid += 1 for i, e in enumerate(el): @@ -1234,10 +1249,10 @@ def partition_dag(self): v = e[1] gv = G.node[v] ow = G.adj[u][v]['weight'] - G.adj[u][v]['weight'] = 0 #edge zeroing + G.adj[u][v]['weight'] = 0 # edge zeroing ugid = gu.get('gid', None) vgid = gv.get('gid', None) - if (ugid != vgid): # merge existing parts + if (ugid != vgid): # merge existing parts part = self._merge_two_parts(ugid, vgid, u, v, gu, gv, g_dict, parts, G) if (part is not None): @@ -1249,7 +1264,7 @@ def partition_dag(self): if (dump_progress): bb = np.median([pp._tmp_max_dop for pp in parts]) curr_lpl = DAGUtil.get_longest_path(G, show_path=False, - topo_sort=topo_sorted)[1] + topo_sort=topo_sorted)[1] plots_data.append('%d,%d,%d' % (curr_lpl, len(parts), bb)) self.reduce_partitions(parts, g_dict, G) edt = time.time() - stt @@ -1259,15 +1274,17 @@ def partition_dag(self): of.writelines(os.linesep.join(plots_data)) if (curr_lpl is None): curr_lpl = DAGUtil.get_longest_path(G, show_path=False, - topo_sort=topo_sorted)[1] + topo_sort=topo_sorted)[1] return ((st_gid - init_c), curr_lpl, edt, parts) + class MinNumPartsScheduler(MySarkarScheduler): """ A special type of partition that aims to schedule the DAG on time but at minimum cost. In this particular case, the cost is the number of partitions that will be generated. The assumption is # of partitions (with certain DoP) more or less represents resource footprint. """ + def __init__(self, drop_list, deadline, max_dop=8, dag=None, optimistic_factor=0.5): super(MinNumPartsScheduler, self).__init__(drop_list, max_dop=max_dop, dag=dag) self._deadline = deadline @@ -1309,7 +1326,7 @@ def is_time_critical(self, u, uw, unew, v, vw, vnew, curr_lpl, ow, rem_el): # probability that remaining edges will be zeroed in order to meet the deadline prob = (c + 1) / ttlen time_critical = True if (prob > self._optimistic_factor) else False - #print "time criticality is {0}, prob is {1}".format(time_critical, prob) + # print "time criticality is {0}, prob is {1}".format(time_critical, prob) return time_critical # if (time_critical): # # enforce sequentialisation @@ -1323,6 +1340,7 @@ def is_time_critical(self, u, uw, unew, v, vw, vnew, curr_lpl, ow, rem_el): # else: # join the partition to minimise num_part # return True + class PSOScheduler(Scheduler): """ Use the Particle Swarm Optimisation to guide the Sarkar algorithm @@ -1350,10 +1368,11 @@ class PSOScheduler(Scheduler): based on X[i] value, reject or linearisation (2) returns makespan """ + def __init__(self, drop_list, max_dop=8, dag=None, deadline=None, topk=30, swarm_size=40): super(PSOScheduler, self).__init__(drop_list, max_dop=max_dop, dag=dag) self._deadline = deadline - #search space: key - combination of X[i] (string), + # search space: key - combination of X[i] (string), # val - a tuple of (critical_path (int), num_parts (int)) self._sspace_dict = dict() self._topk = topk @@ -1383,10 +1402,10 @@ def partition_dag(self): xopt, fopt = pso(self.objective_func, lb, ub, ieqcons=[self.constrain_func], swarmsize=self._swarm_size) curr_lpl, num_parts, parts, g_dict = self._partition_G(G, xopt) - #curr_lpl, num_parts, parts, g_dict = self.objective_func(xopt) + # curr_lpl, num_parts, parts, g_dict = self.objective_func(xopt) self._part_dict = g_dict edt = time.time() - #print "PSO scheduler took {0} seconds".format(edt - stt) + # print "PSO scheduler took {0} seconds".format(edt - stt) st_gid = len(self._drop_list) + 1 + num_parts for n in G.nodes(data=True): if not 'gid' in n[1]: @@ -1394,10 +1413,10 @@ def partition_dag(self): part = Partition(st_gid, self._max_dop) part.add_node(n[0], n[1].get('weight', 1)) g_dict[st_gid] = part - parts.append(part) # will it get rejected? + parts.append(part) # will it get rejected? num_parts += 1 self._parts = parts - #print "call counts ", self._call_counts + # print "call counts ", self._call_counts return (num_parts, curr_lpl, edt - stt, parts) def _partition_G(self, G, x): @@ -1405,21 +1424,21 @@ def _partition_G(self, G, x): A helper function to partition G based on a given scheme x subject to constraints imposed by each partition's DoP """ - #print x + # print x st_gid = len(self._drop_list) + 1 init_c = st_gid el = sorted(G.edges(data=True), key=lambda ed: ed[2]['weight'] * -1) - #topo_sorted = nx.topological_sort(G) - #g_dict = self._part_dict#dict() #{gid : Partition} + # topo_sorted = nx.topological_sort(G) + # g_dict = self._part_dict#dict() #{gid : Partition} g_dict = dict() parts = [] for i, e in enumerate(el): pos = int(round(x[i])) - if (pos == 3): #10 non_zero + 1 + if (pos == 3): # 10 non_zero + 1 continue - elif (pos == 2):#01 zero with linearisation + 1 + elif (pos == 2): # 01 zero with linearisation + 1 linear = True - elif (pos == 1): #00 zero without linearisation + 1 + elif (pos == 1): # 00 zero without linearisation + 1 linear = False else: raise SchedulerException("PSO position out of bound: {0}".format(pos)) @@ -1429,7 +1448,7 @@ def _partition_G(self, G, x): v = e[1] gv = G.node[v] ow = G.adj[u][v]['weight'] - G.adj[u][v]['weight'] = 0 #edge zeroing + G.adj[u][v]['weight'] = 0 # edge zeroing recover_edge = False ugid = gu.get('gid', None) @@ -1441,13 +1460,13 @@ def _partition_G(self, G, x): elif (not ugid and (not vgid)): part = Partition(st_gid, self._max_dop) g_dict[st_gid] = part - parts.append(part) # will it get rejected? + parts.append(part) # will it get rejected? st_gid += 1 - else: #elif (ugid and vgid): + else: # elif (ugid and vgid): # cannot change Partition once is in! part = None - #uw = gu['weight'] - #vw = gv['weight'] + # uw = gu['weight'] + # vw = gv['weight'] if (part is None): recover_edge = True @@ -1464,12 +1483,12 @@ def _partition_G(self, G, x): gu['gid'] = part._gid gv['gid'] = part._gid else: - recover_edge = True #outright rejection + recover_edge = True # outright rejection if (recover_edge): G.adj[u][v]['weight'] = ow self._part_edges.append(e) self._call_counts += 1 - #print "called {0} times, len parts = {1}".format(self._call_counts, len(parts)) + # print "called {0} times, len parts = {1}".format(self._call_counts, len(parts)) return (DAGUtil.get_longest_path(G, show_path=False)[1], len(parts), parts, g_dict) def constrain_func(self, x): @@ -1495,7 +1514,7 @@ def objective_func(self, x): """ # first check if the solution is already available in the search space sk = ''.join([str(int(round(xi))) for xi in x[0:self._topk]]) - stuff = self._sspace_dict.get(sk, None) #TODO is this atomic operation? + stuff = self._sspace_dict.get(sk, None) # TODO is this atomic operation? if (stuff is None): # make a deep copy to avoid mix up multiple particles, # each of which has multiple iterations @@ -1508,6 +1527,7 @@ def objective_func(self, x): else: return stuff[1] + class GraphAnnealer(Annealer): """ Use simulated annealing for a DAG/Graph scheduling problem. @@ -1554,7 +1574,7 @@ def energy(self): stuff = self._scheduler._partition_G(G, self.state) self._lgl = stuff[0] num_parts = stuff[1] - #print "num_parts = {0}, lgl = {1}".format(num_parts, self._lgl) + # print "num_parts = {0}, lgl = {1}".format(num_parts, self._lgl) return num_parts def meet_constraint(self): @@ -1567,12 +1587,14 @@ def meet_constraint(self): else: return (self._lgl <= self._deadline) + class MCTSScheduler(PSOScheduler): """ Use Monte Carlo Tree Search to guide the Sarkar algorithm https://en.wikipedia.org/wiki/Monte_Carlo_tree_search Use basic functions in PSOScheduler by inheriting it for convinence """ + def __init__(self, drop_list, max_dop=8, dag=None, deadline=None, max_moves=1000, max_calc_time=10): super(MCTSScheduler, self).__init__(drop_list, max_dop, dag, deadline, None, 40) self._max_moves = max_moves @@ -1599,10 +1621,11 @@ def partition_dag(self): if logger.isEnabledFor(logging.DEBUG): leng = len(G.edges()) logger.debug("Each MCTS move on average took %.2f seconds", (time.time() - stt) / leng) - #calculate the solution under the state found by MCTS + # calculate the solution under the state found by MCTS curr_lpl, num_parts, parts, g_dict = self._partition_G(G, state) edt = time.time() - logger.debug("Monte Carlo Tree Search scheduler took %f secs, lpl = %d, num_parts = %d", edt - stt, curr_lpl, num_parts) + logger.debug("Monte Carlo Tree Search scheduler took %f secs, lpl = %d, num_parts = %d", edt - stt, curr_lpl, + num_parts) st_gid = len(self._drop_list) + 1 + num_parts for n in G.nodes(data=True): @@ -1616,6 +1639,7 @@ def partition_dag(self): self._parts = parts return (num_parts, curr_lpl, edt - stt, parts) + class SAScheduler(PSOScheduler): """ Use Simulated Annealing to guide the Sarkar algorithm @@ -1623,6 +1647,7 @@ class SAScheduler(PSOScheduler): http://apmonitor.com/me575/index.php/Main/SimulatedAnnealing Use basic functions in PSOScheduler by inheriting it for convinence """ + def __init__(self, drop_list, max_dop=8, dag=None, deadline=None, topk=None, max_iter=6000): """ A smaller topk corresponds to a smaller range of perturbation during neighbour search, @@ -1649,8 +1674,8 @@ def partition_dag(self): stt = time.time() ga = GraphAnnealer(mys._sspace, self, deadline=self._deadline, topk=self._topk) # 3. start the annealing process - #auto_schedule = ga.auto(minutes=self._max_wait) - #ga.set_schedule(auto_schedule) + # auto_schedule = ga.auto(minutes=self._max_wait) + # ga.set_schedule(auto_schedule) ga.steps = self._max_iter if (DEBUG): ga.updates = 100 @@ -1674,6 +1699,7 @@ def partition_dag(self): self._parts = parts return (num_parts, curr_lpl, edt - stt, parts) + class DSCScheduler(Schedule): """ Based on @@ -1681,16 +1707,19 @@ class DSCScheduler(Schedule): unbounded number of processors," in IEEE Transactions on Parallel and Distributed Systems, vol.5, no.9, pp.951-967, Sep 1994 """ + def __init__(self, drop_list): super(DSCScheduler, self).__init__(drop_list) def partition_dag(self): pass + class DAGUtil(object): """ Helper functions dealing with DAG """ + @staticmethod def get_longest_path(G, weight='weight', default_weight=1, show_path=True, topo_sort=None): """ @@ -1716,16 +1745,16 @@ def get_longest_path(G, weight='weight', default_weight=1, show_path=True, topo_ The length of the longest path """ - dist = {} # stores {v : (length, u)} + dist = {} # stores {v : (length, u)} if (topo_sort is None): topo_sort = nx.topological_sort(G) for v in topo_sort: us = [ - (dist[u][0] + #accumulate - data.get(weight, default_weight) + #edge weight - G.node[u].get(weight, 0) + # u node weight - (G.node[v].get(weight, 0) if len(list(G.successors(v))) == 0 else 0), # v node weight if no successor - u) + (dist[u][0] + # accumulate + data.get(weight, default_weight) + # edge weight + G.node[u].get(weight, 0) + # u node weight + (G.node[v].get(weight, 0) if len(list(G.successors(v))) == 0 else 0), # v node weight if no successor + u) for u, data in G.pred[v].items()] # Use the best predecessor if there is one and its distance is non-negative, otherwise terminate. maxu = max(us) if us else (0, v) @@ -1792,7 +1821,7 @@ def prune_antichains(antichains): todo = [] for antichain in antichains: todo.append(antichain) - todo.sort(key=lambda x : len(x), reverse=True) + todo.sort(key=lambda x: len(x), reverse=True) return todo @staticmethod @@ -1823,7 +1852,7 @@ def ganttchart_matrix(G, topo_sort=None): Return a M (# of DROPs) by N (longest path length) matrix """ lpl = DAGUtil.get_longest_path(G, show_path=True) - #N = lpl[1] - (len(lpl[0]) - 1) + # N = lpl[1] - (len(lpl[0]) - 1) N = lpl[1] M = G.number_of_nodes() ma = np.zeros((M, N), dtype=np.int) @@ -1835,9 +1864,9 @@ def ganttchart_matrix(G, topo_sort=None): stt = node['stt'] edt = node['edt'] except KeyError as ke: - raise SchedulerException("No schedule labels found: {0}".\ - format(str(ke))) - #print i, n, stt, edt + raise SchedulerException("No schedule labels found: {0}". \ + format(str(ke))) + # print i, n, stt, edt leng = edt - stt if (edt == stt): continue @@ -1847,7 +1876,7 @@ def ganttchart_matrix(G, topo_sort=None): logger.error("i, stt, edt, leng = %d, %d, %d, %d", i, stt, edt, leng) logger.error("N, M = %d, %d", M, N) raise - #print ma[i, :] + # print ma[i, :] return ma @staticmethod @@ -1856,20 +1885,23 @@ def import_metis(): import metis as mt except: pl = platform.platform() - if (pl.startswith('Darwin')): # a clumsy way + if (pl.startswith('Darwin')): # a clumsy way ext = 'dylib' else: - ext = 'so' # what about Microsoft??!! - os.environ["METIS_DLL"] = pkg_resources.resource_filename('dlg.dropmake', 'lib/libmetis.{0}'.format(ext)) # @UndefinedVariable + ext = 'so' # what about Microsoft??!! + os.environ["METIS_DLL"] = pkg_resources.resource_filename('dlg.dropmake', 'lib/libmetis.{0}'.format( + ext)) # @UndefinedVariable import metis as mt if not hasattr(mt, '_dlg_patched'): mt._part_graph = mt.part_graph + def logged_part_graph(*args, **kwargs): logger.info('Starting metis partitioning') start = time.time() ret = mt._part_graph(*args, **kwargs) # @UndefinedVariable logger.info('Finished metis partitioning in %.3f [s]', time.time() - start) return ret + mt.part_graph = logged_part_graph mt._dlg_patched = True return mt @@ -1885,12 +1917,12 @@ def build_dag_from_drops(drop_list, embed_drop=True, fake_super_root=False): tw - task weight dw - data weight / volume """ - key_dict = dict() # {oid : node_id} - drop_dict = dict() # {oid : drop} + key_dict = dict() # {oid : node_id} + drop_dict = dict() # {oid : drop} out_bound_keys = ['streamingConsumers', 'consumers', 'outputs'] for i, drop in enumerate(drop_list): oid = drop['oid'] - key_dict[oid] = i + 1 # starting from 1 + key_dict[oid] = i + 1 # starting from 1 drop_dict[oid] = drop G = nx.DiGraph() for i, drop in enumerate(drop_list): @@ -1905,19 +1937,19 @@ def build_dag_from_drops(drop_list, embed_drop=True, fake_super_root=False): tw = 0 dtp = 0 elif ('app' == tt): - #obk = 'outputs' + # obk = 'outputs' tw = int(drop['tw']) dtp = 1 else: - raise SchedulerException("Drop Type '{0}' not supported".\ - format(tt)) + raise SchedulerException("Drop Type '{0}' not supported". \ + format(tt)) num_cpus = drop.get('num_cpus', 1) if (embed_drop): G.add_node(myk, weight=tw, text=drop['nm'], dt=dtp, - drop_spec=drop, num_cpus=num_cpus) + drop_spec=drop, num_cpus=num_cpus) else: G.add_node(myk, weight=tw, text=drop['nm'], dt=dtp, - num_cpus=num_cpus) + num_cpus=num_cpus) for obk in out_bound_keys: if obk in drop: for oup in drop[obk]: @@ -1927,7 +1959,7 @@ def build_dag_from_drops(drop_list, embed_drop=True, fake_super_root=False): G.add_weighted_edges_from([(myk, key_dict[oup], int(drop_dict[oup].get('dw', 5)))]) if (fake_super_root): - super_root = dropdict({'oid':'-92', 'type':'plain', 'storage':'null'}) + super_root = dropdict({'oid': '-92', 'type': 'plain', 'storage': 'null'}) super_k = len(drop_list) + 1 G.add_node(super_k, weight=0, dtp=0, drop_spec=super_root, num_cpus=0, text='fake_super_root') @@ -1945,7 +1977,7 @@ def metis_part(G, num_partitions): """ outf = '/tmp/mm' lines = [] - part_id_line_dict = dict() # {part_id: line_num} + part_id_line_dict = dict() # {part_id: line_num} line_part_id_dict = dict() for i, n in enumerate(G.nodes()): part_id_line_dict[n] = i + 1 @@ -1969,11 +2001,12 @@ def metis_part(G, num_partitions): with open(outf, "w") as f: f.write("\n".join(lines)) + if __name__ == "__main__": G = nx.DiGraph() - G.add_weighted_edges_from([(4,3,1), (3,2,4), (2,1,2), (5,3,1)]) - G.add_weighted_edges_from([(3,6,5), (6,7,2)]) - G.add_weighted_edges_from([(9,12,2)]) # testing independent nodes + G.add_weighted_edges_from([(4, 3, 1), (3, 2, 4), (2, 1, 2), (5, 3, 1)]) + G.add_weighted_edges_from([(3, 6, 5), (6, 7, 2)]) + G.add_weighted_edges_from([(9, 12, 2)]) # testing independent nodes G.node[3]['weight'] = 65 print(G.pred[12].items()) print(G.node[G.predecessors(12)[0]]) @@ -2007,4 +2040,4 @@ def metis_part(G, num_partitions): # print sch_mat # print sch_mat.shape - #print DAGUtil.prune_antichains([[], [64], [62], [62, 64], [61], [61, 64], [61, 62], [61, 62, 64], [5], [1]]) + # print DAGUtil.prune_antichains([[], [64], [62], [62, 64], [61], [61, 64], [61, 62], [61, 62, 64], [5], [1]]) diff --git a/daliuge-translator/dlg/dropmake/stage_scheduler.py b/daliuge-translator/dlg/dropmake/stage_scheduler.py index e05f293be..b5fa2fb5e 100644 --- a/daliuge-translator/dlg/dropmake/stage_scheduler.py +++ b/daliuge-translator/dlg/dropmake/stage_scheduler.py @@ -32,9 +32,10 @@ /spark/scheduler/DAGScheduler.scala """ + class Stage(object): def __init__(self, id): - self._id = id #normally this is the group construct key + self._id = id # normally this is the group construct key self._lg_nodes = [] def __hash__(self): @@ -43,6 +44,7 @@ def __hash__(self): def add_node(lgnode): self._lg_nodes.append(lgnode) + def parse_node(curr_node, done_dict, stg_set): node_list = curr_node.outputs for n in node_list: @@ -60,6 +62,7 @@ def parse_node(curr_node, done_dict, stg_set): done_dict[n.id] = done_dict[curr_node.id] parse_node(n, done_dict, stg_set) + def produce_stages(lg): """ output a list of stages sorted by the scheduling order @@ -68,4 +71,4 @@ def produce_stages(lg): lgn_list = lg._lgn_list dag_roots = [x for x in lgn_list if x.is_dag_root()] done_dict = dict() - #for n in dag_roots: + # for n in dag_roots: diff --git a/daliuge-translator/dlg/dropmake/utils/__init__.py b/daliuge-translator/dlg/dropmake/utils/__init__.py index 3c21c477b..99f4c9943 100644 --- a/daliuge-translator/dlg/dropmake/utils/__init__.py +++ b/daliuge-translator/dlg/dropmake/utils/__init__.py @@ -1,4 +1,3 @@ - # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) diff --git a/daliuge-translator/dlg/dropmake/utils/anneal.py b/daliuge-translator/dlg/dropmake/utils/anneal.py index 016813b5a..c973b2cf4 100644 --- a/daliuge-translator/dlg/dropmake/utils/anneal.py +++ b/daliuge-translator/dlg/dropmake/utils/anneal.py @@ -19,19 +19,20 @@ # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +from __future__ import absolute_import from __future__ import division from __future__ import print_function -from __future__ import absolute_import from __future__ import unicode_literals + +import abc import copy +import datetime import math -import sys -import time +import pickle import random import signal -import pickle -import datetime -import abc +import sys +import time def round_figures(x, n): @@ -42,13 +43,12 @@ def round_figures(x, n): def time_string(seconds): """Returns time in seconds as a string formatted HHHH:MM:SS.""" s = int(round(seconds)) # round to nearest second - h, s = divmod(s, 3600) # get hours and remainder - m, s = divmod(s, 60) # split remainder into minutes and seconds + h, s = divmod(s, 3600) # get hours and remainder + m, s = divmod(s, 60) # split remainder into minutes and seconds return '%4i:%02i:%02i' % (h, m, s) class Annealer(object): - """Performs simulated annealing by calling functions to calculate energy and make moves on a state. The temperature schedule for annealing may be provided manually or estimated automatically. @@ -151,13 +151,13 @@ def update(self, step, T, E, acceptance, improvement): if step == 0: print(' Temperature Energy Accept Improve Elapsed Remaining') sys.stdout.write('\r%12.2f %12.2f %s ' % \ - (T, E, time_string(elapsed))) + (T, E, time_string(elapsed))) sys.stdout.flush() else: remain = (self.steps - step) * (elapsed / step) sys.stdout.write('\r%12.2f %12.2f %7.2f%% %7.2f%% %s %s' % \ - (T, E, 100.0 * acceptance, 100.0 * improvement,\ - time_string(elapsed), time_string(remain))), + (T, E, 100.0 * acceptance, 100.0 * improvement, \ + time_string(elapsed), time_string(remain))), sys.stdout.flush() def anneal(self): @@ -199,7 +199,7 @@ def anneal(self): dE = E - prevEnergy trials += 1 if ((not self.meet_constraint()) or - (dE > 0.0 and math.exp(-dE / T) < random.random())): + (dE > 0.0 and math.exp(-dE / T) < random.random())): # Restore previous state self.state = self.copy_state(prevState) E = prevEnergy @@ -251,7 +251,7 @@ def run(T, steps): E = self.energy() dE = E - prevEnergy if ((not self.meet_constraint()) or - (dE > 0.0 and math.exp(-dE / T) < random.random())): + (dE > 0.0 and math.exp(-dE / T) < random.random())): self.state = self.copy_state(prevState) E = prevEnergy else: @@ -303,6 +303,6 @@ def run(T, steps): elapsed = time.time() - self.start duration = round_figures(int(60.0 * minutes * step / elapsed), 2) - print('') # New line after auto() output + print('') # New line after auto() output # Don't perform anneal, just return params return {'tmax': Tmax, 'tmin': Tmin, 'steps': duration} diff --git a/daliuge-translator/dlg/dropmake/utils/antichains.py b/daliuge-translator/dlg/dropmake/utils/antichains.py index 051da5bfa..dbccfb654 100644 --- a/daliuge-translator/dlg/dropmake/utils/antichains.py +++ b/daliuge-translator/dlg/dropmake/utils/antichains.py @@ -34,6 +34,7 @@ import networkx as nx + def _create_split_graph(dag, w_attr='weight'): """ Given a normal DiGraph, create its equivalent split graph @@ -42,7 +43,7 @@ def _create_split_graph(dag, w_attr='weight'): for el in dag.nodes(data=True): xi = '{0}_x'.format(el[0]) yi = '{0}_y'.format(el[0]) - #print(el) + # print(el) bpg.add_edge('s', xi, capacity=el[1].get(w_attr, 1), weight=0) bpg.add_edge(xi, yi, capacity=sys.maxsize, weight=1) bpg.add_edge(yi, 't', capacity=el[1].get(w_attr, 1), weight=0) @@ -52,58 +53,60 @@ def _create_split_graph(dag, w_attr='weight'): for udown in el_des: bpg.add_edge(xi, '{0}_y'.format(udown), - capacity=sys.maxsize, weight=0) + capacity=sys.maxsize, weight=0) for uup in el_pred: bpg.add_edge('{0}_x'.format(uup), yi, - capacity=sys.maxsize, weight=0) + capacity=sys.maxsize, weight=0) return bpg + def _get_pi_solution(split_graph): - """ - 1. create H (admissable graph) based on Section 3 - http://fmdb.cs.ucla.edu/Treports/930014.pdf - - 2. calculate the max flow f' on H using networkx - - 3. construct Residual graph from f' on H based on - https://www.topcoder.com/community/data-science/\ - data-science-tutorials/minimum-cost-flow-part-two-algorithms/ - - 4. calculate Pi based on Section 3 again - """ - # Step 1 - H = nx.DiGraph() - H.add_nodes_from(split_graph) - for ed in split_graph.edges(data=True): - Cxy = ed[2].get('capacity', sys.maxsize) - Axy = ed[2]['weight'] - if (Axy == 0 and Cxy > 0): - H.add_edge(ed[0], ed[1], capacity=Cxy, weight=Axy) - - # Step 2 - flow_value, flow_dict = nx.maximum_flow(H, 's', 't') - - # Step 3 - R = nx.DiGraph() - R.add_nodes_from(H) - for ed in H.edges(data=True): - Xij = flow_dict[ed[0]][ed[1]] - Uij = ed[2].get('capacity', sys.maxsize) - Cij = ed[2]['weight'] - if (Uij - Xij) > 0: - R.add_edge(ed[0], ed[1], weight=Cij) - if (Xij > 0): - R.add_edge(ed[1], ed[0], weight=-1 * Cij) - - # Step 4 - pai = dict() - for n in R.nodes(): - if (nx.has_path(R, 's', n)): - pai[n] = 0 - else: - pai[n] = 1 - return pai + """ + 1. create H (admissable graph) based on Section 3 + http://fmdb.cs.ucla.edu/Treports/930014.pdf + + 2. calculate the max flow f' on H using networkx + + 3. construct Residual graph from f' on H based on + https://www.topcoder.com/community/data-science/\ + data-science-tutorials/minimum-cost-flow-part-two-algorithms/ + + 4. calculate Pi based on Section 3 again + """ + # Step 1 + H = nx.DiGraph() + H.add_nodes_from(split_graph) + for ed in split_graph.edges(data=True): + Cxy = ed[2].get('capacity', sys.maxsize) + Axy = ed[2]['weight'] + if (Axy == 0 and Cxy > 0): + H.add_edge(ed[0], ed[1], capacity=Cxy, weight=Axy) + + # Step 2 + flow_value, flow_dict = nx.maximum_flow(H, 's', 't') + + # Step 3 + R = nx.DiGraph() + R.add_nodes_from(H) + for ed in H.edges(data=True): + Xij = flow_dict[ed[0]][ed[1]] + Uij = ed[2].get('capacity', sys.maxsize) + Cij = ed[2]['weight'] + if (Uij - Xij) > 0: + R.add_edge(ed[0], ed[1], weight=Cij) + if (Xij > 0): + R.add_edge(ed[1], ed[0], weight=-1 * Cij) + + # Step 4 + pai = dict() + for n in R.nodes(): + if (nx.has_path(R, 's', n)): + pai[n] = 0 + else: + pai[n] = 1 + return pai + def get_max_weighted_antichain(dag, w_attr='weight'): """ @@ -118,20 +121,21 @@ def get_max_weighted_antichain(dag, w_attr='weight'): bpg = _create_split_graph(dag, w_attr=w_attr) pai = _get_pi_solution(bpg) - w_antichain_len = 0 #weighted antichain length + w_antichain_len = 0 # weighted antichain length antichain_names = [] for h in range(2): for nd in bpg.nodes(): if (nd.endswith('_x')): y_nd = nd.split('_x')[0] + '_y' if ((1 - pai[nd] + pai['s'] == h) and - (pai[y_nd] - pai[nd] == 1)): + (pai[y_nd] - pai[nd] == 1)): w_antichain_len += bpg.adj['s'][nd]['capacity'] - #print(' *** %d' % bpg.edge['s'][nd]['capacity']) + # print(' *** %d' % bpg.edge['s'][nd]['capacity']) antichain_names.append(nd) return w_antichain_len, antichain_names + def create_small_seq_graph(): G = nx.DiGraph() G.add_edge(1, 2) @@ -139,9 +143,10 @@ def create_small_seq_graph(): G.node[1]['weight'] = 5 G.node[2]['weight'] = 4 G.node[3]['weight'] = 7 - #print("") + # print("") return G, 7 + def create_medium_seq_graph(): G = create_small_seq_graph()[0] G.add_edge(3, 4) @@ -155,6 +160,7 @@ def create_medium_seq_graph(): G.node[7]['weight'] = 1 return G, 7 + def create_small_parral_graph(): G = nx.DiGraph() G.add_edge(1, 2) @@ -165,6 +171,7 @@ def create_small_parral_graph(): G.node[3]['weight'] = 7 return G, 13 + def create_medium_parral_graph(): G = create_small_parral_graph()[0] G.add_edge(2, 4) @@ -173,6 +180,7 @@ def create_medium_parral_graph(): G.node[5]['weight'] = 4 return G, 14 + if __name__ == "__main__": gs = [create_small_seq_graph(), create_medium_seq_graph(), diff --git a/daliuge-translator/dlg/dropmake/utils/bash_parameter.py b/daliuge-translator/dlg/dropmake/utils/bash_parameter.py index 452d6ac57..5a86f5a6b 100644 --- a/daliuge-translator/dlg/dropmake/utils/bash_parameter.py +++ b/daliuge-translator/dlg/dropmake/utils/bash_parameter.py @@ -23,10 +23,12 @@ inp_regex = re.compile(r'%i\[(-[0-9]+)\]') out_regex = re.compile(r'%o\[(-[0-9]+)\]') + class BashCommand(object): """ An efficient implementation of the bash command with parameters """ + def __init__(self, cmds): """ create the logical form of the bash command line @@ -34,14 +36,14 @@ def __init__(self, cmds): cmds: a list such that ' '.join(cmds) looks something like: 'python /home/dfms/myclean.py -d %i[-21] -f %i[-3] %o[-2] -v' """ - self._input_map = dict() # key: logical drop id, value: a list of physical oids + self._input_map = dict() # key: logical drop id, value: a list of physical oids self._output_map = dict() cmd = ' '.join(cmds) - self._cmds = cmd.replace(';', ' ; ').split() # re-split just in case hidden spaces - #self._cmds = re.split(';| *', cmd) # resplit for * as well as spaces + self._cmds = cmd.replace(';', ' ; ').split() # re-split just in case hidden spaces + # self._cmds = re.split(';| *', cmd) # resplit for * as well as spaces for m in inp_regex.finditer(cmd): - self._input_map[int(m.group(1))] = set() #TODO - check if sequence needs to be reserved! + self._input_map[int(m.group(1))] = set() # TODO - check if sequence needs to be reserved! for m in out_regex.finditer(cmd): self._output_map[int(m.group(1))] = set() @@ -68,12 +70,12 @@ def _get_delimit(matchobj): if (imatch is not None): lgn_id = int(imatch.group(1)) cmds[k] = d.replace(imatch.group(0), - _get_delimit(imatch).\ - join(['%i[{0}]'.format(x) for x in self._input_map[lgn_id]])) + _get_delimit(imatch). \ + join(['%i[{0}]'.format(x) for x in self._input_map[lgn_id]])) elif (omatch is not None): lgn_id = int(omatch.group(1)) cmds[k] = d.replace(omatch.group(0), - _get_delimit(omatch).\ - join(['%o[{0}]'.format(x) for x in self._output_map[lgn_id]])) + _get_delimit(omatch). \ + join(['%o[{0}]'.format(x) for x in self._output_map[lgn_id]])) return ' '.join(cmds) diff --git a/daliuge-translator/dlg/dropmake/utils/heft/base.py b/daliuge-translator/dlg/dropmake/utils/heft/base.py index 0cc3366d2..d80d80787 100644 --- a/daliuge-translator/dlg/dropmake/utils/heft/base.py +++ b/daliuge-translator/dlg/dropmake/utils/heft/base.py @@ -43,14 +43,14 @@ consumes exactly one processor at a time """ -from functools import partial +import itertools as it from collections import namedtuple +from functools import partial from itertools import chain -import itertools as it -import networkx as nx Event = namedtuple('Event', 'task start end') + def reverse_dict(d): """ Reverses direction of dependence dict @@ -61,9 +61,10 @@ def reverse_dict(d): result = {} for key in d: for val in d[key]: - result[val] = result.get(val, tuple()) + (key, ) + result[val] = result.get(val, tuple()) + (key,) return result + def find_task_event(task_name, orders_dict): for event in it.chain.from_iterable(orders_dict.values()): if event.task == task_name: @@ -85,7 +86,7 @@ def cbar(ni, nj, agents, commcost): if a1 != a2) / npairs -def ranku(ni, agents, succ, compcost, commcost): +def ranku(ni, agents, succ, compcost, commcost): """ Rank of task This code is designed to mirror the wikipedia entry. @@ -130,8 +131,8 @@ def find_first_gap(agent_orders, desired_start_time, duration): The gap must be after `desired_start_time` and of length at least `duration`. """ - #TODO change to a "DAG preserved" first gap - #TODO return an infinite large value if the DoP constraint is not met + # TODO change to a "DAG preserved" first gap + # TODO return an infinite large value if the DoP constraint is not met # No tasks: can fit it in whenever the task is ready to run if (agent_orders is None) or (len(agent_orders)) == 0: @@ -175,15 +176,15 @@ def ft(machine): return st(machine) + compcost(task, machine) # 'min()' represents 'earliest' finished time (ft) # this is exactly why the allocation policy is considered greedy! - #TODO the new greediness should be based on "DoP" since all start time will be + # TODO the new greediness should be based on "DoP" since all start time will be # the same (the desired_start_time). Smaller DoP (or bigger leftover) is better agent = min(orders.keys(), key=ft) start = st(agent) end = ft(agent) - #assert(end == start + compcost(task, agent)) + # assert(end == start + compcost(task, agent)) orders[agent].append(Event(task, start, end)) - #orders[agent] = sorted(orders[agent], key=lambda e: e.start) + # orders[agent] = sorted(orders[agent], key=lambda e: e.start) orders[agent].sort(key=lambda e: e.start) # Might be better to use a different data structure to keep each # agent's orders sorted at a lower cost. diff --git a/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py b/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py index 02c364278..45b7da922 100644 --- a/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py +++ b/daliuge-translator/dlg/dropmake/utils/heft/dlg_heft.py @@ -31,27 +31,30 @@ of one task needed by another between two agents """ -from functools import partial -from collections import namedtuple -from itertools import chain import itertools as it -#import networkx as nx -import numpy as np import sys +from collections import namedtuple +from functools import partial + +# import networkx as nx +import numpy as np Event = namedtuple('Event', 'task start end') -LATEST_STT = sys.maxsize # this should be python2/3 compatible +LATEST_STT = sys.maxsize # this should be python2/3 compatible RES_TYPE_CPU = 1 RES_TYPE_MEM = 2 -#RES_TYPE_IO = 3 +# RES_TYPE_IO = 3 RES_TYPES = [RES_TYPE_CPU, RES_TYPE_MEM] -#RES_TYPES = [RES_TYPE_CPU] + + +# RES_TYPES = [RES_TYPE_CPU] class res_usage(object): """ Resource usage of a particular machine/agent """ + def __init__(self, agent, supply): self.res_types = supply.keys() self.arr = dict() @@ -72,9 +75,9 @@ def can_alloc_task(self, desired_st_time, duration, demand): return True dedt = min(desired_st_time + duration, self.edt) # each timestep should not exceed supply - for k, v in demand.items(): # for each resource type + for k, v in demand.items(): # for each resource type res_arr = self.arr[k] - #TODO use a threshold instead of an outright '0' + # TODO use a threshold instead of an outright '0' if sum(res_arr[desired_st_time:dedt] + v > self.supply[k]) > 0: return False return True @@ -90,10 +93,11 @@ def add_task(self, event, demand): delt = self.edt - res_arr.size res_arr = np.hstack([res_arr, np.zeros(delt)]) res_arr[event.start:event.end] += demand[k] - + for k, v in to_be_updated: self.arr[k] = v + def reverse_dict(d): """ Reverses direction of dependence dict @@ -104,9 +108,10 @@ def reverse_dict(d): result = {} for key in d: for val in d[key]: - result[val] = result.get(val, tuple()) + (key, ) + result[val] = result.get(val, tuple()) + (key,) return result + def find_task_event(task_name, orders_dict): for event in it.chain.from_iterable(orders_dict.values()): if event.task == task_name: @@ -128,7 +133,7 @@ def cbar(ni, nj, agents, commcost): if a1 != a2) / npairs -def ranku(ni, agents, succ, compcost, commcost): +def ranku(ni, agents, succ, compcost, commcost): """ Rank of task This code is designed to mirror the wikipedia entry. @@ -174,8 +179,8 @@ def find_first_gap(agent_orders, desired_start_time, duration, The gap must be after `desired_start_time` and of length at least `duration`. """ - #TODO change to a "DAG preserved" first gap - #TODO return an infinite large value if the DoP constraint is not met + # TODO change to a "DAG preserved" first gap + # TODO return an infinite large value if the DoP constraint is not met # No tasks: can fit it in whenever the task is ready to run if (agent_orders is None) or (len(agent_orders)) == 0: @@ -230,18 +235,18 @@ def ft(machine): return st(machine) + compcost(task, machine) # 'min()' represents 'earliest' finished time (ft) # this is exactly why the allocation policy is considered greedy! - #TODO the new greediness should be based on "DoP" since all start time will be + # TODO the new greediness should be based on "DoP" since all start time will be # the same (the desired_start_time). Smaller DoP (or bigger leftover) is better agent = min(orders.keys(), key=ft) start = st(agent) if (start == LATEST_STT): raise Exception('No sufficient resources to run task {0}'.format(task)) end = ft(agent) - #assert(end == start + compcost(task, agent)) + # assert(end == start + compcost(task, agent)) new_event = Event(task, start, end) orders[agent].append(new_event) - #orders[agent] = sorted(orders[agent], key=lambda e: e.start) + # orders[agent] = sorted(orders[agent], key=lambda e: e.start) orders[agent].sort(key=lambda e: e.start) # Might be better to use a different data structure to keep each # agent's orders sorted at a lower cost. diff --git a/daliuge-translator/dlg/dropmake/utils/heft/test.py b/daliuge-translator/dlg/dropmake/utils/heft/test.py index faca960a9..e1dafbd23 100644 --- a/daliuge-translator/dlg/dropmake/utils/heft/test.py +++ b/daliuge-translator/dlg/dropmake/utils/heft/test.py @@ -1,5 +1,5 @@ -from dlg_heft import Event, cbar, ranku, schedule, \ -start_time, wbar, makespan, RES_TYPES +from dlg_heft import schedule, \ + makespan, RES_TYPES """ This is a simple script to use the HEFT function provided based on the example given in the original HEFT paper. @@ -16,7 +16,6 @@ {1: 'c', 4: 'b', 3: 'c', 2: 'c', 5: 'c', 6: 'a', 9: 'b', 7: 'c', 8: 'a', 10: 'b'} """ - dag = {1: (2, 3, 4, 5, 6), 2: (8, 9), 3: (7,), @@ -28,139 +27,142 @@ 9: (10,), 10: ()} + def setup_capacity(agents): ac = dict() for i, a in enumerate(agents): supply = {} for j, res in enumerate(RES_TYPES): supply[res] = (8 + j) * (i + 1) - #print(supply) + # print(supply) ac[a] = supply - #print('all capacity', ac) + # print('all capacity', ac) return ac + def setup_workload(tasks): wl = dict() for i, t in enumerate(tasks): demand = {} for j, res in enumerate(RES_TYPES): demand[res] = (1 + j) * (i + 1) - #print(demand) + # print(demand) wl[t] = demand return wl + def compcost(task, agent): if (task == 1): - if(agent == 'a'): + if (agent == 'a'): return 14 - elif(agent == 'b'): + elif (agent == 'b'): return 16 else: return 9 if (task == 2): - if(agent == 'a'): + if (agent == 'a'): return 13 - elif(agent == 'b'): + elif (agent == 'b'): return 19 else: return 18 if (task == 3): - if(agent == 'a'): + if (agent == 'a'): return 11 - elif(agent == 'b'): + elif (agent == 'b'): return 13 else: return 19 if (task == 4): - if(agent == 'a'): + if (agent == 'a'): return 13 - elif(agent == 'b'): + elif (agent == 'b'): return 8 else: return 17 if (task == 5): - if(agent == 'a'): + if (agent == 'a'): return 12 - elif(agent == 'b'): + elif (agent == 'b'): return 13 else: return 10 if (task == 6): - if(agent == 'a'): + if (agent == 'a'): return 13 - elif(agent == 'b'): + elif (agent == 'b'): return 16 else: return 9 if (task == 7): - if(agent == 'a'): + if (agent == 'a'): return 7 - elif(agent == 'b'): + elif (agent == 'b'): return 15 else: return 11 if (task == 8): - if(agent == 'a'): + if (agent == 'a'): return 5 - elif(agent == 'b'): + elif (agent == 'b'): return 11 else: return 14 if (task == 9): - if(agent == 'a'): + if (agent == 'a'): return 18 - elif(agent == 'b'): + elif (agent == 'b'): return 12 else: return 20 if (task == 10): - if(agent == 'a'): + if (agent == 'a'): return 21 - elif(agent == 'b'): + elif (agent == 'b'): return 7 else: return 16 def commcost(ni, nj, A, B): - - if(A == B): + if (A == B): return 0 else: - if(ni == 1 and nj == 2): + if (ni == 1 and nj == 2): return 18 - if(ni == 1 and nj == 3): + if (ni == 1 and nj == 3): return 12 - if(ni == 1 and nj == 4): + if (ni == 1 and nj == 4): return 9 - if(ni == 1 and nj == 5): + if (ni == 1 and nj == 5): return 11 - if(ni == 1 and nj == 6): + if (ni == 1 and nj == 6): return 14 - if(ni == 2 and nj == 8): + if (ni == 2 and nj == 8): return 19 - if(ni == 2 and nj == 9): + if (ni == 2 and nj == 9): return 16 - if(ni == 3 and nj == 7): + if (ni == 3 and nj == 7): return 23 - if(ni == 4 and nj == 8): + if (ni == 4 and nj == 8): return 27 - if(ni == 4 and nj == 9): + if (ni == 4 and nj == 9): return 23 - if(ni == 5 and nj == 9): + if (ni == 5 and nj == 9): return 13 - if(ni == 6 and nj == 8): + if (ni == 6 and nj == 8): return 15 - if(ni == 7 and nj == 10): + if (ni == 7 and nj == 10): return 17 - if(ni == 8 and nj == 10): + if (ni == 8 and nj == 10): return 11 - if(ni == 9 and nj == 10): + if (ni == 9 and nj == 10): return 13 else: return 0 + agents = 'abc' cpct = setup_capacity(agents) wkld = setup_workload(dag.keys()) diff --git a/daliuge-translator/dlg/dropmake/utils/mcts.py b/daliuge-translator/dlg/dropmake/utils/mcts.py index 75cffc517..16dc2b320 100644 --- a/daliuge-translator/dlg/dropmake/utils/mcts.py +++ b/daliuge-translator/dlg/dropmake/utils/mcts.py @@ -35,9 +35,10 @@ """ import time -from random import choice -from math import log, sqrt from collections import defaultdict +from math import log, sqrt +from random import choice + class DAGTree(object): """ @@ -85,7 +86,7 @@ def payout(self, state_history): # convert '98760' to [9, 8, 7, 6, 0] x = [int(ii) for ii in list(state_history[-1][:])] # print x - if (len(x) < leng): #padding + if (len(x) < leng): # padding x += [3] * (leng - len(x)) stuff = self._scheduler._partition_G(G, x) @@ -115,15 +116,16 @@ def latest_state(self, state_history): else: return None + class MCTS(object): def __init__(self, dag_tree, calculation_time=30, max_moves=1000, factor=1.4): self._dag_tree = dag_tree self._calc_time = calculation_time self._max_moves = max_moves self._states = [] - #self._dag_tree.append_state(self._states, init_state) - self.scores = defaultdict(int)#{} # key: state, value: score - self.plays = defaultdict(int)#{} # key: state, value: count + # self._dag_tree.append_state(self._states, init_state) + self.scores = defaultdict(int) # {} # key: state, value: score + self.plays = defaultdict(int) # {} # key: state, value: count self.max_depth = 0 # Exploration constant, increase for more exploratory moves, # decrease to prefer moves with known higher win rates. @@ -137,8 +139,8 @@ def run(self): leng = self._dag_tree._leng while (len(state) < leng): m, state = self.next_move() - #print "max_depth = {0}, state: {1}".format(self.max_depth, state) - #print "max_depth = {0}".format(self.max_depth) + # print "max_depth = {0}, state: {1}".format(self.max_depth, state) + # print "max_depth = {0}".format(self.max_depth) return [int(ii) for ii in list(state)] def next_move(self): @@ -166,7 +168,7 @@ def next_move(self): num_moves = nm move = p new_state = S - #print overall_payout, num_moves, move, new_state + # print overall_payout, num_moves, move, new_state self.update(new_state) return (move, new_state) @@ -219,7 +221,7 @@ def simulate_moves(self): scores[state] += payout ps = self._dag_tree.parent_state(state) while (ps is not None): - #print plays + # print plays plays[ps] += 1 scores[ps] += payout ps = self._dag_tree.parent_state(ps) diff --git a/daliuge-translator/dlg/dropmake/web/Inspector_test.css b/daliuge-translator/dlg/dropmake/web/Inspector_test.css index bc1c80c58..cbb08cba8 100644 --- a/daliuge-translator/dlg/dropmake/web/Inspector_test.css +++ b/daliuge-translator/dlg/dropmake/web/Inspector_test.css @@ -3,23 +3,23 @@ see also: inspector.js, inspector.html */ - .inspector-container { +.inspector-container { color: #FDFDFD; background-color: #272625; /*width: 200px;*/ /* chen.wu */ padding: 2px; height: 480px; - } +} - .make-inline { +.make-inline { display: inline; - } +} - * { +* { font-family: helvetica; - } +} - .inspector { +.inspector { margin: 2px; font: 12px helvetica, sans-serif; @@ -33,124 +33,126 @@ -khtml-user-select: none; -ms-user-select: none; cursor: default; - } +} - .inspector-container select { +.inspector-container select { border: 0px; width: 100%; - } +} - .inspector input { +.inspector input { background-color: #202020; color: #F5F5F5; border: 0px; - } - .inspector input:focus { +} + +.inspector input:focus { color: #FDFDFD; - } +} - .inspector input:disabled { - color: #7B7B7B;; /* gray-blue */ - } +.inspector input:disabled { + color: #7B7B7B;; /* gray-blue */ +} - .inspector select { +.inspector select { background-color: #202020; color: #F5F5F5; border: 0px; - } - .inspector select:focus { +} + +.inspector select:focus { color: #FDFDFD; - } +} - .row { +.row { margin-bottom: 2px; - } +} - .cell { +.cell { display: inline-block; width: 50%; text-align: right; - } +} - .right-align { +.right-align { text-align: right; - } +} - .input-short { +.input-short { width: 40px; text-indent: 1px; text-align: center; - } +} - .input-long { +.input-long { width: 82%; text-indent: 1px; text-align: left; /* chen.wu */ - } +} - .inspector-nullable input[type=text]{ +.inspector-nullable input[type=text] { width: 165px; - } +} - .inspector-n-field-label { +.inspector-n-field-label { margin-right: 5px; margin-bottom: 5px; - } +} - .inspector-button-container { +.inspector-button-container { margin: 6px; text-align: center; - } +} - .inspector-button-container input { +.inspector-button-container input { margin: 2px; font-size: 100%; - } +} - .inspector-group { +.inspector-group { padding: 1px 3px 1px 3px; /*border: 1px solid red; /* DEBUG */ border-top: 2px solid #272625; /* dark gray */ - } +} - .inspector-group select { +.inspector-group select { width: 50%; - } +} - .inspector-group label { +.inspector-group label { - } +} - .inspector-section { +.inspector-section { background-color: #333; - } +} - .inspector-container h3, .inspector-container h2 { +.inspector-container h3, .inspector-container h2 { background-color: #272625; padding: 1px; margin: 0; - } +} - .inspector-container h3 { +.inspector-container h3 { font-size: 14px; margin-top: 2px; - } +} - .inspector-container h2 { +.inspector-container h2 { font-size: 18px; - } +} - label.property-name { +label.property-name { width: 60px; margin-right: 5px; font-weight: bold; /*display: inline-block;*/ text-align: left; /* chen.wu */ - } +} - .spectrum-control { +.spectrum-control { border: 0px; background: none; - } +} diff --git a/daliuge-translator/dlg/dropmake/web/Inspector_test.js b/daliuge-translator/dlg/dropmake/web/Inspector_test.js index d47e93429..6eb2508fb 100644 --- a/daliuge-translator/dlg/dropmake/web/Inspector_test.js +++ b/daliuge-translator/dlg/dropmake/web/Inspector_test.js @@ -27,833 +27,837 @@ */ function Inspector(divid, diagram, options) { - this.inspectedProps = {}; - // assume coll is a single object for now TODO fix this, - // which means looking at every use of this.collection - this.collection = null; - this.tracked = null; // map of all tracked properties, set in showObjectProperties and used in rebuildViews - this.diagram = diagram; - - this.acceptButton = !!options['acceptButton']; - this.resetButton = !!options['resetButton']; - this.acceptFocus = !!options['acceptFocus']; - this.inspectPredicate = options['inspectPredicate'] || null; - this.propertyNames = options['propertyNames'] || null; - - /* -
        - -
        -
        -
        - */ - var div = document.getElementById(divid); - div.className = "inspector-container"; - var chooser = document.createElement("select"); - div.appendChild(chooser); - var mainDiv = document.createElement("div"); - mainDiv.className = "inspector"; - div.appendChild(mainDiv); - var acceptResetDiv = document.createElement("div"); - acceptResetDiv.className = "inspector-button-container"; - div.appendChild(acceptResetDiv); - - this.div = mainDiv; - this.acceptResetDiv = acceptResetDiv; - this.chooser = chooser; - this.lastIndex = 0; - - var self = this; - var pred = this.inspectPredicate; - - diagram.addDiagramListener('ChangedSelection', function(e) { - var graphObjects = []; - var selection = myDiagram.selection.first(); - if (selection === null) { - self.toggleVisibility(false); - return; - } - self.toggleVisibility(true); + this.inspectedProps = {}; + // assume coll is a single object for now TODO fix this, + // which means looking at every use of this.collection + this.collection = null; + this.tracked = null; // map of all tracked properties, set in showObjectProperties and used in rebuildViews + this.diagram = diagram; + + this.acceptButton = !!options['acceptButton']; + this.resetButton = !!options['resetButton']; + this.acceptFocus = !!options['acceptFocus']; + this.inspectPredicate = options['inspectPredicate'] || null; + this.propertyNames = options['propertyNames'] || null; + + /* +
        + +
        +
        +
        + */ + var div = document.getElementById(divid); + div.className = "inspector-container"; + var chooser = document.createElement("select"); + div.appendChild(chooser); + var mainDiv = document.createElement("div"); + mainDiv.className = "inspector"; + div.appendChild(mainDiv); + var acceptResetDiv = document.createElement("div"); + acceptResetDiv.className = "inspector-button-container"; + div.appendChild(acceptResetDiv); + + this.div = mainDiv; + this.acceptResetDiv = acceptResetDiv; + this.chooser = chooser; + this.lastIndex = 0; + + var self = this; + var pred = this.inspectPredicate; + + diagram.addDiagramListener('ChangedSelection', function (e) { + var graphObjects = []; + var selection = myDiagram.selection.first(); + if (selection === null) { + self.toggleVisibility(false); + return; + } + self.toggleVisibility(true); - if (self.propertyNames !== null) { - self.populatePropertyNames(graphObjects, pred, selection); // NYI - } else { - self.populateDefault(graphObjects, pred, selection); - } + if (self.propertyNames !== null) { + self.populatePropertyNames(graphObjects, pred, selection); // NYI + } else { + self.populateDefault(graphObjects, pred, selection); + } - chooser.innerHTML = ''; - for (var i = 0; i < graphObjects.length; i++) { - var option = document.createElement('option'); - option.value = i; - option.text = graphObjects[i] instanceof go.GraphObject ? graphObjects[i].toString() : 'Drop'; - chooser.appendChild(option); - } + chooser.innerHTML = ''; + for (var i = 0; i < graphObjects.length; i++) { + var option = document.createElement('option'); + option.value = i; + option.text = graphObjects[i] instanceof go.GraphObject ? graphObjects[i].toString() : 'Drop'; + chooser.appendChild(option); + } - chooser.onchange = function() { - var index = this.selectedIndex; - if (self.propertyNames !== null) { - self.change(selection); - } else { - self.change(graphObjects[index]); - } - self.lastIndex = index; - } + chooser.onchange = function () { + var index = this.selectedIndex; + if (self.propertyNames !== null) { + self.change(selection); + } else { + self.change(graphObjects[index]); + } + self.lastIndex = index; + } - var useLastIndex = self.lastIndex <= (graphObjects.length -1); - if (self.propertyNames !== null) { - self.change(selection); - } else { - self.change(graphObjects[useLastIndex ? self.lastIndex : 0]); - } - if (useLastIndex) chooser.value = self.lastIndex; - // if the index was from the lastIndex than we need to update the chooser - }); - - // accept focus option = commit when clicking away from the div: - if (this.acceptFocus) { - div.tabIndex = 3; // div must be allowed focus - // must use focusout instead of blur - blur does not bubble, - // so clicking on an inside the div and then clicking away - // will not fire an event with blur, and it will will focusout - div.addEventListener('focusout', function(e) { - self.setAllProperties(); + var useLastIndex = self.lastIndex <= (graphObjects.length - 1); + if (self.propertyNames !== null) { + self.change(selection); + } else { + self.change(graphObjects[useLastIndex ? self.lastIndex : 0]); + } + if (useLastIndex) chooser.value = self.lastIndex; + // if the index was from the lastIndex than we need to update the chooser }); - } - this.toggleVisibility(false); + // accept focus option = commit when clicking away from the div: + if (this.acceptFocus) { + div.tabIndex = 3; // div must be allowed focus + // must use focusout instead of blur - blur does not bubble, + // so clicking on an inside the div and then clicking away + // will not fire an event with blur, and it will will focusout + div.addEventListener('focusout', function (e) { + self.setAllProperties(); + }); + } + + this.toggleVisibility(false); } // end Inspector constructor // Populate the selection box with all GraphObjects inside a node, plus its part.data -Inspector.prototype.populateDefault = function(graphObjects, pred, selection) { - if (pred === null || pred(selection)) { - graphObjects.push(selection); - } - var recurseDownPanels = function(element) { - if (element instanceof go.Panel) { - var elements = element.elements; - while(elements.next()) { - var val = elements.value; - if (pred === null || pred(val)) { - graphObjects.push(val); +Inspector.prototype.populateDefault = function (graphObjects, pred, selection) { + if (pred === null || pred(selection)) { + graphObjects.push(selection); + } + var recurseDownPanels = function (element) { + if (element instanceof go.Panel) { + var elements = element.elements; + while (elements.next()) { + var val = elements.value; + if (pred === null || pred(val)) { + graphObjects.push(val); + } + recurseDownPanels(val); + } } - recurseDownPanels(val); - } } - } - recurseDownPanels(selection); - if (pred === null || pred(selection.data)) { - graphObjects.push(selection.data); - } + recurseDownPanels(selection); + if (pred === null || pred(selection.data)) { + graphObjects.push(selection.data); + } } // populate based on this.propertyNames -Inspector.prototype.populatePropertyNames = function(graphObjects, pred, selection) { - graphObjects.push(this.propertyNames); +Inspector.prototype.populatePropertyNames = function (graphObjects, pred, selection) { + graphObjects.push(this.propertyNames); } -Inspector.prototype.change = function(graphObject) { - this.inspectedProps = {}; - this.setCollection(graphObject); - this.showObjectProperties(graphObject); +Inspector.prototype.change = function (graphObject) { + this.inspectedProps = {}; + this.setCollection(graphObject); + this.showObjectProperties(graphObject); } -Inspector.prototype.toggleVisibility = function(visible) { - this.div.style.display = visible ? "block" : "none"; - this.acceptResetDiv.style.display = visible ? "block" : "none"; - this.chooser.style.display = visible ? "block" : "none"; +Inspector.prototype.toggleVisibility = function (visible) { + this.div.style.display = visible ? "block" : "none"; + this.acceptResetDiv.style.display = visible ? "block" : "none"; + this.chooser.style.display = visible ? "block" : "none"; } // coll = collection of objects (JavaScript Objects, GraphObjects, Parts, etc) // assumes coll is a single object for now -Inspector.prototype.setCollection = function(coll) { - this.collection = coll; +Inspector.prototype.setCollection = function (coll) { + this.collection = coll; } -Inspector.prototype.rebuildViews = function() { - // clear any old spectrum controls that were bound to old inputs - var spectrums = document.getElementsByClassName("sp-container"); - while (spectrums.length !== 0) document.body.removeChild(spectrums[0]); - var div = this.div; - div.innerHTML = ''; - this.acceptResetDiv.innerHTML = ''; - var trackedList = Object.keys(this.tracked); - for (var i = 0; i < trackedList.length; i++ ) { - var section = Inspector.createSection(trackedList[i]); - var inspectedProps = this.tracked[trackedList[i]]; - for (var j = 0; j < inspectedProps.length; j++) { - var propname = inspectedProps[j]; - var view = this.inspectedProps[propname]; - if (view.visible !== true) continue; - - section.appendChild(view.getDOM()); - var coll = this.collection; - var group = view.dom; - var label = group.label || group.children[0]; - // optionally, sanitize property name into something human readable - var camelCaseConverter = function(str) { - var words = str.match(/[A-Za-z0-9][a-z]*/g); - words = words.filter(function(str) { // the checkbox is clear enough the property is a bool - return str !== "is"; - }); - return words.map(function(str) { - if (str.length === 0) return str; - else if (str.length === 1) return str.toUpperCase(); - else return str.substring(0,1).toUpperCase() + str.substring(1); - }).join(" "); - } - label.textContent = propname; //camelCaseConverter(propname); - - var input = group.children[1]; - if (view.options.readOnly) { - for (var k = 0; k < group.children.length; k++) { - group.children[k].disabled = true; +Inspector.prototype.rebuildViews = function () { + // clear any old spectrum controls that were bound to old inputs + var spectrums = document.getElementsByClassName("sp-container"); + while (spectrums.length !== 0) document.body.removeChild(spectrums[0]); + var div = this.div; + div.innerHTML = ''; + this.acceptResetDiv.innerHTML = ''; + var trackedList = Object.keys(this.tracked); + for (var i = 0; i < trackedList.length; i++) { + var section = Inspector.createSection(trackedList[i]); + var inspectedProps = this.tracked[trackedList[i]]; + for (var j = 0; j < inspectedProps.length; j++) { + var propname = inspectedProps[j]; + var view = this.inspectedProps[propname]; + if (view.visible !== true) continue; + + section.appendChild(view.getDOM()); + var coll = this.collection; + var group = view.dom; + var label = group.label || group.children[0]; + // optionally, sanitize property name into something human readable + var camelCaseConverter = function (str) { + var words = str.match(/[A-Za-z0-9][a-z]*/g); + words = words.filter(function (str) { // the checkbox is clear enough the property is a bool + return str !== "is"; + }); + return words.map(function (str) { + if (str.length === 0) return str; + else if (str.length === 1) return str.toUpperCase(); + else return str.substring(0, 1).toUpperCase() + str.substring(1); + }).join(" "); + } + label.textContent = propname; //camelCaseConverter(propname); + + var input = group.children[1]; + if (view.options.readOnly) { + for (var k = 0; k < group.children.length; k++) { + group.children[k].disabled = true; + } + } + + var type = view.getType(); + if (type === "Point" || type === "Size" || type === "Margin" || type === "Rect" || type == "Spot") { + view.originalValue = view.getter(propname).copy(); + } else { + var input; + if (type === "Brush" || type === "boolean") input = group; + else input = group.children[1]; + view.originalValue = input.value; + } + + var val = ""; + if (coll !== null) val = view.getter(propname); + view.inferredType = (typeof val); // number, boolean, function, object + if (val === undefined) val = ""; + else if (val === "(null)") { + view.nullCheckBox.checked = true; + } else { + if (view.nullCheckBox) view.nullCheckBox.checked = false; + } + view.populate(val); + } - } - - var type = view.getType(); - if (type === "Point" || type === "Size" || type === "Margin" || type === "Rect" || type == "Spot") { - view.originalValue = view.getter(propname).copy(); - } else { - var input; - if (type === "Brush" || type === "boolean") input = group; - else input = group.children[1]; - view.originalValue = input.value; - } - - var val = ""; - if (coll !== null) val = view.getter(propname); - view.inferredType = (typeof val); // number, boolean, function, object - if (val === undefined) val = ""; - else if (val === "(null)") { - view.nullCheckBox.checked = true; - } else { - if (view.nullCheckBox) view.nullCheckBox.checked = false; - } - view.populate(val); + div.appendChild(section); + } + var self = this; + if (this.acceptButton) { + this.buildButton("Accept", function () { + self.setAllProperties(); + self.rebuildViews(); + }); } - div.appendChild(section); - } - - var self = this; - if (this.acceptButton) { - this.buildButton("Accept", function() { - self.setAllProperties(); - self.rebuildViews(); - }); - } - if (this.resetButton) { - this.buildButton("Reset", function(){ - self.rebuildViews(); - }); - } + if (this.resetButton) { + this.buildButton("Reset", function () { + self.rebuildViews(); + }); + } } -Inspector.prototype.buildButton = function(text, clickFunction) { - var viewName = text + "View"; - if (this[viewName] === undefined) { - var button = document.createElement("input"); - button.type = "button"; - button.value = text; - button.addEventListener("click", clickFunction); - this.viewName = button; - } - this.acceptResetDiv.appendChild(this.viewName); +Inspector.prototype.buildButton = function (text, clickFunction) { + var viewName = text + "View"; + if (this[viewName] === undefined) { + var button = document.createElement("input"); + button.type = "button"; + button.value = text; + button.addEventListener("click", clickFunction); + this.viewName = button; + } + this.acceptResetDiv.appendChild(this.viewName); } -Inspector.prototype.setAllProperties = function() { - var coll = this.collection; - if (coll === null) return; - var diagram = this.diagram; - if (diagram === null) return; - var inspectedProps = this.inspectedProps; - var transactionName = 'set all properties'; - diagram.startTransaction(transactionName); - for (var k in inspectedProps) { - var view = inspectedProps[k]; - if (view.setter === null || view.options.readOnly) continue; - // don't set values that have not changed - var val = view.isNull() ? null : view.use(this); - if (view.originalValue === val) continue; - if (val instanceof go.Point || val instanceof go.Size || val instanceof go.Spot || - val instanceof go.Rect || val instanceof go.Margin) { - if (view.originalValue.equals(val)) continue; +Inspector.prototype.setAllProperties = function () { + var coll = this.collection; + if (coll === null) return; + var diagram = this.diagram; + if (diagram === null) return; + var inspectedProps = this.inspectedProps; + var transactionName = 'set all properties'; + diagram.startTransaction(transactionName); + for (var k in inspectedProps) { + var view = inspectedProps[k]; + if (view.setter === null || view.options.readOnly) continue; + // don't set values that have not changed + var val = view.isNull() ? null : view.use(this); + if (view.originalValue === val) continue; + if (val instanceof go.Point || val instanceof go.Size || val instanceof go.Spot || + val instanceof go.Rect || val instanceof go.Margin) { + if (view.originalValue.equals(val)) continue; + } + view.setter(diagram, view, k, val); } - view.setter(diagram, view, k, val); - } - diagram.commitTransaction(transactionName); - //alert(diagram.model.toJson()); + diagram.commitTransaction(transactionName); + //alert(diagram.model.toJson()); } -Inspector.prototype.createProperty = function(propname, options, object) { - // assume propname to be unique, create it if it does not exist - // right now this clobbers the old View if it existed before - var inspectedProps = this.inspectedProps; - var view = new View(object, options); - inspectedProps[propname] = view; - view.name = propname; +Inspector.prototype.createProperty = function (propname, options, object) { + // assume propname to be unique, create it if it does not exist + // right now this clobbers the old View if it existed before + var inspectedProps = this.inspectedProps; + var view = new View(object, options); + inspectedProps[propname] = view; + view.name = propname; } // create it if it doesn't exist, then append -Inspector.prototype.appendProperty = function(propname, options, object) { - var inspectedProps = this.inspectedProps; - this.createProperty(propname, options, object); - inspectedProps[propname].visible = true; +Inspector.prototype.appendProperty = function (propname, options, object) { + var inspectedProps = this.inspectedProps; + this.createProperty(propname, options, object); + inspectedProps[propname].visible = true; } -Inspector.prototype.hideAllProperties = function() { - var inspectedProps = this.inspectedProps; - for (var propname in inspectedProps) { - inspectedProps[propname].visible = false; - } +Inspector.prototype.hideAllProperties = function () { + var inspectedProps = this.inspectedProps; + for (var propname in inspectedProps) { + inspectedProps[propname].visible = false; + } } // Show all the relevant properties for a given object // If the object is a GoJS object it will look at the Type._inspectedProperties and show those -Inspector.prototype.showObjectProperties = function(obj) { - this.hideAllProperties(); - if (obj === null) return; // no object to show - this.tracked = {}; - // TODO: Allow arbitrary objects later, or objects where _inspectedProperties is not defined - // this will go through them, ie Node Part Panel GraphObject (in that order) - var proto = Object.getPrototypeOf(obj); - //alert(proto.constructor === Object); - - - if(this.propertyNames !== null) { // given list of property names - var propertyNames = this.propertyNames; - var node = this.collection; - for (var k in propertyNames) { - if (go[k] !== undefined && go[k]['_inspectedProperties'] !== undefined) { - // it's Node/Panel/GraphObject/etc, populate the names in the list - var name = k; - var section = Inspector.createSection(name); - this.tracked[name] = []; - var props = propertyNames[k]; - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - - // Find property options - var options = null; - while (options === null && proto && proto.constructor !== Object) { - if (proto.constructor._inspectedProperties[prop]) options = proto.constructor._inspectedProperties[prop]; - proto = Object.getPrototypeOf(proto); - } - this.tracked[name].push(prop); - this.appendProperty(prop, options, obj); +Inspector.prototype.showObjectProperties = function (obj) { + this.hideAllProperties(); + if (obj === null) return; // no object to show + this.tracked = {}; + // TODO: Allow arbitrary objects later, or objects where _inspectedProperties is not defined + // this will go through them, ie Node Part Panel GraphObject (in that order) + var proto = Object.getPrototypeOf(obj); + //alert(proto.constructor === Object); + + + if (this.propertyNames !== null) { // given list of property names + var propertyNames = this.propertyNames; + var node = this.collection; + for (var k in propertyNames) { + if (go[k] !== undefined && go[k]['_inspectedProperties'] !== undefined) { + // it's Node/Panel/GraphObject/etc, populate the names in the list + var name = k; + var section = Inspector.createSection(name); + this.tracked[name] = []; + var props = propertyNames[k]; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + + // Find property options + var options = null; + while (options === null && proto && proto.constructor !== Object) { + if (proto.constructor._inspectedProperties[prop]) options = proto.constructor._inspectedProperties[prop]; + proto = Object.getPrototypeOf(proto); + } + this.tracked[name].push(prop); + this.appendProperty(prop, options, obj); + } + } else { + // Is it a findObject "#name"? Test each and populate + var name = k.substr(1); // remove the # + var obj = node.findObject(name); + if (obj === null) continue; + var section = Inspector.createSection(name); + this.tracked[name] = []; + var props = propertyNames[k]; + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + this.tracked[name].push(prop); + this.appendProperty(prop, { /* empty options */}, obj); + } + } } - } else { - // Is it a findObject "#name"? Test each and populate - var name = k.substr(1); // remove the # - var obj = node.findObject(name); - if (obj === null) continue; + + } else if (proto.constructor === Object) { // arbitrary JS Object (for the Part.data) + var name = 'data'; + var gok = { + '__gohashid': 1, 'loc': 1, 'isGroup': 1, 'group': 1, + 'fromPort': 1, 'toPort': 1, 'points': 1, 'visible': 1, + 'columnDefinitions': 1, 'var_list': 1 + }; + //gok[] = 1; + var go_readonly = {'key': 1, 'category': 1, 'from': 1, 'to': 1}; + var section = Inspector.createSection(name); this.tracked[name] = []; - var props = propertyNames[k]; - for (var i = 0; i < props.length; i++) { - var prop = props[i]; - this.tracked[name].push(prop); - this.appendProperty(prop, { /* empty options */ }, obj); + for (var prop in obj) { + if (prop in gok) { + continue; + } + //alert(prop); + var options = {setter: View.defaultDataSetter}; + /* + if (prop === 'category') { + options['type'] = "String"; + options['readOnly'] = true; + } + */ + if (prop in go_readonly) { + options['readOnly'] = true; + } + this.tracked[name].push(prop); + //alert(obj[prop]); + //alert(this.collection); + this.appendProperty(prop, options, this.collection); + //this.appendProperty(prop, options, obj[prop]); + } + } else { // GoJS object + while (proto && proto.constructor !== Object) { + var props = proto.constructor._inspectedProperties; + // toString often produces strings such as: Class("someInfo")#ID + // We want the name to be just the Class. + var name = (new proto.constructor().toString()).split('#')[0].split('(')[0]; + var section = Inspector.createSection(name); + this.tracked[name] = []; + for (var x in props) { + this.tracked[name].push(x); + this.appendProperty(x, props[x], this.collection); + } + proto = Object.getPrototypeOf(proto); } - } - } - - } else if (proto.constructor === Object) { // arbitrary JS Object (for the Part.data) - var name = 'data'; - var gok = {'__gohashid':1, 'loc':1, 'isGroup':1, 'group':1, - 'fromPort':1, 'toPort':1, 'points':1, 'visible':1, - 'columnDefinitions':1, 'var_list':1}; - //gok[] = 1; - var go_readonly = {'key':1, 'category':1, 'from':1, 'to':1}; - - var section = Inspector.createSection(name); - this.tracked[name] = []; - for (var prop in obj) { - if (prop in gok) { - continue; - } - //alert(prop); - var options = { setter: View.defaultDataSetter }; - /* - if (prop === 'category') { - options['type'] = "String"; - options['readOnly'] = true; - } - */ - if (prop in go_readonly) { - options['readOnly'] = true; - } - this.tracked[name].push(prop); - //alert(obj[prop]); - //alert(this.collection); - this.appendProperty(prop, options, this.collection); - //this.appendProperty(prop, options, obj[prop]); - } - } else { // GoJS object - while (proto && proto.constructor !== Object) { - var props = proto.constructor._inspectedProperties; - // toString often produces strings such as: Class("someInfo")#ID - // We want the name to be just the Class. - var name = (new proto.constructor().toString()).split('#')[0].split('(')[0]; - var section = Inspector.createSection(name); - this.tracked[name] = []; - for (var x in props) { - this.tracked[name].push(x); - this.appendProperty(x, props[x], this.collection); - } - proto = Object.getPrototypeOf(proto); } - } - this.rebuildViews(); + this.rebuildViews(); } // node, part, panel, graphobject properties -Inspector.createSection = function(name) { - var div = document.createElement("div"); - div.className = "inspector-section"; - var h3 = document.createElement("h3"); - //h3.innerHTML = name + " Properties"; chen.wu - h3.innerHTML = "DROP Parameters"; - div.appendChild(h3); - return div; +Inspector.createSection = function (name) { + var div = document.createElement("div"); + div.className = "inspector-section"; + var h3 = document.createElement("h3"); + //h3.innerHTML = name + " Properties"; chen.wu + h3.innerHTML = "DROP Parameters"; + div.appendChild(h3); + return div; } /** -* View -* object: usually the this.collection/Node -*/ + * View + * object: usually the this.collection/Node + */ function View(object, options) { - options = options || {}; - - this.options = options; - this.getter = options.getter || View.defaultGetter; - this.setter = options.setter || View.defaultSetter; - this.inialized = false; - this.visible = true; - this.dom = null; - this.originalValue = null; - this.object = object; + options = options || {}; + + this.options = options; + this.getter = options.getter || View.defaultGetter; + this.setter = options.setter || View.defaultSetter; + this.inialized = false; + this.visible = true; + this.dom = null; + this.originalValue = null; + this.object = object; } -View.prototype.getDOM = function() { - if (!this.inialized) { - this.dom = this.initialize(); - this.inialized = true; - } - return this.dom; +View.prototype.getDOM = function () { + if (!this.inialized) { + this.dom = this.initialize(); + this.inialized = true; + } + return this.dom; } -View.prototype.getType = function() { - return this.options.type || this.inferredType; +View.prototype.getType = function () { + return this.options.type || this.inferredType; } -View.prototype.isNullable = function() { - // check to see if the object was specifically set to nullable in the metadata - if (this.options.nullable) return true; - var type = this.getType(); - if (go[type] !== undefined) { - return !!go[type].nullable; - } - return false; // not nullable by default +View.prototype.isNullable = function () { + // check to see if the object was specifically set to nullable in the metadata + if (this.options.nullable) return true; + var type = this.getType(); + if (go[type] !== undefined) { + return !!go[type].nullable; + } + return false; // not nullable by default } -View.prototype.isNull = function() { - return this.isNullable() && (this.nullCheckBox && this.nullCheckBox.checked); +View.prototype.isNull = function () { + return this.isNullable() && (this.nullCheckBox && this.nullCheckBox.checked); } // Returns a div with a label or null checkbox -View.prototype.makeInspectorGroup = function() { - var div = document.createElement("div"); - div.className = "inspector-group"; - var label = document.createElement("label"); - label.textContent = "LABEL"; - label.className = "property-name"; - - var appendElement = label; - if (this.isNullable()) { - div.className += " inspector-nullable"; - var span = document.createElement("span"); - span.appendChild(label); - var nullLabel = document.createElement("label"); - var nullText = document.createElement("span"); - nullText.textContent = "Null?"; - var nullCheckBox = document.createElement("input"); - nullCheckBox.type = "checkbox"; - nullLabel.appendChild(nullCheckBox); - nullLabel.appendChild(nullText); - span.appendChild(nullLabel); - appendElement = span; - this.nullCheckBox = nullCheckBox; - } - div.appendChild(appendElement); - div.label = label; - return div; +View.prototype.makeInspectorGroup = function () { + var div = document.createElement("div"); + div.className = "inspector-group"; + var label = document.createElement("label"); + label.textContent = "LABEL"; + label.className = "property-name"; + + var appendElement = label; + if (this.isNullable()) { + div.className += " inspector-nullable"; + var span = document.createElement("span"); + span.appendChild(label); + var nullLabel = document.createElement("label"); + var nullText = document.createElement("span"); + nullText.textContent = "Null?"; + var nullCheckBox = document.createElement("input"); + nullCheckBox.type = "checkbox"; + nullLabel.appendChild(nullCheckBox); + nullLabel.appendChild(nullText); + span.appendChild(nullLabel); + appendElement = span; + this.nullCheckBox = nullCheckBox; + } + div.appendChild(appendElement); + div.label = label; + return div; } -View.prototype.nFieldHTMLInit = function(fields) { - var div = this.makeInspectorGroup(); - var colsPerRow = 2; - var inputs = []; - var row = []; +View.prototype.nFieldHTMLInit = function (fields) { + var div = this.makeInspectorGroup(); + var colsPerRow = 2; + var inputs = []; + var row = []; - var populateRow = function() { - var rowDiv = document.createElement("div"); - for (var i = 0; i < row.length; i++) { - rowDiv.appendChild(row[i]); + var populateRow = function () { + var rowDiv = document.createElement("div"); + for (var i = 0; i < row.length; i++) { + rowDiv.appendChild(row[i]); + } + rowDiv.className = "row"; + div.appendChild(rowDiv); + row = []; } - rowDiv.className = "row"; - div.appendChild(rowDiv); - row = []; - } - for (var i = 0; i < fields.length; i++) { - var label = document.createElement("label"); - label.textContent = fields[i]; - label.className = "inspector-n-field-label"; - - var input = document.createElement("input"); - input.className = "input-short"; - inputs.push(input); - - var cell = document.createElement("div"); - cell.className = "cell"; - cell.appendChild(label); - cell.appendChild(input); - row.push(cell); - if (row.length % colsPerRow === 0) populateRow(); - } + for (var i = 0; i < fields.length; i++) { + var label = document.createElement("label"); + label.textContent = fields[i]; + label.className = "inspector-n-field-label"; + + var input = document.createElement("input"); + input.className = "input-short"; + inputs.push(input); + + var cell = document.createElement("div"); + cell.className = "cell"; + cell.appendChild(label); + cell.appendChild(input); + row.push(cell); + if (row.length % colsPerRow === 0) populateRow(); + } - if (row.length !== 0) populateRow(); + if (row.length !== 0) populateRow(); - this.inputs = inputs; - return div; + this.inputs = inputs; + return div; } -View.prototype.initialize = function() { - var dom = this.dom; - var type = this.getType(); - var div = null; - switch (type) { - case "Enum": - div = this.makeInspectorGroup(); - var select = document.createElement("select"); - div.appendChild(select); - break; - case "Margin": - div = this.nFieldHTMLInit(["Top", "Right", "Bottom", "Left"]); - break; - case "Point": - div = this.nFieldHTMLInit(["X", "Y"]); - break; - case "Rect": - div = this.nFieldHTMLInit(["X", "Y", "Width", "Height"]); - break; - case "Size": - div = this.nFieldHTMLInit(["Width", "Height"]); - break; - case "Spot": - div = this.nFieldHTMLInit(["X", "Y", "Offset X", "Offset Y"]); - var inputs = this.inputs; - var select = document.createElement("select"); - - var spots = []; - var i = 0; - var custom = document.createElement("option"); - custom.value = -1; - custom.text = "Custom Spot"; - select.appendChild(custom); - for (var k in go.Spot) { - if (go.Spot[k] instanceof go.Spot) { - var option = document.createElement("option"); - option.value = i; - option.text = k; - i++; - select.appendChild(option); - } - } - select.value = -1; - select.div = div; - div.dropdown = select; - var view = this; - select.onchange = function() { - var selected = select[select.selectedIndex].text; - if (selected === "Custom Spot") return; - var spot = go.Spot.parse(selected); - view.inputs[0].value = spot.x; - view.inputs[1].value = spot.y; - view.inputs[2].value = spot.offsetX; - view.inputs[3].value = spot.offsetY; - } - div.selectIndex = div.children.length; - div.appendChild(select); - break; - case "Brush": - div = this.makeInspectorGroup(); - var brushTextField = document.createElement("input"); - brushTextField.type = "text"; - div.appendChild(brushTextField); - break; - case "boolean": - div = this.makeInspectorGroup(); - var input = document.createElement("input"); - input.type = "checkbox"; - input.className = "inspector-boolean-control"; - var label = div.children[0]; - label.className = "make-inline"; - div.insertBefore(input, label); - div.input = input; - break; - case "number": - default: - div = this.makeInspectorGroup(); - var input = document.createElement("input"); - input.type = "text"; - if (this.getType() === "number") input.className += " right-align"; - input.className += " input-long"; - div.appendChild(input); - div.input = input; - break; - } - return div; +View.prototype.initialize = function () { + var dom = this.dom; + var type = this.getType(); + var div = null; + switch (type) { + case "Enum": + div = this.makeInspectorGroup(); + var select = document.createElement("select"); + div.appendChild(select); + break; + case "Margin": + div = this.nFieldHTMLInit(["Top", "Right", "Bottom", "Left"]); + break; + case "Point": + div = this.nFieldHTMLInit(["X", "Y"]); + break; + case "Rect": + div = this.nFieldHTMLInit(["X", "Y", "Width", "Height"]); + break; + case "Size": + div = this.nFieldHTMLInit(["Width", "Height"]); + break; + case "Spot": + div = this.nFieldHTMLInit(["X", "Y", "Offset X", "Offset Y"]); + var inputs = this.inputs; + var select = document.createElement("select"); + + var spots = []; + var i = 0; + var custom = document.createElement("option"); + custom.value = -1; + custom.text = "Custom Spot"; + select.appendChild(custom); + for (var k in go.Spot) { + if (go.Spot[k] instanceof go.Spot) { + var option = document.createElement("option"); + option.value = i; + option.text = k; + i++; + select.appendChild(option); + } + } + select.value = -1; + select.div = div; + div.dropdown = select; + var view = this; + select.onchange = function () { + var selected = select[select.selectedIndex].text; + if (selected === "Custom Spot") return; + var spot = go.Spot.parse(selected); + view.inputs[0].value = spot.x; + view.inputs[1].value = spot.y; + view.inputs[2].value = spot.offsetX; + view.inputs[3].value = spot.offsetY; + } + div.selectIndex = div.children.length; + div.appendChild(select); + break; + case "Brush": + div = this.makeInspectorGroup(); + var brushTextField = document.createElement("input"); + brushTextField.type = "text"; + div.appendChild(brushTextField); + break; + case "boolean": + div = this.makeInspectorGroup(); + var input = document.createElement("input"); + input.type = "checkbox"; + input.className = "inspector-boolean-control"; + var label = div.children[0]; + label.className = "make-inline"; + div.insertBefore(input, label); + div.input = input; + break; + case "number": + default: + div = this.makeInspectorGroup(); + var input = document.createElement("input"); + input.type = "text"; + if (this.getType() === "number") input.className += " right-align"; + input.className += " input-long"; + div.appendChild(input); + div.input = input; + break; + } + return div; } // end view init -View.prototype.populate = function(val) { - var dom = this.dom; - var type = this.getType(); - switch (type) { - case "Enum": - var vals = this.options.enumValues; - var select = this.dom.children[1]; - select.innerHTML = ""; - if (select.length === 0) { - for (var i = 0; i < vals.length; i++) { - var option = document.createElement("option"); - option.value = i; - // just show the second half ("Position" instead of "Panel.Position") - option.innerHTML = vals[i].toString().split('.')[1]; - select.appendChild(option); - } - } - var index = -1; - for (var i = 0; i < select.length; i++) { - if (select[i].text === val.toString().split('.')[1]) { - index = i; - break; - } - } - select.value = index; - break; - case "Margin": - this.nFieldHTMLPopulate([val.top, val.left, val.bottom, val.right]); - break; - case "Point": - this.nFieldHTMLPopulate([val.x, val.y]); - break; - case "Rect": - this.nFieldHTMLPopulate([val.x, val.y, val.width, val.height]); - break; - case "Size": - this.nFieldHTMLPopulate([val.width, val.height]); - break; - case "Spot": - if (val instanceof go.Spot) { - // check to see if spot we have is equal to a predefined Spot - var predefined = null; - for (var k in go.Spot) { - if (go.Spot[k] instanceof go.Spot && go.Spot[k].equals(val)) { - predefined = k; +View.prototype.populate = function (val) { + var dom = this.dom; + var type = this.getType(); + switch (type) { + case "Enum": + var vals = this.options.enumValues; + var select = this.dom.children[1]; + select.innerHTML = ""; + if (select.length === 0) { + for (var i = 0; i < vals.length; i++) { + var option = document.createElement("option"); + option.value = i; + // just show the second half ("Position" instead of "Panel.Position") + option.innerHTML = vals[i].toString().split('.')[1]; + select.appendChild(option); + } + } + var index = -1; + for (var i = 0; i < select.length; i++) { + if (select[i].text === val.toString().split('.')[1]) { + index = i; + break; + } + } + select.value = index; break; - } - } - var select = dom.dropdown; - if (predefined !== null) { - var index = -1; - for (var i = 0; i < select.children.length; i++) { - var child = select.children[i]; - if (child.text === predefined) { - index = parseInt(child.value); - break; + case "Margin": + this.nFieldHTMLPopulate([val.top, val.left, val.bottom, val.right]); + break; + case "Point": + this.nFieldHTMLPopulate([val.x, val.y]); + break; + case "Rect": + this.nFieldHTMLPopulate([val.x, val.y, val.width, val.height]); + break; + case "Size": + this.nFieldHTMLPopulate([val.width, val.height]); + break; + case "Spot": + if (val instanceof go.Spot) { + // check to see if spot we have is equal to a predefined Spot + var predefined = null; + for (var k in go.Spot) { + if (go.Spot[k] instanceof go.Spot && go.Spot[k].equals(val)) { + predefined = k; + break; + } + } + var select = dom.dropdown; + if (predefined !== null) { + var index = -1; + for (var i = 0; i < select.children.length; i++) { + var child = select.children[i]; + if (child.text === predefined) { + index = parseInt(child.value); + break; + } + } + select.value = index; + } } - } - select.value = index; - } - } - if (typeof val === "String") val = go.Spot.parse(val); - this.nFieldHTMLPopulate([val.x, val.y, val.offsetX, val.offsetY]); - break; - case "Brush": - var checkbox = this.nullCheckBox; - var brushTextField = dom.children[1]; - if (val === "(null)") val = "black"; // - // val is either a String or a Brush. If it's a Brush, make it a String - var selected = $(brushTextField); - if (typeof val === "string" || val.type === go.Brush.Solid) { - var colorString = val; - if (val instanceof go.Brush) colorString = val.color; - var options = { - replacerClassName: 'spectrum-control', - color: colorString, - showAlpha: true, - showInput: true, - clickoutFiresChange: true, - showButtons: false, - preferredFormat: "hex" - }; - selected.spectrum(options); - } else { - selected.spectrum("destroy"); - } - if (val instanceof go.Brush) { - val = ExtendedBrush.stringify(val); - } - brushTextField.value = val; // val is now a String - break; - case "boolean": - var input = dom.children[0]; - input.checked = val; - break; - case "number": - dom.children[1].value = val; - break; - default: - dom.children[1].value = val; - break; - } + if (typeof val === "String") val = go.Spot.parse(val); + this.nFieldHTMLPopulate([val.x, val.y, val.offsetX, val.offsetY]); + break; + case "Brush": + var checkbox = this.nullCheckBox; + var brushTextField = dom.children[1]; + if (val === "(null)") val = "black"; // + // val is either a String or a Brush. If it's a Brush, make it a String + var selected = $(brushTextField); + if (typeof val === "string" || val.type === go.Brush.Solid) { + var colorString = val; + if (val instanceof go.Brush) colorString = val.color; + var options = { + replacerClassName: 'spectrum-control', + color: colorString, + showAlpha: true, + showInput: true, + clickoutFiresChange: true, + showButtons: false, + preferredFormat: "hex" + }; + selected.spectrum(options); + } else { + selected.spectrum("destroy"); + } + if (val instanceof go.Brush) { + val = ExtendedBrush.stringify(val); + } + brushTextField.value = val; // val is now a String + break; + case "boolean": + var input = dom.children[0]; + input.checked = val; + break; + case "number": + dom.children[1].value = val; + break; + default: + dom.children[1].value = val; + break; + } } // end view populate -View.prototype.nFieldHTMLPopulate = function(arr) { - var children = this.inputs; - for (var i = 0; i < arr.length; i++) { - children[i].value = arr[i]; - } +View.prototype.nFieldHTMLPopulate = function (arr) { + var children = this.inputs; + for (var i = 0; i < arr.length; i++) { + children[i].value = arr[i]; + } } -View.prototype.use = function(inspector) { - var group = this.dom; - var type = this.getType(); - var val = null; - switch (type) { - case "Enum": - val = this.options.enumValues[group.children[1].selectedIndex]; - break; - case "Margin": - var obj = this.nFieldHTMLUse(4); - val = new go.Margin(obj[0], obj[1], obj[2], obj[3]); - break; - case "Point": - var obj = this.nFieldHTMLUse(2); - val = new go.Point(obj[0], obj[1]); - break; - case "Rect": - var obj = this.nFieldHTMLUse(4); - val = new go.Rect(obj[0], obj[1], obj[2], obj[3]); - break; - case "Size": - var obj = this.nFieldHTMLUse(2); - val = new go.Size(obj[0], obj[1]); - break; - case "Spot": - var obj = this.nFieldHTMLUse(4); - var select = this.dom.children[this.dom.selectIndex]; - if (select.selectedIndex !== 0) { - var spot = go.Spot.parse(select[select.selectedIndex].text); - var equals = function(a,b) { return a === b || (isNaN(a) && isNaN(b)); } - // prefedined spots have NaN in their fields. You can't pass NaN into the normal spot constructor. - // instead of constructing a Spot, try to see if it equals the selected item and returned the prefedined spot - if (equals(obj[0], spot.x) && equals(obj[1], spot.y) && equals(obj[2], spot.offsetX) && equals(obj[3], spot.offsetY)) - val = spot; - // otherwise, build a new Spot and just return that - } - if (val === null) val = new go.Spot(obj[0], obj[1], obj[2], obj[3]); - break; - case "Brush": - if (this.nullCheckBox.checked) { - val = null; - } else { - var brushTextField = group.children[1].value; - var part = inspector.collection; - part = part.part; - var brush = ExtendedBrush.parse(brushTextField, part.measuredBounds.width, part.measuredBounds.height); - val = brush; - } - break; - case "boolean": - val = group.children[0].checked; - break; - case "number": - val = parseFloat(group.input.value); - break; - default: - val = group.input.value; - break; - } - return val; +View.prototype.use = function (inspector) { + var group = this.dom; + var type = this.getType(); + var val = null; + switch (type) { + case "Enum": + val = this.options.enumValues[group.children[1].selectedIndex]; + break; + case "Margin": + var obj = this.nFieldHTMLUse(4); + val = new go.Margin(obj[0], obj[1], obj[2], obj[3]); + break; + case "Point": + var obj = this.nFieldHTMLUse(2); + val = new go.Point(obj[0], obj[1]); + break; + case "Rect": + var obj = this.nFieldHTMLUse(4); + val = new go.Rect(obj[0], obj[1], obj[2], obj[3]); + break; + case "Size": + var obj = this.nFieldHTMLUse(2); + val = new go.Size(obj[0], obj[1]); + break; + case "Spot": + var obj = this.nFieldHTMLUse(4); + var select = this.dom.children[this.dom.selectIndex]; + if (select.selectedIndex !== 0) { + var spot = go.Spot.parse(select[select.selectedIndex].text); + var equals = function (a, b) { + return a === b || (isNaN(a) && isNaN(b)); + } + // prefedined spots have NaN in their fields. You can't pass NaN into the normal spot constructor. + // instead of constructing a Spot, try to see if it equals the selected item and returned the prefedined spot + if (equals(obj[0], spot.x) && equals(obj[1], spot.y) && equals(obj[2], spot.offsetX) && equals(obj[3], spot.offsetY)) + val = spot; + // otherwise, build a new Spot and just return that + } + if (val === null) val = new go.Spot(obj[0], obj[1], obj[2], obj[3]); + break; + case "Brush": + if (this.nullCheckBox.checked) { + val = null; + } else { + var brushTextField = group.children[1].value; + var part = inspector.collection; + part = part.part; + var brush = ExtendedBrush.parse(brushTextField, part.measuredBounds.width, part.measuredBounds.height); + val = brush; + } + break; + case "boolean": + val = group.children[0].checked; + break; + case "number": + val = parseFloat(group.input.value); + break; + default: + val = group.input.value; + break; + } + return val; } // end view use -View.prototype.nFieldHTMLUse = function(count) { - var obj = []; - var children = this.inputs; - for (var i = 0; i < children.length; i++) { - obj[i] = parseFloat(children[i].value); - } - return obj; +View.prototype.nFieldHTMLUse = function (count) { + var obj = []; + var children = this.inputs; + for (var i = 0; i < children.length; i++) { + obj[i] = parseFloat(children[i].value); + } + return obj; } -View.defaultGetter = function(propname) { - var val = this.object[propname]; - if (val === null) return "(null)"; - return val; +View.defaultGetter = function (propname) { + var val = this.object[propname]; + if (val === null) return "(null)"; + return val; } -View.defaultDataGetter = function(propname) { - return this.object[propname]; +View.defaultDataGetter = function (propname) { + return this.object[propname]; } /** -* @param {Diagram} diagram -* @param {View} view -* @param {GraphObject} obj -* @param {string} propname -* @param {string} value -*/ -View.defaultSetter = function(diagram, view, propname, value) { - - //var mytype = view.getType(); - //if (mytype === "number") value = parseFloat(value); - - this.object[propname] = value; // save in the inspector only - /* - if (propname == 'clean') { - propname = 'clean_para'; - } - */ - - //alert(this.object.toString() + "**" + propname.toString() + "-" + value.toString()); - diagram.model.setDataProperty(this.object, propname.toString(), value); - //alert(diagram.model.nodeDataArray[0]["clean_para"]); - //diagram.model. + * @param {Diagram} diagram + * @param {View} view + * @param {GraphObject} obj + * @param {string} propname + * @param {string} value + */ +View.defaultSetter = function (diagram, view, propname, value) { + + //var mytype = view.getType(); + //if (mytype === "number") value = parseFloat(value); + + this.object[propname] = value; // save in the inspector only + /* + if (propname == 'clean') { + propname = 'clean_para'; + } + */ + + //alert(this.object.toString() + "**" + propname.toString() + "-" + value.toString()); + diagram.model.setDataProperty(this.object, propname.toString(), value); + //alert(diagram.model.nodeDataArray[0]["clean_para"]); + //diagram.model. } /** -* @param {Diagram} diagram -* @param {View} view -* @param {Object} data -* @param {string} propname -* @param {string} value -*/ -View.defaultDataSetter = function(diagram, view, propname, value) { - - // save in the inspector only - /* - if (propname == 'clean') { - propname = 'clean_para'; - } - */ - //this.object[propname] = value; - //alert(propname.toString() + ":" + value.toString()); - diagram.model.setDataProperty(this.object, propname, value); + * @param {Diagram} diagram + * @param {View} view + * @param {Object} data + * @param {string} propname + * @param {string} value + */ +View.defaultDataSetter = function (diagram, view, propname, value) { + + // save in the inspector only + /* + if (propname == 'clean') { + propname = 'clean_para'; + } + */ + //this.object[propname] = value; + //alert(propname.toString() + ":" + value.toString()); + diagram.model.setDataProperty(this.object, propname, value); } @@ -864,319 +868,319 @@ View.defaultDataSetter = function(diagram, view, propname, value) { // readOnly: boolean (false by default, if omitted) // nullable: a property with nullable set to true means that it can be null. If omitted, objects are assumed to not be nullable unless a specific type (ie, Brush/Margin/etc) permits it go.GraphObject._inspectedProperties = { - "stretch": { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], - defaultValue: go.GraphObject.Default - }, - "name": { - type: "String", - readOnly: true - }, - "opacity": { - type: "number", - defaultValue: 1 - }, - "visible": { - type: "boolean", - defaultValue: true - }, - "areaBackground": { - type: "Brush", - defaultValue: null - }, - "background": { - type: "Brush", - defaultValue: null - }, - "position": { type: "Point" }, - "scale": { - type: "number", - defaultValue: 1 - }, - "angle": { - type: "number", - defaultValue: 0 - }, - "desiredSize": { type: "Size" }, - "measuredBounds": { - type: "Rect", - readOnly: true - }, - "naturalBounds": { - type: "Rect", - readOnly: true - }, - "portId" : { - type: "string", - nullable: true, - defaultValue: null - }, - "minSize" : { - type: "Size", - defaultValue: new go.Size(0, 0) - }, - "maxSize" : { - type: "Size", - defaultValue: new go.Size(Infinity, Infinity) - } + "stretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], + defaultValue: go.GraphObject.Default + }, + "name": { + type: "String", + readOnly: true + }, + "opacity": { + type: "number", + defaultValue: 1 + }, + "visible": { + type: "boolean", + defaultValue: true + }, + "areaBackground": { + type: "Brush", + defaultValue: null + }, + "background": { + type: "Brush", + defaultValue: null + }, + "position": {type: "Point"}, + "scale": { + type: "number", + defaultValue: 1 + }, + "angle": { + type: "number", + defaultValue: 0 + }, + "desiredSize": {type: "Size"}, + "measuredBounds": { + type: "Rect", + readOnly: true + }, + "naturalBounds": { + type: "Rect", + readOnly: true + }, + "portId": { + type: "string", + nullable: true, + defaultValue: null + }, + "minSize": { + type: "Size", + defaultValue: new go.Size(0, 0) + }, + "maxSize": { + type: "Size", + defaultValue: new go.Size(Infinity, Infinity) + } } go.Shape._inspectedProperties = { - "fill": { - type: "Brush", - defaultValue: "black" - }, - "stroke": { - type: "Brush", - defaultValue: "black" - }, - "strokeWidth": { - type: "number", - defaultValue: 1.0 - }, - "strokeCap": { - type: "String", - defaultValue: "butt" - }, - "strokeJoin": { - type: "String", - defaultValue: "miter" - }, - "strokeMiterLimit": { - type: "number", - defaultValue: 10 - }, - - /* - TODO - "strokeDashArray": { - type: "Array", - defaultValue: null - }, - "strokeDashOffset": { - type: "number", - defaultValue: 0 - }, - */ - "figure": { - type: "String", - defaultValue: "None" - }, - "toArrow": { - type: "String", - defaultValue: "None" - }, - "fromArrow": { - type: "String", - defaultValue: "None" - }, - "geometryStretch": { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.Default], - defaultValue: go.GraphObject.Default - } + "fill": { + type: "Brush", + defaultValue: "black" + }, + "stroke": { + type: "Brush", + defaultValue: "black" + }, + "strokeWidth": { + type: "number", + defaultValue: 1.0 + }, + "strokeCap": { + type: "String", + defaultValue: "butt" + }, + "strokeJoin": { + type: "String", + defaultValue: "miter" + }, + "strokeMiterLimit": { + type: "number", + defaultValue: 10 + }, + + /* + TODO + "strokeDashArray": { + type: "Array", + defaultValue: null + }, + "strokeDashOffset": { + type: "number", + defaultValue: 0 + }, + */ + "figure": { + type: "String", + defaultValue: "None" + }, + "toArrow": { + type: "String", + defaultValue: "None" + }, + "fromArrow": { + type: "String", + defaultValue: "None" + }, + "geometryStretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.Default], + defaultValue: go.GraphObject.Default + } } go.TextBlock._inspectedProperties = { - "font": { - type: "String", - defaultValue: "10px sans-serif" - }, - "text": {type: "String"}, - "textAlign": { - type: "String", - defaultValue: "start" - }, - "isMultiline": { - type: "boolean", - defaultValue: true - }, - "isUnderline": { - type: "boolean", - defaultValue: false - }, - "isStrikethrough": { - type: "boolean", - defaultValue: false - }, - "wrap": { - type: "Enum", - enumValues: [go.TextBlock.WrapDesiredSize, go.TextBlock.WrapFit, go.TextBlock.None], - defaultValue: go.TextBlock.WrapDesiredSize - }, - "overflow": { - type: "Enum", - enumValues: [go.TextBlock.OverflowClip, go.TextBlock.OverflowEllipsis], - defaultValue: go.TextBlock.OverflowClip - }, - "stroke": { - type: "Brush", - defaultValue: "black" - }, - "lineCount": { - type: "number", - readOnly: true - }, - "editable": {type: "boolean"} + "font": { + type: "String", + defaultValue: "10px sans-serif" + }, + "text": {type: "String"}, + "textAlign": { + type: "String", + defaultValue: "start" + }, + "isMultiline": { + type: "boolean", + defaultValue: true + }, + "isUnderline": { + type: "boolean", + defaultValue: false + }, + "isStrikethrough": { + type: "boolean", + defaultValue: false + }, + "wrap": { + type: "Enum", + enumValues: [go.TextBlock.WrapDesiredSize, go.TextBlock.WrapFit, go.TextBlock.None], + defaultValue: go.TextBlock.WrapDesiredSize + }, + "overflow": { + type: "Enum", + enumValues: [go.TextBlock.OverflowClip, go.TextBlock.OverflowEllipsis], + defaultValue: go.TextBlock.OverflowClip + }, + "stroke": { + type: "Brush", + defaultValue: "black" + }, + "lineCount": { + type: "number", + readOnly: true + }, + "editable": {type: "boolean"} } go.Panel._inspectedProperties = { - "type": { - type: "Enum", - enumValues: [go.Panel.Position, go.Panel.Vertical, go.Panel.Horizontal, go.Panel.Auto, go.Panel.Spot, go.Panel.Table, go.Panel.Viewbox, - go.Panel.Link, go.Panel.TableRow, go.Panel.TableColumn, go.Panel.Grid], - defaultValue: go.Panel.Position - }, - "padding": { - type: "Margin", - defaultValue: new go.Margin() - }, - "defaultAlignment": { - type: "Spot", - defaultValue: go.Spot.Default - }, - "defaultStretch": { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], - defaultValue : go.GraphObject.Default - }, - "gridCellSize": { - type: "Size", - defaultValue: new go.Size(10, 10) - }, - "gridOrigin": { - type: "Point", - defaultValue: new go.Point() - } + "type": { + type: "Enum", + enumValues: [go.Panel.Position, go.Panel.Vertical, go.Panel.Horizontal, go.Panel.Auto, go.Panel.Spot, go.Panel.Table, go.Panel.Viewbox, + go.Panel.Link, go.Panel.TableRow, go.Panel.TableColumn, go.Panel.Grid], + defaultValue: go.Panel.Position + }, + "padding": { + type: "Margin", + defaultValue: new go.Margin() + }, + "defaultAlignment": { + type: "Spot", + defaultValue: go.Spot.Default + }, + "defaultStretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Horizontal, go.GraphObject.Vertical, go.GraphObject.Default], + defaultValue: go.GraphObject.Default + }, + "gridCellSize": { + type: "Size", + defaultValue: new go.Size(10, 10) + }, + "gridOrigin": { + type: "Point", + defaultValue: new go.Point() + } } go.Part._inspectedProperties = { - "location": { - type: "Point" - }, - "locationSpot": {type: "Spot"}, - "resizable": { - type: "boolean", - defaultValue: false - }, - "rotatable": { - type: "boolean", - defaultValue: false - }, - "isShadowed": { - type: "boolean", - defaultValue: false - } - /* , - "locationObjectName": null, - "selectionObjectName": null, - "layerName": null, - "category": null, - "resizeObjectName": null, - "rotateObjectName": null, - "text": null, - "shadowOffset": null, - "shadowColor": null, - "shadowBlur": null*/ + "location": { + type: "Point" + }, + "locationSpot": {type: "Spot"}, + "resizable": { + type: "boolean", + defaultValue: false + }, + "rotatable": { + type: "boolean", + defaultValue: false + }, + "isShadowed": { + type: "boolean", + defaultValue: false + } + /* , + "locationObjectName": null, + "selectionObjectName": null, + "layerName": null, + "category": null, + "resizeObjectName": null, + "rotateObjectName": null, + "text": null, + "shadowOffset": null, + "shadowColor": null, + "shadowBlur": null*/ } go.Node._inspectedProperties = { - "isTreeExpanded": { - type: "boolean", - defaultValue: true - } - /*, - "avoidable": null, - "avoidableMargin": null*/ + "isTreeExpanded": { + type: "boolean", + defaultValue: true + } + /*, + "avoidable": null, + "avoidableMargin": null*/ } go.Link._inspectedProperties = { - "fromSpot": {type: "Spot"}, - "toSpot": {type: "Spot"}, - "relinkableFrom": { - type: "boolean", - defaultValue: false - }, - "relinkableTo": { - type: "boolean", - defaultValue: false - }, - "resegmentable": { - type: "boolean", - defaultValue: false - }, - // technically a property of Part, only used on Links - "reshapable": { - type: "boolean", - defaultValue: false - }, - "midPoint": { - type: "Point", - readOnly: true - }, - "midAngle": { - type: "number", - readOnly: true - }, - "isOrthogonal": { - type: "boolean", - readOnly: true - }, - "isAvoiding": { - type: "boolean", - readOnly: true - }, - "corner": { - type: "number", - defaultValue: 0 - }, - "curve": { - type: "Enum", - enumValues: [go.Link.None, go.Link.Bezier, go.Link.JumpGap, go.Link.JumpOver], - defaultValue: go.Link.None - }, - "curviness": { - type: "number", - defaultValue: NaN - }, - "routing": { - type: "Enum", - enumValues: [go.Link.Normal, go.Link.Orthogonal, go.Link.AvoidsNodes], - defaultValue: go.Link.Normal - }, - "smoothness": { - type: "number", - defaultValue: 0.5 - } + "fromSpot": {type: "Spot"}, + "toSpot": {type: "Spot"}, + "relinkableFrom": { + type: "boolean", + defaultValue: false + }, + "relinkableTo": { + type: "boolean", + defaultValue: false + }, + "resegmentable": { + type: "boolean", + defaultValue: false + }, + // technically a property of Part, only used on Links + "reshapable": { + type: "boolean", + defaultValue: false + }, + "midPoint": { + type: "Point", + readOnly: true + }, + "midAngle": { + type: "number", + readOnly: true + }, + "isOrthogonal": { + type: "boolean", + readOnly: true + }, + "isAvoiding": { + type: "boolean", + readOnly: true + }, + "corner": { + type: "number", + defaultValue: 0 + }, + "curve": { + type: "Enum", + enumValues: [go.Link.None, go.Link.Bezier, go.Link.JumpGap, go.Link.JumpOver], + defaultValue: go.Link.None + }, + "curviness": { + type: "number", + defaultValue: NaN + }, + "routing": { + type: "Enum", + enumValues: [go.Link.Normal, go.Link.Orthogonal, go.Link.AvoidsNodes], + defaultValue: go.Link.Normal + }, + "smoothness": { + type: "number", + defaultValue: 0.5 + } } go.Group._inspectedProperties = { - "ungroupable": { - type: "boolean", - defaultValue: false - }, - "isSubGraphExpanded": { - type: "boolean", - defaultValue: true - } + "ungroupable": { + type: "boolean", + defaultValue: false + }, + "isSubGraphExpanded": { + type: "boolean", + defaultValue: true + } } go.Picture._inspectedProperties = { - "source" : {type: "string"}, - "imageStretch" : { - type: "Enum", - enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.UniformToFill], - defaultValue: go.GraphObject.None - }, - "naturalBounds" : { - type: "Rect", - readOnly: true - }, - "sourceRect" : { - type : "Rect", - defaultValue: new go.Rect(NaN, NaN, NaN, NaN) - } + "source": {type: "string"}, + "imageStretch": { + type: "Enum", + enumValues: [go.GraphObject.None, go.GraphObject.Fill, go.GraphObject.Uniform, go.GraphObject.UniformToFill], + defaultValue: go.GraphObject.None + }, + "naturalBounds": { + type: "Rect", + readOnly: true + }, + "sourceRect": { + type: "Rect", + defaultValue: new go.Rect(NaN, NaN, NaN, NaN) + } } go.Brush.nullable = true; diff --git a/daliuge-translator/dlg/dropmake/web/__init__.py b/daliuge-translator/dlg/dropmake/web/__init__.py index 3c21c477b..99f4c9943 100644 --- a/daliuge-translator/dlg/dropmake/web/__init__.py +++ b/daliuge-translator/dlg/dropmake/web/__init__.py @@ -1,4 +1,3 @@ - # ICRAR - International Centre for Radio Astronomy Research # (c) UWA - The University of Western Australia, 2015 # Copyright by UWA (in the framework of the ICRAR) diff --git a/daliuge-translator/dlg/dropmake/web/go.js b/daliuge-translator/dlg/dropmake/web/go.js index 6651687f6..9d5a3d012 100644 --- a/daliuge-translator/dlg/dropmake/web/go.js +++ b/daliuge-translator/dlg/dropmake/web/go.js @@ -5,1911 +5,33829 @@ * Copyright (C) 1998-2015 by Northwoods Software Corporation. All Rights Reserved. * THIS SOFTWARE IS LICENSED. THE LICENSE AGREEMENT IS AT: http://www.gojs.net/1.5.9/doc/license.html. */ -(function(window) { var g,da={};if(!window.document||void 0===window.document.createElement("canvas").getContext)throw window.console&&window.console.log("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode."),Error("The HTML Canvas element is not supported in this browser,or this browser is in Compatibility mode.");if(!Object.defineProperty)throw Error("GoJS requires a newer version of JavaScript"); -(function(){for(var a=0,b=["ms","moz","webkit","o"],c=0;c=a.length?a.push(c):a.splice(b,0,c):u.k("Cannot insert an object into an HTMLCollection or NodeList: "+c+" at "+b)},zi:function(a,b){Array.isArray(a)?b>=a.length?a.pop():a.splice(b,1):u.k("Cannot remove an object from an HTMLCollection or NodeList at "+b)},Ww:[],K:function(){var a=u.Ww.pop();return void 0===a?new w:a},fc:function(a,b){var c=u.Ww.pop();if(void 0===c)return new w(a,b);c.x=a;c.y=b;return c},v:function(a){u.Ww.push(a)},xA:[],ul:function(){var a=u.xA.pop();return void 0=== -a?new ia:a},Oj:function(a){u.xA.push(a)},Xw:[],Sf:function(){var a=u.Xw.pop();return void 0===a?new z:a},Vj:function(a,b,c,d){var e=u.Xw.pop();if(void 0===e)return new z(a,b,c,d);e.x=a;e.y=b;e.width=c;e.height=d;return e},ic:function(a){u.Xw.push(a)},yA:[],jh:function(){var a=u.yA.pop();return void 0===a?new ja:a},Ye:function(a){u.yA.push(a)},Yw:null,p:function(){var a=u.Yw;return null!==a?(u.Yw=null,a):new ka},q:function(a){a.reset();u.Yw=a},wA:[],eb:function(){var a=u.wA.pop();return void 0===a? -[]:a},ra:function(a){a.length=0;u.wA.push(a)},mh:Object.freeze([]),zA:1,gc:function(a){a.__gohashid=u.zA++},Is:function(a){var b=a.__gohashid;void 0===b&&(b=u.zA++,a.__gohashid=b);return b},Uc:function(a){return a.__gohashid},fa:function(a,b){b.hx=a;da[a]=b},Ga:function(a,b){function c(){}c.prototype=b.prototype;a.prototype=new c;a.prototype.constructor=a},Lh:function(a){a.AF=!0},defineProperty:function(a,b,c,d,e){u.j(a,"function","Util.defineProperty:classfunc");u.j(b,"object","Util.defineProperty:propobj"); -u.j(c,"function","Util.defineProperty:getter");u.j(d,"function","Util.defineProperty:setter");for(var f in b){b=b[f];c={get:c,set:d};if(void 0!==e)for(var h in e)c[h]=e[h];Object.defineProperty(a.prototype,f,c);e=Object.getOwnPropertyDescriptor(a.prototype,f);b&&e&&Object.defineProperty(a.prototype,b,e);break}},u:function(a,b,c,d){u.j(a,"function","Util.defineReadOnlyProperty:classfunc");u.j(b,"object","Util.defineReadOnlyProperty:propobj");u.j(c,"function","Util.defineReadOnlyProperty:getter");for(var e in b){var f= -b[e];b={get:c,set:function(a){u.k('The property "'+f+'" is read-only and cannot be set to '+a)}};if(void 0!==d)for(var h in d)b[h]=d[h];Object.defineProperty(a.prototype,e,b);d=Object.getOwnPropertyDescriptor(a.prototype,e);f&&d&&Object.defineProperty(a.prototype,f,d);break}},Xd:function(a,b){for(var c in b)b[c]=!0;a.prototype.UB=b},getTypeName:function(a){return void 0===a?"":"string"===typeof a?a:"function"===typeof a?u.rg(a):null===a?"*":""},rg:function(a){if("function"===typeof a){if(a.hx)return a.hx; -if(a.name)return a.name;var b=a.toString(),c=b.indexOf("("),b=b.substring(9,c).trim();if(""!==b)return a.hx=b}else if("object"===typeof a&&a.constructor)return u.rg(a.constructor);return typeof a},s:function(a,b,c){u.j(a,"function","Util.defineEnumValue:classfunc");u.j(b,"string","Util.defineEnumValue:name");u.j(c,"number","Util.defineEnumValue:num");c=new ea(a,b,c);Object.freeze(c);a[b]=c;var d=a.Dt;d instanceof la||(d=new la("string",ea),a.Dt=d);d.add(b,c);return c},sb:function(a,b){if(!a||!b)return null; -var c=void 0;try{"function"===typeof b?c=b(a):"function"===typeof a.getAttribute?(c=a.getAttribute(b),null===c&&(c=void 0)):c=a[b]}catch(d){}return c},Oa:function(a,b,c){if(a&&b)try{"function"===typeof b?b(a,c):"function"===typeof a.setAttribute?a.setAttribute(b,c):a[b]=c}catch(d){}},ot:function(a,b){u.j(a,"object","Setting properties requires Objects as arguments");u.j(b,"object","Setting properties requires Objects as arguments");var c=a instanceof A,d=a instanceof D,e;for(e in b){""===e&&u.k("Setting properties requires non-empty property names"); -var f=a,h=e;if(c||d){var k=e.indexOf(".");if(0=d.length)){var e=u.sb(b,d);null===e||"function"=== -typeof e||u.jz(b,d)||(""===c&&(c=b+"\n"),c+=' unknown property "'+d+'" has value: '+e+" at "+a+"\n")}return c},Kv:function(a,b){if(null!==b&&"number"!==typeof b&&"string"!==typeof b&&"boolean"!==typeof b&&"function"!==typeof b)if(void 0!==u.Uc(b)){if(!u.bv.contains(b))if(u.bv.add(b),u.Ju.add(u.VC(a,b)),b instanceof E||b instanceof F||b instanceof la)for(var c=b.i;c.next();)u.Kv(a+"["+c.key+"]",c.value);else for(c in b){var d=u.sb(b,c);if(void 0!==d&&null!==d&&u.Sa(d)&&d!==b.UB){if(b instanceof qa){if(d=== -b.ej)continue}else if(b instanceof A){if("data"===c||d===b.qh)continue;if("itemArray"===c||d===b.gi)continue;if(b instanceof G&&d===b.Bk)continue}else if(!(b instanceof D))if(b instanceof sa){if("archetypeGroupData"===c||d===b.ax)continue}else if(b instanceof ta){if("archetypeLinkData"===c||d===b.ex)continue;if("archetypeLabelNodeData"===c||d===b.bx)continue}else if(b instanceof va){if("archetypeNodeData"===c||d===b.ik)continue}else if(b instanceof J){if("nodeDataArray"===c||d===b.mf)continue;if("linkDataArray"=== -c||d===b.Bh||d===b.Rl)continue;if(d===b.tc)continue;if(d===b.uh)continue}else if(b instanceof xa||b instanceof ya||b instanceof Aa)continue;u.Kv(a+"."+c,d)}}}else if(Array.isArray(b))for(c=0;cc;c++)b[c]=c;for(var d=0,e=0,c=0;256>c;c++)d=(d+b[c]+119)%256,e=b[c],b[c]=b[d],b[d]=e; -for(var d=c=0,f="",h=0;hc;c++)b["0123456789abcdef".charAt(c>>4)+"0123456789abcdef".charAt(c&15)]=String.fromCharCode(c);a.length%2&&(a="0"+a);for(var d=[],e=0,c=0;cd;d++)b[u.Da("7ca11abfd7330390")](u.Da(c[d-1]),10,15*d+0);b[u.Da("7ca11abfd022028846")]=u.Da("39f046ebb36e4b");for(d=1;5>d;d++)b[u.Da("7ca11abfd7330390")](u.Da(c[d- -1]),10,15*d+0);if(4!==c.length||"5"!==c[0][0]||"7"!==c[3][0])u.s=function(a,b){var c=new ea(a,b,2);Object.freeze(c);a[b]=c;var d=a.Dt;d instanceof la||(d=new la("string",ea),a.Dt=d);d.add(b,c);return c};return a}();function ea(a,b,c){u.gc(this);this.HA=a;this.Ub=b;this.FF=c}ea.prototype.toString=function(){return u.rg(this.HA)+"."+this.Ub};u.u(ea,{Ae:"classType"},function(){return this.HA});u.u(ea,{name:"name"},function(){return this.Ub});u.u(ea,{value:"value"},function(){return this.FF});var Da; -ea.findName=Da=function(a,b){if(null===b||""===b)return null;u.j(a,"function","findName:classfunc");u.j(b,"string","EnumValue.findName:name");var c=a.Dt;return c instanceof la?c.ta(b):null};function Ba(){this.FA=[]}Ba.prototype.toString=function(){return this.FA.join("")};Ba.prototype.add=function(a){""!==a&&this.FA.push(a)};function pa(){} -function Ga(a){void 0===a&&(a=42);this.seed=a;this.Pw=48271;this.Ct=2147483647;this.uA=this.Ct/this.Pw;this.hF=this.Ct%this.Pw;this.dF=1/this.Ct;this.random()}Ga.prototype.random=function(){var a=this.seed%this.uA*this.Pw-this.seed/this.uA*this.hF;this.seed=0this.key)return!1;u.Mb(a)}var a=a.n,b=a.length,c=++this.ud,d=this.sj;if(null!==d)for(;cthis.key)return!1;u.Mb(a)}var b=--this.ud;if(0<=b)return this.key=b,this.value=a.n[b],!0;this.Vf();return!1};La.prototype.first=La.prototype.first=function(){var a=this.xd;this.Xa=a.U;var b=a.n;this.ud=a=b.length-1;return 0<=a?(b=b[a],this.key=a,this.value=b):null}; -La.prototype.any=function(a){var b=this.xd;b.In=null;var c=b.U,d=b.n,e=d.length;this.ud=e;for(e-=1;0<=e;e++){if(a(d[e]))return!0;b.U!==c&&u.Mb(b)}return!1};La.prototype.all=function(a){var b=this.xd;b.In=null;var c=b.U,d=b.n,e=d.length;this.ud=e;for(e-=1;0<=e;e++){if(!a(d[e]))return!1;b.U!==c&&u.Mb(b)}return!0};La.prototype.each=function(a){var b=this.xd;b.In=null;var c=b.U,d=b.n,e=d.length;this.ud=e;for(e-=1;0<=e;e++)a(d[e]),b.U!==c&&u.Mb(b)};u.u(La,{count:"count"},function(){return this.xd.n.length}); -La.prototype.Vf=function(){this.key=-1;this.value=null;this.Xa=-1;this.xd.In=this};La.prototype.toString=function(){return"ListIteratorBackwards("+this.ud+"/"+this.xd.count+")"}; -function E(a){u.gc(this);this.Ca=!1;this.n=[];this.U=0;this.In=this.wd=null;void 0===a||null===a?this.oa=null:"string"===typeof a?"object"===a||"string"===a||"number"===a||"boolean"===a||"function"===a?this.oa=a:u.wa(a,"the string 'object', 'number', 'string', 'boolean', or 'function'","List constructor: type"):"function"===typeof a?this.oa=a===Object?"object":a===String?"string":a===Number?"number":a===Boolean?"boolean":a===Function?"function":a:u.wa(a,"null, a primitive type name, or a class type", -"List constructor: type")}u.fa("List",E);E.prototype.Pd=function(){var a=this.U;a++;999999999a||a>=b.length)&&u.wa(a,"0 <= i < length",E,"elt:i");return b[a]};E.prototype.setElt=E.prototype.set=E.prototype.Bg=function(a,b){var c=this.n;(0>a||a>=c.length)&&u.wa(a,"0 <= i < length",E,"setElt:i");u.I(this,a);c[a]=b};E.prototype.first=E.prototype.first=function(){var a=this.n;return 0===a.length?null:a[0]}; -E.prototype.last=E.prototype.Gd=function(){var a=this.n,b=a.length;return 0a&&u.wa(a,">= 0",E,"insertAt:i");u.I(this,a);var c=this.n;a>=c.length?c.push(b):c.splice(a,0,b);this.Pd();return!0};E.prototype.remove=E.prototype["delete"]=E.prototype.remove=function(a){if(null===a)return!1;u.I(this,a);var b=this.n;a=b.indexOf(a);if(-1===a)return!1;a===b.length-1?b.pop():b.splice(a,1);this.Pd();return!0}; -E.prototype.removeAt=E.prototype.hd=function(a){var b=this.n;(0>a||a>=b.length)&&u.wa(a,"0 <= i < length",E,"removeAt:i");u.I(this,a);a===b.length-1?b.pop():b.splice(a,1);this.Pd()};E.prototype.removeRange=E.prototype.removeRange=function(a,b){var c=this.n;(0>a||a>=c.length)&&u.wa(a,"0 <= from < length",E,"elt:from");(0>b||b>=c.length)&&u.wa(b,"0 <= to < length",E,"elt:to");u.I(this,a);var d=c.slice((b||a)+1||c.length);c.length=0>a?c.length+a:a;c.push.apply(c,d);this.Pd()}; -E.prototype.copy=function(){for(var a=new E(this.oa),b=this.n,c=this.count,d=0;d=f)return this;(0>b||b>=e-1)&&u.wa(b,"0 <= from < length",E,"sortRange:from");if(2===f)return c=d[b],e=d[b+1],0=e)d.sort(a);else for(f=d.slice(0,c),f.sort(a),a=0;a=e)for(f=d.slice(b),f.sort(a),a=b;a=this.n.length)return Ia;var a=this.wd;return null!==a?(a.reset(),a):new Ka(this)}); -u.u(E,{Fm:"iteratorBackwards"},function(){if(0>=this.n.length)return Ia;var a=this.In;return null!==a?(a.reset(),a):new La(this)});function Ma(a){this.Gk=a;this.reset()}u.Xd(Ma,{key:!0,value:!0});u.u(Ma,{i:"iterator"},function(){return this});Ma.prototype.reset=Ma.prototype.reset=function(){var a=this.Gk;a.wd=null;this.Xa=a.U;this.Cb=null}; -Ma.prototype.next=Ma.prototype.hasNext=Ma.prototype.next=function(){var a=this.Gk;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.value=b.value,this.key=b.key,!0;this.Vf();return!1};Ma.prototype.first=Ma.prototype.first=function(){var a=this.Gk;this.Xa=a.U;a=a.bb;if(null!==a){this.Cb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; -Ma.prototype.any=function(a){var b=this.Gk;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d.value))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Ma.prototype.all=function(a){var b=this.Gk;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d.value))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0};Ma.prototype.each=function(a){var b=this.Gk;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d.value),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Ma,{count:"count"},function(){return this.Gk.Zc}); -Ma.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1;this.Gk.wd=this};Ma.prototype.toString=function(){return null!==this.Cb?"SetIterator@"+this.Cb.value:"SetIterator"}; -function F(a){u.gc(this);this.Ca=!1;void 0===a||null===a?this.oa=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.oa=a:u.wa(a,"the string 'object', 'number' or 'string'","Set constructor: type"):"function"===typeof a?this.oa=a===Object?"object":a===String?"string":a===Number?"number":a:u.wa(a,"null, a primitive type name, or a class type","Set constructor: type");this.$c={};this.Zc=0;this.wd=null;this.U=0;this.Ah=this.bb=null}u.fa("Set",F); -F.prototype.Pd=function(){var a=this.U;a++;999999999=this.Zc)return Ia;var a=this.wd;return null!==a?(a.reset(),a):new Ma(this)});function Qa(a){this.Wa=a;this.reset()}u.Xd(Qa,{key:!0,value:!0});u.u(Qa,{i:"iterator"},function(){return this});Qa.prototype.reset=Qa.prototype.reset=function(){this.Xa=this.Wa.U;this.Cb=null}; -Qa.prototype.next=Qa.prototype.hasNext=Qa.prototype.next=function(){var a=this.Wa;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.value=this.key=a=b.key,!0;this.Vf();return!1};Qa.prototype.first=Qa.prototype.first=function(){var a=this.Wa;this.Xa=a.U;a=a.bb;return null!==a?(this.Cb=a,this.value=this.key=a=a.key):null}; -Qa.prototype.any=function(a){var b=this.Wa,c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d.key))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Qa.prototype.all=function(a){var b=this.Wa,c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d.key))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0};Qa.prototype.each=function(a){var b=this.Wa,c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d.key),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Qa,{count:"count"},function(){return this.Wa.Zc}); -Qa.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1};Qa.prototype.toString=function(){return null!==this.Cb?"MapKeySetIterator@"+this.Cb.value:"MapKeySetIterator"};function Ra(a){u.gc(this);this.Ca=!0;this.Wa=a}u.Ga(Ra,F);Ra.prototype.freeze=function(){return this};Ra.prototype.La=function(){return this};Ra.prototype.toString=function(){return"MapKeySet("+this.Wa.toString()+")"}; -Ra.prototype.add=Ra.prototype.set=Ra.prototype.add=function(){u.k("This Set is read-only: "+this.toString());return!1};Ra.prototype.contains=Ra.prototype.has=Ra.prototype.contains=function(a){return this.Wa.contains(a)};Ra.prototype.remove=Ra.prototype["delete"]=Ra.prototype.remove=function(){u.k("This Set is read-only: "+this.toString());return!1};Ra.prototype.clear=Ra.prototype.clear=function(){u.k("This Set is read-only: "+this.toString())}; -Ra.prototype.first=Ra.prototype.first=function(){var a=this.Wa.bb;return null!==a?a.key:null};Ra.prototype.any=function(a){for(var b=this.Wa.bb;null!==b;){if(a(b.key))return!0;b=b.Sb}return!1};Ra.prototype.all=function(a){for(var b=this.Wa.bb;null!==b;){if(!a(b.key))return!1;b=b.Sb}return!0};Ra.prototype.each=function(a){for(var b=this.Wa.bb;null!==b;)a(b.key),b=b.Sb};Ra.prototype.copy=function(){return new Ra(this.Wa)}; -Ra.prototype.toSet=function(){var a=new F(this.Wa.wq),b=this.Wa.$c,c;for(c in b)a.add(b[c].key);return a};Ra.prototype.toArray=Ra.prototype.Ke=function(){var a=this.Wa.$c,b=Array(this.Wa.Zc),c=0,d;for(d in a)b[c]=a[d].key,c++;return b};Ra.prototype.toList=function(){var a=new E(this.oa),b=this.Wa.$c,c;for(c in b)a.add(b[c].key);return a};u.u(Ra,{count:"count"},function(){return this.Wa.Zc});u.u(Ra,{size:"size"},function(){return this.Wa.Zc}); -u.u(Ra,{i:"iterator"},function(){return 0>=this.Wa.Zc?Ia:new Qa(this.Wa)});function Sa(a){this.Wa=a;this.reset()}u.Xd(Sa,{key:!0,value:!0});u.u(Sa,{i:"iterator"},function(){return this});Sa.prototype.reset=Sa.prototype.reset=function(){var a=this.Wa;a.Jn=null;this.Xa=a.U;this.Cb=null}; -Sa.prototype.next=Sa.prototype.hasNext=Sa.prototype.next=function(){var a=this.Wa;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.value=b.value,this.key=b.key,!0;this.Vf();return!1};Sa.prototype.first=Sa.prototype.first=function(){var a=this.Wa;this.Xa=a.U;a=a.bb;if(null!==a){this.Cb=a;var b=a.value;this.key=a.key;return this.value=b}return null}; -Sa.prototype.any=function(a){var b=this.Wa;b.Jn=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d.value))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Sa.prototype.all=function(a){var b=this.Wa;b.Jn=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d.value))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0};Sa.prototype.each=function(a){var b=this.Wa;b.Jn=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d.value),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Sa,{count:"count"},function(){return this.Wa.Zc}); -Sa.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1;this.Wa.Jn=this};Sa.prototype.toString=function(){return null!==this.Cb?"MapValueSetIterator@"+this.Cb.value:"MapValueSetIterator"};function Pa(a,b){this.key=a;this.value=b;this.Un=this.Sb=null}u.Xd(Pa,{key:!0,value:!0});Pa.prototype.toString=function(){return"{"+this.key+":"+this.value+"}"};function Ua(a){this.Wa=a;this.reset()}u.Xd(Ua,{key:!0,value:!0});u.u(Ua,{i:"iterator"},function(){return this}); -Ua.prototype.reset=Ua.prototype.reset=function(){var a=this.Wa;a.wd=null;this.Xa=a.U;this.Cb=null};Ua.prototype.next=Ua.prototype.hasNext=Ua.prototype.next=function(){var a=this.Wa;if(a.U!==this.Xa){if(null===this.key)return!1;u.Mb(a)}var b=this.Cb,b=null===b?a.bb:b.Sb;if(null!==b)return this.Cb=b,this.key=b.key,this.value=b.value,!0;this.Vf();return!1}; -Ua.prototype.first=Ua.prototype.first=function(){var a=this.Wa;this.Xa=a.U;a=a.bb;return null!==a?(this.Cb=a,this.key=a.key,this.value=a.value,a):null};Ua.prototype.any=function(a){var b=this.Wa;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(a(d))return!0;b.U!==c&&u.Mb(b);d=d.Sb}return!1};Ua.prototype.all=function(a){var b=this.Wa;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;){if(!a(d))return!1;b.U!==c&&u.Mb(b);d=d.Sb}return!0}; -Ua.prototype.each=function(a){var b=this.Wa;b.wd=null;var c=b.U;this.Cb=null;for(var d=b.bb;null!==d;)a(d),b.U!==c&&u.Mb(b),d=d.Sb};u.u(Ua,{count:"count"},function(){return this.Wa.Zc});Ua.prototype.Vf=function(){this.value=this.key=null;this.Xa=-1;this.Wa.wd=this};Ua.prototype.toString=function(){return null!==this.Cb?"MapIterator@"+this.Cb:"MapIterator"}; -function la(a,b){u.gc(this);this.Ca=!1;void 0===a||null===a?this.wq=null:"string"===typeof a?"object"===a||"string"===a||"number"===a?this.wq=a:u.wa(a,"the string 'object', 'number' or 'string'","Map constructor: keytype"):"function"===typeof a?this.wq=a===Object?"object":a===String?"string":a===Number?"number":a:u.wa(a,"null, a primitive type name, or a class type","Map constructor: keytype");void 0===b||null===b?this.tv=null:"string"===typeof b?"object"===b||"string"===b||"boolean"===b||"number"=== -b||"function"===b?this.tv=b:u.wa(b,"the string 'object', 'number', 'string', 'boolean', or 'function'","Map constructor: valtype"):"function"===typeof b?this.tv=b===Object?"object":b===String?"string":b===Number?"number":b===Boolean?"boolean":b===Function?"function":b:u.wa(b,"null, a primitive type name, or a class type","Map constructor: valtype");this.$c={};this.Zc=0;this.Jn=this.wd=null;this.U=0;this.Ah=this.bb=null}u.fa("Map",la); -la.prototype.Pd=function(){var a=this.U;a++;999999999=this.count)return Ia;var a=this.wd;return null!==a?(a.reset(),a):new Ua(this)});u.u(la,{NJ:"iteratorKeys"},function(){return 0>=this.count?Ia:new Qa(this)});u.u(la,{RD:"iteratorValues"},function(){if(0>=this.count)return Ia;var a=this.Jn;return null!==a?(a.reset(),a):new Sa(this)});function w(a,b){void 0===a?this.y=this.x=0:(this.x=a,this.y=b);this.Ca=!1}u.fa("Point",w);u.Lh(w);u.Xd(w,{x:!0,y:!0});w.prototype.assign=function(a){this.x=a.x;this.y=a.y}; -w.prototype.setTo=w.prototype.m=function(a,b){this.x=a;this.y=b;return this};w.prototype.set=w.prototype.set=function(a){this.I();this.x=a.x;this.y=a.y;return this};w.prototype.copy=function(){var a=new w;a.x=this.x;a.y=this.y;return a};g=w.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this}; -g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this};g.I=function(a){if(this.Ca){var b="The Point is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};w.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new w(c,e)}return new w}; -w.stringify=function(a){return a instanceof w?a.x.toString()+" "+a.y.toString():a.toString()};w.prototype.toString=function(){return"Point("+this.x+","+this.y+")"};w.prototype.equals=w.prototype.L=function(a){return a instanceof w?this.x===a.x&&this.y===a.y:!1};w.prototype.equalTo=w.prototype.Tv=function(a,b){return this.x===a&&this.y===b};w.prototype.equalsApprox=w.prototype.De=function(a){return K.D(this.x,a.x)&&K.D(this.y,a.y)}; -w.prototype.add=w.prototype.add=function(a){this.I();this.x+=a.x;this.y+=a.y;return this};w.prototype.subtract=w.prototype.vt=function(a){this.I();this.x-=a.x;this.y-=a.y;return this};w.prototype.offset=w.prototype.offset=function(a,b){this.I();this.x+=a;this.y+=b;return this}; -w.prototype.rotate=w.prototype.rotate=function(a){this.I();if(0===a)return this;var b=this.x,c=this.y;if(0===b&&0===c)return this;var d=0,e=0;360<=a?a-=360:0>a&&(a+=360);90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(a=a*Math.PI/180,d=Math.cos(a),e=Math.sin(a));this.x=d*b-e*c;this.y=e*b+d*c;return this};w.prototype.scale=w.prototype.scale=function(a,b){this.x*=a;this.y*=b;return this};w.prototype.distanceSquaredPoint=w.prototype.Lj=function(a){var b=a.x-this.x;a=a.y-this.y;return b*b+a*a}; -w.prototype.distanceSquared=w.prototype.ss=function(a,b){var c=a-this.x,d=b-this.y;return c*c+d*d};w.prototype.normalize=w.prototype.normalize=function(){this.I();var a=this.x,b=this.y,c=Math.sqrt(a*a+b*b);0b?270:0;if(0===b)return 0a?c=0>b?c+180:180-c:0>b&&(c=360-c);return c}w.prototype.projectOntoLineSegment=function(a,b,c,d){K.Hm(a,b,c,d,this.x,this.y,this);return this};w.prototype.projectOntoLineSegmentPoint=function(a,b){K.Hm(a.x,a.y,b.x,b.y,this.x,this.y,this);return this};w.prototype.snapToGrid=function(a,b,c,d){K.xs(this.x,this.y,a,b,c,d,this);return this}; -w.prototype.snapToGridPoint=function(a,b){K.xs(this.x,this.y,a.x,a.y,b.width,b.height,this);return this};w.prototype.setRectSpot=w.prototype.pt=function(a,b){this.I();this.x=a.x+b.x*a.width+b.offsetX;this.y=a.y+b.y*a.height+b.offsetY;return this};w.prototype.setSpot=w.prototype.rt=function(a,b,c,d,e){this.I();this.x=a+e.x*c+e.offsetX;this.y=b+e.y*d+e.offsetY;return this};w.prototype.transform=function(a){a.ab(this);return this};function Wa(a,b){b.Oh(a);return a}var Xa; -w.distanceLineSegmentSquared=Xa=function(a,b,c,d,e,f){var h=e-c,k=f-d,l=h*h+k*k;c-=a;d-=b;var m=-c*h-d*k;if(0>=m||m>=l)return h=e-a,k=f-b,Math.min(c*c+d*d,h*h+k*k);a=h*d-k*c;return a*a/l};var Ya;w.distanceSquared=Ya=function(a,b,c,d){a=c-a;b=d-b;return a*a+b*b};var Za;w.direction=Za=function(a,b,c,d){a=c-a;b=d-b;if(0===a)return 0b?270:0;if(0===b)return 0a?d=0>b?d+180:180-d:0>b&&(d=360-d);return d}; -w.prototype.isReal=w.prototype.J=function(){return isFinite(this.x)&&isFinite(this.y)};function ia(a,b){void 0===a?this.height=this.width=0:(this.width=a,this.height=b);this.Ca=!1}u.fa("Size",ia);u.Lh(ia);u.Xd(ia,{width:!0,height:!0});ia.prototype.assign=function(a){this.width=a.width;this.height=a.height};ia.prototype.setTo=ia.prototype.m=function(a,b){this.width=a;this.height=b;return this};ia.prototype.set=ia.prototype.set=function(a){this.I();this.width=a.width;this.height=a.height;return this}; -ia.prototype.copy=function(){var a=new ia;a.width=this.width;a.height=this.height;return a};g=ia.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this};g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this}; -g.I=function(a){if(this.Ca){var b="The Size is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};ia.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));return new ia(c,e)}return new ia};ia.stringify=function(a){return a instanceof ia?a.width.toString()+" "+a.height.toString():a.toString()}; -ia.prototype.toString=function(){return"Size("+this.width+","+this.height+")"};ia.prototype.equals=ia.prototype.L=function(a){return a instanceof ia?this.width===a.width&&this.height===a.height:!1};ia.prototype.equalTo=ia.prototype.Tv=function(a,b){return this.width===a&&this.height===b};ia.prototype.equalsApprox=ia.prototype.De=function(a){return K.D(this.width,a.width)&&K.D(this.height,a.height)};ia.prototype.isReal=ia.prototype.J=function(){return isFinite(this.width)&&isFinite(this.height)}; -function z(a,b,c,d){void 0===a?this.height=this.width=this.y=this.x=0:a instanceof w?b instanceof w?(this.x=Math.min(a.x,b.x),this.y=Math.min(a.y,b.y),this.width=Math.abs(a.x-b.x),this.height=Math.abs(a.y-b.y)):b instanceof ia?(this.x=a.x,this.y=a.y,this.width=b.width,this.height=b.height):u.k("Incorrect arguments supplied to Rect constructor"):(this.x=a,this.y=b,this.width=c,this.height=d);this.Ca=!1}u.fa("Rect",z);u.Lh(z);u.Xd(z,{x:!0,y:!0,width:!0,height:!0}); -z.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height};function bb(a,b,c){a.width=b;a.height=c}z.prototype.setTo=z.prototype.m=function(a,b,c,d){this.x=a;this.y=b;this.width=c;this.height=d;return this};z.prototype.set=z.prototype.set=function(a){this.I();this.x=a.x;this.y=a.y;this.width=a.width;this.height=a.height;return this};z.prototype.setPoint=z.prototype.yf=function(a){this.I();this.x=a.x;this.y=a.y;return this}; -z.prototype.setSize=function(a){this.I();this.width=a.width;this.height=a.height;return this};z.prototype.copy=function(){var a=new z;a.x=this.x;a.y=this.y;a.width=this.width;a.height=this.height;return a};g=z.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this};g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this}; -g.I=function(a){if(this.Ca){var b="The Rect is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};z.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=0;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));for(var e=0;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));for(var f=0;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));for(var h=0;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return new z(c,e,f,h)}return new z}; -z.stringify=function(a){return a instanceof z?a.x.toString()+" "+a.y.toString()+" "+a.width.toString()+" "+a.height.toString():a.toString()};z.prototype.toString=function(){return"Rect("+this.x+","+this.y+","+this.width+","+this.height+")"};z.prototype.equals=z.prototype.L=function(a){return a instanceof z?this.x===a.x&&this.y===a.y&&this.width===a.width&&this.height===a.height:!1};z.prototype.equalTo=z.prototype.Tv=function(a,b,c,d){return this.x===a&&this.y===b&&this.width===c&&this.height===d}; -z.prototype.equalsApprox=z.prototype.De=function(a){return K.D(this.x,a.x)&&K.D(this.y,a.y)&&K.D(this.width,a.width)&&K.D(this.height,a.height)};z.prototype.containsPoint=z.prototype.Aa=function(a){return this.x<=a.x&&this.x+this.width>=a.x&&this.y<=a.y&&this.y+this.height>=a.y};z.prototype.containsRect=z.prototype.Kj=function(a){return this.x<=a.x&&a.x+a.width<=this.x+this.width&&this.y<=a.y&&a.y+a.height<=this.y+this.height}; -z.prototype.contains=z.prototype.contains=function(a,b,c,d){void 0===c&&(c=0);void 0===d&&(d=0);return this.x<=a&&a+c<=this.x+this.width&&this.y<=b&&b+d<=this.y+this.height};z.prototype.reset=function(){this.I();this.height=this.width=this.y=this.x=0};z.prototype.offset=z.prototype.offset=function(a,b){this.I();this.x+=a;this.y+=b;return this};z.prototype.inflate=z.prototype.Jf=function(a,b){return hb(this,b,a,b,a)}; -z.prototype.addMargin=z.prototype.yv=function(a){return hb(this,a.top,a.right,a.bottom,a.left)};z.prototype.subtractMargin=z.prototype.tI=function(a){return hb(this,-a.top,-a.right,-a.bottom,-a.left)};z.prototype.grow=function(a,b,c,d){return hb(this,a,b,c,d)};function hb(a,b,c,d,e){a.I();var f=a.width;c+e<=-f?(a.x+=f/2,a.width=0):(a.x-=e,a.width+=c+e);c=a.height;b+d<=-c?(a.y+=c/2,a.height=0):(a.y-=b,a.height+=b+d);return a}z.prototype.intersectRect=function(a){return ib(this,a.x,a.y,a.width,a.height)}; -z.prototype.intersect=function(a,b,c,d){return ib(this,a,b,c,d)};function ib(a,b,c,d,e){a.I();var f=Math.max(a.x,b),h=Math.max(a.y,c);b=Math.min(a.x+a.width,b+d);c=Math.min(a.y+a.height,c+e);a.x=f;a.y=h;a.width=Math.max(0,b-f);a.height=Math.max(0,c-h);return a}z.prototype.intersectsRect=z.prototype.sg=function(a){return this.HD(a.x,a.y,a.width,a.height)}; -z.prototype.intersects=z.prototype.HD=function(a,b,c,d){var e=this.width,f=this.x;if(Infinity!==e&&Infinity!==c&&(e+=f,c+=a,isNaN(c)||isNaN(e)||f>c||a>e))return!1;a=this.height;c=this.y;return Infinity!==a&&Infinity!==d&&(a+=c,d+=b,isNaN(d)||isNaN(a)||c>d||b>a)?!1:!0};function jb(a,b){var c=a.width,d=b.width+10+10,e=a.x,f=b.x-10;if(e>d+f||f>c+e)return!1;c=a.height;d=b.height+10+10;e=a.y;f=b.y-10;return e>d+f||f>c+e?!1:!0}z.prototype.unionPoint=z.prototype.Oi=function(a){return kb(this,a.x,a.y,0,0)}; -z.prototype.unionRect=z.prototype.Sh=function(a){return kb(this,a.x,a.y,a.width,a.height)};z.prototype.union=z.prototype.YE=function(a,b,c,d){this.I();void 0===c&&(c=0);void 0===d&&(d=0);return kb(this,a,b,c,d)};function kb(a,b,c,d,e){var f=Math.min(a.x,b),h=Math.min(a.y,c);b=Math.max(a.x+a.width,b+d);c=Math.max(a.y+a.height,c+e);a.x=f;a.y=h;a.width=b-f;a.height=c-h;return a} -z.prototype.setSpot=z.prototype.rt=function(a,b,c){this.I();this.x=a-c.offsetX-c.x*this.width;this.y=b-c.offsetY-c.y*this.height;return this};var qb;z.contains=qb=function(a,b,c,d,e,f,h,k){void 0===h&&(h=0);void 0===k&&(k=0);return a<=e&&e+h<=a+c&&b<=f&&f+k<=b+d};z.intersects=function(a,b,c,d,e,f,h,k){c+=a;h+=e;if(a>h||e>c)return!1;a=d+b;k+=f;return b>k||f>a?!1:!0};u.defineProperty(z,{left:"left"},function(){return this.x},function(a){this.I(a);this.x=a}); -u.defineProperty(z,{top:"top"},function(){return this.y},function(a){this.I(a);this.y=a});u.defineProperty(z,{right:"right"},function(){return this.x+this.width},function(a){this.I(a);this.x+=a-(this.x+this.width)});u.defineProperty(z,{bottom:"bottom"},function(){return this.y+this.height},function(a){this.I(a);this.y+=a-(this.y+this.height)});u.defineProperty(z,{position:"position"},function(){return new w(this.x,this.y)},function(a){this.I(a);this.x=a.x;this.y=a.y}); -u.defineProperty(z,{size:"size"},function(){return new ia(this.width,this.height)},function(a){this.I(a);this.width=a.width;this.height=a.height});u.defineProperty(z,{Ok:"center"},function(){return new w(this.x+this.width/2,this.y+this.height/2)},function(a){this.I(a);this.x=a.x-this.width/2;this.y=a.y-this.height/2});u.defineProperty(z,{Ja:"centerX"},function(){return this.x+this.width/2},function(a){this.I(a);this.x=a-this.width/2}); -u.defineProperty(z,{Ua:"centerY"},function(){return this.y+this.height/2},function(a){this.I(a);this.y=a-this.height/2});z.prototype.isReal=z.prototype.J=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)};z.prototype.isEmpty=function(){return 0===this.width&&0===this.height}; -function rb(a,b,c,d){void 0===a?this.left=this.bottom=this.right=this.top=0:void 0===b?this.left=this.bottom=this.right=this.top=a:void 0===c?(d=b,this.top=a,this.right=b,this.bottom=a,this.left=d):void 0!==d?(this.top=a,this.right=b,this.bottom=c,this.left=d):u.k("Invalid arguments to Margin constructor");this.Ca=!1}u.fa("Margin",rb);u.Lh(rb);u.Xd(rb,{top:!0,right:!0,bottom:!0,left:!0});rb.prototype.assign=function(a){this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left}; -rb.prototype.setTo=rb.prototype.m=function(a,b,c,d){this.I();this.top=a;this.right=b;this.bottom=c;this.left=d;return this};rb.prototype.set=rb.prototype.set=function(a){this.I();this.top=a.top;this.right=a.right;this.bottom=a.bottom;this.left=a.left;return this};rb.prototype.copy=function(){var a=new rb;a.top=this.top;a.right=this.right;a.bottom=this.bottom;a.left=this.left;return a};g=rb.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this}; -g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this};g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this};g.I=function(a){if(this.Ca){var b="The Margin is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}}; -rb.parse=function(a){if("string"===typeof a){a=a.split(" ");for(var b=0,c=NaN;""===a[b];)b++;var d=a[b++];d&&(c=parseFloat(d));if(isNaN(c))return new rb;for(var e=NaN;""===a[b];)b++;(d=a[b++])&&(e=parseFloat(d));if(isNaN(e))return new rb(c);for(var f=NaN;""===a[b];)b++;(d=a[b++])&&(f=parseFloat(d));if(isNaN(f))return new rb(c,e);for(var h=NaN;""===a[b];)b++;(d=a[b++])&&(h=parseFloat(d));return isNaN(h)?new rb(c,e):new rb(c,e,f,h)}return new rb}; -rb.stringify=function(a){return a instanceof rb?a.top.toString()+" "+a.right.toString()+" "+a.bottom.toString()+" "+a.left.toString():a.toString()};rb.prototype.toString=function(){return"Margin("+this.top+","+this.right+","+this.bottom+","+this.left+")"};rb.prototype.equals=rb.prototype.L=function(a){return a instanceof rb?this.top===a.top&&this.right===a.right&&this.bottom===a.bottom&&this.left===a.left:!1}; -rb.prototype.equalTo=rb.prototype.Tv=function(a,b,c,d){return this.top===a&&this.right===b&&this.bottom===c&&this.left===d};rb.prototype.equalsApprox=rb.prototype.De=function(a){return K.D(this.top,a.top)&&K.D(this.right,a.right)&&K.D(this.bottom,a.bottom)&&K.D(this.left,a.left)};rb.prototype.isReal=rb.prototype.J=function(){return isFinite(this.top)&&isFinite(this.right)&&isFinite(this.bottom)&&isFinite(this.left)};function ja(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0}u.Lh(ja); -u.Xd(ja,{m11:!0,m12:!0,m21:!0,m22:!0,dx:!0,dy:!0});ja.prototype.set=ja.prototype.set=function(a){this.m11=a.m11;this.m12=a.m12;this.m21=a.m21;this.m22=a.m22;this.dx=a.dx;this.dy=a.dy;return this};ja.prototype.copy=function(){var a=new ja;a.m11=this.m11;a.m12=this.m12;a.m21=this.m21;a.m22=this.m22;a.dx=this.dx;a.dy=this.dy;return a};ja.prototype.toString=function(){return"Transform("+this.m11+","+this.m12+","+this.m21+","+this.m22+","+this.dx+","+this.dy+")"}; -ja.prototype.equals=ja.prototype.L=function(a){return a instanceof ja?this.m11===a.m11&&this.m12===a.m12&&this.m21===a.m21&&this.m22===a.m22&&this.dx===a.dx&&this.dy===a.dy:!1};ja.prototype.isIdentity=ja.prototype.Os=function(){return 1===this.m11&&0===this.m12&&0===this.m21&&1===this.m22&&0===this.dx&&0===this.dy};ja.prototype.reset=ja.prototype.reset=function(){this.m11=1;this.m21=this.m12=0;this.m22=1;this.dy=this.dx=0;return this}; -ja.prototype.multiply=ja.prototype.multiply=function(a){var b=this.m12*a.m11+this.m22*a.m12,c=this.m11*a.m21+this.m21*a.m22,d=this.m12*a.m21+this.m22*a.m22,e=this.m11*a.dx+this.m21*a.dy+this.dx,f=this.m12*a.dx+this.m22*a.dy+this.dy;this.m11=this.m11*a.m11+this.m21*a.m12;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this}; -ja.prototype.multiplyInverted=ja.prototype.aE=function(a){var b=1/(a.m11*a.m22-a.m12*a.m21),c=a.m22*b,d=-a.m12*b,e=-a.m21*b,f=a.m11*b,h=b*(a.m21*a.dy-a.m22*a.dx),k=b*(a.m12*a.dx-a.m11*a.dy);a=this.m12*c+this.m22*d;b=this.m11*e+this.m21*f;e=this.m12*e+this.m22*f;f=this.m11*h+this.m21*k+this.dx;h=this.m12*h+this.m22*k+this.dy;this.m11=this.m11*c+this.m21*d;this.m12=a;this.m21=b;this.m22=e;this.dx=f;this.dy=h;return this}; -ja.prototype.invert=ja.prototype.oz=function(){var a=1/(this.m11*this.m22-this.m12*this.m21),b=-this.m12*a,c=-this.m21*a,d=this.m11*a,e=a*(this.m21*this.dy-this.m22*this.dx),f=a*(this.m12*this.dx-this.m11*this.dy);this.m11=this.m22*a;this.m12=b;this.m21=c;this.m22=d;this.dx=e;this.dy=f;return this}; -ja.prototype.rotate=ja.prototype.rotate=function(a,b,c){360<=a?a-=360:0>a&&(a+=360);if(0===a)return this;this.translate(b,c);var d=0,e=0;90===a?(d=0,e=1):180===a?(d=-1,e=0):270===a?(d=0,e=-1):(e=a*Math.PI/180,d=Math.cos(e),e=Math.sin(e));a=this.m12*d+this.m22*e;var f=this.m11*-e+this.m21*d,h=this.m12*-e+this.m22*d;this.m11=this.m11*d+this.m21*e;this.m12=a;this.m21=f;this.m22=h;this.translate(-b,-c);return this}; -ja.prototype.translate=ja.prototype.translate=function(a,b){this.dx+=this.m11*a+this.m21*b;this.dy+=this.m12*a+this.m22*b;return this};ja.prototype.scale=ja.prototype.scale=function(a,b){void 0===b&&(b=a);this.m11*=a;this.m12*=a;this.m21*=b;this.m22*=b;return this};ja.prototype.transformPoint=ja.prototype.ab=function(a){var b=a.x,c=a.y;a.x=b*this.m11+c*this.m21+this.dx;a.y=b*this.m12+c*this.m22+this.dy;return a}; -ja.prototype.invertedTransformPoint=ja.prototype.Oh=function(a){var b=1/(this.m11*this.m22-this.m12*this.m21),c=-this.m12*b,d=this.m11*b,e=b*(this.m12*this.dx-this.m11*this.dy),f=a.x,h=a.y;a.x=f*this.m22*b+h*-this.m21*b+b*(this.m21*this.dy-this.m22*this.dx);a.y=f*c+h*d+e;return a}; -ja.prototype.transformRect=ja.prototype.WE=function(a){var b=a.x,c=a.y,d=b+a.width,e=c+a.height,f=this.m11,h=this.m12,k=this.m21,l=this.m22,m=this.dx,n=this.dy,p=b*f+c*k+m,q=b*h+c*l+n,r=d*f+c*k+m,c=d*h+c*l+n,s=b*f+e*k+m,b=b*h+e*l+n,f=d*f+e*k+m,d=d*h+e*l+n,e=p,h=q,p=Math.min(p,r),e=Math.max(e,r),h=Math.min(h,c),q=Math.max(q,c),p=Math.min(p,s),e=Math.max(e,s),h=Math.min(h,b),q=Math.max(q,b),p=Math.min(p,f),e=Math.max(e,f),h=Math.min(h,d),q=Math.max(q,d);a.x=p;a.y=h;a.width=e-p;a.height=q-h;return a}; -function L(a,b,c,d){void 0===a?this.offsetY=this.offsetX=this.y=this.x=0:(void 0===b&&(b=0),void 0===c&&(c=0),void 0===d&&(d=0),this.x=a,this.y=b,this.offsetX=c,this.offsetY=d);this.Ca=!1}u.fa("Spot",L);u.Lh(L);u.Xd(L,{x:!0,y:!0,offsetX:!0,offsetY:!0});L.prototype.assign=function(a){this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY};L.prototype.setTo=L.prototype.m=function(a,b,c,d){this.I();this.x=a;this.y=b;this.offsetX=c;this.offsetY=d;return this}; -L.prototype.set=L.prototype.set=function(a){this.I();this.x=a.x;this.y=a.y;this.offsetX=a.offsetX;this.offsetY=a.offsetY;return this};L.prototype.copy=function(){var a=new L;a.x=this.x;a.y=this.y;a.offsetX=this.offsetX;a.offsetY=this.offsetY;return a};g=L.prototype;g.Ka=function(){this.Ca=!0;Object.freeze(this);return this};g.Z=function(){return Object.isFrozen(this)?this:this.copy().freeze()};g.freeze=function(){this.Ca=!0;return this}; -g.La=function(){Object.isFrozen(this)&&u.k("cannot thaw constant: "+this);this.Ca=!1;return this};g.I=function(a){if(this.Ca){var b="The Spot is frozen, so its properties cannot be set: "+this.toString();void 0!==a&&(b+=" to value: "+a);u.k(b)}};function sb(a,b){a.x=NaN;a.y=NaN;a.offsetX=b;return a}var tb; -L.parse=tb=function(a){if("string"===typeof a){a=a.trim();if("None"===a)return vb;if("TopLeft"===a)return xb;if("Top"===a||"TopCenter"===a||"MiddleTop"===a)return Db;if("TopRight"===a)return Gb;if("Left"===a||"LeftCenter"===a||"MiddleLeft"===a)return Hb;if("Center"===a)return Ib;if("Right"===a||"RightCenter"===a||"MiddleRight"===a)return Jb;if("BottomLeft"===a)return Kb;if("Bottom"===a||"BottomCenter"===a||"MiddleBottom"===a)return Ub;if("BottomRight"===a)return Vb;if("TopSide"===a)return Wb;if("LeftSide"=== -a)return Xb;if("RightSide"===a)return Yb;if("BottomSide"===a)return Zb;if("TopBottomSides"===a)return $b;if("LeftRightSides"===a)return ac;if("TopLeftSides"===a)return bc;if("TopRightSides"===a)return cc;if("BottomLeftSides"===a)return hc;if("BottomRightSides"===a)return ic;if("NotTopSide"===a)return lc;if("NotLeftSide"===a)return mc;if("NotRightSide"===a)return rc;if("NotBottomSide"===a)return sc;if("AllSides"===a)return tc;if("Default"===a)return uc;a=a.split(" ");for(var b=0,c=0;""===a[b];)b++; -var d=a[b++];void 0!==d&&0b.offset?1:-1});for(k=0;k=2*Math.PI?(Vc(a,b,c,d,e,e+Math.PI,h),Vc(a,b,c,d,e+Math.PI,e+2*Math.PI,h),a.path.push(["M",l,f])):(b+=d*Math.cos(e),c+=d*Math.sin(e),k=180*k/Math.PI,e=h?0:1,h=180<=k==!!h?0:1,0!==a.path.length?a.path.push(["L",b,c]):a.path.push(["M",b,c]),a.path.push(["A",d,d,k,h,e,l,f]))}}function Uc(a,b,c,d,e,f,h){var k=new Lc;k.$e=[b,c,d,e,f,h];b={};Xc(a,"g",b,k);k=a.addElement("g",b);a.rf.push(k)} -g.$a=function(){if(0!==this.shadowOffsetX||0!==this.shadowOffsetY||0!==this.shadowBlur){var a="SHADOW"+this.HE;this.HE++;var b=this.addElement("filter",{id:a,x:"-100%",y:"-100%",width:"300%",height:"300%"},null),c,d,e,f,h;c=Oc(this,"feGaussianBlur",{"in":"SourceAlpha",result:"blur",vK:this.shadowBlur/2});d=Oc(this,"feFlood",{"in":"blur",result:"flood","flood-color":this.shadowColor});e=Oc(this,"feComposite",{"in":"flood",in2:"blur",operator:"in",result:"comp"});f=Oc(this,"feOffset",{"in":"comp",result:"offsetBlur", -dx:this.shadowOffsetX,dy:this.shadowOffsetY});h=Oc(this,"feMerge",{});h.appendChild(Oc(this,"feMergeNode",{"in":"offsetBlur"}));h.appendChild(Oc(this,"feMergeNode",{"in":"SourceGraphic"}));b.appendChild(c);b.appendChild(d);b.appendChild(e);b.appendChild(f);b.appendChild(h);0=a)return 0;var b=K.vA;if(null===b){for(var b=[],c=0;2E3>=c;c++)b[c]=Math.sqrt(c);K.vA=b}return 1>a? -(c=1/a,2E3>=c?1/b[c|0]:Math.sqrt(a)):2E3>=a?b[a|0]:Math.sqrt(a)},D:function(a,b){var c=a-b;return.5>c&&-.5c&&-5E-8=e&&(e=1E-6);var k=0,l=0,m=0,n=0;am-n)if(a-c>e||c-a>e){if(f=(d-b)/(c-a)*(f-a)+b,f-e<=h&&h<=f+e)return!0}else return!0;else if(b- -d>e||d-b>e){if(h=(c-a)/(d-b)*(h-b)+a,h-e<=f&&f<=h+e)return!0}else return!0;return!1},Iv:function(a,b,c,d,e,f,h,k,l,m,n,p){if(K.Hd(a,b,h,k,p,c,d)&&K.Hd(a,b,h,k,p,e,f))return K.Hd(a,b,h,k,p,m,n);var q=(a+c)/2,r=(b+d)/2,s=(c+e)/2,t=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(q+s)/2;c=(r+t)/2;var s=(s+e)/2,t=(t+f)/2,v=(d+s)/2,x=(c+t)/2;return K.Iv(a,b,q,r,d,c,v,x,l,m,n,p)||K.Iv(v,x,s,t,e,f,h,k,l,m,n,p)},UF:function(a,b,c,d,e,f,h,k,l){var m=(c+e)/2,n=(d+f)/2;l.x=(((a+c)/2+m)/2+(m+(e+h)/2)/2)/2;l.y=(((b+d)/2+n)/2+(n+ -(f+k)/2)/2)/2;return l},TF:function(a,b,c,d,e,f,h,k){var l=(c+e)/2,m=(d+f)/2;return Za(((a+c)/2+l)/2,((b+d)/2+m)/2,(l+(e+h)/2)/2,(m+(f+k)/2)/2)},oo:function(a,b,c,d,e,f,h,k,l,m){if(K.Hd(a,b,h,k,l,c,d)&&K.Hd(a,b,h,k,l,e,f))kb(m,a,b,0,0),kb(m,h,k,0,0);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;K.oo(a,b,n,p,d,c,s,t,l,m);K.oo(s,t,q,r,e,f,h,k,l,m)}return m},ye:function(a,b,c,d,e,f,h,k,l,m){if(K.Hd(a,b,h,k,l,c,d)&& -K.Hd(a,b,h,k,l,e,f))0===m.length&&(m.push(a),m.push(b)),m.push(h),m.push(k);else{var n=(a+c)/2,p=(b+d)/2,q=(c+e)/2,r=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(n+q)/2;c=(p+r)/2;var q=(q+e)/2,r=(r+f)/2,s=(d+q)/2,t=(c+r)/2;K.ye(a,b,n,p,d,c,s,t,l,m);K.ye(s,t,q,r,e,f,h,k,l,m)}return m},Oz:function(a,b,c,d,e,f,h,k,l,m){if(K.Hd(a,b,e,f,m,c,d))return K.Hd(a,b,e,f,m,k,l);var n=(a+c)/2,p=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var q=(n+c)/2,r=(p+d)/2;return K.Oz(a,b,n,p,q,r,h,k,l,m)||K.Oz(q,r,c,d,e,f,h,k,l,m)},nK:function(a,b,c, -d,e,f,h){h.x=((a+c)/2+(c+e)/2)/2;h.y=((b+d)/2+(d+f)/2)/2;return h},Nz:function(a,b,c,d,e,f,h,k){if(K.Hd(a,b,e,f,h,c,d))kb(k,a,b,0,0),kb(k,e,f,0,0);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;K.Nz(a,b,l,m,n,p,h,k);K.Nz(n,p,c,d,e,f,h,k)}return k},Xo:function(a,b,c,d,e,f,h,k){if(K.Hd(a,b,e,f,h,c,d))0===k.length&&(k.push(a),k.push(b)),k.push(e),k.push(f);else{var l=(a+c)/2,m=(b+d)/2;c=(c+e)/2;d=(d+f)/2;var n=(l+c)/2,p=(m+d)/2;K.Xo(a,b,l,m,n,p,h,k);K.Xo(n,p,c,d,e,f,h,k)}return k}, -js:function(a,b,c,d,e,f,h,k,l,m,n,p,q,r){0>=q&&(q=1E-6);if(K.Hd(a,b,h,k,q,c,d)&&K.Hd(a,b,h,k,q,e,f)){var s=(a-h)*(m-p)-(b-k)*(l-n);if(0===s)return!1;q=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/s;s=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/s;if((l>n?l-n:n-l)<(m>p?m-p:p-m)){if(h=l=0,bh)return!1}else if(ah)return!1;r.x=q;r.y=s;return!0}var s=(a+c)/2,t=(b+d)/2;c=(c+e)/2;d=(d+f)/2;e=(e+h)/2;f=(f+k)/2;var v=(s+c)/2,x=(t+d)/2;c=(c+e)/2;d=(d+f)/2;var B=(v+c)/2,y=(x+d)/ -2,C=(n-l)*(n-l)+(p-m)*(p-m),I=!1;K.js(a,b,s,t,v,x,B,y,l,m,n,p,q,r)&&(b=(r.x-l)*(r.x-l)+(r.y-m)*(r.y-m),b=q&&(q=1E-6);if(K.Hd(a,b,h,k,q,c,d)&&K.Hd(a,b,h,k,q,e,f)){q=(a-h)*(m-p)-(b-k)*(l-n);if(0===q)return r;var s=((a*k-b*h)*(l-n)-(a-h)*(l*p-m*n))/q,t=((a*k-b*h)*(m-p)-(b-k)*(l*p-m*n))/q;if(s>=n)return r;if((l>n?l-n:n-l)< -(m>p?m-p:p-m)){if(a=l=0,ba)return r}else if(aa)return r;0q&&r--}else{var s=(a+c)/2,t=(b+d)/2,v=(c+e)/2,x=(d+f)/2;e=(e+h)/2;f=(f+k)/2;d=(s+v)/2;c=(t+x)/2;var v=(v+e)/2,x=(x+f)/2,B=(d+v)/2,y=(c+x)/2,r=r+K.ks(a,b,s,t,d,c,B,y,l,m,n,p,q),r=r+K.ks(B,y,v,x,e,f,h,k,l,m,n,p,q)}return r},Hm:function(a,b,c,d,e,f,h){if(K.mb(a,c)){var k=0;c=0;bc)return h.x=a,h.y=c,!1;h.x=a;h.y=d;return!0}if(K.mb(b, -d)){ac)return h.x=c,h.y=b,!1;h.x=d;h.y=b;return!0}k=((a-e)*(a-c)+(b-f)*(b-d))/((c-a)*(c-a)+(d-b)*(d-b));if(-5E-6>k)return h.x=a,h.y=b,!1;if(1.000005c)return l.x=a,l.y=c,!1;l.x=a;l.y=f;return!0}h=(d-b)/(c-a);if(K.mb(k,h))return K.Hm(a,b,c,d,e,f,l),!1;e=(h*a-k*e+f-b)/(h-k);if(K.mb(h,0)){ac)return l.x=c,l.y=b,!1;l.x=e;l.y=b;return!0}f=h*(e-a)+b;return K.Hm(a,b,c,d,e,f,l)},PJ:function(a,b,c,d,e){return K.$g(c.x,c.y,d.x,d.y,a.x,a.y,b.x,b.y,e)},xJ:function(a,b,c,d,e,f,h,k,l,m){function n(c,d){var e=(c-a)*(c-a)+(d-b)*(d-b);e(c>a?c-a:a-c)){q=1-(c-e)*(c-e)/(q*q);if(0>q)return l;q=Math.sqrt(q);d=-m*q+f;n(c,m*q+f);n(c,d)}else{c=(d-b)/(c-a);d=1/(q*q)+c*c/(m*m);k=2*c*(b-c*a)/(m*m)-2*c*f/(m*m)-2*e/(q*q);q=k*k-4*d*(2*c*a*f/(m*m)-2*b*f/(m*m)+f*f/(m*m)+e*e/(q*q)-1+(b-c*a)*(b-c*a)/(m*m));if(0>q)return l;q=Math.sqrt(q);m=(-k+q)/(2*d);n(m,c*m-c*a+b);q=(-k-q)/(2*d);n(q, -c*q-c*a+b)}return l},bl:function(a,b,c,d,e,f,h,k,l){var m=1E21,n=a,p=b;if(K.$g(a,b,a,d,e,f,h,k,l)){var q=(l.x-e)*(l.x-e)+(l.y-f)*(l.y-f);qm},dw:function(a,b,c){var d=b.x,e=b.y,f=c.x,h=c.y,k=a.left,l=a.right, -m=a.top,n=a.bottom;return d===f?(f=a=0,e=m):e===h?(d=k):a.Aa(b)||a.Aa(c)||K.cw(k,m,l,m,d,e,f,h)||K.cw(l,m,l,n,d,e,f,h)||K.cw(l,n,k,n,d,e,f,h)||K.cw(k,n,k,m,d,e,f,h)?!0:!1},cw:function(a,b,c,d,e,f,h,k){return 0>=K.Nv(a,b,c,d,e,f)*K.Nv(a,b,c,d,h,k)&&0>=K.Nv(e,f,h,k,a,b)*K.Nv(e,f,h,k,c,d)},Nv:function(a,b,c,d,e,f){c-=a;d-=b;a=e-a;b=f-b;f=a*d-b*c;0===f&&(f=a*c+b*d,0f&&(f=0)));return 0>f?-1:0a&&(a+=360);360<=a&&(a-=360);return a},fD:function(a,b,c,d,e,f){void 0===f&&(f=!1);var h=Math.PI;f||(d*=h/180,e*=h/180);f=dc,f=0>d,h=0,k=h=0;am;++m){b=.5*(k+l);if(b===k||b===l)break;var n=a/(b+f),p=h/(b+e),n=n*n+p*p-1;if(0n)l=b;else break}c=f*c/(b+f)-c;d=e*d/(b+e)-d;e=Math.sqrt(c*c+d*d)}else e=Math.abs(d-b);else d=a*a-b*b,e=a*c,ea?"M"+this.ua.toString()+" "+this.va.toString()+"L"+this.F.toString()+" "+this.G.toString():"M"+this.ua.toFixed(a)+" "+this.va.toFixed(a)+"L"+this.F.toFixed(a)+" "+this.G.toFixed(a);case md:var b=new z(this.ua,this.va,0,0);b.YE(this.F,this.G,0,0);return 0>a?"M"+b.x.toString()+" "+b.y.toString()+"H"+b.right.toString()+"V"+b.bottom.toString()+"H"+b.left.toString()+"z":"M"+b.x.toFixed(a)+" "+b.y.toFixed(a)+"H"+b.right.toFixed(a)+ -"V"+b.bottom.toFixed(a)+"H"+b.left.toFixed(a)+"z";case nd:b=new z(this.ua,this.va,0,0);b.YE(this.F,this.G,0,0);if(0>a){var c=b.left.toString()+" "+(b.y+b.height/2).toString(),d=b.right.toString()+" "+(b.y+b.height/2).toString();return"M"+c+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+d+"A"+(b.width/2).toString()+" "+(b.height/2).toString()+" 0 0 1 "+c}c=b.left.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);d=b.right.toFixed(a)+" "+(b.y+b.height/2).toFixed(a);return"M"+c+"A"+(b.width/ -2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+d+"A"+(b.width/2).toFixed(a)+" "+(b.height/2).toFixed(a)+" 0 0 1 "+c;case ad:for(var b="",c=this.ub.n,d=c.length,e=0;e=t-1?!0:null!==l[m+1].match(/[A-Za-z]/)}function d(){m++;return l[m]}function e(){var a=new w(parseFloat(d()),parseFloat(d()));n===n.toLowerCase()&&(a.x=s.x+a.x,a.y=s.y+a.y);return a}function f(){return s=e()}function h(){return r=e()}function k(){return"c"!==p.toLowerCase()&&"s"!==p.toLowerCase()?s:new w(2*s.x-r.x,2*s.y-r.y)}void 0===b&&(b=!1);"string"!==typeof a&&u.Kd(a,"string",$c,"parse:str");a=a.replace(/,/gm," ");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, -"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([^\s])/gm,"$1 $2");a=a.replace(/([^\s])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm,"$1 $2");a=a.replace(/([0-9])([+\-])/gm,"$1 $2");a=a.replace(/(\.[0-9]*)(\.)/gm,"$1 $2");a=a.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm,"$1 $3 $4 ");a=a.replace(/[\s\r\t\n]+/gm," ");a=a.replace(/^\s+|\s+$/g,"");for(var l=a.split(" "),m=-1,n="",p="",q=new w(0,0),r=new w(0,0),s=new w(0, -0),t=l.length,v=u.p(),x=!1,B=!1,y=!0;!(m>=t-1);)if(p=n,n=d(),""!==n)switch(n.toUpperCase()){case "X":y=!0;B=x=!1;break;case "M":var C=f();null===v.Tb||!0===y?(M(v,C.x,C.y,x,!1,!B),y=!1):v.moveTo(C.x,C.y);for(q=s;!c();)C=f(),v.lineTo(C.x,C.y);break;case "L":for(;!c();)C=f(),v.lineTo(C.x,C.y);break;case "H":for(;!c();)s=C=new w((n===n.toLowerCase()?s.x:0)+parseFloat(d()),s.y),v.lineTo(s.x,s.y);break;case "V":for(;!c();)s=C=new w(s.x,(n===n.toLowerCase()?s.y:0)+parseFloat(d())),v.lineTo(s.x,s.y);break; -case "C":for(;!c();){var I=e(),H=h(),C=f();O(v,I.x,I.y,H.x,H.y,C.x,C.y)}break;case "S":for(;!c();)I=k(),H=h(),C=f(),O(v,I.x,I.y,H.x,H.y,C.x,C.y);break;case "Q":for(;!c();)H=h(),C=f(),td(v,H.x,H.y,C.x,C.y);break;case "T":for(;!c();)r=H=k(),C=f(),td(v,H.x,H.y,C.x,C.y);break;case "B":for(;!c();){var C=parseFloat(d()),I=parseFloat(d()),H=parseFloat(d()),T=parseFloat(d()),aa=parseFloat(d()),R=aa,N=!1;c()||(R=parseFloat(d()),c()||(N=0!==parseFloat(d())));n===n.toLowerCase()&&(H+=s.x,T+=s.y);v.arcTo(C,I, -H,T,aa,R,N)}break;case "A":for(;!c();)I=Math.abs(parseFloat(d())),H=Math.abs(parseFloat(d())),T=parseFloat(d()),aa=!!parseFloat(d()),R=!!parseFloat(d()),C=f(),ud(v,I,H,T,aa,R,C.x,C.y);break;case "Z":C=v.o.ub.n[v.o.ub.length-1];P(v);s=q;break;case "F":C="";for(I=1;l[m+I];)if(null!==l[m+I].match(/[Uu]/))I++;else if(null===l[m+I].match(/[A-Za-z]/))I++;else{C=l[m+I];break}C.match(/[Mm]/)?x=!0:vd(v);break;case "U":C="";for(I=1;l[m+I];)if(null!==l[m+I].match(/[Ff]/))I++;else if(null===l[m+I].match(/[A-Za-z]/))I++; -else{C=l[m+I];break}C.match(/[Mm]/)?B=!0:v.$a(!1)}q=v.o;u.q(v);if(b)for(v=q.ub.i;v.next();)C=v.value,C.Ns=!0;return q};function wd(a,b){for(var c=a.length,d=u.K(),e=0;eh&&(h+=360),s.Je+=h);0>a&&(s.Je=180-s.Je,s.Qf=-s.Qf);0>d&&(s.Je=-s.Je,s.Qf=-s.Qf);s.radiusX*=Math.sqrt(a*a+c*c);void 0!==s.radiusY&&(s.radiusY*=Math.sqrt(b*b+d*d));break;case Gd:h=s.F;k=s.G;s.F=h* -a+k*c+e;s.G=h*b+k*d+f;0!==b&&(h=180*Math.atan2(b,a)/Math.PI,0>h&&(h+=360),s.Pi+=h);0>a&&(s.Pi=180-s.Pi,s.fl=!s.fl);0>d&&(s.Pi=-s.Pi,s.fl=!s.fl);s.radiusX*=Math.sqrt(a*a+c*c);s.radiusY*=Math.sqrt(b*b+d*d);break;default:u.k("Unknown Segment type: "+s.type)}}}}this.Ta=!0;return this}; -$c.prototype.Xr=function(a,b){var c=this.nc,d=this.uc,e=this.pb,f=this.Bb,h=Math.min(c,e),k=Math.min(d,f),c=Math.abs(e-c),d=Math.abs(f-d),f=u.K();f.x=h;f.y=k;b.ab(f);e=new bd(f.x,f.y);f.x=h+c;f.y=k;b.ab(f);e.Fa.add(new Jd(pd,f.x,f.y));f.x=h+c;f.y=k+d;b.ab(f);e.Fa.add(new Jd(pd,f.x,f.y));f.x=h;f.y=k+d;b.ab(f);e.Fa.add((new Jd(pd,f.x,f.y)).close());u.v(f);a.type=ad;a.ub.add(e);return a}; -$c.prototype.Aa=function(a,b,c,d){var e=a.x,f=a.y,h=this.kb.x-20;a=a.y;for(var k=0,l=0,m=0,n=0,p=0,q=0,r=this.ub.n,s=r.length,t=0;t=a)return 0;if((e>h?e-h:h-e)<(f>k?f-k:k-f)){if(e=a=0,fe)return 0}else if(ee)return 0;return 0a||1a)return n=(a-q)/p,u.ra(c),new w(b+(e-b)*n,d+(f-d)*n);q+=p}b=e;d=f}u.ra(c);return null};u.defineProperty($c,{type:"type"},function(){return this.oa},function(a){this.oa!==a&&(u.I(this,a),this.oa=a,this.Ta=!0)});u.defineProperty($c,{ua:"startX"},function(){return this.nc},function(a){this.nc!==a&&(u.I(this,a),this.nc=a,this.Ta=!0)}); -u.defineProperty($c,{va:"startY"},function(){return this.uc},function(a){this.uc!==a&&(u.I(this,a),this.uc=a,this.Ta=!0)});u.defineProperty($c,{F:"endX"},function(){return this.pb},function(a){this.pb!==a&&(u.I(this,a),this.pb=a,this.Ta=!0)});u.defineProperty($c,{G:"endY"},function(){return this.Bb},function(a){this.Bb!==a&&(u.I(this,a),this.Bb=a,this.Ta=!0)});u.defineProperty($c,{ub:"figures"},function(){return this.Zi},function(a){this.Zi!==a&&(u.I(this,a),this.Zi=a,this.Ta=!0)}); -$c.prototype.add=$c.prototype.add=function(a){this.Zi.add(a);return this};u.defineProperty($c,{A:"spot1"},function(){return this.ri},function(a){u.I(this,a);this.ri=a.Z()});u.defineProperty($c,{B:"spot2"},function(){return this.si},function(a){u.I(this,a);this.si=a.Z()});u.defineProperty($c,{Bd:"defaultStretch"},function(){return this.bi},function(a){u.I(this,a);this.bi=a});u.u($c,{kb:"bounds"},function(){this.vz()&&(this.nA(),this.kg());return this.Ut}); -function bd(a,b,c,d){u.gc(this);this.Ca=!1;void 0===c&&(c=!0);this.Il=c;void 0===d&&(d=!0);this.En=d;this.nc=void 0!==a?a:0;this.uc=void 0!==b?b:0;this.Yn=new E(Jd);this.cv=this.Yn.U;this.Ta=!0}u.fa("PathFigure",bd);u.Lh(bd);bd.prototype.copy=function(){var a=new bd;a.Il=this.Il;a.En=this.En;a.nc=this.nc;a.uc=this.uc;for(var b=this.Yn.n,c=b.length,d=a.Yn,e=0;ea?"M"+this.ua.toString()+" "+this.va.toString():"M"+this.ua.toFixed(a)+" "+this.va.toFixed(a),c=this.Fa.n,d=c.length,e=0;ea&&(a+=360),this.bd=a),void 0!==d&&(this.dg=Math.max(d,0)),void 0!==e&&(this.eg=Math.max(e,0)),this.Ln=!!h,this.bn=!!k):(void 0!==d&&(this.bd=d),void 0!==e&&(this.xe=e),void 0!==f&&(a===Bd&&(f=Math.max(f,0)),this.dg=f),void 0!==h&&"number"===typeof h&&(a===Bd&&(h=Math.max(h,0)),this.eg=h));this.zh=!1;this.Ta=!0;this.Ri=null} -u.fa("PathSegment",Jd);u.Lh(Jd);Jd.prototype.copy=function(){var a=new Jd;a.oa=this.oa;a.pb=this.pb;a.Bb=this.Bb;void 0!==this.bd&&(a.bd=this.bd);void 0!==this.xe&&(a.xe=this.xe);void 0!==this.dg&&(a.dg=this.dg);void 0!==this.eg&&(a.eg=this.eg);void 0!==this.Ln&&(a.Ln=this.Ln);void 0!==this.bn&&(a.bn=this.bn);a.zh=this.zh;a.Ta=this.Ta;return a}; -Jd.prototype.equalsApprox=Jd.prototype.De=function(a){if(!(a instanceof Jd)||this.type!==a.type||this.ew!==a.ew)return!1;switch(this.type){case yd:case pd:return K.D(this.F,a.F)&&K.D(this.G,a.G);case zd:return K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.Rb,a.Rb)&&K.D(this.jc,a.jc)&&K.D(this.df,a.df)&&K.D(this.ef,a.ef);case Ad:return K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.Rb,a.Rb)&&K.D(this.jc,a.jc);case Bd:return K.D(this.Je,a.Je)&&K.D(this.Qf,a.Qf)&&K.D(this.Ja,a.Ja)&&K.D(this.Ua,a.Ua)&&K.D(this.radiusX, -a.radiusX)&&K.D(this.radiusY,a.radiusY);case Gd:return this.fl===a.fl&&this.hw===a.hw&&K.D(this.Pi,a.Pi)&&K.D(this.F,a.F)&&K.D(this.G,a.G)&&K.D(this.radiusX,a.radiusX)&&K.D(this.radiusY,a.radiusY);default:return!1}}; -Jd.prototype.toString=function(a){void 0===a&&(a=-1);var b="";switch(this.type){case yd:b=0>a?"M"+this.F.toString()+" "+this.G.toString():"M"+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case pd:b=0>a?"L"+this.F.toString()+" "+this.G.toString():"L"+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case zd:b=0>a?"C"+this.Rb.toString()+" "+this.jc.toString()+" "+this.df.toString()+" "+this.ef.toString()+" "+this.F.toString()+" "+this.G.toString():"C"+this.Rb.toFixed(a)+" "+this.jc.toFixed(a)+" "+this.df.toFixed(a)+ -" "+this.ef.toFixed(a)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case Ad:b=0>a?"Q"+this.Rb.toString()+" "+this.jc.toString()+" "+this.F.toString()+" "+this.G.toString():"Q"+this.Rb.toFixed(a)+" "+this.jc.toFixed(a)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;case Bd:b=0>a?"B"+this.Je.toString()+" "+this.Qf.toString()+" "+this.Ja.toString()+" "+this.Ua.toString()+" "+this.radiusX:"B"+this.Je.toFixed(a)+" "+this.Qf.toFixed(a)+" "+this.Ja.toFixed(a)+" "+this.Ua.toFixed(a)+" "+this.radiusX; -break;case Gd:b=0>a?"A"+this.radiusX.toString()+" "+this.radiusY.toString()+" "+this.Pi.toString()+" "+(this.hw?1:0)+" "+(this.fl?1:0)+" "+this.F.toString()+" "+this.G.toString():"A"+this.radiusX.toFixed(a)+" "+this.radiusY.toFixed(a)+" "+this.Pi.toFixed(a)+" "+(this.hw?1:0)+" "+(this.fl?1:0)+" "+this.F.toFixed(a)+" "+this.G.toFixed(a);break;default:b=this.type.toString()}return b+(this.zh?"z":"")};var yd;Jd.Move=yd=u.s(Jd,"Move",0);var pd;Jd.Line=pd=u.s(Jd,"Line",1);var zd; -Jd.Bezier=zd=u.s(Jd,"Bezier",2);var Ad;Jd.QuadraticBezier=Ad=u.s(Jd,"QuadraticBezier",3);var Bd;Jd.Arc=Bd=u.s(Jd,"Arc",4);var Gd;Jd.SvgArc=Gd=u.s(Jd,"SvgArc",4);Jd.prototype.freeze=function(){this.Ca=!0;return this};Jd.prototype.La=function(){this.Ca=!1;return this};Jd.prototype.close=Jd.prototype.close=function(){this.zh=!0;return this}; -function Hd(a,b){if(null!==a.Ri&&!1===b.Ta)return a.Ri;var c=a.radiusX,d=a.radiusY;void 0===d&&(d=c);var e=a.bd,f=a.xe,h=K.fD(0,0,c=s?k=Math.PI:1<=s&&(k=0);!m&&0k&&(k+=2*Math.PI);m=b>h?1:b/h;s=b>h?h/b:1;b=K.fD(0,0,b>h?b:h,p,p+k,!0);h=u.jh();h.reset();h.translate(c,d);h.rotate(a.bd,0,0);h.scale(m,s);wd(b,h);u.Ye(h);a.Ri=b;return a.Ri} -u.defineProperty(Jd,{ew:"isClosed"},function(){return this.zh},function(a){this.zh!==a&&(this.zh=a,this.Ta=!0)});u.defineProperty(Jd,{type:"type"},function(){return this.oa},function(a){u.I(this,a);this.oa=a;this.Ta=!0});u.defineProperty(Jd,{F:"endX"},function(){return this.pb},function(a){u.I(this,a);this.pb=a;this.Ta=!0});u.defineProperty(Jd,{G:"endY"},function(){return this.Bb},function(a){u.I(this,a);this.Bb=a;this.Ta=!0}); -u.defineProperty(Jd,{Rb:"point1X"},function(){return this.bd},function(a){u.I(this,a);this.bd=a;this.Ta=!0});u.defineProperty(Jd,{jc:"point1Y"},function(){return this.xe},function(a){u.I(this,a);this.xe=a;this.Ta=!0});u.defineProperty(Jd,{df:"point2X"},function(){return this.dg},function(a){u.I(this,a);this.dg=a;this.Ta=!0});u.defineProperty(Jd,{ef:"point2Y"},function(){return this.eg},function(a){u.I(this,a);this.eg=a;this.Ta=!0}); -u.defineProperty(Jd,{Ja:"centerX"},function(){return this.bd},function(a){u.I(this,a);this.bd=a;this.Ta=!0});u.defineProperty(Jd,{Ua:"centerY"},function(){return this.xe},function(a){u.I(this,a);this.xe=a;this.Ta=!0});u.defineProperty(Jd,{radiusX:"radiusX"},function(){return this.dg},function(a){0>a&&u.wa(a,">= zero",Jd,"radiusX");u.I(this,a);this.dg=a;this.Ta=!0}); -u.defineProperty(Jd,{radiusY:"radiusY"},function(){return this.eg},function(a){0>a&&u.wa(a,">= zero",Jd,"radiusY");u.I(this,a);this.eg=a;this.Ta=!0});u.defineProperty(Jd,{Je:"startAngle"},function(){return this.pb},function(a){this.pb!==a&&(u.I(this,a),a%=360,0>a&&(a+=360),this.pb=a,this.Ta=!0)});u.defineProperty(Jd,{Qf:"sweepAngle"},function(){return this.Bb},function(a){u.I(this,a);360a&&(a=-360);this.Bb=a;this.Ta=!0}); -u.defineProperty(Jd,{fl:"isClockwiseArc"},function(){return this.bn},function(a){u.I(this,a);this.bn=a;this.Ta=!0});u.defineProperty(Jd,{hw:"isLargeArc"},function(){return this.Ln},function(a){u.I(this,a);this.Ln=a;this.Ta=!0});u.defineProperty(Jd,{Pi:"xAxisRotation"},function(){return this.bd},function(a){a%=360;0>a&&(a+=360);u.I(this,a);this.bd=a;this.Ta=!0}); -function Md(){this.Y=null;this.Hy=(new w(0,0)).freeze();this.Cx=(new w(0,0)).freeze();this.Rt=this.Mu=0;this.Au="";this.rv=this.gu=!1;this.cu=this.Tt=0;this.Si=this.nu=this.wu=!1;this.Vp=null;this.qv=0;this.fg=this.nv=null}u.fa("InputEvent",Md); -Md.prototype.copy=function(){var a=new Md;a.Y=this.Y;a.Hy.assign(this.ff);a.Cx.assign(this.da);a.Mu=this.Mu;a.Rt=this.Rt;a.Au=this.Au;a.gu=this.gu;a.rv=this.rv;a.Tt=this.Tt;a.cu=this.cu;a.wu=this.wu;a.nu=this.nu;a.Si=this.Si;a.Vp=this.Vp;a.qv=this.qv;a.nv=this.nv;a.fg=this.fg;return a}; -Md.prototype.toString=function(){var a="^";0!==this.gd&&(a+="M:"+this.gd);0!==this.button&&(a+="B:"+this.button);""!==this.key&&(a+="K:"+this.key);0!==this.Te&&(a+="C:"+this.Te);0!==this.Uk&&(a+="D:"+this.Uk);this.Tc&&(a+="h");this.bubbles&&(a+="b");null!==this.da&&(a+="@"+this.da.toString());return a};u.defineProperty(Md,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Md,{ff:"viewPoint"},function(){return this.Hy},function(a){u.C(a,w,Md,"viewPoint");this.Hy.assign(a)}); -u.defineProperty(Md,{da:"documentPoint"},function(){return this.Cx},function(a){u.C(a,w,Md,"documentPoint");this.Cx.assign(a)});u.defineProperty(Md,{gd:"modifiers"},function(){return this.Mu},function(a){this.Mu=a});u.defineProperty(Md,{button:"button"},function(){return this.Rt},function(a){this.Rt=a});u.defineProperty(Md,{key:"key"},function(){return this.Au},function(a){this.Au=a});u.defineProperty(Md,{Wk:"down"},function(){return this.gu},function(a){this.gu=a}); -u.defineProperty(Md,{up:"up"},function(){return this.rv},function(a){this.rv=a});u.defineProperty(Md,{Te:"clickCount"},function(){return this.Tt},function(a){this.Tt=a});u.defineProperty(Md,{Uk:"delta"},function(){return this.cu},function(a){this.cu=a});u.defineProperty(Md,{Ps:"isMultiTouch"},function(){return this.wu},function(a){this.wu=a});u.defineProperty(Md,{Tc:"handled"},function(){return this.nu},function(a){this.nu=a}); -u.defineProperty(Md,{bubbles:"bubbles"},function(){return this.Si},function(a){this.Si=a});u.defineProperty(Md,{event:"event"},function(){return this.Vp},function(a){this.Vp=a});u.u(Md,{jl:"isTouchEvent"},function(){var a=window.TouchEvent;return a&&this.event instanceof a?!0:(a=window.PointerEvent)&&this.event instanceof a&&"touch"===this.event.pointerType});u.defineProperty(Md,{timestamp:"timestamp"},function(){return this.qv},function(a){this.qv=a}); -u.defineProperty(Md,{Cg:"targetDiagram"},function(){return this.nv},function(a){this.nv=a});u.defineProperty(Md,{pe:"targetObject"},function(){return this.fg},function(a){this.fg=a});u.defineProperty(Md,{control:"control"},function(){return 0!==(this.gd&1)},function(a){this.gd=a?this.gd|1:this.gd&-2});u.defineProperty(Md,{shift:"shift"},function(){return 0!==(this.gd&4)},function(a){this.gd=a?this.gd|4:this.gd&-5}); -u.defineProperty(Md,{alt:"alt"},function(){return 0!==(this.gd&2)},function(a){this.gd=a?this.gd|2:this.gd&-3});u.defineProperty(Md,{Ys:"meta"},function(){return 0!==(this.gd&8)},function(a){this.gd=a?this.gd|8:this.gd&-9});u.defineProperty(Md,{left:"left"},function(){return 0===this.button},function(a){this.button=a?0:2});u.defineProperty(Md,{YJ:"middle"},function(){return 1===this.button},function(a){this.button=a?1:0}); -u.defineProperty(Md,{right:"right"},function(){return 2===this.button},function(a){this.button=a?2:0});function Nd(){this.Y=null;this.Ub="";this.Vu=this.iv=null;this.St=!1}u.fa("DiagramEvent",Nd);Nd.prototype.copy=function(){var a=new Nd;a.Y=this.Y;a.Ub=this.Ub;a.iv=this.iv;a.Vu=this.Vu;a.St=this.St;return a};Nd.prototype.toString=function(){var a="*"+this.name;this.cancel&&(a+="x");null!==this.hA&&(a+=":"+this.hA.toString());null!==this.Mz&&(a+="("+this.Mz.toString()+")");return a}; -u.defineProperty(Nd,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Nd,{name:"name"},function(){return this.Ub},function(a){this.Ub=a});u.defineProperty(Nd,{hA:"subject"},function(){return this.iv},function(a){this.iv=a});u.defineProperty(Nd,{Mz:"parameter"},function(){return this.Vu},function(a){this.Vu=a});u.defineProperty(Nd,{cancel:"cancel"},function(){return this.St},function(a){this.St=a}); -function Zd(){this.Bp=$d;this.Xl=this.Lu="";this.Wq=this.Xq=this.ar=this.br=this.$q=this.Y=this.Od=null}u.fa("ChangedEvent",Zd);var ae;Zd.Transaction=ae=u.s(Zd,"Transaction",-1);var $d;Zd.Property=$d=u.s(Zd,"Property",0);var be;Zd.Insert=be=u.s(Zd,"Insert",1);var ce;Zd.Remove=ce=u.s(Zd,"Remove",2);Zd.prototype.clear=Zd.prototype.clear=function(){this.Wq=this.Xq=this.ar=this.br=this.$q=this.Y=this.Od=null}; -Zd.prototype.copy=function(){var a=new Zd;a.Od=this.Od;a.Y=this.Y;a.Bp=this.Bp;a.Lu=this.Lu;a.Xl=this.Xl;a.$q=this.$q;var b=this.br;a.br=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;b=this.ar;a.ar=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;b=this.Xq;a.Xq=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;b=this.Wq;a.Wq=u.Sa(b)&&"function"===typeof b.Z?b.Z():b;return a}; -Zd.prototype.toString=function(){var a="",a=this.Ad===ae?a+"* ":this.Ad===$d?a+(null!==this.ga?"!m":"!d"):a+((null!==this.ga?"!m":"!d")+this.Ad);this.propertyName&&"string"===typeof this.propertyName&&(a+=" "+this.propertyName);this.Lf&&this.Lf!==this.propertyName&&(a+=" "+this.Lf);a+=": ";this.Ad===ae?null!==this.oldValue&&(a+=" "+this.oldValue):(null!==this.object&&(a+=de(this.object)),null!==this.oldValue&&(a+=" old: "+de(this.oldValue)),null!==this.zg&&(a+=" "+this.zg),null!==this.newValue&& -(a+=" new: "+de(this.newValue)),null!==this.xg&&(a+=" "+this.xg));return a};Zd.prototype.getValue=Zd.prototype.ta=function(a){return a?this.oldValue:this.newValue};Zd.prototype.getParam=function(a){return a?this.zg:this.xg};Zd.prototype.canUndo=Zd.prototype.canUndo=function(){return null!==this.ga||null!==this.g?!0:!1};Zd.prototype.undo=Zd.prototype.undo=function(){this.canUndo()&&(null!==this.ga?this.ga.pm(this,!0):null!==this.g&&this.g.pm(this,!0))}; -Zd.prototype.canRedo=Zd.prototype.canRedo=function(){return null!==this.ga||null!==this.g?!0:!1};Zd.prototype.redo=Zd.prototype.redo=function(){this.canRedo()&&(null!==this.ga?this.ga.pm(this,!1):null!==this.g&&this.g.pm(this,!1))};u.defineProperty(Zd,{ga:"model"},function(){return this.Od},function(a){this.Od=a});u.defineProperty(Zd,{g:"diagram"},function(){return this.Y},function(a){this.Y=a});u.defineProperty(Zd,{Ad:"change"},function(){return this.Bp},function(a){this.Bp=a}); -u.defineProperty(Zd,{Lf:"modelChange"},function(){return this.Lu},function(a){this.Lu=a});u.defineProperty(Zd,{propertyName:"propertyName"},function(){return this.Xl},function(a){this.Xl=a});u.u(Zd,{IJ:"isTransactionFinished"},function(){return this.Bp===ae&&("CommittedTransaction"===this.Xl||"FinishedUndo"===this.Xl||"FinishedRedo"===this.Xl)});u.defineProperty(Zd,{object:"object"},function(){return this.$q},function(a){this.$q=a}); -u.defineProperty(Zd,{oldValue:"oldValue"},function(){return this.br},function(a){this.br=a});u.defineProperty(Zd,{zg:"oldParam"},function(){return this.ar},function(a){this.ar=a});u.defineProperty(Zd,{newValue:"newValue"},function(){return this.Xq},function(a){this.Xq=a});u.defineProperty(Zd,{xg:"newParam"},function(){return this.Wq},function(a){this.Wq=a}); -function J(a){1=d)return"[]";var e=new Ba;e.add("[ ");c&&1b||(u.zi(this.mf,b),Le(this,"nodeDataArray",ce,"nodeDataArray",this,a,null,b,null),this.zt(a)))}}; -J.prototype.removeNodeDataCollection=function(a){if(u.isArray(a))for(var b=u.qb(a),c=0;cb&&(b=u.qb(a));u.yi(a,b,c);Le(this,"",be,"",a,null,c,null,b)};J.prototype.removeArrayItem=function(a,b){void 0===b&&(b=-1);a===this.mf&&u.k("Model.removeArrayItem should not be called on the Model.nodeDataArray");-1===b&&(b=u.qb(a)-1);var c=u.fb(a,b);u.zi(a,b);Le(this,"",ce,"",a,c,null,b,null)}; -u.defineProperty(J,{Im:"nodeCategoryProperty"},function(){return this.Yq},function(a){var b=this.Yq;b!==a&&(Me(a,J,"nodeCategoryProperty"),this.Yq=a,this.h("nodeCategoryProperty",b,a))});J.prototype.getCategoryForNodeData=J.prototype.fz=function(a){if(null===a)return"";var b=this.Yq;if(""===b)return"";b=u.sb(a,b);if(void 0===b)return"";if("string"===typeof b)return b;u.k("getCategoryForNodeData found a non-string category for "+a+": "+b);return""}; -J.prototype.setCategoryForNodeData=J.prototype.Dw=function(a,b){u.j(b,"string",J,"setCategoryForNodeData:cat");if(null!==a){var c=this.Yq;if(""!==c)if(this.Ue(a)){var d=u.sb(a,c);void 0===d&&(d="");d!==b&&(u.Oa(a,c,b),Le(this,"nodeCategory",$d,c,a,d,b))}else u.Oa(a,c,b)}}; -function Q(a,b){2e||(u.zi(d,e),this.Ci(a)&&(Qe(this,b,a),Le(this,"linkLabelKeys",ce,c,a,b,null)))}else void 0!==d&&u.k(c+" property is not an Array; cannot removeLabelKeyforLinkData: "+a)}}}; -u.defineProperty(Q,{Qj:"linkDataArray"},function(){return this.Bh},function(a){var b=this.Bh;if(b!==a){u.Qy(a,Q,"linkDataArray");for(var c=u.qb(a),d=0;db)){u.zi(this.Bh,b);Le(this,"linkDataArray",ce,"linkDataArray",this,a,null,b,null);b=this.$k(a);Qe(this,b,a);b=this.cl(a);Qe(this,b,a);var c=this.Pj(a);if(u.isArray(c))for(var d=u.qb(c),e=0;ea.Le&&u.trace("Ending transaction without having started a transaction: "+c);var d=1===a.Le;d&&b&&a.isEnabled&&a.Rc("CommittingTransaction",c,a.Di);var e=0;if(0a.Ii;e--)f=d.ja(e),null!== -f&&f.clear(),d.hd(e),a.Yx=!0;e=a.VD;0===e&&(e=1);0=e&&(f=d.ja(0),null!==f&&f.clear(),d.hd(0),a.Ig--);d.add(b);a.Ig++;d.freeze();f=b}a.Rc("CommittedTransaction",c,f)}else{a.fi=!0;try{a.isEnabled&&null!==f&&(f.Ms=!0,f.undo())}finally{a.Rc("RolledBackTransaction",c,f),a.fi=!1}null!==f&&f.clear()}a.bu=null;return!0}if(a.isEnabled&&!b&&null!==f){a=e;c=f.Ug;for(b=c.count-1;b>=a;b--)d=c.ja(b),null!==d&&d.undo(),c.La(),c.hd(b);c.freeze()}return!1} -ee.prototype.canUndo=ee.prototype.canUndo=function(){if(!this.isEnabled||0=this.Le&&!this.Kx&&(a=a.g,null!==a&&!1===a.lf||u.trace("Change not within a transaction: "+c.toString()))}}; -ee.prototype.skipsEvent=function(a){if(null===a||0>a.Ad.value)return!0;a=a.object;if(a instanceof S){if(a=a.layer,null!==a&&a.Ac)return!0}else if(a instanceof we&&a.Ac)return!0;return!1};u.u(ee,{BH:"models"},function(){return this.hy.i});u.defineProperty(ee,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){this.Ne=a});u.u(ee,{UE:"transactionToUndo"},function(){return 0<=this.Ii&&this.Ii<=this.history.count-1?this.history.ja(this.Ii):null}); -u.u(ee,{TE:"transactionToRedo"},function(){return this.Iib.Xg||(b.scale=a))};sa.prototype.canDecreaseZoom=function(a){void 0===a&&(a=1/this.Ow);u.ze(a,sa,"canDecreaseZoom:factor");var b=this.g;if(null===b||b.no!==vf)return!1;a*=b.scale;return ab.Xg?!1:b.Gv}; -sa.prototype.increaseZoom=function(a){void 0===a&&(a=this.Ow);u.ze(a,sa,"increaseZoom:factor");var b=this.g;null!==b&&b.no===vf&&(a*=b.scale,ab.Xg||(b.scale=a))};sa.prototype.canIncreaseZoom=function(a){void 0===a&&(a=this.Ow);u.ze(a,sa,"canIncreaseZoom:factor");var b=this.g;if(null===b||b.no!==vf)return!1;a*=b.scale;return ab.Xg?!1:b.Gv};sa.prototype.resetZoom=function(a){void 0===a&&(a=this.Pv);u.ze(a,sa,"resetZoom:newscale");var b=this.g;null===b||ab.Xg||(b.scale=a)}; -sa.prototype.canResetZoom=function(a){void 0===a&&(a=this.Pv);u.ze(a,sa,"canResetZoom:newscale");var b=this.g;return null===b||ab.Xg?!1:b.Gv};sa.prototype.zoomToFit=function(){var a=this.g;if(null!==a){var b=a.scale,c=a.position;b!==this.FC||isNaN(this.Zx)?(this.Zx=b,this.zB=c.copy(),a.zoomToFit(),a.bf(),this.FC=a.scale):(a.scale=this.Zx,a.position=this.zB)}};sa.prototype.canZoomToFit=function(){var a=this.g;return null===a?!1:a.Gv}; -sa.prototype.collapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b)return!1;try{b.Wb("Collapse Tree");var c=new E(U);if(null!==a&&a.Vc)a.collapseTree(),c.add(a);else for(var d=b.selection.i;d.next();){var e=d.value;e instanceof U&&(a=e,a.Vc&&(a.collapseTree(),c.add(a)))}b.za("TreeCollapsed",c)}finally{b.Wd("Collapse Tree")}}; -sa.prototype.canCollapseTree=function(a){void 0===a&&(a=null);var b=this.g;if(null===b||b.nb)return!1;if(null!==a){if(!a.Vc)return!1;if(0b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Df[0])c=a.Df[0],d=a.Df[1];else return;this.doCancel();if(a.yn){a.Lx=!0;a.MB=a.scale;var e=a.Ab,f=a.zb,h=a.ib.getBoundingClientRect(),k=c.clientX-e/h.width*h.left,l=c.clientY-f/h.height*h.top,c=d,d=c.clientX-e/h.width*h.left-k,f=c.clientY-f/h.height*h.top-l,f=Math.sqrt(d*d+f* -f);a.iC=f;b.preventDefault();b.cancelBubble=!0}else yf(a)}}; -xe.prototype.standardPinchZoomMove=function(){var a=this.g;if(null!==a){var b=a.N.event;this.doCancel();yf(a);var c=null,d=null;if(void 0!==b.targetTouches){if(2>b.targetTouches.length)return;c=b.targetTouches[0];d=b.targetTouches[1]}else if(null!==a.Df[0])c=a.Df[0],d=a.Df[1];else return;if(a.yn&&a.Lx){var e=a.Ab,f=a.zb,h=a.ib.getBoundingClientRect(),k=c,c=k.clientX-e/h.width*h.left,l=k.clientY-f/h.height*h.top,k=d,d=k.clientX-e/h.width*h.left,f=k.clientY-f/h.height*h.top,h=d-c,e=f-l,h=Math.sqrt(h* -h+e*e)/a.iC,c=new w((Math.min(d,c)+Math.max(d,c))/2,(Math.min(f,l)+Math.max(f,l))/2),l=a.MB*h,d=a.Eb;l!==a.scale&&d.canResetZoom(l)&&(f=a.Rm,a.Rm=c,d.resetZoom(l),a.Rm=f);b.preventDefault();b.cancelBubble=!0}}};xe.prototype.doKeyDown=function(){var a=this.g;null!==a&&"Esc"===a.N.key&&this.doCancel()};xe.prototype.doKeyUp=function(){};xe.prototype.startTransaction=xe.prototype.Wb=function(a){void 0===a&&(a=this.name);this.zf=null;var b=this.g;return null===b?!1:b.Wb(a)}; -xe.prototype.stopTransaction=xe.prototype.Uj=function(){var a=this.g;return null===a?!1:null===this.zf?a.ap():a.Wd(this.zf)}; -xe.prototype.standardMouseSelect=function(){var a=this.g;if(null!==a&&a.of){var b=a.N,c=a.zs(b.da,!1);if(null!==c)if(u.Em?b.Ys:b.control){a.za("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Ra;null!==b&&(b.Za=!b.Za);a.za("ChangedSelection")}else if(b.shift){if(!c.Za){a.za("ChangingSelection");for(b=c;null!==b&&!b.canSelect();)b=b.Ra;null!==b&&(b.Za=!0);a.za("ChangedSelection")}}else{if(!c.Za){for(b=c;null!==b&&!b.canSelect();)b=b.Ra;null!==b&&a.select(b)}}else!b.left||(u.Em?b.Ys:b.control)|| -b.shift||a.Lv()}};xe.prototype.standardMouseClick=function(a,b){void 0===a&&(a=null);void 0===b&&(b=function(a){return!a.layer.Ac});var c=this.g;if(null!==c){var d=c.N,e=c.ke(d.da,a,b);d.pe=e;zf(e,d,c)}}; -function zf(a,b,c){var d=0;b.left?d=1===b.Te?1:2===b.Te?2:1:b.right&&1===b.Te&&(d=3);var e="";if(null!==a){switch(d){case 1:e="ObjectSingleClicked";break;case 2:e="ObjectDoubleClicked";break;case 3:e="ObjectContextClicked"}0!==d&&c.za(e,a)}else{switch(d){case 1:e="BackgroundSingleClicked";break;case 2:e="BackgroundDoubleClicked";break;case 3:e="BackgroundContextClicked"}0!==d&&c.za(e)}if(null!==a)for(b.Tc=!1;null!==a;){c=null;switch(d){case 1:c=a.click;break;case 2:c=a.ts?a.ts:a.click;break;case 3:c= -a.Uy}if(null!==c&&(c(b,a),b.Tc))break;a=a.S}else{a=null;switch(d){case 1:a=c.click;break;case 2:a=c.ts?c.ts:c.click;break;case 3:a=c.Uy}null!==a&&a(b)}} -xe.prototype.standardMouseOver=function(){var a=this.g;if(null!==a){var b=a.N;if(null!==b.g&&!0!==a.Lb.ld){var c=a.cb;a.cb=!0;var d=a.ke(b.da,null,null);b.pe=d;var e=!1;if(d!==a.en){var f=a.en,h=f;a.en=d;this.doCurrentObjectChanged(f,d);for(b.Tc=!1;null!==f;){var k=f.$D;if(null!==k){if(d===f)break;if(null!==d&&d.gl(f))break;k(b,f,d);e=!0;if(b.Tc)break}f=f.S}f=h;for(b.Tc=!1;null!==d;){k=d.ZD;if(null!==k){if(f===d)break;if(null!==f&&f.gl(d))break;k(b,d,f);e=!0;if(b.Tc)break}d=d.S}d=a.en}if(null!==d){f= -d;for(k="";null!==f;){k=f.cursor;if(""!==k)break;f=f.S}a.ac=k;b.Tc=!1;for(f=d;null!==f;){k=f.Fz;if(null!==k&&(k(b,f),e=!0,b.Tc))break;f=f.S}}else a.ac="",k=a.Fz,null!==k&&(k(b),e=!0);e&&a.de();a.cb=c}}};xe.prototype.doCurrentObjectChanged=function(){}; -xe.prototype.standardMouseWheel=function(){var a=this.g;if(null!==a){var b=a.N,c=b.Uk;if(0!==c&&a.Cd.J()){var d=a.Eb,e=a.tb.$s;if((e===Af&&!b.shift||e===Bf&&b.control)&&(0e||Math.abs(b.y-a.y)>d};u.u(xe,{g:"diagram"},function(){return this.Y}); -u.defineProperty(xe,{name:"name"},function(){return this.Ub},function(a){u.j(a,"string",xe,"name");this.Ub=a});u.defineProperty(xe,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){u.j(a,"boolean",xe,"isEnabled");this.Ne=a});u.defineProperty(xe,{na:"isActive"},function(){return this.lB},function(a){u.j(a,"boolean",xe,"isActive");this.lB=a});u.defineProperty(xe,{zf:"transactionResult"},function(){return this.AC},function(a){null!==a&&u.j(a,"string",xe,"transactionResult");this.AC=a}); -function uf(){0e&&(e=k),l>f&&(f=l))}}Infinity===c?b.m(0,0,0,0):b.m(c,d,e-c,f-d)} -function ig(a,b){if(null===a.oc){var c=a.g;if(!(null===c||b&&(c.nb||c.uf))&&null!==a.cc){var d=c.ha;d.isEnabled&&d.ND?null!==d.Di&&0c.ka)){var d=a.g;if(null!==d&&!d.nb&&(d=a.pi,null!==d)){var e=null,f=null;null===c.W&&(e=zg(a,c.l(0),!1),null!==e&&(f=e.T));var h=null,k=null;null===c.ca&&(h=zg(a,c.l(c.ka-1),!0),null!==h&&(k=h.T));d.isValidLink(f,e,k,h)?b?(c.jn=c.l(0).copy(),c.nn=c.l(c.ka-1).copy(),c.ip=!1,c.W=f,null!==e&&(c.pg=e.Jd),c.ca=k,null!==h&&(c.lh=h.Jd)):Ag(d,f,e,k,h):Ag(d,null,null,null,null)}}}uf.prototype.doDragOver=function(){}; -function Bg(a,b){var c=a.g;if(null!==c){a.Gi&&vg(a,!0);Zf(a);var d=wg(c,b,null,function(b){return!mg(a,b)}),e=c.N;e.pe=d;if(null!==d){e.Tc=!1;for(var f=d;null!==f;){var h=f.Cz;if(null!==h&&(h(e,f),e.Tc))break;f=yg(f)}}else h=c.Cz,null!==h&&h(e);if(a.na||null!==Ef)if(a.doDropOnto(b,d),a.na||null!==Ef)for(d=c.selection.i;d.next();)e=d.value,e instanceof U&&Cg(c,e.ba)}}uf.prototype.doDropOnto=function(){}; -uf.prototype.doMouseMove=function(){if(this.na){var a=this.g;if(null!==a&&null!==this.rs&&null!==this.cc){var b=!1,c=!1;this.mayCopy()?(b=!0,a.ac="copy",ig(this,!1),Df(this,this.oc),jg(this,this.oc,!1),$f(this,this.oc)):this.mayMove()?(c=!0,a.ac="default",cg(this),jg(this,this.cc,!0)):this.mayDragOut()?(a.ac="no-drop",ig(this,!1),jg(this,this.oc,!1)):cg(this);ng(this,a.N.da,c,b)}}}; -uf.prototype.doMouseUp=function(){if(this.na){var a=this.g;if(null!==a){var b=!1,c=this.mayCopy();c&&null!==this.oc?(cg(this),ig(this,!0),Df(this,this.oc),jg(this,this.oc,!1),$f(this,this.oc),null!==this.oc&&a.CE(this.oc.Ni())):(b=!0,cg(this),this.mayMove()&&(jg(this,this.cc,!0),this.ev=!1,ng(this,a.N.da,!0,!1),this.ev=!0));this.Rp=!0;Bg(this,a.N.da);if(this.na){this.oc=null;if(b&&null!==this.cc)for(b=this.cc.i;b.next();){var d=b.key;d instanceof U&&(d=d.Ra,null===d||null===d.placeholder||this.cc.contains(d)|| -d.aD&&d.R())}a.pc();$f(this,this.cc);this.zf=c?"Copy":"Move";a.za(c?"SelectionCopied":"SelectionMoved",a.selection)}this.stopTool()}}};uf.prototype.mayCopy=function(){if(!this.MD)return!1;var a=this.g;if(null===a||a.nb||a.uf||!a.lo||!a.Ij||(u.Em?!a.N.alt:!a.N.control))return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Fd()&&b.canCopy())return!0}return null!==this.Sc&&this.Gi&&this.Sc.canCopy()?!0:!1}; -uf.prototype.mayDragOut=function(){if(!this.MD)return!1;var a=this.g;if(null===a||!a.Av||!a.Ij||a.Nk)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Fd()&&b.canCopy())return!0}return null!==this.Sc&&this.Gi&&this.Sc.canCopy()?!0:!1};uf.prototype.mayMove=function(){var a=this.g;if(null===a||a.nb||!a.Nk)return!1;for(a=a.selection.i;a.next();){var b=a.value;if(b.Fd()&&b.canMove())return!0}return null!==this.Sc&&this.Gi&&this.Sc.canMove()?!0:!1};var ag=new E(uf),Ef=null,Ff=null; -uf.prototype.mayDragIn=function(){var a=this.g;if(null===a||!a.MC||a.nb||a.uf||!a.lo)return!1;var b=Ef;return null===b||b.g.ga.Sk!==a.ga.Sk?!1:!0};uf.prototype.doSimulatedDragEnter=function(){if(this.mayDragIn()){var a=this.g;a.Lb.Mi();Dg(a);a=Ef;null!==a&&(a.g.ac="copy")}};uf.prototype.doSimulatedDragLeave=function(){var a=Ef;null!==a&&a.doSimulatedDragOut();this.doCancel()}; -uf.prototype.doSimulatedDragOver=function(){var a=this.g;if(null!==a){var b=Ef;null!==b&&null!==b.cc&&this.mayDragIn()&&(a.ac="copy",Eg(this,b.cc.Ni(),!1),jg(this,this.oc,!1),ng(this,a.N.da,!1,!0))}}; -uf.prototype.doSimulatedDrop=function(){var a=this.g;if(null!==a){var b=Ef;null!==b&&(b.Rp=!0,cg(this),this.mayDragIn()&&(this.Wb("Drop"),Eg(this,b.cc.Ni(),!0),jg(this,this.oc,!1),null!==this.oc&&a.CE(this.oc.Ni()),this.zf="ExternalCopy",Bg(this,a.N.da),a.pc(),this.oc=null,a.focus(),a.za("ExternalObjectsDropped",a.selection),this.Uj()))}}; -function Eg(a,b,c){if(null===a.oc){var d=a.g;if(null!==d&&!d.nb&&!d.uf){d.cb=!c;d.Vm=!c;a.Tj=d.N.da;d=d.to(b,d,!0);c=u.Sf();hg(b,c);var e=c.x+c.width/2,f=c.y+c.height/2;u.ic(c);var h=a.gv;c=new la(G);var k=u.K();for(b=b.i;b.next();){var l=b.value;if(l.Fd()&&l.canCopy()){var m=l.location,l=d.ta(l);k.m(h.x-(e-m.x),h.y-(f-m.y));l.location=k;l.pf();c.add(l,If(k))}}u.v(k);for(d=d.i;d.next();)e=d.value,e instanceof W&&e.canCopy()&&c.add(e,If());a.oc=c;Cf(a,c.Ni());null!==a.Sc&&(c=a.Sc,d=c.Mm,c.ll(a.Tj.x- -(d.x+d.width/2),a.Tj.y-(d.y+d.height/2)))}}}uf.prototype.doSimulatedDragOut=function(){var a=this.g;null!==a&&(this.mayCopy()||this.mayMove()?a.ac="":a.ac="no-drop")};function Jf(a){this.point=a;this.IE=K.Wj}u.fa("DraggingInfo",Jf);function kg(a,b,c){this.Cc=a;this.info=b;this.LG=c} -function Fg(){0=d&&(d=.1);for(var e=this,f=b.ym(c,d,function(b){return e.findValidLinkablePort(b,a)},null,!0),d=Infinity,b=null,f=f.i;f.next();){var h=f.value,k=h.T;if(k instanceof U){var l=h.lb(Ib,u.K()),m=c.x-l.x,n=c.y-l.y;u.v(l);l=m*m+n*n;lc){if(null!==this.qc&&a===this.bh&&b===this.dh)return!0;var d=b.Jd;null===d&&(d="");if(a.Wv(d).count>=c)return!1}return!0}; -Fg.prototype.isValidTo=function(a,b){if(null===a||null===b)return this.Io;if(this.g.Va===this&&(null!==a.layer&&!a.layer.gs||!0!==b.OE))return!1;var c=b.yI;if(Infinity>c){if(null!==this.qc&&a===this.eh&&b===this.fh)return!0;var d=b.Jd;null===d&&(d="");if(a.og(d).count>=c)return!1}return!0};Fg.prototype.isInSameNode=function(a,b){if(null===a||null===b)return!1;if(a===b)return!0;var c=a.T,d=b.T;return null!==c&&c===d}; -Fg.prototype.isLinked=function(a,b){if(null===a||null===b)return!1;var c=a.T;if(!(c instanceof U))return!1;var d=a.Jd;null===d&&(d="");var e=b.T;if(!(e instanceof U))return!1;var f=b.Jd;null===f&&(f="");for(e=e.og(f);e.next();)if(f=e.value,f.W===c&&f.pg===d)return!0;return!1}; -Fg.prototype.isValidLink=function(a,b,c,d){if(!this.isValidFrom(a,b)||!this.isValidTo(c,d)||!(null===b||null===d||(b.CG&&d.xI||!this.isInSameNode(b,d))&&(b.BG&&d.wI||!this.isLinked(b,d)))||null!==this.qc&&(null!==a&&this.isLabelDependentOnLink(a,this.qc)||null!==c&&this.isLabelDependentOnLink(c,this.qc))||null!==a&&null!==c&&(null===a.data&&null!==c.data||null!==a.data&&null===c.data)||!this.isValidCycle(a,c,this.qc))return!1;if(null!==a){var e=a.pw;if(null!==e&&!e(a,b,c,d,this.qc))return!1}if(null!== -c&&(e=c.pw,null!==e&&!e(a,b,c,d,this.qc)))return!1;e=this.pw;return null!==e?e(a,b,c,d,this.qc):!0};Fg.prototype.isLabelDependentOnLink=function(a,b){if(null===a)return!1;var c=a.ce;if(null===c)return!1;if(c===b)return!0;var d=new F(U);d.add(a);return Gg(this,c,b,d)};function Gg(a,b,c,d){if(b===c)return!0;var e=b.W;if(null!==e&&e.tf&&(d.add(e),Gg(a,e.ce,c,d)))return!0;b=b.ca;return null!==b&&b.tf&&(d.add(b),Gg(a,b.ce,c,d))?!0:!1} -Fg.prototype.isValidCycle=function(a,b,c){void 0===c&&(c=null);if(null===a||null===b)return this.Io;var d=this.g.DI;if(d!==Hg){if(d===Ig){if(null!==c&&!c.Bc)return!0;for(d=b.oe;d.next();){var e=d.value;if(e!==c&&e.Bc&&e.ca===b)return!1}return!Jg(this,a,b,c,!0)}if(d===Kg){if(null!==c&&!c.Bc)return!0;for(d=a.oe;d.next();)if(e=d.value,e!==c&&e.Bc&&e.W===a)return!1;return!Jg(this,a,b,c,!0)}if(d===Lg)return a===b?a=!0:(d=new F(U),d.add(b),a=Ug(this,d,a,b,c)),!a;if(d===Vg)return!Jg(this,a,b,c,!1);if(d=== -Wg)return a===b?a=!0:(d=new F(U),d.add(b),a=Xg(this,d,a,b,c)),!a}return!0};function Jg(a,b,c,d,e){if(b===c)return!0;if(null===b||null===c)return!1;for(var f=b.oe;f.next();){var h=f.value;if(h!==d&&(!e||h.Bc)&&h.ca===b&&(h=h.W,h!==b&&Jg(a,h,c,d,e)))return!0}return!1}function Ug(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.oe;f.next();){var h=f.value;if(h!==e&&h.ca===c&&(h=h.W,h!==c&&Ug(a,b,h,d,e)))return!0}return!1} -function Xg(a,b,c,d,e){if(c===d)return!0;if(null===c||null===d||b.contains(c))return!1;b.add(c);for(var f=c.oe;f.next();){var h=f.value;if(h!==e){var k=h.W,h=h.ca,k=k===c?h:k;if(k!==c&&Xg(a,b,k,d,e))return!0}}return!1}u.defineProperty(Fg,{pw:"linkValidation"},function(){return this.xk},function(a){null!==a&&u.j(a,"function",Fg,"linkValidation");this.xk=a});u.defineProperty(Fg,{ww:"portTargeted"},function(){return this.YB},function(a){null!==a&&u.j(a,"function",Fg,"portTargeted");this.YB=a}); -function ta(){0b.Bs+1&&c=a.x)c=0>=a.y?c+225:1<=a.y?c+135:c+180;else if(1<=a.x)0>=a.y?c+=315:1<=a.y&&(c+=45);else if(0>=a.y)c+=270;else if(1<=a.y)c+=90;else break a;0>c?c+=360:360<=c&&(c-=360);b.cursor=22.5>c?"e-resize":67.5>c?"se-resize":112.5>c?"s-resize":157.5>c?"sw-resize":202.5>c?"w-resize":247.5>c?"nw-resize":292.5>c?"n-resize":337.5>c?"ne-resize":"e-resize"}else if(b instanceof A)for(b=b.elements;b.next();)nh(a, -b.value,c)}u.defineProperty(mh,{Hs:"handleArchetype"},function(){return this.pk},function(a){null!==a&&u.C(a,S,mh,"handleArchetype");this.pk=a});u.u(mh,{handle:"handle"},function(){return this.Yb});u.defineProperty(mh,{vc:"adornedObject"},function(){return this.Gb},function(a){null!==a&&u.C(a,S,mh,"adornedObject");this.Gb=a});mh.prototype.canStart=function(){if(!this.isEnabled)return!1;var a=this.g;return null!==a&&!a.nb&&a.hs&&a.N.left?null!==this.findToolHandleAt(a.wc.da,this.name)?!0:!1:!1}; -mh.prototype.doActivate=function(){var a=this.g;null!==a&&(this.Yb=this.findToolHandleAt(a.wc.da,this.name),null!==this.Yb&&(this.Gb=this.Yb.T.vc,this.ly.set(this.Gb.T.location),this.Tu.set(this.Gb.xa),this.Hx=this.computeCellSize(),this.Jx=this.computeMinSize(),this.Ix=this.computeMaxSize(),a.Ge=!0,this.KB=a.Lb.isEnabled,a.Lb.isEnabled=!1,this.Wb(this.name),this.na=!0))};mh.prototype.doDeactivate=function(){var a=this.g;null!==a&&(this.Uj(),this.Gb=this.Yb=null,this.na=a.Ge=!1,a.Lb.isEnabled=this.KB)}; -mh.prototype.doCancel=function(){this.Gb.xa=this.Tu;this.Gb.T.location=this.ly;this.stopTool()};mh.prototype.doMouseMove=function(){var a=this.g;if(this.na&&null!==a){var b=this.Jx,c=this.Ix,d=this.Hx,e=this.Gb.zD(a.N.da,u.K()),f=qh;this.Gb instanceof X&&(f=rh(this.Gb));b=this.computeResize(e,this.Yb.alignment,b,c,d,!(f===sh||f===th||a.N.shift));this.resize(b);a.bf();u.v(e)}}; -mh.prototype.doMouseUp=function(){var a=this.g;if(this.na&&null!==a){var b=this.Jx,c=this.Ix,d=this.Hx,e=this.Gb.zD(a.N.da,u.K()),f=qh;this.Gb instanceof X&&(f=rh(this.Gb));b=this.computeResize(e,this.Yb.alignment,b,c,d,!(f===sh||f===th||a.N.shift));this.resize(b);u.v(e);a.pc();this.zf=this.name;a.za("PartResized",this.Gb,this.Tu)}this.stopTool()}; -mh.prototype.resize=function(a){if(null!==this.g){var b=this.vc,c=b.T,d=b.Zk(),e=b.Hi(),f=Math.PI*d/180,h=Math.cos(f),f=Math.sin(f),k=0d?1:0,l=90d?1:0,d=180d?1:0,m=b.Ha.width,n=b.Ha.height;b.xa=a.size;var p=c.position.copy();c.pf();m=b.Ha.width-m;n=b.Ha.height-n;if(0!==m||0!==n)0!==m&&(p.x+=e*((a.x+m*l)*h-(a.y+n*k)*f)),0!==n&&(p.y+=e*((a.x+m*d)*f+(a.y+n*l)*h)),c.move(p)}}; -mh.prototype.computeResize=function(a,b,c,d,e,f){b.ne()&&(b=Ib);var h=this.vc.Ha,k=h.x,l=h.y,m=h.x+h.width,n=h.y+h.height,p=1;if(!f){var p=h.width,q=h.height;0>=p&&(p=1);0>=q&&(q=1);p=q/p}q=u.K();K.xs(a.x,a.y,k,l,e.width,e.height,q);a=h.copy();0>=b.x?0>=b.y?(a.x=Math.max(q.x,m-d.width),a.x=Math.min(a.x,m-c.width),a.width=Math.max(m-a.x,c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p=b.y?(a.width=Math.max(Math.min(q.x-k,d.width),c.width),a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n- -c.height),a.height=Math.max(n-a.y,c.height),f||(b=a.height/a.width,p=b.y?(a.y=Math.max(q.y,n-d.height),a.y=Math.min(a.y,n-c.height),a.height=n-a.y,f||(a.width=a.height/ -p,a.x=k+.5*(m-k-a.width))):1<=b.y&&(a.height=Math.max(Math.min(q.y-l,d.height),c.height),f||(a.width=a.height/p,a.x=k+.5*(m-k-a.width)));u.v(q);return a};mh.prototype.computeMinSize=function(){var a=this.vc.vg.copy(),b=this.vg;!isNaN(b.width)&&b.width>a.width&&(a.width=b.width);!isNaN(b.height)&&b.height>a.height&&(a.height=b.height);return a}; -mh.prototype.computeMaxSize=function(){var a=this.vc.af.copy(),b=this.af;!isNaN(b.width)&&b.widtha&&(a+=360));var b=Math.min(Math.abs(this.mI),180),c=Math.min(Math.abs(this.lI),b/2);!this.g.N.shift&&0b-c&&(a=(Math.floor(a/b)+1)*b));360<=a?a-=360:0>a&&(a+=360);return a};u.defineProperty(uh,{mI:"snapAngleMultiple"},function(){return this.gC},function(a){u.j(a,"number",uh,"snapAngleMultiple");this.gC=a}); -u.defineProperty(uh,{lI:"snapAngleEpsilon"},function(){return this.fC},function(a){u.j(a,"number",uh,"snapAngleEpsilon");this.fC=a});u.u(uh,{eK:"originalAngle"},function(){return this.Su});function wh(){0e.right&&(c.x-=d.width+5);c.xe.bottom&&(c.y-=d.height+5);c.ye.right&&(c.x-=d.width+5);c.xe.bottom?c.y-(d.height+5):c.y+20;c.ya?c/2*a*a+b:-c/2*(--a*(a-2)-1)+b} -Te.prototype.prepareAnimation=Te.prototype.ml=function(){this.Ne&&(this.dj&&this.Mi(),this.ld=!0,this.CA=!1)};function fi(a){a.Ne&&requestAnimationFrame(function(){!1===a.ld||a.dj||(a.Y.im=1,gi(a.Y),a.ld=!1,a.Y.za("AnimationStarting"),hi(a))})}function ii(a,b,c,d,e){if(a.ld&&(!(b instanceof G)||b.JD)){var f=a.Sn;if(f.contains(b)){b=f.ta(b);a=b.start;var h=b.end;void 0===a[c]&&(a[c]=ji(d));h[c]=ji(e)}else a=new pa,h=new pa,a[c]=ji(d),h[c]=ji(e),f.add(b,new ei(a,h))}} -function ji(a){return a instanceof w?a.copy():a instanceof ia?a.copy():a} -function hi(a){var b;void 0===b&&(b=new pa);var c=a.Y;if(null!==c)if(0===a.Sn.count)a.dj=!1,ki(c,!1),c.bf();else{a.dj=!0;var d=b.wJ||a.pF,e=b.cK||null,f=b.dK||null,h=b.duration||a.Ex;b=a.yF;for(var k=a.Sn.i;k.next();){var l=k.value.start.position;l instanceof w&&(l.J()||l.assign(b))}a.PA=d;a.Zt=e;a.$t=f;a.tx=h;var m=a.oF=a.Sn;li(a);mi(a,c,m,d,0,h,null!==a.Gl&&null!==a.Fl);Dg(a.Y);ni(a);requestAnimationFrame(function(b){var e=b||+new Date,f=e+h;(function s(b){if(!1!==a.dj){b=b||+new Date;var k=b>f? -h:b-e;li(a);mi(a,c,m,d,k,h,null!==a.Gl&&null!==a.Fl);a.Zt&&a.Zt();Dg(c);ni(a);b>f?oi(a):requestAnimationFrame(s)}})(e)})}}var pi={opacity:function(a,b,c,d,e,f){a.opacity=d(e,b,c-b,f)},position:function(a,b,c,d,e,f){e!==f?a.GE(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f)):a.position=new w(d(e,b.x,c.x-b.x,f),d(e,b.y,c.y-b.y,f))},scale:function(a,b,c,d,e,f){a.scale=d(e,b,c-b,f)},visible:function(a,b,c,d,e,f){a.visible=e!==f?b:c}}; -function li(a){if(!a.Fn){var b=a.Y;a.BC=b.cb;a.DA=b.Iw;a.EA=b.tt;b.cb=!0;b.Iw=!0;b.tt=!0;a.Fn=!0}}function ni(a){var b=a.Y;b.cb=a.BC;b.Iw=a.DA;b.tt=a.EA;a.Fn=!1}function mi(a,b,c,d,e,f,h){for(c=c.i;c.next();){var k=c.key,l=c.value,m=l.start,l=l.end,n;for(n in l)if(void 0!==pi[n])pi[n](k,m[n],l[n],d,e,f)}h&&(h=a.Gl,a=a.Fl,n=a.y-h.y,a=d(e,h.x,a.x-h.x,f),d=d(e,h.y,n,f),e=b.qz,b.qz=!0,b.position=new w(a,d),b.qz=e)} -Te.prototype.stopAnimation=Te.prototype.Mi=function(){!0===this.ld&&(this.ld=!1,this.CA&&this.Y.de());this.dj&&this.Ne&&(li(this),mi(this,this.Y,this.oF,this.PA,this.tx,this.tx,null!==this.Gl&&null!==this.Fl),ni(this),oi(this))};function oi(a){a.dj=!1;a.Gl=null;a.Fl=null;a.Sn=new la(S,ei);li(a);for(var b=a.Y.links;b.next();){var c=b.value;null!==c.Xn&&(c.points=c.Xn,c.Xn=null)}b=a.Y;ki(b,!1);b.pc();b.bf();qi(b);ni(a);a.$t&&a.$t();a.$t=null;a.Zt=null;b.za("AnimationFinished");b.de()} -function ri(a,b,c){var d=b.ba,e=c.ba,f=null;c instanceof V&&(f=c.placeholder);null!==f?(c=f.lb(xb),c.x+=f.padding.left,c.y+=f.padding.top,ii(a,b,"position",c,b.position)):ii(a,b,"position",new w(e.x+e.width/2-d.width/2,e.y+e.height/2-d.height/2),b.position);ii(a,b,"opacity",.01,b.opacity)}function si(a,b,c){a.ld&&(null===a.Gl&&b.J()&&null===a.Fl&&(a.Gl=b.copy()),a.Fl=c.copy())} -u.defineProperty(Te,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){u.j(a,"boolean",Te,"isEnabled");this.Ne=a});u.defineProperty(Te,{duration:"duration"},function(){return this.Ex},function(a){u.j(a,"number",Te,"duration");1>a&&u.wa(a,">= 1",Te,"duration");this.Ex=a});u.u(Te,{Vg:"isAnimating"},function(){return this.dj});u.u(Te,{HJ:"isTicking"},function(){return this.Fn});function ei(a,b){this.start=a;this.end=b} -function we(){0=a)return b;for(var c=0,d=0,e=0,f=0,h=0,k=this.Db.i;k.next();){var l=k.value;l instanceof V?e++:l instanceof U?d++:l instanceof W?f++:l instanceof lf?h++:c++}k="";0=d.count)a=d.count;else if(d.ja(a)===b)return-1;d.Yd(a,b);b.Js(c);d=this.g;null!==d&&(c?d.ma():d.Eo(b));b instanceof V&&this.Jw(b);return a}; -g.Fe=function(a,b,c){if(!c&&b.layer!==this&&null!==b.layer)return b.layer.Fe(a,b,c);var d=this.Db;if(0>a||a>=d.length){if(a=d.indexOf(b),0>a)return-1}else if(d.ja(a)!==b&&(a=d.indexOf(b),0>a))return-1;b.Ks(c);d.hd(a);d=this.g;null!==d&&(c?d.ma():d.Fe(b));b.Bu=null;return a}; -g.Jw=function(a){for(;null!==a;){if(a.layer===this){var b=a;if(0!==b.Mc.count){for(var c=-1,d=-1,e=this.Db.n,f=e.length,h=0;hd&&k.Ra===b&&(d=h,0<=c))break}!(0>d)&&da||1=a)return b;for(var c=this.Zb.i;c.next();)b+="\n "+c.value.toString(a-1);return b};D.prototype.checkProperties=function(){return u.check(this)};D.fromDiv=function(a){var b=a;"string"===typeof a&&(b=window.document.getElementById(a));return b instanceof HTMLDivElement&&b.Y instanceof D?b.Y:null}; -u.defineProperty(D,{Vk:"div"},function(){return this.Jb},function(a){null!==a&&u.C(a,HTMLDivElement,D,"div");if(this.Jb!==a){Mi=[];var b=this.Jb;null!==b?(b.Y=void 0,b.innerHTML="",null!==this.ib&&(this.ib.removeEventListener("touchstart",this.SE,!1),this.ib.removeEventListener("touchmove",this.RE,!1),this.ib.removeEventListener("touchend",this.QE,!1),this.ib.Dd.Y=null),b=this.tb,null!==b&&(b.cf.each(function(a){a.cancelWaitAfter()}),b.Mf.each(function(a){a.cancelWaitAfter()}),b.Nf.each(function(a){a.cancelWaitAfter()})), -b.cancelWaitAfter(),this.Va.doCancel(),this.Gg=this.ib=null,window.removeEventListener("resize",this.aF,!1),window.removeEventListener("mousemove",this.Qo,!0),window.removeEventListener("mousedown",this.Po,!0),window.removeEventListener("mouseup",this.So,!0),window.removeEventListener("mousewheel",this.Zg,!0),window.removeEventListener("DOMMouseScroll",this.Zg,!0),window.removeEventListener("mouseout",this.Ro,!0)):this.lf=!1;this.Jb=null;if(null!==a){if(b=a.Y)b.Vk=null;Wi(this,a);this.Sz()}}}); -function Zi(a){var b=a.ib;b.addEventListener("touchstart",a.SE,!1);b.addEventListener("touchmove",a.RE,!1);b.addEventListener("touchend",a.QE,!1);b.addEventListener("mousemove",a.Qo,!1);b.addEventListener("mousedown",a.Po,!1);b.addEventListener("mouseup",a.So,!1);b.addEventListener("mousewheel",a.Zg,!1);b.addEventListener("DOMMouseScroll",a.Zg,!1);b.addEventListener("mouseout",a.Ro,!1);b.addEventListener("keydown",a.kH,!1);b.addEventListener("keyup",a.lH,!1);b.addEventListener("selectstart",function(a){a.preventDefault(); -return!1},!1);b.addEventListener("contextmenu",function(a){a.preventDefault();return!1},!1);b.addEventListener("gesturechange",function(b){a.tb.Bo===ai&&b.preventDefault()},!1);b.addEventListener("pointerdown",a.KH,!1);b.addEventListener("pointermove",a.MH,!1);b.addEventListener("pointerleave",a.LH,!1);window.addEventListener("resize",a.aF,!1)}function ki(a,b){a.im=null;b&&a.hE()} -D.prototype.computePixelRatio=function(){if(null!==this.im)return this.im;var a=this.Gg;return(window.devicePixelRatio||1)/(a.webkitBackingStorePixelRatio||a.mozBackingStorePixelRatio||a.msBackingStorePixelRatio||a.oBackingStorePixelRatio||a.backingStorePixelRatio||1)};D.prototype.doMouseMove=function(){this.Va.doMouseMove()};D.prototype.doMouseDown=function(){this.Va.doMouseDown()};D.prototype.doMouseUp=function(){this.Va.doMouseUp()};D.prototype.doMouseWheel=function(){this.Va.doMouseWheel()}; -D.prototype.doKeyDown=function(){this.Va.doKeyDown()};D.prototype.doKeyUp=function(){this.Va.doKeyUp()};function gi(a){if(null!==a.ib){var b=a.Jb;if(0!==b.clientWidth&&0!==b.clientHeight){var c=a.rk?a.zd:0,d=a.qk?a.zd:0,e=a.nf;a.nf=a.computePixelRatio();a.nf!==e&&(a.fq=!0,a.de());if(b.clientWidth!==a.Ab+c||b.clientHeight!==a.zb+d)a.Hl=!0,a.Md=!0,b=a.Qb,null!==b&&b.jw&&b.H(),a.vd||a.de()}}}D.prototype.focus=D.prototype.focus=function(){this.ib&&this.ib.focus()}; -function $i(a,b,c){void 0===b&&(b=a.Gg);void 0===c&&(c=!0);c&&(b.Et="");b.Tm="";b.Sm=""}function Ti(a){var b=new we;b.name="Background";a.cs(b);b=new we;b.name="";a.cs(b);b=new we;b.name="Foreground";a.cs(b);b=new we;b.name="Adornment";b.Ac=!0;a.cs(b);b=new we;b.name="Tool";b.Ac=!0;b.KD=!0;a.cs(b);b=new we;b.name="Grid";b.of=!1;b.Ag=!1;b.Ac=!0;a.LF(b,a.ws("Background"))} -function aj(a){a.ad=new A(bj);a.ad.name="GRID";var b=new X;b.Fb="LineH";b.stroke="lightgray";b.hb=.5;b.interval=1;a.ad.add(b);b=new X;b.Fb="LineH";b.stroke="gray";b.hb=.5;b.interval=5;a.ad.add(b);b=new X;b.Fb="LineH";b.stroke="gray";b.hb=1;b.interval=10;a.ad.add(b);b=new X;b.Fb="LineV";b.stroke="lightgray";b.hb=.5;b.interval=1;a.ad.add(b);b=new X;b.Fb="LineV";b.stroke="gray";b.hb=.5;b.interval=5;a.ad.add(b);b=new X;b.Fb="LineV";b.stroke="gray";b.hb=1;b.interval=10;a.ad.add(b);b=new G;b.add(a.ad); -b.wf="Grid";b.uz=!1;b.JD=!1;b.Ag=!1;b.zz="GRID";a.add(b);a.Db.remove(b);a.ad.visible=!1} -D.prototype.LB=function(){if(this.Y.isEnabled){var a=this.Y;if(a.sy&&null!==a.ib){a.Zu=!0;var b=a.Cd,c=a.ob,d=b.width,e=c.width,f=b.height,h=c.height,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,r=a.scale;if(el&&(a.position= -new w(-(a.uj.scrollWidth-a.Ab)+this.scrollLeft-a.Ab/r+a.Cd.right,a.position.y))),this.cC&&a.Se&&(bn&&(a.position=new w(a.position.x,-(a.vj.scrollHeight-a.zb)+this.scrollTop-a.zb/r+a.Cd.bottom))),u.v(s),cj(a),a.Zu=!1,a.Hl=!1,b=a.Cd,c=a.ob,k=b.right,l=c.right,m=b.bottom,n=c.bottom,p=b.x,q=c.x,b=b.y,c=c.y,e>=d&&p>=q&&k<=l&&(a.ty.style.width="1px"),h>=f&&b>=c&&m<=n&&(a.uy.style.height="1px")}}else dj(this.Y)}; -D.prototype.Ru=function(){this.Y.isEnabled?this.Y.sy=!0:dj(this.Y)};D.prototype.computeBounds=D.prototype.kg=function(){0c&&(e=c),ea.Xg&&(e=a.Xg),e):b===lj?(e=l>k?(h-a.zd)/d:(f-a.zd)/e,e>c&&(e=c),ea.Xg&&(e=a.Xg),e):a.scale}D.prototype.zoomToFit=D.prototype.zoomToFit=function(){this.scale=hj(this,kj)}; -D.prototype.zoomToRect=function(a,b){void 0===b&&(b=kj);var c=a.width,d=a.height;if(!(0===c||0===d||isNaN(c)&&isNaN(d))){var e=1;if(b===kj||b===lj)if(isNaN(c))e=this.ob.height*this.scale/d;else if(isNaN(d))e=this.ob.width*this.scale/c;else var e=this.Ab,f=this.zb,e=b===lj?f/d>e/c?(f-(this.qk?this.zd:0))/d:(e-(this.rk?this.zd:0))/c:Math.min(f/d,e/c);this.scale=e;this.position=new w(a.x,a.y)}};u.defineProperty(D,{qz:null},function(){return this.sc},function(a){this.sc=a}); -D.prototype.alignDocument=function(a,b){this.ei&&jj(this,this.kg());var c=this.Cd,d=this.ob,e=this.sc;this.sc=!0;this.position=new w(c.x+(a.x*c.width+a.offsetX)-(b.x*d.width-b.offsetX),c.y+(a.y*c.height+a.offsetY)-(b.y*d.height-b.offsetY));this.sc=e;this.ma()}; -function ij(a,b,c,d,e,f,h){var k=b.x,l=b.y;if(h||a.yE===Ni)f.pd()&&(d>c.width&&(k=c.x+(f.x*c.width+f.offsetX)-(f.x*d-f.offsetX)),e>c.height&&(l=c.y+(f.y*c.height+f.offsetY)-(f.y*e-f.offsetY))),f=a.xE,h=d-c.width,dc.left?k=c.left:kc.top?l=c.top:lb.touches.length)&&b.preventDefault();b.cancelBubble=!0;return!1} -D.prototype.kH=function(a){if(!this.Y.isEnabled)return!1;var b=this.Y.Ob;nj(this.Y,this.Y,a,b,!1);b.key=String.fromCharCode(a.which);b.Wk=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 48:b.key="0";break;case 187:case 61:case 107:b.key= -"Add";break;case 189:case 173:case 109:b.key="Subtract";break;case 27:b.key="Esc"}this.Y.doKeyDown();return 187!==a.which&&189!==a.which&&48!==a.which&&107!==a.which&&109!==a.which&&61!==a.which&&173!==a.which||!0!==a.ctrlKey?rj(b,a):(a.cancelBubble=!0,a.preventDefault(),a.stopPropagation(),!1)}; -D.prototype.lH=function(a){if(!this.Y.isEnabled)return!1;var b=this.Y.Ob;nj(this.Y,this.Y,a,b,!1);b.key=String.fromCharCode(a.which);b.up=!0;switch(a.which){case 8:b.key="Backspace";break;case 33:b.key="PageUp";break;case 34:b.key="PageDown";break;case 35:b.key="End";break;case 36:b.key="Home";break;case 37:b.key="Left";break;case 38:b.key="Up";break;case 39:b.key="Right";break;case 40:b.key="Down";break;case 45:b.key="Insert";break;case 46:b.key="Del";break;case 93:a.preventDefault()}this.Y.doKeyUp(); -return rj(b,a)};D.prototype.$p=function(a){var b=this.ib;if(null===b)return new w(0,0);var c=this.Ab,d=this.zb,b=b.getBoundingClientRect(),c=a.clientX-c/b.width*b.left;a=a.clientY-d/b.height*b.top;return null!==this.Sd?(a=new w(c,a),Wa(a,this.Sd),a):new w(c,a)};function oj(a,b,c){var d=a.ib,e=a.Ab,f=a.zb,h=0,k=0;null!==d&&(d=d.getBoundingClientRect(),h=b.clientX-e/d.width*d.left,k=b.clientY-f/d.height*d.top);c.ff.m(h,k);null!==a.Sd?(b=u.fc(h,k),a.Sd.Oh(b),c.da.assign(b),u.v(b)):c.da.m(h,k)} -D.prototype.invalidateDocumentBounds=D.prototype.pc=function(){this.ei||(this.ei=!0,this.de(!0))};function qi(a){a.vd||ej(a);a.ei&&jj(a,a.kg());for(a=a.Ul.i;a.next();)qi(a.value)}D.prototype.redraw=D.prototype.Sz=function(){this.sc||this.vd||(this.ma(),sj(this),cj(this),this.pc(),this.bf())};D.prototype.isUpdateRequested=function(){return this.Ef}; -D.prototype.delayInitialization=D.prototype.oG=function(a){void 0===a&&(a=null);var b=this.Lb,c=b.isEnabled;b.Mi();b.isEnabled=!1;Dg(this);this.lf=!1;b.isEnabled=c;null!==a&&u.setTimeout(a,1)};D.prototype.requestUpdate=D.prototype.de=function(a){void 0===a&&(a=!1);if(!0!==this.Ef&&!(this.sc||!1===a&&this.vd)){this.Ef=!0;var b=this;requestAnimationFrame(function(){b.Ef&&b.bf()})}};D.prototype.maybeUpdate=D.prototype.bf=function(){if(!this.un||this.Ef)this.un&&(this.un=!1),Dg(this)}; -function tj(a,b){a.sc||!a.Hl||dj(a)||(b&&ej(a),gj(a,!1))} -function Dg(a){if(!a.vd&&(a.Ef=!1,null!==a.Jb)){a.vd=!0;var b=a.Uh,c=a.VB;if(!b.Fn&&0!==c.length){for(var d=c.n,e=d.length,f=0;fb;b++){var c=a.Xf.i;if(null===c||0===a.Xf.count)break;a.Xf=new F(S);var d=a,e=a.Xf;for(c.reset();c.next();){var f=c.value;!f.Fd()||f instanceof V||!f.Ea()||(f.hl()?(Ph(f,Infinity,Infinity),f.zc()):e.add(f))}for(c.reset();c.next();)f=c.value,f instanceof V&&f.Ea()&&zj(d,f);for(c.reset();c.next();)f=c.value,f instanceof W&&(d=f,d.Ea()&&(d.hl()?(Ph(d,Infinity,Infinity),d.zc(),d.Xs()):e.add(d)));for(c.reset();c.next();)d=c.value,d instanceof -lf&&d.Ea()&&(d.hl()?(Ph(d,Infinity,Infinity),d.zc()):e.add(d))}}function zj(a,b){for(var c=u.eb(),d=u.eb(),e=b.Mc;e.next();){var f=e.value;f.Ea()&&(f instanceof V?(Aj(f)||Bj(f)||Cj(f))&&zj(a,f):f instanceof W?f.W==b||f.ca==b?d.push(f):c.push(f):(Ph(f,Infinity,Infinity),f.zc()))}for(var e=c.length,h=0;hk+1&&(n=Math.max((v- -k)*C+a.Ab,n)),q+1l+1&&(y=Math.max((p-l)*C+a.zb,y)),r+1k+1&&(n=Math.max((v-k)*C+a.Ab,n)),q+1l+1&&(y=Math.max((p-l)*C+a.zb,y)),r+1k+1&&(a.uj.scrollLeft=a.position.x*C));a.lz&&a.Se&&(r+1l+1&&(a.vj.scrollTop=a.position.y*C));h&&(a.fq=!0);m=a.Ab;c=a.zb;a.vj.style.height=c+"px";a.vj.style.width=m+(a.rk?a.zd:0)+"px";a.uj.style.width=m+"px";a.uj.style.height=c+(a.qk?a.zd:0)+"px";a.sy=!1;return d!==m||e!==c||a.Lb.ld?(n=a.ob,a.dt(f,n,h),!1):!0} -D.prototype.add=D.prototype.add=function(a){u.C(a,G,D,"add:part");var b=a.g;if(b!==this){null!==b&&u.k("Cannot add part "+a.toString()+" to "+this.toString()+". It is already a part of "+b.toString());this.Vm&&(a.wk="Tool");var c=a.wf,b=this.ws(c);null===b&&(b=this.ws(""));null===b&&u.k('Cannot add a Part when unable find a Layer named "'+c+'" and there is no default Layer');a.layer!==b&&(c=b.Eo(99999999,a,a.g===this),0<=c&&this.Dc(be,"parts",b,null,a,null,c),b.Ac||this.pc(),a.H(Jj),c=a.Rs,null!== -c&&c(a,null,b))}}; -D.prototype.Eo=function(a){if(a instanceof U){if(this.Rn.add(a),a instanceof V){var b=a.Ra;null===b?this.Ik.add(a):b.Pn.add(a);b=a.Qb;null!==b&&(b.g=this)}}else a instanceof W?this.Nn.add(a):a instanceof lf||this.Db.add(a);var c=this;Kj(a,function(a){Lj(c,a)});a.Pb&&a.R();b=a.data;null!==b&&(a instanceof lf||(a instanceof W?this.lk.add(b,a):this.$h.add(b,a)),Kj(a,function(a){Mj(c,a)}));!0!==Bj(a)&&!0!==Cj(a)||this.Xf.add(a);Nj(a,!0,this);Oj(a)?(a.ba.J()&&this.ma(yi(a,a.ba)),this.pc()):a.Ea()&&a.ba.J()&& -this.ma(yi(a,a.ba));this.de()}; -D.prototype.Fe=function(a){a.ls();if(a instanceof U){if(this.Rn.remove(a),a instanceof V){var b=a.Ra;null===b?this.Ik.remove(a):b.Pn.remove(a);b=a.Qb;null!==b&&(b.g=null)}}else a instanceof W?this.Nn.remove(a):a instanceof lf||this.Db.remove(a);var c=this;Kj(a,function(a){Pj(c,a)});b=a.data;null!==b&&(a instanceof lf||(a instanceof W?this.lk.remove(b):this.$h.remove(b)),Kj(a,function(a){Qj(c,a)}));this.Xf.remove(a);Oj(a)?(a.ba.J()&&this.ma(yi(a,a.ba)),this.pc()):a.Ea()&&a.ba.J()&&this.ma(yi(a,a.ba)); -this.de()};D.prototype.remove=D.prototype.remove=function(a){u.C(a,G,D,"remove:part");a.Za=!1;a.Wg=!1;var b=a.layer;if(null!==b&&b.g===this){a.H(Rj);a.xm();var c=b.Fe(-1,a,!1);0<=c&&this.Dc(ce,"parts",b,a,null,c,null);c=a.Rs;null!==c&&c(a,b,null)}};D.prototype.removeParts=D.prototype.Wz=function(a,b){if(u.isArray(a))for(var c=u.qb(a),d=0;dd&&this.pc()}; -D.prototype.addLayerAfter=function(a,b){Sj(this,a,b);a.Ec(this);var c=this.Zb,d=c.indexOf(a);0<=d&&(c.remove(a),null!==this.Od&&this.Dc(ce,"layers",this,a,null,d,null));for(var e=c.count,f=0;fd&&this.pc()}; -D.prototype.removeLayer=function(a){u.C(a,we,D,"removeLayer:layer");a.g!==this&&u.k("Cannot remove a Layer from another Diagram: "+a+" of "+a.g);if(""!==a.name){var b=this.Zb,c=b.indexOf(a);if(b.remove(a)){for(b=a.Db.copy().i;b.next();){var d=b.value,e=d.wf;d.wf=e!==a.name?e:""}null!==this.Od&&this.Dc(ce,"layers",this,a,null,c,null);this.ma();this.pc()}}};D.prototype.findLayer=D.prototype.ws=function(a){for(var b=this.mw;b.next();){var c=b.value;if(c.name===a)return c}return null}; -D.prototype.addChangedListener=D.prototype.Jy=function(a){u.j(a,"function",D,"addChangedListener:listener");null===this.Ui&&(this.Ui=new E("function"));this.Ui.add(a)};D.prototype.removeChangedListener=D.prototype.Tz=function(a){u.j(a,"function",D,"removeChangedListener:listener");null!==this.Ui&&(this.Ui.remove(a),0===this.Ui.count&&(this.Ui=null))}; -D.prototype.Jv=function(a){this.cb||this.ha.ED(a);a.Ad!==ae&&(this.Qh=!0);if(null!==this.Ui){var b=this.Ui,c=b.length;if(1===c)b=b.ja(0),b(a);else if(0!==c)for(var d=b.Ke(),e=0;ea.Xg&&(c=a.Xg);a.position=new w(a.Ma.x+h.x/b-h.x/c,a.Ma.y+h.y/b- -h.y/c);a.sc=!1;a.$b=c;a.dt(d,a.ob);gj(a,!1);a.ma();sj(a)}}D.prototype.dt=function(a,b,c){void 0===c&&(c=!1);c||sj(this);cj(this);var d=this.Qb;null===d||!d.jw||c||a.width===b.width&&a.height===b.height||d.H();d=this.Va;!0===this.Jl&&d instanceof jf&&(this.N.da=this.XE(this.N.ff),d.doMouseMove());this.nz(a,b);vj(this);this.za("ViewportBoundsChanged",c?u.mh:null,a)}; -function vj(a,b){void 0===b&&(b=null);var c=a.ad;if(null!==c&&c.visible){for(var d=u.ul(),e=1,f=1,h=c.ya.n,k=h.length,l=0;ln||(hk(m.Fb)?f=f*n/K.xD(f,n):e=e*n/K.xD(e,n))}h=c.aw;d.m(f*h.width,e*h.height);h=f=l=k=0;if(null!==b)k=b.width,l=b.height,f=b.x,h=b.y;else{e=u.Sf();f=a.ob;e.m(f.x,f.y,f.width,f.height);for(h=a.Ul.i;h.next();)f=h.value.ob,f.J()&&kb(e,f.x,f.y,f.width,f.height);k=e.width;l=e.height;f=e.x;h=e.y;if(!e.J())return}c.width=k+2*d.width;c.height=l+2*d.height; -e=u.K();K.xs(f,h,0,0,d.width,d.height,e);e.offset(-d.width,-d.height);u.Oj(d);c.T.location=e;u.v(e)}}D.prototype.clearSelection=D.prototype.Lv=function(){var a=0a&&u.wa(a,">= zero",D,"linkSpacing"),this.gj=a,this.h("linkSpacing",b,a))});u.u(D,{mw:"layers"},function(){return this.Zb.i}); -u.defineProperty(D,{uf:"isModelReadOnly"},function(){var a=this.Od;return null===a?!1:a.nb},function(a){var b=this.Od;null!==b&&(b.nb=a)});u.defineProperty(D,{nb:"isReadOnly"},function(){return this.vk},function(a){var b=this.vk;b!==a&&(u.j(a,"boolean",D,"isReadOnly"),this.vk=a,this.h("isReadOnly",b,a))});u.defineProperty(D,{isEnabled:"isEnabled"},function(){return this.Ne},function(a){var b=this.Ne;b!==a&&(u.j(a,"boolean",D,"isEnabled"),this.Ne=a,this.h("isEnabled",b,a))}); -u.defineProperty(D,{My:"allowClipboard"},function(){return this.Gt},function(a){var b=this.Gt;b!==a&&(u.j(a,"boolean",D,"allowClipboard"),this.Gt=a,this.h("allowClipboard",b,a))});u.defineProperty(D,{Ij:"allowCopy"},function(){return this.Xj},function(a){var b=this.Xj;b!==a&&(u.j(a,"boolean",D,"allowCopy"),this.Xj=a,this.h("allowCopy",b,a))}); -u.defineProperty(D,{lm:"allowDelete"},function(){return this.Yj},function(a){var b=this.Yj;b!==a&&(u.j(a,"boolean",D,"allowDelete"),this.Yj=a,this.h("allowDelete",b,a))});u.defineProperty(D,{Av:"allowDragOut"},function(){return this.Ht},function(a){var b=this.Ht;b!==a&&(u.j(a,"boolean",D,"allowDragOut"),this.Ht=a,this.h("allowDragOut",b,a))}); -u.defineProperty(D,{MC:"allowDrop"},function(){return this.It},function(a){var b=this.It;b!==a&&(u.j(a,"boolean",D,"allowDrop"),this.It=a,this.h("allowDrop",b,a))});u.defineProperty(D,{Ev:"allowTextEdit"},function(){return this.gk},function(a){var b=this.gk;b!==a&&(u.j(a,"boolean",D,"allowTextEdit"),this.gk=a,this.h("allowTextEdit",b,a))}); -u.defineProperty(D,{Bv:"allowGroup"},function(){return this.Zj},function(a){var b=this.Zj;b!==a&&(u.j(a,"boolean",D,"allowGroup"),this.Zj=a,this.h("allowGroup",b,a))});u.defineProperty(D,{Fv:"allowUngroup"},function(){return this.hk},function(a){var b=this.hk;b!==a&&(u.j(a,"boolean",D,"allowUngroup"),this.hk=a,this.h("allowUngroup",b,a))}); -u.defineProperty(D,{lo:"allowInsert"},function(){return this.Kt},function(a){var b=this.Kt;b!==a&&(u.j(a,"boolean",D,"allowInsert"),this.Kt=a,this.h("allowInsert",b,a))});u.defineProperty(D,{gs:"allowLink"},function(){return this.$j},function(a){var b=this.$j;b!==a&&(u.j(a,"boolean",D,"allowLink"),this.$j=a,this.h("allowLink",b,a))}); -u.defineProperty(D,{mm:"allowRelink"},function(){return this.bk},function(a){var b=this.bk;b!==a&&(u.j(a,"boolean",D,"allowRelink"),this.bk=a,this.h("allowRelink",b,a))});u.defineProperty(D,{Nk:"allowMove"},function(){return this.ak},function(a){var b=this.ak;b!==a&&(u.j(a,"boolean",D,"allowMove"),this.ak=a,this.h("allowMove",b,a))}); -u.defineProperty(D,{Cv:"allowReshape"},function(){return this.ck},function(a){var b=this.ck;b!==a&&(u.j(a,"boolean",D,"allowReshape"),this.ck=a,this.h("allowReshape",b,a))});u.defineProperty(D,{hs:"allowResize"},function(){return this.dk},function(a){var b=this.dk;b!==a&&(u.j(a,"boolean",D,"allowResize"),this.dk=a,this.h("allowResize",b,a))}); -u.defineProperty(D,{Dv:"allowRotate"},function(){return this.ek},function(a){var b=this.ek;b!==a&&(u.j(a,"boolean",D,"allowRotate"),this.ek=a,this.h("allowRotate",b,a))});u.defineProperty(D,{of:"allowSelect"},function(){return this.fk},function(a){var b=this.fk;b!==a&&(u.j(a,"boolean",D,"allowSelect"),this.fk=a,this.h("allowSelect",b,a))}); -u.defineProperty(D,{NC:"allowUndo"},function(){return this.Lt},function(a){var b=this.Lt;b!==a&&(u.j(a,"boolean",D,"allowUndo"),this.Lt=a,this.h("allowUndo",b,a))});u.defineProperty(D,{Gv:"allowZoom"},function(){return this.Nt},function(a){var b=this.Nt;b!==a&&(u.j(a,"boolean",D,"allowZoom"),this.Nt=a,this.h("allowZoom",b,a))}); -u.defineProperty(D,{lz:"hasVerticalScrollbar"},function(){return this.qu},function(a){var b=this.qu;b!==a&&(u.j(a,"boolean",D,"hasVerticalScrollbar"),this.qu=a,sj(this),this.ma(),this.h("hasVerticalScrollbar",b,a),gj(this,!1))});u.defineProperty(D,{kz:"hasHorizontalScrollbar"},function(){return this.pu},function(a){var b=this.pu;b!==a&&(u.j(a,"boolean",D,"hasHorizontalScrollbar"),this.pu=a,sj(this),this.ma(),this.h("hasHorizontalScrollbar",b,a),gj(this,!1))}); -u.defineProperty(D,{Re:"allowHorizontalScroll"},function(){return this.Jt},function(a){var b=this.Jt;b!==a&&(u.j(a,"boolean",D,"allowHorizontalScroll"),this.Jt=a,this.h("allowHorizontalScroll",b,a),gj(this,!1))});u.defineProperty(D,{Se:"allowVerticalScroll"},function(){return this.Mt},function(a){var b=this.Mt;b!==a&&(u.j(a,"boolean",D,"allowVerticalScroll"),this.Mt=a,this.h("allowVerticalScroll",b,a),gj(this,!1))}); -u.defineProperty(D,{lt:"scrollHorizontalLineChange"},function(){return this.$u},function(a){var b=this.$u;b!==a&&(u.j(a,"number",D,"scrollHorizontalLineChange"),0>a&&u.wa(a,">= 0",D,"scrollHorizontalLineChange"),this.$u=a,this.h("scrollHorizontalLineChange",b,a))}); -u.defineProperty(D,{mt:"scrollVerticalLineChange"},function(){return this.av},function(a){var b=this.av;b!==a&&(u.j(a,"number",D,"scrollVerticalLineChange"),0>a&&u.wa(a,">= 0",D,"scrollVerticalLineChange"),this.av=a,this.h("scrollVerticalLineChange",b,a))});u.defineProperty(D,{N:"lastInput"},function(){return this.Ob},function(a){this.Ob=a});u.defineProperty(D,{wc:"firstInput"},function(){return this.nk},function(a){this.nk=a}); -u.defineProperty(D,{ac:"currentCursor"},function(){return this.sx},function(a){""===a&&(a=this.Pp);this.sx!==a&&(u.j(a,"string",D,"currentCursor"),null!==this.ib&&(this.sx=a,this.ib.style.cursor=a,this.Jb.style.cursor=a))});u.defineProperty(D,{lJ:"defaultCursor"},function(){return this.Pp},function(a){""===a&&(a="auto");var b=this.Pp;b!==a&&(u.j(a,"string",D,"defaultCursor"),this.Pp=a,this.h("defaultCursor",b,a))}); -u.defineProperty(D,{zJ:"hasGestureZoom"},function(){return this.yn},function(a){var b=this.yn;b!==a&&(u.j(a,"boolean",D,"hasGestureZoom"),this.yn=a,this.h("hasGestureZoom",b,a))});u.defineProperty(D,{click:"click"},function(){return this.Wh},function(a){var b=this.Wh;b!==a&&(null!==a&&u.j(a,"function",D,"click"),this.Wh=a,this.h("click",b,a))}); -u.defineProperty(D,{ts:"doubleClick"},function(){return this.ci},function(a){var b=this.ci;b!==a&&(null!==a&&u.j(a,"function",D,"doubleClick"),this.ci=a,this.h("doubleClick",b,a))});u.defineProperty(D,{Uy:"contextClick"},function(){return this.Yh},function(a){var b=this.Yh;b!==a&&(null!==a&&u.j(a,"function",D,"contextClick"),this.Yh=a,this.h("contextClick",b,a))}); -u.defineProperty(D,{Fz:"mouseOver"},function(){return this.mi},function(a){var b=this.mi;b!==a&&(null!==a&&u.j(a,"function",D,"mouseOver"),this.mi=a,this.h("mouseOver",b,a))});u.defineProperty(D,{Ez:"mouseHover"},function(){return this.li},function(a){var b=this.li;b!==a&&(null!==a&&u.j(a,"function",D,"mouseHover"),this.li=a,this.h("mouseHover",b,a))}); -u.defineProperty(D,{Dz:"mouseHold"},function(){return this.ki},function(a){var b=this.ki;b!==a&&(null!==a&&u.j(a,"function",D,"mouseHold"),this.ki=a,this.h("mouseHold",b,a))});u.defineProperty(D,{EH:"mouseDragOver"},function(){return this.Nu},function(a){var b=this.Nu;b!==a&&(null!==a&&u.j(a,"function",D,"mouseDragOver"),this.Nu=a,this.h("mouseDragOver",b,a))}); -u.defineProperty(D,{Cz:"mouseDrop"},function(){return this.ji},function(a){var b=this.ji;b!==a&&(null!==a&&u.j(a,"function",D,"mouseDrop"),this.ji=a,this.h("mouseDrop",b,a))});u.defineProperty(D,{lA:"toolTip"},function(){return this.ti},function(a){var b=this.ti;b!==a&&(null!==a&&u.C(a,lf,D,"toolTip"),this.ti=a,this.h("toolTip",b,a))}); -u.defineProperty(D,{contextMenu:"contextMenu"},function(){return this.Zh},function(a){var b=this.Zh;b!==a&&(null!==a&&u.C(a,lf,D,"contextMenu"),this.Zh=a,this.h("contextMenu",b,a))});u.defineProperty(D,{Eb:"commandHandler"},function(){return this.ix},function(a){var b=this.ix;b!==a&&(u.C(a,sa,D,"commandHandler"),null!==a.g&&u.k("Cannot share CommandHandlers between Diagrams: "+a.toString()),null!==b&&b.Ec(null),this.ix=a,a.Ec(this))}); -u.defineProperty(D,{tb:"toolManager"},function(){return this.Fy},function(a){var b=this.Fy;b!==a&&(u.C(a,jf,D,"toolManager"),null!==a.g&&u.k("Cannot share ToolManagers between Diagrams: "+a.toString()),null!==b&&b.Ec(null),this.Fy=a,a.Ec(this))});u.defineProperty(D,{$y:"defaultTool"},function(){return this.yx},function(a){var b=this.yx;b!==a&&(u.C(a,xe,D,"defaultTool"),this.yx=a,this.Va===b&&(this.Va=a))}); -u.defineProperty(D,{Va:"currentTool"},function(){return this.ux},function(a){var b=this.ux;if(null!==b)for(b.na&&b.doDeactivate(),b.cancelWaitAfter(),b.doStop(),b=this.Ul.i;b.next();)b.value.ma();null===a&&(a=this.$y);null!==a&&(u.C(a,xe,D,"currentTool"),this.ux=a,a.Ec(this),a.doStart())});u.u(D,{selection:"selection"},function(){return this.dv}); -u.defineProperty(D,{wH:"maxSelectionCount"},function(){return this.Iu},function(a){var b=this.Iu;if(b!==a)if(u.j(a,"number",D,"maxSelectionCount"),0<=a&&!isNaN(a)){if(this.Iu=a,this.h("maxSelectionCount",b,a),!this.ha.gb&&(a=this.selection.count-a,0= 0",D,"maxSelectionCount")}); -u.defineProperty(D,{HH:"nodeSelectionAdornmentTemplate"},function(){return this.Pu},function(a){var b=this.Pu;b!==a&&(u.C(a,lf,D,"nodeSelectionAdornmentTemplate"),this.Pu=a,this.h("nodeSelectionAdornmentTemplate",b,a))});u.defineProperty(D,{MG:"groupSelectionAdornmentTemplate"},function(){return this.mu},function(a){var b=this.mu;b!==a&&(u.C(a,lf,D,"groupSelectionAdornmentTemplate"),this.mu=a,this.h("groupSelectionAdornmentTemplate",b,a))}); -u.defineProperty(D,{sH:"linkSelectionAdornmentTemplate"},function(){return this.Du},function(a){var b=this.Du;b!==a&&(u.C(a,lf,D,"linkSelectionAdornmentTemplate"),this.Du=a,this.h("linkSelectionAdornmentTemplate",b,a))});u.u(D,{bw:"highlighteds"},function(){return this.ru}); -u.defineProperty(D,{Qh:"isModified"},function(){var a=this.ha;return a.isEnabled?null!==a.Di?!0:this.Vx&&this.Ig!==a.Ii:this.Vx},function(a){if(this.Vx!==a){u.j(a,"boolean",D,"isModified");this.Vx=a;var b=this.ha;!a&&b.isEnabled&&(this.Ig=b.Ii);a||ik(this)}});function ik(a){var b=a.Qh;a.DC!==b&&(a.DC=b,a.za("Modified"))} -u.defineProperty(D,{ga:"model"},function(){return this.Od},function(a){var b=this.Od;if(b!==a){u.C(a,J,D,"model");this.Va.doCancel();null!==b&&b.ha!==a.ha&&b.ha.ND&&u.k("Do not replace a Diagram.model while a transaction is in progress.");this.Lb.Mi();this.Lv();this.lf=!1;this.un=!0;this.Ig=-2;this.Ef=!1;var c=this.vd;this.vd=!0;this.Lb.ml();null!==b&&(b.Tz(this.GB),b instanceof Q&&jk(this,b.Qj),jk(this,b.ah));this.Od=a;a.Jy(this.FB);kk(this,a.ah);a instanceof Q&&lk(this,a.Qj);a.Tz(this.FB);a.Jy(this.GB); -this.vd=c;this.sc||this.ma();null!==b&&(a.ha.isEnabled=b.ha.isEnabled)}});u.defineProperty(D,{Na:null},function(){return this.yB},function(a){this.yB=a}); -function Qi(a,b){if(b.ga===a.ga){var c=b.Ad,d=b.propertyName;if(c===ae&&"S"===d[0])if("StartingFirstTransaction"===d)c=a.tb,c.cf.each(function(b){b.Ec(a)}),c.Mf.each(function(b){b.Ec(a)}),c.Nf.each(function(b){b.Ec(a)}),a.vd||a.lf||(a.du=!0,a.un&&(a.Ef=!0),a.Uh.ml());else if("StartingUndo"===d||"StartingRedo"===d){var e=a.Lb;e.Vg&&!a.cb&&e.Mi();a.za("ChangingSelection")}else"StartedTransaction"===d&&(e=a.Lb,e.Vg&&!a.cb&&e.Mi(),a.zu&&e.ml());else if(a.Na){a.Na=!1;try{var f=b.Lf;if(""!==f)if(c===$d){if("linkFromKey"=== -f){var h=b.object,k=a.ng(h);if(null!==k){var l=b.newValue,m=a.Xe(l);k.W=m}}else if("linkToKey"===f)h=b.object,k=a.ng(h),null!==k&&(l=b.newValue,m=a.Xe(l),k.ca=m);else if("linkFromPortId"===f){if(h=b.object,k=a.ng(h),null!==k){var n=b.newValue;"string"===typeof n&&(k.pg=n)}}else if("linkToPortId"===f)h=b.object,k=a.ng(h),null!==k&&(n=b.newValue,"string"===typeof n&&(k.lh=n));else if("nodeGroupKey"===f){var h=b.object,p=a.Nh(h);if(null!==p){var q=b.newValue;if(void 0!==q){var r=a.Xe(q);p.Ra=r instanceof -V?r:null}else p.Ra=null}}else if("linkLabelKeys"===f){if(h=b.object,k=a.ng(h),null!==k){var s=b.oldValue,t=b.newValue;if(u.isArray(s))for(var v=u.qb(s),x=0;xl)){var m=l;sk(k)&&m++;k.Fe(m);tk(k,m,l)}}}}function Mj(a,b){var c=b.gi;if(u.isArray(c)){var d=a.Ml.ta(c);if(null===d)d=[],d.push(b),a.Ml.add(c,d);else{for(c=0;c=f.length)return!1;for(var h=0;hthis.scale&&(this.scale=a)):u.wa(a,"> 0",D,"minScale"))}); -u.defineProperty(D,{Xg:"maxScale"},function(){return this.Hu},function(a){u.ze(a,D,"maxScale");var b=this.Hu;b!==a&&(0 0",D,"maxScale"))});u.defineProperty(D,{Rm:"zoomPoint"},function(){return this.wv},function(a){this.wv.L(a)||(u.C(a,w,D,"zoomPoint"),this.wv=a=a.Z())}); -u.defineProperty(D,{Ty:"contentAlignment"},function(){return this.dn},function(a){var b=this.dn;b.L(a)||(u.C(a,L,D,"contentAlignment"),this.dn=a=a.Z(),this.h("contentAlignment",b,a),gj(this,!1))});u.defineProperty(D,{CJ:"initialContentAlignment"},function(){return this.An},function(a){var b=this.An;b.L(a)||(u.C(a,L,D,"initialContentAlignment"),this.An=a=a.Z(),this.h("initialContentAlignment",b,a))}); -u.defineProperty(D,{padding:"padding"},function(){return this.Pe},function(a){"number"===typeof a?a=new rb(a):u.C(a,rb,D,"padding");var b=this.Pe;b.L(a)||(this.Pe=a=a.Z(),this.pc(),this.h("padding",b,a))});u.u(D,{yg:"nodes"},function(){return this.Rn.i});u.u(D,{links:"links"},function(){return this.Nn.i});u.u(D,{Sj:"parts"},function(){return this.Db.i}); -D.prototype.findTopLevelNodesAndLinks=function(){for(var a=new F(G),b=this.Rn.i;b.next();){var c=b.value;c.Ho&&a.add(c)}for(b=this.Nn.i;b.next();)c=b.value,c.Ho&&a.add(c);return a.i};D.prototype.findTopLevelGroups=function(){return this.Ik.i};u.defineProperty(D,{Qb:"layout"},function(){return this.Nd},function(a){var b=this.Nd;b!==a&&(u.C(a,Je,D,"layout"),null!==b&&(b.g=null,b.group=null),this.Nd=a,a.g=this,a.group=null,this.Ot=!0,this.h("layout",b,a),this.de())}); -D.prototype.layoutDiagram=function(a){ej(this);a&&yk(this,!0);xj(this,!1)};function yk(a,b){for(var c=a.Ik.i;c.next();)Gk(a,c.value,b);null!==a.Qb&&(b?a.Qb.vf=!1:a.Qb.H())}function Gk(a,b,c){if(null!==b){for(var d=b.Pn.i;d.next();)Gk(a,d.value,c);null!==b.Qb&&(c?b.Qb.vf=!1:b.Qb.H())}} -function xj(a,b){if(!a.zx){var c=a.Qb,d=a.zu;a.zu=!0;var e=a.Na;a.Na=!0;try{a.Wb("Layout");for(var f=a.Ik.i;f.next();)Hk(a,f.value,b);c.vf||b&&!c.PD||(c.doLayout(a),ej(a),c.vf=!0)}finally{a.Wd("Layout"),a.Ot=!c.vf,a.zu=d,a.Na=e}}}function Hk(a,b,c){if(null!==b){for(var d=b.Pn.i;d.next();)Hk(a,d.value,c);d=b.Qb;null===d||d.vf||c&&!d.PD||(b.jy=!b.location.J(),d.doLayout(b),b.H(Ik),d.vf=!0,zj(a,b))}} -u.defineProperty(D,{qd:"isTreePathToChildren"},function(){return this.yu},function(a){var b=this.yu;if(b!==a&&(u.j(a,"boolean",D,"isTreePathToChildren"),this.yu=a,this.h("isTreePathToChildren",b,a),!this.ha.gb))for(a=this.yg;a.next();)Jk(a.value)});D.prototype.findTreeRoots=function(){for(var a=new E(U),b=this.yg;b.next();){var c=b.value;c.Ho&&null===c.As()&&a.add(c)}return a.i};u.defineProperty(D,{me:null},function(){return this.mB},function(a){this.mB=a}); -function Oi(a){function b(a){var b=a.toLowerCase(),h=new E("function");c.add(a,h);c.add(b,h);d.add(a,a);d.add(b,a)}var c=new la("string",E),d=new la("string","string");b("AnimationStarting");b("AnimationFinished");b("BackgroundSingleClicked");b("BackgroundDoubleClicked");b("BackgroundContextClicked");b("ClipboardChanged");b("ClipboardPasted");b("DocumentBoundsChanged");b("ExternalObjectsDropped");b("InitialLayoutCompleted");b("LayoutCompleted");b("LinkDrawn");b("LinkRelinked");b("LinkReshaped");b("Modified"); -b("ObjectSingleClicked");b("ObjectDoubleClicked");b("ObjectContextClicked");b("PartCreated");b("PartResized");b("PartRotated");b("SelectionMoved");b("SelectionCopied");b("SelectionDeleting");b("SelectionDeleted");b("SelectionGrouped");b("SelectionUngrouped");b("ChangingSelection");b("ChangedSelection");b("SubGraphCollapsed");b("SubGraphExpanded");b("TextEdited");b("TreeCollapsed");b("TreeExpanded");b("ViewportBoundsChanged");a.Bx=c;a.Ax=d} -function ma(a,b){var c=a.Ax.ta(b);return null!==c?c:a.Ax.ta(b.toLowerCase())}function Kk(a,b){var c=a.Bx.ta(b);if(null!==c)return c;c=a.Bx.ta(b.toLowerCase());if(null!==c)return c;u.k("Unknown DiagramEvent name: "+b);return null}D.prototype.addDiagramListener=D.prototype.Ky=function(a,b){u.j(a,"string",D,"addDiagramListener:name");u.j(b,"function",D,"addDiagramListener:listener");var c=Kk(this,a);null!==c&&c.add(b)}; -D.prototype.removeDiagramListener=D.prototype.lE=function(a,b){u.j(a,"string",D,"removeDiagramListener:name");u.j(b,"function",D,"addDiagramListener:listener");var c=Kk(this,a);null!==c&&c.remove(b)};D.prototype.raiseDiagramEvent=D.prototype.za=function(a,b,c){var d=Kk(this,a),e=new Nd;e.g=this;e.name=ma(this,a);void 0!==b&&(e.hA=b);void 0!==c&&(e.Mz=c);a=d.length;if(1===a)d=d.ja(0),d(e);else if(0!==a)for(b=d.Ke(),c=0;c=d.top&&0>=d.left&&0>=d.right&&0>=d.bottom)return c;var e=a.ob,f=a.scale,e=u.Vj(0,0,e.width*f,e.height*f),h=u.fc(0,0);if(b.x>=e.x&&b.xe.x+e.width-d.right&&(k=Math.max(a.lt,1),k|=0,h.x+=k,b.x>e.x+e.width-d.right/2&&(h.x+=k),b.x>e.x+e.width-d.right/4&&(h.x+=4*k));b.y>=e.y&&b.ye.y+e.height-d.bottom&&(k=Math.max(a.mt,1),k|=0,h.y+=k,b.y>e.y+e.height-d.bottom/2&&(h.y+=k),b.y>e.y+e.height-d.bottom/4&&(h.y+=4*k));h.De(K.Wj)||(c=new w(c.x+h.x/f,c.y+h.y/f));u.ic(e);u.v(h);return c}D.prototype.makeSVG=D.prototype.makeSvg=function(a){void 0===a&&(a=new pa);a.context="svg";a=Tk(this,a);return null!==a?a.sl:null}; -D.prototype.makeImage=function(a){void 0===a&&(a=new pa);var b=(a.document||document).createElement("img");b.src=this.tH(a);return b};D.prototype.makeImageData=D.prototype.tH=function(a){void 0===a&&(a=new pa);var b=Tk(this,a);return null!==b?b.toDataURL(a.type,a.details):""};var Uk=!1; -function Tk(a,b){a.Lb.Mi();a.bf();if(null===a.ib)return null;"object"!==typeof b&&u.k("properties argument must be an Object.");var c=!1,d=b.size||null,e=b.scale||null;void 0!==b.scale&&isNaN(b.scale)&&(e="NaN");var f=b.maxSize;void 0===b.maxSize&&(c=!0,f="svg"===b.context?new ia(Infinity,Infinity):new ia(2E3,2E3));var h=b.position||null,k=b.parts||null,l=void 0===b.padding?1:b.padding,m=b.background||null,n=b.omitTemporary;void 0===n&&(n=!0);var p=b.document||document,q=b.elementFinished||null,r= -b.showTemporary;void 0===r&&(r=!n);n=b.showGrid;void 0===n&&(n=r);null!==d&&isNaN(d.width)&&isNaN(d.height)&&(d=null);"number"===typeof l?l=new rb(l):l instanceof rb||(l=new rb(0));l.left=Math.max(l.left,0);l.right=Math.max(l.right,0);l.top=Math.max(l.top,0);l.bottom=Math.max(l.bottom,0);a.qn=!1;$i(a);var s=new oa(null,p),t=s.getContext("2d"),v=s;if(!(d||e||k||h))return s.width=a.Ab+Math.ceil(l.left+l.right),s.height=a.zb+Math.ceil(l.top+l.bottom),"svg"===b.context&&(t=v=new Nc(s.Dd,p,q),t instanceof -Nc&&(a.qn=!0)),Gj(a,t,l,new ia(s.width,s.height),a.$b,a.Ma,k,m,r,n),a.qn=!0,v;var x=a.Eb.Pv,B=new w(0,0),y=a.Cd.copy();y.tI(a.padding);if(r)for(var C=!0,C=a.Zb.n,I=C.length,H=0;Hx?(e=x,h=y.width,Z=y.height):(h=f.width,Z=f.height)):(h=y.width*e,Z=y.height*e):(e=x,h=y.width,Z=y.height);null!==l?(h+=aa,Z+=C):l=new rb(0);null!==f&&(d=f.width,f=f.height,"svg"!==b.context&&c&&!Uk&&(h>d||Z>f)&&(u.trace("Diagram.makeImage(data): Diagram width or height is larger than the default max size. ("+Math.ceil(h)+"x"+Math.ceil(Z)+" vs 2000x2000) Consider increasing the max size."),Uk=!0), -isNaN(d)&&(d=2E3),isNaN(f)&&(f=2E3),isFinite(d)&&(h=Math.min(h,d)),isFinite(f)&&(Z=Math.min(Z,f)));s.width=Math.ceil(h);s.height=Math.ceil(Z);"svg"===b.context&&(t=v=new Nc(s.Dd,p,q),t instanceof Nc&&(a.qn=!0));Gj(a,t,l,new ia(Math.ceil(h),Math.ceil(Z)),e,B,k,m,r,n);a.qn=!0;return v}D.inherit=function(a,b){u.j(a,"function",D,"inherit");u.j(b,"function",D,"inherit");b.AF&&u.k("Cannot inherit from "+u.rg(b));u.Ga(a,b)}; -function Vi(){this.DF="63ad05bbe23a1786468a4c741b6d2";this.DF===this._tk?this.vh=!0:Vk(this,!1)} -function Vk(a,b){var c="p",d=window[u.Da("76a715b2f73f148a")][u.Da("72ba13b5")];if(u.Da("77bb5bb2f32603de")===window[u.Da("76a715b2f73f148a")][u.Da("6aba19a7ec351488")])try{a.vh=!window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b")])([u.Da("7bb8069ae7")]===u.Da(u.adym));if(!1===a.vh)return;a.vh=!window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b6c7a197c31bb4cfd3e")])([u.Da("7bb8069ae7")]===u.Da(u.adym)); -if(!1===a.vh)return}catch(e){}for(var f=d[u.Da("76ad18b4f73e")],h=d[u.Da("73a612b6fb191d")](u.Da("35e7"))+2;h=d&&u.Da(u.adym)!==u.Da("7da71ca0ad381e90")&&(d=c[u.Da("73a612b6fb191d")](u.Da("76a715b2ef3e149757")));a.vh=!(0b.timeStamp-a.Pl)b.preventDefault();else if(a.Jc=a.Ob,a.Ob=c,nj(a,a,b,c,!0),c.Wk=!0,c.Te=b.detail,a.nk=c.copy(),!0===c.Vp.simulated)b.preventDefault(),b.simulated=!0;else if(Ef=null,a.doMouseDown(),1===b.button)return b.preventDefault(),!1}};a.So=function(b){if(a.isEnabled){a.Jl=!0;var c=a.Jc;if(u.Dm){if(400>b.timeStamp-a.Pl){b.preventDefault();return}a.Pl=b.timeStamp}if(u.Dm&&null!==a.Ir)a.Ir=null,b.preventDefault();else{a.Jc=a.Ob;a.Ob=c;nj(a,a,b,c,!0);c.up=!0;c.Te=b.detail;if(u.aH||u.bH)b.timeStamp- -a.Plb.touches.length&&mj(a,c);rj(c,b)}};a.RE=function(b){if(a.isEnabled){var c=a.Jc;a.Jc=a.Ob;a.Ob=c;var d=null;0a.hr&& -mj(a,c),rj(c,b))}};a.MH=function(b){if("touch"===b.pointerType&&!(2>a.hr)){var c=a.Df;c[0].pointerId===b.pointerId&&(c[0]=b);c[1].pointerId===b.pointerId&&(c[1]=b);a.isEnabled&&(c=a.Jc,a.Jc=a.Ob,a.Ob=c,qj(a,b,b,c,!0),yf(a),a.Hw(b,null,c.Cg)||(a.doMouseMove(),rj(c,b)))}};a.LH=function(b){if("touch"===b.pointerType){var c=a.WB;void 0!==c[b.pointerId]&&(a.hr--,delete c[b.pointerId],c=a.Df,null!==c[0]&&c[0].pointerId===b.pointerId&&(c[0]=null),null!==c[1]&&c[1].pointerId===b.pointerId&&(c[1]=null))}}; -$i(a);Zi(a)}function Wk(a){1a)&&u.wa(a,"0 <= loc <= 1",ga,"addColorStop:loc");u.j(b,"string",ga,"addColorStop:color");null===this.Eg&&(this.Eg=new la("number","string"));this.Eg.add(a,b);this.oa===te&&(this.type=ue);this.Fg=null}; -u.defineProperty(ga,{type:"type"},function(){return this.oa},function(a){u.I(this,a);u.rb(a,ga,ga,"type");this.oa=a;this.start.ne()&&(a===ue?this.start=Db:a===ve&&(this.start=Ib));this.end.ne()&&(a===ue?this.end=Ub:a===ve&&(this.end=Ib));this.Fg=null});u.defineProperty(ga,{color:"color"},function(){return this.cn},function(a){u.I(this,a);this.cn=a;this.Fg=null});u.defineProperty(ga,{start:"start"},function(){return this.ao},function(a){u.I(this,a);u.C(a,L,ga,"start");this.ao=a.Z();this.Fg=null}); -u.defineProperty(ga,{end:"end"},function(){return this.sn},function(a){u.I(this,a);u.C(a,L,ga,"end");this.sn=a.Z();this.Fg=null});u.defineProperty(ga,{ut:"startRadius"},function(){return this.hv},function(a){u.I(this,a);u.ze(a,ga,"startRadius");0>a&&u.wa(a,">= zero",ga,"startRadius");this.hv=a;this.Fg=null});u.defineProperty(ga,{us:"endRadius"},function(){return this.iu},function(a){u.I(this,a);u.ze(a,ga,"endRadius");0>a&&u.wa(a,">= zero",ga,"endRadius");this.iu=a;this.Fg=null}); -u.defineProperty(ga,{os:"colorStops"},function(){return this.Eg},function(a){u.I(this,a);this.Eg=a;this.Fg=null});u.defineProperty(ga,{pattern:"pattern"},function(){return this.Wu},function(a){u.I(this,a);this.Wu=a;this.Fg=null}); -ga.randomColor=function(a,b){void 0===a&&(a=128);void 0===b&&(b=Math.max(a,255));var c=Math.abs(b-a),d=Math.floor(a+Math.random()*c).toString(16),e=Math.floor(a+Math.random()*c).toString(16),c=Math.floor(a+Math.random()*c).toString(16);2>d.length&&(d="0"+d);2>e.length&&(e="0"+e);2>c.length&&(c="0"+c);return"#"+d+e+c};var cl=u.createElement("canvas").getContext("2d"),fa; -ga.isValidColor=fa=function(a){if("black"===a)return!0;if(""===a)return!1;cl.fillStyle="#000000";var b=cl.fillStyle;cl.fillStyle=a;if(cl.fillStyle!==b)return!0;cl.fillStyle="#FFFFFF";b=cl.fillStyle;cl.fillStyle=a;return cl.fillStyle!==b}; -function S(){u.gc(this);this.ea=30723;this.Ic=1;this.Pg=null;this.Ub="";this.lc=this.Ib=null;this.Ma=(new w(NaN,NaN)).freeze();this.jf=(new ia(NaN,NaN)).freeze();this.nj=K.op;this.lj=K.jF;this.Sd=new ja;this.Xm=new ja;this.yk=new ja;this.$b=this.fu=1;this.Ym=0;this.Hh=dl;this.Gq=K.np;this.Pc=(new z(NaN,NaN,NaN,NaN)).freeze();this.Xb=(new z(NaN,NaN,NaN,NaN)).freeze();this.Hc=(new z(0,0,NaN,NaN)).freeze();this.Sr=this.Wp=this.Q=this.ir=this.jr=null;this.Tr=this.Xp=Infinity;this.vp=this.se=uc;this.wr= -0;this.tj=1;this.Cp=0;this.Wi=1;this.Ar=-Infinity;this.zr=0;this.Br=K.Wj;this.Cr=dh;this.Jp="";this.Gc=this.P=null;this.$m=-1;this.Wl=this.Xh=this.Bl=this.$n=null}u.Lh(S);u.fa("GraphObject",S); -S.prototype.cloneProtected=function(a){a.ea=this.ea|6144;a.Ic=this.Ic;a.Ub=this.Ub;a.Ib=this.Ib;a.lc=this.lc;a.Ma.assign(this.Ma);a.jf.assign(this.jf);a.nj=this.nj.Z();a.lj=this.lj.Z();a.yk=this.yk.copy();a.$b=this.$b;a.Ym=this.Ym;a.Hh=this.Hh;a.Gq=this.Gq.Z();a.Pc.assign(this.Pc);a.Xb.assign(this.Xb);a.Hc.assign(this.Hc);a.ir=this.ir;a.Q=null!==this.Q?this.Q.copy():null;a.Wp=this.Wp;a.Xp=this.Xp;a.Sr=this.Sr;a.Tr=this.Tr;a.se=this.se.Z();a.vp=this.vp.Z();a.wr=this.wr;a.tj=this.tj;a.Cp=this.Cp;a.Wi= -this.Wi;a.Ar=this.Ar;a.zr=this.zr;a.Br=this.Br.Z();a.Cr=this.Cr;a.Jp=this.Jp;a.P=null!==this.P?this.P.copy():null;a.Gc=this.Gc;a.$m=this.$m;if(null!==this.Bl){a.Bl=u.Pk(this.Bl);for(var b=0;bk;)k+=f[n++%l],p=!p;q=!1}else k=f[n++%l];k>m&&(k=m);var r=Math.sqrt(k*k/(1+e*e));0>d&&(r=-r);b+=r;c+=e*r;p?a.lineTo(b,c):a.moveTo(b,c);m-=k;p=!p}} -S.prototype.raiseChangedEvent=S.prototype.Dc=function(a,b,c,d,e,f,h){var k=this.T;null!==k&&(k.Lm(a,b,c,d,e,f,h),0!==(this.ea&1024)&&c===this&&a===$d&&ll(this,k,b))}; -function ll(a,b,c){var d=a.zo();if(null!==d)for(var e=a.Gc.i;e.next();){var f=e.value,h=null;if(null!==f.Nm){h=ef(f,d,a);if(null===h)continue;f.Mw(a,h,c,null)}else if(f.xt){var k=b.g;null!==k&&f.Mw(a,k.ga.Zs,c,k)}else{var l=d.data;if(null===l)continue;k=b.g;null!==k&&k.Iw||f.Mw(a,l,c,k)}null!==h&&(k=d.Vv(f.tl),null!==k&&f.ZE(k,h,c))}}S.prototype.Vv=function(a){return this.$m===a?this:null};S.prototype.raiseChanged=S.prototype.h=function(a,b,c){this.Dc($d,a,this,b,c)}; -function ml(a,b,c,d,e){var f=a.Pc,h=a.yk;h.reset();nl(a,h,b,c,d,e);a.yk=h;f.x=b;f.y=c;f.width=d;f.height=e;h.Os()||h.WE(f)}function ol(a,b,c,d){if(!1===a.Ag)return!1;d.multiply(a.transform);return c?a.sg(b,d):a.sm(b,d)} -S.prototype.sD=function(a,b,c){if(!1===this.Ag)return!1;var d=this.Ha;b=a.Lj(b);var e=!1;c&&(e=Xa(a.x,a.y,0,0,0,d.height)a&&(a+=360));return a}; -S.prototype.getDocumentScale=S.prototype.Hi=function(){if(0!==(this.ea&4096)===!1)return this.fu;var a=this.$b;return null!==this.S?a*this.S.Hi():a};S.prototype.getLocalPoint=S.prototype.zD=function(a,b){void 0===b&&(b=new w);b.assign(a);this.Ff.Oh(b);return b};S.prototype.getNearestIntersectionPoint=S.prototype.bl=function(a,b,c){return this.Co(a.x,a.y,b.x,b.y,c)};g=S.prototype; -g.Co=function(a,b,c,d,e){var f=this.transform,h=1/(f.m11*f.m22-f.m12*f.m21),k=f.m22*h,l=-f.m12*h,m=-f.m21*h,n=f.m11*h,p=h*(f.m21*f.dy-f.m22*f.dx),q=h*(f.m12*f.dx-f.m11*f.dy);if(null!==this.nm)return f=this.ba,K.bl(f.left,f.top,f.right,f.bottom,a,b,c,d,e);h=a*k+b*m+p;a=a*l+b*n+q;b=c*k+d*m+p;c=c*l+d*n+q;e.m(0,0);d=this.Ha;c=K.bl(0,0,d.width,d.height,h,a,b,c,e);e.transform(f);return c}; -function Ph(a,b,c,d,e){if(!1!==Aj(a)){var f=a.margin,h=f.right+f.left,f=f.top+f.bottom;b=Math.max(b-h,0);c=Math.max(c-f,0);e=e||0;d=Math.max((d||0)-h,0);e=Math.max(e-f,0);var h=a.angle,f=0,f=a.xa,k=0;a.hb&&(k=a.hb);90===h||270===h?(b=isFinite(f.height)?f.height+k:b,c=isFinite(f.width)?f.width+k:c):(b=isFinite(f.width)?f.width+k:b,c=isFinite(f.height)?f.height+k:c);var f=d||0,k=e||0,l=a instanceof A;switch(pl(a,!0)){case qh:k=f=0;l&&(c=b=Infinity);break;case cd:isFinite(b)&&b>d&&(f=b);isFinite(c)&& -c>e&&(k=c);break;case fl:isFinite(b)&&b>d&&(f=b);k=0;l&&(c=Infinity);break;case el:isFinite(c)&&c>e&&(k=c),f=0,l&&(b=Infinity)}var l=a.af,m=a.vg;f>l.width&&m.widthl.height&&m.heighta.height||this.ej.Oe>a.width))&&(c=!0);this.ea=c?this.ea|256:this.ea&-257;this.Xb.J()|| -u.k("Non-real actualBounds has been set. Object "+this+", actualBounds: "+this.Xb.toString());this.sw(f,this.Xb);u.ic(f)};g.xi=function(){}; -function ql(a,b,c,d,e){var f=a.ba;f.x=b;f.y=c;f.width=d;f.height=e;if(!a.xa.J()){f=a.Pc;c=a.margin;b=c.right+c.left;var h=c.top+c.bottom;c=f.width+b;f=f.height+h;d+=b;e+=h;b=pl(a,!0);c===d&&f===e&&(b=qh);switch(b){case qh:if(c>d||f>e)uj(a,!0),Ph(a,c>d?d:c,f>e?e:f);break;case cd:uj(a,!0);Ph(a,d,e,0,0);break;case fl:uj(a,!0);Ph(a,d,f,0,0);break;case el:uj(a,!0),Ph(a,c,e,0,0)}}} -g.sw=function(){rl(this,!1);var a=this.T;null!==a&&null!==a.g&&(a.dl(),this.Qu(a),this.ma(),a=this.T,null!==a&&(a.nt!==this&&a.sE!==this&&a.vE!==this||sl(a,!0)))};g.Qu=function(a){null!==this.Jd&&sl(a,!0)}; -g.We=function(a,b){if(this.visible){var c=this.opacity,d=1;if(1!==c){if(0===c)return;d=a.globalAlpha;a.globalAlpha=d*c}if(a instanceof Nc)a:{if(this.visible){var e=null,f=a.kw;if(this instanceof A&&(this.type===tl||this.type===ul))vl(this,a,b);else{var h=this.Xb;if(0!==h.width&&0!==h.height&&!isNaN(h.x)&&!isNaN(h.y)){var k=this.transform,l=this.S;0!==(this.ea&4096)===!0&&wl(this);var m=0!==(this.ea&256),n=!1;this instanceof qa&&xl(this,a);if(m){n=l.Tf()?l.Ha:l.ba;if(this.Xh)var p=this.Xh,q=p.x,r= -p.y,s=p.width,p=p.height;else q=Math.max(h.x,n.x),r=Math.max(h.y,n.y),s=Math.min(h.right,n.right)-q,p=Math.min(h.bottom,n.bottom)-r;if(q>h.width+h.x||h.x>n.width+n.x||r>h.height+h.y||h.y>n.height+n.y)break a;n=!0;Uc(a,1,0,0,1,0,0);a.save();a.beginPath();a.rect(q,r,s,p);a.clip()}q=!1;if(this instanceof G&&(q=!0,!this.Ea()))break a;r=!1;s=b.Qg;this.T&&s.drawShadows&&(r=this.T.il);a.Ei.$e=[1,0,0,1,0,0];null!==this.lc&&(yl(this,a,this.lc,!0,!0),this.lc instanceof ga&&this.lc.type===ve?(a.beginPath(), -a.rect(h.x,h.y,h.width,h.height),zl(a,this.lc)):a.fillRect(h.x,h.y,h.width,h.height));q&&this.il&&s.drawShadows&&(Uc(a,1,0,0,1,0,0),h=this.em,a.shadowOffsetX=h.x,a.shadowOffsetY=h.y,a.shadowColor=this.dm,a.shadowBlur=this.cm/b.scale,a.$a());this instanceof A?Uc(a,k.m11,k.m12,k.m21,k.m22,k.dx,k.dy):a.Ei.$e=[k.m11,k.m12,k.m21,k.m22,k.dx,k.dy];if(null!==this.Ib){var p=this.Ha,h=k=0,s=p.width,p=p.height,t=0;this instanceof X&&(p=this.Pa.kb,k=p.x,h=p.y,s=p.width,p=p.height,t=this.Sg);yl(this,a,this.Ib, -!0,!1);this.Ib instanceof ga&&this.Ib.type===ve?(a.beginPath(),a.rect(k-t/2,h-t/2,s+t,p+t),zl(a,this.Ib)):a.fillRect(k-t/2,h-t/2,s+t,p+t)}s=h=k=0;r&&(null!==this.Ib||null!==this.lc||null!==l&&0!==(l.ea&512)||null!==l&&l.type===Yi&&l.If()!==this)?(Al(this,!0),k=a.shadowOffsetX,h=a.shadowOffsetY,s=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0):Al(this,!1);this.Mj(a,b);r&&0!==(this.ea&512)===!0&&(a.shadowOffsetX=k,a.shadowOffsetY=h,a.shadowBlur=s);q&&r&&(a.shadowOffsetX=0,a.shadowOffsetY= -0,a.shadowBlur=0);m&&(a.restore(),n&&a.rf.pop(),$i(b,a));this instanceof A&&(e=a.rf.pop());q&&r&&a.rf.pop();null!==a.nD&&(null===e&&(f===a.kw?(Uc(a,1,0,0,1,0,0),e=a.rf.pop()):e=a.kw),a.nD(this,e))}}}}else{if(this instanceof A&&(this.type===tl||this.type===ul)){vl(this,a,b);1!==c&&(a.globalAlpha=d);return}q=this.Xb;if(0!==q.width&&0!==q.height&&!isNaN(q.x)&&!isNaN(q.y)){e=this.transform;f=this.S;0!==(this.ea&4096)===!0&&wl(this);l=0!==(this.ea&256);this instanceof qa&&xl(this,a);if(l){m=f.Tf()?f.Ha: -f.ba;this.Xh?(h=this.Xh,n=h.x,r=h.y,k=h.width,h=h.height):(n=Math.max(q.x,m.x),r=Math.max(q.y,m.y),k=Math.min(q.right,m.right)-n,h=Math.min(q.bottom,m.bottom)-r);if(n>q.width+q.x||q.x>m.width+m.x||r>q.height+q.y||q.y>m.height+m.y){1!==c&&(a.globalAlpha=d);return}a.save();a.beginPath();a.rect(n,r,k,h);a.clip()}r=b.Qg;m=!1;if(this instanceof G){m=!0;if(!this.Ea()){1!==c&&(a.globalAlpha=d);return}this.il&&r.drawShadows&&(n=this.em,a.shadowOffsetX=n.x*b.scale*b.nf,a.shadowOffsetY=n.y*b.scale*b.nf,a.shadowColor= -this.dm,a.shadowBlur=this.cm)}n=!1;this.T&&r.drawShadows&&(n=this.T.il);null!==this.lc&&(yl(this,a,this.lc,!0,!0),this.lc instanceof ga&&this.lc.type===ve?(a.beginPath(),a.rect(q.x,q.y,q.width,q.height),zl(a,this.lc)):a.fillRect(q.x,q.y,q.width,q.height));e.Os()||a.transform(e.m11,e.m12,e.m21,e.m22,e.dx,e.dy);null!==this.Ib&&(h=this.Ha,r=q=0,k=h.width,h=h.height,s=0,this instanceof X&&(h=this.Pa.kb,q=h.x,r=h.y,k=h.width,h=h.height,s=this.Sg),yl(this,a,this.Ib,!0,!1),this.Ib instanceof ga&&this.Ib.type=== -ve?(a.beginPath(),a.rect(q-s/2,r-s/2,k+s,h+s),zl(a,this.Ib)):a.fillRect(q-s/2,r-s/2,k+s,h+s));k=r=q=0;n&&(null!==this.Ib||null!==this.lc||null!==f&&0!==(f.ea&512)||null!==f&&(f.type===Yi||f.type===oh)&&f.If()!==this)?(Al(this,!0),q=a.shadowOffsetX,r=a.shadowOffsetY,k=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0):Al(this,!1);this.Mj(a,b);n&&0!==(this.ea&512)===!0&&(a.shadowOffsetX=q,a.shadowOffsetY=r,a.shadowBlur=k);m&&n&&(a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0);l?(a.restore(), -this instanceof A?$i(b,a,!0):$i(b,a,!1)):e.Os()||(f=1/(e.m11*e.m22-e.m12*e.m21),a.transform(e.m22*f,-e.m12*f,-e.m21*f,e.m11*f,f*(e.m21*e.dy-e.m22*e.dx),f*(e.m12*e.dx-e.m11*e.dy)))}}1!==c&&(a.globalAlpha=d)}}; -function vl(a,b,c){var d=a.Xb;0===d.width||0===d.height||isNaN(d.x)||isNaN(d.y)||(null!==a.lc&&(yl(a,b,a.lc,!0,!0),a.lc instanceof ga&&a.lc.type===ve?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),zl(b,a.lc)):b.fillRect(d.x,d.y,d.width,d.height)),null!==a.Ib&&(yl(a,b,a.Ib,!0,!1),a.Ib instanceof ga&&a.Ib.type===ve?(b.beginPath(),b.rect(d.x,d.y,d.width,d.height),zl(b,a.Ib)):b.fillRect(d.x,d.y,d.width,d.height)),a.Mj(b,c))}g.Mj=function(){}; -function zl(a,b){if(b instanceof ga&&b.type===ve&&!(a instanceof Nc)){var c=b.lx,d=b.kx;d>c?(a.scale(c/d,1),a.translate((d-c)/2,0)):c>d&&(a.scale(1,d/c),a.translate(0,(c-d)/2));a.Ft?a.clip():a.fill();d>c?(a.translate(-(d-c)/2,0),a.scale(1/(c/d),1)):c>d&&(a.translate(0,-(c-d)/2),a.scale(1,1/(d/c)))}else a.Ft?a.clip():a.fill()}function Bl(a){a.Ft||a.stroke()} -function yl(a,b,c,d,e){if(null!==c){var f=1,h=1;if("string"===typeof c)d?b.Sm!==c&&(b.fillStyle=c,b.Sm=c):b.Tm!==c&&(b.strokeStyle=c,b.Tm=c);else if(c.type===te)c=c.color,d?b.Sm!==c&&(b.fillStyle=c,b.Sm=c):b.Tm!==c&&(b.strokeStyle=c,b.Tm=c);else{var k,h=a.Ha,f=h.width,h=h.height;if(e)var l=a.ba,f=l.width,h=l.height;var m=b instanceof CanvasRenderingContext2D;if(m&&(c.Fg&&c.type===bl||c.lx===f&&c.kx===h))k=c.Fg;else{var n=l=0,p=0,q=0,r=0,s=0,s=r=0;e&&(l=a.ba,f=l.width,h=l.height,r=l.x,s=l.y);l=c.start.x* -f+c.start.offsetX;n=c.start.y*h+c.start.offsetY;p=c.end.x*f+c.end.offsetX;q=c.end.y*h+c.end.offsetY;l+=r;p+=r;n+=s;q+=s;c.type===ue?k=b.createLinearGradient(l,n,p,q):c.type===ve?(s=isNaN(c.us)?Math.max(f,h)/2:c.us,isNaN(c.ut)?(r=0,s=Math.max(f,h)/2):r=c.ut,k=b.createRadialGradient(l,n,r,p,q,s)):c.type===bl?k=b.createPattern(c.pattern,"repeat"):u.Kd(c.type,"Brush type");if(c.type!==bl&&(a=c.os,null!==a))for(a=a.i;a.next();)k.addColorStop(a.key,a.value);m&&(c.Fg=k,c.lx=f,c.kx=h)}d?b.Sm!==k&&(b.fillStyle= -k,b.Sm=k):b.Tm!==k&&(b.strokeStyle=k,b.Tm=k)}}}S.prototype.isContainedBy=S.prototype.gl=function(a){if(a instanceof A)a:{if(this!==a&&null!==a)for(var b=this.S;null!==b;){if(b===a){a=!0;break a}b=b.S}a=!1}else a=!1;return a};S.prototype.isVisibleObject=S.prototype.kl=function(){if(!this.visible)return!1;var a=this.S;return null!==a?a.kl():!0}; -function wl(a){if(0!==(a.ea&2048)===!0){var b=a.Sd;b.reset();if(!a.Xb.J()||!a.Pc.J()){Cl(a,!1);return}b.translate(a.Xb.x,a.Xb.y);b.translate(-a.Ba.x,-a.Ba.y);var c=a.Ha;nl(a,b,c.x,c.y,c.width,c.height);Cl(a,!1);Dl(a,!0)}0!==(a.ea&4096)===!0&&(b=a.S,null===b?(a.Xm.set(a.Sd),a.fu=a.scale,Dl(a,!1)):null!==b.Ff&&(c=a.Xm,c.reset(),b.Tf()?c.multiply(b.Xm):null!==b.S&&c.multiply(b.S.Xm),c.multiply(a.Sd),a.fu=a.scale*b.fu,Dl(a,!1)))} -function nl(a,b,c,d,e,f){1!==a.scale&&b.scale(a.scale);if(0!==a.angle){var h=Ib;a.Ze&&a.Ze.pd()&&(h=a.Ze);var k=u.K();if(a instanceof G&&a.ec!==a)for(c=a.ec,d=c.Ha,k.rt(d.x,d.y,d.width,d.height,h),c.yk.ab(k),k.offset(-c.Ba.x,-c.Ba.y),h=c.S;null!==h&&h!==a;)h.yk.ab(k),k.offset(-h.Ba.x,-h.Ba.y),h=h.S;else k.rt(c,d,e,f,h);b.rotate(a.angle,k.x,k.y);u.v(k)}}g=S.prototype; -g.R=function(a){void 0===a&&(a=!1);if(!0!==Aj(this)){uj(this,!0);rl(this,!0);var b=this.S;null!==b?a||b.R():(a=this.g,null!==a&&(a.Xf.add(this),this instanceof U&&(a.ha.gb||this.sf(),null!==this.ce&&El(this.ce)),a.de(!0)));if(this instanceof A){if(this.oa===Yi||this.oa===ah)a=this.If(),null!==a&&a.R(!0);a=this.ya.n;for(var b=a.length,c=0;ca?a=0:1a||1=a&&u.k("GraphObject.scale must be greater than zero"),this.$b=a,this.Jg(),this.R(),this.h("scale",b,a))});u.defineProperty(S,{angle:"angle"},function(){return this.Ym},function(a){var b=this.Ym;b!==a&&(a%=360,0>a&&(a+=360),b!==a&&(this.Ym=a,this.R(),this.Jg(),this.h("angle",b,a)))}); -u.defineProperty(S,{xa:"desiredSize"},function(){return this.jf},function(a){var b=this.jf;b.L(a)||(this.jf=a=a.Z(),this.R(),this instanceof X&&this.le(),this.h("desiredSize",b,a),a=this.T,null!==a&&0!==(this.ea&1024)&&(ll(this,a,"width"),ll(this,a,"height")))}); -u.defineProperty(S,{width:"width"},function(){return this.jf.width},function(a){if(this.jf.width!==a){var b=this.jf;this.jf=a=(new ia(a,this.jf.height)).freeze();this.R();this instanceof X&&this.le();this.h("desiredSize",b,a);b=this.T;null!==b&&0!==(this.ea&1024)&&ll(this,b,"width")}}); -u.defineProperty(S,{height:"height"},function(){return this.jf.height},function(a){if(this.jf.height!==a){var b=this.jf;this.jf=a=(new ia(this.jf.width,a)).freeze();this.R();this instanceof X&&this.le();this.h("desiredSize",b,a);b=this.T;null!==b&&0!==(this.ea&1024)&&ll(this,b,"height")}}); -u.defineProperty(S,{vg:"minSize"},function(){return this.nj},function(a){var b=this.nj;b.L(a)||(a=a.copy(),isNaN(a.width)&&(a.width=0),isNaN(a.height)&&(a.height=0),a.freeze(),this.nj=a,this.R(),this.h("minSize",b,a))});u.defineProperty(S,{af:"maxSize"},function(){return this.lj},function(a){var b=this.lj;b.L(a)||(a=a.copy(),isNaN(a.width)&&(a.width=Infinity),isNaN(a.height)&&(a.height=Infinity),a.freeze(),this.lj=a,this.R(),this.h("maxSize",b,a))});u.u(S,{Ba:"measuredBounds"},function(){return this.Pc}); -u.u(S,{Ha:"naturalBounds"},function(){return this.Hc},{configurable:!0});u.defineProperty(S,{margin:"margin"},function(){return this.Gq},function(a){"number"===typeof a&&(a=new rb(a));var b=this.Gq;b.L(a)||(this.Gq=a=a.Z(),this.R(),this.h("margin",b,a))});u.u(S,{transform:null},function(){0!==(this.ea&2048)===!0&&wl(this);return this.Sd});u.u(S,{Ff:null},function(){0!==(this.ea&4096)===!0&&wl(this);return this.Xm}); -u.defineProperty(S,{alignment:"alignment"},function(){return this.se},function(a){var b=this.se;b.L(a)||(a.ne()&&!a.Lc()&&u.k("alignment must be a real Spot or Spot.Default"),this.se=a=a.Z(),El(this),this.h("alignment",b,a))});u.defineProperty(S,{column:"column"},function(){return this.Cp},function(a){a=Math.round(a);var b=this.Cp;b!==a&&(0>a&&u.wa(a,">= 0",S,"column"),this.Cp=a,this.R(),this.h("column",b,a))}); -u.defineProperty(S,{$F:"columnSpan"},function(){return this.Wi},function(a){a=Math.round(a);var b=this.Wi;b!==a&&(1>a&&u.wa(a,">= 1",S,"columnSpan"),this.Wi=a,this.R(),this.h("columnSpan",b,a))});u.defineProperty(S,{rc:"row"},function(){return this.wr},function(a){a=Math.round(a);var b=this.wr;b!==a&&(0>a&&u.wa(a,">= 0",S,"row"),this.wr=a,this.R(),this.h("row",b,a))}); -u.defineProperty(S,{rowSpan:"rowSpan"},function(){return this.tj},function(a){a=Math.round(a);var b=this.tj;b!==a&&(1>a&&u.wa(a,">= 1",S,"rowSpan"),this.tj=a,this.R(),this.h("rowSpan",b,a))});u.defineProperty(S,{Hj:"alignmentFocus"},function(){return this.vp},function(a){var b=this.vp;b.L(a)||(a.ne()&&!a.Lc()&&u.k("alignmentFocus must be a real Spot or Spot.Default"),this.vp=a=a.Z(),this.R(),this.h("alignmentFocus",b,a))}); -u.defineProperty(S,{Jd:"portId"},function(){return this.ir},function(a){var b=this.ir;if(b!==a){var c=this.T;null===c||c instanceof U||(u.k("portID being set on a Link: "+a),c=null);null!==b&&null!==c&&Ll(c,this);this.ir=a;if(null!==a&&c){c.xh=!0;null===c.Qd&&Ml(c);var d=this.Jd;null!==d&&c.Qd.add(d,this)}this.h("portId",b,a)}});function Nl(a){var b={value:null};Ol(a,b);return b.value}function Ol(a,b){var c=a.S;return null===c||!Ol(c,b)&&a.visible?(b.value=a,!1):!0} -function Il(a){var b=a.T;b instanceof U&&(a=a.g,null===a||a.ha.gb||b.sf())}u.defineProperty(S,{xb:"toSpot"},function(){return null!==this.Q?this.Q.Ej:vb},function(a){null===this.Q&&this.Ee();var b=this.Q.Ej;b.L(a)||(a=a.Z(),this.Q.Ej=a,this.h("toSpot",b,a),Il(this))}); -u.defineProperty(S,{vl:"toEndSegmentLength"},function(){return null!==this.Q?this.Q.Cj:10},function(a){null===this.Q&&this.Ee();var b=this.Q.Cj;b!==a&&(0>a&&u.wa(a,">= 0",S,"toEndSegmentLength"),this.Q.Cj=a,this.h("toEndSegmentLength",b,a),Il(this))});u.defineProperty(S,{wt:"toEndSegmentDirection"},function(){return null!==this.Q?this.Q.Bj:jl},function(a){null===this.Q&&this.Ee();var b=this.Q.Bj;b!==a&&(this.Q.Bj=a,this.h("toEndSegmentDirection",b,a),Il(this))}); -u.defineProperty(S,{yt:"toShortLength"},function(){return null!==this.Q?this.Q.Dj:0},function(a){null===this.Q&&this.Ee();var b=this.Q.Dj;b!==a&&(this.Q.Dj=a,this.h("toShortLength",b,a),Il(this))});u.defineProperty(S,{OE:"toLinkable"},function(){return this.Sr},function(a){var b=this.Sr;b!==a&&(this.Sr=a,this.h("toLinkable",b,a))});u.defineProperty(S,{yI:"toMaxLinks"},function(){return this.Tr},function(a){var b=this.Tr;b!==a&&(0>a&&u.wa(a,">= 0",S,"toMaxLinks"),this.Tr=a,this.h("toMaxLinks",b,a))}); -u.defineProperty(S,{vb:"fromSpot"},function(){return null!==this.Q?this.Q.cj:vb},function(a){null===this.Q&&this.Ee();var b=this.Q.cj;b.L(a)||(a=a.Z(),this.Q.cj=a,this.h("fromSpot",b,a),Il(this))});u.defineProperty(S,{Yk:"fromEndSegmentLength"},function(){return null!==this.Q?this.Q.aj:10},function(a){null===this.Q&&this.Ee();var b=this.Q.aj;b!==a&&(0>a&&u.wa(a,">= 0",S,"fromEndSegmentLength"),this.Q.aj=a,this.h("fromEndSegmentLength",b,a),Il(this))}); -u.defineProperty(S,{Es:"fromEndSegmentDirection"},function(){return null!==this.Q?this.Q.$i:jl},function(a){null===this.Q&&this.Ee();var b=this.Q.$i;b!==a&&(this.Q.$i=a,this.h("fromEndSegmentDirection",b,a),Il(this))});u.defineProperty(S,{Fs:"fromShortLength"},function(){return null!==this.Q?this.Q.bj:0},function(a){null===this.Q&&this.Ee();var b=this.Q.bj;b!==a&&(this.Q.bj=a,this.h("fromShortLength",b,a),Il(this))}); -u.defineProperty(S,{vD:"fromLinkable"},function(){return this.Wp},function(a){var b=this.Wp;b!==a&&(this.Wp=a,this.h("fromLinkable",b,a))});u.defineProperty(S,{DG:"fromMaxLinks"},function(){return this.Xp},function(a){var b=this.Xp;b!==a&&(0>a&&u.wa(a,">= 0",S,"fromMaxLinks"),this.Xp=a,this.h("fromMaxLinks",b,a))});u.defineProperty(S,{cursor:"cursor"},function(){return this.Jp},function(a){var b=this.Jp;b!==a&&(u.j(a,"string",S,"cursor"),this.Jp=a,this.h("cursor",b,a))}); -u.defineProperty(S,{click:"click"},function(){return null!==this.P?this.P.Wh:null},function(a){null===this.P&&gl(this);var b=this.P.Wh;b!==a&&(null!==a&&u.j(a,"function",S,"click"),this.P.Wh=a,this.h("click",b,a))});u.defineProperty(S,{ts:"doubleClick"},function(){return null!==this.P?this.P.ci:null},function(a){null===this.P&&gl(this);var b=this.P.ci;b!==a&&(null!==a&&u.j(a,"function",S,"doubleClick"),this.P.ci=a,this.h("doubleClick",b,a))}); -u.defineProperty(S,{Uy:"contextClick"},function(){return null!==this.P?this.P.Yh:null},function(a){null===this.P&&gl(this);var b=this.P.Yh;b!==a&&(null!==a&&u.j(a,"function",S,"contextClick"),this.P.Yh=a,this.h("contextClick",b,a))});u.defineProperty(S,{ZD:"mouseEnter"},function(){return null!==this.P?this.P.Rq:null},function(a){null===this.P&&gl(this);var b=this.P.Rq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseEnter"),this.P.Rq=a,this.h("mouseEnter",b,a))}); -u.defineProperty(S,{$D:"mouseLeave"},function(){return null!==this.P?this.P.Sq:null},function(a){null===this.P&&gl(this);var b=this.P.Sq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseLeave"),this.P.Sq=a,this.h("mouseLeave",b,a))});u.defineProperty(S,{Fz:"mouseOver"},function(){return null!==this.P?this.P.mi:null},function(a){null===this.P&&gl(this);var b=this.P.mi;b!==a&&(null!==a&&u.j(a,"function",S,"mouseOver"),this.P.mi=a,this.h("mouseOver",b,a))}); -u.defineProperty(S,{Ez:"mouseHover"},function(){return null!==this.P?this.P.li:null},function(a){null===this.P&&gl(this);var b=this.P.li;b!==a&&(null!==a&&u.j(a,"function",S,"mouseHover"),this.P.li=a,this.h("mouseHover",b,a))});u.defineProperty(S,{Dz:"mouseHold"},function(){return null!==this.P?this.P.ki:null},function(a){null===this.P&&gl(this);var b=this.P.ki;b!==a&&(null!==a&&u.j(a,"function",S,"mouseHold"),this.P.ki=a,this.h("mouseHold",b,a))}); -u.defineProperty(S,{CH:"mouseDragEnter"},function(){return null!==this.P?this.P.Pq:null},function(a){null===this.P&&gl(this);var b=this.P.Pq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseDragEnter"),this.P.Pq=a,this.h("mouseDragEnter",b,a))});u.defineProperty(S,{DH:"mouseDragLeave"},function(){return null!==this.P?this.P.Qq:null},function(a){null===this.P&&gl(this);var b=this.P.Qq;b!==a&&(null!==a&&u.j(a,"function",S,"mouseDragLeave"),this.P.Qq=a,this.h("mouseDragLeave",b,a))}); -u.defineProperty(S,{Cz:"mouseDrop"},function(){return null!==this.P?this.P.ji:null},function(a){null===this.P&&gl(this);var b=this.P.ji;b!==a&&(null!==a&&u.j(a,"function",S,"mouseDrop"),this.P.ji=a,this.h("mouseDrop",b,a))});u.defineProperty(S,{HC:"actionDown"},function(){return null!==this.P?this.P.qp:null},function(a){null===this.P&&gl(this);var b=this.P.qp;b!==a&&(null!==a&&u.j(a,"function",S,"actionDown"),this.P.qp=a,this.h("actionDown",b,a))}); -u.defineProperty(S,{IC:"actionMove"},function(){return null!==this.P?this.P.rp:null},function(a){null===this.P&&gl(this);var b=this.P.rp;b!==a&&(null!==a&&u.j(a,"function",S,"actionMove"),this.P.rp=a,this.h("actionMove",b,a))});u.defineProperty(S,{JC:"actionUp"},function(){return null!==this.P?this.P.sp:null},function(a){null===this.P&&gl(this);var b=this.P.sp;b!==a&&(null!==a&&u.j(a,"function",S,"actionUp"),this.P.sp=a,this.h("actionUp",b,a))}); -u.defineProperty(S,{GC:"actionCancel"},function(){return null!==this.P?this.P.pp:null},function(a){null===this.P&&gl(this);var b=this.P.pp;b!==a&&(null!==a&&u.j(a,"function",S,"actionCancel"),this.P.pp=a,this.h("actionCancel",b,a))});u.defineProperty(S,{lA:"toolTip"},function(){return null!==this.P?this.P.ti:null},function(a){null===this.P&&gl(this);var b=this.P.ti;b!==a&&(null!==a&&u.C(a,lf,S,"toolTip"),this.P.ti=a,this.h("toolTip",b,a))}); -u.defineProperty(S,{contextMenu:"contextMenu"},function(){return null!==this.P?this.P.Zh:null},function(a){null===this.P&&gl(this);var b=this.P.Zh;b!==a&&(null!==a&&u.C(a,lf,S,"contextMenu"),this.P.Zh=a,this.h("contextMenu",b,a))});S.prototype.bind=S.prototype.bind=function(a){a.fg=this;var b=this.zo();null!==b&&Pl(b)&&u.k("Cannot add a Binding to a template that has already been copied: "+a);null===this.Gc&&(this.Gc=new E(bf));this.Gc.add(a)}; -S.prototype.findTemplateBinder=S.prototype.zo=function(){for(var a=this instanceof A?this:this.S;null!==a;){if(null!==a.yl)return a;a=a.S}return null};S.fromSvg=S.fromSVG=function(a){return Ql(a)};S.prototype.setProperties=function(a){u.ot(this,a)};var Rl; -S.make=Rl=function(a,b){var c=arguments,d=null,e=null;if("function"===typeof a)e=a;else if("string"===typeof a){var f=Sl.ta(a);"function"===typeof f?(c=u.Pk(arguments),d=f(c)):e=da[a]}null===d&&(void 0===e&&(d=window.$,void 0!==d&&void 0!==d.noop&&u.k("GraphObject.make failed to complete. Is it conflicting with another $ var? (such as jQuery)"),u.k("GraphObject.make failed to complete, it may be conflicting with another var.")),null!==e&&e.constructor||u.k("GraphObject.make requires a class function or class name, not: "+ -a),d=new e);f=1;if(d instanceof D&&1e)&&u.k("Must specify non-negative integer row for RowColumnDefinition "+ -b),a.ae=!0,a.index=e):void 0!==b.column&&(e=b.column,(void 0===e||null===e||Infinity===e||isNaN(e)||0>e)&&u.k("Must specify non-negative integer column for RowColumnDefinition "+b),a.ae=!1,a.index=e);e=new pa;for(c in b)"row"!==c&&"column"!==c&&(e[c]=b[c]);u.ot(a,e)}else u.ot(a,b);else u.k('Unknown initializer "'+b+'" for object being constructed by GraphObject.make: '+a)}var Sl=new la("string","function"); -S.getBuilders=function(){var a=new la("string","function"),b;for(b in Sl)if(b!==b.toLowerCase()){var c=Sl[b];"function"===typeof c&&a.add(b,c)}a.freeze();return a};var Dm;S.defineBuilder=Dm=function(a,b){u.j(a,"string",S,"defineBuilder:name");u.j(b,"function",S,"defineBuilder:func");var c=a.toLowerCase();""!==a&&"none"!==c&&a!==c||u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: "+a);Sl.add(a,b)};var Em; -S.takeBuilderArgument=Em=function(a,b,c){void 0===c&&(c=null);var d=a[1];if("function"===typeof c?c(d):"string"===typeof d)return a.splice(1,1),d;if(void 0===b)throw Error("no "+("function"===typeof c?"satisfactory":"string")+" argument for GraphObject builder "+a[0]);return b}; -Dm("Button",function(){var a=new ga(ue);a.addColorStop(0,"white");a.addColorStop(1,"lightgray");var b=new ga(ue);b.addColorStop(0,"white");b.addColorStop(1,"dodgerblue");a=Rl(A,Yi,{pz:!0},{_buttonFillNormal:a,_buttonStrokeNormal:"gray",_buttonFillOver:b,_buttonStrokeOver:"blue"},Rl(X,{name:"ButtonBorder",Fb:"Rectangle",A:new L(0,0,2.761423749153968,2.761423749153968),B:new L(1,1,-2.761423749153968,-2.761423749153968),fill:a,stroke:"gray"}));a.ZD=function(a,b){var e=b.je("ButtonBorder");if(e instanceof -X){var f=b._buttonFillOver;b._buttonFillNormal=e.fill;e.fill=f;f=b._buttonStrokeOver;b._buttonStrokeNormal=e.stroke;e.stroke=f}};a.$D=function(a,b){var e=b.je("ButtonBorder");e instanceof X&&(e.fill=b._buttonFillNormal,e.stroke=b._buttonStrokeNormal)};return a}); -Dm("TreeExpanderButton",function(){var a=Rl("Button",{_treeExpandedFigure:"MinusLine",_treeCollapsedFigure:"PlusLine"},Rl(X,{name:"ButtonIcon",Fb:"MinusLine",xa:K.mp},(new bf("figure","isTreeExpanded",function(a,c){var d=c.S;return a?d._treeExpandedFigure:d._treeCollapsedFigure})).rw()),{visible:!1},(new bf("visible","isTreeLeaf",function(a){return!a})).rw());a.click=function(a,c){var d=c.T;d instanceof lf&&(d=d.Kh);if(d instanceof U){var e=d.g;if(null!==e){e=e.Eb;if(d.Vc){if(!e.canCollapseTree(d))return}else if(!e.canExpandTree(d))return; -a.Tc=!0;d.Vc?e.collapseTree(d):e.expandTree(d)}}};return a}); -Dm("SubGraphExpanderButton",function(){var a=Rl("Button",{_subGraphExpandedFigure:"MinusLine",_subGraphCollapsedFigure:"PlusLine"},Rl(X,{name:"ButtonIcon",Fb:"MinusLine",xa:K.mp},(new bf("figure","isSubGraphExpanded",function(a,c){var d=c.S;return a?d._subGraphExpandedFigure:d._subGraphCollapsedFigure})).rw()));a.click=function(a,c){var d=c.T;d instanceof lf&&(d=d.Kh);if(d instanceof V){var e=d.g;if(null!==e){e=e.Eb;if(d.be){if(!e.canCollapseSubGraph(d))return}else if(!e.canExpandSubGraph(d))return;a.Tc= -!0;d.be?e.collapseSubGraph(d):e.expandSubGraph(d)}}};return a});Dm("ContextMenuButton",function(){var a=Rl("Button");a.stretch=fl;var b=a.je("ButtonBorder");b instanceof X&&(b.Fb="Rectangle",b.A=new L(0,0,2,3),b.B=new L(1,1,-2,-2));return a}); -Dm("PanelExpanderButton",function(a){var b=Em(a,"COLLAPSIBLE");a=Rl("Button",Rl(X,"TriangleUp",{xa:new ia(6,4)},(new bf("figure","visible",function(a){return a?"TriangleUp":"TriangleDown"})).rw(b)));var c=a.je("ButtonBorder");c instanceof X&&(c.stroke=null,c.fill="transparent");a.click=function(a,c){var f=c.g;if(null!==f){var h=c.T.je(b);null!==h&&(f.Wb("Collapse/Expand Panel"),h.visible=!h.visible,f.Wd("Collapse/Expand Panel"))}};return a}); -function hl(){this.Zh=this.ti=this.pp=this.sp=this.rp=this.qp=this.ji=this.Qq=this.Pq=this.ki=this.li=this.mi=this.Sq=this.Rq=this.Yh=this.ci=this.Wh=null}hl.prototype.copy=function(){var a=new hl;a.Wh=this.Wh;a.ci=this.ci;a.Yh=this.Yh;a.Rq=this.Rq;a.Sq=this.Sq;a.mi=this.mi;a.li=this.li;a.ki=this.ki;a.Pq=this.Pq;a.Qq=this.Qq;a.ji=this.ji;a.qp=this.qp;a.rp=this.rp;a.sp=this.sp;a.pp=this.pp;a.ti=this.ti;a.Zh=this.Zh;return a}; -function A(a){S.call(this);void 0===a?0===arguments.length?this.oa=vh:u.k("invalid argument to Panel constructor: undefined"):(u.rb(a,A,A,"type"),this.oa=a);this.ya=new E(S);this.Pe=K.np;this.Kg=!1;this.oa===bj&&(this.Kg=!0);this.gq=!1;this.Mp=uc;this.bi=dl;this.oa===Fl&&Fm(this);this.jo=sh;this.aq=(new ia(10,10)).freeze();this.bq=K.Wj;this.yl=this.qh=null;this.uq=NaN;this.Zf=this.gi=null;this.Hn="category";this.Yf=null;this.vi=new z(NaN,NaN,NaN,NaN);this.hm=null;this.xh=!1;this.xr=null}u.Ga(A,S); -u.Lh(A);u.fa("Panel",A);function Fm(a){a.Xi=K.np;a.th=1;a.ai=null;a.Dl=null;a.sh=1;a.rh=null;a.Cl=null;a.yd=[];a.rd=[];a.am=Gm;a.Al=Gm;a.ui=0;a.hi=0} -A.prototype.cloneProtected=function(a){S.prototype.cloneProtected.call(this,a);a.oa=this.oa;a.Pe=this.Pe.Z();a.Kg=this.Kg;a.gq=this.gq;a.Mp=this.Mp.Z();a.bi=this.bi;if(a.oa===Fl){a.Xi=this.Xi.Z();a.th=this.th;a.ai=this.ai;a.Dl=this.Dl;a.sh=this.sh;a.rh=this.rh;a.Cl=this.Cl;var b=[];if(0a&&u.wa(a,">= 0",A,"padding"),a=new rb(a)):(u.C(a,rb,A,"padding"),0>a.left&&u.wa(a.left,">= 0",A,"padding:value.left"),0>a.right&&u.wa(a.right,">= 0",A,"padding:value.right"),0>a.top&&u.wa(a.top,">= 0",A,"padding:value.top"),0>a.bottom&&u.wa(a.bottom,">= 0",A,"padding:value.bottom"));var b=this.Pe;b.L(a)||(this.Pe=a=a.Z(),this.R(),this.h("padding",b,a))}); -u.defineProperty(A,{Tk:"defaultAlignment"},function(){return this.Mp},function(a){var b=this.Mp;b.L(a)||(this.Mp=a=a.Z(),this.R(),this.h("defaultAlignment",b,a))});u.defineProperty(A,{Bd:"defaultStretch"},function(){return this.bi},function(a){var b=this.bi;b!==a&&(u.rb(a,S,A,"defaultStretch"),this.bi=a,this.R(),this.h("defaultStretch",b,a))}); -u.defineProperty(A,{rJ:"defaultSeparatorPadding"},function(){return void 0===this.Xi?K.np:this.Xi},function(a){if(void 0!==this.Xi){"number"===typeof a&&(a=new rb(a));var b=this.Xi;b.L(a)||(this.Xi=a=a.Z(),this.h("defaultSeparatorPadding",b,a))}}); -u.defineProperty(A,{pJ:"defaultRowSeparatorStroke"},function(){return void 0===this.ai?null:this.ai},function(a){var b=this.ai;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.ai=a,this.h("defaultRowSeparatorStroke",b,a))});u.defineProperty(A,{qJ:"defaultRowSeparatorStrokeWidth"},function(){return void 0===this.th?1:this.th},function(a){if(void 0!==this.th){var b=this.th;b!==a&&isFinite(a)&&0<=a&&(this.th=a,this.h("defaultRowSeparatorStrokeWidth",b,a))}}); -u.defineProperty(A,{oJ:"defaultRowSeparatorDashArray"},function(){return void 0===this.Dl?null:this.Dl},function(a){if(void 0!==this.Dl){var b=this.Dl;if(b!==a){null===a||Array.isArray(a)||u.Kd(a,"Array",A,"defaultRowSeparatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;e=c&&(c=1);var d=this.aw,e=d.width,d=d.height,f=this.Ha,h=f.width,f=f.height,k=Math.ceil(h/e),l=Math.ceil(f/d),m=this.CD;a.save();a.beginPath();a.rect(0,0,h,f);a.clip();for(var n=[],p=this.ya.n,q=p.length,r=0;re*s*c))break}a.stroke()}else if("LineH"===B.Fb){a.lineWidth= -B.hb;yl(this,a,B.stroke,!1,!1);a.beginPath();for(I=x=Math.floor(-m.y/d);I<=x+l&&!(H=I*d+m.y,0<=H&&H<=f&&Hm(I,s,t)&&(v&&!y?kl(a,0,H,h,H,C,B.cd):(a.moveTo(0,H),a.lineTo(h,H)),2>d*s*c));I++);a.stroke()}else if("BarV"===B.Fb)for(yl(this,a,B.fill,!0,!1),B=B.width,isNaN(B)&&(B=e),I=x=Math.floor(-m.x/e);I<=x+k&&!(H=I*e+m.x,0<=H&&He*s*c));I++);else if("BarH"===B.Fb)for(yl(this,a,B.fill,!0,!1),B=B.height,isNaN(B)&&(B=d),I=x=Math.floor(-m.y/d);I<=x+l&&!(H=I*d+m.y,0<=H&& -H<=f&&Hm(I,s,t)&&(a.fillRect(0,H,h,B),2>d*s*c));I++);v&&(void 0!==a.setLineDash?(a.setLineDash(u.mh),a.lineDashOffset=0):void 0!==a.webkitLineDash?(a.webkitLineDash=u.mh,a.webkitLineDashOffset=0):void 0!==a.mozDash&&(a.mozDash=null,a.mozDashOffset=0))}}a.restore();$i(b,a,!1)}else{this.oa===Fl&&(a.lineCap="butt",Im(this,a,!0,this.yd,!0),Im(this,a,!1,this.rd,!0),Jm(this,a,!0,this.yd),Jm(this,a,!1,this.rd),Im(this,a,!0,this.yd,!1),Im(this,a,!1,this.rd,!1));(c=this.LD)&&a.save();e=this.If();d=this.ya.n; -h=d.length;for(f=0;ff.height&&(m-=r-f.height):r>f.width&&(m-=r-f.width);l=l.position+m/2;b.lineWidth=m;r=a.padding;c?(l+=r.top,m=r.left,r=f.width-r.right,n&&!p?kl(b,m,l,r,l,q,0):(b.moveTo(m,l),b.lineTo(r,l))):(l+=r.left,m=r.top,r=f.height-r.bottom,n&&!p?kl(b,l,m,l,r,q,0):(b.moveTo(l,m),b.lineTo(l,r)));b.stroke();n&&(void 0!==b.setLineDash?(b.setLineDash(u.mh),b.lineDashOffset=0):void 0!==b.webkitLineDash?(b.webkitLineDash=u.mh,b.webkitLineDashOffset=0):void 0!==b.mozDash&&(b.mozDash=null,b.mozDashOffset=0))}}}} -function Im(a,b,c,d,e){for(var f=d.length,h=a.ba,k=0;km)){var n=l.lg(),p=l.ep;isNaN(p)&&(p=c?a.th:a.sh);var q=l.dp;null===q&&(q=c?a.ai:a.rh);null===q&&(p=0);n-=p;p=l.position+p;n+=l.Qa;p+n>m&&(n=m-p);0>=n||(m=a.padding,yl(a,b,l.background,!0,!1),c?b.fillRect(m.left,p+m.top,h.width-(m.left+m.right),n):b.fillRect(p+m.left,m.top,n,h.height-(m.top+m.bottom)))}}}} -function Hm(a,b,c){if(0!==a%b)return!1;b=c.length;for(var d=0;dkd&&(Ac=kd),ba.Qa+=Ac,kd=Math.max(kd-Ac,0));1!==ha.Wi||Wd!==qh&&Wd!==el||(ba=this.ed(Sc),Ac=Math.max(Ye-ba.Qa,0),Ac>zc&&(Ac=zc),ba.Qa+=Ac,zc=Math.max(zc-Ac,0));rg&&ha.Fo()}}}u.ra(Rg);for(var qc=0,Xd=0,Fa=this.ps,ca=0;ca=this.kt);Pb++)ba=this.fd(ha.rc+Pb),Ee.height+=Math.max(ba.Ki,isNaN(ba.Qe)?ba.Kf:Math.min(ba.Qe,ba.Kf));for(Pb=1;Pb=this.ps);Pb++)ba=this.ed(ha.column+Pb),Ee.width+=Math.max(ba.Ki,isNaN(ba.Qe)?ba.Kf:Math.min(ba.Qe,ba.Kf));pb.width+=Ee.width;pb.height+=Ee.height;Ob=ha.margin;Rf=Ob.right+Ob.left;Sf=Ob.top+Ob.bottom;Ph(ha,pb.width,pb.height,pm,zi);for(var De=ha.Ba,Ye=Math.max(De.width+ -Rf,0),Cd=Math.max(De.height+Sf,0),Bh=0,Pb=0;Pb=this.kt);Pb++)ba=this.fd(ha.rc+Pb),Bh+=ba.total||0;if(BhEd&&(ba.Qa=Math.min(ba.Kf,Ed+Dd),ba.yb!==Ed&&(Dd-=ba.yb-Ed));if(-1===ba.index-1)break;ba=this.fd(ba.index-1)}for(var Tf=0,Pb=0;Pb=this.ps);Pb++)ba=this.ed(ha.column+Pb),Tf+=ba.total||0;if(TfEd&&(ba.Qa=Math.min(ba.Kf,Ed+Dd),ba.yb!== -Ed&&(Dd-=ba.yb-Ed));if(-1===ba.index-1)break;ba=this.ed(ba.index-1)}}u.ra(Tc);u.Oj(Ee);u.Oj(pb);for(var Uf=0,Ze=0,Wd=pl(this,!0),Fd=this.xa,Vf=this.af,ne=Xd=qc=0,ld=0,Fa=this.ps,ca=0;caDh)Ph(Qb,Infinity,Infinity),Yd=Qb.Ba,Ge.Sh(Yd),this.Vi.add(Yd);else{var Yf=Qb.Pf,Pp=Qb.Bw,sm=Qb.Hj;sm.ne()&&(sm=Ib);var Gi=Qb.Cw,Sr=Qb.BE,Hi=0,Ii=0,ek=0;if(Yf<-Dh||Yf>=Dh){var Qp=ug.XD,Ji=ug.WD;Gi!==dh&&(ek=ug.computeAngle(Qb,Gi,Ji),Qb.angle=ek);Hi=Qp.x- -$e.x;Ii=Qp.y-$e.y}else{var tf,Fh;if(0<=Yf)tf=Ei.ja(Yf),Fh=Yfc||p>d)this.R(),Ph(this,n>c?c:n,p>d?d:p);break;case cd:this.R(!0);Ph(this,c+r,d+s,0,0);break;case fl:this.R(!0);Ph(this,c+r,p+s,0,0);break;case el:this.R(!0),Ph(this,n+r,d+s,0,0)}}k=this.ba;k.x=a;k.y= -b;k.width=c;k.height=d;var t=this.oa.Ub;switch(t){case "Position":for(var v=f.length,x=e.x-this.padding.left,B=e.y-this.padding.top,y=0;y=this.kt);ca++){var ha=this.fd(ob+ca);id.height+=ha.total}for(ca=1;ca=this.ps);ca++){var pg=this.ed(Td+ca);id.width+=pg.total}var Qg=Ud.yb+id.width,yh=Rc.yb+id.height;h.x=Qc;h.y=Hc;h.width=Qg;h.height=yh;var Sc=Qc,zh=Hc,Sb=Qg,Rg=yh;Qc+Qg>e.width&&(Sb=Math.max(e.width-Qc,0));Hc+yh>e.height&&(Rg=Math.max(e.height-Hc,0));var Tc=Fa.alignment,je=0,Ic=0,jd=0,zc=0;if(Tc.Lc()){Tc= -this.Tk;Tc.pd()||(Tc=Ib);var je=Tc.x,Ic=Tc.y,jd=Tc.offsetX,zc=Tc.offsetY,kd=Ud.alignment,Pf=Rc.alignment;kd.pd()&&(je=kd.x,jd=kd.offsetX);Pf.pd()&&(Ic=Pf.y,zc=Pf.offsetY)}else je=Tc.x,Ic=Tc.y,jd=Tc.offsetX,zc=Tc.offsetY;if(isNaN(je)||isNaN(Ic))Ic=je=.5,zc=jd=0;var ba=Be.width,ke=Be.height,Ce=Fa.margin,Tj=Ce.left+Ce.right,Uj=Ce.top+Ce.bottom,Ac=Gl(Fa,Rc,Ud,!1);!isNaN(Fa.xa.width)||Ac!==cd&&Ac!==fl||(ba=Math.max(Qg-Tj,0));!isNaN(Fa.xa.height)||Ac!==cd&&Ac!==el||(ke=Math.max(yh-Uj,0));var fb=Fa.af,gb= -Fa.vg,ba=Math.min(fb.width,ba),ke=Math.min(fb.height,ke),ba=Math.max(gb.width,ba),ke=Math.max(gb.height,ke),Vj=ke+Uj;h.x+=h.width*je-(ba+Tj)*je+jd+Ce.left;h.y+=h.height*Ic-Vj*Ic+zc+Ce.top;Fa.visible&&(qb(Sc,zh,Sb,Rg,h.x,h.y,Be.width,Be.height)?Fa.zc(h.x,h.y,ba,ke):Fa.zc(h.x,h.y,ba,ke,new z(Sc,zh,Sb,Rg)))}else{Fa.Jg();Fa.Xb.La();var Qf=Fa.Xb;Qf.x=Vd.type===tl?Pg:Qc;Qf.y=Vd.type===ul?Of:Hc;Qf.width=Be.width;Qf.height=Be.height;Fa.Xb.freeze();rl(Fa,!1)}}u.Oj(id);for(ob=0;ob=pb){var Uf=this.XD,Ze=this.WD;Pb!==dh&&(Tf=this.computeAngle(Bc,Pb,Ze),Bc.angle=Tf);Dd=Uf.x;Ed=Uf.y}else{var Fd=void 0,Vf=void 0;if(0<=Jc)Fd=me.n[Jc],Vf=Jcp.width||n.y>p.height||0>n.x+n.width||0>n.y+n.height)){n=m;m=m instanceof A?m:null;p=u.jh();p.set(h);if(null!==m?m.Nj(a,b,c,d,e,p):ol(n,a,d,p))null!== -b&&(n=b(n)),null===n||null!==c&&!c(n)||e.add(n);u.Ye(p)}}}void 0===f&&u.Ye(h);return d}void 0===f&&u.Ye(h);return!1};function Um(a,b,c,d){for(var e=a.ya.n,f=e.length;f--;){var h=e[f];if(h.visible){var k=h.ba,l=a.Ha;k.x>l.width||k.y>l.height||0>k.x+k.width||0>k.y+k.height||(h instanceof A&&Um(h,b,c,d),null!==b&&(h=b(h)),null===h||null!==c&&!c(h)||d.add(h))}}} -g.ym=function(a,b,c,d,e,f){if(!1===this.Ag)return!1;void 0===c&&(c=null);void 0===d&&(d=null);var h=this.Ha,k=this.Tf(),l=k?a:Wa(u.fc(a.x,a.y),this.transform),m=k?b:Wa(u.fc(b.x,b.y),this.transform),n=l.Lj(m),p=0s.width||r.y>s.height||0>r.x+r.width||0>r.y+r.height||(q.Tf()?(r=q.transform,Wa(k.set(a),r),Wa(l.set(b),r)):(k.set(a),l.set(b)),r=q,q=q instanceof A?q:null,null!==q?!q.ym(k,l,c,d,e,f):!r.sD(k,l,e))||(null!==c&&(r=c(r)),null===r||null!==d&&!d(r)||f.add(r))}}u.v(k);u.v(l)}return e? -p:h}return!1};function Km(a){var b=a.A;if(void 0===b||b===uc)b=null;null===b&&a instanceof X&&(a=a.Pa,null!==a&&(b=a.A));null===b&&(b=xb);return b}function Lm(a){var b=a.B;if(void 0===b||b===uc)b=null;null===b&&a instanceof X&&(a=a.Pa,null!==a&&(b=a.B));null===b&&(b=Vb);return b}A.prototype.add=A.prototype.add=function(a){u.C(a,S,A,"add:element");this.Yd(this.ya.count,a)};A.prototype.elt=A.prototype.ja=function(a){return this.ya.ja(a)}; -A.prototype.insertAt=A.prototype.Yd=function(a,b){b instanceof G&&u.k("Cannot add a Part to a Panel: "+b);if(this===b||this.gl(b))this===b&&u.k("Cannot make a Panel contain itself: "+this.toString()),u.k("Cannot make a Panel indirectly contain itself: "+this.toString()+" already contains "+b.toString());var c=b.S;null!==c&&c!==this&&u.k("Cannot add a GraphObject that already belongs to another Panel to this Panel: "+b.toString()+", already contained by "+c.toString()+", cannot be shared by this Panel: "+ -this.toString());this.oa!==bj||b instanceof X||u.k("Can only add Shapes to a Grid Panel, not: "+b);b.ql(this);b.Wl=null;if(null!==this.QD){var d=b.data;null!==d&&"object"===typeof d&&(null===this.Yf&&(this.Yf=new la(Object,A)),this.Yf.add(d,b))}var e=this.ya,d=-1;if(c===this){for(var f=-1,h=this.ya.n,k=h.length,l=0;l=e.count&&a>=e.count)return;e.hd(f);d=f}else u.k("element "+b.toString()+" has panel "+c.toString()+" but is not contained by it.")}if(0> -a||a>e.count)a=e.count;e.Yd(a,b);this.R();b.R();null!==b.Jd?this.xh=!0:b instanceof A&&!0===b.xh&&(this.xh=!0);c=this.T;null!==c&&(c.Bk=null,c.kj=NaN,this.xh&&c instanceof U&&(c.xh=!0),c.xh&&(c.Qd=null),e=this.g,null!==e&&e.ha.gb||(-1!==d&&c.Dc(ce,"elements",this,b,null,d,null),c.Dc(be,"elements",this,null,b,null,a)))};A.prototype.remove=A.prototype.remove=function(a){u.C(a,S,A,"remove:element");for(var b=this.ya.n,c=b.length,d=-1,e=0;ea&&u.wa(a,">= 0",A,"getRowDefinition:idx");a=Math.round(a);var b=this.yd;if(void 0===b[a]){var c=new Se;c.ql(this);c.ae=!0;c.index=a;b[a]=c}return b[a]};A.prototype.removeRowDefinition=A.prototype.oE=function(a){0>a&&u.wa(a,">= 0",A,"removeRowDefinition:idx");a=Math.round(a);var b=this.yd;this.Dc(ce,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.R()};u.u(A,{ps:"columnCount"},function(){return void 0===this.rd?0:this.rd.length}); -A.prototype.getColumnDefinition=A.prototype.ed=function(a){0>a&&u.wa(a,">= 0",A,"getColumnDefinition:idx");a=Math.round(a);var b=this.rd;if(void 0===b[a]){var c=new Se;c.ql(this);c.ae=!1;c.index=a;b[a]=c}return b[a]};A.prototype.removeColumnDefinition=A.prototype.kE=function(a){0>a&&u.wa(a,">= 0",A,"removeColumnDefinition:idx");a=Math.round(a);var b=this.rd;this.Dc(ce,"coldefs",this,b[a],null,a,null);b[a]&&delete b[a];this.R()}; -u.defineProperty(A,{bI:"rowSizing"},function(){return void 0===this.am?Gm:this.am},function(a){if(void 0!==this.am){var b=this.am;b!==a&&(a!==Gm&&a!==Nm&&u.k("rowSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"),this.am=a,this.R(),this.h("rowSizing",b,a))}}); -u.defineProperty(A,{ZF:"columnSizing"},function(){return void 0===this.Al?Gm:this.Al},function(a){if(void 0!==this.Al){var b=this.Al;b!==a&&(a!==Gm&&a!==Nm&&u.k("columnSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"),this.Al=a,this.R(),this.h("columnSizing",b,a))}}); -u.defineProperty(A,{CK:"topIndex"},function(){return void 0===this.ui?0:this.ui},function(a){if(void 0!==this.ui){var b=this.ui;b!==a&&((!isFinite(a)||0>a)&&u.k("topIndex must be greater than zero and a real number. Was "+a),this.ui=a,this.R(),this.h("topIndex",b,a))}}); -u.defineProperty(A,{OJ:"leftIndex"},function(){return void 0===this.hi?0:this.hi},function(a){if(void 0!==this.hi){var b=this.hi;b!==a&&((!isFinite(a)||0>a)&&u.k("leftIndex must be greater than zero and a real number. Was "+a),this.hi=a,this.R(),this.h("leftIndex",b,a))}});A.prototype.findRowForLocalY=function(a){if(0>a)return-1;if(this.type!==Fl)return NaN;for(var b=0,c=this.yd,d=c.length,e=this.ui;ea)return-1;if(this.type!==Fl)return NaN;for(var b=0,c=this.rd,d=c.length,e=this.hi;ea;)this.Fe(a);a=this.QD;if(null!==a)for(var b=u.qb(a),c=0;cc)){var d=a.getCategoryForItemData(b,c),d=a.findTemplateForItemData(b,c,d);if(null!==d){nf(d);d=d.copy();"object"===typeof b&&(null===a.Yf&&(a.Yf=new la(Object,A)),a.Yf.add(b,d));var e=c;sk(a)&&e++;a.Yd(e,d);tk(a,e,c);d.data=b}}} -function tk(a,b,c){for(a=a.ya;ba&&u.wa(a,">= 0",Se,"height"),this.Qe=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("height",b,a))});u.defineProperty(Se,{width:"width"},function(){return this.Qe},function(a){var b=this.Qe;b!==a&&(0>a&&u.wa(a,">= 0",Se,"width"),this.Qe=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("width",b,a))}); -u.defineProperty(Se,{Ki:"minimum"},function(){return this.oj},function(a){var b=this.oj;b!==a&&((0>a||!isFinite(a))&&u.wa(a,">= 0",Se,"minimum"),this.oj=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("minimum",b,a))});u.defineProperty(Se,{Kf:"maximum"},function(){return this.mj},function(a){var b=this.mj;b!==a&&(0>a&&u.wa(a,">= 0",Se,"maximum"),this.mj=a,this.Qa=this.yb,null!==this.S&&this.S.R(),this.Rc("maximum",b,a))}); -u.defineProperty(Se,{alignment:"alignment"},function(){return this.se},function(a){var b=this.se;b.L(a)||(this.se=a.Z(),null!==this.S&&this.S.R(),this.Rc("alignment",b,a))});u.defineProperty(Se,{stretch:"stretch"},function(){return this.Hh},function(a){var b=this.Hh;b!==a&&(this.Hh=a,null!==this.S&&this.S.R(),this.Rc("stretch",b,a))}); -u.defineProperty(Se,{DE:"separatorPadding"},function(){return this.wj},function(a){"number"===typeof a&&(a=new rb(a));var b=this.wj;null!==a&&null!==b&&b.L(a)||(null!==a&&(a=a.Z()),this.wj=a,null!==this.S&&this.S.R(),this.Rc("separatorPadding",b,a))});u.defineProperty(Se,{dp:"separatorStroke"},function(){return this.Gr},function(a){var b=this.Gr;b!==a&&(null===a||"string"===typeof a||a instanceof ga)&&(a instanceof ga&&a.freeze(),this.Gr=a,null!==this.S&&this.S.R(),this.Rc("separatorStroke",b,a))}); -u.defineProperty(Se,{ep:"separatorStrokeWidth"},function(){return this.Hr},function(a){var b=this.Hr;b!==a&&(this.Hr=a,null!==this.S&&this.S.R(),this.Rc("separatorStrokeWidth",b,a))}); -u.defineProperty(Se,{gI:"separatorDashArray"},function(){return this.Dh},function(a){var b=this.Dh;if(b!==a){null===a||Array.isArray(a)||u.Kd(a,"Array",Se,"separatorDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;ee)){for(var k=c[0],l=c[1],p=0,q=0,r=0,s=m=0,t=q=0,v=u.eb(),x=2;xt){u.ra(v);return}e>m?(B= -e-m,e=m):B=0;var y=Math.sqrt(e*e/(1+r*r));0>p&&(y=-y);k+=y;l+=r*y;a.translate(k,l);a.rotate(s);a.translate(-(h/2),-(f/2));0===B&&d.Mj(a,b);a.translate(h/2,f/2);a.rotate(-s);a.translate(-k,-l);t-=e;m-=e;if(0!==B){q++;if(q===v.length){u.ra(v);return}m=v[q];p=m[0];s=m[1];r=m[2];m=m[3];e=B}}u.ra(v)}} -X.prototype.Mj=function(a,b){if(null!==this.yc||null!==this.jd){null!==this.jd&&yl(this,a,this.jd,!0,!1);null!==this.yc&&yl(this,a,this.yc,!1,!1);var c=this.Sg;if(0===c){var d=this.T;d instanceof lf&&d.type===ah&&d.vc instanceof X&&(c=d.vc.hb)}a.lineWidth=c;a.lineJoin=this.eo;a.lineCap=this.co;a.miterLimit=this.gm;var e=!1;this.T&&b.Qg.drawShadows&&(e=this.T.il);var f=!0;null!==this.yc&&null===this.jd&&(f=!1);var d=!1,h=!0,k=this.gA;null!==k&&(d=!0,void 0!==a.setLineDash?(a.setLineDash(k),a.lineDashOffset= -this.cd):void 0!==a.webkitLineDash?(a.webkitLineDash=k,a.webkitLineDashOffset=this.cd):void 0!==a.mozDash?(a.mozDash=k,a.mozDashOffset=this.cd):h=!1);var l=this.Pa;if(null!==l){if(l.oa===dd)a.beginPath(),d&&!h?kl(a,l.nc,l.uc,l.pb,l.Bb,k,this.cd):(a.moveTo(l.nc,l.uc),a.lineTo(l.pb,l.Bb)),null!==this.jd&&zl(a,this.jd),0!==c&&null!==this.yc&&Bl(a);else if(l.oa===md){var m=l.nc,n=l.uc,p=l.pb,q=l.Bb,l=Math.min(m,p),r=Math.min(n,q),m=Math.abs(p-m),n=Math.abs(q-n);null!==this.jd&&(a.beginPath(),a.rect(l, -r,m,n),zl(a,this.jd));if(null!==this.yc){var s=p=0,t=0;f&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0);d&&!h?(h=u.eb(),h.push(l),h.push(r),h.push(l+m),h.push(r),h.push(l+m),h.push(r+n),h.push(l),h.push(r+n),h.push(l),h.push(r),a.beginPath(),$m(a,h,k,this.cd),Bl(a),u.ra(h)):0!==c&&(a.beginPath(),a.rect(l,r,m,n),Bl(a));f&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t)}}else if(l.oa===nd)m=l.nc,n=l.uc,p=l.pb,q=l.Bb,l=Math.abs(p-m)/ -2,r=Math.abs(q-n)/2,m=Math.min(m,p)+l,n=Math.min(n,q)+r,a.beginPath(),a.moveTo(m,n-r),a.bezierCurveTo(m+K.sa*l,n-r,m+l,n-K.sa*r,m+l,n),a.bezierCurveTo(m+l,n+K.sa*r,m+K.sa*l,n+r,m,n+r),a.bezierCurveTo(m-K.sa*l,n+r,m-l,n+K.sa*r,m-l,n),a.bezierCurveTo(m-l,n-K.sa*r,m-K.sa*l,n-r,m,n-r),a.closePath(),null!==this.jd&&zl(a,this.jd),d&&!h&&(h=u.eb(),K.ye(m,n-r,m+K.sa*l,n-r,m+l,n-K.sa*r,m+l,n,.5,h),K.ye(m+l,n,m+l,n+K.sa*r,m+K.sa*l,n+r,m,n+r,.5,h),K.ye(m,n+r,m-K.sa*l,n+r,m-l,n+K.sa*r,m-l,n,.5,h),K.ye(m-l,n, -m-l,n-K.sa*r,m-K.sa*l,n-r,m,n-r,.5,h),a.beginPath(),$m(a,h,k,this.cd),u.ra(h)),0!==c&&null!==this.yc&&(t=s=p=0,f&&e&&(p=a.shadowOffsetX,s=a.shadowOffsetY,t=a.shadowBlur,a.shadowOffsetX=0,a.shadowOffsetY=0,a.shadowBlur=0),Bl(a),f&&e&&(a.shadowOffsetX=p,a.shadowOffsetY=s,a.shadowBlur=t));else if(l.oa===ad){r=l.Zi;n=r.length;for(q=0;qx.Qf);else for(var v=Hd(x,m),B=v.length,y=0;ye))if(h=b[0],k=b[1],4===e)kl(a,h,k,b[2],b[3],c,d);else{a.moveTo(h,k);for(var n=0,p=0,q=0,r=p=l=0,s=u.eb(),t=2;tr&&(e=r);e>l?(v=e-l,e=l):v=0;var x=Math.sqrt(e*e/ -(1+q*q));0>n&&(x=-x);h+=x;k+=q*x;m?a.lineTo(h,k):a.moveTo(h,k);r-=e;l-=e;if(0!==v){p++;if(p===s.length){u.ra(s);return}l=s[p];n=l[0];q=l[1];l=l[2];e=v}else m=!m}u.ra(s)}}X.prototype.getDocumentPoint=X.prototype.lb=function(a,b){void 0===b&&(b=new w);a.ne()&&u.k("getDocumentPoint:s Spot must be real: "+a.toString());var c=this.Ha,d=this.hb;b.m(a.x*(c.width+d)-d/2+c.x+a.offsetX,a.y*(c.height+d)-d/2+c.y+a.offsetY);this.Ff.ab(b);return b}; -X.prototype.Jj=function(a,b){var c=this.Pa;if(null===c||null===this.fill&&null===this.stroke)return!1;var d=c.kb,e=this.hb/2;c.type!==dd||b||(e+=2);var f=u.Sf();f.assign(d);f.Jf(e+2,e+2);if(!f.Aa(a))return u.ic(f),!1;d=e+1E-4;if(c.type===dd){if(null===this.stroke)return!1;d=(c.F-c.ua)*(a.x-c.ua)+(c.G-c.va)*(a.y-c.va);if(0>(c.ua-c.F)*(a.x-c.F)+(c.va-c.G)*(a.y-c.G)||0>d)return!1;u.ic(f);return K.Hd(c.ua,c.va,c.F,c.G,e,a.x,a.y)}if(c.type===md){var h=c.ua,k=c.va,l=c.F,m=c.G,c=Math.min(h,l),n=Math.min(k, -m),h=Math.abs(l-h),k=Math.abs(m-k);f.x=c;f.y=n;f.width=h;f.height=k;if(null===this.fill){f.Jf(-d,-d);if(f.Aa(a))return u.ic(f),!1;f.Jf(d,d)}null!==this.stroke&&f.Jf(e,e);e=f.Aa(a);u.ic(f);return e}if(c.type===nd){h=c.ua;k=c.va;l=c.F;m=c.G;c=Math.min(h,l);n=Math.min(k,m);h=Math.abs(l-h);k=Math.abs(m-k);h/=2;k/=2;c=a.x-(c+h);n=a.y-(n+k);if(null===this.fill){h-=d;k-=d;if(0>=h||0>=k||1>=c*c/(h*h)+n*n/(k*k))return u.ic(f),!1;h+=d;k+=d}null!==this.stroke&&(h+=e,k+=e);u.ic(f);return 0>=h||0>=k?!1:1>=c*c/ -(h*h)+n*n/(k*k)}if(c.type===ad)return u.ic(f),null===this.fill?Ld(c,a.x,a.y,e):c.Aa(a,e,1=this.hb)n=K.$g(p.nc,p.uc,p.pb,p.Bb,f,h,k,l,e);else{var r=0,s=0;p.nc===p.pb?(r=m,s=0):(b=(p.Bb-p.uc)/(p.pb-p.nc),s=m/Math.sqrt(1+b*b),r=s*b);d=u.eb();b=new w;K.$g(p.nc+ -r,p.uc+s,p.pb+r,p.Bb+s,f,h,k,l,b)&&d.push(b);b=new w;K.$g(p.nc-r,p.uc-s,p.pb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=new w;K.$g(p.nc+r,p.uc+s,p.nc-r,p.uc-s,f,h,k,l,b)&&d.push(b);b=new w;K.$g(p.pb+r,p.Bb+s,p.pb-r,p.Bb-s,f,h,k,l,b)&&d.push(b);b=d.length;if(0===b)return u.ra(d),!1;n=!0;s=Infinity;for(r=0;rMath.abs(c)){n=h-b-c*(f-d);if(0>a*a*c*c+v*v-n*n){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(a*a*c*c+v*v-n*n);k=(-(a*a*c*n)+a*v*m)/(v*v+a*a*c*c)+d;a=(-(a*a*c*n)-a*v*m)/(v*v+a*a*c*c)+d;l=c*(k-d)+n+b;b=c*(a-d)+n+b;d=Math.abs((f-k)*(f-k))+Math.abs((h-l)*(h-l));h=Math.abs((f-a)*(f-a))+Math.abs((h-b)* -(h-b));dk){e.x=NaN;e.y=NaN;n=!1;break a}m=Math.sqrt(k);l=b+m;b-=m;d=Math.abs(l-h);h=Math.abs(b-h);dc?a-c:c-a)<(b>d?b-d:d-b)?(e=be||K.mb(l.y,e))&&(l.ye||K.mb(l.x,e))&&(l.x=h&&d<=a}a=h&&f<=a} -X.prototype.sD=function(a,b,c){function d(a,b){for(var c=a.length,d=0;de)return!0;return!1}if(c&&null!==this.fill&&this.Jj(a,!0))return!0;var e=a.Lj(b);b=e;1.5=e||Ya(b,f,0,-p)>=e||Ya(b,f,0,p)>=e||Ya(b,f,n,0)>=e?!1:!0}else if(f.type=== -ad){h=f.kb;k=h.x;l=h.y;m=h.x+h.width;h=h.y+h.height;if(a.x>m&&a.xh&&a.ye&&Xa(a.x,a.y,k,l,m,l)>e&&Xa(a.x,a.y,m,h,k,h)>e&&Xa(a.x,a.y,m,h,m,l)>e)return!1;b=Math.sqrt(e);if(c){if(null===this.fill?Ld(f,a.x,a.y,b):f.Aa(a,b,!0))return!0}else{c=f.ub;for(b=0;be)return!1;l=k.Fa.n;m=l.length;for(h=0;he)return!1;break;case zd:f=u.eb();K.ye(n,p,q.Rb,q.jc, -q.df,q.ef,q.F,q.G,.8,f);n=d(f,a);u.ra(f);if(n)return!1;n=q.F;p=q.G;if(a.ss(n,p)>e)return!1;break;case Ad:f=u.eb();K.Xo(n,p,q.Rb,q.jc,q.F,q.G,.8,f);n=d(f,a);u.ra(f);if(n)return!1;n=q.F;p=q.G;if(a.ss(n,p)>e)return!1;break;case Bd:case Gd:var q=q.type===Bd?Hd(q,k):Id(q,k,n,p),r=q.length,s=null,f=u.eb();for(b=0;b= 0",X,"strokeWidth:value")});u.defineProperty(X,{qI:"strokeCap"},function(){return this.co},function(a){var b=this.co;b!==a&&("string"!==typeof a||"butt"!==a&&"round"!==a&&"square"!==a?u.wa(a,'"butt", "round", or "square"',X,"strokeCap"):(this.co=a,this.ma(),this.h("strokeCap",b,a)))}); -u.defineProperty(X,{wK:"strokeJoin"},function(){return this.eo},function(a){var b=this.eo;b!==a&&("string"!==typeof a||"miter"!==a&&"bevel"!==a&&"round"!==a?u.wa(a,'"miter", "bevel", or "round"',X,"strokeJoin"):(this.eo=a,this.ma(),this.h("strokeJoin",b,a)))});u.defineProperty(X,{xK:"strokeMiterLimit"},function(){return this.gm},function(a){var b=this.gm;if(b!==a)if(0 0",X,"strokeWidth:value")}); -u.defineProperty(X,{gA:"strokeDashArray"},function(){return this.fm},function(a){var b=this.fm;if(b!==a){null===a||Array.isArray(a)||u.Kd(a,"Array",X,"strokeDashArray:value");if(null!==a){for(var c=a.length,d=0,e=0;em*k*k&&(h=!0);b.Gg!==a&&(h=!1);!1===b.$v("textGreeking")&&(h=!1);for(var m=this.yj,k=this.zj,l=this.ve,n=0;nc&&(p=c);var f=f+m,r=q,q=a,s=f,t=c, -v=d,x=0;h?("start"===this.Rd||"left"===this.Rd?x=0:"end"===this.Rd||"right"===this.Rd?x=t-p:"center"===this.Rd?x=(t-p)/2:u.k("textAlign must be start, end, left, right, or center"),q.fillRect(0+x,s+.25*v,p,1)):("start"===this.Rd||"left"===this.Rd?x=0:"end"===this.Rd||"right"===this.Rd?x=t:"center"===this.Rd?x=t/2:u.k("textAlign must be start, end, left, right, or center"),q.fillText(r,0+x,s+v-.25*v),r=v/20|0,0===r&&(r=1),"end"===this.Rd||"right"===this.Rd?x-=p:"center"===this.Rd&&(x-=p/2),this.Ll&& -(q.beginPath(),q.lineWidth=r,q.moveTo(0+x,s+v-.2*v),q.lineTo(0+x+p,s+v-.2*v),q.stroke()),this.Kl&&(q.beginPath(),q.lineWidth=r,s=s+v-v/2.2|0,0!==r%2&&(s+=.5),q.moveTo(0+x,s),q.lineTo(0+x+p,s),q.stroke()));f+=d+k}}}; -qa.prototype.Oo=function(a,b,c,d){var e=this.ej;e.reset();var f=0,h=0;if(isNaN(this.xa.width)){f=this.ie.replace(/\r\n/g,"\n").replace(/\r/g,"\n");if(0===f.length)f=0;else if(this.iw){for(var k=h=0,l=!1;!l;){var m=f.indexOf("\n",k);-1===m&&(m=f.length,l=!0);k=wn(f.substr(k,m-k).replace(/^\s+|\s+$/g,""),this.Hg);k>h&&(h=k);k=m+1}f=h}else h=f.indexOf("\n",0),0<=h&&(f=f.substr(0,h)),f=k=wn(f,this.Hg);f=Math.min(f,a/this.scale);f=Math.max(8,f)}else f=this.xa.width;null!==this.S&&(f=Math.min(f,this.S.af.width), -f=Math.max(f,this.S.vg.width));h=un(this,f,e);m=h=isNaN(this.xa.height)?Math.min(h,b/this.scale):this.xa.height;if(0!==e.Oe&&1!==e.te.length&&this.Ek===sn&&(b=this.Hg,l=this.Ek===sn?xn(b):0,k=this.yj+this.zj,k=Math.max(0,vn(this)+k),m=Math.max(Math.floor(m/k)-1,0),!(m+1>=e.te.length))){k=e.te[m];for(a=Math.max(1,a-l);wn(k,b)>a&&1=a.ii)return new ia(0,l);if(a.jm===qn){c.wi=1;f=wn(b,k);if(0===h||f<=d)return c.Oe=f,c.gf.push(c.Oe),c.te.push(b),new ia(f,l);var m=yn(b);b=b.substr(m.length);for(var n=yn(b),f=wn(m+n,k);0d&&1d;){n=1;f=wn(m.substr(0,n),k);for(h=0;f<=d;)n++,h=f,f=wn(m.substr(0,n),k);1===n?(c.gf[a.ve+p]=f,e=Math.max(e,f)):(c.gf[a.ve+p]=h,e=Math.max(e,h));n--;1>n&&(n=1);c.te[a.ve+p]=m.substr(0,n);p++;m=m.substr(n);if(a.ve+p>a.ii)break}n=yn(b);for(f=wn(m+n,k);0a.ii))break}c.wi=Math.min(a.ii,p);c.Oe=Math.max(c.Oe,e);return new ia(c.Oe,l*c.wi)}function yn(a){for(var b=a.length,c=0;c=b?a:a.substr(0,c)}function wn(a,b){on!==b&&(on=pn.font=b);return pn.measureText(a).width} -function vn(a){if(null!==a.vn)return a.vn;var b=a.Hg;on!==b&&(on=pn.font=b);var c=0;void 0!==jn[b]&&5E3>kn?c=jn[b]:(c=1.3*pn.measureText("M").width,jn[b]=c,kn++);return a.vn=c}function xn(a){on!==a&&(on=pn.font=a);var b=0;void 0!==ln[a]&&5E3>mn?b=ln[a]:(b=pn.measureText(nn).width,ln[a]=b,mn++);return b} -function un(a,b,c){var d=a.ie.replace(/\r\n/g,"\n").replace(/\r/g,"\n"),e=a.yj+a.zj,e=Math.max(0,vn(a)+e);if(0===d.length)return c.Oe=0,a.ve=1,e;if(!a.iw){var f=d.indexOf("\n",0);0<=f&&(d=d.substr(0,f))}for(var f=0,h=a.ve=0,k=-1,l=!1;!l;)k=d.indexOf("\n",h),-1===k&&(k=d.length,l=!0),h<=k&&(h=d.substr(h,k-h),a.jm!==qn?(c.wi=0,h=tn(a,h,c,b),f+=h.height,a.ve+=c.wi):(tn(a,h,c,b),f+=e,a.ve++),a.ve===a.ii&&(l=!0)),h=k+1;return a.Gu=f} -u.defineProperty(qa,{jA:"textValidation"},function(){return this.Hk},function(a){var b=this.Hk;b!==a&&(null!==a&&u.j(a,"function",qa,"textValidation"),this.Hk=a,this.h("textValidation",b,a))});u.defineProperty(qa,{tK:"spacingAbove"},function(){return this.yj},function(a){var b=this.yj;b!==a&&(this.yj=a,this.h("spacingAbove",b,a))});u.defineProperty(qa,{uK:"spacingBelow"},function(){return this.zj},function(a){var b=this.zj;b!==a&&(this.zj=a,this.h("spacingBelow",b,a))}); -u.defineProperty(qa,{WJ:"maxLines"},function(){return this.ii},function(a){var b=this.ii;b!==a&&(a=Math.floor(a),0>=a&&u.wa(a,"> 0",qa,"maxLines"),this.ii=a,this.h("maxLines",b,a),this.R())});u.u(qa,{XJ:"metrics"},function(){return this.ej});function hn(){this.Oe=this.wi=0;this.gf=[];this.te=[]}hn.prototype.reset=function(){this.Oe=this.wi=0;this.gf=[];this.te=[]};hn.prototype.qs=function(a){this.wi=a.wi;this.Oe=a.Oe;this.gf=u.Pk(a.gf);this.te=u.Pk(a.te)};u.u(hn,{aJ:"arrSize"},function(){return this.gf}); -u.u(hn,{bJ:"arrText"},function(){return this.te});u.u(hn,{VJ:"maxLineWidth"},function(){return this.Oe});function Ri(){S.call(this);this.Me=null;this.Lr="";this.xj=(new z(NaN,NaN,NaN,NaN)).freeze();this.zn=cd;this.Qr=this.Aj=this.kf=null;this.Sx=!1;this.Zn=null;this.JB=0}u.Ga(Ri,S);u.fa("Picture",Ri);var zn=new pa,An=0,Mi=[]; -function Bn(){var a=Mi;if(0===a.length)for(var b=window.document.getElementsByTagName("canvas"),c=b.length,d=0;dr.mo.length&&(Gn(r,4,l,m),Gn(r,16, -l,m));for(var l=r.mo,m=l.length,q=l[0],t=0;te;e++)a.lineTo(d[e].x*b,d[e].y*c); -u.ra(d);P(a);b=a.o;b.A=new L(.2,.22);b.B=new L(.8,.9);u.q(a);return b},DataTransmission:"Hexagon",Hexagon:function(a,b,c){var d=K.Qk(6);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;6>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.07,.25);b.B=new L(.93,.75);u.q(a);return b},Heptagon:function(a,b,c){var d=K.Qk(7);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;7>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.2,.15);b.B=new L(.8,.85);u.q(a);return b},Octagon:function(a, -b,c){var d=K.Qk(8);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;8>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.15,.15);b.B=new L(.85,.85);u.q(a);return b},Nonagon:function(a,b,c){var d=K.Qk(9);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;9>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.17,.13);b.B=new L(.82,.82);u.q(a);return b},Decagon:function(a,b,c){var d=K.Qk(10);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a); -b=a.o;b.A=new L(.16,.16);b.B=new L(.84,.84);u.q(a);return b},Dodecagon:function(a,b,c){var d=K.Qk(12);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.16,.16);b.B=new L(.84,.84);u.q(a);return b},FivePointedStar:function(a,b,c){var d=K.wm(5);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;10>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.312,.383);b.B=new L(.693,.765);u.q(a);return b},SixPointedStar:function(a,b,c){var d= -K.wm(6);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;12>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.17,.251);b.B=new L(.833,.755);u.q(a);return b},SevenPointedStar:function(a,b,c){var d=K.wm(7);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;14>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.363,.361);b.B=new L(.641,.709);u.q(a);return b},EightPointedStar:function(a,b,c){var d=K.wm(8);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;16>e;e++)a.lineTo(d[e].x*b,d[e].y* -c);u.ra(d);P(a);b=a.o;b.A=new L(.252,.255);b.B=new L(.75,.75);u.q(a);return b},NinePointedStar:function(a,b,c){var d=K.wm(9);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;18>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.355,.361);b.B=new L(.645,.651);u.q(a);return b},TenPointedStar:function(a,b,c){var d=K.wm(10);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;20>e;e++)a.lineTo(d[e].x*b,d[e].y*c);u.ra(d);P(a);b=a.o;b.A=new L(.281,.261);b.B=new L(.723,.748);u.q(a);return b},FivePointedBurst:function(a, -b,c){var d=K.uo(5);a=u.p();M(a,d[0].x*b,d[0].y*c,!0);for(var e=1;ea&&(a=.15);var d=u.p(),e=.2*K.sa;M(d,0,.2*c,!0);O(d,0,(.2-e)*c,(.2-e)*b, -0,.2*b,0);d.lineTo(.8*b,0);O(d,(.8+e)*b,0,1*b,(.2-e)*c,1*b,.2*c);d.lineTo(1*b,.8*c);O(d,1*b,(.8+e)*c,(.8+e)*b,1*c,.8*b,1*c);d.lineTo(.2*b,1*c);O(d,(.2-e)*b,1*c,0,(.8+e)*c,0,.8*c);d.lineTo(0,.2*c);M(d,0,a*c,!1);d.lineTo(1*b,a*c);d.$a(!1);b=d.o;b.A=new L(0,a);b.B=new L(1,1-a);u.q(d);return b},DividedProcess:function(a,b,c){a=a?a.xc:NaN;if(isNaN(a)||.1>a)a=.1;var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,0,a*c,!1);d.lineTo(1*b,a*c);d.$a(!1);b=d.o;b.A=new L(0,a);b.B= -Vb;u.q(d);return b},Document:function(a,b,c){c/=.8;a=u.p();M(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);b=a.o;b.A=xb;b.B=new L(1,.6);u.q(a);return b},ExternalOrganization:function(a,b,c){a=a?a.xc:NaN;if(isNaN(a)||.2>a)a=.2;var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,a*b,0,!1);d.lineTo(0,a*c);d.moveTo(1*b,a*c);d.lineTo((1-a)*b,0);d.moveTo(0,(1-a)*c);d.lineTo(a*b,1*c);d.moveTo((1-a)*b,1*c);d.lineTo(1*b,(1- -a)*c);d.$a(!1);b=d.o;b.A=new L(a/2,a/2);b.B=new L(1-a/2,1-a/2);u.q(d);return b},ExternalProcess:function(a,b,c){a=u.p();M(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);P(a);M(a,.1*b,.4*c,!1);a.lineTo(.1*b,.6*c);a.moveTo(.9*b,.6*c);a.lineTo(.9*b,.4*c);a.moveTo(.6*b,.1*c);a.lineTo(.4*b,.1*c);a.moveTo(.4*b,.9*c);a.lineTo(.6*b,.9*c);a.$a(!1);b=a.o;b.A=new L(.25,.25);b.B=new L(.75,.75);u.q(a);return b},File:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c); -a.lineTo(1*b,1*c);a.lineTo(0,1*c);P(a);M(a,.75*b,0,!1);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.25*c);a.$a(!1);b=a.o;b.A=new L(0,.25);b.B=Vb;u.q(a);return b},Interrupt:function(a,b,c){a=u.p();M(a,1*b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);M(a,1*b,.5*c,!1);a.lineTo(1*b,1*c);M(a,1*b,.5*c,!1);a.lineTo(1*b,0);b=a.o;b.A=new L(0,.25);b.B=new L(.5,.75);u.q(a);return b},InternalStorage:function(a,b,c){var d=a?a.xc:NaN;a=a?a.et:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.1);var e=u.p();M(e,0,0,!0);e.lineTo(1* -b,0);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);M(e,d*b,0,!1);e.lineTo(d*b,1*c);e.moveTo(0,a*c);e.lineTo(1*b,a*c);e.$a(!1);b=e.o;b.A=new L(d,a);b.B=Vb;u.q(e);return b},Junction:function(a,b,c){a=u.p();var d=1/Math.SQRT2,e=(1-1/Math.SQRT2)/2,f=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+f)*c,(.5+f)*b,1*c,.5*b,1*c);O(a,(.5-f)*b,1*c,0,(.5+f)*c,0,.5*c);O(a,0,(.5-f)*c,(.5-f)*b,0,.5*b,0);O(a,(.5+f)*b,0,1*b,(.5-f)*c,1*b,.5*c);M(a,(e+d)*b,(e+d)*c,!1);a.lineTo(e*b,e*c);a.moveTo(e*b,(e+d)*c);a.lineTo((e+d)*b,e*c);a.$a(!1); -b=a.o;b.Bd=sh;u.q(a);return b},LinedDocument:function(a,b,c){c/=.8;a=u.p();M(a,0,.7*c,!0);a.lineTo(0,0);a.lineTo(1*b,0);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);M(a,.1*b,0,!1);a.lineTo(.1*b,.75*c);a.$a(!1);b=a.o;b.A=new L(.1,0);b.B=new L(1,.6);u.q(a);return b},LoopLimit:function(a,b,c){a=u.p();M(a,0,1*c,!0);a.lineTo(0,.25*c);a.lineTo(.25*b,0);a.lineTo(.75*b,0);a.lineTo(1*b,.25*c);a.lineTo(1*b,1*c);P(a);b=a.o;b.A=new L(0,.25);b.B=Vb;u.q(a);return b},SequentialData:"MagneticTape",MagneticTape:function(a, -b,c){a=u.p();var d=.5*K.sa;M(a,.5*b,1*c,!0);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,.9*c,.6*b,.9*c);a.lineTo(1*b,.9*c);a.lineTo(1*b,1*c);a.lineTo(.5*b,1*c);b=a.o;b.A=new L(.15,.15);b.B=new L(.85,.8);u.q(a);return b},ManualInput:function(a,b,c){a=u.p();M(a,1*b,0,!0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.25*c);P(a);b=a.o;b.A=new L(0,.25);b.B=Vb;u.q(a);return b},MessageFromUser:function(a,b,c){a=a?a.xc: -NaN;isNaN(a)&&(a=.7);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(a*b,.5*c);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=xb;b.B=new L(a,1);u.q(d);return b},MicroformProcessing:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.25);var d=u.p();M(d,0,0,!0);d.lineTo(.5*b,a*c);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.5*b,(1-a)*c);d.lineTo(0,1*c);P(d);b=d.o;b.A=new L(0,a);b.B=new L(1,1-a);u.q(d);return b},MicroformRecording:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(.75*b,.25*c);a.lineTo(1*b,.15* -c);a.lineTo(1*b,.85*c);a.lineTo(.75*b,.75*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=new L(0,.25);b.B=new L(1,.75);u.q(a);return b},MultiDocument:function(a,b,c){c/=.8;a=u.p();M(a,b,0,!0);a.lineTo(b,.5*c);O(a,.96*b,.47*c,.93*b,.45*c,.9*b,.44*c);a.lineTo(.9*b,.6*c);O(a,.86*b,.57*c,.83*b,.55*c,.8*b,.54*c);a.lineTo(.8*b,.7*c);O(a,.4*b,.4*c,.4*b,1*c,0,.7*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);a.lineTo(.1*b,.1*c);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);P(a);M(a,.1*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.lineTo(.8*b,.54* -c);a.moveTo(.2*b,.1*c);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.44*c);a.$a(!1);b=a.o;b.A=new L(0,.25);b.B=new L(.8,.77);u.q(a);return b},MultiProcess:function(a,b,c){a=u.p();M(a,.1*b,.1*c,!0);a.lineTo(.2*b,.1*c);a.lineTo(.2*b,0);a.lineTo(1*b,0);a.lineTo(1*b,.8*c);a.lineTo(.9*b,.8*c);a.lineTo(.9*b,.9*c);a.lineTo(.8*b,.9*c);a.lineTo(.8*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.2*c);a.lineTo(.1*b,.2*c);P(a);M(a,.2*b,.1*c,!1);a.lineTo(.9*b,.1*c);a.lineTo(.9*b,.8*c);a.moveTo(.1*b,.2*c);a.lineTo(.8*b,.2*c);a.lineTo(.8* -b,.9*c);a.$a(!1);b=a.o;b.A=new L(0,.2);b.B=new L(.8,1);u.q(a);return b},OfflineStorage:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=1-a,e=u.p();M(e,0,0,!0);e.lineTo(1*b,0);e.lineTo(.5*b,1*c);P(e);M(e,.5*a*b,a*c,!1);e.lineTo((1-.5*a)*b,a*c);e.$a(!1);b=e.o;b.A=new L(d/4+.5*a,a);b.B=new L(3*d/4+.5*a,a+.5*d);u.q(e);return b},OffPageConnector:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(.75*b,0);a.lineTo(1*b,.5*c);a.lineTo(.75*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=xb;b.B=new L(.75,1);u.q(a);return b}, -Or:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);M(a,1*b,.5*c,!1);a.lineTo(0,.5*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,0);a.$a(!1);b=a.o;b.Bd=sh;u.q(a);return b},PaperTape:function(a,b,c){c/=.8;a=u.p();M(a,0,.7*c,!0);a.lineTo(0,.3*c);O(a,.5*b,.6*c,.5*b,0,1*b,.3*c);a.lineTo(1*b,.7*c);O(a,.5*b,.4*c,.5*b,1*c,0,.7*c);P(a);b=a.o;b.A=new L(0,.49);b.B= -new L(1,.75);u.q(a);return b},PrimitiveFromCall:function(a,b,c){var d=a?a.xc:NaN;a=a?a.et:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=u.p();M(e,0,0,!0);e.lineTo(1*b,0);e.lineTo((1-a)*b,.5*c);e.lineTo(1*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.A=new L(d,0);b.B=new L(1-a,1);u.q(e);return b},PrimitiveToCall:function(a,b,c){var d=a?a.xc:NaN;a=a?a.et:NaN;isNaN(d)&&(d=.1);isNaN(a)&&(a=.3);var e=u.p();M(e,0,0,!0);e.lineTo((1-a)*b,0);e.lineTo(1*b,.5*c);e.lineTo((1-a)*b,1*c);e.lineTo(0,1*c);P(e);b=e.o;b.A=new L(d, -0);b.B=new L(1-a,1);u.q(e);return b},Subroutine:"Procedure",Procedure:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,(1-a)*b,0,!1);d.lineTo((1-a)*b,1*c);d.moveTo(a*b,0);d.lineTo(a*b,1*c);d.$a(!1);b=d.o;b.A=new L(a,0);b.B=new L(1-a,1);u.q(d);return b},Process:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(0,1*c);P(d);M(d,a*b,0,!1);d.lineTo(a*b,1*c);d.$a(!1); -b=d.o;b.A=new L(a,0);b.B=Vb;u.q(d);return b},Sort:function(a,b,c){a=u.p();M(a,.5*b,0,!0);a.lineTo(1*b,.5*c);a.lineTo(.5*b,1*c);a.lineTo(0,.5*c);P(a);M(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.$a(!1);b=a.o;b.A=new L(.25,.25);b.B=new L(.75,.5);u.q(a);return b},Start:function(a,b,c){a=u.p();M(a,.25*b,0,!0);M(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);M(a,.25*b,0,!1);a.lineTo(.25*b,1*c);a.moveTo(.75*b,0);a.lineTo(.75*b,1*c);a.$a(!1);b=a.o;b.A=new L(.25,0);b.B= -new L(.75,1);u.q(a);return b},Terminator:function(a,b,c){a=u.p();M(a,.25*b,0,!0);a.arcTo(270,180,.75*b,.5*c,.25*b,.5*c);a.arcTo(90,180,.25*b,.5*c,.25*b,.5*c);b=a.o;b.A=new L(.23,0);b.B=new L(.77,1);u.q(a);return b},TransmittalTape:function(a,b,c){a=a?a.xc:NaN;isNaN(a)&&(a=.1);var d=u.p();M(d,0,0,!0);d.lineTo(1*b,0);d.lineTo(1*b,1*c);d.lineTo(.75*b,(1-a)*c);d.lineTo(0,(1-a)*c);P(d);b=d.o;b.A=xb;b.B=new L(1,1-a);u.q(d);return b},AndGate:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,0,0,!0);a.lineTo(.5* -b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=xb;b.B=new L(.55,1);u.q(a);return b},Buffer:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);P(a);b=a.o;b.A=new L(0,.25);b.B=new L(.5,.75);u.q(a);return b},Clock:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c); -M(a,1*b,.5*c,!1);a.lineTo(1*b,.5*c);M(a,.8*b,.75*c,!1);a.lineTo(.8*b,.25*c);a.lineTo(.6*b,.25*c);a.lineTo(.6*b,.75*c);a.lineTo(.4*b,.75*c);a.lineTo(.4*b,.25*c);a.lineTo(.2*b,.25*c);a.lineTo(.2*b,.75*c);a.$a(!1);b=a.o;b.Bd=sh;u.q(a);return b},Ground:function(a,b,c){a=u.p();M(a,.5*b,0,!1);a.lineTo(.5*b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.3*b,.8*c);a.lineTo(.7*b,.8*c);a.moveTo(.4*b,1*c);a.lineTo(.6*b,1*c);b=a.o;u.q(a);return b},Inverter:function(a,b,c){a=u.p();var d=.1*K.sa;M(a,.8* -b,.5*c,!0);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.8*b,.5*c);M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.9+d)*b,.6*c,.9*b,.6*c);O(a,(.9-d)*b,.6*c,.8*b,(.5+d)*c,.8*b,.5*c);O(a,.8*b,(.5-d)*c,(.9-d)*b,.4*c,.9*b,.4*c);O(a,(.9+d)*b,.4*c,1*b,(.5-d)*c,1*b,.5*c);b=a.o;b.A=new L(0,.25);b.B=new L(.4,.75);u.q(a);return b},NandGate:function(a,b,c){a=u.p();var d=K.sa,e=.5*d,f=.4*d,d=.1*d;M(a,.8*b,.5*c,!0);O(a,.8*b,(.5+f)*c,(.4+e)*b,1*c,.4*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(.4*b,0);O(a,(.4+e)*b,0,.8*b,(.5-f)* -c,.8*b,.5*c);M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.9+d)*b,.6*c,.9*b,.6*c);O(a,(.9-d)*b,.6*c,.8*b,(.5+d)*c,.8*b,.5*c);O(a,.8*b,(.5-d)*c,(.9-d)*b,.4*c,.9*b,.4*c);O(a,(.9+d)*b,.4*c,1*b,(.5-d)*c,1*b,.5*c);b=a.o;b.A=new L(0,.05);b.B=new L(.55,.95);u.q(a);return b},NorGate:function(a,b,c){a=u.p();var d=K.sa,e=.5,f=d*e,h=0,k=.5;M(a,.8*b,.5*c,!0);O(a,.7*b,(k+f)*c,(h+f)*b,(k+e)*c,0,1*c);O(a,.25*b,.75*c,.25*b,.25*c,0,0);O(a,(h+f)*b,(k-e)*c,.7*b,(k-f)*c,.8*b,.5*c);e=.1;f=.1*d;h=.9;k=.5;M(a,(h-e)*b,k*c,!0);O(a, -(h-e)*b,(k-f)*c,(h-f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h+f)*b,(k-e)*c,(h+e)*b,(k-f)*c,(h+e)*b,k*c);O(a,(h+e)*b,(k+f)*c,(h+f)*b,(k+e)*c,h*b,(k+e)*c);O(a,(h-f)*b,(k+e)*c,(h-e)*b,(k+f)*c,(h-e)*b,k*c);b=a.o;b.A=new L(.2,.25);b.B=new L(.6,.75);u.q(a);return b},OrGate:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,0,0,!0);O(a,(0+d+d)*b,0*c,.8*b,(.5-d)*c,1*b,.5*c);O(a,.8*b,(.5+d)*c,(0+d+d)*b,1*c,0,1*c);O(a,.25*b,.75*c,.25*b,.25*c,0,0);P(a);b=a.o;b.A=new L(.2,.25);b.B=new L(.75,.75);u.q(a);return b},XnorGate:function(a, -b,c){a=u.p();var d=K.sa,e=.5,f=d*e,h=.2,k=.5;M(a,.1*b,0,!1);O(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);M(a,.8*b,.5*c,!0);O(a,.7*b,(k+f)*c,(h+f)*b,(k+e)*c,.2*b,1*c);O(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);O(a,(h+f)*b,(k-e)*c,.7*b,(k-f)*c,.8*b,.5*c);e=.1;f=.1*d;h=.9;k=.5;M(a,(h-e)*b,k*c,!0);O(a,(h-e)*b,(k-f)*c,(h-f)*b,(k-e)*c,h*b,(k-e)*c);O(a,(h+f)*b,(k-e)*c,(h+e)*b,(k-f)*c,(h+e)*b,k*c);O(a,(h+e)*b,(k+f)*c,(h+f)*b,(k+e)*c,h*b,(k+e)*c);O(a,(h-f)*b,(k+e)*c,(h-e)*b,(k+f)*c,(h-e)*b,k*c);b=a.o;b.A=new L(.4,.25); -b.B=new L(.65,.75);u.q(a);return b},XorGate:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,.1*b,0,!1);O(a,.35*b,.25*c,.35*b,.75*c,.1*b,1*c);M(a,.2*b,0,!0);O(a,(.2+d)*b,0*c,.9*b,(.5-d)*c,1*b,.5*c);O(a,.9*b,(.5+d)*c,(.2+d)*b,1*c,.2*b,1*c);O(a,.45*b,.75*c,.45*b,.25*c,.2*b,0);P(a);b=a.o;b.A=new L(.4,.25);b.B=new L(.8,.75);u.q(a);return b},Capacitor:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},Resistor:function(a,b,c){a=u.p();M(a,0,.5*c,!1);a.lineTo(.1* -b,0);a.lineTo(.2*b,1*c);a.lineTo(.3*b,0);a.lineTo(.4*b,1*c);a.lineTo(.5*b,0);a.lineTo(.6*b,1*c);a.lineTo(.7*b,.5*c);b=a.o;u.q(a);return b},Inductor:function(a,b,c){a=u.p();var d=.1*K.sa,e=.1;M(a,(e-.5*d)*b,c,!1);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.3;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.5;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.7;O(a,(e+.1)*b,0,(e+d)*b,c,e*b,c);O(a,(e-d)*b,c,(e-.1)*b,0,(e+.1)*b,0);e=.9;O(a,(e+.1)*b,0,(e+d)*b,c, -(e+.5*d)*b,c);b=a.o;u.q(a);return b},ACvoltageSource:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,0*b,.5*c,!1);O(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);O(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b,.5*c);a.moveTo(.1*b,.5*c);O(a,.5*b,0*c,.5*b,1*c,.9*b,.5*c);b=a.o;b.Bd=sh;u.q(a);return b},DCvoltageSource:function(a,b,c){a=u.p();M(a,0,.75*c,!1);a.lineTo(0,.25*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},Diode:function(a,b, -c){a=u.p();M(a,1*b,0,!1);a.lineTo(1*b,.5*c);a.lineTo(0,1*c);a.lineTo(0,0);a.lineTo(1*b,.5*c);a.lineTo(1*b,1*c);b=a.o;b.A=new L(0,.25);b.B=new L(.5,.75);u.q(a);return b},Wifi:function(a,b,c){var d=b,e=c;b*=.38;c*=.6;a=u.p();var f=K.sa,h=.8*f,k=.8,l=0,m=.5,d=(d-b)/2,e=(e-c)/2;M(a,l*b+d,(m+k)*c+e,!0);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,l*b+d,(m-k)*c+e,(l-k+.5*h)*b+d,(m-h)*c+e,(l-k+.5*h)*b+d,m*c+e);O(a,(l-k+.5*h)* -b+d,(m+h)*c+e,l*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);P(a);h=.4*f;k=.4;l=.2;m=.5;M(a,l*b+d,(m+k)*c+e,!0);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,l*b+d,(m-k)*c+e,(l-k+.5*h)*b+d,(m-h)*c+e,(l-k+.5*h)*b+d,m*c+e);O(a,(l-k+.5*h)*b+d,(m+h)*c+e,l*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);P(a);h=.2*f;k=.2;m=l=.5;M(a,(l-k)*b+d,m*c+e,!0);O(a,(l-k)*b+d,(m-h)*c+e,(l-h)*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);O(a,(l+h)*b+d,(m-k)*c+e,(l+k)*b+d,(m-h)*c+e, -(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,(l-h)*b+d,(m+k)*c+e,(l-k)*b+d,(m+h)*c+e,(l-k)*b+d,m*c+e);h=.4*f;k=.4;l=.8;m=.5;M(a,l*b+d,(m-k)*c+e,!0);O(a,(l+h)*b+d,(m-k)*c+e,(l+k)*b+d,(m-h)*c+e,(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,l*b+d,(m+k)*c+e,(l+k-.5*h)*b+d,(m+h)*c+e,(l+k-.5*h)*b+d,m*c+e);O(a,(l+k-.5*h)*b+d,(m-h)*c+e,l*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);P(a);h=.8*f;k=.8;l=1;m=.5;M(a,l*b+d,(m-k)*c+e,!0);O(a,(l+h)*b+d,(m- -k)*c+e,(l+k)*b+d,(m-h)*c+e,(l+k)*b+d,m*c+e);O(a,(l+k)*b+d,(m+h)*c+e,(l+h)*b+d,(m+k)*c+e,l*b+d,(m+k)*c+e);O(a,l*b+d,(m+k)*c+e,(l+k-.5*h)*b+d,(m+h)*c+e,(l+k-.5*h)*b+d,m*c+e);O(a,(l+k-.5*h)*b+d,(m-h)*c+e,l*b+d,(m-k)*c+e,l*b+d,(m-k)*c+e);P(a);b=a.o;u.q(a);return b},Email:function(a,b,c){a=u.p();M(a,0,0,!0);a.lineTo(1*b,0);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,0);P(a);M(a,0,0,!1);a.lineTo(.5*b,.6*c);a.lineTo(1*b,0);a.moveTo(0,1*c);a.lineTo(.45*b,.54*c);a.moveTo(1*b,1*c);a.lineTo(.55*b,.54*c);a.$a(!1); -b=a.o;u.q(a);return b},Ethernet:function(a,b,c){a=u.p();M(a,.35*b,0,!0);a.lineTo(.65*b,0);a.lineTo(.65*b,.4*c);a.lineTo(.35*b,.4*c);a.lineTo(.35*b,0);P(a);M(a,.1*b,1*c,!0,!0);a.lineTo(.4*b,1*c);a.lineTo(.4*b,.6*c);a.lineTo(.1*b,.6*c);a.lineTo(.1*b,1*c);P(a);M(a,.6*b,1*c,!0,!0);a.lineTo(.9*b,1*c);a.lineTo(.9*b,.6*c);a.lineTo(.6*b,.6*c);a.lineTo(.6*b,1*c);P(a);M(a,0,.5*c,!1);a.lineTo(1*b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.5*b,.4*c);a.moveTo(.75*b,.5*c);a.lineTo(.75*b,.6*c);a.moveTo(.25*b,.5*c);a.lineTo(.25* -b,.6*c);a.$a(!1);b=a.o;u.q(a);return b},Power:function(a,b,c){a=u.p();var d=K.sa,e=.4*d,f=.4,h=u.K(),k=u.K(),l=u.K(),m=u.K();K.Ai(.5,.5-f,.5+e,.5-f,.5+f,.5-e,.5+f,.5,.5,h,h,k,l,m);var n=u.fc(k.x,k.y);M(a,k.x*b,k.y*c,!0);O(a,l.x*b,l.y*c,m.x*b,m.y*c,(.5+f)*b,.5*c);O(a,(.5+f)*b,(.5+e)*c,(.5+e)*b,(.5+f)*c,.5*b,(.5+f)*c);O(a,(.5-e)*b,(.5+f)*c,(.5-f)*b,(.5+e)*c,(.5-f)*b,.5*c);K.Ai(.5-f,.5,.5-f,.5-e,.5-e,.5-f,.5,.5-f,.5,l,m,k,h,h);O(a,l.x*b,l.y*c,m.x*b,m.y*c,k.x*b,k.y*c);e=.3*d;f=.3;K.Ai(.5-f,.5,.5-f,.5- -e,.5-e,.5-f,.5,.5-f,.5,l,m,k,h,h);a.lineTo(k.x*b,k.y*c);O(a,m.x*b,m.y*c,l.x*b,l.y*c,(.5-f)*b,.5*c);O(a,(.5-f)*b,(.5+e)*c,(.5-e)*b,(.5+f)*c,.5*b,(.5+f)*c);O(a,(.5+e)*b,(.5+f)*c,(.5+f)*b,(.5+e)*c,(.5+f)*b,.5*c);K.Ai(.5,.5-f,.5+e,.5-f,.5+f,.5-e,.5+f,.5,.5,h,h,k,l,m);O(a,m.x*b,m.y*c,l.x*b,l.y*c,k.x*b,k.y*c);P(a);M(a,.45*b,0,!0);a.lineTo(.45*b,.5*c);a.lineTo(.55*b,.5*c);a.lineTo(.55*b,0);P(a);u.v(h);u.v(k);u.v(l);u.v(m);u.v(n);b=a.o;b.A=new L(.25,.55);b.B=new L(.75,.8);u.q(a);return b},Fallout:function(a, -b,c){a=u.p();var d=.5*K.sa;M(a,0*b,.5*c,!0);O(a,0*b,(.5-d)*c,(.5-d)*b,0*c,.5*b,0*c);O(a,(.5+d)*b,0*c,1*b,(.5-d)*c,1*b,.5*c);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0*b,(.5+d)*c,0*b,.5*c);var e=d=0;M(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.4;e=0;P(a);M(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);d=.2;e=-.3;P(a);M(a,(.3+d)*b,(.8+e)*c,!0,!0);a.lineTo((.5+ -d)*b,(.5+e)*c);a.lineTo((.1+d)*b,(.5+e)*c);a.lineTo((.3+d)*b,(.8+e)*c);P(a);b=a.o;b.Bd=sh;u.q(a);return b},IrritationHazard:function(a,b,c){a=u.p();M(a,.2*b,0*c,!0);a.lineTo(.5*b,.3*c);a.lineTo(.8*b,0*c);a.lineTo(1*b,.2*c);a.lineTo(.7*b,.5*c);a.lineTo(1*b,.8*c);a.lineTo(.8*b,1*c);a.lineTo(.5*b,.7*c);a.lineTo(.2*b,1*c);a.lineTo(0*b,.8*c);a.lineTo(.3*b,.5*c);a.lineTo(0*b,.2*c);P(a);b=a.o;b.A=new L(.3,.3);b.B=new L(.7,.7);u.q(a);return b},ElectricalHazard:function(a,b,c){a=u.p();M(a,.37*b,0*c,!0);a.lineTo(.5* -b,.11*c);a.lineTo(.77*b,.04*c);a.lineTo(.33*b,.49*c);a.lineTo(1*b,.37*c);a.lineTo(.63*b,.86*c);a.lineTo(.77*b,.91*c);a.lineTo(.34*b,1*c);a.lineTo(.34*b,.78*c);a.lineTo(.44*b,.8*c);a.lineTo(.65*b,.56*c);a.lineTo(0*b,.68*c);P(a);b=a.o;u.q(a);return b},FireHazard:function(a,b,c){a=u.p();M(a,.1*b,1*c,!0);O(a,-.25*b,.63*c,.45*b,.44*c,.29*b,0*c);O(a,.48*b,.17*c,.54*b,.35*c,.51*b,.42*c);O(a,.59*b,.29*c,.58*b,.28*c,.59*b,.18*c);O(a,.8*b,.34*c,.88*b,.43*c,.75*b,.6*c);O(a,.87*b,.48*c,.88*b,.43*c,.88*b,.31* -c);O(a,1.17*b,.76*c,.82*b,.8*c,.9*b,1*c);P(a);b=a.o;b.A=new L(.05,.645);b.B=new L(.884,.908);u.q(a);return b},BpmnActivityLoop:function(a,b,c){a=u.p();var d=4*(Math.SQRT2-1)/3*.5;M(a,.65*b,1*c,!1);O(a,(1-d+0)*b,1*c,1*b,(.5+d+0)*c,1*b,.5*c);O(a,1*b,(.5-d+0)*c,(.5+d+0)*b,0*c,.5*b,0*c);O(a,(.5-d+0)*b,0*c,0*b,(.5-d+0)*c,0*b,.5*c);O(a,0*b,(.5+d+0)*c,(.5-d+0)*b,1*c,.35*b,.98*c);a.moveTo(.25*b,.8*c);a.lineTo(.35*b,1*c);a.lineTo(.1*b,1*c);b=a.o;u.q(a);return b},BpmnActivityParallel:function(a,b,c){a=u.p(); -M(a,0,0,!1);a.lineTo(0,1*c);a.moveTo(.5*b,0);a.lineTo(.5*b,1*c);a.moveTo(1*b,0);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},BpmnActivitySequential:function(a,b,c){a=u.p();M(a,0,0,!1);a.lineTo(1*b,0);a.moveTo(0,.5*c);a.lineTo(1*b,.5*c);a.moveTo(0,1*c);a.lineTo(1*b,1*c);b=a.o;u.q(a);return b},BpmnActivityAdHoc:function(a,b,c){a=u.p();M(a,0,0,!1);M(a,1*b,1*c,!1);M(a,0,.5*c,!1);O(a,.2*b,.35*c,.3*b,.35*c,.5*b,.5*c);O(a,.7*b,.65*c,.8*b,.65*c,1*b,.5*c);b=a.o;u.q(a);return b},BpmnActivityCompensation:function(a, -b,c){a=u.p();M(a,0,.5*c,!0);a.lineTo(.5*b,0);a.lineTo(.5*b,.5*c);a.lineTo(1*b,1*c);a.lineTo(1*b,0);a.lineTo(.5*b,.5*c);a.lineTo(.5*b,1*c);P(a);b=a.o;u.q(a);return b},BpmnTaskMessage:function(a,b,c){a=u.p();M(a,0,.2*c,!0);a.lineTo(1*b,.2*c);a.lineTo(1*b,.8*c);a.lineTo(0,.8*c);a.lineTo(0,.8*c);P(a);M(a,0,.2*c,!1);a.lineTo(.5*b,.5*c);a.lineTo(1*b,.2*c);a.$a(!1);b=a.o;u.q(a);return b},BpmnTaskScript:function(a,b,c){a=u.p();M(a,.7*b,1*c,!0);a.lineTo(.3*b,1*c);O(a,.6*b,.5*c,0,.5*c,.3*b,0);a.lineTo(.7*b, -0);O(a,.4*b,.5*c,1*b,.5*c,.7*b,1*c);P(a);M(a,.45*b,.73*c,!1);a.lineTo(.7*b,.73*c);a.moveTo(.38*b,.5*c);a.lineTo(.63*b,.5*c);a.moveTo(.31*b,.27*c);a.lineTo(.56*b,.27*c);a.$a(!1);b=a.o;u.q(a);return b},BpmnTaskUser:function(a,b,c){a=u.p();M(a,0,0,!1);M(a,.335*b,(1-.555)*c,!0);a.lineTo(.335*b,.595*c);a.lineTo(.665*b,.595*c);a.lineTo(.665*b,(1-.555)*c);O(a,.88*b,.46*c,.98*b,.54*c,1*b,.68*c);a.lineTo(1*b,1*c);a.lineTo(0,1*c);a.lineTo(0,.68*c);O(a,.02*b,.54*c,.12*b,.46*c,.335*b,(1-.555)*c);a.lineTo(.365* -b,.405*c);var d=.5-.285,e=Math.PI/4,f=4*(1-Math.cos(e))/(3*Math.sin(e)),e=f*d,f=f*d;O(a,(.5-(e+d)/2)*b,(d+(d+f)/2)*c,(.5-d)*b,(d+f)*c,(.5-d)*b,d*c);O(a,(.5-d)*b,(d-f)*c,(.5-e)*b,(d-d)*c,.5*b,(d-d)*c);O(a,(.5+e)*b,(d-d)*c,(.5+d)*b,(d-f)*c,(.5+d)*b,d*c);O(a,(.5+d)*b,(d+f)*c,(.5+(e+d)/2)*b,(d+(d+f)/2)*c,.635*b,.405*c);a.lineTo(.635*b,.405*c);a.lineTo(.665*b,(1-.555)*c);a.lineTo(.665*b,.595*c);a.lineTo(.335*b,.595*c);M(a,.2*b,1*c,!1);a.lineTo(.2*b,.8*c);M(a,.8*b,1*c,!1);a.lineTo(.8*b,.8*c);b=a.o;u.q(a); -return b},BpmnEventConditional:function(a,b,c){a=u.p();M(a,.1*b,0,!0);a.lineTo(.9*b,0);a.lineTo(.9*b,1*c);a.lineTo(.1*b,1*c);P(a);M(a,.2*b,.2*c,!1);a.lineTo(.8*b,.2*c);a.moveTo(.2*b,.4*c);a.lineTo(.8*b,.4*c);a.moveTo(.2*b,.6*c);a.lineTo(.8*b,.6*c);a.moveTo(.2*b,.8*c);a.lineTo(.8*b,.8*c);a.$a(!1);b=a.o;u.q(a);return b},BpmnEventError:function(a,b,c){a=u.p();M(a,0,1*c,!0);a.lineTo(.33*b,0);a.lineTo(.66*b,.5*c);a.lineTo(1*b,0);a.lineTo(.66*b,1*c);a.lineTo(.33*b,.5*c);P(a);b=a.o;u.q(a);return b},BpmnEventEscalation:function(a, -b,c){a=u.p();M(a,0,0,!1);M(a,1*b,1*c,!1);M(a,.1*b,1*c,!0);a.lineTo(.5*b,0);a.lineTo(.9*b,1*c);a.lineTo(.5*b,.5*c);P(a);b=a.o;u.q(a);return b},BpmnEventTimer:function(a,b,c){a=u.p();var d=.5*K.sa;M(a,1*b,.5*c,!0);O(a,1*b,(.5+d)*c,(.5+d)*b,1*c,.5*b,1*c);O(a,(.5-d)*b,1*c,0,(.5+d)*c,0,.5*c);O(a,0,(.5-d)*c,(.5-d)*b,0,.5*b,0);O(a,(.5+d)*b,0,1*b,(.5-d)*c,1*b,.5*c);M(a,.5*b,0,!1);a.lineTo(.5*b,.15*c);a.moveTo(.5*b,1*c);a.lineTo(.5*b,.85*c);a.moveTo(0,.5*c);a.lineTo(.15*b,.5*c);a.moveTo(1*b,.5*c);a.lineTo(.85* -b,.5*c);a.moveTo(.5*b,.5*c);a.lineTo(.58*b,.1*c);a.moveTo(.5*b,.5*c);a.lineTo(.78*b,.54*c);a.$a(!1);b=a.o;b.Bd=sh;u.q(a);return b}};for(var In in K.qg)K.qg[In.toLowerCase()]=In; -K.Hv={"":"",Standard:"F1 m 0,0 l 8,4 -8,4 2,-4 z",Backward:"F1 m 8,0 l -2,4 2,4 -8,-4 z",Triangle:"F1 m 0,0 l 8,4.62 -8,4.62 z",BackwardTriangle:"F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z",Boomerang:"F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z",BackwardBoomerang:"F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z",SidewaysV:"m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z",BackwardV:"m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z",OpenTriangle:"m 0,0 l 8,4 -8,4",BackwardOpenTriangle:"m 8,0 l -8,4 8,4",OpenTriangleLine:"m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8", -BackwardOpenTriangleLine:"m 8,0 l -8,4 8,4 m -8.5,0 l 0,-8",OpenTriangleTop:"m 0,0 l 8,4 m 0,4",BackwardOpenTriangleTop:"m 8,0 l -8,4 m 0,4",OpenTriangleBottom:"m 0,8 l 8,-4",BackwardOpenTriangleBottom:"m 0,4 l 8,4",HalfTriangleTop:"F1 m 0,0 l 0,4 8,0 z m 0,8",BackwardHalfTriangleTop:"F1 m 8,0 l 0,4 -8,0 z m 0,8",HalfTriangleBottom:"F1 m 0,4 l 0,4 8,-4 z",BackwardHalfTriangleBottom:"F1 m 8,4 l 0,4 -8,-4 z",ForwardSemiCircle:"m 4,0 b 270 180 0 4 4",BackwardSemiCircle:"m 4,8 b 90 180 0 -4 4",Feather:"m 0,0 l 3,4 -3,4", -BackwardFeather:"m 3,0 l -3,4 3,4",DoubleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardDoubleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4",TripleFeathers:"m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4",BackwardTripleFeathers:"m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4",ForwardSlash:"m 0,8 l 5,-8",BackSlash:"m 0,0 l 5,8",DoubleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8",DoubleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8",TripleForwardSlash:"m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8", -TripleBackSlash:"m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8",Fork:"m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4",LineFork:"m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4",BackwardLineFork:"m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8",CircleFork:"F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4",BackwardCircleFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3",CircleLineFork:"F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", -BackwardCircleLineFork:"F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3",Circle:"F1 m 8,4 b 0 360 -4 0 4 z",Block:"F1 m 0,0 l 0,8 8,0 0,-8 z",StretchedDiamond:"F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z",Diamond:"F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z",Chevron:"F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z",StretchedChevron:"F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z",NormalArrow:"F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z",X:"m 0,0 l 8,8 m 0,-8 l -8,8",TailedNormalArrow:"F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z", -DoubleTriangle:"F1 m 0,0 l 4,4 -4,4 0,-8 z m 4,0 l 4,4 -4,4 0,-8 z",BigEndArrow:"F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z",ConcaveTailArrow:"F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z",RoundedTriangle:"F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z",SimpleArrow:"F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z",AccelerationArrow:"F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z",BoxArrow:"F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z", -TriangleLine:"F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8",CircleEndedArrow:"F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z",DynamicWidthArrow:"F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z",EquilibriumArrow:"m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3",FastForward:"F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z",Kite:"F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z",HalfArrowTop:"F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8",HalfArrowBottom:"F1 m 0,8 l 4,-4 4,0 -8,4 z", -OpposingDirectionDoubleArrow:"F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z",PartialDoubleTriangle:"F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z",LineCircle:"F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z",DoubleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",TripleLineCircle:"F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z",CircleLine:"F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8",DiamondCircle:"F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z",PlusCircle:"F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8", -OpenRightTriangleTop:"m 8,0 l 0,4 -8,0 m 0,4",OpenRightTriangleBottom:"m 8,8 l 0,-4 -8,0",Line:"m 0,0 l 0,8",DoubleLine:"m 0,0 l 0,8 m 2,0 l 0,-8",TripleLine:"m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8",PentagonArrow:"F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z"};K.jI=function(){if(null!==K.Hv){for(var a in K.Hv){var b=sd(K.Hv[a],!1);K.Qi[a]=b;a.toLowerCase()!==a&&(K.Qi[a.toLowerCase()]=a)}K.Hv=null}}; -K.UC=function(a){K.jI();var b=K.Qi[a];if(void 0===b){b=a.toLowerCase();if("none"===b)return"None";b=K.Qi[b]}return"string"===typeof b?b:b instanceof $c?a:null}; -function G(a){0===arguments.length?A.call(this):A.call(this,a);this.O=311807;this.wk=this.Vh="";this.ur=this.rr=this.Dr=this.xq=null;this.Fr="";this.Th=this.Er=this.bm=null;this.tr="";this.Vn=null;this.sr=(new ia(NaN,NaN)).freeze();this.vr="";this.Wn=null;this.ie="";this.Bu=this.Gp=this.kk=null;this.Mg=(new w(NaN,NaN)).freeze();this.Eq="";this.zk=null;this.Fq=xb;this.Oq=K.fF;this.Hq=K.eF;this.Qp=null;this.yq=Jn;this.em=(new w(6,6)).freeze();this.dm="gray";this.cm=4;this.BB=-1;this.qF=new z;this.Bk= -null;this.kj=NaN}u.Ga(G,A);u.fa("Part",G);G.prototype.cloneProtected=function(a){A.prototype.cloneProtected.call(this,a);a.O=this.O&-4097|49152;a.Vh=this.Vh;a.wk=this.wk;a.xq=this.xq;a.Dr=this.Dr;a.rr=this.rr;a.ur=this.ur;a.Fr=this.Fr;a.Er=this.Er;a.Th=null;a.tr=this.tr;a.sr.assign(this.sr);a.vr=this.vr;a.ie=this.ie;a.Gp=this.Gp;a.Mg.assign(this.Mg);a.Eq=this.Eq;a.Fq=this.Fq.Z();a.Oq=this.Oq.Z();a.Hq=this.Hq.Z();a.Qp=this.Qp;a.yq=this.yq;a.em.assign(this.em);a.dm=this.dm;a.cm=this.cm}; -G.prototype.Mh=function(a){A.prototype.Mh.call(this,a);a.dl();a.bm=null;a.Vn=null;a.Wn=null;a.zk=null;a.Bk=null};G.prototype.toString=function(){var a=u.rg(Object.getPrototypeOf(this))+"#"+u.Uc(this);null!==this.data&&(a+="("+de(this.data)+")");return a};G.LayoutNone=0;var Jj;G.LayoutAdded=Jj=1;var Rj;G.LayoutRemoved=Rj=2;G.LayoutShown=4;G.LayoutHidden=8;G.LayoutNodeSized=16;var Ik;G.LayoutGroupLayout=Ik=32;G.LayoutNodeReplaced=64;var Jn;G.LayoutStandard=Jn=Jj|Rj|28|Ik|64;G.LayoutAll=16777215; -G.prototype.Lm=function(a,b,c,d,e,f,h){var k=this.g;null!==k&&(a===be&&"elements"===b?e instanceof A?Kj(e,function(a){Mj(k,a);Lj(k,a)}):e instanceof Ri&&uk(k,e):a===ce&&"elements"===b&&(e instanceof A?Kj(e,function(a){Qj(k,a);Pj(k,a)}):e instanceof Ri&&vk(k,e)),k.Dc(a,b,c,d,e,f,h))};G.prototype.updateTargetBindings=G.prototype.Nb=function(a){A.prototype.Nb.call(this,a);if(null!==this.data){a=this.ya.n;for(var b=a.length,c=0;ck&&a.y>l&&a.rightk&&b.y>l&&b.right=c.wH)){this.O^=4096;var d=!1;if(null!==c){d=c.cb;c.cb=!0;var e=c.selection;e.La();a?e.add(this):e.remove(this);e.freeze()}this.h("isSelected",b,a);this.Zd();a=this.fI;null!==a&&a(this);null!==c&&(c.de(),c.cb=d)}}}); -u.defineProperty(G,{Wg:"isHighlighted"},function(){return 0!==(this.O&524288)},function(a){var b=0!==(this.O&524288);if(b!==a){this.O^=524288;var c=this.g;null!==c&&(c=c.bw,c.La(),a?c.add(this):c.remove(this),c.freeze());this.h("isHighlighted",b,a);this.ma()}});u.defineProperty(G,{il:"isShadowed"},function(){return 0!==(this.O&8192)},function(a){var b=0!==(this.O&8192);b!==a&&(this.O^=8192,this.h("isShadowed",b,a),this.ma())});function Cj(a){return 0!==(a.O&32768)} -function Ln(a,b){a.O=b?a.O|32768:a.O&-32769}function sl(a,b){a.O=b?a.O|65536:a.O&-65537}function ti(a){return 0!==(a.O&131072)}G.prototype.xf=function(a){this.O=a?this.O|131072:this.O&-131073};function Rn(a,b){a.O=b?a.O|1048576:a.O&-1048577}u.defineProperty(G,{JD:"isAnimated"},function(){return 0!==(this.O&262144)},function(a){var b=0!==(this.O&262144);b!==a&&(this.O^=262144,this.h("isAnimated",b,a))}); -u.defineProperty(G,{Zz:"selectionObjectName"},function(){return this.Fr},function(a){var b=this.Fr;b!==a&&(this.Fr=a,this.bm=null,this.h("selectionObjectName",b,a))});u.defineProperty(G,{eI:"selectionAdornmentTemplate"},function(){return this.Dr},function(a){var b=this.Dr;b!==a&&(this instanceof W&&(a.type=ah),this.Dr=a,this.h("selectionAdornmentTemplate",b,a))}); -u.u(G,{nt:"selectionObject"},function(){if(null===this.bm){var a=this.Zz;null!==a&&""!==a?(a=this.je(a),this.bm=null!==a?a:this):this instanceof W?(a=this.path,this.bm=null!==a?a:this):this.bm=this}return this.bm});u.defineProperty(G,{fI:"selectionChanged"},function(){return this.Er},function(a){var b=this.Er;b!==a&&(null!==a&&u.j(a,"function",G,"selectionChanged"),this.Er=a,this.h("selectionChanged",b,a))}); -u.defineProperty(G,{rE:"resizeAdornmentTemplate"},function(){return this.rr},function(a){var b=this.rr;b!==a&&(this.rr=a,this.h("resizeAdornmentTemplate",b,a))});u.defineProperty(G,{tE:"resizeObjectName"},function(){return this.tr},function(a){var b=this.tr;b!==a&&(this.tr=a,this.Vn=null,this.h("resizeObjectName",b,a))});u.u(G,{sE:"resizeObject"},function(){if(null===this.Vn){var a=this.tE;null!==a&&""!==a?(a=this.je(a),this.Vn=null!==a?a:this):this.Vn=this}return this.Vn}); -u.defineProperty(G,{VH:"resizeCellSize"},function(){return this.sr},function(a){var b=this.sr;b.L(a)||(this.sr=a=a.Z(),this.h("resizeCellSize",b,a))});u.defineProperty(G,{YH:"rotateAdornmentTemplate"},function(){return this.ur},function(a){var b=this.ur;b!==a&&(this.ur=a,this.h("rotateAdornmentTemplate",b,a))});u.defineProperty(G,{ZH:"rotateObjectName"},function(){return this.vr},function(a){var b=this.vr;b!==a&&(this.vr=a,this.Wn=null,this.h("rotateObjectName",b,a))}); -u.u(G,{vE:"rotateObject"},function(){if(null===this.Wn){var a=this.ZH;null!==a&&""!==a?(a=this.je(a),this.Wn=null!==a?a:this):this.Wn=this}return this.Wn});u.defineProperty(G,{text:"text"},function(){return this.ie},function(a){var b=this.ie;b!==a&&(this.ie=a,this.h("text",b,a))}); -u.defineProperty(G,{Ra:"containingGroup"},function(){return this.kk},function(a){if(this.Fd()){var b=this.kk;if(b!==a){null===a||this!==a&&!a.Ph(this)||(this===a&&u.k("Cannot make a Group a member of itself: "+this.toString()),u.k("Cannot make a Group indirectly contain itself: "+this.toString()+" already contains "+a.toString()));this.H(Rj);var c=this.g;null!==b?Sn(b,this):this instanceof V&&null!==c&&c.Ik.remove(this);this.kk=a;null!==a?Tn(a,this):this instanceof V&&null!==c&&c.Ik.add(this);this.H(Jj); -if(null!==c){var d=this.data,e=c.ga;null!==d&&e instanceof Q&&e.Fw(d,e.wb(null!==a?a.data:null))}d=this.bD;null!==d&&(e=!0,null!==c&&(e=c.Na,c.Na=!0),d(this,b,a),null!==c&&(c.Na=e));if(this instanceof V)for(c=new F(G),kf(c,this,!0,0,!0),c=c.i;c.next();)if(d=c.value,d instanceof U)for(d=d.oe;d.next();)xk(d.value);if(this instanceof U)for(d=this.oe;d.next();)xk(d.value);this.h("containingGroup",b,a);null!==a&&a.Jw()}}else u.k("cannot set the Part.containingGroup of a Link or Adornment")});g=G.prototype; -g.dl=function(){var a=this.Ra;null!==a&&(a.R(),null!==a.Pb&&a.Pb.R(),a.sf())};g.ma=function(){var a=this.g;null!==a&&!Bj(this)&&!Cj(this)&&this.Ea()&&this.Xb.J()&&a.ma(yi(this,this.Xb))};g.Js=function(a){var b=this.kk;null===b||a||Tn(b,this)};g.Ks=function(a){var b=this.kk;null===b||a||Sn(b,this)};g.xm=function(){var a=this.data;if(null!==a){var b=this.g;null!==b&&(b=b.ga,null!==b&&b.Vz(a))}}; -u.defineProperty(G,{bD:"containingGroupChanged"},function(){return this.Gp},function(a){var b=this.Gp;b!==a&&(null!==a&&u.j(a,"function",G,"containingGroupChanged"),this.Gp=a,this.h("containingGroupChanged",b,a))});G.prototype.findSubGraphLevel=function(){return Un(this,this)};function Un(a,b){var c=b.Ra;return null!==c?1+Un(a,c):b instanceof U&&(c=b.ce,null!==c)?Un(a,c):0}G.prototype.findTopLevelPart=function(){return Vn(this,this)}; -function Vn(a,b){var c=b.Ra;return null!==c?Vn(a,c):b instanceof U&&(c=b.ce,null!==c)?Vn(a,c):b}u.u(G,{Ho:"isTopLevel"},function(){return null!==this.Ra||this instanceof U&&this.tf?!1:!0});G.prototype.isMemberOf=G.prototype.Ph=function(a){return a instanceof V?Wn(this,this,a):!1};function Wn(a,b,c){if(b===c||null===c)return!1;var d=b.Ra;return null===d||d!==c&&!Wn(a,d,c)?b instanceof U&&(b=b.ce,null!==b)?Wn(a,b,c):!1:!0} -G.prototype.findCommonContainingGroup=G.prototype.yG=function(a){if(null===a)return null;if(this===a)return this instanceof V?this:null;for(var b=this;null!==b;)b instanceof V&&Rn(b,!0),b=b.Ra;for(var c=null,b=a;null!==b;){if(0!==(b.O&1048576)){c=b;break}b=b.Ra}for(b=this;null!==b;)b instanceof V&&Rn(b,!1),b=b.Ra;return c};u.defineProperty(G,{nH:"layoutConditions"},function(){return this.yq},function(a){var b=this.yq;b!==a&&(this.yq=a,this.h("layoutConditions",b,a))}); -G.prototype.canLayout=function(){if(!this.OD||!this.Ea())return!1;var a=this.layer;return null!==a&&a.Ac||this instanceof U&&this.tf?!1:!0};G.prototype.invalidateLayout=G.prototype.H=function(a){void 0===a&&(a=16777215);var b;this.OD&&0!==(a&this.nH)?(b=this.layer,null!==b&&b.Ac||this instanceof U&&this.tf?b=!1:(b=this.g,b=null!==b&&b.ha.gb?!1:!0)):b=!1;if(b)if(b=this.kk,null!==b){var c=b.Qb;null!==c?c.H():b.H(a)}else a=this.g,null!==a&&(c=a.Qb,null!==c&&c.H())}; -function Oj(a){if(!a.Ea())return!1;a=a.layer;return null!==a&&a.Ac?!1:!0}u.defineProperty(G,{mD:"dragComputation"},function(){return this.Qp},function(a){var b=this.Qp;b!==a&&(null!==a&&u.j(a,"function",G,"dragComputation"),this.Qp=a,this.h("dragComputation",b,a))});u.defineProperty(G,{kI:"shadowOffset"},function(){return this.em},function(a){var b=this.em;b.L(a)||(this.em=a=a.Z(),this.ma(),this.h("shadowOffset",b,a))}); -u.defineProperty(G,{shadowColor:"shadowColor"},function(){return this.dm},function(a){var b=this.dm;b!==a&&(this.dm=a,this.ma(),this.h("shadowColor",b,a))});u.defineProperty(G,{shadowBlur:"shadowBlur"},function(){return this.cm},function(a){var b=this.cm;b!==a&&(this.cm=a,this.ma(),this.h("shadowBlur",b,a))});function lf(a){0===arguments.length?G.call(this,vh):G.call(this,a);this.wf="Adornment";this.Gb=null;this.O&=-257;this.Mg=new w(NaN,NaN);this.Vi=new E(z);this.Pb=null}u.Ga(lf,G); -u.fa("Adornment",lf);lf.prototype.toString=function(){var a=this.Kh;return"Adornment("+this.Kc+")"+(null!==a?a.toString():"")};lf.prototype.updateRelationshipsFromData=function(){};lf.prototype.Xs=function(){var a=this.vc.T,b=this.vc;if(a instanceof W&&b instanceof X){var c=a.path,b=c.Pa;a.Xs();for(var b=c.Pa,a=this.ya.n,c=a.length,d=0;da&&(a=1);var b=this.g;if(null!==b&&!b.me){var c=b.Lb;0!==b.ha.Le&&c.ml();b.me=!0;var c=b.qd,d=new F(U);d.add(this);jo(this,d,c,a,this.Vc);b.me=!1}}; -function jo(a,b,c,d,e){if(1a&&(a=2);var b=this.g;if(null!==b&&!b.me){var c=b.Lb;0!==b.ha.Le&&c.ml();b.me=!0;var d=b.qd,e=new F(U);e.add(this);lo(this,e,d,a,this.Vc,c,this);b.me=!1}}; -function lo(a,b,c,d,e,f,h){for(var k=c?a.Wv():a.og();k.next();){var l=k.value;l.Bc&&(e||l.hg||l.Vb(),l=l.hz(a),null!==l&&l!==a&&!b.contains(l)&&(b.add(l),e||(l.He(!0),l.dl(),ri(f,l,h)),2a&&(a-=180);break;case ro:a=K.ct(c+90);90a&&(a-=180);break;case so:a=K.ct(c-90);90a&&(a-=180);break;case to:a=K.ct(c);if(45a||225a)return 0;90a&&(a-=180)}return K.ct(a)}; -u.defineProperty(W,{W:"fromNode"},function(){return this.Wf},function(a){var b=this.Wf;if(b!==a){var c=this.od;null!==b&&(this.gg!==b&&fo(b,this,c),uo(this),this.H(Rj));this.Wf=a;this.di=null;this.Vb();var d=this.g;if(null!==d){var e=this.data,f=d.ga;if(null!==e)if(f instanceof Q){var h=null!==a?a.data:null;f.Ew(e,f.wb(h))}else f instanceof qe&&(h=null!==a?a.data:null,d.qd?f.ih(e,f.wb(h)):(null!==b&&f.ih(b.data,void 0),f.ih(h,f.wb(null!==this.gg?this.gg.data:null))))}e=this.od;f=this.wD;null!==f&& -(h=!0,null!==d&&(h=d.Na,d.Na=!0),f(this,c,e),null!==d&&(d.Na=h));null!==a&&(this.gg!==a&&eo(a,this,e),vo(this),this.H(Jj));this.h("fromNode",b,a);xk(this)}}); -u.defineProperty(W,{pg:"fromPortId"},function(){return this.wh},function(a){var b=this.wh;if(b!==a){var c=this.od;null!==c&&co(this.W,c);uo(this);this.wh=a;var d=this.od;null!==d&&co(this.W,d);var e=this.g;if(null!==e){var f=this.data,h=e.ga;null!==f&&h instanceof Q&&h.aA(f,a)}c!==d&&(this.di=null,this.Vb(),f=this.wD,null!==f&&(h=!0,null!==e&&(h=e.Na,e.Na=!0),f(this,c,d),null!==e&&(e.Na=h)));vo(this);this.h("fromPortId",b,a)}});u.u(W,{od:"fromPort"},function(){var a=this.Wf;return null===a?null:a.Xk(this.wh)}); -u.defineProperty(W,{wD:"fromPortChanged"},function(){return this.Yp},function(a){var b=this.Yp;b!==a&&(null!==a&&u.j(a,"function",W,"fromPortChanged"),this.Yp=a,this.h("fromPortChanged",b,a))}); -u.defineProperty(W,{ca:"toNode"},function(){return this.gg},function(a){var b=this.gg;if(b!==a){var c=this.fe;null!==b&&(this.Wf!==b&&fo(b,this,c),uo(this),this.H(Rj));this.gg=a;this.di=null;this.Vb();var d=this.g;if(null!==d){var e=this.data,f=d.ga;if(null!==e)if(f instanceof Q){var h=null!==a?a.data:null;f.Gw(e,f.wb(h))}else f instanceof qe&&(h=null!==a?a.data:null,d.qd?(null!==b&&f.ih(b.data,void 0),f.ih(h,f.wb(null!==this.Wf?this.Wf.data:null))):f.ih(e,f.wb(h)))}e=this.fe;f=this.PE;null!==f&& -(h=!0,null!==d&&(h=d.Na,d.Na=!0),f(this,c,e),null!==d&&(d.Na=h));null!==a&&(this.Wf!==a&&eo(a,this,e),vo(this),this.H(Jj));this.h("toNode",b,a);xk(this)}}); -u.defineProperty(W,{lh:"toPortId"},function(){return this.Ih},function(a){var b=this.Ih;if(b!==a){var c=this.fe;null!==c&&co(this.ca,c);uo(this);this.Ih=a;var d=this.fe;null!==d&&co(this.ca,d);var e=this.g;if(null!==e){var f=this.data,h=e.ga;null!==f&&h instanceof Q&&h.eA(f,a)}c!==d&&(this.di=null,this.Vb(),f=this.PE,null!==f&&(h=!0,null!==e&&(h=e.Na,e.Na=!0),f(this,c,d),null!==e&&(e.Na=h)));vo(this);this.h("toPortId",b,a)}});u.u(W,{fe:"toPort"},function(){var a=this.gg;return null===a?null:a.Xk(this.Ih)}); -u.defineProperty(W,{PE:"toPortChanged"},function(){return this.Ur},function(a){var b=this.Ur;b!==a&&(null!==a&&u.j(a,"function",W,"toPortChanged"),this.Ur=a,this.h("toPortChanged",b,a))});u.defineProperty(W,{vb:"fromSpot"},function(){return null!==this.Q?this.Q.cj:uc},function(a){null===this.Q&&this.Ee();var b=this.Q.cj;b.L(a)||(a=a.Z(),this.Q.cj=a,this.h("fromSpot",b,a),this.Vb())}); -u.defineProperty(W,{Yk:"fromEndSegmentLength"},function(){return null!==this.Q?this.Q.aj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.aj;b!==a&&(0>a&&u.wa(a,">= 0",W,"fromEndSegmentLength"),this.Q.aj=a,this.h("fromEndSegmentLength",b,a),this.Vb())});u.defineProperty(W,{Es:"fromEndSegmentDirection"},function(){return null!==this.Q?this.Q.$i:Yn},function(a){null===this.Q&&this.Ee();var b=this.Q.$i;b!==a&&(this.Q.$i=a,this.h("fromEndSegmentDirection",b,a),this.Vb())}); -u.defineProperty(W,{Fs:"fromShortLength"},function(){return null!==this.Q?this.Q.bj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.bj;b!==a&&(this.Q.bj=a,this.h("fromShortLength",b,a),this.Vb())});u.defineProperty(W,{xb:"toSpot"},function(){return null!==this.Q?this.Q.Ej:uc},function(a){null===this.Q&&this.Ee();var b=this.Q.Ej;b.L(a)||(a=a.Z(),this.Q.Ej=a,this.h("toSpot",b,a),this.Vb())}); -u.defineProperty(W,{vl:"toEndSegmentLength"},function(){return null!==this.Q?this.Q.Cj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.Cj;b!==a&&(0>a&&u.wa(a,">= 0",W,"toEndSegmentLength"),this.Q.Cj=a,this.h("toEndSegmentLength",b,a),this.Vb())});u.defineProperty(W,{wt:"toEndSegmentDirection"},function(){return null!==this.Q?this.Q.Bj:Yn},function(a){null===this.Q&&this.Ee();var b=this.Q.Bj;b!==a&&(this.Q.Bj=a,this.h("toEndSegmentDirection",b,a),this.Vb())}); -u.defineProperty(W,{yt:"toShortLength"},function(){return null!==this.Q?this.Q.Dj:NaN},function(a){null===this.Q&&this.Ee();var b=this.Q.Dj;b!==a&&(this.Q.Dj=a,this.h("toShortLength",b,a),this.Vb())});function xk(a){var b=a.W,c=a.ca;null!==b?null!==c?wo(a,b.yG(c)):wo(a,null):wo(a,null)}function wo(a,b){var c=a.kk;if(c!==b){null!==c&&Sn(c,a);a.kk=b;null!==b&&Tn(b,a);var d=a.bD;if(null!==d){var e=!0,f=a.g;null!==f&&(e=f.Na,f.Na=!0);d(a,c,b);null!==f&&(f.Na=e)}!a.hg||a.oC!==c&&a.qC!==c||a.Vb()}} -W.prototype.dl=function(){var a=this.Ra;null!==a&&this.W!==a&&this.ca!==a&&G.prototype.dl.call(this)};W.prototype.getOtherNode=W.prototype.hz=function(a){var b=this.W;return a===b?this.ca:b};W.prototype.getOtherPort=function(a){var b=this.od;return a===b?this.fe:b};u.u(W,{EJ:"isLabeledLink"},function(){return null===this.ue?!1:0=d&&(h=d-1);var l=this.l(h-1),f=this.l(h);K.oo(e.x,e.y,k.x,k.y,l.x,l.y,f.x,f.y,.5,a);b=Math.min(f.x,b);c=Math.min(f.y,c);e=f}else for(e=this.l(0),f=this.l(1),b=Math.min(e.x,f.x),c=Math.min(e.y,f.y),a.m(e.x,e.y,0,0),a.Oi(f),h=2;hc&&(c=-c)):K.mb(c.y,d.y)?(c=d.x-c.x,0>c&&(c=-c)):c=Math.sqrt(c.Lj(d)),f.push(c),e+=c;for(d=h=c=0;ce/2)break;c+=d;h++}u.ra(f);b=this.l(h);f=this.l(h+1);b.x===f.x?b.y>f.y?a.m(b.x,b.y-(e/2-c)):a.m(b.x,b.y+(e/2-c)):b.y===f.y?b.x>f.x?a.m(b.x-(e/2-c),b.y):a.m(b.x+(e/2-c),b.y):(e=(e/2-c)/d,a.m(b.x+e*(f.x-b.x),b.y+e*(f.y-b.y)));return a};u.u(W,{WD:"midAngle"},function(){this.updateRoute();return this.computeMidAngle()}); -W.prototype.computeMidAngle=function(){var a=this.ka;if(2>a)return NaN;if(this.computeCurve()===kh&&4<=a&&!this.dc){var b=(a-1)/3|0,c=3*(b/2|0);if(1===b%2){var c=Math.floor(c),a=this.l(c),b=this.l(c+1),d=this.l(c+2),c=this.l(c+3);return K.TF(a.x,a.y,b.x,b.y,d.x,d.y,c.x,c.y)}if(0e?a.Fi(b):b.Fi(d)}; -u.defineProperty(W,{points:"points"},function(){return this.Qc},function(a){var b=this.Qc;if(b!==a){var c=null;if(Array.isArray(a)){var d=0===a.length%2;if(d)for(var e=0;ep&&(t-=180));0>t?t+=360:360<=t&&(t-=360);k&&(v+=Math.abs(p));0===t?r=v:90===t?s=v:180===t?r=-v:270===t?s=-v:(r=v*Math.cos(t*Math.PI/180),s=v*Math.sin(t*Math.PI/180));if(f.ne()&&k){var x=c.lb(Ib,u.K()),B=u.fc(x.x+1E3*r,x.y+1E3*s);this.getLinkPointFromPoint(b,c,x,B,!0,q);u.v(x);u.v(B)}}var v=this.getLinkPoint(d,e,h,!1,l,b,c),y=0,C=0,I=0;if(l||h!==vb||k)x= -this.computeEndSegmentLength(d,e,h,!1),I=this.getLinkDirection(d,e,v,h,!1,l,b,c),k&&(I+=l?0:30,0>p&&(I+=180)),0>I?I+=360:360<=I&&(I-=360),k&&(x+=Math.abs(p)),0===I?y=x:90===I?C=x:180===I?y=-x:270===I?C=-x:(y=x*Math.cos(I*Math.PI/180),C=x*Math.sin(I*Math.PI/180)),h.ne()&&k&&(x=e.lb(Ib,u.K()),B=u.fc(x.x+1E3*y,x.y+1E3*C),this.getLinkPointFromPoint(d,e,x,B,!1,v),u.v(x),u.v(B));e=q;if(l||f!==vb||k)e=new w(q.x+r,q.y+s);c=v;if(l||h!==vb||k)c=new w(v.x+y,v.y+C);!n&&!l&&f===vb&&3k&&(m=-m),r=(0>h?-1:1)*m+q,s=l*(r-q)+t),q=a.x+2*f/3,t=a.y+2*h/3,v=q,y=t,K.D(h,0)?y=0h?-1:1)*m+q,y=l*(v-q)+t),this.so(),this.Jh(a),this.Lk(r,s),this.Lk(v,y),this.Jh(n),this.yf(0, -this.getLinkPoint(b,c,vb,!0,!1,d,e)),this.yf(3,this.getLinkPoint(d,e,vb,!1,!1,b,c))):(a=d,d=this.getLinkPoint(b,c,vb,!0,!1,a,e),e=this.getLinkPoint(a,e,vb,!1,!1,b,c),this.hasCurviness()?(h=e.x-d.x,b=e.y-d.y,c=this.computeCurviness(),a=d.x+h/2,n=d.y+b/2,f=a,k=n,K.D(b,0)?k=0c&&(f=-f),f=(0>b?-1:1)*f+a,k=h*(f-a)+n),this.Jh(d),this.Lk(f,k)):this.Jh(d),this.Jh(e)));return!0}; -function Co(a,b){Math.abs(b.x-a.x)>Math.abs(b.y-a.y)?(b.x=b.x>=a.x?a.x+9E9:a.x-9E9,b.y=a.y):(b.y=b.y>=a.y?a.y+9E9:a.y-9E9,b.x=a.x);return b} -W.prototype.getLinkPointFromPoint=function(a,b,c,d,e,f){void 0===f&&(f=new w);if(null===a||null===b)return f.assign(c),f;a.Ea()||(e=a.findVisibleNode(),null!==e&&e!==a&&(b=e.port));var h=e=0,k=0,l=0;a=null;e=b.S;null===e||e.Tf()||(e=e.S);if(null===e)e=d.x,h=d.y,k=c.x,l=c.y;else{a=e.Ff;e=1/(a.m11*a.m22-a.m12*a.m21);var k=a.m22*e,l=-a.m12*e,m=-a.m21*e,n=a.m11*e,p=e*(a.m21*a.dy-a.m22*a.dx),q=e*(a.m12*a.dx-a.m11*a.dy);e=d.x*k+d.y*m+p;h=d.x*l+d.y*n+q;k=c.x*k+c.y*m+p;l=c.x*l+c.y*n+q}b.Co(e,h,k,l,f);null!== -a&&f.transform(a);return f};function Do(a,b){var c=b.jr;null===c&&(c=new Eo,c.port=b,c.Cc=b.T,b.jr=c);return Fo(c,a)} -W.prototype.getLinkPoint=function(a,b,c,d,e,f,h,k){void 0===k&&(k=new w);if(c.pd())return b.lb(c,k),k;if(c.Go()&&(c=Do(this,b),null!==c)){k.assign(c.Lo);if(e&&this.zw===mo){var l=Do(this,h);if(c.vm=m.x&&a.x<=m.x+m.width?k.x=a.x:a.y>=m.y&&a.y<=m.y+m.height&&(k.y=a.y);u.v(c);u.v(l)}}return k}f=b.lb(Ib,u.K());l=c=null;this.ka>(e?6:2)?(l=d?this.l(1):this.l(this.ka-2),e&&(l=Co(f,l.copy()))): -(c=u.K(),l=h.lb(Ib,c),e&&(l=Co(f,l)));this.getLinkPointFromPoint(a,b,f,l,d,k);u.v(f);null!==c&&u.v(c);return k}; -W.prototype.getLinkDirection=function(a,b,c,d,e,f,h,k){a:if(d.pd())c=d.x>d.y?d.x>1-d.y?0:d.x<1-d.y?270:315:d.x1-d.y?90:d.x<1-d.y?180:135:.5>d.x?225:.5(f?6:2)?(n=e?this.l(1):this.l(this.ka-2),n=f?Co(l,n.copy()):c):(m=u.K(),n=k.lb(Ib,m));c=0;c=Math.abs(n.x-l.x)>Math.abs(n.y-l.y)?n.x>= -l.x?0:180:n.y>=l.y?90:270;u.v(l);null!==m&&u.v(m)}d.ne()&&h.Ph(a)&&(c+=180,360<=c&&(c-=360));a=Yn;a=e?this.Es:this.wt;a===Yn&&(a=e?b.Es:b.wt);switch(a){case Zn:b=b.Zk();c+=b;360<=c&&(c-=360);break;case Yn:case jl:b=b.Zk();if(0===b)break;45<=b&&135>b?c+=90:135<=b&&225>b?c+=180:225<=b&&315>b&&(c+=270);360<=c&&(c-=360)}return c}; -W.prototype.computeEndSegmentLength=function(a,b,c,d){if(null!==b&&c.Go()&&(a=Do(this,b),null!==a))return a.Sv;a=NaN;a=d?this.Yk:this.vl;null!==b&&isNaN(a)&&(a=d?b.Yk:b.vl);isNaN(a)&&(a=10);return a};W.prototype.computeSpot=function(a){return a?Ao(this,this.od):Bo(this,this.fe)};function Ao(a,b){if(null===b)return Ib;var c=a.vb;c.Lc()&&(void 0===b&&(b=a.od),null!==b&&(c=b.vb));return c===uc?vb:c} -function Bo(a,b){if(null===b)return Ib;var c=a.xb;c.Lc()&&(void 0===b&&(b=a.fe),null!==b&&(c=b.xb));return c===uc?vb:c}W.prototype.computeOtherPoint=function(a,b){var c=b.lb(Ib),d;d=b.jr;d=null!==d?Fo(d,this):null;null!==d&&(c=d.Lo);return c};W.prototype.computeShortLength=function(a){return a?Go(this):Ho(this)};function Go(a){var b=a.Fs;isNaN(b)&&(a=a.od,null!==a&&(b=a.Fs));return isNaN(b)?0:b}function Ho(a){var b=a.yt;isNaN(b)&&(a=a.fe,null!==a&&(b=a.yt));return isNaN(b)?0:b} -W.prototype.Nj=function(a,b,c,d,e,f){if(!1===this.Ag)return!1;void 0===b&&(b=null);void 0===c&&(c=null);var h=f;void 0===f&&(h=u.jh(),h.reset());h.multiply(this.transform);if(this.sm(a,h))return Um(this,b,c,e),void 0===f&&u.Ye(h),!0;if(this.sg(a,h)){var k=!1;if(!this.Kg)for(var l=this.ya.n,m=l.length;m--;){var n=l[m];if(n.visible||n===this.ec){var p=n.ba,q=this.Ha;if(!(p.x>q.width||p.y>q.height||0>p.x+p.width||0>p.y+p.height)){p=u.jh();p.set(h);if(n instanceof A)k=n.Nj(a,b,c,d,e,p);else if(this.path=== -n){var k=n,r=a,s=d,q=p;if(!1===k.Ag)k=!1;else if(q.multiply(k.transform),s)b:{var t=r,v=q;if(k.sm(t,v))k=!0;else{if(void 0===v&&(v=k.transform,t.Kj(k.ba))){k=!0;break b}var q=t.left,r=t.right,s=t.top,t=t.bottom,x=u.K(),B=u.K(),y=u.K(),C=u.jh();C.set(v);C.aE(k.transform);C.oz();B.x=r;B.y=s;B.transform(C);x.x=q;x.y=s;x.transform(C);v=!1;cn(k,x,B,y)?v=!0:(x.x=r,x.y=t,x.transform(C),cn(k,x,B,y)?v=!0:(B.x=q,B.y=t,B.transform(C),cn(k,x,B,y)?v=!0:(x.x=q,x.y=s,x.transform(C),cn(k,x,B,y)&&(v=!0))));u.Ye(C); -u.v(x);u.v(B);u.v(y);k=v}}else k=k.sm(r,q)}else k=ol(n,a,d,p);k&&(null!==b&&(n=b(n)),n&&(null===c||c(n))&&e.add(n));u.Ye(p)}}}void 0===f&&u.Ye(h);return k||null!==this.background||null!==this.nm}void 0===f&&u.Ye(h);return!1};u.u(W,{dc:"isOrthogonal"},function(){return 2===(this.Yl.value&2)});u.u(W,{el:"isAvoiding"},function(){return 4===(this.Yl.value&4)});W.prototype.computeCurve=function(){if(null===this.di){var a=this.od,b=this.dc;this.di=null!==a&&a===this.fe&&!b}return this.di?kh:this.Ve}; -W.prototype.computeCorner=function(){if(this.Ve===kh)return 0;var a=this.Yy;if(isNaN(a)||0>a)a=10;return a};W.prototype.computeCurviness=function(){var a=this.Ov;if(isNaN(a)){var b=this.hf;if(0!==b){var a=10,c=this.g;null!==c&&(a=c.ow);c=Math.abs(b);a=a/2+((c-1)/2|0)*a;0===c%2&&(a=-a);0>b&&(a=-a)}else a=10}return a};W.prototype.computeThickness=function(){var a=this.path;return null!==a?Math.max(a.hb,1):1};W.prototype.hasCurviness=function(){return!isNaN(this.Ov)||0!==this.hf&&!this.dc}; -W.prototype.adjustPoints=function(a,b,c,d){var e=this.es;if(this.dc){if(e===Vl)return!1;e===Wl&&(e=Ul)}switch(e){case Vl:var f=this.l(a),h=this.l(c);if(!f.L(b)||!h.L(d)){var e=f.x,f=f.y,k=h.x-e,l=h.y-f,m=Math.sqrt(k*k+l*l);if(!K.D(m,0)){var n=0;K.D(k,0)?n=0>l?-Math.PI/2:Math.PI/2:(n=Math.atan(l/Math.abs(k)),0>k&&(n=Math.PI-n));var h=b.x,p=b.y,l=d.x-h,q=d.y-p,r=Math.sqrt(l*l+q*q),k=0;K.D(l,0)?k=0>q?-Math.PI/2:Math.PI/2:(k=Math.atan(q/Math.abs(l)),0>l&&(k=Math.PI-k));m=r/m;n=k-n;this.yf(a,b);for(a+= -1;al?-Math.PI/2:Math.PI/2:(q=Math.atan(l/Math.abs(k)),0>k&&(q=Math.PI-q)),k=q+n,b*=m,this.V(a,h+b*Math.cos(k),p+b*Math.sin(k)));this.yf(c,d)}}return!0;case Wl:f=this.l(a);p=this.l(c);if(!f.L(b)||!p.L(d)){var e=f.x,f=f.y,h=p.x,p=p.y,m=(h-e)*(h-e)+(p-f)*(p-f),k=b.x,n=b.y,l=d.x,q=d.y,r=0,s=1,r=0!==l-k?(q-n)/(l-k):9E9;0!==r&&(s=Math.sqrt(1+1/(r*r)));this.yf(a,b);for(a+=1;ab?0:45<=b&&135>b?90:135<=b&&225>b?180:270;d=-45<=d&&45>d?0:45<=d&&135>d?90:135<=d&&225>d?180:270;var h=e.ba.copy(),k=f.ba.copy();if(h.J()&&k.J()){h.Jf(8,8);k.Jf(8,8);h.Oi(a);k.Oi(c);var l,m;if(0===b)if(c.x>a.x||270===d&&c.ya.x||90===d&&c.y>a.y&&k.right>a.x)l=new w(c.x,a.y),m=new w(c.x,(a.y+c.y)/2),180===d?(l.x=this.computeMidOrthoPosition(a.x,c.x,!1),m.x=l.x,m.y=c.y):270===d&&c.ya.y?(l.x=a.xk.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.right,m.x=l.x,m.y=c.y):0===d&&a.xk.top&&a.yh.bottom)180===d&&(k.Aa(a)||h.Aa(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.ya.y&&(180===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=h.left&&c.x<=a.x||a.x<=k.right&&a.x>=c.x){if(90===d||270===d)l=new w(Math.max((a.x+c.x)/2,a.x),a.y),m=new w(l.x,c.y)}else l.y=270===d||(0===d||180===d)&&c.ya.y&&k.lefta.y?(l.x=a.x>k.right?this.computeMidOrthoPosition(a.x,k.right,!1):a.x>k.left&&(270===d&&a.yk.bottom)?this.computeMidOrthoPosition(a.x,c.x,!1):k.left,m.x=l.x,m.y=c.y):180===d&&a.x>k.right&&a.y>k.top&&a.yh.bottom)0===d&&(k.Aa(a)||h.Aa(c))?l.y=this.computeMidOrthoPosition(a.y,c.y,!0):c.ya.y&&(0===d||270===d)&&(l.y=this.computeMidOrthoPosition(h.bottom,Math.min(c.y,k.top),!0)),m.x=c.x,m.y=l.y;if(l.y>h.top&&l.y=a.x||a.x>=k.left&&a.x<=c.x){if(90===d||270===d)l=new w(Math.min((a.x+c.x)/2,a.x),a.y),m=new w(l.x,c.y)}else l.y=270=== -d||(0===d||180===d)&&c.ya.y||180===d&&c.xa.y||0===d&&c.x>a.x&&k.bottom>a.y)l=new w(a.x,c.y),m=new w((a.x+c.x)/2,c.y),270===d?(l.y=this.computeMidOrthoPosition(a.y,c.y,!0),m.x=c.x,m.y=l.y):180===d&&c.xa.x?(l.y=a.yk.right)? -this.computeMidOrthoPosition(a.y,c.y,!0):k.bottom,m.x=c.x,m.y=l.y):90===d&&a.yk.left&&a.xh.right)270===d&&(k.Aa(a)||h.Aa(c))?l.x=this.computeMidOrthoPosition(a.x,c.x,!1):c.xa.x&&(270===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right, -Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=h.top&&c.y<=a.y||a.y<=k.bottom&&a.y>=c.y){if(0===d||180===d)l=new w(a.x,Math.max((a.y+c.y)/2,a.y)),m=new w(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.xa.x&&k.top=a.x?(l.y=a.y>k.bottom?this.computeMidOrthoPosition(a.y,k.bottom,!0):a.y>k.top&&(180===d&&a.xk.right)?this.computeMidOrthoPosition(a.y,c.y,!0):k.top,m.x=c.x,m.y=l.y):270===d&&a.y>k.bottom&&a.x>k.left&&a.xh.right)90===d&&(k.Aa(a)||h.Aa(c))?l.x=this.computeMidOrthoPosition(a.x, -c.x,!1):c.xa.x&&(90===d||180===d)&&(l.x=this.computeMidOrthoPosition(h.right,Math.min(c.x,k.left),!1)),m.x=l.x,m.y=c.y;if(l.x>h.left&&l.x=a.y||a.y>=k.top&&a.y<=c.y){if(0===d||180===d)l=new w(a.x,Math.min((a.y+c.y)/2,a.y)),m=new w(c.x,l.y)}else l.x=180===d||(90===d||270===d)&&c.xk&&0!==Jo(e,c.x,c.y)){Ko(this,e,c.x,c.y,d,!0);d=this.l(2);if(4>this.ka)0===b||180===b?(d.x=a.x,d.y=c.y):(d.x=c.x,d.y=a.y),this.V(2,d.x,d.y),this.w(3,d.x,d.y);else if(c=this.l(3),0===b|| -180===b)K.D(d.x,c.x)?(b=0===b?Math.max(d.x,a.x):Math.min(d.x,a.x),this.V(2,b,a.y),this.V(3,b,c.y)):K.D(d.y,c.y)?(Math.abs(a.y-d.y)<=e.po/2&&(this.V(2,d.x,a.y),this.V(3,c.x,a.y)),this.w(2,d.x,a.y)):this.V(2,a.x,d.y);else if(90===b||270===b)K.D(d.y,c.y)?(b=90===b?Math.max(d.y,a.y):Math.min(d.y,a.y),this.V(2,a.x,b),this.V(3,c.x,b)):K.D(d.x,c.x)?(Math.abs(a.x-d.x)<=e.ro/2&&(this.V(2,a.x,d.y),this.V(3,a.x,c.y)),this.w(2,a.x,d.y)):this.V(2,d.x,a.y);a=!0}else a=!1}else a=!1;a||(this.Jh(l),this.Jh(m))}}; -W.prototype.computeMidOrthoPosition=function(a,b){if(this.hasCurviness()){var c=this.computeCurviness();return(a+b)/2+c}return(a+b)/2};function gg(a){if(!a.el)return!1;var b=a.points.n,c=b.length;if(4>c)return!1;a=Lk(a.g,!0,a.Ra,null);for(var d=1;da){var b=new $c(ad),c=new bd(0,0);b.ub.add(c);return b}var d=!1,b=this.g;null!==b&&0!==b.ha.Le&&xo(this)&&(d=!0);var c=b=0,e=this.l(0).copy(),f=e.copy(),b=this.Qc.n,h=this.computeCurve();if(h===kh&&3<=a&&!K.mb(this.gp,0))if(3===a)var k=this.l(1),b=Math.min(e.x,k.x),c=Math.min(e.y,k.y),k=this.l(2),b=Math.min(b,k.x),c=Math.min(c,k.y);else{if(this.dc)for(k=0;k=a&& -(k=a-1),b=this.l(k),f.x=Math.min(b.x,f.x),f.y=Math.min(b.y,f.y);b=f.x;c=f.y}else{for(k=0;kx?r>q?(t.x=B-C,t.y=q-C,v.x=B+s,v.y=q+s):(t.x= -B-C,t.y=q+C,v.x=B+s,v.y=q-s):r>q?(t.x=B+C,t.y=q-C,v.x=B-s,v.y=q+s):(t.x=B+C,t.y=q+C,v.x=B-s,v.y=q-s));K.mb(x,B)&&K.mb(q,r)&&(q>p?(y>B?(t.x=B-C,t.y=q-C,v.x=B+s):(t.x=B+C,t.y=q-C,v.x=B-s),v.y=q+s):(y>B?(t.x=B-C,t.y=q+C,v.x=B+s):(t.x=B+C,t.y=q+C,v.x=B-s),v.y=q-s));if(K.mb(x,B)&&K.mb(B,y)||K.mb(p,q)&&K.mb(q,r))x=.5*(x+y),p=.5*(p+r),t.x=x,t.y=p,v.x=x,v.y=p;1===k?(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y)):2===k&&K.mb(d.x,this.l(0).x)&&K.mb(d.y,this.l(0).y)&&(e.x=.5*(d.x+m.x),e.y=.5*(d.y+m.y));O(l,e.x-b,e.y-c, -h.x-b,h.y-c,m.x-b,m.y-c);f.set(h);e.set(a);d=m}}k=d.x;d=d.y;f=this.l(this.ka-1);k=.5*(k+f.x);d=.5*(d+f.y);O(l,a.x-b,a.y-c,k-b,d-c,f.x-b,f.y-c)}else for(k=3;k=a&&(k=a-1),f=this.l(k-1),e=this.l(k),k===a-1&&0!==Ho(this)&&(e=e.copy(),Lo(this,e,!1,K.Wj)),O(l,d.x-b,d.y-c,f.x-b,f.y-c,e.x-b,e.y-c);else{f=u.K();f.assign(this.l(0));for(k=1;k=a-1){f!==t&&(0!==Ho(this)&&(t=t.copy(),Lo(this,t,!1,K.Wj)),Oo(this,l,-b,-c,f,t,d));break}k=Mo(this,t, -k+1,kn.x?t.x-s:t.x+s,C=v.y>t.y?t.y+B:t.y-B,Oo(this,e,h,m,n,new w(q,y),p),td(e,t.x+h,t.y+m,r+h,C+m),x.m(r,C))):K.D(n.x,t.x)&&K.D(t.y,v.y)?(s=this.computeCorner(),B=Math.min(s,Math.abs(t.y-n.y)/2),B=s=Math.min(B,Math.abs(v.x-t.x)/2),K.D(s,0)?(Oo(this,e,h,m,n,t,p),x.assign(t)): -(q=t.x,C=y=t.y,y=t.y>n.y?t.y-B:t.y+B,r=v.x>t.x?t.x+s:t.x-s,Oo(this,e,h,m,n,new w(q,y),p),td(e,t.x+h,t.y+m,r+h,C+m),x.m(r,C))):(Oo(this,e,h,m,n,t,p),x.assign(t))}u.v(f)}b=l.o;u.q(l)}return b};function No(a,b,c,d){a=c-a;if(isNaN(a)||Infinity===a||-Infinity===a)return NaN;0>a&&(a=-a);b=d-b;if(isNaN(b)||Infinity===b||-Infinity===b)return NaN;0>b&&(b=-b);return K.mb(a,0)?b:K.mb(b,0)?a:Math.sqrt(a*a+b*b)} -function Lo(a,b,c,d){var e=a.ka;if(!(2>e))if(c){var f=a.l(1);c=f.x-d.x;d=f.y-d.y;f=No(b.x,b.y,c,d);0!==f&&(e=2===e?.5*f:f,a=Go(a),a>e&&(a=e),c=a*(c-b.x)/f,a=a*(d-b.y)/f,b.x+=c,b.y+=a)}else f=a.l(e-2),c=f.x-d.x,d=f.y-d.y,f=No(b.x,b.y,c,d),0!==f&&(e=2===e?.5*f:f,a=Ho(a),a>e&&(a=e),c=a*(b.x-c)/f,a=a*(b.y-d)/f,b.x-=c,b.y-=a)} -function Mo(a,b,c,d){for(var e=a.ka,f=b;K.mb(b.x,f.x)&&K.mb(b.y,f.y);){if(c>=e)return e-1;f=a.l(c++)}if(!K.mb(b.x,f.x)&&!K.mb(b.y,f.y))return c-1;for(var h=f;K.mb(b.x,f.x)&&K.mb(f.x,h.x)&&(!d||(b.y>=f.y?f.y>=h.y:f.y<=h.y))||K.mb(b.y,f.y)&&K.mb(f.y,h.y)&&(!d||(b.x>=f.x?f.x>=h.x:f.x<=h.x));){if(c>=e)return e-1;h=a.l(c++)}return c-2} -function Oo(a,b,c,d,e,f,h){if(!h&&xo(a)){h=[];var k=0;a.Ea()&&(k=Po(a,e,f,h));var l=e.x,l=e.y;if(0p-10)m--,p=Math.max(q-5,f.x);else break;q=f.y-10+d;n=p+c;p=f.y+d;a.Ve===ch?M(b,n,p,!1,!1):O(b,l,q,n,q,n,p)}else if(K.D(e.x,f.x))if(e.yp-10)m--,p=Math.max(q-5,f.y);else break;q=f.x-10+c;n=f.x+c;p+=d;a.Ve===ch?M(b,n,p,!1,!1):O(b,q,l,q,p,n,p)}}b.lineTo(f.x+c,f.y+d)} -function Po(a,b,c,d){var e=a.g;if(null===e||b.L(c))return 0;for(e=e.mw;e.next();){var f=e.value;if(null!==f&&f.visible)for(var f=f.Db.n,h=f.length,k=0;kh.x&&n.x>m.x||m.xh.y&&n.y>m.y||m.yt&&Math.min(h,x)q&&!K.D(h,x)){n.x=t;n.y=q;n=!0;break a}}else if(!K.D(q,s)&&K.D(h,x)&&Math.min(q, -s)h&&Math.min(t,v)p&&!K.D(t,v)){n.x=p;n.y=h;n=!0;break a}n.x=0;n.y=0;n=!1}n&&(e?c.push(k.x):c.push(k.y));h=m}u.v(k)}u.u(W,{Bs:"firstPickIndex"},function(){return 2>=this.ka?0:this.dc||Ao(this)!==vb?1:0});u.u(W,{lw:"lastPickIndex"},function(){var a=this.ka;return 0===a?0:2>=a?a-1:this.dc||Bo(this)!==vb?a-2:a-1});function xo(a){a=a.Ve;return a===bh||a===ch}function zo(a,b){if(b||xo(a)){var c=a.g;null===c||c.El.contains(a)||null===a.py||c.El.add(a,a.py)}} -function eh(a,b){var c=a.layer;if(null!==c&&c.visible&&!c.Ac){var d=c.g;if(null!==d)for(var e=!1,d=d.mw;d.next();){var f=d.value;if(f.visible)if(f===c)for(var e=!0,h=!1,f=f.Db.n,k=f.length,l=0;lb.links.count)1===b.links.count&&(c=b.links.n[0],c.an=null,c.hf=0,c.Vb()),c=b.Uo,null!==b&&null!==c.nh&&c.nh.remove(b),c=b.at,null!==b&&null!==c.nh&&c.nh.remove(b);else for(c=Math.abs(c),a=0===c%2,b=b.links.i;b.next();){var d=b.value,e=Math.abs(d.hf),f=0===e%2;e>c&&a===f&&(d.hf=0=a.width||0>=a.height)){var b=a.y,c=a.x+a.width,d=a.y+a.height;this.ag=Math.floor((a.x-this.ge)/this.ge)*this.ge;this.bg=Math.floor((b-this.he)/this.he)*this.he;this.Iq=Math.ceil((c+2*this.ge)/this.ge)*this.ge;this.Jq=Math.ceil((d+2*this.he)/this.he)*this.he;a=1+(Math.ceil((this.Iq-this.ag)/this.ge)|0);b=1+(Math.ceil((this.Jq-this.bg)/this.he)|0);if(null===this.mc||this.hothis.Iq||a+cthis.Jq||b+da&&(c+=a,a=0);0>b&&(e+=b,b=0);if(0>c||0>e)return!0;d=Math.min(a+c-1,this.ho)|0;for(c=Math.min(b+e-1,this.io)|0;a<=d;a++)for(e=b;e<=c;e++)if(0===this.mc[a][e])return!1;return!0}; -function To(a,b,c,d,e,f,h,k,l){if(!(bh||cl)){var m,n;m=b|0;n=c|0;var p=a.mc[m][n];if(1<=p&&999999>p)for(e?n+=d:m+=d,p+=1;f<=m&&m<=h&&k<=n&&n<=l&&!(p>=a.mc[m][n]);)a.mc[m][n]=p,p+=1,e?n+=d:m+=d;m=e?n:m;if(e)if(0m;c+=d)To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h,k,l);else if(0m;b+=d)To(a,b,c,1,!e,f,h,k,l),To(a,b,c,-1,!e,f,h, -k,l)}}function Uo(a,b,c,d,e,f,h,k,l,m,n){for(var p=b|0,q=c|0,r=a.mc[p][q];0===r&&p>k&&pm&&q=Math.abs(p-d)&&1>=Math.abs(q-e))return a.abort=!0,0;p=b|0;q=c|0;r=a.mc[p][q];b=1;for(a.mc[p][q]=b;0===r&&p>k&&pm&&q=Math.abs(h-l)&&1>=Math.abs(k-m))a.abort=!0;else{var n=f.x;b=f.y;d=f.x+f.width;var p=f.y+f.height,n=n-a.ag,n=n/a.ge;b-=a.bg;b/=a.he;d-=a.ag;d/=a.ge;p-=a.bg;p/=a.he;f=Math.max(0,Math.min(a.ho,n|0));d=Math.min(a.ho,Math.max(0,d|0));b=Math.max(0,Math.min(a.io,b|0));var p=Math.min(a.io,Math.max(0,p|0)),h=h|0,k=k|0,l=l|0, -m=m|0,n=h,q=k,r=0===c||90===c?1:-1;(c=90===c||270===c)?q=Uo(a,h,k,l,m,r,c,f,d,b,p):n=Uo(a,h,k,l,m,r,c,f,d,b,p);if(!a.abort){a:{c=0===e||90===e?1:-1;e=90===e||270===e;for(var r=l|0,s=m|0,t=a.mc[r][s];0===t&&r>f&&rb&&s=Math.abs(r-h)&&1>=Math.abs(s-k)){a.abort=!0;break a}r=l|0;s=m|0;t=a.mc[r][s];for(a.mc[r][s]=999999;0===t&&r>f&&rb&&s=c?180:0}a=180*Math.atan2(a.height,a.width)/Math.PI;switch(b){case u.Fc|u.Xc:return c>a&&c<=180+a?180:270;case u.Xc|u.Oc:return c>180-a&&c<=360-a?270:0;case u.Oc|u.Nc:return c>a&&c<=180+a?90:0;case u.Nc|u.Fc:return c>180-a&&c<=360-a?180:90;case u.Fc|u.Xc|u.Oc:return 90180+a&&c<=360- -a?270:0;case u.Xc|u.Oc|u.Nc:return 180a&&180>=c?90:0;case u.Oc|u.Nc|u.Fc:return c>a&&c<=180-a?90:c>180-a&&270>=c?180:0;case u.Nc|u.Fc|u.Xc:return c>180-a&&c<=180+a?180:c>180+a?270:90}d&&b!==(u.Fc|u.Xc|u.Oc|u.Nc)&&(c-=15,0>c&&(c+=360));return c>a&&c<180-a?90:c>=180-a&&c<=180+a?180:c>180+a&&c<360-a?270:0} -function Fo(a,b){var c=a.wg;if(0===c.length){a:if(!a.To){c=a.To;a.To=!0;var d,e=null,f=a.Cc,f=f instanceof V?f:null;if(null===f||f.be)d=a.Cc.qD(a.port.Jd);else{if(!f.ba.J()){a.To=c;break a}e=f;d=e.pD()}var h=a.wg.length=0,k=a.port.lb(xb,u.K()),l=a.port.lb(Vb,u.K()),f=u.Vj(k.x,k.y,0,0);f.Oi(l);u.v(k);u.v(l);k=u.fc(f.x+f.width/2,f.y+f.height/2);for(d=d.i;d.next();)if(l=d.value,l.Ea()){var m=vb,n=l.od===a.port||l.W.Ph(e),m=n?Ao(l,a.port):Bo(l,a.port);if(m.Go()&&(n=n?l.fe:l.od,null!==n)){var p=n.T;if(null!== -p){var n=l.computeOtherPoint(p,n),p=k.Fi(n),m=Vo(f,m,p,l.dc),q=0;0===m?(q=u.Oc,180Math.abs(H)?(y=Math.abs(H)/ -q,q=Math.abs(H)):y=1;break;case u.Fc:r>Math.abs(I)?(y=Math.abs(I)/r,r=Math.abs(I)):y=1;break;case u.Xc:n>Math.abs(H)?(y=Math.abs(H)/n,n=Math.abs(H)):y=1;break;default:case u.Oc:p>Math.abs(I)?(y=Math.abs(I)/p,p=Math.abs(I)):y=1}B=0}var T=t.Lo;if(e===$n){v=t.link.computeThickness();v*=y;T.set(C);switch(x){case u.Nc:T.x=C.x+H/2+q/2-B-v/2;break;case u.Fc:T.y=C.y+I/2+r/2-B-v/2;break;case u.Xc:T.x=C.x+H/2-n/2+B+v/2;break;default:case u.Oc:T.y=C.y+I/2-p/2+B+v/2}B+=v}else v=.5,e===Xn&&(v=(t.Do+1)/(t.vm+1)), -T.x=C.x+H*v,T.y=C.y+I*v}u.v(k);u.v(d);u.v(l);u.v(m);C=a.wg;for(H=0;Hb.ee?1:a.angleb.angle?1:0}; -Eo.prototype.computeEndSegmentLength=function(a){var b=a.link,c=b.computeEndSegmentLength(this.Cc,this.port,vb,b.od===this.port),d=a.Do;if(0>d)return c;var e=a.vm;if(1>=e||!b.dc)return c;var b=a.tw,f=a.Lo;if(a.ee===u.Fc||a.ee===u.Nc)d=e-1-d;return((a=a.ee===u.Fc||a.ee===u.Oc)?b.ye&&(e=k.right);k.bottom>f&&(f=k.bottom)}}isFinite(c)&&isFinite(d)?a.m(c,d,e-c,f-d):(b=b.location,c=this.padding,a.m(b.x+c.left,b.y+c.top,0,0));return a}; -u.defineProperty(ph,{padding:"padding"},function(){return this.Pe},function(a){"number"===typeof a?((isNaN(a)||0>a)&&u.wa(a,">= 0",ph,"padding"),a=new rb(a)):(u.C(a,rb,ph,"padding"),(isNaN(a.left)||0>a.left)&&u.wa(a.left,">= 0",ph,"padding:value.left"),(isNaN(a.right)||0>a.right)&&u.wa(a.right,">= 0",ph,"padding:value.right"),(isNaN(a.top)||0>a.top)&&u.wa(a.top,">= 0",ph,"padding:value.top"),(isNaN(a.bottom)||0>a.bottom)&&u.wa(a.bottom,">= 0",ph,"padding:value.bottom"));var b=this.Pe;b.L(a)||(this.Pe= -a=a.Z(),this.h("padding",b,a))});function Je(){0=c-1?(h=0,e=d,f+=k+20,k=0):h++}null!==a&&a.Wd("Layout")}this.vf=!0};Je.prototype.Gz=function(a){return!a.location.J()||a instanceof V&&a.jy?!0:!1}; -function Zo(a,b,c,d,e,f,h,k){for(c=c.i;c.next();){var l=c.value;d&&!l.Ho||null!==e&&!e(l)||!l.canLayout()||(f&&l instanceof U?l.tf||(l instanceof V?null===l.Qb?Zo(a,b,l.Mc,!1,e,f,h,k):b.add(l):b.add(l)):h&&l instanceof W?b.add(l):!k||!l.Fd()||l instanceof U||b.add(l))}} -Je.prototype.collectParts=function(a){var b=new F(G);a instanceof D?(Zo(this,b,a.yg,!0,null,!0,!0,!0),Zo(this,b,a.links,!0,null,!0,!0,!0),Zo(this,b,a.Sj,!0,null,!0,!0,!0)):a instanceof V?Zo(this,b,a.Mc,!1,null,!0,!0,!0):Zo(this,b,a.i,!1,null,!0,!0,!0);return b};u.defineProperty(Je,{Ud:"arrangementOrigin"},function(){return this.wp},function(a){u.C(a,w,Je,"arrangementOrigin");this.wp.L(a)||(this.wp.assign(a),this.H())}); -Je.prototype.initialOrigin=function(a){var b=this.group;if(null!==b){var c=b.position.copy();(isNaN(c.x)||isNaN(c.y))&&c.set(a);b=b.placeholder;null!==b&&(c=b.lb(xb),(isNaN(c.x)||isNaN(c.y))&&c.set(a),c.x+=b.padding.left,c.y+=b.padding.top);return c}return a};function xa(){u.gc(this);this.Nd=null;this.clear()}u.fa("LayoutNetwork",xa); -xa.prototype.clear=function(){if(this.vertexes)for(var a=this.vertexes.i;a.next();){var b=a.value;b.clear();b.network=null}if(this.edges)for(a=this.edges.i;a.next();)b=a.value,b.clear(),b.network=null;this.vertexes=new F(ya);this.edges=new F(Aa);this.Kz=new la(U,ya);this.yz=new la(W,Aa)}; -xa.prototype.toString=function(a){void 0===a&&(a=0);var b="LayoutNetwork"+(null!==this.Qb?"("+this.Qb.toString()+")":"");if(0>=a)return b;b+=" vertexes: "+this.vertexes.count+" edges: "+this.edges.count;if(1d?1:0):1:null!==d?-1:0}; -ya.smartComparer=function(a,b){if(null!==a){if(null!==b){var c=a.kd,d=b.kd;if(null!==c){if(null!==d){for(var c=c.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=d.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e=f&&0>=h&&(f=1);c=this.spacing.width;isFinite(c)||(c=0);a=this.spacing.height;isFinite(a)||(a=0);null!==b&&b.Wb("Layout");d=[];switch(this.alignment){case fm:var k= -c,l=a,m=Math.max(this.qo.width,1);if(!isFinite(m))for(var n=m=0;nf-1|| -0h)d.push(new z(0,x,h+k,y)),B=0,v=t,x+=y,y=0;y=Math.max(y,I);I=0;switch(s){case dm:I=-q.width;break;default:I=0}p.moveTo(v+I,x);switch(s){case dm:v-=C;break;default:v+=C}B++}d.push(new z(0,x,h+k,y));break;case em:k=f;l=c;m=a;n=Math.max(this.qo.width,1);p=x=C=0;q=u.K();for(f=0;f=C&&(h-=C);for(var C=I=0,H=Math.max(this.qo.height,1),aa=p=0,R=!0,N=u.K(),f=0;fk-1||0h){d.push(new z(0,R?B-p:B,h+l,aa+p+m));for(T=0;TC&&(e.width+=e.x-C,e.x=C)}for(k=f=h=e=0;kd?1:0}; -Xk.smartComparer=function(a,b){if(null!==a){if(null!==b){for(var c=a.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),d=b.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/),e=0;e=a.count)1===a.count&&(a=a.first(),a.Ja=0,a.Ua=0);else{var b=new E(hp);b.Td(a.i);a=new E(hp);var c=new E(hp),d;d=this.sort(b);var e=this.Fx,f=this.eB,h=this.td,k=this.rn,l=this.Gx,m=this.Sp,b=this.mk,n=this.yC,p=this.jg,q=this.Vt,e=this.Gf,f=this.qw,h=this.OH;if(!isFinite(h)|| -0>=h)h=NaN;k=this.QF;if(!isFinite(k)||0>=k)k=1;l=this.Je;isFinite(l)||(l=0);m=this.Qf;if(!isFinite(m)||360m)m=360;b=this.spacing;isFinite(b)||(b=NaN);e===Am&&f===Bm?e=zm:e===Am&&f!==Bm&&(f=Bm,e=this.Gf);if((this.direction===mm||this.direction===nm)&&this.sorting!==lm){for(var r=0;!(r>=d.length);r+=2){a.add(d.ja(r));if(r+1>=d.length)break;c.add(d.ja(r+1))}this.direction===mm?(this.Gf===Am&&a.reverse(),d=new E(hp),d.Td(a),d.Td(c)):(this.Gf===Am&&c.reverse(),d=new E(hp),d.Td(c),d.Td(a))}for(var s= -d.length,t=n=0,r=0;rm&&(0===r||r===d.length-1)&&(v/=2);n+=v;t++}if(isNaN(h)||e===Am){isNaN(b)&&(b=6);if(e!==zm&&e!==Am){v=-Infinity;for(r=0;rh?(h=r,p=h*k):q=t/(360<=m?s:s-1)}this.Fx=e;this.eB=f;this.td=h;this.rn=k;this.Gx=l;this.Sp=m;this.mk=b;this.yC=n;this.jg=p;this.Vt=q;b=d;d=this.Fx;e=this.td;f=this.Gx;k=this.Sp;l=this.mk;m=this.jg;n=this.Vt;if(this.direction!==mm&&this.direction!==nm||d!==Am)if(this.direction===mm||this.direction===nm){h=0;switch(d){case ym:h=180*lp(this,e,m,f,n)/Math.PI;break;case zm:n=b=0;h=a.first();null!==h&&(b=ip(h,Math.PI/2));h=c.first();null!==h&&(n=ip(h,Math.PI/2));h=180*lp(this,e,m,f,l+(b+ -n)/2)/Math.PI;break;case xm:h=k/b.length}if(this.direction===mm){switch(d){case ym:mp(this,a,f,wm);break;case zm:np(this,a,f,wm);break;case xm:op(this,a,k/2,f,wm)}switch(d){case ym:mp(this,c,f+h,om);break;case zm:np(this,c,f+h,om);break;case xm:op(this,c,k/2,f+h,om)}}else{switch(d){case ym:mp(this,c,f,wm);break;case zm:np(this,c,f,wm);break;case xm:op(this,c,k/2,f,wm)}switch(d){case ym:mp(this,a,f+h,om);break;case zm:np(this,a,f+h,om);break;case xm:op(this,a,k/2,f+h,om)}}}else switch(d){case ym:mp(this, -b,f,this.direction);break;case zm:np(this,b,f,this.direction);break;case xm:op(this,b,k,f,this.direction);break;case Am:pp(this,b,k,f,this.direction)}else pp(this,b,k,f-k/2,om)}this.updateParts();this.network=null;this.vf=!0}; -function op(a,b,c,d,e){var f=a.Sp,h=a.td;a=a.jg;d=d*Math.PI/180;c=c*Math.PI/180;for(var k=b.length,l=0;lc){for(f=d+(e===om?f:-f);0>f;)f+=360;f%=360;180=n.length-1)break;sp(a,l,m,n,p,e,f)||tp(a,l,m,n,p,e,f);l=f.x;m=f.y}u.v(f);a.Vl++;if(!(23Math.abs(r)?Math.abs(l-f)<(n[0].width+n[n.length-1].width)/2&&(h=0):h=0Math.abs(q)?0:q;q=!1;q=Math.abs(f)>Math.abs(p)?0p:0a.Vl?a.td-h/(2*Math.PI):5>n.length&&10=p.length-1)break;sp(a,l,m,p,q,e,n)||tp(a,l,m,p,q,e,n);l=n.x;m=n.y}u.v(n);a.Vl++;if(!(23a.Vl?a.td-f/(2*Math.PI):a.td-(0k){m=b-a;if(m<-k)return h.x=m,h.y=n,!1;p=!0}}else if(m=b-a,m<-k){m=b+a;if(m>k)return h.x=m,h.y=n,!1;p=!0}n=Math.sqrt(1-Math.min(1,m*m/(k*k)))*l;0>c!==p&&(n=-n);if(Math.abs(c-n)>(d[e].height+d[e+1].height)/2)return h.x=m,h.y=n,!1;h.x=m;h.y=n;return!0} -function tp(a,b,c,d,e,f,h){var k=a.td,l=a.jg,m=0,n=0;a=(d[e].height+d[e+1].height)/2+a.mk;d=!1;if(0<=b!==(f===om)){if(n=c-a,n<-l){n=c+a;if(n>l){h.x=m;h.y=n;return}d=!0}}else if(n=c+a,n>l){n=c-a;if(n<-l){h.x=m;h.y=n;return}d=!0}m=Math.sqrt(1-Math.min(1,n*n/(l*l)))*k;0>b!==d&&(m=-m);h.x=m;h.y=n}gm.prototype.commitLayout=function(){this.commitNodes();this.Qs&&this.commitLinks()}; -gm.prototype.commitNodes=function(){for(var a=this.IF,b=this.network.vertexes.i;b.next();){var c=b.value;c.x+=a.x;c.y+=a.y;c.commit()}};gm.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()}; -function kp(a,b,c,d,e){var f=a.zF;if(.001>Math.abs(a.rn-1))return void 0!==d&&void 0!==e?e*b:2*Math.PI*b;a=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c;for(var h=0,k=0,k=void 0!==d&&void 0!==e?e/(f+1):Math.PI/(2*(f+1)),l=0,m=0;m<=f;m++)l=void 0!==d&&void 0!==e?d+m*e/f:m*Math.PI/(2*f),l=Math.sin(l),h+=Math.sqrt(1-a*a*l*l)*k;return void 0!==d&&void 0!==e?(b>c?b:c)*h:4*(b>c?b:c)*h}function jp(a,b,c,d,e){var f=0,f=void 0!==d&&void 0!==e?kp(a,1,c,d,e):kp(a,1,c);return b/f} -function lp(a,b,c,d,e){if(.001>Math.abs(a.rn-1))return e/b;var f=b>c?Math.sqrt(b*b-c*c)/b:Math.sqrt(c*c-b*b)/c,h=0;a=2*Math.PI/(700*a.network.vertexes.count);b>c&&(d+=Math.PI/2);for(var k=0;;k++){var l=Math.sin(d+k*a),h=h+(b>c?b:c)*Math.sqrt(1-f*f*l*l)*a;if(h>=e)return k*a}} -gm.prototype.sort=function(a){switch(this.sorting){case jm:break;case km:a.reverse();break;case hm:a.sort(this.comparer);break;case im:a.sort(this.comparer);a.reverse();break;case lm:for(var b=[],c=0;ce&&(e=k,f=h)}else for(h=0;he&&(e=k,f=h);d.add(a.ja(f));b[f]=-1;f=a.ja(f);e=0;for(h=f.kc;h.next();)e=a.indexOf(h.value.fromVertex),0>e||0<=b[e]&& -b[e]++;for(f=f.bc;f.next();)e=a.indexOf(f.value.toVertex),0>e||0<=b[e]&&b[e]++}a=[];for(b=0;ba[b].indexOf(l)&&a[b].push(l);for(c=h.kc;c.next();)l=d.indexOf(c.value.fromVertex),l!==b&&0>a[b].indexOf(l)&&a[b].push(l)}h=[];for(b=0;ba[c[p]].indexOf(c[p===c.length-1?0:p+1])&&t.push(p===c.length-1?0:p+1);if(0===t.length)for(p=0;pI.indexOf(R)||NI.indexOf(R)||N< -y[R]&&y[R]=v?l+1:l)),B+=l=v&&l++,C>=v&&C++,l>C&&(I=C,C=l,l=I),C-l<(c.length+2)/2===(lq||q===l||(s=q>l?q-l:l-q,p+=qm-s?1:-1);c.splice(0>p?l:l+1,0,b);e.splice(h,1);h--}else k=!1;if(k)break;else c.push(e[0]),e.splice(0,1)}for(b=0;b=a?a:360,this.H())}); -u.defineProperty(gm,{Gf:"arrangement"},function(){return this.Yc},function(a){this.Yc!==a&&(u.rb(a,gm,gm,"arrangement"),a===Am||a===zm||a===ym||a===xm)&&(this.Yc=a,this.H())});u.defineProperty(gm,{direction:"direction"},function(){return this.la},function(a){this.la!==a&&(u.rb(a,gm,gm,"direction"),a===om||a===wm||a===mm||a===nm)&&(this.la=a,this.H())}); -u.defineProperty(gm,{sorting:"sorting"},function(){return this.Fh},function(a){this.Fh!==a&&(u.rb(a,gm,gm,"sorting"),a===jm||a===km||a===hm||im||a===lm)&&(this.Fh=a,this.H())});u.defineProperty(gm,{comparer:"comparer"},function(){return this.ph},function(a){this.ph!==a&&(u.j(a,"function",gm,"comparer"),this.ph=a,this.H())});u.defineProperty(gm,{spacing:"spacing"},function(){return this.Gh},function(a){this.Gh!==a&&(u.j(a,"number",gm,"spacing"),this.Gh=a,this.H())}); -u.defineProperty(gm,{qw:"nodeDiameterFormula"},function(){return this.Zq},function(a){this.Zq!==a&&(u.rb(a,gm,gm,"nodeDiameterFormula"),a===Cm||a===Bm)&&(this.Zq=a,this.H())});u.u(gm,{JF:"actualXRadius"},function(){return this.td});u.u(gm,{KF:"actualYRadius"},function(){return this.jg});u.u(gm,{FI:"actualSpacing"},function(){return this.mk});u.u(gm,{IF:"actualCenter"},function(){return isNaN(this.Ud.x)||isNaN(this.Ud.y)?new w(0,0):new w(this.Ud.x+this.JF,this.Ud.y+this.KF)});var zm; -gm.ConstantSpacing=zm=u.s(gm,"ConstantSpacing",0);var ym;gm.ConstantDistance=ym=u.s(gm,"ConstantDistance",1);var xm;gm.ConstantAngle=xm=u.s(gm,"ConstantAngle",2);var Am;gm.Packed=Am=u.s(gm,"Packed",3);var om;gm.Clockwise=om=u.s(gm,"Clockwise",4);var wm;gm.Counterclockwise=wm=u.s(gm,"Counterclockwise",5);var mm;gm.BidirectionalLeft=mm=u.s(gm,"BidirectionalLeft",6);var nm;gm.BidirectionalRight=nm=u.s(gm,"BidirectionalRight",7);var jm;gm.Forwards=jm=u.s(gm,"Forwards",8);var km; -gm.Reverse=km=u.s(gm,"Reverse",9);var hm;gm.Ascending=hm=u.s(gm,"Ascending",10);var im;gm.Descending=im=u.s(gm,"Descending",11);var lm;gm.Optimized=lm=u.s(gm,"Optimized",12);var Cm;gm.Pythagorean=Cm=u.s(gm,"Pythagorean",13);var Bm;gm.Circular=Bm=u.s(gm,"Circular",14);function fp(){this.Ao=-Infinity;this.lp=this.Qm=null} -fp.prototype.compare=function(a,b){if(0this.Ao||Math.abs(a)a&&0f?(e=n.x+n.width/2,k=n.y+n.height/2,l[0]=new w(n.x+n.width+d.width,n.y),l[1]=new w(n.x,n.y+n.height+d.height),f=2):(p=yp(l,f,e,k,n.width,n.height,d),q=l[p],r=new w(q.x+n.width+d.width, -q.y),s=new w(q.x,q.y+n.height+d.height),p+1this.network.vertexes.count)return!1;for(var a=0,b=0,c=this.network.vertexes.first().kb,d=this.network.vertexes.i;d.next();){if(d.value.kb.sg(c)&&(a++,2a.network.vertexes.count)return!1;null===a.ig?a.ig=new E(Dp):a.ig.clear();a.ig.Td(a.network.vertexes);var c=a.ig;c.sort(function(a,b){return null===a||null===b||a===b?0:b.Of-a.Of});for(var d=c.count-1;0<=d&&1>=c.ja(d).Of;)d--;return 1=h))){for(var m=0,n=0,p=l.count-h;ps&&(s=1);m=K.sqrt((m+s+n*n*4/(h*h))/s);h=(m-1)*p/2;m=(m-1)*q/2;f.kb=new z(l-r.x-h,k-r.y-m,p+2*h,q+2*m);f.focus=new w(r.x+h,r.y+m)}a.network=d;return c}function Cp(a,b){for(var c=a.network.vertexes.i;c.next();){var d=c.value;d.network=b;if(null!==d.hh){var e=d.hh.ja(d.Yz);d.Of=e.Sw;var f=e.qA,h=e.rA;d.kb=new z(d.Ja-f,d.Ua-h,e.Vw,e.Rw);d.focus=new w(f,h);d.Yz--}}for(c=a.network.edges.i;c.next();)c.value.network=b;a.network=b} -function Ep(a,b){var c=b.rm;if(null!==c&&0!==c.count){var d=b.Ja,e=b.Ua,f=b.width,h=b.height;null!==b.hh&&0=p.Of?l++:(k=!0,m++,h+=Math.atan2(b.Ua-p.Ua,b.Ja-p.Ja))}if(0!==l)for(0>1)+n)*(0===k%2?1:-1);l.Ja=d+p*Math.cos(q);l.Ua=e+p*Math.sin(q);k++}}}function yp(a,b,c,d,e,f,h){var k=9E19,l=-1,m=0;a:for(;mn.y&&a[q].x-n.xn.x&&a[q].y-n.yl+h?(d=d+f-k,e=e-l-h,K.sqrt(d*d+e*e)):e+ck+m?e>l+h?(d=d-k-m,e=e-l-h,K.sqrt(d*d+e*e)):e+cl+h?e-(l+h):e+c=b.length)return!1;var c=b[0];c.forceX=0;c.forceY=0;for(var d=c.Ja,e=d,f=c.Ua,h=f,c=1;ch-f)?b.sort(function(a,b){return null===a||null===b||a===b?0:a.Ja-b.Ja}):b.sort(function(a,b){return null===a||null===b||a===b?0:a.Ua-b.Ua});for(var h=a.yh,m=0,n=0,p=0,c=0;ch||p-d>h){if(f)break}else if(l-r>h||r-l>h){if(!f)break}else{var s=Gp(k,e);1>s?(n=a.xw,null===n&&(a.xw=n=new Ga(0)),m=n.random(),s=n.random(),d>p?(n=Math.abs(e.aa.right-k.aa.x),n=(1+n)*m):dr?(p=Math.abs(e.aa.bottom-k.aa.y),p=(1+p)*s):ds?(n=a.xw,null===n&&(a.xw=n=new Ga(0)), -m=n.random(),s=n.random(),n=(d>p?1:-1)*(1+(e.width>k.width)?e.width:k.width)*m,p=(l>r?1:-1)*(1+(e.height>k.height)?e.height:k.height)*s):(m=f.stiffness*(s-f.length),n=(p-d)/s*m,p=(r-l)/s*m),k.forceX+=n,k.forceY+=p,e.forceX-=n,e.forceY-=p;c=0;d=Math.max(a.yh/20,50);for(e=0;ed&&(f=d),h<-d?h=-d:h>d&&(h=d),k.Ja+=f,k.Ua+=h,c=Math.max(c,f*f+h*h));return c>a.oD*a.oD}vp.prototype.moveFixedVertex=function(){}; -vp.prototype.commitLayout=function(){this.cA();this.commitNodes();this.Qs&&this.commitLinks()};vp.prototype.cA=function(){if(this.fp)for(var a=this.network.edges.i;a.next();){var b=a.value.link;null!==b&&(b.vb=uc,b.xb=uc)}};vp.prototype.commitNodes=function(){var a=0,b=0;if(this.PF){var c=u.Sf();this.kg(this.network,c);b=this.Ud;a=b.x-c.x;b=b.y-c.y;u.ic(c)}for(var c=u.Sf(),d=this.network.vertexes.i;d.next();){var e=d.value;if(0!==a||0!==b)c.assign(e.kb),c.x+=a,c.y+=b,e.kb=c;e.commit()}u.ic(c)}; -vp.prototype.commitLinks=function(){for(var a=this.network.edges.i;a.next();)a.value.commit()};vp.prototype.springStiffness=function(a){a=a.stiffness;return isNaN(a)?this.mn:a};vp.prototype.springLength=function(a){a=a.length;return isNaN(a)?this.ln:a};vp.prototype.electricalCharge=function(a){a=a.charge;return isNaN(a)?this.hn:a};vp.prototype.electricalFieldX=function(){return 0};vp.prototype.electricalFieldY=function(){return 0}; -vp.prototype.gravitationalMass=function(a){a=a.mass;return isNaN(a)?this.kn:a};vp.prototype.gravitationalFieldX=function(){return 0};vp.prototype.gravitationalFieldY=function(){return 0};vp.prototype.isFixed=function(a){return a.isFixed};u.u(vp,{gJ:"currentIteration"},function(){return this.vq});u.defineProperty(vp,{QC:"arrangementSpacing"},function(){return this.Uf},function(a){u.C(a,ia,vp,"arrangementSpacing");this.Uf.L(a)||(this.Uf.assign(a),this.H())}); -u.defineProperty(vp,{PF:"arrangesToOrigin"},function(){return this.xp},function(a){this.xp!==a&&(u.j(a,"boolean",vp,"arrangesToOrigin"),this.xp=a,this.H())});u.defineProperty(vp,{fp:"setsPortSpots"},function(){return this.Eh},function(a){this.Eh!==a&&(u.j(a,"boolean",vp,"setsPortSpots"),this.Eh=a,this.H())});u.defineProperty(vp,{comments:"comments"},function(){return this.oh},function(a){this.oh!==a&&(u.j(a,"boolean",vp,"comments"),this.oh=a,this.H())}); -u.defineProperty(vp,{Az:"maxIterations"},function(){return this.On},function(a){this.On!==a&&(u.j(a,"number",vp,"maxIterations"),0<=a&&(this.On=a,this.H()))});u.defineProperty(vp,{oD:"epsilonDistance"},function(){return this.Up},function(a){this.Up!==a&&(u.j(a,"number",vp,"epsilonDistance"),0b.toVertex.index&&(this.network.yw(b),b.rev=!0);break;case Op:for(b=this.network.vertexes.i;b.next();)a=b.value,a.wo=-1,a.finish=-1;for(a=this.network.edges.i;a.next();)a.value.forest=!1;this.Uq=0;for(b.reset();b.next();)c=b.value,0===c.kc.count&&aq(this,c);for(b.reset();b.next();)c=b.value,-1===c.wo&&aq(this,c);for(a.reset();a.next();)b=a.value,b.forest||(c=b.fromVertex, -d=c.finish,e=b.toVertex,f=e.finish,e.wos&&0s&&0b[this.Cf]&&(this.Fu=b[c]-1,this.Cf=c),b[c]h)for(var p=h+1;pn;p--)l=d[p],l.near===m&&l.om===m.om||k++;var m=0,q,r=q=p=l=0,s,t=0,v=0;s=0;var x;if(0<=c)for(n=d[h].Ie,m=0;mt||l===t&&q>s)&&k++,vl||t===l&&s>q)&&k++);if(0>=c)for(n=d[h].Ce,m=0;mt||l===t&&p>v)&&k++,sl||t===l&&v>p)&&k++);f[h*e+h]=k;for(n=h+1;n=c)for(k=d[h].Ce,x=d[n].Ce,m=0;m=c&&(l=k.Ie);var m=null;0<=c&&(m=k.Ce);var n=0,p=0,q=k.near;null!==q&&q.layer===k.layer&&(n+=q.column-1,p++);if(null!==l)for(q=0;q=c&&(l=k.Ie);var m=null;0<=c&&(m=k.Ce);var n=0,p=[],q=k.near;null!==q&&q.layer===k.layer&&(p[n]=q.column-1,n++);if(null!==l)for(q=0;q>1,f[h]=n&1?p[m]:p[m-1]+p[m]>>1)}eq(a,b,d);return f}function mq(a,b,c,d,e,f){if(b.component===d){b.component=c;var h=0,k=0;if(e)for(var l=b.bc;l.next();){var k=l.value,m=k.toVertex,h=b.layer-m.layer,k=a.linkMinLength(k);h===k&&mq(a,m,c,d,e,f)}if(f)for(l=b.kc;l.next();)k=l.value,m=k.fromVertex,h=m.layer-b.layer,k=a.linkMinLength(k),h===k&&mq(a,m,c,d,e,f)}} -function nq(a,b,c,d,e,f){if(b.component===d){b.component=c;if(e)for(var h=b.bc;h.next();)nq(a,h.value.toVertex,c,d,e,f);if(f)for(b=b.kc;b.next();)nq(a,b.value.fromVertex,c,d,e,f)}}function Yp(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid)return b}return null}function Zp(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.bc;d.next();)if(d.value.toVertex.valid){c=!1;break}if(c)return b}}return null} -function $p(a){for(a=a.vertexes.i;a.next();){var b=a.value;if(b.valid){for(var c=!0,d=b.kc;d.next();)if(d.value.fromVertex.valid){c=!1;break}if(c)return b}}return null}function aq(a,b){b.wo=a.Uq;a.Uq++;for(var c=b.bc;c.next();){var d=c.value,e=d.toVertex;-1===e.wo&&(d.forest=!0,aq(a,e))}b.finish=a.Uq;a.Uq++} -Yl.prototype.assignLayers=function(){switch(this.Mn){case oq:pq(this);break;case qq:for(var a=0,b=this.network.vertexes.i;b.next();)a=rq(this,b.value),this.jb=Math.max(a,this.jb);for(b.reset();b.next();)a=b.value,a.layer=this.jb-a.layer;break;default:case Sp:pq(this);for(b=this.network.vertexes.i;b.next();)b.value.valid=!1;for(b.reset();b.next();)a=b.value,0===a.kc.count&&sq(this,a);a=Infinity;for(b.reset();b.next();)a=Math.min(a,b.value.layer);this.jb=-1;for(b.reset();b.next();){var c=b.value;c.layer-= -a;this.jb=Math.max(this.jb,c.layer)}}};function pq(a){for(var b=a.network.vertexes.i;b.next();){var c=tq(a,b.value);a.jb=Math.max(c,a.jb)}}function tq(a,b){var c=0;if(-1===b.layer){for(var d=b.bc;d.next();)var e=d.value,f=e.toVertex,e=a.linkMinLength(e),c=Math.max(c,tq(a,f)+e);b.layer=c}else c=b.layer;return c}function rq(a,b){var c=0;if(-1===b.layer){for(var d=b.kc;d.next();)var e=d.value,f=e.fromVertex,e=a.linkMinLength(e),c=Math.max(c,rq(a,f)+e);b.layer=c}else c=b.layer;return c} -function sq(a,b){if(!b.valid){b.valid=!0;for(var c=b.bc;c.next();)sq(a,c.value.toVertex);for(c=a.network.vertexes.i;c.next();)c.value.component=-1;for(var d=b.Ie.n,e=d.length,f=0;fk&&mq(a,h.fromVertex,0,-1,!0,!1)}for(mq(a,b,1,-1,!0,!0);0!==b.component;){for(var k=0,d=Infinity,l=0,m=null,n=a.network.vertexes.i;n.next();){var p=n.value;if(1===p.component){for(var q=0,r=!1,s=p.Ie.n,e=s.length,f=0;fd)&&!p&&(k=m,d=n)}if(0>f){for(c.reset();c.next();)f=c.value,1===f.component&&(f.layer-=e);b.component=0}else k.component=0}}} -function cq(a,b,c){return 90===a.la?c&&!b.rev||!c&&b.rev?270:90:180===a.la?c&&!b.rev||!c&&b.rev?0:180:270===a.la?c&&!b.rev||!c&&b.rev?90:270:c&&!b.rev||!c&&b.rev?180:0} -Yl.prototype.initializeIndices=function(){switch(this.Bn){default:case uq:for(var a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;b.index=this.Ld[c];this.Ld[c]++}break;case Tp:a=this.network.vertexes.i;for(b=this.jb;0<=b;b--)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&vq(this,c);break;case wq:for(a=this.network.vertexes.i,b=0;b<=this.jb;b++)for(a.reset();a.next();)c=a.value,c.layer===b&&-1===c.index&&xq(this,c)}}; -function vq(a,b){var c=b.layer;b.index=a.Ld[c];a.Ld[c]++;for(var c=b.Ce.Ke(),d=!0;d;)for(var d=!1,e=0;eh.portFromColOffset&&(d=!0,c[e]=h,c[e+1]=f)}for(e=0;eh.portToColOffset&&(d=!0,c[e]=h,c[e+1]=f)}for(e=0;e=h;d--)f=zq(this,d,-1)||f;e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,1)||f;e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1, -d=h;d<=c;d++)f=zq(this,d,-1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this))}break;default:case Up:for(c=this.jb,h=0,k=a+1;(d=this.countCrossings())=h;d--)f=zq(this,d,-1)||f;e=this.countCrossings();e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,1)||f;e=this.countCrossings(); -e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,-1)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=c;d>=h;d--)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this));for(f=!0;f;)for(f=!1,d=h;d<=c;d++)f=zq(this,d,0)||f;e>=a?hq(this,b):(a=e,b=gq(this))}}hq(this,b)}; -function yq(a,b,c){var d=0,e=dq(a,b),f=a.Ld[b],h=lq(a,b,c);c=kq(a,b,c);for(d=0;df+1&&(q+=4*(B-f),r+=4*(B-(f+1)))}C=d[f].bc.i;for(C.reset();C.next();)if(y=C.value,y.valid&&y.toVertex.layer===b){y=y.toVertex;for(B=0;d[B]!==y;)B++;B===f+1&&(r+=1)}C=d[f+1].kc.i;for(C.reset();C.next();)if(y=C.value,y.valid&&y.fromVertex.layer===b){y=y.fromVertex;for(B=0;d[B]!==y;)B++;Bf+1&&(q+=4*(B-(f+1)),r+=4*(B-f))}C=d[f+1].bc.i;for(C.reset();C.next();)if(y=C.value, -y.valid&&y.toVertex.layer===b){y=y.toVertex;for(B=0;d[B]!==y;)B++;B===f&&(q+=1)}var B=y=0,C=h[d[f].index],I=k[d[f].index],H=h[d[f+1].index],T=k[d[f+1].index];-1!==C&&(y+=Math.abs(C-s),B+=Math.abs(C-x));-1!==I&&(y+=Math.abs(I-s),B+=Math.abs(I-x));-1!==H&&(y+=Math.abs(H-t),B+=Math.abs(H-v));-1!==T&&(y+=Math.abs(T-t),B+=Math.abs(T-v));if(r>1)+8*d;this.Hb*=8}if(0!==(this.oi&Dq))for(b=!0;b;){b=!1;for(a=this.Cf+1;a<=this.jb;a++)b=Eq(this,a,1)||b; -for(a=this.Cf-1;0<=a;a--)b=Eq(this,a,-1)||b;b=Eq(this,this.Cf,0)||b}if(0!==(this.oi&Fq)){for(a=this.Cf+1;a<=this.jb;a++)Gq(this,a,1);for(a=this.Cf-1;0<=a;a--)Gq(this,a,-1);Gq(this,this.Cf,0)}c&&(Hq(this,-1),Hq(this,1));if(0!==(this.oi&Dq))for(b=!0;b;){b=!1;b=Eq(this,this.Cf,0)||b;for(a=this.Cf+1;a<=this.jb;a++)b=Eq(this,a,0)||b;for(a=this.Cf-1;0<=a;a--)b=Eq(this,a,0)||b}};function Eq(a,b,c){for(var d=!1;Iq(a,b,c);)d=!0;return d} -function Iq(a,b,c){var d=0,e=dq(a,b),f=a.Ld[b],h=kq(a,b,-1);if(0c)for(d=0;dd-1||n-e[d-1].column-1>p+a.nodeMinColumnSpace(e[d-1],!1)?n-1:n,p=0,p=d+1>=f||e[d+1].column-n-1>q+a.nodeMinColumnSpace(e[d+1],!0)?n+1:n,s=q=0,t=0,v=0,x=0,B=0;if(0>=c)for(var y=e[d].kc.i;y.next();){var C=y.value;C.valid&&C.fromVertex.layer!== -b&&(v=fq(C),x=C.portFromColOffset,B=C.portToColOffset,C=C.fromVertex.column,q+=(Math.abs(n+B-(C+x))+1)*v,s+=(Math.abs(r+B-(C+x))+1)*v,t+=(Math.abs(p+B-(C+x))+1)*v)}if(0<=c)for(y=e[d].bc.i;y.next();)C=y.value,C.valid&&C.toVertex.layer!==b&&(v=fq(C),x=C.portFromColOffset,B=C.portToColOffset,C=C.toVertex.column,q+=(Math.abs(n+x-(C+B))+1)*v,s+=(Math.abs(r+x-(C+B))+1)*v,t+=(Math.abs(p+x-(C+B))+1)*v);B=x=v=0;y=h[e[d].index];C=k[e[d].index];-1!==y&&(v+=Math.abs(y-n),x+=Math.abs(y-r),B+=Math.abs(y-p));-1!== -C&&(v+=Math.abs(C-n),x+=Math.abs(C-r),B+=Math.abs(C-p));if(s=c[d]?n=q:p<=c[d]&&(n=p));n!==k&&(h=!0,e[d].column=n)}eq(a,b,e);a.normalize()} -function Jq(a,b){for(var c=!0,d=a.network.vertexes.i;d.next();){var e=d.value,f=a.nodeMinColumnSpace(e,!0),h=a.nodeMinColumnSpace(e,!1);if(e.column-f<=b&&e.column+h>=b){c=!1;break}}e=!1;if(c)for(d.reset();d.next();)c=d.value,c.column>b&&(c.column-=1,e=!0);return e} -function Kq(a,b){for(var c=b,c=b+1,d=0,e=[],f=[],d=0;d<=a.jb;d++)e[d]=!1,f[d]=!1;for(var h=a.network.vertexes.i;h.next();){var d=h.value,k=d.column-a.nodeMinColumnSpace(d,!0),l=d.column+a.nodeMinColumnSpace(d,!1);k<=b&&l>=b&&(e[d.layer]=!0);k<=c&&l>=c&&(f[d.layer]=!0)}k=!0;c=!1;for(d=0;d<=a.jb;d++)k=k&&!(e[d]&&f[d]);if(k)for(h.reset();h.next();)e=h.value,e.column>b&&(e.column-=1,c=!0);return c} -function Hq(a,b){for(var c=0;c<=a.Hb;c++)for(;Jq(a,c););a.normalize();for(c=0;ce?hq(a,d):hb)for(c=a.Hb;0<=c;c--)for(d=gq(a),e=jq(a),f=e+1;ee?hq(a,d):hc)for(d.reset();d.next();)e=d.value,e.column+a.nodeMinColumnSpace(e,!1)>=b&&(e.component=a.cg);a.cg++;for(d.reset();d.next();)b=d.value,-1===b.component&&(nq(a,b,a.cg,-1,!0,!0),a.cg++);var f=0;b=[];for(f=0;fc)for(k=a.Hb;0c)for(d.reset();d.next();)c=d.value,e[c.component]&&(c.column+=1)} -Yl.prototype.commitLayout=function(){if(this.fp)for(var a=bq(this,!0),b=bq(this,!1),c=this.network.edges.i;c.next();){var d=c.value.link;null!==d&&(d.vb=a,d.xb=b)}this.commitNodes();this.Sy();this.Qs&&this.commitLinks()};function bq(a,b){return 270===a.la?b?vc:Cc:90===a.la?b?Cc:vc:180===a.la?b?wc:xc:b?xc:wc} -Yl.prototype.commitNodes=function(){this.Lg=[];this.$f=[];this.Bf=[];this.Kb=[];for(var a=0;a<=this.jb;a++)this.Lg[a]=0,this.$f[a]=0,this.Bf[a]=0,this.Kb[a]=0;for(a=this.network.vertexes.i;a.next();){var b=a.value,c=b.layer;this.Lg[c]=Math.max(this.Lg[c],this.nodeMinLayerSpace(b,!0));this.$f[c]=Math.max(this.$f[c],this.nodeMinLayerSpace(b,!1))}for(var b=0,d=this.Ql,c=0;c<=this.jb;c++){var e=d;0>=this.Lg[c]+this.$f[c]&&(e=0);0=ua.aa.y&&ec<=ua.aa.bottom&&(ra=ua.Ja+Lf,ec=ec=ua.aa.x&&ec<=ua.aa.right&&(ra=ua.Ua+Lf,ec=ecLb.y&&(Nf=og.y>Lb.y?0:Ec.xpc.x&&(Of=Pg.x>pc.x?0:Pc.yb.layer?1:a.Beb.Be?1:a.Vdb.Vd?1:0:0};Yl.prototype.zE=function(a,b){return a instanceof Mq&&b instanceof Mq&&a!==b?a.firstb.first||a.Rhb.Rh||a.Beb.Be?1:a.Vdb.Vd?1:0:0}; -Yl.prototype.Aw=function(a,b){return a instanceof Mq&&b instanceof Mq&&a!==b?a.Gdb.Gd||a.Rhb.Rh||a.Beb.Be?1:a.Vdb.Vd?1:0:0};Yl.prototype.D=function(a,b){var c=a-b;return-1c};function dq(a,b){var c,d=a.Ld[b];if(d>=a.Ng.length){c=[];for(var e=0;ea&&(this.oi=a,this.H()))});u.defineProperty(Yl,{fp:"setsPortSpots"},function(){return this.Eh},function(a){this.Eh!==a&&(u.j(a,"boolean",Yl,"setsPortSpots"),this.Eh=a,this.H())});u.defineProperty(Yl,{ow:"linkSpacing"},function(){return this.gj},function(a){this.gj!==a&&(u.j(a,"number",Yl,"linkSpacing"),0<=a&&(this.gj=a,this.H()))});u.u(Yl,{uH:"maxLayer"},function(){return this.jb}); -u.u(Yl,{TJ:"maxIndex"},function(){return this.Fu});u.u(Yl,{SJ:"maxColumn"},function(){return this.Hb});u.u(Yl,{ZJ:"minIndexLayer"},function(){return this.Nq});u.u(Yl,{UJ:"maxIndexLayer"},function(){return this.Cf});var Op;Yl.CycleDepthFirst=Op=u.s(Yl,"CycleDepthFirst",0);var Xp;Yl.CycleGreedy=Xp=u.s(Yl,"CycleGreedy",1);var Sp;Yl.LayerOptimalLinkLength=Sp=u.s(Yl,"LayerOptimalLinkLength",0);var oq;Yl.LayerLongestPathSink=oq=u.s(Yl,"LayerLongestPathSink",1);var qq; -Yl.LayerLongestPathSource=qq=u.s(Yl,"LayerLongestPathSource",2);var Tp;Yl.InitDepthFirstOut=Tp=u.s(Yl,"InitDepthFirstOut",0);var wq;Yl.InitDepthFirstIn=wq=u.s(Yl,"InitDepthFirstIn",1);var uq;Yl.InitNaive=uq=u.s(Yl,"InitNaive",2);var Aq;Yl.AggressiveNone=Aq=u.s(Yl,"AggressiveNone",0);var Up;Yl.AggressiveLess=Up=u.s(Yl,"AggressiveLess",1);var Bq;Yl.AggressiveMore=Bq=u.s(Yl,"AggressiveMore",2);Yl.PackNone=0;var Cq;Yl.PackExpand=Cq=1;var Dq;Yl.PackStraighten=Dq=2;var Fq;Yl.PackMedian=Fq=4;var Vp; -Yl.PackAll=Vp=7;function Mq(){this.index=this.Vd=this.Be=this.Gd=this.first=this.layer=0;this.link=null;this.Rh=0}u.Xd(Mq,{layer:!0,first:!0,Gd:!0,Be:!0,Vd:!0,index:!0,link:!0,Rh:!0});function Wp(){xa.call(this)}u.Ga(Wp,xa);u.fa("LayeredDigraphNetwork",Wp);Wp.prototype.createVertex=function(){return new Nq};Wp.prototype.createEdge=function(){return new Oq}; -function Nq(){ya.call(this);this.index=this.column=this.layer=-1;this.component=NaN;this.near=null;this.valid=!1;this.finish=this.wo=NaN;this.om=0;this.Hz=this.Iz=null}u.Ga(Nq,ya);u.fa("LayeredDigraphVertex",Nq);function Oq(){Aa.call(this);this.forest=this.rev=this.valid=!1;this.portToPos=this.portFromPos=NaN;this.portToColOffset=this.portFromColOffset=0}u.Ga(Oq,Aa);u.fa("LayeredDigraphEdge",Oq); -function Y(){0b.level)return!1;a.removeChild(c.parent,c)}return!0}Y.prototype.removeChild=function(a,b){if(null!==a&&null!==b){for(var c=a.children,d=0,e=0;ef?Cr(a,k,na,y,C):Dr(a,k,na,y,C);na=R.x;y=R.width;C=R.height;break;case qr:for(m=0;ms&&(Nra&&(Ir(a,-ra,0,Oa,m-1),Jr(H,-ra,0),Jr(T,-ra,0),ra=0)}n.ia.m(ra,Z);y=Math.max(y,aa);C=Math.max(C,I+(0===Ea?0:x)+Ca.height);N=aa}else{0s&&(Zra&&(Ir(a,0,-ra,Oa,m-1),Jr(H,0,-ra),Jr(T,0,-ra),ra=0);n.ia.m(N,ra);C=Math.max(C,R);y=Math.max(y,I+(0===Ea?0:x)+Ca.width);Z=R}ua++}0h&&(h=0),135q&&(q=0),p===rr&&(l+=t/2+a.M.y),k+=d+c):b?(null===a.comments?d>y&&(p=Nr(p,d-y,0),k=p.x,l=p.y,y=d,h=0):y=Lr(a,y,h),0>h&&(k-=h,h=0),135C&&(p=Nr(p,0,e-C),k=p.x,l=p.y,C=e,q=0):C=Mr(a,C,q),0>q&&(l-=q,q=0),k+=d+c);if(0f[0].x?f[2].assign(f[1]):f[1].assign(f[2])),f[3].yf[0].x?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(h+d,0),p[1].m(p[0].x,e),p[2].yf[0].y?f[2].assign(f[1]):f[1].assign(f[2])),f[3].xf[0].y?f[3].assign(f[2]):f[2].assign(f[3])),p[0].m(0,q+e),p[1].m(d,p[0].y),p[2].xc?Cr(b,e,ua,I,H):Dr(b,e,ua,I,H);ua=H.x;I=H.width;H=H.height;break;case qr:for(k=0;kr&&(aar&&(Rp&&(p=0),135y&&(y=0));b.Ia.m(p,y);b.Ya.m(I,H)}} -function Cr(a,b,c,d,e){var f=b.length;if(0===f)return new z(c,0,d,e);if(1===f){var h=b[0];d=h.Ya.width;e=h.Ya.height;return new z(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=90===xr(a),n=0,p=0,q=0,r=0;rm&&(d-=m),e=Math.max(e,Math.max(B, -q)+b+s.height),0>h.ia.x&&(c=Wr(a,h.ia.x,!1,c,k))):(h.ia.m(d+b,c+k/2-h.M.y-h.Ia.y),d=Math.max(d,Math.max(x,p)+b+s.width),m=c+k/2-h.M.y-h.Ia.y,e=Math.max(e,m+s.height),0>m&&(e-=m),0>h.ia.y&&(c=Wr(a,h.ia.y,!0,c,k))));return new z(c,0,d,e)} -function Dr(a,b,c,d,e){var f=b.length;if(0===f)return new z(c,0,d,e);if(1===f){var h=b[0];d=h.Ya.width;e=h.Ya.height;return new z(c,0,d,e)}for(var k=a.nodeSpacing,l=a.rowSpacing,m=270===xr(a),n=0,p=0,q=0,r=0;rp&&(d-=p),e=Math.max(e,Math.abs(Math.min(B, -q))+l+s.height),0>h.ia.x&&(c=Wr(a,h.ia.x,!1,c,k))):(h.ia.m(-d-s.width-l,c+k/2-h.M.y-h.Ia.y),d=Math.max(d,Math.abs(Math.min(x,p))+l+s.width),p=c+k/2-h.M.y-h.Ia.y,e=Math.max(e,p+s.height),0>p&&(e-=p),0>h.ia.y&&(c=Wr(a,h.ia.y,!0,c,k))));for(r=0;rd&&(d=c+a.width);0>c&&(d-=c);return d;case yr:return a.width>b?a.width:b;case zr:return 2*a.M.x>b?a.width:b+a.width-2*a.M.x;case pr:case er:return d=Math.min(0,c),c=Math.max(b,c+a.width),Math.max(a.width,c-d);case qr:return a.width-a.M.x+a.nodeSpacing/2+b;case rr:return Math.max(a.width,a.M.x+a.nodeSpacing/2+b);default:return b}} -function Mr(a,b,c){switch(a.alignment){case nr:case Kr:var d=b;c+a.height>d&&(d=c+a.height);0>c&&(d-=c);return d;case yr:return a.height>b?a.height:b;case zr:return 2*a.M.y>b?a.height:b+a.height-2*a.M.y;case pr:case er:return d=Math.min(0,c),c=Math.max(b,c+a.height),Math.max(a.height,c-d);case qr:return a.height-a.M.y+a.nodeSpacing/2+b;case rr:return Math.max(a.height,a.M.y+a.nodeSpacing/2+b);default:return b}} -function Nr(a,b,c){switch(a){case Kr:b/=2;c/=2;break;case nr:b/=2;c/=2;break;case yr:c=b=0;break;case zr:break;default:u.k("Unhandled alignment value "+a.toString())}return new w(b,c)}function Fr(a,b,c,d,e,f){b=Nr(b,c,d);Ir(a,b.x,b.y,e,f)}function Ir(a,b,c,d,e){if(0!==b||0!==c)for(a=a.children;d<=e;d++){var f=a[d].ia;f.x+=b;f.y+=c}} -function Gr(a,b,c,d){var e=b.parent;switch(a.Af){case Qq:for(a=b.kc;a.next();)b=a.value,b.fromVertex===e&&b.nr.m(c,d);break;case Xq:for(a=b.bc;a.next();)b=a.value,b.toVertex===e&&b.nr.m(c,d);break;default:u.k("Unhandled path value "+a.Af.toString())}}function Jr(a,b,c){for(var d=0;dp.length||null===q||2>q.length))for(m=l=0;lv&&e.ye.y&&vb.length||null===l||2>l.length)d=null;else{n=Er(a,b.length+l.length);for(d=f=e=0;fe;)v=l[f++],n[d++].m(v.x+m,v.y);l=Er(a,d);for(e=0;ep.length||null===f||2>f.length)e=null;else{n=Er(a,p.length+f.length);for(m=x=l=0;lf;)e=p[l++],n[m++].m(e.x,e.y);e=Er(a,m);for(l=0;lp.length||null===q||2>q.length))for(m=l=0;lf&&e.xe.x&&fb.length||null===l||2>l.length)d=null;else{n=Er(a, -b.length+l.length);for(d=f=e=0;fe;)v=l[f++],n[d++].m(v.x,v.y+m);l=Er(a,d);for(e=0;ep.length||null===f||2>f.length)e=null;else{n=Er(a,p.length+f.length);for(m=x=l=0;lf;)e=p[l++],n[m++].m(e.x,e.y);e=Er(a,m);for(l=0;l=a?0:135>=a?90:225>=a?180:315>=a?270:0} -function Ar(a){var b=xr(a),b=90===b||270===b,c=a.layerSpacing;if(0=a&&(this.qa.nodeIndentPastParent=a,this.H()))}); -u.defineProperty(Y,{nodeSpacing:"nodeSpacing"},function(){return this.qa.nodeSpacing},function(a){this.qa.nodeSpacing!==a&&(u.j(a,"number",Y,"nodeSpacing"),this.qa.nodeSpacing=a,this.H())});u.defineProperty(Y,{layerSpacing:"layerSpacing"},function(){return this.qa.layerSpacing},function(a){this.qa.layerSpacing!==a&&(u.j(a,"number",Y,"layerSpacing"),this.qa.layerSpacing=a,this.H())}); -u.defineProperty(Y,{layerSpacingParentOverlap:"layerSpacingParentOverlap"},function(){return this.qa.layerSpacingParentOverlap},function(a){this.qa.layerSpacingParentOverlap!==a&&(u.j(a,"number",Y,"layerSpacingParentOverlap"),0<=a&&1>=a&&(this.qa.layerSpacingParentOverlap=a,this.H()))});u.defineProperty(Y,{compaction:"compaction"},function(){return this.qa.compaction},function(a){this.qa.compaction!==a&&(u.rb(a,Y,Y,"compaction"),a===ur||a===wr)&&(this.qa.compaction=a,this.H())}); -u.defineProperty(Y,{breadthLimit:"breadthLimit"},function(){return this.qa.breadthLimit},function(a){this.qa.breadthLimit!==a&&(u.j(a,"number",Y,"breadthLimit"),0<=a&&(this.qa.breadthLimit=a,this.H()))});u.defineProperty(Y,{rowSpacing:"rowSpacing"},function(){return this.qa.rowSpacing},function(a){this.qa.rowSpacing!==a&&(u.j(a,"number",Y,"rowSpacing"),this.qa.rowSpacing=a,this.H())}); -u.defineProperty(Y,{rowIndent:"rowIndent"},function(){return this.qa.rowIndent},function(a){this.qa.rowIndent!==a&&(u.j(a,"number",Y,"rowIndent"),0<=a&&(this.qa.rowIndent=a,this.H()))});u.defineProperty(Y,{commentSpacing:"commentSpacing"},function(){return this.qa.commentSpacing},function(a){this.qa.commentSpacing!==a&&(u.j(a,"number",Y,"commentSpacing"),this.qa.commentSpacing=a,this.H())}); -u.defineProperty(Y,{commentMargin:"commentMargin"},function(){return this.qa.commentMargin},function(a){this.qa.commentMargin!==a&&(u.j(a,"number",Y,"commentMargin"),this.qa.commentMargin=a,this.H())});u.defineProperty(Y,{setsPortSpot:"setsPortSpot"},function(){return this.qa.setsPortSpot},function(a){this.qa.setsPortSpot!==a&&(u.j(a,"boolean",Y,"setsPortSpot"),this.qa.setsPortSpot=a,this.H())}); -u.defineProperty(Y,{portSpot:"portSpot"},function(){return this.qa.portSpot},function(a){u.C(a,L,Y,"portSpot");this.qa.portSpot.L(a)||(this.qa.portSpot=a,this.H())});u.defineProperty(Y,{setsChildPortSpot:"setsChildPortSpot"},function(){return this.qa.setsChildPortSpot},function(a){this.qa.setsChildPortSpot!==a&&(u.j(a,"boolean",Y,"setsChildPortSpot"),this.qa.setsChildPortSpot=a,this.H())}); -u.defineProperty(Y,{childPortSpot:"childPortSpot"},function(){return this.qa.childPortSpot},function(a){u.C(a,L,Y,"childPortSpot");this.qa.childPortSpot.L(a)||(this.qa.childPortSpot=a,this.H())});u.defineProperty(Y,{$I:"alternateSorting"},function(){return this.pa.sorting},function(a){this.pa.sorting!==a&&(u.rb(a,Y,Y,"alternateSorting"),a===jr||a===kr||a===lr||mr)&&(this.pa.sorting=a,this.H())}); -u.defineProperty(Y,{NI:"alternateComparer"},function(){return this.pa.comparer},function(a){this.pa.comparer!==a&&(u.j(a,"function",Y,"alternateComparer"),this.pa.comparer=a,this.H())});u.defineProperty(Y,{HI:"alternateAngle"},function(){return this.pa.angle},function(a){this.pa.angle!==a&&(u.j(a,"number",Y,"alternateAngle"),0===a||90===a||180===a||270===a)&&(this.pa.angle=a,this.H())}); -u.defineProperty(Y,{GI:"alternateAlignment"},function(){return this.pa.alignment},function(a){this.pa.alignment!==a&&(u.rb(a,Y,Y,"alternateAlignment"),this.pa.alignment=a,this.H())});u.defineProperty(Y,{SI:"alternateNodeIndent"},function(){return this.pa.nodeIndent},function(a){this.pa.nodeIndent!==a&&(u.j(a,"number",Y,"alternateNodeIndent"),0<=a&&(this.pa.nodeIndent=a,this.H()))}); -u.defineProperty(Y,{TI:"alternateNodeIndentPastParent"},function(){return this.pa.nodeIndentPastParent},function(a){this.pa.nodeIndentPastParent!==a&&(u.j(a,"number",Y,"alternateNodeIndentPastParent"),0<=a&&1>=a&&(this.pa.nodeIndentPastParent=a,this.H()))});u.defineProperty(Y,{UI:"alternateNodeSpacing"},function(){return this.pa.nodeSpacing},function(a){this.pa.nodeSpacing!==a&&(u.j(a,"number",Y,"alternateNodeSpacing"),this.pa.nodeSpacing=a,this.H())}); -u.defineProperty(Y,{QI:"alternateLayerSpacing"},function(){return this.pa.layerSpacing},function(a){this.pa.layerSpacing!==a&&(u.j(a,"number",Y,"alternateLayerSpacing"),this.pa.layerSpacing=a,this.H())});u.defineProperty(Y,{RI:"alternateLayerSpacingParentOverlap"},function(){return this.pa.layerSpacingParentOverlap},function(a){this.pa.layerSpacingParentOverlap!==a&&(u.j(a,"number",Y,"alternateLayerSpacingParentOverlap"),0<=a&&1>=a&&(this.pa.layerSpacingParentOverlap=a,this.H()))}); -u.defineProperty(Y,{MI:"alternateCompaction"},function(){return this.pa.compaction},function(a){this.pa.compaction!==a&&(u.rb(a,Y,Y,"alternateCompaction"),a===ur||a===wr)&&(this.pa.compaction=a,this.H())});u.defineProperty(Y,{II:"alternateBreadthLimit"},function(){return this.pa.breadthLimit},function(a){this.pa.breadthLimit!==a&&(u.j(a,"number",Y,"alternateBreadthLimit"),0<=a&&(this.pa.breadthLimit=a,this.H()))}); -u.defineProperty(Y,{XI:"alternateRowSpacing"},function(){return this.pa.rowSpacing},function(a){this.pa.rowSpacing!==a&&(u.j(a,"number",Y,"alternateRowSpacing"),this.pa.rowSpacing=a,this.H())});u.defineProperty(Y,{WI:"alternateRowIndent"},function(){return this.pa.rowIndent},function(a){this.pa.rowIndent!==a&&(u.j(a,"number",Y,"alternateRowIndent"),0<=a&&(this.pa.rowIndent=a,this.H()))}); -u.defineProperty(Y,{LI:"alternateCommentSpacing"},function(){return this.pa.commentSpacing},function(a){this.pa.commentSpacing!==a&&(u.j(a,"number",Y,"alternateCommentSpacing"),this.pa.commentSpacing=a,this.H())});u.defineProperty(Y,{KI:"alternateCommentMargin"},function(){return this.pa.commentMargin},function(a){this.pa.commentMargin!==a&&(u.j(a,"number",Y,"alternateCommentMargin"),this.pa.commentMargin=a,this.H())}); -u.defineProperty(Y,{ZI:"alternateSetsPortSpot"},function(){return this.pa.setsPortSpot},function(a){this.pa.setsPortSpot!==a&&(u.j(a,"boolean",Y,"alternateSetsPortSpot"),this.pa.setsPortSpot=a,this.H())});u.defineProperty(Y,{VI:"alternatePortSpot"},function(){return this.pa.portSpot},function(a){u.C(a,L,Y,"alternatePortSpot");this.pa.portSpot.L(a)||(this.pa.portSpot=a,this.H())}); -u.defineProperty(Y,{YI:"alternateSetsChildPortSpot"},function(){return this.pa.setsChildPortSpot},function(a){this.pa.setsChildPortSpot!==a&&(u.j(a,"boolean",Y,"alternateSetsChildPortSpot"),this.pa.setsChildPortSpot=a,this.H())});u.defineProperty(Y,{JI:"alternateChildPortSpot"},function(){return this.pa.childPortSpot},function(a){u.C(a,L,Y,"alternateChildPortSpot");this.pa.childPortSpot.L(a)||(this.pa.childPortSpot=a,this.H())});var Pq;Y.PathDefault=Pq=u.s(Y,"PathDefault",-1);var Qq; -Y.PathDestination=Qq=u.s(Y,"PathDestination",0);var Xq;Y.PathSource=Xq=u.s(Y,"PathSource",1);var jr;Y.SortingForwards=jr=u.s(Y,"SortingForwards",10);var kr;Y.SortingReverse=kr=u.s(Y,"SortingReverse",11);var lr;Y.SortingAscending=lr=u.s(Y,"SortingAscending",12);var mr;Y.SortingDescending=mr=u.s(Y,"SortingDescending",13);var Kr;Y.AlignmentCenterSubtrees=Kr=u.s(Y,"AlignmentCenterSubtrees",20);var nr;Y.AlignmentCenterChildren=nr=u.s(Y,"AlignmentCenterChildren",21);var yr; -Y.AlignmentStart=yr=u.s(Y,"AlignmentStart",22);var zr;Y.AlignmentEnd=zr=u.s(Y,"AlignmentEnd",23);var pr;Y.AlignmentBus=pr=u.s(Y,"AlignmentBus",24);var er;Y.AlignmentBusBranching=er=u.s(Y,"AlignmentBusBranching",25);var qr;Y.AlignmentTopLeftBus=qr=u.s(Y,"AlignmentTopLeftBus",26);var rr;Y.AlignmentBottomRightBus=rr=u.s(Y,"AlignmentBottomRightBus",27);var ur;Y.CompactionNone=ur=u.s(Y,"CompactionNone",30);var wr;Y.CompactionBlock=wr=u.s(Y,"CompactionBlock",31);var Rq; -Y.StyleLayered=Rq=u.s(Y,"StyleLayered",40);var ir;Y.StyleLastParents=ir=u.s(Y,"StyleLastParents",41);var hr;Y.StyleAlternating=hr=u.s(Y,"StyleAlternating",42);var gr;Y.StyleRootOnly=gr=u.s(Y,"StyleRootOnly",43);var Tq;Y.ArrangementVertical=Tq=u.s(Y,"ArrangementVertical",50);var Yr;Y.ArrangementHorizontal=Yr=u.s(Y,"ArrangementHorizontal",51);var Wq;Y.ArrangementFixedRoots=Wq=u.s(Y,"ArrangementFixedRoots",52);var Sq;Y.LayerIndividual=Sq=u.s(Y,"LayerIndividual",60);var cr; -Y.LayerSiblings=cr=u.s(Y,"LayerSiblings",61);var br;Y.LayerUniform=br=u.s(Y,"LayerUniform",62);function Vq(){xa.call(this)}u.Ga(Vq,xa);u.fa("TreeNetwork",Vq);Vq.prototype.createVertex=function(){return new Uq};Vq.prototype.createEdge=function(){return new $r}; -function Uq(){ya.call(this);this.initialized=!1;this.parent=null;this.children=[];this.maxGenerationCount=this.maxChildrenCount=this.descendantCount=this.level=0;this.comments=null;this.ia=new w(0,0);this.Ya=new ia(0,0);this.Ia=new w(0,0);this.cp=this.bp=this.aI=!1;this.jt=this.Ss=null;this.sorting=jr;this.comparer=dp;this.angle=0;this.alignment=nr;this.nodeIndentPastParent=this.nodeIndent=0;this.nodeSpacing=20;this.layerSpacing=50;this.layerSpacingParentOverlap=0;this.compaction=wr;this.breadthLimit= -0;this.rowSpacing=25;this.commentSpacing=this.rowIndent=10;this.commentMargin=20;this.setsPortSpot=!0;this.portSpot=uc;this.setsChildPortSpot=!0;this.childPortSpot=uc}u.Ga(Uq,ya);u.fa("TreeVertex",Uq); -Uq.prototype.copyInheritedPropertiesFrom=function(a){null!==a&&(this.sorting=a.sorting,this.comparer=a.comparer,this.angle=a.angle,this.alignment=a.alignment,this.nodeIndent=a.nodeIndent,this.nodeIndentPastParent=a.nodeIndentPastParent,this.nodeSpacing=a.nodeSpacing,this.layerSpacing=a.layerSpacing,this.layerSpacingParentOverlap=a.layerSpacingParentOverlap,this.compaction=a.compaction,this.breadthLimit=a.breadthLimit,this.rowSpacing=a.rowSpacing,this.rowIndent=a.rowIndent,this.commentSpacing=a.commentSpacing, -this.commentMargin=a.commentMargin,this.setsPortSpot=a.setsPortSpot,this.portSpot=a.portSpot,this.setsChildPortSpot=a.setsChildPortSpot,this.childPortSpot=a.childPortSpot)};u.u(Uq,{qm:"childrenCount"},function(){return this.children.length});u.defineProperty(Uq,{pK:"relativePosition"},function(){return this.ia},function(a){this.ia.set(a)});u.defineProperty(Uq,{zK:"subtreeSize"},function(){return this.Ya},function(a){this.Ya.set(a)}); -u.defineProperty(Uq,{yK:"subtreeOffset"},function(){return this.Ia},function(a){this.Ia.set(a)});function $r(){Aa.call(this);this.nr=new w(0,0)}u.Ga($r,Aa);u.fa("TreeEdge",$r); -$r.prototype.commit=function(){var a=this.link;if(null!==a&&!a.el){var b=this.network.Qb,c=null,d=null;switch(b.Af){case Qq:c=this.fromVertex;d=this.toVertex;break;case Xq:c=this.toVertex;d=this.fromVertex;break;default:u.k("Unhandled path value "+b.Af.toString())}if(null!==c&&null!==d)if(b=this.nr,0!==b.x||0!==b.y||c.aI){var d=c.kb,e=xr(c),f=Ar(c),h=c.rowSpacing;a.updateRoute();var k=a.Ve===kh,l=a.dc,m=0,n,p;a.rl();if(l||k){for(m=2;4q.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Br(c))))):c.alignment===yr?(r=d.top+b.y,0===b.y&&n.yq.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Br(c))))):c.alignment===yr?(r=d.left+b.x,0===b.x&&n.xq.y+c.rowIndent&&(r=Math.min(r,Math.max(n.y,r-Br(c))))):c.alignment===yr?(r=d.top+b.y,0===b.y&&n.yq.x+c.rowIndent&&(r=Math.min(r,Math.max(n.x,r-Br(c))))):c.alignment===yr?(r=d.left+b.x,0===b.x&&n.xl?h=null:(m=parseFloat(n.getAttribute("cx")),isNaN(m)&&(m=0),n=parseFloat(n.getAttribute("cy")),isNaN(n)&&(n=0),p=new $c(nd),p.ua=0,p.va=0,p.F=2*l,p.G=2*l,h.position=new w(m-l,n-l),h.dd=p);break;case "ellipse":p=f;h=new X;l=parseFloat(p.getAttribute("rx"));isNaN(l)||0>l?h=null:(m=parseFloat(p.getAttribute("ry")),isNaN(m)||0>m?h=null:(n=parseFloat(p.getAttribute("cx")),isNaN(n)&&(n=0),p=parseFloat(p.getAttribute("cy")), -isNaN(p)&&(p=0),q=new $c(nd),q.ua=0,q.va=0,q.F=2*l,q.G=2*m,h.position=new w(n-l,p-m),h.dd=q));break;case "rect":q=f;h=new X;l=parseFloat(q.getAttribute("width"));if(isNaN(l)||0>l)h=null;else if(m=parseFloat(q.getAttribute("height")),isNaN(m)||0>m)h=null;else{n=parseFloat(q.getAttribute("x"));isNaN(n)&&(n=0);p=parseFloat(q.getAttribute("y"));isNaN(p)&&(p=0);var r=q.getAttribute("rx"),s=q.getAttribute("ry"),q=parseFloat(r);if(isNaN(q)||0>q)q=0;var t=parseFloat(s);if(isNaN(t)||0>t)t=0;null!==r&&""!== -r||null===s||""===s?null===r||""===r||null!==s&&""!==s||(t=q):q=t;q=Math.min(q,l/2);t=Math.min(t,m/2);s=void 0;0===q&&0===t?(s=new $c(md),s.ua=0,s.va=0,s.F=l,s.G=m):(s=K.sa/2,r=u.p(),M(r,q,0,!0),r.lineTo(l-q,0),O(r,l-q*s,0,l,t*s,l,t),r.lineTo(l,m-t),O(r,l,m-t*s,l-q*s,m,l-q,m),r.lineTo(q,m),O(r,q*s,m,0,m-t*s,0,m-t),r.lineTo(0,t),O(r,0,t*s,q*s,0,q,0),P(r),s=r.o,u.q(r));h.position=new w(n,p);h.dd=s}break;case "polygon":h=es(f);break;case "polyline":h=es(f)}if(null!==h){if(h instanceof X){m=h;l=bs(a, -f,"fill");null!==l&&-1!==l.indexOf("url")?(l=l.substring(l.indexOf("#")+1,l.length-1),l=a["_brush"+l],m.fill=l instanceof ga?l:"black"):m.fill=null===l?"black":"none"===l?null:l;l=bs(a,f,"stroke");null!==l&&-1!==l.indexOf("url")?(l=l.substring(l.indexOf("#")+1,l.length-1),l=a["_brush"+l],m.stroke=l instanceof ga?l:"black"):m.stroke="none"===l?null:l;l=parseFloat(bs(a,f,"stroke-width"));isNaN(l)||(m.hb=l);l=bs(a,f,"stroke-linecap");null!==l&&(m.qI=l);l=bs(a,f,"stroke-dasharray");if(null!==l&&""!== -l){n=l.split(",");p=[];for(l=0;lf.length)return null;for(var d=null,h=new E(Jd),k=1;k= a.length ? a.push(c) : a.splice(b, 0, c) : u.k("Cannot insert an object into an HTMLCollection or NodeList: " + c + " at " + b) + }, + zi: function (a, b) { + Array.isArray(a) ? b >= a.length ? a.pop() : a.splice(b, 1) : u.k("Cannot remove an object from an HTMLCollection or NodeList at " + b) + }, + Ww: [], + K: function () { + var a = u.Ww.pop(); + return void 0 === a ? new w : a + }, + fc: function (a, b) { + var c = u.Ww.pop(); + if (void 0 === c) return new w(a, b); + c.x = a; + c.y = b; + return c + }, + v: function (a) { + u.Ww.push(a) + }, + xA: [], + ul: function () { + var a = u.xA.pop(); + return void 0 === + a ? new ia : a + }, + Oj: function (a) { + u.xA.push(a) + }, + Xw: [], + Sf: function () { + var a = u.Xw.pop(); + return void 0 === a ? new z : a + }, + Vj: function (a, b, c, d) { + var e = u.Xw.pop(); + if (void 0 === e) return new z(a, b, c, d); + e.x = a; + e.y = b; + e.width = c; + e.height = d; + return e + }, + ic: function (a) { + u.Xw.push(a) + }, + yA: [], + jh: function () { + var a = u.yA.pop(); + return void 0 === a ? new ja : a + }, + Ye: function (a) { + u.yA.push(a) + }, + Yw: null, + p: function () { + var a = u.Yw; + return null !== a ? (u.Yw = null, a) : new ka + }, + q: function (a) { + a.reset(); + u.Yw = a + }, + wA: [], + eb: function () { + var a = u.wA.pop(); + return void 0 === a ? + [] : a + }, + ra: function (a) { + a.length = 0; + u.wA.push(a) + }, + mh: Object.freeze([]), + zA: 1, + gc: function (a) { + a.__gohashid = u.zA++ + }, + Is: function (a) { + var b = a.__gohashid; + void 0 === b && (b = u.zA++, a.__gohashid = b); + return b + }, + Uc: function (a) { + return a.__gohashid + }, + fa: function (a, b) { + b.hx = a; + da[a] = b + }, + Ga: function (a, b) { + function c() { + } + + c.prototype = b.prototype; + a.prototype = new c; + a.prototype.constructor = a + }, + Lh: function (a) { + a.AF = !0 + }, + defineProperty: function (a, b, c, d, e) { + u.j(a, "function", "Util.defineProperty:classfunc"); + u.j(b, "object", "Util.defineProperty:propobj"); + u.j(c, "function", "Util.defineProperty:getter"); + u.j(d, "function", "Util.defineProperty:setter"); + for (var f in b) { + b = b[f]; + c = {get: c, set: d}; + if (void 0 !== e) for (var h in e) c[h] = e[h]; + Object.defineProperty(a.prototype, f, c); + e = Object.getOwnPropertyDescriptor(a.prototype, f); + b && e && Object.defineProperty(a.prototype, b, e); + break + } + }, + u: function (a, b, c, d) { + u.j(a, "function", "Util.defineReadOnlyProperty:classfunc"); + u.j(b, "object", "Util.defineReadOnlyProperty:propobj"); + u.j(c, "function", "Util.defineReadOnlyProperty:getter"); + for (var e in b) { + var f = + b[e]; + b = { + get: c, set: function (a) { + u.k('The property "' + f + '" is read-only and cannot be set to ' + a) + } + }; + if (void 0 !== d) for (var h in d) b[h] = d[h]; + Object.defineProperty(a.prototype, e, b); + d = Object.getOwnPropertyDescriptor(a.prototype, e); + f && d && Object.defineProperty(a.prototype, f, d); + break + } + }, + Xd: function (a, b) { + for (var c in b) b[c] = !0; + a.prototype.UB = b + }, + getTypeName: function (a) { + return void 0 === a ? "" : "string" === typeof a ? a : "function" === typeof a ? u.rg(a) : null === a ? "*" : "" + }, + rg: function (a) { + if ("function" === typeof a) { + if (a.hx) return a.hx; + if (a.name) return a.name; + var b = a.toString(), c = b.indexOf("("), b = b.substring(9, c).trim(); + if ("" !== b) return a.hx = b + } else if ("object" === typeof a && a.constructor) return u.rg(a.constructor); + return typeof a + }, + s: function (a, b, c) { + u.j(a, "function", "Util.defineEnumValue:classfunc"); + u.j(b, "string", "Util.defineEnumValue:name"); + u.j(c, "number", "Util.defineEnumValue:num"); + c = new ea(a, b, c); + Object.freeze(c); + a[b] = c; + var d = a.Dt; + d instanceof la || (d = new la("string", ea), a.Dt = d); + d.add(b, c); + return c + }, + sb: function (a, b) { + if (!a || !b) return null; + var c = void 0; + try { + "function" === typeof b ? c = b(a) : "function" === typeof a.getAttribute ? (c = a.getAttribute(b), null === c && (c = void 0)) : c = a[b] + } catch (d) { + } + return c + }, + Oa: function (a, b, c) { + if (a && b) try { + "function" === typeof b ? b(a, c) : "function" === typeof a.setAttribute ? a.setAttribute(b, c) : a[b] = c + } catch (d) { + } + }, + ot: function (a, b) { + u.j(a, "object", "Setting properties requires Objects as arguments"); + u.j(b, "object", "Setting properties requires Objects as arguments"); + var c = a instanceof A, d = a instanceof D, e; + for (e in b) { + "" === e && u.k("Setting properties requires non-empty property names"); + var f = a, h = e; + if (c || d) { + var k = e.indexOf("."); + if (0 < k) { + var l = e.substring(0, k); + if (c) f = a.je(l); else if (f = a[l], void 0 === f || null === f) f = a.tb[l]; + u.Sa(f) ? h = e.substr(k + 1) : u.k("Unable to find object named: " + l + " in " + a.toString() + " when trying to set property: " + e) + } + } + if ("_" !== h[0] && !u.jz(f, h)) if (d && u.jz(a.tb, h)) f = a.tb; else if (d && ma(a, h)) { + a.Ky(h, b[h]); + continue + } else u.k('Trying to set undefined property "' + h + '" on object: ' + f.toString()); + f[h] = b[e]; + "_" === h[0] && (k = f.Bl, u.isArray(k) || (k = [], f.Bl = k), k.push(h)) + } + }, + jz: function (a, + b) { + if (a.hasOwnProperty(b)) return !0; + for (var c = Object.getPrototypeOf(a); c && c !== Function;) { + if (c.hasOwnProperty(b)) return !0; + var d = c.UB; + if (d && d[b]) return !0; + c = Object.getPrototypeOf(c) + } + return !1 + }, + VC: function (a, b) { + if (!u.Sa(b) || b instanceof Element || b instanceof CanvasRenderingContext2D || b instanceof oa || b instanceof pa) return ""; + var c = "", d; + for (d in b) if ("string" !== typeof d) "" === c && (c = b + "\n"), c += " " + d + " is not a string property\n"; else if ("_" !== d.charAt(0) && !(2 >= d.length)) { + var e = u.sb(b, d); + null === e || "function" === + typeof e || u.jz(b, d) || ("" === c && (c = b + "\n"), c += ' unknown property "' + d + '" has value: ' + e + " at " + a + "\n") + } + return c + }, + Kv: function (a, b) { + if (null !== b && "number" !== typeof b && "string" !== typeof b && "boolean" !== typeof b && "function" !== typeof b) if (void 0 !== u.Uc(b)) { + if (!u.bv.contains(b)) if (u.bv.add(b), u.Ju.add(u.VC(a, b)), b instanceof E || b instanceof F || b instanceof la) for (var c = b.i; c.next();) u.Kv(a + "[" + c.key + "]", c.value); else for (c in b) { + var d = u.sb(b, c); + if (void 0 !== d && null !== d && u.Sa(d) && d !== b.UB) { + if (b instanceof qa) { + if (d === + b.ej) continue + } else if (b instanceof A) { + if ("data" === c || d === b.qh) continue; + if ("itemArray" === c || d === b.gi) continue; + if (b instanceof G && d === b.Bk) continue + } else if (!(b instanceof D)) if (b instanceof sa) { + if ("archetypeGroupData" === c || d === b.ax) continue + } else if (b instanceof ta) { + if ("archetypeLinkData" === c || d === b.ex) continue; + if ("archetypeLabelNodeData" === c || d === b.bx) continue + } else if (b instanceof va) { + if ("archetypeNodeData" === c || d === b.ik) continue + } else if (b instanceof J) { + if ("nodeDataArray" === c || d === b.mf) continue; + if ("linkDataArray" === + c || d === b.Bh || d === b.Rl) continue; + if (d === b.tc) continue; + if (d === b.uh) continue + } else if (b instanceof xa || b instanceof ya || b instanceof Aa) continue; + u.Kv(a + "." + c, d) + } + } + } else if (Array.isArray(b)) for (c = 0; c < b.length; c++) u.Kv(a + "[" + c + "]", b[c]); else u.Ju.add(u.VC(a, b)) + }, + check: function (a) { + void 0 === u.bv ? u.bv = new F(Object) : u.bv.clear(); + u.Ju = new Ba; + u.Kv("", a); + a = u.Ju.toString(); + u.Ju = null; + return a + }, + PH: function (a) { + for (var b = [], c = 0; 256 > c; c++) b[c] = c; + for (var d = 0, e = 0, c = 0; 256 > c; c++) d = (d + b[c] + 119) % 256, e = b[c], b[c] = b[d], b[d] = e; + for (var d = c = 0, f = "", h = 0; h < a.length; h++) c = (c + 1) % 256, d = (d + b[c]) % 256, e = b[c], b[c] = b[d], b[d] = e, f += String.fromCharCode(a.charCodeAt(h) ^ b[(b[c] + b[d]) % 256]); + return f + }, + PG: function (a) { + for (var b = [], c = 0; 256 > c; c++) b["0123456789abcdef".charAt(c >> 4) + "0123456789abcdef".charAt(c & 15)] = String.fromCharCode(c); + a.length % 2 && (a = "0" + a); + for (var d = [], e = 0, c = 0; c < a.length; c += 2) d[e++] = b[a.substr(c, 2)]; + a = d.join(""); + return "" === a ? "0" : a + }, + Da: function (a) { + return u.PH(u.PG(a)) + }, + wl: null, + adym: "7da71ca0ad381e90", + XF: "@COLOR1", + YF: "@COLOR2" + }; + u.wl = function () { + var a = window.document.createElement("canvas"), b = a.getContext("2d"); + b[u.Da("7ca11abfd022028846")] = u.Da("398c3597c01238"); + for (var c = ["5da73c80a3330d854f9e5e671d6633", "32ab5ff3b26f42dc0ed90f22412913b54ae6247590da4bb21c324ba3a84e385776", "54a702f3e53909c447824c6706603faf4cfb236cdfda5de14c134ba1a95a2d4c7cc6f93c1387", "74bf19bce72555874c86"], d = 1; 5 > d; d++) b[u.Da("7ca11abfd7330390")](u.Da(c[d - 1]), 10, 15 * d + 0); + b[u.Da("7ca11abfd022028846")] = u.Da("39f046ebb36e4b"); + for (d = 1; 5 > d; d++) b[u.Da("7ca11abfd7330390")](u.Da(c[d - + 1]), 10, 15 * d + 0); + if (4 !== c.length || "5" !== c[0][0] || "7" !== c[3][0]) u.s = function (a, b) { + var c = new ea(a, b, 2); + Object.freeze(c); + a[b] = c; + var d = a.Dt; + d instanceof la || (d = new la("string", ea), a.Dt = d); + d.add(b, c); + return c + }; + return a + }(); + + function ea(a, b, c) { + u.gc(this); + this.HA = a; + this.Ub = b; + this.FF = c + } + + ea.prototype.toString = function () { + return u.rg(this.HA) + "." + this.Ub + }; + u.u(ea, {Ae: "classType"}, function () { + return this.HA + }); + u.u(ea, {name: "name"}, function () { + return this.Ub + }); + u.u(ea, {value: "value"}, function () { + return this.FF + }); + var Da; + ea.findName = Da = function (a, b) { + if (null === b || "" === b) return null; + u.j(a, "function", "findName:classfunc"); + u.j(b, "string", "EnumValue.findName:name"); + var c = a.Dt; + return c instanceof la ? c.ta(b) : null + }; + + function Ba() { + this.FA = [] + } + + Ba.prototype.toString = function () { + return this.FA.join("") + }; + Ba.prototype.add = function (a) { + "" !== a && this.FA.push(a) + }; + + function pa() { + } + + function Ga(a) { + void 0 === a && (a = 42); + this.seed = a; + this.Pw = 48271; + this.Ct = 2147483647; + this.uA = this.Ct / this.Pw; + this.hF = this.Ct % this.Pw; + this.dF = 1 / this.Ct; + this.random() + } + + Ga.prototype.random = function () { + var a = this.seed % this.uA * this.Pw - this.seed / this.uA * this.hF; + this.seed = 0 < a ? a : a + this.Ct; + return this.seed * this.dF + }; + + function Ha() { + } + + u.u(Ha, {i: "iterator"}, function () { + return this + }); + Ha.prototype.reset = Ha.prototype.reset = function () { + }; + Ha.prototype.next = Ha.prototype.hasNext = Ha.prototype.next = function () { + return !1 + }; + Ha.prototype.first = Ha.prototype.first = function () { + return null + }; + Ha.prototype.any = function () { + return !1 + }; + Ha.prototype.all = function () { + return !0 + }; + Ha.prototype.each = function () { + }; + u.u(Ha, {count: "count"}, function () { + return 0 + }); + Ha.prototype.Vf = function () { + }; + Ha.prototype.toString = function () { + return "EmptyIterator" + }; + var Ia = new Ha; + + function Ja(a) { + this.key = -1; + this.value = a + } + + u.Xd(Ja, {key: !0, value: !0}); + u.u(Ja, {i: "iterator"}, function () { + return this + }); + Ja.prototype.reset = Ja.prototype.reset = function () { + this.key = -1 + }; + Ja.prototype.next = Ja.prototype.hasNext = Ja.prototype.next = function () { + return -1 === this.key ? (this.key = 0, !0) : !1 + }; + Ja.prototype.first = Ja.prototype.first = function () { + this.key = 0; + return this.value + }; + Ja.prototype.any = function (a) { + this.key = -1; + return a(this.value) + }; + Ja.prototype.all = function (a) { + this.key = -1; + return a(this.value) + }; + Ja.prototype.each = function (a) { + this.key = -1; + a(this.value) + }; + u.u(Ja, {count: "count"}, function () { + return 1 + }); + Ja.prototype.Vf = function () { + this.value = null + }; + Ja.prototype.toString = function () { + return "SingletonIterator(" + this.value + ")" + }; + + function Ka(a) { + this.xd = a; + this.sj = null; + this.reset() + } + + u.Xd(Ka, {key: !0, value: !0}); + u.u(Ka, {i: "iterator"}, function () { + return this + }); + u.defineProperty(Ka, {Km: "predicate"}, function () { + return this.sj + }, function (a) { + this.sj = a + }); + Ka.prototype.reset = Ka.prototype.reset = function () { + var a = this.xd; + a.wd = null; + this.Xa = a.U; + this.ud = -1 + }; + Ka.prototype.next = Ka.prototype.hasNext = Ka.prototype.next = function () { + var a = this.xd; + if (a.U !== this.Xa) { + if (0 > this.key) return !1; + u.Mb(a) + } + var a = a.n, b = a.length, c = ++this.ud, d = this.sj; + if (null !== d) for (; c < b;) { + var e = a[c]; + if (d(e)) return this.key = this.ud = c, this.value = e, !0; + c++ + } else { + if (c < b) return this.key = c, this.value = a[c], !0; + this.Vf() + } + return !1 + }; + Ka.prototype.first = Ka.prototype.first = function () { + var a = this.xd; + this.Xa = a.U; + this.ud = 0; + var a = a.n, b = a.length, c = this.sj; + if (null !== c) { + for (var d = 0; d < b;) { + var e = a[d]; + if (c(e)) return this.key = this.ud = d, this.value = e; + d++ + } + return null + } + return 0 < b ? (e = a[0], this.key = 0, this.value = e) : null + }; + Ka.prototype.any = function (a) { + var b = this.xd; + b.wd = null; + var c = b.U; + this.ud = -1; + for (var d = b.n, e = d.length, f = this.sj, h = 0; h < e; h++) { + var k = d[h]; + if (null === f || f(k)) { + if (a(k)) return !0; + b.U !== c && u.Mb(b) + } + } + return !1 + }; + Ka.prototype.all = function (a) { + var b = this.xd; + b.wd = null; + var c = b.U; + this.ud = -1; + for (var d = b.n, e = d.length, f = this.sj, h = 0; h < e; h++) { + var k = d[h]; + if (null === f || f(k)) { + if (!a(k)) return !1; + b.U !== c && u.Mb(b) + } + } + return !0 + }; + Ka.prototype.each = function (a) { + var b = this.xd; + b.wd = null; + var c = b.U; + this.ud = -1; + for (var d = b.n, e = d.length, f = this.sj, h = 0; h < e; h++) { + var k = d[h]; + if (null === f || f(k)) a(k), b.U !== c && u.Mb(b) + } + }; + u.u(Ka, {count: "count"}, function () { + var a = this.sj; + if (null !== a) { + for (var b = 0, c = this.xd.n, d = c.length, e = 0; e < d; e++) a(c[e]) && b++; + return b + } + return this.xd.n.length + }); + Ka.prototype.Vf = function () { + this.key = -1; + this.value = null; + this.Xa = -1; + this.sj = null; + this.xd.wd = this + }; + Ka.prototype.toString = function () { + return "ListIterator@" + this.ud + "/" + this.xd.count + }; + + function La(a) { + this.xd = a; + this.reset() + } + + u.Xd(La, {key: !0, value: !0}); + u.u(La, {i: "iterator"}, function () { + return this + }); + La.prototype.reset = La.prototype.reset = function () { + var a = this.xd; + a.In = null; + this.Xa = a.U; + this.ud = a.n.length + }; + La.prototype.next = La.prototype.hasNext = La.prototype.next = function () { + var a = this.xd; + if (a.U !== this.Xa) { + if (0 > this.key) return !1; + u.Mb(a) + } + var b = --this.ud; + if (0 <= b) return this.key = b, this.value = a.n[b], !0; + this.Vf(); + return !1 + }; + La.prototype.first = La.prototype.first = function () { + var a = this.xd; + this.Xa = a.U; + var b = a.n; + this.ud = a = b.length - 1; + return 0 <= a ? (b = b[a], this.key = a, this.value = b) : null + }; + La.prototype.any = function (a) { + var b = this.xd; + b.In = null; + var c = b.U, d = b.n, e = d.length; + this.ud = e; + for (e -= 1; 0 <= e; e++) { + if (a(d[e])) return !0; + b.U !== c && u.Mb(b) + } + return !1 + }; + La.prototype.all = function (a) { + var b = this.xd; + b.In = null; + var c = b.U, d = b.n, e = d.length; + this.ud = e; + for (e -= 1; 0 <= e; e++) { + if (!a(d[e])) return !1; + b.U !== c && u.Mb(b) + } + return !0 + }; + La.prototype.each = function (a) { + var b = this.xd; + b.In = null; + var c = b.U, d = b.n, e = d.length; + this.ud = e; + for (e -= 1; 0 <= e; e++) a(d[e]), b.U !== c && u.Mb(b) + }; + u.u(La, {count: "count"}, function () { + return this.xd.n.length + }); + La.prototype.Vf = function () { + this.key = -1; + this.value = null; + this.Xa = -1; + this.xd.In = this + }; + La.prototype.toString = function () { + return "ListIteratorBackwards(" + this.ud + "/" + this.xd.count + ")" + }; + + function E(a) { + u.gc(this); + this.Ca = !1; + this.n = []; + this.U = 0; + this.In = this.wd = null; + void 0 === a || null === a ? this.oa = null : "string" === typeof a ? "object" === a || "string" === a || "number" === a || "boolean" === a || "function" === a ? this.oa = a : u.wa(a, "the string 'object', 'number', 'string', 'boolean', or 'function'", "List constructor: type") : "function" === typeof a ? this.oa = a === Object ? "object" : a === String ? "string" : a === Number ? "number" : a === Boolean ? "boolean" : a === Function ? "function" : a : u.wa(a, "null, a primitive type name, or a class type", + "List constructor: type") + } + + u.fa("List", E); + E.prototype.Pd = function () { + var a = this.U; + a++; + 999999999 < a && (a = 0); + this.U = a + }; + E.prototype.freeze = E.prototype.freeze = function () { + this.Ca = !0; + return this + }; + E.prototype.thaw = E.prototype.La = function () { + this.Ca = !1; + return this + }; + E.prototype.toString = function () { + return "List(" + u.getTypeName(this.oa) + ")#" + u.Uc(this) + }; + E.prototype.add = E.prototype.push = E.prototype.add = function (a) { + null !== a && (u.I(this, a), this.n.push(a), this.Pd()) + }; + E.prototype.addAll = E.prototype.Td = function (a) { + if (null === a) return this; + u.I(this); + var b = this.n; + if (u.isArray(a)) for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + b.push(e) + } else for (a = a.i; a.next();) e = a.value, b.push(e); + this.Pd(); + return this + }; + E.prototype.clear = E.prototype.clear = function () { + u.I(this); + this.n.length = 0; + this.Pd() + }; + E.prototype.contains = E.prototype.has = E.prototype.contains = function (a) { + return null === a ? !1 : -1 !== this.n.indexOf(a) + }; + E.prototype.indexOf = E.prototype.indexOf = function (a) { + return null === a ? -1 : this.n.indexOf(a) + }; + E.prototype.elt = E.prototype.get = E.prototype.ja = function (a) { + var b = this.n; + (0 > a || a >= b.length) && u.wa(a, "0 <= i < length", E, "elt:i"); + return b[a] + }; + E.prototype.setElt = E.prototype.set = E.prototype.Bg = function (a, b) { + var c = this.n; + (0 > a || a >= c.length) && u.wa(a, "0 <= i < length", E, "setElt:i"); + u.I(this, a); + c[a] = b + }; + E.prototype.first = E.prototype.first = function () { + var a = this.n; + return 0 === a.length ? null : a[0] + }; + E.prototype.last = E.prototype.Gd = function () { + var a = this.n, b = a.length; + return 0 < b ? a[b - 1] : null + }; + E.prototype.pop = E.prototype.pop = function () { + u.I(this); + var a = this.n; + return 0 < a.length ? a.pop() : null + }; + E.prototype.any = function (a) { + for (var b = this.n, c = this.U, d = b.length, e = 0; e < d; e++) { + if (a(b[e])) return !0; + this.U !== c && u.Mb(this) + } + return !1 + }; + E.prototype.all = function (a) { + for (var b = this.n, c = this.U, d = b.length, e = 0; e < d; e++) { + if (!a(b[e])) return !1; + this.U !== c && u.Mb(this) + } + return !0 + }; + E.prototype.each = function (a) { + for (var b = this.n, c = this.U, d = b.length, e = 0; e < d; e++) a(b[e]), this.U !== c && u.Mb(this) + }; + E.prototype.insertAt = E.prototype.Yd = function (a, b) { + 0 > a && u.wa(a, ">= 0", E, "insertAt:i"); + u.I(this, a); + var c = this.n; + a >= c.length ? c.push(b) : c.splice(a, 0, b); + this.Pd(); + return !0 + }; + E.prototype.remove = E.prototype["delete"] = E.prototype.remove = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = this.n; + a = b.indexOf(a); + if (-1 === a) return !1; + a === b.length - 1 ? b.pop() : b.splice(a, 1); + this.Pd(); + return !0 + }; + E.prototype.removeAt = E.prototype.hd = function (a) { + var b = this.n; + (0 > a || a >= b.length) && u.wa(a, "0 <= i < length", E, "removeAt:i"); + u.I(this, a); + a === b.length - 1 ? b.pop() : b.splice(a, 1); + this.Pd() + }; + E.prototype.removeRange = E.prototype.removeRange = function (a, b) { + var c = this.n; + (0 > a || a >= c.length) && u.wa(a, "0 <= from < length", E, "elt:from"); + (0 > b || b >= c.length) && u.wa(b, "0 <= to < length", E, "elt:to"); + u.I(this, a); + var d = c.slice((b || a) + 1 || c.length); + c.length = 0 > a ? c.length + a : a; + c.push.apply(c, d); + this.Pd() + }; + E.prototype.copy = function () { + for (var a = new E(this.oa), b = this.n, c = this.count, d = 0; d < c; d++) a.add(b[d]); + return a + }; + E.prototype.toArray = E.prototype.Ke = function () { + for (var a = this.n, b = this.count, c = Array(b), d = 0; d < b; d++) c[d] = a[d]; + return c + }; + E.prototype.toSet = function () { + for (var a = new F(this.oa), b = this.n, c = this.count, d = 0; d < c; d++) a.add(b[d]); + return a + }; + E.prototype.sort = E.prototype.sort = function (a) { + u.I(this); + this.n.sort(a); + this.Pd(); + return this + }; + E.prototype.sortRange = E.prototype.hp = function (a, b, c) { + var d = this.n, e = d.length; + void 0 === b && (b = 0); + void 0 === c && (c = e); + u.I(this); + var f = c - b; + if (1 >= f) return this; + (0 > b || b >= e - 1) && u.wa(b, "0 <= from < length", E, "sortRange:from"); + if (2 === f) return c = d[b], e = d[b + 1], 0 < a(c, e) && (d[b] = e, d[b + 1] = c, this.Pd()), this; + if (0 === b) if (c >= e) d.sort(a); else for (f = d.slice(0, c), f.sort(a), a = 0; a < c; a++) d[a] = f[a]; else if (c >= e) for (f = d.slice(b), f.sort(a), a = b; a < e; a++) d[a] = f[a - b]; else for (f = d.slice(b, c), f.sort(a), a = b; a < c; a++) d[a] = f[a - b]; + this.Pd(); + return this + }; + E.prototype.reverse = E.prototype.reverse = function () { + u.I(this); + this.n.reverse(); + this.Pd(); + return this + }; + u.u(E, {count: "count"}, function () { + return this.n.length + }); + u.u(E, {size: "size"}, function () { + return this.n.length + }); + u.u(E, {length: "length"}, function () { + return this.n.length + }); + u.u(E, {i: "iterator"}, function () { + if (0 >= this.n.length) return Ia; + var a = this.wd; + return null !== a ? (a.reset(), a) : new Ka(this) + }); + u.u(E, {Fm: "iteratorBackwards"}, function () { + if (0 >= this.n.length) return Ia; + var a = this.In; + return null !== a ? (a.reset(), a) : new La(this) + }); + + function Ma(a) { + this.Gk = a; + this.reset() + } + + u.Xd(Ma, {key: !0, value: !0}); + u.u(Ma, {i: "iterator"}, function () { + return this + }); + Ma.prototype.reset = Ma.prototype.reset = function () { + var a = this.Gk; + a.wd = null; + this.Xa = a.U; + this.Cb = null + }; + Ma.prototype.next = Ma.prototype.hasNext = Ma.prototype.next = function () { + var a = this.Gk; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.value = b.value, this.key = b.key, !0; + this.Vf(); + return !1 + }; + Ma.prototype.first = Ma.prototype.first = function () { + var a = this.Gk; + this.Xa = a.U; + a = a.bb; + if (null !== a) { + this.Cb = a; + var b = a.value; + this.key = a.key; + return this.value = b + } + return null + }; + Ma.prototype.any = function (a) { + var b = this.Gk; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d.value)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Ma.prototype.all = function (a) { + var b = this.Gk; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d.value)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Ma.prototype.each = function (a) { + var b = this.Gk; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d.value), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Ma, {count: "count"}, function () { + return this.Gk.Zc + }); + Ma.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1; + this.Gk.wd = this + }; + Ma.prototype.toString = function () { + return null !== this.Cb ? "SetIterator@" + this.Cb.value : "SetIterator" + }; + + function F(a) { + u.gc(this); + this.Ca = !1; + void 0 === a || null === a ? this.oa = null : "string" === typeof a ? "object" === a || "string" === a || "number" === a ? this.oa = a : u.wa(a, "the string 'object', 'number' or 'string'", "Set constructor: type") : "function" === typeof a ? this.oa = a === Object ? "object" : a === String ? "string" : a === Number ? "number" : a : u.wa(a, "null, a primitive type name, or a class type", "Set constructor: type"); + this.$c = {}; + this.Zc = 0; + this.wd = null; + this.U = 0; + this.Ah = this.bb = null + } + + u.fa("Set", F); + F.prototype.Pd = function () { + var a = this.U; + a++; + 999999999 < a && (a = 0); + this.U = a + }; + F.prototype.freeze = F.prototype.freeze = function () { + this.Ca = !0; + return this + }; + F.prototype.thaw = F.prototype.La = function () { + this.Ca = !1; + return this + }; + F.prototype.toString = function () { + return "Set(" + u.getTypeName(this.oa) + ")#" + u.Uc(this) + }; + F.prototype.add = F.prototype.add = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = a; + u.Sa(a) && (b = u.Is(a)); + return void 0 === this.$c[b] ? (this.Zc++, a = new Pa(a, a), this.$c[b] = a, b = this.Ah, null === b ? this.bb = a : (a.Un = b, b.Sb = a), this.Ah = a, this.Pd(), !0) : !1 + }; + F.prototype.addAll = F.prototype.Td = function (a) { + if (null === a) return this; + u.I(this); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.add(u.fb(a, c)); else for (a = a.i; a.next();) this.add(a.value); + return this + }; + F.prototype.contains = F.prototype.has = F.prototype.contains = function (a) { + if (null === a) return !1; + var b = a; + return u.Sa(a) && (b = u.Uc(a), void 0 === b) ? !1 : void 0 !== this.$c[b] + }; + F.prototype.containsAll = function (a) { + if (null === a) return !0; + for (a = a.i; a.next();) if (!this.contains(a.value)) return !1; + return !0 + }; + F.prototype.containsAny = function (a) { + if (null === a) return !0; + for (a = a.i; a.next();) if (this.contains(a.value)) return !0; + return !1 + }; + F.prototype.first = F.prototype.first = function () { + var a = this.bb; + return null === a ? null : a.value + }; + F.prototype.any = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (a(c.value)) return !0; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !1 + }; + F.prototype.all = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (!a(c.value)) return !1; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !0 + }; + F.prototype.each = function (a) { + for (var b = this.U, c = this.bb; null !== c;) a(c.value), this.U !== b && u.Mb(this), c = c.Sb + }; + F.prototype.remove = F.prototype["delete"] = F.prototype.remove = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = a; + if (u.Sa(a) && (b = u.Uc(a), void 0 === b)) return !1; + a = this.$c[b]; + if (void 0 === a) return !1; + var c = a.Sb, d = a.Un; + null !== c && (c.Un = d); + null !== d && (d.Sb = c); + this.bb === a && (this.bb = c); + this.Ah === a && (this.Ah = d); + delete this.$c[b]; + this.Zc--; + this.Pd(); + return !0 + }; + F.prototype.removeAll = F.prototype.jE = function (a) { + if (null === a) return this; + u.I(this); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.remove(u.fb(a, c)); else for (a = a.i; a.next();) this.remove(a.value); + return this + }; + F.prototype.retainAll = function (a) { + if (null === a || 0 === this.count) return this; + u.I(this); + var b = new F(this.oa); + b.Td(a); + a = new E(this.oa); + for (var c = this.i; c.next();) b.contains(c.value) || a.add(c.value); + for (b = a.i; b.next();) this.remove(b.value); + return this + }; + F.prototype.clear = F.prototype.clear = function () { + u.I(this); + this.$c = {}; + this.Zc = 0; + this.Ah = this.bb = null; + this.Pd() + }; + F.prototype.copy = function () { + var a = new F(this.oa), b = this.$c, c; + for (c in b) a.add(b[c].value); + return a + }; + F.prototype.toArray = F.prototype.Ke = function () { + var a = Array(this.Zc), b = this.$c, c = 0, d; + for (d in b) a[c] = b[d].value, c++; + return a + }; + F.prototype.toList = function () { + var a = new E(this.oa), b = this.$c, c; + for (c in b) a.add(b[c].value); + return a + }; + u.u(F, {count: "count"}, function () { + return this.Zc + }); + u.u(F, {size: "size"}, function () { + return this.Zc + }); + u.u(F, {i: "iterator"}, function () { + if (0 >= this.Zc) return Ia; + var a = this.wd; + return null !== a ? (a.reset(), a) : new Ma(this) + }); + + function Qa(a) { + this.Wa = a; + this.reset() + } + + u.Xd(Qa, {key: !0, value: !0}); + u.u(Qa, {i: "iterator"}, function () { + return this + }); + Qa.prototype.reset = Qa.prototype.reset = function () { + this.Xa = this.Wa.U; + this.Cb = null + }; + Qa.prototype.next = Qa.prototype.hasNext = Qa.prototype.next = function () { + var a = this.Wa; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.value = this.key = a = b.key, !0; + this.Vf(); + return !1 + }; + Qa.prototype.first = Qa.prototype.first = function () { + var a = this.Wa; + this.Xa = a.U; + a = a.bb; + return null !== a ? (this.Cb = a, this.value = this.key = a = a.key) : null + }; + Qa.prototype.any = function (a) { + var b = this.Wa, c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d.key)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Qa.prototype.all = function (a) { + var b = this.Wa, c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d.key)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Qa.prototype.each = function (a) { + var b = this.Wa, c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d.key), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Qa, {count: "count"}, function () { + return this.Wa.Zc + }); + Qa.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1 + }; + Qa.prototype.toString = function () { + return null !== this.Cb ? "MapKeySetIterator@" + this.Cb.value : "MapKeySetIterator" + }; + + function Ra(a) { + u.gc(this); + this.Ca = !0; + this.Wa = a + } + + u.Ga(Ra, F); + Ra.prototype.freeze = function () { + return this + }; + Ra.prototype.La = function () { + return this + }; + Ra.prototype.toString = function () { + return "MapKeySet(" + this.Wa.toString() + ")" + }; + Ra.prototype.add = Ra.prototype.set = Ra.prototype.add = function () { + u.k("This Set is read-only: " + this.toString()); + return !1 + }; + Ra.prototype.contains = Ra.prototype.has = Ra.prototype.contains = function (a) { + return this.Wa.contains(a) + }; + Ra.prototype.remove = Ra.prototype["delete"] = Ra.prototype.remove = function () { + u.k("This Set is read-only: " + this.toString()); + return !1 + }; + Ra.prototype.clear = Ra.prototype.clear = function () { + u.k("This Set is read-only: " + this.toString()) + }; + Ra.prototype.first = Ra.prototype.first = function () { + var a = this.Wa.bb; + return null !== a ? a.key : null + }; + Ra.prototype.any = function (a) { + for (var b = this.Wa.bb; null !== b;) { + if (a(b.key)) return !0; + b = b.Sb + } + return !1 + }; + Ra.prototype.all = function (a) { + for (var b = this.Wa.bb; null !== b;) { + if (!a(b.key)) return !1; + b = b.Sb + } + return !0 + }; + Ra.prototype.each = function (a) { + for (var b = this.Wa.bb; null !== b;) a(b.key), b = b.Sb + }; + Ra.prototype.copy = function () { + return new Ra(this.Wa) + }; + Ra.prototype.toSet = function () { + var a = new F(this.Wa.wq), b = this.Wa.$c, c; + for (c in b) a.add(b[c].key); + return a + }; + Ra.prototype.toArray = Ra.prototype.Ke = function () { + var a = this.Wa.$c, b = Array(this.Wa.Zc), c = 0, d; + for (d in a) b[c] = a[d].key, c++; + return b + }; + Ra.prototype.toList = function () { + var a = new E(this.oa), b = this.Wa.$c, c; + for (c in b) a.add(b[c].key); + return a + }; + u.u(Ra, {count: "count"}, function () { + return this.Wa.Zc + }); + u.u(Ra, {size: "size"}, function () { + return this.Wa.Zc + }); + u.u(Ra, {i: "iterator"}, function () { + return 0 >= this.Wa.Zc ? Ia : new Qa(this.Wa) + }); + + function Sa(a) { + this.Wa = a; + this.reset() + } + + u.Xd(Sa, {key: !0, value: !0}); + u.u(Sa, {i: "iterator"}, function () { + return this + }); + Sa.prototype.reset = Sa.prototype.reset = function () { + var a = this.Wa; + a.Jn = null; + this.Xa = a.U; + this.Cb = null + }; + Sa.prototype.next = Sa.prototype.hasNext = Sa.prototype.next = function () { + var a = this.Wa; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.value = b.value, this.key = b.key, !0; + this.Vf(); + return !1 + }; + Sa.prototype.first = Sa.prototype.first = function () { + var a = this.Wa; + this.Xa = a.U; + a = a.bb; + if (null !== a) { + this.Cb = a; + var b = a.value; + this.key = a.key; + return this.value = b + } + return null + }; + Sa.prototype.any = function (a) { + var b = this.Wa; + b.Jn = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d.value)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Sa.prototype.all = function (a) { + var b = this.Wa; + b.Jn = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d.value)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Sa.prototype.each = function (a) { + var b = this.Wa; + b.Jn = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d.value), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Sa, {count: "count"}, function () { + return this.Wa.Zc + }); + Sa.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1; + this.Wa.Jn = this + }; + Sa.prototype.toString = function () { + return null !== this.Cb ? "MapValueSetIterator@" + this.Cb.value : "MapValueSetIterator" + }; + + function Pa(a, b) { + this.key = a; + this.value = b; + this.Un = this.Sb = null + } + + u.Xd(Pa, {key: !0, value: !0}); + Pa.prototype.toString = function () { + return "{" + this.key + ":" + this.value + "}" + }; + + function Ua(a) { + this.Wa = a; + this.reset() + } + + u.Xd(Ua, {key: !0, value: !0}); + u.u(Ua, {i: "iterator"}, function () { + return this + }); + Ua.prototype.reset = Ua.prototype.reset = function () { + var a = this.Wa; + a.wd = null; + this.Xa = a.U; + this.Cb = null + }; + Ua.prototype.next = Ua.prototype.hasNext = Ua.prototype.next = function () { + var a = this.Wa; + if (a.U !== this.Xa) { + if (null === this.key) return !1; + u.Mb(a) + } + var b = this.Cb, b = null === b ? a.bb : b.Sb; + if (null !== b) return this.Cb = b, this.key = b.key, this.value = b.value, !0; + this.Vf(); + return !1 + }; + Ua.prototype.first = Ua.prototype.first = function () { + var a = this.Wa; + this.Xa = a.U; + a = a.bb; + return null !== a ? (this.Cb = a, this.key = a.key, this.value = a.value, a) : null + }; + Ua.prototype.any = function (a) { + var b = this.Wa; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (a(d)) return !0; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !1 + }; + Ua.prototype.all = function (a) { + var b = this.Wa; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) { + if (!a(d)) return !1; + b.U !== c && u.Mb(b); + d = d.Sb + } + return !0 + }; + Ua.prototype.each = function (a) { + var b = this.Wa; + b.wd = null; + var c = b.U; + this.Cb = null; + for (var d = b.bb; null !== d;) a(d), b.U !== c && u.Mb(b), d = d.Sb + }; + u.u(Ua, {count: "count"}, function () { + return this.Wa.Zc + }); + Ua.prototype.Vf = function () { + this.value = this.key = null; + this.Xa = -1; + this.Wa.wd = this + }; + Ua.prototype.toString = function () { + return null !== this.Cb ? "MapIterator@" + this.Cb : "MapIterator" + }; + + function la(a, b) { + u.gc(this); + this.Ca = !1; + void 0 === a || null === a ? this.wq = null : "string" === typeof a ? "object" === a || "string" === a || "number" === a ? this.wq = a : u.wa(a, "the string 'object', 'number' or 'string'", "Map constructor: keytype") : "function" === typeof a ? this.wq = a === Object ? "object" : a === String ? "string" : a === Number ? "number" : a : u.wa(a, "null, a primitive type name, or a class type", "Map constructor: keytype"); + void 0 === b || null === b ? this.tv = null : "string" === typeof b ? "object" === b || "string" === b || "boolean" === b || "number" === + b || "function" === b ? this.tv = b : u.wa(b, "the string 'object', 'number', 'string', 'boolean', or 'function'", "Map constructor: valtype") : "function" === typeof b ? this.tv = b === Object ? "object" : b === String ? "string" : b === Number ? "number" : b === Boolean ? "boolean" : b === Function ? "function" : b : u.wa(b, "null, a primitive type name, or a class type", "Map constructor: valtype"); + this.$c = {}; + this.Zc = 0; + this.Jn = this.wd = null; + this.U = 0; + this.Ah = this.bb = null + } + + u.fa("Map", la); + la.prototype.Pd = function () { + var a = this.U; + a++; + 999999999 < a && (a = 0); + this.U = a + }; + la.prototype.freeze = la.prototype.freeze = function () { + this.Ca = !0; + return this + }; + la.prototype.thaw = la.prototype.La = function () { + this.Ca = !1; + return this + }; + la.prototype.toString = function () { + return "Map(" + u.getTypeName(this.wq) + "," + u.getTypeName(this.tv) + ")#" + u.Uc(this) + }; + la.prototype.add = la.prototype.set = la.prototype.add = function (a, b) { + u.I(this, a); + var c = a; + u.Sa(a) && (c = u.Is(a)); + var d = this.$c[c]; + if (void 0 === d) return this.Zc++, d = new Pa(a, b), this.$c[c] = d, c = this.Ah, null === c ? this.bb = d : (d.Un = c, c.Sb = d), this.Ah = d, this.Pd(), !0; + d.value = b; + return !1 + }; + la.prototype.addAll = la.prototype.Td = function (a) { + if (null === a) return this; + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + this.add(d.key, d.value) + } else for (a = a.i; a.next();) this.add(a.key, a.value); + return this + }; + la.prototype.first = la.prototype.first = function () { + return this.bb + }; + la.prototype.any = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (a(c)) return !0; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !1 + }; + la.prototype.all = function (a) { + for (var b = this.U, c = this.bb; null !== c;) { + if (!a(c)) return !1; + this.U !== b && u.Mb(this); + c = c.Sb + } + return !0 + }; + la.prototype.each = function (a) { + for (var b = this.U, c = this.bb; null !== c;) a(c), this.U !== b && u.Mb(this), c = c.Sb + }; + la.prototype.contains = la.prototype.has = la.prototype.contains = function (a) { + var b = a; + return u.Sa(a) && (b = u.Uc(a), void 0 === b) ? !1 : void 0 !== this.$c[b] + }; + la.prototype.getValue = la.prototype.get = la.prototype.ta = function (a) { + var b = a; + if (u.Sa(a) && (b = u.Uc(a), void 0 === b)) return null; + a = this.$c[b]; + return void 0 === a ? null : a.value + }; + la.prototype.remove = la.prototype["delete"] = la.prototype.remove = function (a) { + if (null === a) return !1; + u.I(this, a); + var b = a; + if (u.Sa(a) && (b = u.Uc(a), void 0 === b)) return !1; + a = this.$c[b]; + if (void 0 === a) return !1; + var c = a.Sb, d = a.Un; + null !== c && (c.Un = d); + null !== d && (d.Sb = c); + this.bb === a && (this.bb = c); + this.Ah === a && (this.Ah = d); + delete this.$c[b]; + this.Zc--; + this.Pd(); + return !0 + }; + la.prototype.clear = la.prototype.clear = function () { + u.I(this); + this.$c = {}; + this.Zc = 0; + this.Ah = this.bb = null; + this.Pd() + }; + la.prototype.copy = function () { + var a = new la(this.wq, this.tv), b = this.$c, c; + for (c in b) { + var d = b[c]; + a.add(d.key, d.value) + } + return a + }; + la.prototype.toArray = la.prototype.Ke = function () { + var a = this.$c, b = Array(this.Zc), c = 0, d; + for (d in a) { + var e = a[d]; + b[c] = new Pa(e.key, e.value); + c++ + } + return b + }; + la.prototype.toKeySet = la.prototype.Ni = function () { + return new Ra(this) + }; + u.u(la, {count: "count"}, function () { + return this.Zc + }); + u.u(la, {size: "size"}, function () { + return this.Zc + }); + u.u(la, {i: "iterator"}, function () { + if (0 >= this.count) return Ia; + var a = this.wd; + return null !== a ? (a.reset(), a) : new Ua(this) + }); + u.u(la, {NJ: "iteratorKeys"}, function () { + return 0 >= this.count ? Ia : new Qa(this) + }); + u.u(la, {RD: "iteratorValues"}, function () { + if (0 >= this.count) return Ia; + var a = this.Jn; + return null !== a ? (a.reset(), a) : new Sa(this) + }); + + function w(a, b) { + void 0 === a ? this.y = this.x = 0 : (this.x = a, this.y = b); + this.Ca = !1 + } + + u.fa("Point", w); + u.Lh(w); + u.Xd(w, {x: !0, y: !0}); + w.prototype.assign = function (a) { + this.x = a.x; + this.y = a.y + }; + w.prototype.setTo = w.prototype.m = function (a, b) { + this.x = a; + this.y = b; + return this + }; + w.prototype.set = w.prototype.set = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + return this + }; + w.prototype.copy = function () { + var a = new w; + a.x = this.x; + a.y = this.y; + return a + }; + g = w.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Point is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + w.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + return new w(c, e) + } + return new w + }; + w.stringify = function (a) { + return a instanceof w ? a.x.toString() + " " + a.y.toString() : a.toString() + }; + w.prototype.toString = function () { + return "Point(" + this.x + "," + this.y + ")" + }; + w.prototype.equals = w.prototype.L = function (a) { + return a instanceof w ? this.x === a.x && this.y === a.y : !1 + }; + w.prototype.equalTo = w.prototype.Tv = function (a, b) { + return this.x === a && this.y === b + }; + w.prototype.equalsApprox = w.prototype.De = function (a) { + return K.D(this.x, a.x) && K.D(this.y, a.y) + }; + w.prototype.add = w.prototype.add = function (a) { + this.I(); + this.x += a.x; + this.y += a.y; + return this + }; + w.prototype.subtract = w.prototype.vt = function (a) { + this.I(); + this.x -= a.x; + this.y -= a.y; + return this + }; + w.prototype.offset = w.prototype.offset = function (a, b) { + this.I(); + this.x += a; + this.y += b; + return this + }; + w.prototype.rotate = w.prototype.rotate = function (a) { + this.I(); + if (0 === a) return this; + var b = this.x, c = this.y; + if (0 === b && 0 === c) return this; + var d = 0, e = 0; + 360 <= a ? a -= 360 : 0 > a && (a += 360); + 90 === a ? (d = 0, e = 1) : 180 === a ? (d = -1, e = 0) : 270 === a ? (d = 0, e = -1) : (a = a * Math.PI / 180, d = Math.cos(a), e = Math.sin(a)); + this.x = d * b - e * c; + this.y = e * b + d * c; + return this + }; + w.prototype.scale = w.prototype.scale = function (a, b) { + this.x *= a; + this.y *= b; + return this + }; + w.prototype.distanceSquaredPoint = w.prototype.Lj = function (a) { + var b = a.x - this.x; + a = a.y - this.y; + return b * b + a * a + }; + w.prototype.distanceSquared = w.prototype.ss = function (a, b) { + var c = a - this.x, d = b - this.y; + return c * c + d * d + }; + w.prototype.normalize = w.prototype.normalize = function () { + this.I(); + var a = this.x, b = this.y, c = Math.sqrt(a * a + b * b); + 0 < c && (this.x = a / c, this.y = b / c); + return this + }; + w.prototype.directionPoint = w.prototype.Fi = function (a) { + return Va(a.x - this.x, a.y - this.y) + }; + w.prototype.direction = w.prototype.direction = function (a, b) { + return Va(a - this.x, b - this.y) + }; + + function Va(a, b) { + if (0 === a) return 0 < b ? 90 : 0 > b ? 270 : 0; + if (0 === b) return 0 < a ? 0 : 180; + if (isNaN(a) || isNaN(b)) return 0; + var c = 180 * Math.atan(Math.abs(b / a)) / Math.PI; + 0 > a ? c = 0 > b ? c + 180 : 180 - c : 0 > b && (c = 360 - c); + return c + } + + w.prototype.projectOntoLineSegment = function (a, b, c, d) { + K.Hm(a, b, c, d, this.x, this.y, this); + return this + }; + w.prototype.projectOntoLineSegmentPoint = function (a, b) { + K.Hm(a.x, a.y, b.x, b.y, this.x, this.y, this); + return this + }; + w.prototype.snapToGrid = function (a, b, c, d) { + K.xs(this.x, this.y, a, b, c, d, this); + return this + }; + w.prototype.snapToGridPoint = function (a, b) { + K.xs(this.x, this.y, a.x, a.y, b.width, b.height, this); + return this + }; + w.prototype.setRectSpot = w.prototype.pt = function (a, b) { + this.I(); + this.x = a.x + b.x * a.width + b.offsetX; + this.y = a.y + b.y * a.height + b.offsetY; + return this + }; + w.prototype.setSpot = w.prototype.rt = function (a, b, c, d, e) { + this.I(); + this.x = a + e.x * c + e.offsetX; + this.y = b + e.y * d + e.offsetY; + return this + }; + w.prototype.transform = function (a) { + a.ab(this); + return this + }; + + function Wa(a, b) { + b.Oh(a); + return a + } + + var Xa; + w.distanceLineSegmentSquared = Xa = function (a, b, c, d, e, f) { + var h = e - c, k = f - d, l = h * h + k * k; + c -= a; + d -= b; + var m = -c * h - d * k; + if (0 >= m || m >= l) return h = e - a, k = f - b, Math.min(c * c + d * d, h * h + k * k); + a = h * d - k * c; + return a * a / l + }; + var Ya; + w.distanceSquared = Ya = function (a, b, c, d) { + a = c - a; + b = d - b; + return a * a + b * b + }; + var Za; + w.direction = Za = function (a, b, c, d) { + a = c - a; + b = d - b; + if (0 === a) return 0 < b ? 90 : 0 > b ? 270 : 0; + if (0 === b) return 0 < a ? 0 : 180; + if (isNaN(a) || isNaN(b)) return 0; + d = 180 * Math.atan(Math.abs(b / a)) / Math.PI; + 0 > a ? d = 0 > b ? d + 180 : 180 - d : 0 > b && (d = 360 - d); + return d + }; + w.prototype.isReal = w.prototype.J = function () { + return isFinite(this.x) && isFinite(this.y) + }; + + function ia(a, b) { + void 0 === a ? this.height = this.width = 0 : (this.width = a, this.height = b); + this.Ca = !1 + } + + u.fa("Size", ia); + u.Lh(ia); + u.Xd(ia, {width: !0, height: !0}); + ia.prototype.assign = function (a) { + this.width = a.width; + this.height = a.height + }; + ia.prototype.setTo = ia.prototype.m = function (a, b) { + this.width = a; + this.height = b; + return this + }; + ia.prototype.set = ia.prototype.set = function (a) { + this.I(); + this.width = a.width; + this.height = a.height; + return this + }; + ia.prototype.copy = function () { + var a = new ia; + a.width = this.width; + a.height = this.height; + return a + }; + g = ia.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Size is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + ia.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + return new ia(c, e) + } + return new ia + }; + ia.stringify = function (a) { + return a instanceof ia ? a.width.toString() + " " + a.height.toString() : a.toString() + }; + ia.prototype.toString = function () { + return "Size(" + this.width + "," + this.height + ")" + }; + ia.prototype.equals = ia.prototype.L = function (a) { + return a instanceof ia ? this.width === a.width && this.height === a.height : !1 + }; + ia.prototype.equalTo = ia.prototype.Tv = function (a, b) { + return this.width === a && this.height === b + }; + ia.prototype.equalsApprox = ia.prototype.De = function (a) { + return K.D(this.width, a.width) && K.D(this.height, a.height) + }; + ia.prototype.isReal = ia.prototype.J = function () { + return isFinite(this.width) && isFinite(this.height) + }; + + function z(a, b, c, d) { + void 0 === a ? this.height = this.width = this.y = this.x = 0 : a instanceof w ? b instanceof w ? (this.x = Math.min(a.x, b.x), this.y = Math.min(a.y, b.y), this.width = Math.abs(a.x - b.x), this.height = Math.abs(a.y - b.y)) : b instanceof ia ? (this.x = a.x, this.y = a.y, this.width = b.width, this.height = b.height) : u.k("Incorrect arguments supplied to Rect constructor") : (this.x = a, this.y = b, this.width = c, this.height = d); + this.Ca = !1 + } + + u.fa("Rect", z); + u.Lh(z); + u.Xd(z, {x: !0, y: !0, width: !0, height: !0}); + z.prototype.assign = function (a) { + this.x = a.x; + this.y = a.y; + this.width = a.width; + this.height = a.height + }; + + function bb(a, b, c) { + a.width = b; + a.height = c + } + + z.prototype.setTo = z.prototype.m = function (a, b, c, d) { + this.x = a; + this.y = b; + this.width = c; + this.height = d; + return this + }; + z.prototype.set = z.prototype.set = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + this.width = a.width; + this.height = a.height; + return this + }; + z.prototype.setPoint = z.prototype.yf = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + return this + }; + z.prototype.setSize = function (a) { + this.I(); + this.width = a.width; + this.height = a.height; + return this + }; + z.prototype.copy = function () { + var a = new z; + a.x = this.x; + a.y = this.y; + a.width = this.width; + a.height = this.height; + return a + }; + g = z.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Rect is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + z.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + for (var f = 0; "" === a[b];) b++; + (d = a[b++]) && (f = parseFloat(d)); + for (var h = 0; "" === a[b];) b++; + (d = a[b++]) && (h = parseFloat(d)); + return new z(c, e, f, h) + } + return new z + }; + z.stringify = function (a) { + return a instanceof z ? a.x.toString() + " " + a.y.toString() + " " + a.width.toString() + " " + a.height.toString() : a.toString() + }; + z.prototype.toString = function () { + return "Rect(" + this.x + "," + this.y + "," + this.width + "," + this.height + ")" + }; + z.prototype.equals = z.prototype.L = function (a) { + return a instanceof z ? this.x === a.x && this.y === a.y && this.width === a.width && this.height === a.height : !1 + }; + z.prototype.equalTo = z.prototype.Tv = function (a, b, c, d) { + return this.x === a && this.y === b && this.width === c && this.height === d + }; + z.prototype.equalsApprox = z.prototype.De = function (a) { + return K.D(this.x, a.x) && K.D(this.y, a.y) && K.D(this.width, a.width) && K.D(this.height, a.height) + }; + z.prototype.containsPoint = z.prototype.Aa = function (a) { + return this.x <= a.x && this.x + this.width >= a.x && this.y <= a.y && this.y + this.height >= a.y + }; + z.prototype.containsRect = z.prototype.Kj = function (a) { + return this.x <= a.x && a.x + a.width <= this.x + this.width && this.y <= a.y && a.y + a.height <= this.y + this.height + }; + z.prototype.contains = z.prototype.contains = function (a, b, c, d) { + void 0 === c && (c = 0); + void 0 === d && (d = 0); + return this.x <= a && a + c <= this.x + this.width && this.y <= b && b + d <= this.y + this.height + }; + z.prototype.reset = function () { + this.I(); + this.height = this.width = this.y = this.x = 0 + }; + z.prototype.offset = z.prototype.offset = function (a, b) { + this.I(); + this.x += a; + this.y += b; + return this + }; + z.prototype.inflate = z.prototype.Jf = function (a, b) { + return hb(this, b, a, b, a) + }; + z.prototype.addMargin = z.prototype.yv = function (a) { + return hb(this, a.top, a.right, a.bottom, a.left) + }; + z.prototype.subtractMargin = z.prototype.tI = function (a) { + return hb(this, -a.top, -a.right, -a.bottom, -a.left) + }; + z.prototype.grow = function (a, b, c, d) { + return hb(this, a, b, c, d) + }; + + function hb(a, b, c, d, e) { + a.I(); + var f = a.width; + c + e <= -f ? (a.x += f / 2, a.width = 0) : (a.x -= e, a.width += c + e); + c = a.height; + b + d <= -c ? (a.y += c / 2, a.height = 0) : (a.y -= b, a.height += b + d); + return a + } + + z.prototype.intersectRect = function (a) { + return ib(this, a.x, a.y, a.width, a.height) + }; + z.prototype.intersect = function (a, b, c, d) { + return ib(this, a, b, c, d) + }; + + function ib(a, b, c, d, e) { + a.I(); + var f = Math.max(a.x, b), h = Math.max(a.y, c); + b = Math.min(a.x + a.width, b + d); + c = Math.min(a.y + a.height, c + e); + a.x = f; + a.y = h; + a.width = Math.max(0, b - f); + a.height = Math.max(0, c - h); + return a + } + + z.prototype.intersectsRect = z.prototype.sg = function (a) { + return this.HD(a.x, a.y, a.width, a.height) + }; + z.prototype.intersects = z.prototype.HD = function (a, b, c, d) { + var e = this.width, f = this.x; + if (Infinity !== e && Infinity !== c && (e += f, c += a, isNaN(c) || isNaN(e) || f > c || a > e)) return !1; + a = this.height; + c = this.y; + return Infinity !== a && Infinity !== d && (a += c, d += b, isNaN(d) || isNaN(a) || c > d || b > a) ? !1 : !0 + }; + + function jb(a, b) { + var c = a.width, d = b.width + 10 + 10, e = a.x, f = b.x - 10; + if (e > d + f || f > c + e) return !1; + c = a.height; + d = b.height + 10 + 10; + e = a.y; + f = b.y - 10; + return e > d + f || f > c + e ? !1 : !0 + } + + z.prototype.unionPoint = z.prototype.Oi = function (a) { + return kb(this, a.x, a.y, 0, 0) + }; + z.prototype.unionRect = z.prototype.Sh = function (a) { + return kb(this, a.x, a.y, a.width, a.height) + }; + z.prototype.union = z.prototype.YE = function (a, b, c, d) { + this.I(); + void 0 === c && (c = 0); + void 0 === d && (d = 0); + return kb(this, a, b, c, d) + }; + + function kb(a, b, c, d, e) { + var f = Math.min(a.x, b), h = Math.min(a.y, c); + b = Math.max(a.x + a.width, b + d); + c = Math.max(a.y + a.height, c + e); + a.x = f; + a.y = h; + a.width = b - f; + a.height = c - h; + return a + } + + z.prototype.setSpot = z.prototype.rt = function (a, b, c) { + this.I(); + this.x = a - c.offsetX - c.x * this.width; + this.y = b - c.offsetY - c.y * this.height; + return this + }; + var qb; + z.contains = qb = function (a, b, c, d, e, f, h, k) { + void 0 === h && (h = 0); + void 0 === k && (k = 0); + return a <= e && e + h <= a + c && b <= f && f + k <= b + d + }; + z.intersects = function (a, b, c, d, e, f, h, k) { + c += a; + h += e; + if (a > h || e > c) return !1; + a = d + b; + k += f; + return b > k || f > a ? !1 : !0 + }; + u.defineProperty(z, {left: "left"}, function () { + return this.x + }, function (a) { + this.I(a); + this.x = a + }); + u.defineProperty(z, {top: "top"}, function () { + return this.y + }, function (a) { + this.I(a); + this.y = a + }); + u.defineProperty(z, {right: "right"}, function () { + return this.x + this.width + }, function (a) { + this.I(a); + this.x += a - (this.x + this.width) + }); + u.defineProperty(z, {bottom: "bottom"}, function () { + return this.y + this.height + }, function (a) { + this.I(a); + this.y += a - (this.y + this.height) + }); + u.defineProperty(z, {position: "position"}, function () { + return new w(this.x, this.y) + }, function (a) { + this.I(a); + this.x = a.x; + this.y = a.y + }); + u.defineProperty(z, {size: "size"}, function () { + return new ia(this.width, this.height) + }, function (a) { + this.I(a); + this.width = a.width; + this.height = a.height + }); + u.defineProperty(z, {Ok: "center"}, function () { + return new w(this.x + this.width / 2, this.y + this.height / 2) + }, function (a) { + this.I(a); + this.x = a.x - this.width / 2; + this.y = a.y - this.height / 2 + }); + u.defineProperty(z, {Ja: "centerX"}, function () { + return this.x + this.width / 2 + }, function (a) { + this.I(a); + this.x = a - this.width / 2 + }); + u.defineProperty(z, {Ua: "centerY"}, function () { + return this.y + this.height / 2 + }, function (a) { + this.I(a); + this.y = a - this.height / 2 + }); + z.prototype.isReal = z.prototype.J = function () { + return isFinite(this.x) && isFinite(this.y) && isFinite(this.width) && isFinite(this.height) + }; + z.prototype.isEmpty = function () { + return 0 === this.width && 0 === this.height + }; + + function rb(a, b, c, d) { + void 0 === a ? this.left = this.bottom = this.right = this.top = 0 : void 0 === b ? this.left = this.bottom = this.right = this.top = a : void 0 === c ? (d = b, this.top = a, this.right = b, this.bottom = a, this.left = d) : void 0 !== d ? (this.top = a, this.right = b, this.bottom = c, this.left = d) : u.k("Invalid arguments to Margin constructor"); + this.Ca = !1 + } + + u.fa("Margin", rb); + u.Lh(rb); + u.Xd(rb, {top: !0, right: !0, bottom: !0, left: !0}); + rb.prototype.assign = function (a) { + this.top = a.top; + this.right = a.right; + this.bottom = a.bottom; + this.left = a.left + }; + rb.prototype.setTo = rb.prototype.m = function (a, b, c, d) { + this.I(); + this.top = a; + this.right = b; + this.bottom = c; + this.left = d; + return this + }; + rb.prototype.set = rb.prototype.set = function (a) { + this.I(); + this.top = a.top; + this.right = a.right; + this.bottom = a.bottom; + this.left = a.left; + return this + }; + rb.prototype.copy = function () { + var a = new rb; + a.top = this.top; + a.right = this.right; + a.bottom = this.bottom; + a.left = this.left; + return a + }; + g = rb.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Margin is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + rb.parse = function (a) { + if ("string" === typeof a) { + a = a.split(" "); + for (var b = 0, c = NaN; "" === a[b];) b++; + var d = a[b++]; + d && (c = parseFloat(d)); + if (isNaN(c)) return new rb; + for (var e = NaN; "" === a[b];) b++; + (d = a[b++]) && (e = parseFloat(d)); + if (isNaN(e)) return new rb(c); + for (var f = NaN; "" === a[b];) b++; + (d = a[b++]) && (f = parseFloat(d)); + if (isNaN(f)) return new rb(c, e); + for (var h = NaN; "" === a[b];) b++; + (d = a[b++]) && (h = parseFloat(d)); + return isNaN(h) ? new rb(c, e) : new rb(c, e, f, h) + } + return new rb + }; + rb.stringify = function (a) { + return a instanceof rb ? a.top.toString() + " " + a.right.toString() + " " + a.bottom.toString() + " " + a.left.toString() : a.toString() + }; + rb.prototype.toString = function () { + return "Margin(" + this.top + "," + this.right + "," + this.bottom + "," + this.left + ")" + }; + rb.prototype.equals = rb.prototype.L = function (a) { + return a instanceof rb ? this.top === a.top && this.right === a.right && this.bottom === a.bottom && this.left === a.left : !1 + }; + rb.prototype.equalTo = rb.prototype.Tv = function (a, b, c, d) { + return this.top === a && this.right === b && this.bottom === c && this.left === d + }; + rb.prototype.equalsApprox = rb.prototype.De = function (a) { + return K.D(this.top, a.top) && K.D(this.right, a.right) && K.D(this.bottom, a.bottom) && K.D(this.left, a.left) + }; + rb.prototype.isReal = rb.prototype.J = function () { + return isFinite(this.top) && isFinite(this.right) && isFinite(this.bottom) && isFinite(this.left) + }; + + function ja() { + this.m11 = 1; + this.m21 = this.m12 = 0; + this.m22 = 1; + this.dy = this.dx = 0 + } + + u.Lh(ja); + u.Xd(ja, {m11: !0, m12: !0, m21: !0, m22: !0, dx: !0, dy: !0}); + ja.prototype.set = ja.prototype.set = function (a) { + this.m11 = a.m11; + this.m12 = a.m12; + this.m21 = a.m21; + this.m22 = a.m22; + this.dx = a.dx; + this.dy = a.dy; + return this + }; + ja.prototype.copy = function () { + var a = new ja; + a.m11 = this.m11; + a.m12 = this.m12; + a.m21 = this.m21; + a.m22 = this.m22; + a.dx = this.dx; + a.dy = this.dy; + return a + }; + ja.prototype.toString = function () { + return "Transform(" + this.m11 + "," + this.m12 + "," + this.m21 + "," + this.m22 + "," + this.dx + "," + this.dy + ")" + }; + ja.prototype.equals = ja.prototype.L = function (a) { + return a instanceof ja ? this.m11 === a.m11 && this.m12 === a.m12 && this.m21 === a.m21 && this.m22 === a.m22 && this.dx === a.dx && this.dy === a.dy : !1 + }; + ja.prototype.isIdentity = ja.prototype.Os = function () { + return 1 === this.m11 && 0 === this.m12 && 0 === this.m21 && 1 === this.m22 && 0 === this.dx && 0 === this.dy + }; + ja.prototype.reset = ja.prototype.reset = function () { + this.m11 = 1; + this.m21 = this.m12 = 0; + this.m22 = 1; + this.dy = this.dx = 0; + return this + }; + ja.prototype.multiply = ja.prototype.multiply = function (a) { + var b = this.m12 * a.m11 + this.m22 * a.m12, c = this.m11 * a.m21 + this.m21 * a.m22, + d = this.m12 * a.m21 + this.m22 * a.m22, e = this.m11 * a.dx + this.m21 * a.dy + this.dx, + f = this.m12 * a.dx + this.m22 * a.dy + this.dy; + this.m11 = this.m11 * a.m11 + this.m21 * a.m12; + this.m12 = b; + this.m21 = c; + this.m22 = d; + this.dx = e; + this.dy = f; + return this + }; + ja.prototype.multiplyInverted = ja.prototype.aE = function (a) { + var b = 1 / (a.m11 * a.m22 - a.m12 * a.m21), c = a.m22 * b, d = -a.m12 * b, e = -a.m21 * b, f = a.m11 * b, + h = b * (a.m21 * a.dy - a.m22 * a.dx), k = b * (a.m12 * a.dx - a.m11 * a.dy); + a = this.m12 * c + this.m22 * d; + b = this.m11 * e + this.m21 * f; + e = this.m12 * e + this.m22 * f; + f = this.m11 * h + this.m21 * k + this.dx; + h = this.m12 * h + this.m22 * k + this.dy; + this.m11 = this.m11 * c + this.m21 * d; + this.m12 = a; + this.m21 = b; + this.m22 = e; + this.dx = f; + this.dy = h; + return this + }; + ja.prototype.invert = ja.prototype.oz = function () { + var a = 1 / (this.m11 * this.m22 - this.m12 * this.m21), b = -this.m12 * a, c = -this.m21 * a, d = this.m11 * a, + e = a * (this.m21 * this.dy - this.m22 * this.dx), f = a * (this.m12 * this.dx - this.m11 * this.dy); + this.m11 = this.m22 * a; + this.m12 = b; + this.m21 = c; + this.m22 = d; + this.dx = e; + this.dy = f; + return this + }; + ja.prototype.rotate = ja.prototype.rotate = function (a, b, c) { + 360 <= a ? a -= 360 : 0 > a && (a += 360); + if (0 === a) return this; + this.translate(b, c); + var d = 0, e = 0; + 90 === a ? (d = 0, e = 1) : 180 === a ? (d = -1, e = 0) : 270 === a ? (d = 0, e = -1) : (e = a * Math.PI / 180, d = Math.cos(e), e = Math.sin(e)); + a = this.m12 * d + this.m22 * e; + var f = this.m11 * -e + this.m21 * d, h = this.m12 * -e + this.m22 * d; + this.m11 = this.m11 * d + this.m21 * e; + this.m12 = a; + this.m21 = f; + this.m22 = h; + this.translate(-b, -c); + return this + }; + ja.prototype.translate = ja.prototype.translate = function (a, b) { + this.dx += this.m11 * a + this.m21 * b; + this.dy += this.m12 * a + this.m22 * b; + return this + }; + ja.prototype.scale = ja.prototype.scale = function (a, b) { + void 0 === b && (b = a); + this.m11 *= a; + this.m12 *= a; + this.m21 *= b; + this.m22 *= b; + return this + }; + ja.prototype.transformPoint = ja.prototype.ab = function (a) { + var b = a.x, c = a.y; + a.x = b * this.m11 + c * this.m21 + this.dx; + a.y = b * this.m12 + c * this.m22 + this.dy; + return a + }; + ja.prototype.invertedTransformPoint = ja.prototype.Oh = function (a) { + var b = 1 / (this.m11 * this.m22 - this.m12 * this.m21), c = -this.m12 * b, d = this.m11 * b, + e = b * (this.m12 * this.dx - this.m11 * this.dy), f = a.x, h = a.y; + a.x = f * this.m22 * b + h * -this.m21 * b + b * (this.m21 * this.dy - this.m22 * this.dx); + a.y = f * c + h * d + e; + return a + }; + ja.prototype.transformRect = ja.prototype.WE = function (a) { + var b = a.x, c = a.y, d = b + a.width, e = c + a.height, f = this.m11, h = this.m12, k = this.m21, l = this.m22, + m = this.dx, n = this.dy, p = b * f + c * k + m, q = b * h + c * l + n, r = d * f + c * k + m, + c = d * h + c * l + n, s = b * f + e * k + m, b = b * h + e * l + n, f = d * f + e * k + m, + d = d * h + e * l + n, e = p, h = q, p = Math.min(p, r), e = Math.max(e, r), h = Math.min(h, c), + q = Math.max(q, c), p = Math.min(p, s), e = Math.max(e, s), h = Math.min(h, b), q = Math.max(q, b), + p = Math.min(p, f), e = Math.max(e, f), h = Math.min(h, d), q = Math.max(q, d); + a.x = p; + a.y = h; + a.width = e - p; + a.height = q - h; + return a + }; + + function L(a, b, c, d) { + void 0 === a ? this.offsetY = this.offsetX = this.y = this.x = 0 : (void 0 === b && (b = 0), void 0 === c && (c = 0), void 0 === d && (d = 0), this.x = a, this.y = b, this.offsetX = c, this.offsetY = d); + this.Ca = !1 + } + + u.fa("Spot", L); + u.Lh(L); + u.Xd(L, {x: !0, y: !0, offsetX: !0, offsetY: !0}); + L.prototype.assign = function (a) { + this.x = a.x; + this.y = a.y; + this.offsetX = a.offsetX; + this.offsetY = a.offsetY + }; + L.prototype.setTo = L.prototype.m = function (a, b, c, d) { + this.I(); + this.x = a; + this.y = b; + this.offsetX = c; + this.offsetY = d; + return this + }; + L.prototype.set = L.prototype.set = function (a) { + this.I(); + this.x = a.x; + this.y = a.y; + this.offsetX = a.offsetX; + this.offsetY = a.offsetY; + return this + }; + L.prototype.copy = function () { + var a = new L; + a.x = this.x; + a.y = this.y; + a.offsetX = this.offsetX; + a.offsetY = this.offsetY; + return a + }; + g = L.prototype; + g.Ka = function () { + this.Ca = !0; + Object.freeze(this); + return this + }; + g.Z = function () { + return Object.isFrozen(this) ? this : this.copy().freeze() + }; + g.freeze = function () { + this.Ca = !0; + return this + }; + g.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + return this + }; + g.I = function (a) { + if (this.Ca) { + var b = "The Spot is frozen, so its properties cannot be set: " + this.toString(); + void 0 !== a && (b += " to value: " + a); + u.k(b) + } + }; + + function sb(a, b) { + a.x = NaN; + a.y = NaN; + a.offsetX = b; + return a + } + + var tb; + L.parse = tb = function (a) { + if ("string" === typeof a) { + a = a.trim(); + if ("None" === a) return vb; + if ("TopLeft" === a) return xb; + if ("Top" === a || "TopCenter" === a || "MiddleTop" === a) return Db; + if ("TopRight" === a) return Gb; + if ("Left" === a || "LeftCenter" === a || "MiddleLeft" === a) return Hb; + if ("Center" === a) return Ib; + if ("Right" === a || "RightCenter" === a || "MiddleRight" === a) return Jb; + if ("BottomLeft" === a) return Kb; + if ("Bottom" === a || "BottomCenter" === a || "MiddleBottom" === a) return Ub; + if ("BottomRight" === a) return Vb; + if ("TopSide" === a) return Wb; + if ("LeftSide" === + a) return Xb; + if ("RightSide" === a) return Yb; + if ("BottomSide" === a) return Zb; + if ("TopBottomSides" === a) return $b; + if ("LeftRightSides" === a) return ac; + if ("TopLeftSides" === a) return bc; + if ("TopRightSides" === a) return cc; + if ("BottomLeftSides" === a) return hc; + if ("BottomRightSides" === a) return ic; + if ("NotTopSide" === a) return lc; + if ("NotLeftSide" === a) return mc; + if ("NotRightSide" === a) return rc; + if ("NotBottomSide" === a) return sc; + if ("AllSides" === a) return tc; + if ("Default" === a) return uc; + a = a.split(" "); + for (var b = 0, c = 0; "" === a[b];) b++; + var d = a[b++]; + void 0 !== d && 0 < d.length && (c = parseFloat(d)); + for (var e = 0; "" === a[b];) b++; + d = a[b++]; + void 0 !== d && 0 < d.length && (e = parseFloat(d)); + for (var f = 0; "" === a[b];) b++; + d = a[b++]; + void 0 !== d && 0 < d.length && (f = parseFloat(d)); + for (var h = 0; "" === a[b];) b++; + d = a[b++]; + void 0 !== d && 0 < d.length && (h = parseFloat(d)); + return new L(c, e, f, h) + } + return new L + }; + L.stringify = function (a) { + return a instanceof L ? a.pd() ? a.x.toString() + " " + a.y.toString() + " " + a.offsetX.toString() + " " + a.offsetY.toString() : a.toString() : a.toString() + }; + L.prototype.toString = function () { + return this.pd() ? 0 === this.offsetX && 0 === this.offsetY ? "Spot(" + this.x + "," + this.y + ")" : "Spot(" + this.x + "," + this.y + "," + this.offsetX + "," + this.offsetY + ")" : this.L(vb) ? "None" : this.L(xb) ? "TopLeft" : this.L(Db) ? "Top" : this.L(Gb) ? "TopRight" : this.L(Hb) ? "Left" : this.L(Ib) ? "Center" : this.L(Jb) ? "Right" : this.L(Kb) ? "BottomLeft" : this.L(Ub) ? "Bottom" : this.L(Vb) ? "BottomRight" : this.L(Wb) ? "TopSide" : this.L(Xb) ? "LeftSide" : this.L(Yb) ? "RightSide" : this.L(Zb) ? "BottomSide" : this.L($b) ? "TopBottomSides" : this.L(ac) ? + "LeftRightSides" : this.L(bc) ? "TopLeftSides" : this.L(cc) ? "TopRightSides" : this.L(hc) ? "BottomLeftSides" : this.L(ic) ? "BottomRightSides" : this.L(lc) ? "NotTopSide" : this.L(mc) ? "NotLeftSide" : this.L(rc) ? "NotRightSide" : this.L(sc) ? "NotBottomSide" : this.L(tc) ? "AllSides" : this.L(uc) ? "Default" : "None" + }; + L.prototype.equals = L.prototype.L = function (a) { + return a instanceof L ? (this.x === a.x || isNaN(this.x) && isNaN(a.x)) && (this.y === a.y || isNaN(this.y) && isNaN(a.y)) && this.offsetX === a.offsetX && this.offsetY === a.offsetY : !1 + }; + L.prototype.opposite = function () { + return new L(.5 - (this.x - .5), .5 - (this.y - .5), -this.offsetX, -this.offsetY) + }; + L.prototype.includesSide = function (a) { + if (!this.Go() || !a.Go()) return !1; + a = a.offsetY; + return (this.offsetY & a) === a + }; + L.prototype.isSpot = L.prototype.pd = function () { + return !isNaN(this.x) && !isNaN(this.y) + }; + L.prototype.isNoSpot = L.prototype.ne = function () { + return isNaN(this.x) || isNaN(this.y) + }; + L.prototype.isSide = L.prototype.Go = function () { + return this.ne() && 1 === this.offsetX && 0 !== this.offsetY + }; + L.prototype.isDefault = L.prototype.Lc = function () { + return isNaN(this.x) && isNaN(this.y) && -1 === this.offsetX && 0 === this.offsetY + }; + var vb; + L.None = vb = sb(new L(0, 0, 0, 0), 0).Ka(); + var uc; + L.Default = uc = sb(new L(0, 0, -1, 0), -1).Ka(); + var xb; + L.TopLeft = xb = (new L(0, 0, 0, 0)).Ka(); + var Db; + L.TopCenter = Db = (new L(.5, 0, 0, 0)).Ka(); + var Gb; + L.TopRight = Gb = (new L(1, 0, 0, 0)).Ka(); + var Hb; + L.LeftCenter = Hb = (new L(0, .5, 0, 0)).Ka(); + var Ib; + L.Center = Ib = (new L(.5, .5, 0, 0)).Ka(); + var Jb; + L.RightCenter = Jb = (new L(1, .5, 0, 0)).Ka(); + var Kb; + L.BottomLeft = Kb = (new L(0, 1, 0, 0)).Ka(); + var Ub; + L.BottomCenter = Ub = (new L(.5, 1, 0, 0)).Ka(); + var Vb; + L.BottomRight = Vb = (new L(1, 1, 0, 0)).Ka(); + var vc; + L.MiddleTop = vc = Db; + var wc; + L.MiddleLeft = wc = Hb; + var xc; + L.MiddleRight = xc = Jb; + var Cc; + L.MiddleBottom = Cc = Ub; + L.Top = Db; + var Dc; + L.Left = Dc = Hb; + var Kc; + L.Right = Kc = Jb; + L.Bottom = Ub; + var Wb; + L.TopSide = Wb = sb(new L(0, 0, 1, u.Xc), 1).Ka(); + var Xb; + L.LeftSide = Xb = sb(new L(0, 0, 1, u.Fc), 1).Ka(); + var Yb; + L.RightSide = Yb = sb(new L(0, 0, 1, u.Oc), 1).Ka(); + var Zb; + L.BottomSide = Zb = sb(new L(0, 0, 1, u.Nc), 1).Ka(); + var $b; + L.TopBottomSides = $b = sb(new L(0, 0, 1, u.Xc | u.Nc), 1).Ka(); + var ac; + L.LeftRightSides = ac = sb(new L(0, 0, 1, u.Fc | u.Oc), 1).Ka(); + var bc; + L.TopLeftSides = bc = sb(new L(0, 0, 1, u.Xc | u.Fc), 1).Ka(); + var cc; + L.TopRightSides = cc = sb(new L(0, 0, 1, u.Xc | u.Oc), 1).Ka(); + var hc; + L.BottomLeftSides = hc = sb(new L(0, 0, 1, u.Nc | u.Fc), 1).Ka(); + var ic; + L.BottomRightSides = ic = sb(new L(0, 0, 1, u.Nc | u.Oc), 1).Ka(); + var lc; + L.NotTopSide = lc = sb(new L(0, 0, 1, u.Fc | u.Oc | u.Nc), 1).Ka(); + var mc; + L.NotLeftSide = mc = sb(new L(0, 0, 1, u.Xc | u.Oc | u.Nc), 1).Ka(); + var rc; + L.NotRightSide = rc = sb(new L(0, 0, 1, u.Xc | u.Fc | u.Nc), 1).Ka(); + var sc; + L.NotBottomSide = sc = sb(new L(0, 0, 1, u.Xc | u.Fc | u.Oc), 1).Ka(); + var tc; + L.AllSides = tc = sb(new L(0, 0, 1, u.Xc | u.Fc | u.Oc | u.Nc), 1).Ka(); + + function Lc() { + this.$e = [1, 0, 0, 1, 0, 0] + } + + Lc.prototype.copy = function () { + var a = new Lc; + a.$e[0] = this.$e[0]; + a.$e[1] = this.$e[1]; + a.$e[2] = this.$e[2]; + a.$e[3] = this.$e[3]; + a.$e[4] = this.$e[4]; + a.$e[5] = this.$e[5]; + return a + }; + + function Mc(a) { + this.type = a; + this.r2 = this.y2 = this.x2 = this.r1 = this.y1 = this.x1 = 0; + this.YC = [] + } + + Mc.prototype.addColorStop = function (a, b) { + this.YC.push({offset: a, color: b}) + }; + + function Nc(a, b, c) { + this.fillStyle = "#000000"; + this.font = "10px sans-serif"; + this.globalAlpha = 1; + this.lineCap = "butt"; + this.nw = 0; + this.lineJoin = "miter"; + this.lineWidth = 1; + this.miterLimit = 10; + this.shadowBlur = 0; + this.shadowColor = "rgba(0, 0, 0, 0)"; + this.shadowOffsetY = this.shadowOffsetX = 0; + this.strokeStyle = "#000000"; + this.textAlign = "start"; + this.document = b || document; + this.nD = c; + this.kw = null; + this.path = []; + this.Ei = new Lc; + this.stack = []; + this.rf = []; + this.HE = this.BD = this.Mv = 0; + this.Rv = a; + this.IH = "http://www.w3.org/2000/svg"; + this.width = + this.Rv.width; + this.height = this.Rv.height; + this.sl = Oc(this, "svg", { + width: this.width + "px", + height: this.height + "px", + EK: "0 0 " + this.Rv.width + " " + this.Rv.height + }); + this.sl.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns", "http://www.w3.org/2000/svg"); + this.sl.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink"); + Uc(this, 1, 0, 0, 1, 0, 0); + a = Oc(this, "clipPath", {id: "mainClip"}); + a.appendChild(Oc(this, "rect", {x: 0, y: 0, width: this.width, height: this.height})); + this.sl.appendChild(a); + this.rf[0].setAttributeNS(null, "clip-path", "url(#mainClip)") + } + + g = Nc.prototype; + g.arc = function (a, b, c, d, e, f) { + Vc(this, a, b, c, d, e, f) + }; + g.beginPath = function () { + this.path = [] + }; + g.bezierCurveTo = function (a, b, c, d, e, f) { + this.path.push(["C", a, b, c, d, e, f]) + }; + g.clearRect = function () { + }; + g.clip = function () { + Wc(this, "clipPath", this.path, new Lc) + }; + g.closePath = function () { + this.path.push(["z"]) + }; + g.createLinearGradient = function (a, b, c, d) { + var e = new Mc("linear"); + e.x1 = a; + e.y1 = b; + e.x2 = c; + e.y2 = d; + return e + }; + g.createPattern = function () { + }; + g.createRadialGradient = function (a, b, c, d, e, f) { + var h = new Mc("radial"); + h.x1 = a; + h.y1 = b; + h.r1 = c; + h.x2 = d; + h.y2 = e; + h.r2 = f; + return h + }; + g.drawImage = function (a, b, c, d, e, f, h, k, l) { + a = [b, c, d, e, f, h, k, l, a]; + b = this.Ei; + e = a[8]; + c = ""; + e instanceof HTMLCanvasElement && (c = e.toDataURL()); + e instanceof HTMLImageElement && (c = e.src); + c = {x: 0, y: 0, width: a[6], height: a[7], href: c}; + d = ""; + f = a[6] / a[2]; + h = a[7] / a[3]; + if (0 !== a[4] || 0 !== a[5]) d += " translate(" + a[4] + ", " + a[5] + ")"; + if (1 !== f || 1 !== h) d += " scale(" + f + ", " + h + ")"; + if (0 !== a[0] || 0 !== a[1]) d += " translate(" + -a[0] + ", " + -a[1] + ")"; + if (0 !== a[0] || 0 !== a[1] || a[2] !== e.naturalWidth || a[3] !== e.naturalHeight) e = "CLIP" + this.Mv, this.Mv++, + f = Oc(this, "clipPath", {id: e}), f.appendChild(Oc(this, "rect", { + x: a[0], + y: a[1], + width: a[2], + height: a[3] + })), this.sl.appendChild(f), c["clip-path"] = "url(#" + e + ")"; + Xc(this, "image", c, b, d); + this.addElement("image", c) + }; + g.fill = function () { + Wc(this, "fill", this.path, this.Ei) + }; + g.fillRect = function (a, b, c, d) { + Yc(this, "fill", [a, b, c, d], this.Ei) + }; + g.fillText = function (a, b, c) { + a = [a, b, c]; + b = this.textAlign; + "left" === b ? b = "start" : "right" === b ? b = "end" : "center" === b && (b = "middle"); + b = {x: a[1], y: a[2], style: "font: " + this.font, "text-anchor": b}; + Xc(this, "fill", b, this.Ei); + this.addElement("text", b, a[0]) + }; + g.lineTo = function (a, b) { + this.path.push(["L", a, b]) + }; + g.moveTo = function (a, b) { + this.path.push(["M", a, b]) + }; + g.quadraticCurveTo = function (a, b, c, d) { + this.path.push(["Q", a, b, c, d]) + }; + g.rect = function (a, b, c, d) { + this.path.push(["M", a, b], ["L", a + c, b], ["L", a + c, b + d], ["L", a, b + d], ["z"]) + }; + g.restore = function () { + this.Ei = this.stack.pop(); + this.path = this.stack.pop(); + var a = this.stack.pop(); + this.fillStyle = a.fillStyle; + this.font = a.font; + this.globalAlpha = a.globalAlpha; + this.lineCap = a.lineCap; + this.nw = a.nw; + this.lineJoin = a.lineJoin; + this.lineWidth = a.lineWidth; + this.miterLimit = a.miterLimit; + this.shadowBlur = a.shadowBlur; + this.shadowColor = a.shadowColor; + this.shadowOffsetX = a.shadowOffsetX; + this.shadowOffsetY = a.shadowOffsetY; + this.strokeStyle = a.strokeStyle; + this.textAlign = a.textAlign + }; + g.save = function () { + this.stack.push({ + fillStyle: this.fillStyle, + font: this.font, + globalAlpha: this.globalAlpha, + lineCap: this.lineCap, + nw: this.nw, + lineJoin: this.lineJoin, + lineWidth: this.lineWidth, + miterLimit: this.miterLimit, + shadowBlur: this.shadowBlur, + shadowColor: this.shadowColor, + shadowOffsetX: this.shadowOffsetX, + shadowOffsetY: this.shadowOffsetY, + strokeStyle: this.strokeStyle, + textAlign: this.textAlign + }); + for (var a = [], b = 0; b < this.path.length; b++) a.push(this.path[b]); + this.stack.push(a); + this.stack.push(this.Ei.copy()) + }; + g.setTransform = function (a, b, c, d, e, f) { + 1 === a && 0 === b && 0 === c && 1 === d && 0 === e && 0 === f || Uc(this, a, b, c, d, e, f) + }; + g.scale = function () { + }; + g.stroke = function () { + Wc(this, "stroke", this.path, this.Ei) + }; + g.strokeRect = function (a, b, c, d) { + Yc(this, "stroke", [a, b, c, d], this.Ei) + }; + + function Oc(a, b, c, d) { + a = a.document.createElementNS(a.IH, b); + if (u.Sa(c)) for (var e in c) a.setAttributeNS("href" === e ? "http://www.w3.org/1999/xlink" : "", e, c[e]); + void 0 !== d && (a.textContent = d); + return a + } + + g.addElement = function (a, b, c) { + a = Oc(this, a, b, c); + 0 < this.rf.length ? this.rf[this.rf.length - 1].appendChild(a) : this.sl.appendChild(a); + return this.kw = a + }; + + function Xc(a, b, c, d, e) { + 1 !== a.globalAlpha && (c.opacity = a.globalAlpha); + "fill" == b ? (/^rgba\(/.test(a.fillStyle) ? (a = /^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.fillStyle), c.fill = "rgb(" + a[1] + "," + a[2] + "," + a[3] + ")", c["fill-opacity"] = a[4]) : c.fill = a.fillStyle instanceof Mc ? Zc(a, a.fillStyle) : a.fillStyle, c.stroke = "none") : "stroke" == b && (c.fill = "none", /^rgba\(/.test(a.strokeStyle) ? (b = /^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(a.strokeStyle), + c.stroke = "rgb(" + b[1] + "," + b[2] + "," + b[3] + ")", c["stroke-opacity"] = b[4]) : c.stroke = a.strokeStyle instanceof Mc ? Zc(a, a.strokeStyle) : a.strokeStyle, c["stroke-width"] = a.lineWidth, c["stroke-linecap"] = a.lineCap, c["stroke-linejoin"] = a.lineJoin, c["stroke-miterlimit"] = a.miterLimit); + d = d.$e; + d = "matrix(" + d[0] + ", " + d[1] + ", " + d[2] + ", " + d[3] + ", " + d[4] + ", " + d[5] + ")"; + void 0 !== e && (d += e); + c.transform = d + } + + function Zc(a, b) { + var c = "GRAD" + a.BD; + a.BD++; + var d; + if ("linear" === b.type) d = { + x1: b.x1, + x2: b.x2, + y1: b.y1, + y2: b.y2, + id: c, + gradientUnits: "userSpaceOnUse" + }, d = Oc(a, "linearGradient", d); else if ("radial" === b.type) d = { + x1: b.x1, + x2: b.x2, + y1: b.y1, + y2: b.y2, + r1: b.r1, + r2: b.r2, + id: c + }, d = Oc(a, "radialGradient", d); else throw Error("invalid gradient"); + for (var e = b.YC, f = e.length, h = [], k = 0; k < f; k++) { + var l = e[k], m = l.color, l = {offset: l.offset, "stop-color": m}; + /^rgba\(/.test(m) && (m = /^\s*rgba\s*\(([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\)\s*$/i.exec(m), + l["stop-color"] = "rgb(" + m[1] + "," + m[2] + "," + m[3] + ")", l["stop-opacity"] = m[4]); + h.push(l) + } + h.sort(function (a, b) { + return a.offset > b.offset ? 1 : -1 + }); + for (k = 0; k < f; k++) d.appendChild(Oc(a, "stop", h[k])); + a.sl.appendChild(d); + return "url(#" + c + ")" + } + + function Yc(a, b, c, d) { + c = {x: c[0], y: c[1], width: c[2], height: c[3]}; + Xc(a, b, c, d); + a.addElement("rect", c) + } + + function Wc(a, b, c, d) { + for (var e = [], f = 0; f < c.length; f++) { + var h = u.Pk(c[f]), k = [h.shift()]; + if ("A" == k[0]) k.push(h.shift() + "," + h.shift(), h.shift(), h.shift() + "," + h.shift(), h.shift() + "," + h.shift()); else for (; h.length;) k.push(h.shift() + "," + h.shift()); + e.push(k.join(" ")) + } + c = {d: e.join(" ")}; + Xc(a, b, c, d); + "clipPath" === b ? (b = "CLIP" + a.Mv, a.Mv++, d = Oc(a, "clipPath", {id: b}), d.appendChild(Oc(a, "path", c)), a.sl.appendChild(d), 0 < a.rf.length && a.rf[a.rf.length - 1].setAttributeNS(null, "clip-path", "url(#" + b + ")")) : a.addElement("path", + c) + } + + function Vc(a, b, c, d, e, f, h) { + var k = Math.abs(e - f); + if (e != f) { + var l = b + d * Math.cos(f); + f = c + d * Math.sin(f); + k >= 2 * Math.PI ? (Vc(a, b, c, d, e, e + Math.PI, h), Vc(a, b, c, d, e + Math.PI, e + 2 * Math.PI, h), a.path.push(["M", l, f])) : (b += d * Math.cos(e), c += d * Math.sin(e), k = 180 * k / Math.PI, e = h ? 0 : 1, h = 180 <= k == !!h ? 0 : 1, 0 !== a.path.length ? a.path.push(["L", b, c]) : a.path.push(["M", b, c]), a.path.push(["A", d, d, k, h, e, l, f])) + } + } + + function Uc(a, b, c, d, e, f, h) { + var k = new Lc; + k.$e = [b, c, d, e, f, h]; + b = {}; + Xc(a, "g", b, k); + k = a.addElement("g", b); + a.rf.push(k) + } + + g.$a = function () { + if (0 !== this.shadowOffsetX || 0 !== this.shadowOffsetY || 0 !== this.shadowBlur) { + var a = "SHADOW" + this.HE; + this.HE++; + var b = this.addElement("filter", {id: a, x: "-100%", y: "-100%", width: "300%", height: "300%"}, null), c, + d, e, f, h; + c = Oc(this, "feGaussianBlur", {"in": "SourceAlpha", result: "blur", vK: this.shadowBlur / 2}); + d = Oc(this, "feFlood", {"in": "blur", result: "flood", "flood-color": this.shadowColor}); + e = Oc(this, "feComposite", {"in": "flood", in2: "blur", operator: "in", result: "comp"}); + f = Oc(this, "feOffset", { + "in": "comp", result: "offsetBlur", + dx: this.shadowOffsetX, dy: this.shadowOffsetY + }); + h = Oc(this, "feMerge", {}); + h.appendChild(Oc(this, "feMergeNode", {"in": "offsetBlur"})); + h.appendChild(Oc(this, "feMergeNode", {"in": "SourceGraphic"})); + b.appendChild(c); + b.appendChild(d); + b.appendChild(e); + b.appendChild(f); + b.appendChild(h); + 0 < this.rf.length && this.rf[this.rf.length - 1].setAttributeNS(null, "filter", "url(#" + a + ")") + } + }; + + function oa(a, b) { + this.ownerDocument = void 0 === b ? document : b; + var c = this.ownerDocument.createElement("canvas"); + c.tabIndex = 0; + this.Dd = c; + c.getContext && c.getContext("2d") || u.k("Browser does not support HTML Canvas Element"); + this.dG = c.getContext("2d"); + c.Y = a; + Object.seal(this) + } + + g = oa.prototype; + g.getContext = function () { + return this.dG + }; + g.toDataURL = function (a, b) { + return this.Dd.toDataURL(a, b) + }; + g.getBoundingClientRect = function () { + return this.Dd.getBoundingClientRect() + }; + g.focus = function () { + return this.Dd.focus() + }; + g.addEventListener = function (a, b, c) { + this.Dd.addEventListener(a, b, c) + }; + g.removeEventListener = function (a, b, c) { + this.Dd.removeEventListener(a, b, c) + }; + u.defineProperty(oa, {width: "width"}, function () { + return this.Dd.width + }, function (a) { + this.Dd.width = a + }); + u.defineProperty(oa, {height: "height"}, function () { + return this.Dd.height + }, function (a) { + this.Dd.height = a + }); + u.defineProperty(oa, {style: "style"}, function () { + return this.Dd.style + }, function (a) { + this.Dd.style = a + }); + var K = { + sa: 4 * ((Math.sqrt(2) - 1) / 3), + Wj: (new w(0, 0)).Ka(), + kF: (new z(0, 0, 0, 0)).Ka(), + np: (new rb(0, 0, 0, 0)).Ka(), + iF: (new rb(2, 2, 2, 2)).Ka(), + jF: (new ia(Infinity, Infinity)).Ka(), + fF: (new w(-Infinity, -Infinity)).Ka(), + eF: (new w(Infinity, Infinity)).Ka(), + op: (new ia(0, 0)).Ka(), + Tw: (new ia(1, 1)).Ka(), + mp: (new ia(6, 6)).Ka(), + Qw: (new ia(8, 8)).Ka(), + gF: (new w(NaN, NaN)).Ka(), + Uw: new pa, + Qi: new pa, + vA: null, + sqrt: function (a) { + if (0 >= a) return 0; + var b = K.vA; + if (null === b) { + for (var b = [], c = 0; 2E3 >= c; c++) b[c] = Math.sqrt(c); + K.vA = b + } + return 1 > a ? + (c = 1 / a, 2E3 >= c ? 1 / b[c | 0] : Math.sqrt(a)) : 2E3 >= a ? b[a | 0] : Math.sqrt(a) + }, + D: function (a, b) { + var c = a - b; + return .5 > c && -.5 < c + }, + mb: function (a, b) { + var c = a - b; + return 5E-8 > c && -5E-8 < c + }, + Hd: function (a, b, c, d, e, f, h) { + 0 >= e && (e = 1E-6); + var k = 0, l = 0, m = 0, n = 0; + a < c ? (l = a, k = c) : (l = c, k = a); + b < d ? (n = b, m = d) : (n = d, m = b); + if (a === c) return n <= h && h <= m && a - e <= f && f <= a + e; + if (b === d) return l <= f && f <= k && b - e <= h && h <= b + e; + k += e; + l -= e; + if (l <= f && f <= k && (m += e, n -= e, n <= h && h <= m)) if (k - l > m - n) if (a - c > e || c - a > e) { + if (f = (d - b) / (c - a) * (f - a) + b, f - e <= h && h <= f + e) return !0 + } else return !0; else if (b - + d > e || d - b > e) { + if (h = (c - a) / (d - b) * (h - b) + a, h - e <= f && f <= h + e) return !0 + } else return !0; + return !1 + }, + Iv: function (a, b, c, d, e, f, h, k, l, m, n, p) { + if (K.Hd(a, b, h, k, p, c, d) && K.Hd(a, b, h, k, p, e, f)) return K.Hd(a, b, h, k, p, m, n); + var q = (a + c) / 2, r = (b + d) / 2, s = (c + e) / 2, t = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (q + s) / 2; + c = (r + t) / 2; + var s = (s + e) / 2, t = (t + f) / 2, v = (d + s) / 2, x = (c + t) / 2; + return K.Iv(a, b, q, r, d, c, v, x, l, m, n, p) || K.Iv(v, x, s, t, e, f, h, k, l, m, n, p) + }, + UF: function (a, b, c, d, e, f, h, k, l) { + var m = (c + e) / 2, n = (d + f) / 2; + l.x = (((a + c) / 2 + m) / 2 + (m + (e + h) / 2) / 2) / 2; + l.y = (((b + d) / 2 + n) / 2 + (n + + (f + k) / 2) / 2) / 2; + return l + }, + TF: function (a, b, c, d, e, f, h, k) { + var l = (c + e) / 2, m = (d + f) / 2; + return Za(((a + c) / 2 + l) / 2, ((b + d) / 2 + m) / 2, (l + (e + h) / 2) / 2, (m + (f + k) / 2) / 2) + }, + oo: function (a, b, c, d, e, f, h, k, l, m) { + if (K.Hd(a, b, h, k, l, c, d) && K.Hd(a, b, h, k, l, e, f)) kb(m, a, b, 0, 0), kb(m, h, k, 0, 0); else { + var n = (a + c) / 2, p = (b + d) / 2, q = (c + e) / 2, r = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (n + q) / 2; + c = (p + r) / 2; + var q = (q + e) / 2, r = (r + f) / 2, s = (d + q) / 2, t = (c + r) / 2; + K.oo(a, b, n, p, d, c, s, t, l, m); + K.oo(s, t, q, r, e, f, h, k, l, m) + } + return m + }, + ye: function (a, b, c, d, e, f, h, k, l, m) { + if (K.Hd(a, b, h, k, l, c, d) && + K.Hd(a, b, h, k, l, e, f)) 0 === m.length && (m.push(a), m.push(b)), m.push(h), m.push(k); else { + var n = (a + c) / 2, p = (b + d) / 2, q = (c + e) / 2, r = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (n + q) / 2; + c = (p + r) / 2; + var q = (q + e) / 2, r = (r + f) / 2, s = (d + q) / 2, t = (c + r) / 2; + K.ye(a, b, n, p, d, c, s, t, l, m); + K.ye(s, t, q, r, e, f, h, k, l, m) + } + return m + }, + Oz: function (a, b, c, d, e, f, h, k, l, m) { + if (K.Hd(a, b, e, f, m, c, d)) return K.Hd(a, b, e, f, m, k, l); + var n = (a + c) / 2, p = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var q = (n + c) / 2, r = (p + d) / 2; + return K.Oz(a, b, n, p, q, r, h, k, l, m) || K.Oz(q, r, c, d, e, f, h, k, l, m) + }, + nK: function (a, b, c, + d, e, f, h) { + h.x = ((a + c) / 2 + (c + e) / 2) / 2; + h.y = ((b + d) / 2 + (d + f) / 2) / 2; + return h + }, + Nz: function (a, b, c, d, e, f, h, k) { + if (K.Hd(a, b, e, f, h, c, d)) kb(k, a, b, 0, 0), kb(k, e, f, 0, 0); else { + var l = (a + c) / 2, m = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var n = (l + c) / 2, p = (m + d) / 2; + K.Nz(a, b, l, m, n, p, h, k); + K.Nz(n, p, c, d, e, f, h, k) + } + return k + }, + Xo: function (a, b, c, d, e, f, h, k) { + if (K.Hd(a, b, e, f, h, c, d)) 0 === k.length && (k.push(a), k.push(b)), k.push(e), k.push(f); else { + var l = (a + c) / 2, m = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var n = (l + c) / 2, p = (m + d) / 2; + K.Xo(a, b, l, m, n, p, h, k); + K.Xo(n, p, c, d, e, f, h, k) + } + return k + }, + js: function (a, b, c, d, e, f, h, k, l, m, n, p, q, r) { + 0 >= q && (q = 1E-6); + if (K.Hd(a, b, h, k, q, c, d) && K.Hd(a, b, h, k, q, e, f)) { + var s = (a - h) * (m - p) - (b - k) * (l - n); + if (0 === s) return !1; + q = ((a * k - b * h) * (l - n) - (a - h) * (l * p - m * n)) / s; + s = ((a * k - b * h) * (m - p) - (b - k) * (l * p - m * n)) / s; + if ((l > n ? l - n : n - l) < (m > p ? m - p : p - m)) { + if (h = l = 0, b < k ? (l = b, h = k) : (l = k, h = b), s < l || s > h) return !1 + } else if (a < h ? l = a : (l = h, h = a), q < l || q > h) return !1; + r.x = q; + r.y = s; + return !0 + } + var s = (a + c) / 2, t = (b + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + var v = (s + c) / 2, x = (t + d) / 2; + c = (c + e) / 2; + d = (d + f) / 2; + var B = (v + c) / 2, y = (x + d) / + 2, C = (n - l) * (n - l) + (p - m) * (p - m), I = !1; + K.js(a, b, s, t, v, x, B, y, l, m, n, p, q, r) && (b = (r.x - l) * (r.x - l) + (r.y - m) * (r.y - m), b < C && (C = b, I = !0)); + a = r.x; + s = r.y; + K.js(B, y, c, d, e, f, h, k, l, m, n, p, q, r) && (b = (r.x - l) * (r.x - l) + (r.y - m) * (r.y - m), b < C ? I = !0 : (r.x = a, r.y = s)); + return I + }, + ks: function (a, b, c, d, e, f, h, k, l, m, n, p, q) { + var r = 0; + 0 >= q && (q = 1E-6); + if (K.Hd(a, b, h, k, q, c, d) && K.Hd(a, b, h, k, q, e, f)) { + q = (a - h) * (m - p) - (b - k) * (l - n); + if (0 === q) return r; + var s = ((a * k - b * h) * (l - n) - (a - h) * (l * p - m * n)) / q, + t = ((a * k - b * h) * (m - p) - (b - k) * (l * p - m * n)) / q; + if (s >= n) return r; + if ((l > n ? l - n : n - l) < + (m > p ? m - p : p - m)) { + if (a = l = 0, b < k ? (l = b, a = k) : (l = k, a = b), t < l || t > a) return r + } else if (a < h ? (l = a, a = h) : l = h, s < l || s > a) return r; + 0 < q ? r++ : 0 > q && r-- + } else { + var s = (a + c) / 2, t = (b + d) / 2, v = (c + e) / 2, x = (d + f) / 2; + e = (e + h) / 2; + f = (f + k) / 2; + d = (s + v) / 2; + c = (t + x) / 2; + var v = (v + e) / 2, x = (x + f) / 2, B = (d + v) / 2, y = (c + x) / 2, + r = r + K.ks(a, b, s, t, d, c, B, y, l, m, n, p, q), + r = r + K.ks(B, y, v, x, e, f, h, k, l, m, n, p, q) + } + return r + }, + Hm: function (a, b, c, d, e, f, h) { + if (K.mb(a, c)) { + var k = 0; + c = 0; + b < d ? (k = b, c = d) : (k = d, c = b); + d = f; + if (d < k) return h.x = a, h.y = k, !1; + if (d > c) return h.x = a, h.y = c, !1; + h.x = a; + h.y = d; + return !0 + } + if (K.mb(b, + d)) { + a < c ? k = a : (k = c, c = a); + d = e; + if (d < k) return h.x = k, h.y = b, !1; + if (d > c) return h.x = c, h.y = b, !1; + h.x = d; + h.y = b; + return !0 + } + k = ((a - e) * (a - c) + (b - f) * (b - d)) / ((c - a) * (c - a) + (d - b) * (d - b)); + if (-5E-6 > k) return h.x = a, h.y = b, !1; + if (1.000005 < k) return h.x = c, h.y = d, !1; + h.x = a + k * (c - a); + h.y = b + k * (d - b); + return !0 + }, + $g: function (a, b, c, d, e, f, h, k, l) { + if (K.D(a, c) && K.D(b, d)) return l.x = a, l.y = b, !1; + if (K.mb(e, h)) { + if (K.mb(a, c)) return K.Hm(a, b, c, d, e, f, l), !1; + f = (d - b) / (c - a) * (e - a) + b; + return K.Hm(a, b, c, d, e, f, l) + } + k = (k - f) / (h - e); + if (K.mb(a, c)) { + f = k * (a - e) + f; + c = h = 0; + b < d ? (h = b, + c = d) : (h = d, c = b); + if (f < h) return l.x = a, l.y = h, !1; + if (f > c) return l.x = a, l.y = c, !1; + l.x = a; + l.y = f; + return !0 + } + h = (d - b) / (c - a); + if (K.mb(k, h)) return K.Hm(a, b, c, d, e, f, l), !1; + e = (h * a - k * e + f - b) / (h - k); + if (K.mb(h, 0)) { + a < c ? h = a : (h = c, c = a); + if (e < h) return l.x = h, l.y = b, !1; + if (e > c) return l.x = c, l.y = b, !1; + l.x = e; + l.y = b; + return !0 + } + f = h * (e - a) + b; + return K.Hm(a, b, c, d, e, f, l) + }, + PJ: function (a, b, c, d, e) { + return K.$g(c.x, c.y, d.x, d.y, a.x, a.y, b.x, b.y, e) + }, + xJ: function (a, b, c, d, e, f, h, k, l, m) { + function n(c, d) { + var e = (c - a) * (c - a) + (d - b) * (d - b); + e < p && (p = e, l.x = c, l.y = d) + } + + var p = + Infinity; + n(l.x, l.y); + var q = 0, r = 0, s = 0, t = 0; + e < h ? (q = e, r = h) : (q = h, r = e); + f < k ? (s = e, t = h) : (s = h, t = e); + q = (r - q) / 2 + m; + m = (t - s) / 2 + m; + e = (e + h) / 2; + f = (f + k) / 2; + if (0 === q || 0 === m) return l; + if (.5 > (c > a ? c - a : a - c)) { + q = 1 - (c - e) * (c - e) / (q * q); + if (0 > q) return l; + q = Math.sqrt(q); + d = -m * q + f; + n(c, m * q + f); + n(c, d) + } else { + c = (d - b) / (c - a); + d = 1 / (q * q) + c * c / (m * m); + k = 2 * c * (b - c * a) / (m * m) - 2 * c * f / (m * m) - 2 * e / (q * q); + q = k * k - 4 * d * (2 * c * a * f / (m * m) - 2 * b * f / (m * m) + f * f / (m * m) + e * e / (q * q) - 1 + (b - c * a) * (b - c * a) / (m * m)); + if (0 > q) return l; + q = Math.sqrt(q); + m = (-k + q) / (2 * d); + n(m, c * m - c * a + b); + q = (-k - q) / (2 * d); + n(q, + c * q - c * a + b) + } + return l + }, + bl: function (a, b, c, d, e, f, h, k, l) { + var m = 1E21, n = a, p = b; + if (K.$g(a, b, a, d, e, f, h, k, l)) { + var q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f); + q < m && (m = q, n = l.x, p = l.y) + } + K.$g(c, b, c, d, e, f, h, k, l) && (q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f), q < m && (m = q, n = l.x, p = l.y)); + K.$g(a, b, c, b, e, f, h, k, l) && (q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f), q < m && (m = q, n = l.x, p = l.y)); + K.$g(a, d, c, d, e, f, h, k, l) && (q = (l.x - e) * (l.x - e) + (l.y - f) * (l.y - f), q < m && (m = q, n = l.x, p = l.y)); + l.x = n; + l.y = p; + return 1E21 > m + }, + dw: function (a, b, c) { + var d = b.x, e = b.y, f = c.x, h = c.y, k = a.left, l = a.right, + m = a.top, n = a.bottom; + return d === f ? (f = a = 0, e < h ? (a = e, f = h) : (a = h, f = e), k <= d && d <= l && a <= n && f >= m) : e === h ? (d < f ? a = d : (a = f, f = d), m <= e && e <= n && a <= l && f >= k) : a.Aa(b) || a.Aa(c) || K.cw(k, m, l, m, d, e, f, h) || K.cw(l, m, l, n, d, e, f, h) || K.cw(l, n, k, n, d, e, f, h) || K.cw(k, n, k, m, d, e, f, h) ? !0 : !1 + }, + cw: function (a, b, c, d, e, f, h, k) { + return 0 >= K.Nv(a, b, c, d, e, f) * K.Nv(a, b, c, d, h, k) && 0 >= K.Nv(e, f, h, k, a, b) * K.Nv(e, f, h, k, c, d) + }, + Nv: function (a, b, c, d, e, f) { + c -= a; + d -= b; + a = e - a; + b = f - b; + f = a * d - b * c; + 0 === f && (f = a * c + b * d, 0 < f && (f = (a - c) * c + (b - d) * d, 0 > f && (f = 0))); + return 0 > f ? -1 : 0 < f ? 1 : 0 + }, + ct: function (a) { + 0 > a && (a += 360); + 360 <= a && (a -= 360); + return a + }, + fD: function (a, b, c, d, e, f) { + void 0 === f && (f = !1); + var h = Math.PI; + f || (d *= h / 180, e *= h / 180); + f = d < e ? 1 : -1; + var k = [], l = h / 2, m = d; + for (d = Math.min(2 * h + 1E-5, Math.abs(e - d)); 1E-5 < d;) e = m + f * Math.min(d, l), k.push(K.jG(c, m, e, a, b)), d -= Math.abs(e - m), m = e; + return k + }, + jG: function (a, b, c, d, e) { + var f = (c - b) / 2, h = a * Math.cos(f), k = a * Math.sin(f), l = .5522847498 * Math.tan(f), m = h + l * k, + h = -k + l * h, k = -h, l = f + b, f = Math.cos(l), l = Math.sin(l); + return [d + a * Math.cos(b), e + a * Math.sin(b), d + m * f - h * l, e + m * l + h * f, d + + m * f - k * l, e + m * l + k * f, d + a * Math.cos(c), e + a * Math.sin(c)] + }, + xs: function (a, b, c, d, e, f, h) { + c = Math.floor((a - c) / e) * e + c; + d = Math.floor((b - d) / f) * f + d; + var k = c; + c + e - a < e / 2 && (k = c + e); + a = d; + d + f - b < f / 2 && (a = d + f); + h.m(k, a); + return h + }, + xD: function (a, b) { + var c = Math.max(a, b), d = Math.min(a, b), e = 1, f = 1; + do e = c % d, c = f = d, d = e; while (0 < e); + return f + }, + sG: function (a, b, c, d) { + var e = 0 > c, f = 0 > d, h = 0, k = h = 0; + a < b ? (h = 1, k = 0) : (h = 0, k = 1); + var l = 0, m = 0, n = 0, l = 0 === h ? a : b, m = 0 === h ? c : d; + if (0 === h ? e : f) m = -m; + h = k; + n = 0 === h ? c : d; + if (0 === h ? e : f) n = -n; + return K.tG(l, 0 === h ? a : b, m, n, 0, 0) + }, + tG: function (a, + b, c, d, e, f) { + e = 0; + if (0 < d) if (0 < c) { + f = a * a; + e = b * b; + a *= c; + var h = b * d, k = -e + h, l = -e + Math.sqrt(a * a + h * h); + b = k; + for (var m = 0; 9999999999 > m; ++m) { + b = .5 * (k + l); + if (b === k || b === l) break; + var n = a / (b + f), p = h / (b + e), n = n * n + p * p - 1; + if (0 < n) k = b; else if (0 > n) l = b; else break + } + c = f * c / (b + f) - c; + d = e * d / (b + e) - d; + e = Math.sqrt(c * c + d * d) + } else e = Math.abs(d - b); else d = a * a - b * b, e = a * c, e < d ? (d = e / d, e = a * d, f = b * Math.sqrt(Math.abs(1 - d * d)), c = e - c, e = Math.sqrt(c * c + f * f)) : e = Math.abs(c - a); + return e + } + }; + + function $c(a) { + 1 < arguments.length && u.k("Geometry constructor can take at most one optional argument, the Geometry type."); + u.gc(this); + this.Ca = !1; + void 0 === a && (a = ad); + this.oa = a; + this.Bb = this.pb = this.uc = this.nc = 0; + this.Zi = new E(bd); + this.ju = this.Zi.U; + this.Ut = (new z).freeze(); + this.Ta = !0; + this.ri = xb; + this.si = Vb; + this.Cn = this.Dn = NaN; + this.bi = cd + } + + u.fa("Geometry", $c); + u.Lh($c); + $c.prototype.copy = function () { + var a = new $c; + a.oa = this.oa; + a.nc = this.nc; + a.uc = this.uc; + a.pb = this.pb; + a.Bb = this.Bb; + for (var b = this.Zi.n, c = b.length, d = a.Zi, e = 0; e < c; e++) { + var f = b[e].copy(); + d.add(f) + } + a.ju = this.ju; + a.Ut.assign(this.Ut); + a.Ta = this.Ta; + a.ri = this.ri.Z(); + a.si = this.si.Z(); + a.Dn = this.Dn; + a.Cn = this.Cn; + a.bi = this.bi; + return a + }; + var dd; + $c.Line = dd = u.s($c, "Line", 0); + var md; + $c.Rectangle = md = u.s($c, "Rectangle", 1); + var nd; + $c.Ellipse = nd = u.s($c, "Ellipse", 2); + var ad; + $c.Path = ad = u.s($c, "Path", 3); + $c.prototype.Ka = function () { + this.freeze(); + Object.freeze(this); + return this + }; + $c.prototype.freeze = function () { + this.Ca = !0; + var a = this.ub; + a.freeze(); + for (var a = a.n, b = a.length, c = 0; c < b; c++) a[c].freeze(); + return this + }; + $c.prototype.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + var a = this.ub; + a.La(); + for (var a = a.n, b = a.length, c = 0; c < b; c++) a[c].La(); + return this + }; + $c.prototype.equalsApprox = $c.prototype.De = function (a) { + if (!(a instanceof $c)) return !1; + if (this.type !== a.type) return this.type === dd && a.type === ad ? od(this, a) : a.type === dd && this.type === ad ? od(a, this) : !1; + if (this.type === ad) { + var b = this.ub.n; + a = a.ub.n; + var c = b.length; + if (c !== a.length) return !1; + for (var d = 0; d < c; d++) if (!b[d].De(a[d])) return !1; + return !0 + } + return K.D(this.ua, a.ua) && K.D(this.va, a.va) && K.D(this.F, a.F) && K.D(this.G, a.G) + }; + + function od(a, b) { + if (a.type !== dd || b.type !== ad) return !1; + if (1 === b.ub.count) { + var c = b.ub.ja(0); + if (1 === c.Fa.count && K.D(a.ua, c.ua) && K.D(a.va, c.va) && (c = c.Fa.ja(0), c.type === pd && K.D(a.F, c.F) && K.D(a.G, c.G))) return !0 + } + return !1 + } + + var qd; + $c.stringify = qd = function (a) { + return a.toString() + }; + $c.prototype.toString = function (a) { + void 0 === a && (a = -1); + switch (this.type) { + case dd: + return 0 > a ? "M" + this.ua.toString() + " " + this.va.toString() + "L" + this.F.toString() + " " + this.G.toString() : "M" + this.ua.toFixed(a) + " " + this.va.toFixed(a) + "L" + this.F.toFixed(a) + " " + this.G.toFixed(a); + case md: + var b = new z(this.ua, this.va, 0, 0); + b.YE(this.F, this.G, 0, 0); + return 0 > a ? "M" + b.x.toString() + " " + b.y.toString() + "H" + b.right.toString() + "V" + b.bottom.toString() + "H" + b.left.toString() + "z" : "M" + b.x.toFixed(a) + " " + b.y.toFixed(a) + "H" + b.right.toFixed(a) + + "V" + b.bottom.toFixed(a) + "H" + b.left.toFixed(a) + "z"; + case nd: + b = new z(this.ua, this.va, 0, 0); + b.YE(this.F, this.G, 0, 0); + if (0 > a) { + var c = b.left.toString() + " " + (b.y + b.height / 2).toString(), + d = b.right.toString() + " " + (b.y + b.height / 2).toString(); + return "M" + c + "A" + (b.width / 2).toString() + " " + (b.height / 2).toString() + " 0 0 1 " + d + "A" + (b.width / 2).toString() + " " + (b.height / 2).toString() + " 0 0 1 " + c + } + c = b.left.toFixed(a) + " " + (b.y + b.height / 2).toFixed(a); + d = b.right.toFixed(a) + " " + (b.y + b.height / 2).toFixed(a); + return "M" + c + "A" + (b.width / + 2).toFixed(a) + " " + (b.height / 2).toFixed(a) + " 0 0 1 " + d + "A" + (b.width / 2).toFixed(a) + " " + (b.height / 2).toFixed(a) + " 0 0 1 " + c; + case ad: + for (var b = "", c = this.ub.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + 0 < e && (b += " x "); + f.Ns && (b += "F "); + b += f.toString(a) + } + return b; + default: + return this.type.toString() + } + }; + var rd; + $c.fillPath = rd = function (a) { + "string" !== typeof a && u.Kd(a, "string", $c, "fillPath:str"); + a = a.split(/[Xx]/); + for (var b = a.length, c = "", d = 0; d < b; d++) var e = a[d], c = null !== e.match(/[Ff]/) ? 0 === d ? c + e : c + ("X" + (" " === e[0] ? "" : " ") + e) : c + ((0 === d ? "" : "X ") + "F" + (" " === e[0] ? "" : " ") + e); + return c + }; + var sd; + $c.parse = sd = function (a, b) { + function c() { + return m >= t - 1 ? !0 : null !== l[m + 1].match(/[A-Za-z]/) + } + + function d() { + m++; + return l[m] + } + + function e() { + var a = new w(parseFloat(d()), parseFloat(d())); + n === n.toLowerCase() && (a.x = s.x + a.x, a.y = s.y + a.y); + return a + } + + function f() { + return s = e() + } + + function h() { + return r = e() + } + + function k() { + return "c" !== p.toLowerCase() && "s" !== p.toLowerCase() ? s : new w(2 * s.x - r.x, 2 * s.y - r.y) + } + + void 0 === b && (b = !1); + "string" !== typeof a && u.Kd(a, "string", $c, "parse:str"); + a = a.replace(/,/gm, " "); + a = a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, + "$1 $2"); + a = a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, "$1 $2"); + a = a.replace(/([UuBbMmZzLlHhVvCcSsQqTtAaFf])([^\s])/gm, "$1 $2"); + a = a.replace(/([^\s])([UuBbMmZzLlHhVvCcSsQqTtAaFf])/gm, "$1 $2"); + a = a.replace(/([0-9])([+\-])/gm, "$1 $2"); + a = a.replace(/(\.[0-9]*)(\.)/gm, "$1 $2"); + a = a.replace(/([Aa](\s+[0-9]+){3})\s+([01])\s*([01])/gm, "$1 $3 $4 "); + a = a.replace(/[\s\r\t\n]+/gm, " "); + a = a.replace(/^\s+|\s+$/g, ""); + for (var l = a.split(" "), m = -1, n = "", p = "", q = new w(0, 0), r = new w(0, 0), s = new w(0, + 0), t = l.length, v = u.p(), x = !1, B = !1, y = !0; !(m >= t - 1);) if (p = n, n = d(), "" !== n) switch (n.toUpperCase()) { + case "X": + y = !0; + B = x = !1; + break; + case "M": + var C = f(); + null === v.Tb || !0 === y ? (M(v, C.x, C.y, x, !1, !B), y = !1) : v.moveTo(C.x, C.y); + for (q = s; !c();) C = f(), v.lineTo(C.x, C.y); + break; + case "L": + for (; !c();) C = f(), v.lineTo(C.x, C.y); + break; + case "H": + for (; !c();) s = C = new w((n === n.toLowerCase() ? s.x : 0) + parseFloat(d()), s.y), v.lineTo(s.x, s.y); + break; + case "V": + for (; !c();) s = C = new w(s.x, (n === n.toLowerCase() ? s.y : 0) + parseFloat(d())), v.lineTo(s.x, s.y); + break; + case "C": + for (; !c();) { + var I = e(), H = h(), C = f(); + O(v, I.x, I.y, H.x, H.y, C.x, C.y) + } + break; + case "S": + for (; !c();) I = k(), H = h(), C = f(), O(v, I.x, I.y, H.x, H.y, C.x, C.y); + break; + case "Q": + for (; !c();) H = h(), C = f(), td(v, H.x, H.y, C.x, C.y); + break; + case "T": + for (; !c();) r = H = k(), C = f(), td(v, H.x, H.y, C.x, C.y); + break; + case "B": + for (; !c();) { + var C = parseFloat(d()), I = parseFloat(d()), H = parseFloat(d()), T = parseFloat(d()), + aa = parseFloat(d()), R = aa, N = !1; + c() || (R = parseFloat(d()), c() || (N = 0 !== parseFloat(d()))); + n === n.toLowerCase() && (H += s.x, T += s.y); + v.arcTo(C, I, + H, T, aa, R, N) + } + break; + case "A": + for (; !c();) I = Math.abs(parseFloat(d())), H = Math.abs(parseFloat(d())), T = parseFloat(d()), aa = !!parseFloat(d()), R = !!parseFloat(d()), C = f(), ud(v, I, H, T, aa, R, C.x, C.y); + break; + case "Z": + C = v.o.ub.n[v.o.ub.length - 1]; + P(v); + s = q; + break; + case "F": + C = ""; + for (I = 1; l[m + I];) if (null !== l[m + I].match(/[Uu]/)) I++; else if (null === l[m + I].match(/[A-Za-z]/)) I++; else { + C = l[m + I]; + break + } + C.match(/[Mm]/) ? x = !0 : vd(v); + break; + case "U": + C = ""; + for (I = 1; l[m + I];) if (null !== l[m + I].match(/[Ff]/)) I++; else if (null === l[m + I].match(/[A-Za-z]/)) I++; + else { + C = l[m + I]; + break + } + C.match(/[Mm]/) ? B = !0 : v.$a(!1) + } + q = v.o; + u.q(v); + if (b) for (v = q.ub.i; v.next();) C = v.value, C.Ns = !0; + return q + }; + + function wd(a, b) { + for (var c = a.length, d = u.K(), e = 0; e < c; e++) { + var f = a[e]; + d.x = f[0]; + d.y = f[1]; + b.ab(d); + f[0] = d.x; + f[1] = d.y; + d.x = f[2]; + d.y = f[3]; + b.ab(d); + f[2] = d.x; + f[3] = d.y; + d.x = f[4]; + d.y = f[5]; + b.ab(d); + f[4] = d.x; + f[5] = d.y; + d.x = f[6]; + d.y = f[7]; + b.ab(d); + f[6] = d.x; + f[7] = d.y + } + u.v(d) + } + + $c.prototype.vz = function () { + if (this.Ta || this.ju !== this.ub.U) return !0; + for (var a = this.ub.n, b = a.length, c = 0; c < b; c++) if (a[c].vz()) return !0; + return !1 + }; + $c.prototype.nA = function () { + this.Ta = !1; + this.ju = this.ub.U; + for (var a = this.ub.n, b = a.length, c = 0; c < b; c++) a[c].nA() + }; + $c.prototype.kg = function () { + var a = this.Ut; + a.La(); + isNaN(this.Dn) || isNaN(this.Cn) ? a.m(0, 0, 0, 0) : a.m(0, 0, this.Dn, this.Cn); + xd(this, a, !1); + kb(a, 0, 0, 0, 0); + a.freeze() + }; + $c.prototype.computeBoundsWithoutOrigin = $c.prototype.aG = function () { + var a = new z; + xd(this, a, !0); + return a + }; + + function xd(a, b, c) { + switch (a.type) { + case dd: + case md: + case nd: + c ? b.m(a.nc, a.uc, 0, 0) : kb(b, a.nc, a.uc, 0, 0); + kb(b, a.pb, a.Bb, 0, 0); + break; + case ad: + var d = a.ub; + a = d.n; + for (var d = d.length, e = 0; e < d; e++) { + var f = a[e]; + c && 0 === e ? b.m(f.ua, f.va, 0, 0) : kb(b, f.ua, f.va, 0, 0); + for (var h = f.Fa.n, k = h.length, l = f.ua, m = f.va, n = 0; n < k; n++) { + var p = h[n]; + switch (p.type) { + case pd: + case yd: + l = p.F; + m = p.G; + kb(b, l, m, 0, 0); + break; + case zd: + K.oo(l, m, p.Rb, p.jc, p.df, p.ef, p.F, p.G, .5, b); + l = p.F; + m = p.G; + break; + case Ad: + K.Nz(l, m, p.Rb, p.jc, p.F, p.G, .5, b); + l = p.F; + m = p.G; + break; + case Bd: + case Gd: + for (var p = + p.type === Bd ? Hd(p, f) : Id(p, f, l, m), q = p.length, r = null, s = 0; s < q; s++) r = p[s], K.oo(r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], .5, b); + null !== r && (l = r[6], m = r[7]); + break; + default: + u.k("Unknown Segment type: " + p.type) + } + } + } + break; + default: + u.k("Unknown Geometry type: " + a.type) + } + } + + $c.prototype.normalize = $c.prototype.normalize = function () { + u.I(this); + var a = this.aG(); + this.offset(-a.x, -a.y); + return new w(-a.x, -a.y) + }; + $c.prototype.offset = $c.prototype.offset = function (a, b) { + u.I(this); + this.transform(1, 0, 0, 1, a, b); + return this + }; + $c.prototype.scale = $c.prototype.scale = function (a, b) { + u.I(this); + this.transform(a, 0, 0, b, 0, 0); + return this + }; + $c.prototype.rotate = $c.prototype.rotate = function (a, b, c) { + u.I(this); + void 0 === b && (b = 0); + void 0 === c && (c = 0); + var d = u.jh(); + d.reset(); + d.rotate(a, b, c); + this.transform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + u.Ye(d); + return this + }; + $c.prototype.transform = $c.prototype.transform = function (a, b, c, d, e, f) { + var h = 0, k = 0; + switch (this.type) { + case dd: + case md: + case nd: + h = this.nc; + k = this.uc; + this.nc = h * a + k * c + e; + this.uc = h * b + k * d + f; + h = this.pb; + k = this.Bb; + this.pb = h * a + k * c + e; + this.Bb = h * b + k * d + f; + break; + case ad: + for (var l = this.ub.n, m = l.length, n = 0; n < m; n++) { + var p = l[n], h = p.ua, k = p.va; + p.ua = h * a + k * c + e; + p.va = h * b + k * d + f; + for (var p = p.Fa.n, q = p.length, r = 0; r < q; r++) { + var s = p[r]; + switch (s.type) { + case pd: + case yd: + h = s.F; + k = s.G; + s.F = h * a + k * c + e; + s.G = h * b + k * d + f; + break; + case zd: + h = s.Rb; + k = s.jc; + s.Rb = + h * a + k * c + e; + s.jc = h * b + k * d + f; + h = s.df; + k = s.ef; + s.df = h * a + k * c + e; + s.ef = h * b + k * d + f; + h = s.F; + k = s.G; + s.F = h * a + k * c + e; + s.G = h * b + k * d + f; + break; + case Ad: + h = s.Rb; + k = s.jc; + s.Rb = h * a + k * c + e; + s.jc = h * b + k * d + f; + h = s.F; + k = s.G; + s.F = h * a + k * c + e; + s.G = h * b + k * d + f; + break; + case Bd: + h = s.Ja; + k = s.Ua; + s.Ja = h * a + k * c + e; + s.Ua = h * b + k * d + f; + 0 !== b && (h = 180 * Math.atan2(b, a) / Math.PI, 0 > h && (h += 360), s.Je += h); + 0 > a && (s.Je = 180 - s.Je, s.Qf = -s.Qf); + 0 > d && (s.Je = -s.Je, s.Qf = -s.Qf); + s.radiusX *= Math.sqrt(a * a + c * c); + void 0 !== s.radiusY && (s.radiusY *= Math.sqrt(b * b + d * d)); + break; + case Gd: + h = s.F; + k = s.G; + s.F = h * + a + k * c + e; + s.G = h * b + k * d + f; + 0 !== b && (h = 180 * Math.atan2(b, a) / Math.PI, 0 > h && (h += 360), s.Pi += h); + 0 > a && (s.Pi = 180 - s.Pi, s.fl = !s.fl); + 0 > d && (s.Pi = -s.Pi, s.fl = !s.fl); + s.radiusX *= Math.sqrt(a * a + c * c); + s.radiusY *= Math.sqrt(b * b + d * d); + break; + default: + u.k("Unknown Segment type: " + s.type) + } + } + } + } + this.Ta = !0; + return this + }; + $c.prototype.Xr = function (a, b) { + var c = this.nc, d = this.uc, e = this.pb, f = this.Bb, h = Math.min(c, e), k = Math.min(d, f), + c = Math.abs(e - c), d = Math.abs(f - d), f = u.K(); + f.x = h; + f.y = k; + b.ab(f); + e = new bd(f.x, f.y); + f.x = h + c; + f.y = k; + b.ab(f); + e.Fa.add(new Jd(pd, f.x, f.y)); + f.x = h + c; + f.y = k + d; + b.ab(f); + e.Fa.add(new Jd(pd, f.x, f.y)); + f.x = h; + f.y = k + d; + b.ab(f); + e.Fa.add((new Jd(pd, f.x, f.y)).close()); + u.v(f); + a.type = ad; + a.ub.add(e); + return a + }; + $c.prototype.Aa = function (a, b, c, d) { + var e = a.x, f = a.y, h = this.kb.x - 20; + a = a.y; + for (var k = 0, l = 0, m = 0, n = 0, p = 0, q = 0, r = this.ub.n, s = r.length, t = 0; t < s; t++) { + var v = r[t]; + if (v.Ns) { + if (c && v.Aa(e, f, b)) return !0; + for (var x = v.Fa, l = v.ua, m = v.va, B = l, y = m, C = x.n, I = 0; I <= x.length; I++) { + var H, T; + I !== x.length ? (H = C[I], T = H.type, p = H.F, q = H.G) : (T = pd, p = B, q = y); + switch (T) { + case yd: + n = Kd(e, f, h, a, l, m, B, y); + if (isNaN(n)) return !0; + k += n; + B = p; + y = q; + break; + case pd: + n = Kd(e, f, h, a, l, m, p, q); + if (isNaN(n)) return !0; + k += n; + break; + case zd: + n = K.ks(l, m, H.Rb, H.jc, H.df, H.ef, p, q, + h, a, e, f, .5); + k += n; + break; + case Ad: + n = K.ks(l, m, (l + 2 * H.Rb) / 3, (m + 2 * H.jc) / 3, (H.Rb + 2 * p) / 3, (H.Rb + 2 * p) / 3, p, q, h, a, e, f, .5); + k += n; + break; + case Bd: + case Gd: + T = H.type === Bd ? Hd(H, v) : Id(H, v, l, m); + for (var aa = T.length, R = null, N = 0; N < aa; N++) { + R = T[N]; + if (0 === N) { + n = Kd(e, f, h, a, l, m, R[0], R[1]); + if (isNaN(n)) return !0; + k += n + } + n = K.ks(R[0], R[1], R[2], R[3], R[4], R[5], R[6], R[7], h, a, e, f, .5); + k += n + } + null !== R && (p = R[6], q = R[7]); + break; + default: + u.k("Unknown Segment type: " + H.type) + } + l = p; + m = q + } + if (0 !== k) return !0; + k = 0 + } else if (v.Aa(e, f, d ? b : b + 2)) return !0 + } + return 0 !== k + }; + + function Kd(a, b, c, d, e, f, h, k) { + if (K.Hd(e, f, h, k, .05, a, b)) return NaN; + var l = (a - c) * (f - k); + if (0 === l) return 0; + var m = ((a * d - b * c) * (e - h) - (a - c) * (e * k - f * h)) / l; + b = (a * d - b * c) * (f - k) / l; + if (m >= a) return 0; + if ((e > h ? e - h : h - e) < (f > k ? f - k : k - f)) { + if (e = a = 0, f < k ? (a = f, e = k) : (a = k, e = f), b < a || b > e) return 0 + } else if (e < h ? (a = e, e = h) : a = h, m < a || m > e) return 0; + return 0 < l ? 1 : -1 + } + + function Ld(a, b, c, d) { + a = a.ub.n; + for (var e = a.length, f = 0; f < e; f++) if (a[f].Aa(b, c, d)) return !0; + return !1 + } + + $c.prototype.getPointAlongPath = function (a) { + (0 > a || 1 < a) && u.wa(a, "0 <= fraction <= 1", $c, "getPointAlongPath:fraction"); + var b = this.ub.first(), c = u.eb(), d = []; + d.push(b.ua); + d.push(b.va); + for (var e = b.ua, f = b.va, h = e, k = f, l = b.Fa.n, m = l.length, n = 0; n < m; n++) { + var p = l[n]; + switch (p.oa) { + case yd: + c.push(d); + d = []; + d.push(p.F); + d.push(p.G); + e = p.F; + f = p.G; + h = e; + k = f; + break; + case pd: + d.push(p.F); + d.push(p.G); + e = p.F; + f = p.G; + break; + case zd: + K.ye(e, f, p.bd, p.xe, p.dg, p.eg, p.pb, p.Bb, .5, d); + e = p.F; + f = p.G; + break; + case Ad: + K.Xo(e, f, p.bd, p.xe, p.pb, p.Bb, .5, d); + e = p.F; + f = p.G; + break; + case Bd: + for (var q = Hd(p, b), r = q.length, s = 0; s < r; s++) { + var t = q[s]; + K.ye(e, f, t[2], t[3], t[4], t[5], t[6], t[7], .5, d); + e = t[6]; + f = t[7] + } + break; + case Gd: + q = Id(p, b, e, f); + r = q.length; + for (s = 0; s < r; s++) t = q[s], K.ye(e, f, t[2], t[3], t[4], t[5], t[6], t[7], .5, d), e = t[6], f = t[7]; + break; + default: + u.k("Segment not of valid type") + } + p.zh && (d.push(h), d.push(k)) + } + c.push(d); + q = 0; + h = c.length; + for (k = d = b = 0; k < h; k++) for (l = c[k], m = l.length, n = 0; n < m; n += 2) e = l[n], f = l[n + 1], 0 !== n && (p = Math.sqrt(Ya(b, d, e, f)), q += p), b = e, d = f; + a *= q; + for (k = q = 0; k < h; k++) for (l = + c[k], m = l.length, n = 0; n < m; n++) { + e = l[n]; + f = l[n + 1]; + if (0 !== n) { + p = Math.sqrt(Ya(b, d, e, f)); + if (q + p > a) return n = (a - q) / p, u.ra(c), new w(b + (e - b) * n, d + (f - d) * n); + q += p + } + b = e; + d = f + } + u.ra(c); + return null + }; + u.defineProperty($c, {type: "type"}, function () { + return this.oa + }, function (a) { + this.oa !== a && (u.I(this, a), this.oa = a, this.Ta = !0) + }); + u.defineProperty($c, {ua: "startX"}, function () { + return this.nc + }, function (a) { + this.nc !== a && (u.I(this, a), this.nc = a, this.Ta = !0) + }); + u.defineProperty($c, {va: "startY"}, function () { + return this.uc + }, function (a) { + this.uc !== a && (u.I(this, a), this.uc = a, this.Ta = !0) + }); + u.defineProperty($c, {F: "endX"}, function () { + return this.pb + }, function (a) { + this.pb !== a && (u.I(this, a), this.pb = a, this.Ta = !0) + }); + u.defineProperty($c, {G: "endY"}, function () { + return this.Bb + }, function (a) { + this.Bb !== a && (u.I(this, a), this.Bb = a, this.Ta = !0) + }); + u.defineProperty($c, {ub: "figures"}, function () { + return this.Zi + }, function (a) { + this.Zi !== a && (u.I(this, a), this.Zi = a, this.Ta = !0) + }); + $c.prototype.add = $c.prototype.add = function (a) { + this.Zi.add(a); + return this + }; + u.defineProperty($c, {A: "spot1"}, function () { + return this.ri + }, function (a) { + u.I(this, a); + this.ri = a.Z() + }); + u.defineProperty($c, {B: "spot2"}, function () { + return this.si + }, function (a) { + u.I(this, a); + this.si = a.Z() + }); + u.defineProperty($c, {Bd: "defaultStretch"}, function () { + return this.bi + }, function (a) { + u.I(this, a); + this.bi = a + }); + u.u($c, {kb: "bounds"}, function () { + this.vz() && (this.nA(), this.kg()); + return this.Ut + }); + + function bd(a, b, c, d) { + u.gc(this); + this.Ca = !1; + void 0 === c && (c = !0); + this.Il = c; + void 0 === d && (d = !0); + this.En = d; + this.nc = void 0 !== a ? a : 0; + this.uc = void 0 !== b ? b : 0; + this.Yn = new E(Jd); + this.cv = this.Yn.U; + this.Ta = !0 + } + + u.fa("PathFigure", bd); + u.Lh(bd); + bd.prototype.copy = function () { + var a = new bd; + a.Il = this.Il; + a.En = this.En; + a.nc = this.nc; + a.uc = this.uc; + for (var b = this.Yn.n, c = b.length, d = a.Yn, e = 0; e < c; e++) { + var f = b[e].copy(); + d.add(f) + } + a.cv = this.cv; + a.Ta = this.Ta; + return a + }; + bd.prototype.equalsApprox = bd.prototype.De = function (a) { + if (!(a instanceof bd && K.D(this.ua, a.ua) && K.D(this.va, a.va))) return !1; + var b = this.Fa.n; + a = a.Fa.n; + var c = b.length; + if (c !== a.length) return !1; + for (var d = 0; d < c; d++) if (!b[d].De(a[d])) return !1; + return !0 + }; + g = bd.prototype; + g.toString = function (a) { + void 0 === a && (a = -1); + for (var b = 0 > a ? "M" + this.ua.toString() + " " + this.va.toString() : "M" + this.ua.toFixed(a) + " " + this.va.toFixed(a), c = this.Fa.n, d = c.length, e = 0; e < d; e++) b += " " + c[e].toString(a); + return b + }; + g.freeze = function () { + this.Ca = !0; + var a = this.Fa; + a.freeze(); + for (var b = a.n, a = a.length, c = 0; c < a; c++) b[c].freeze(); + return this + }; + g.La = function () { + this.Ca = !1; + var a = this.Fa; + a.La(); + for (var a = a.n, b = a.length, c = 0; c < b; c++) a[c].La(); + return this + }; + g.vz = function () { + if (this.Ta) return !0; + var a = this.Fa; + if (this.cv !== a.U) return !0; + for (var a = a.n, b = a.length, c = 0; c < b; c++) if (a[c].Ta) return !0; + return !1 + }; + g.nA = function () { + this.Ta = !1; + var a = this.Fa; + this.cv = a.U; + for (var a = a.n, b = a.length, c = 0; c < b; c++) { + var d = a[c]; + d.Ta = !1; + d.Ri = null + } + }; + u.defineProperty(bd, {Ns: "isFilled"}, function () { + return this.Il + }, function (a) { + u.I(this, a); + this.Il = a + }); + u.defineProperty(bd, {il: "isShadowed"}, function () { + return this.En + }, function (a) { + u.I(this, a); + this.En = a + }); + u.defineProperty(bd, {ua: "startX"}, function () { + return this.nc + }, function (a) { + u.I(this, a); + this.nc = a; + this.Ta = !0 + }); + u.defineProperty(bd, {va: "startY"}, function () { + return this.uc + }, function (a) { + u.I(this, a); + this.uc = a; + this.Ta = !0 + }); + u.defineProperty(bd, {Fa: "segments"}, function () { + return this.Yn + }, function (a) { + u.I(this, a); + this.Yn = a; + this.Ta = !0 + }); + bd.prototype.add = bd.prototype.add = function (a) { + this.Yn.add(a); + return this + }; + bd.prototype.Aa = function (a, b, c) { + for (var d = this.ua, e = this.va, f = d, h = e, k = this.Fa.n, l = k.length, m = 0; m < l; m++) { + var n = k[m]; + switch (n.type) { + case yd: + f = n.F; + h = n.G; + d = n.F; + e = n.G; + break; + case pd: + if (K.Hd(d, e, n.F, n.G, c, a, b)) return !0; + d = n.F; + e = n.G; + break; + case zd: + if (K.Iv(d, e, n.Rb, n.jc, n.df, n.ef, n.F, n.G, .5, a, b, c)) return !0; + d = n.F; + e = n.G; + break; + case Ad: + if (K.Oz(d, e, n.Rb, n.jc, n.F, n.G, .5, a, b, c)) return !0; + d = n.F; + e = n.G; + break; + case Bd: + case Gd: + for (var p = n.type === Bd ? Hd(n, this) : Id(n, this, d, e), q = p.length, r = null, s = 0; s < q; s++) if (r = p[s], 0 === s && + K.Hd(d, e, r[0], r[1], c, a, b) || K.Iv(r[0], r[1], r[2], r[3], r[4], r[5], r[6], r[7], .5, a, b, c)) return !0; + null !== r && (d = r[6], e = r[7]); + break; + default: + u.k("Unknown Segment type: " + n.type) + } + if (n.ew && (d !== f || e !== h) && K.Hd(d, e, f, h, c, a, b)) return !0 + } + return !1 + }; + + function Jd(a, b, c, d, e, f, h, k) { + u.gc(this); + this.Ca = !1; + void 0 === a && (a = pd); + this.oa = a; + this.pb = void 0 !== b ? b : 0; + this.Bb = void 0 !== c ? c : 0; + a === Gd ? (void 0 !== f && (a = f % 360, 0 > a && (a += 360), this.bd = a), void 0 !== d && (this.dg = Math.max(d, 0)), void 0 !== e && (this.eg = Math.max(e, 0)), this.Ln = !!h, this.bn = !!k) : (void 0 !== d && (this.bd = d), void 0 !== e && (this.xe = e), void 0 !== f && (a === Bd && (f = Math.max(f, 0)), this.dg = f), void 0 !== h && "number" === typeof h && (a === Bd && (h = Math.max(h, 0)), this.eg = h)); + this.zh = !1; + this.Ta = !0; + this.Ri = null + } + + u.fa("PathSegment", Jd); + u.Lh(Jd); + Jd.prototype.copy = function () { + var a = new Jd; + a.oa = this.oa; + a.pb = this.pb; + a.Bb = this.Bb; + void 0 !== this.bd && (a.bd = this.bd); + void 0 !== this.xe && (a.xe = this.xe); + void 0 !== this.dg && (a.dg = this.dg); + void 0 !== this.eg && (a.eg = this.eg); + void 0 !== this.Ln && (a.Ln = this.Ln); + void 0 !== this.bn && (a.bn = this.bn); + a.zh = this.zh; + a.Ta = this.Ta; + return a + }; + Jd.prototype.equalsApprox = Jd.prototype.De = function (a) { + if (!(a instanceof Jd) || this.type !== a.type || this.ew !== a.ew) return !1; + switch (this.type) { + case yd: + case pd: + return K.D(this.F, a.F) && K.D(this.G, a.G); + case zd: + return K.D(this.F, a.F) && K.D(this.G, a.G) && K.D(this.Rb, a.Rb) && K.D(this.jc, a.jc) && K.D(this.df, a.df) && K.D(this.ef, a.ef); + case Ad: + return K.D(this.F, a.F) && K.D(this.G, a.G) && K.D(this.Rb, a.Rb) && K.D(this.jc, a.jc); + case Bd: + return K.D(this.Je, a.Je) && K.D(this.Qf, a.Qf) && K.D(this.Ja, a.Ja) && K.D(this.Ua, a.Ua) && K.D(this.radiusX, + a.radiusX) && K.D(this.radiusY, a.radiusY); + case Gd: + return this.fl === a.fl && this.hw === a.hw && K.D(this.Pi, a.Pi) && K.D(this.F, a.F) && K.D(this.G, a.G) && K.D(this.radiusX, a.radiusX) && K.D(this.radiusY, a.radiusY); + default: + return !1 + } + }; + Jd.prototype.toString = function (a) { + void 0 === a && (a = -1); + var b = ""; + switch (this.type) { + case yd: + b = 0 > a ? "M" + this.F.toString() + " " + this.G.toString() : "M" + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case pd: + b = 0 > a ? "L" + this.F.toString() + " " + this.G.toString() : "L" + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case zd: + b = 0 > a ? "C" + this.Rb.toString() + " " + this.jc.toString() + " " + this.df.toString() + " " + this.ef.toString() + " " + this.F.toString() + " " + this.G.toString() : "C" + this.Rb.toFixed(a) + " " + this.jc.toFixed(a) + " " + this.df.toFixed(a) + + " " + this.ef.toFixed(a) + " " + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case Ad: + b = 0 > a ? "Q" + this.Rb.toString() + " " + this.jc.toString() + " " + this.F.toString() + " " + this.G.toString() : "Q" + this.Rb.toFixed(a) + " " + this.jc.toFixed(a) + " " + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + case Bd: + b = 0 > a ? "B" + this.Je.toString() + " " + this.Qf.toString() + " " + this.Ja.toString() + " " + this.Ua.toString() + " " + this.radiusX : "B" + this.Je.toFixed(a) + " " + this.Qf.toFixed(a) + " " + this.Ja.toFixed(a) + " " + this.Ua.toFixed(a) + " " + this.radiusX; + break; + case Gd: + b = 0 > a ? "A" + this.radiusX.toString() + " " + this.radiusY.toString() + " " + this.Pi.toString() + " " + (this.hw ? 1 : 0) + " " + (this.fl ? 1 : 0) + " " + this.F.toString() + " " + this.G.toString() : "A" + this.radiusX.toFixed(a) + " " + this.radiusY.toFixed(a) + " " + this.Pi.toFixed(a) + " " + (this.hw ? 1 : 0) + " " + (this.fl ? 1 : 0) + " " + this.F.toFixed(a) + " " + this.G.toFixed(a); + break; + default: + b = this.type.toString() + } + return b + (this.zh ? "z" : "") + }; + var yd; + Jd.Move = yd = u.s(Jd, "Move", 0); + var pd; + Jd.Line = pd = u.s(Jd, "Line", 1); + var zd; + Jd.Bezier = zd = u.s(Jd, "Bezier", 2); + var Ad; + Jd.QuadraticBezier = Ad = u.s(Jd, "QuadraticBezier", 3); + var Bd; + Jd.Arc = Bd = u.s(Jd, "Arc", 4); + var Gd; + Jd.SvgArc = Gd = u.s(Jd, "SvgArc", 4); + Jd.prototype.freeze = function () { + this.Ca = !0; + return this + }; + Jd.prototype.La = function () { + this.Ca = !1; + return this + }; + Jd.prototype.close = Jd.prototype.close = function () { + this.zh = !0; + return this + }; + + function Hd(a, b) { + if (null !== a.Ri && !1 === b.Ta) return a.Ri; + var c = a.radiusX, d = a.radiusY; + void 0 === d && (d = c); + var e = a.bd, f = a.xe, h = K.fD(0, 0, c < d ? c : d, a.Je, a.Je + a.Qf, !1); + if (c !== d) { + var k = u.jh(); + k.reset(); + c < d ? k.scale(1, d / c) : k.scale(c / d, 1); + wd(h, k); + u.Ye(k) + } + c = h.length; + for (d = 0; d < c; d++) k = h[d], k[0] += e, k[1] += f, k[2] += e, k[3] += f, k[4] += e, k[5] += f, k[6] += e, k[7] += f; + a.Ri = h; + return a.Ri + } + + function Id(a, b, c, d) { + function e(a, b, c, d) { + return (a * d < b * c ? -1 : 1) * Math.acos(f(a, b, c, d)) + } + + function f(a, b, c, d) { + return (a * c + b * d) / (Math.sqrt(a * a + b * b) * Math.sqrt(c * c + d * d)) + } + + if (null !== a.Ri && !1 === b.Ta) return a.Ri; + b = a.dg; + var h = a.eg, k = Math.PI / 180 * a.bd, l = a.Ln, m = a.bn, n = a.pb, p = a.Bb, q = Math.cos(k), + r = Math.sin(k), s = q * (c - n) / 2 + r * (d - p) / 2, k = -r * (c - n) / 2 + q * (d - p) / 2, + t = s * s / (b * b) + k * k / (h * h); + 1 < t && (b *= Math.sqrt(t), h *= Math.sqrt(t)); + t = (l === m ? -1 : 1) * Math.sqrt((b * b * h * h - b * b * k * k - h * h * s * s) / (b * b * k * k + h * h * s * s)); + isNaN(t) && (t = 0); + l = t * b * k / h; + t = t * -h * s / + b; + isNaN(l) && (l = 0); + isNaN(t) && (t = 0); + c = (c + n) / 2 + q * l - r * t; + d = (d + p) / 2 + r * l + q * t; + p = e(1, 0, (s - l) / b, (k - t) / h); + q = (s - l) / b; + n = (k - t) / h; + s = (-s - l) / b; + l = (-k - t) / h; + k = e(q, n, s, l); + s = f(q, n, s, l); + -1 >= s ? k = Math.PI : 1 <= s && (k = 0); + !m && 0 < k && (k -= 2 * Math.PI); + m && 0 > k && (k += 2 * Math.PI); + m = b > h ? 1 : b / h; + s = b > h ? h / b : 1; + b = K.fD(0, 0, b > h ? b : h, p, p + k, !0); + h = u.jh(); + h.reset(); + h.translate(c, d); + h.rotate(a.bd, 0, 0); + h.scale(m, s); + wd(b, h); + u.Ye(h); + a.Ri = b; + return a.Ri + } + + u.defineProperty(Jd, {ew: "isClosed"}, function () { + return this.zh + }, function (a) { + this.zh !== a && (this.zh = a, this.Ta = !0) + }); + u.defineProperty(Jd, {type: "type"}, function () { + return this.oa + }, function (a) { + u.I(this, a); + this.oa = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {F: "endX"}, function () { + return this.pb + }, function (a) { + u.I(this, a); + this.pb = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {G: "endY"}, function () { + return this.Bb + }, function (a) { + u.I(this, a); + this.Bb = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Rb: "point1X"}, function () { + return this.bd + }, function (a) { + u.I(this, a); + this.bd = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {jc: "point1Y"}, function () { + return this.xe + }, function (a) { + u.I(this, a); + this.xe = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {df: "point2X"}, function () { + return this.dg + }, function (a) { + u.I(this, a); + this.dg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {ef: "point2Y"}, function () { + return this.eg + }, function (a) { + u.I(this, a); + this.eg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Ja: "centerX"}, function () { + return this.bd + }, function (a) { + u.I(this, a); + this.bd = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Ua: "centerY"}, function () { + return this.xe + }, function (a) { + u.I(this, a); + this.xe = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {radiusX: "radiusX"}, function () { + return this.dg + }, function (a) { + 0 > a && u.wa(a, ">= zero", Jd, "radiusX"); + u.I(this, a); + this.dg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {radiusY: "radiusY"}, function () { + return this.eg + }, function (a) { + 0 > a && u.wa(a, ">= zero", Jd, "radiusY"); + u.I(this, a); + this.eg = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Je: "startAngle"}, function () { + return this.pb + }, function (a) { + this.pb !== a && (u.I(this, a), a %= 360, 0 > a && (a += 360), this.pb = a, this.Ta = !0) + }); + u.defineProperty(Jd, {Qf: "sweepAngle"}, function () { + return this.Bb + }, function (a) { + u.I(this, a); + 360 < a && (a = 360); + -360 > a && (a = -360); + this.Bb = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {fl: "isClockwiseArc"}, function () { + return this.bn + }, function (a) { + u.I(this, a); + this.bn = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {hw: "isLargeArc"}, function () { + return this.Ln + }, function (a) { + u.I(this, a); + this.Ln = a; + this.Ta = !0 + }); + u.defineProperty(Jd, {Pi: "xAxisRotation"}, function () { + return this.bd + }, function (a) { + a %= 360; + 0 > a && (a += 360); + u.I(this, a); + this.bd = a; + this.Ta = !0 + }); + + function Md() { + this.Y = null; + this.Hy = (new w(0, 0)).freeze(); + this.Cx = (new w(0, 0)).freeze(); + this.Rt = this.Mu = 0; + this.Au = ""; + this.rv = this.gu = !1; + this.cu = this.Tt = 0; + this.Si = this.nu = this.wu = !1; + this.Vp = null; + this.qv = 0; + this.fg = this.nv = null + } + + u.fa("InputEvent", Md); + Md.prototype.copy = function () { + var a = new Md; + a.Y = this.Y; + a.Hy.assign(this.ff); + a.Cx.assign(this.da); + a.Mu = this.Mu; + a.Rt = this.Rt; + a.Au = this.Au; + a.gu = this.gu; + a.rv = this.rv; + a.Tt = this.Tt; + a.cu = this.cu; + a.wu = this.wu; + a.nu = this.nu; + a.Si = this.Si; + a.Vp = this.Vp; + a.qv = this.qv; + a.nv = this.nv; + a.fg = this.fg; + return a + }; + Md.prototype.toString = function () { + var a = "^"; + 0 !== this.gd && (a += "M:" + this.gd); + 0 !== this.button && (a += "B:" + this.button); + "" !== this.key && (a += "K:" + this.key); + 0 !== this.Te && (a += "C:" + this.Te); + 0 !== this.Uk && (a += "D:" + this.Uk); + this.Tc && (a += "h"); + this.bubbles && (a += "b"); + null !== this.da && (a += "@" + this.da.toString()); + return a + }; + u.defineProperty(Md, {g: "diagram"}, function () { + return this.Y + }, function (a) { + this.Y = a + }); + u.defineProperty(Md, {ff: "viewPoint"}, function () { + return this.Hy + }, function (a) { + u.C(a, w, Md, "viewPoint"); + this.Hy.assign(a) + }); + u.defineProperty(Md, {da: "documentPoint"}, function () { + return this.Cx + }, function (a) { + u.C(a, w, Md, "documentPoint"); + this.Cx.assign(a) + }); + u.defineProperty(Md, {gd: "modifiers"}, function () { + return this.Mu + }, function (a) { + this.Mu = a + }); + u.defineProperty(Md, {button: "button"}, function () { + return this.Rt + }, function (a) { + this.Rt = a + }); + u.defineProperty(Md, {key: "key"}, function () { + return this.Au + }, function (a) { + this.Au = a + }); + u.defineProperty(Md, {Wk: "down"}, function () { + return this.gu + }, function (a) { + this.gu = a + }); + u.defineProperty(Md, {up: "up"}, function () { + return this.rv + }, function (a) { + this.rv = a + }); + u.defineProperty(Md, {Te: "clickCount"}, function () { + return this.Tt + }, function (a) { + this.Tt = a + }); + u.defineProperty(Md, {Uk: "delta"}, function () { + return this.cu + }, function (a) { + this.cu = a + }); + u.defineProperty(Md, {Ps: "isMultiTouch"}, function () { + return this.wu + }, function (a) { + this.wu = a + }); + u.defineProperty(Md, {Tc: "handled"}, function () { + return this.nu + }, function (a) { + this.nu = a + }); + u.defineProperty(Md, {bubbles: "bubbles"}, function () { + return this.Si + }, function (a) { + this.Si = a + }); + u.defineProperty(Md, {event: "event"}, function () { + return this.Vp + }, function (a) { + this.Vp = a + }); + u.u(Md, {jl: "isTouchEvent"}, function () { + var a = window.TouchEvent; + return a && this.event instanceof a ? !0 : (a = window.PointerEvent) && this.event instanceof a && "touch" === this.event.pointerType + }); + u.defineProperty(Md, {timestamp: "timestamp"}, function () { + return this.qv + }, function (a) { + this.qv = a + }); + u.defineProperty(Md, {Cg: "targetDiagram"}, function () { + return this.nv + }, function (a) { + this.nv = a + }); + u.defineProperty(Md, {pe: "targetObject"}, function () { + return this.fg + }, function (a) { + this.fg = a + }); + u.defineProperty(Md, {control: "control"}, function () { + return 0 !== (this.gd & 1) + }, function (a) { + this.gd = a ? this.gd | 1 : this.gd & -2 + }); + u.defineProperty(Md, {shift: "shift"}, function () { + return 0 !== (this.gd & 4) + }, function (a) { + this.gd = a ? this.gd | 4 : this.gd & -5 + }); + u.defineProperty(Md, {alt: "alt"}, function () { + return 0 !== (this.gd & 2) + }, function (a) { + this.gd = a ? this.gd | 2 : this.gd & -3 + }); + u.defineProperty(Md, {Ys: "meta"}, function () { + return 0 !== (this.gd & 8) + }, function (a) { + this.gd = a ? this.gd | 8 : this.gd & -9 + }); + u.defineProperty(Md, {left: "left"}, function () { + return 0 === this.button + }, function (a) { + this.button = a ? 0 : 2 + }); + u.defineProperty(Md, {YJ: "middle"}, function () { + return 1 === this.button + }, function (a) { + this.button = a ? 1 : 0 + }); + u.defineProperty(Md, {right: "right"}, function () { + return 2 === this.button + }, function (a) { + this.button = a ? 2 : 0 + }); + + function Nd() { + this.Y = null; + this.Ub = ""; + this.Vu = this.iv = null; + this.St = !1 + } + + u.fa("DiagramEvent", Nd); + Nd.prototype.copy = function () { + var a = new Nd; + a.Y = this.Y; + a.Ub = this.Ub; + a.iv = this.iv; + a.Vu = this.Vu; + a.St = this.St; + return a + }; + Nd.prototype.toString = function () { + var a = "*" + this.name; + this.cancel && (a += "x"); + null !== this.hA && (a += ":" + this.hA.toString()); + null !== this.Mz && (a += "(" + this.Mz.toString() + ")"); + return a + }; + u.defineProperty(Nd, {g: "diagram"}, function () { + return this.Y + }, function (a) { + this.Y = a + }); + u.defineProperty(Nd, {name: "name"}, function () { + return this.Ub + }, function (a) { + this.Ub = a + }); + u.defineProperty(Nd, {hA: "subject"}, function () { + return this.iv + }, function (a) { + this.iv = a + }); + u.defineProperty(Nd, {Mz: "parameter"}, function () { + return this.Vu + }, function (a) { + this.Vu = a + }); + u.defineProperty(Nd, {cancel: "cancel"}, function () { + return this.St + }, function (a) { + this.St = a + }); + + function Zd() { + this.Bp = $d; + this.Xl = this.Lu = ""; + this.Wq = this.Xq = this.ar = this.br = this.$q = this.Y = this.Od = null + } + + u.fa("ChangedEvent", Zd); + var ae; + Zd.Transaction = ae = u.s(Zd, "Transaction", -1); + var $d; + Zd.Property = $d = u.s(Zd, "Property", 0); + var be; + Zd.Insert = be = u.s(Zd, "Insert", 1); + var ce; + Zd.Remove = ce = u.s(Zd, "Remove", 2); + Zd.prototype.clear = Zd.prototype.clear = function () { + this.Wq = this.Xq = this.ar = this.br = this.$q = this.Y = this.Od = null + }; + Zd.prototype.copy = function () { + var a = new Zd; + a.Od = this.Od; + a.Y = this.Y; + a.Bp = this.Bp; + a.Lu = this.Lu; + a.Xl = this.Xl; + a.$q = this.$q; + var b = this.br; + a.br = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + b = this.ar; + a.ar = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + b = this.Xq; + a.Xq = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + b = this.Wq; + a.Wq = u.Sa(b) && "function" === typeof b.Z ? b.Z() : b; + return a + }; + Zd.prototype.toString = function () { + var a = "", + a = this.Ad === ae ? a + "* " : this.Ad === $d ? a + (null !== this.ga ? "!m" : "!d") : a + ((null !== this.ga ? "!m" : "!d") + this.Ad); + this.propertyName && "string" === typeof this.propertyName && (a += " " + this.propertyName); + this.Lf && this.Lf !== this.propertyName && (a += " " + this.Lf); + a += ": "; + this.Ad === ae ? null !== this.oldValue && (a += " " + this.oldValue) : (null !== this.object && (a += de(this.object)), null !== this.oldValue && (a += " old: " + de(this.oldValue)), null !== this.zg && (a += " " + this.zg), null !== this.newValue && + (a += " new: " + de(this.newValue)), null !== this.xg && (a += " " + this.xg)); + return a + }; + Zd.prototype.getValue = Zd.prototype.ta = function (a) { + return a ? this.oldValue : this.newValue + }; + Zd.prototype.getParam = function (a) { + return a ? this.zg : this.xg + }; + Zd.prototype.canUndo = Zd.prototype.canUndo = function () { + return null !== this.ga || null !== this.g ? !0 : !1 + }; + Zd.prototype.undo = Zd.prototype.undo = function () { + this.canUndo() && (null !== this.ga ? this.ga.pm(this, !0) : null !== this.g && this.g.pm(this, !0)) + }; + Zd.prototype.canRedo = Zd.prototype.canRedo = function () { + return null !== this.ga || null !== this.g ? !0 : !1 + }; + Zd.prototype.redo = Zd.prototype.redo = function () { + this.canRedo() && (null !== this.ga ? this.ga.pm(this, !1) : null !== this.g && this.g.pm(this, !1)) + }; + u.defineProperty(Zd, {ga: "model"}, function () { + return this.Od + }, function (a) { + this.Od = a + }); + u.defineProperty(Zd, {g: "diagram"}, function () { + return this.Y + }, function (a) { + this.Y = a + }); + u.defineProperty(Zd, {Ad: "change"}, function () { + return this.Bp + }, function (a) { + this.Bp = a + }); + u.defineProperty(Zd, {Lf: "modelChange"}, function () { + return this.Lu + }, function (a) { + this.Lu = a + }); + u.defineProperty(Zd, {propertyName: "propertyName"}, function () { + return this.Xl + }, function (a) { + this.Xl = a + }); + u.u(Zd, {IJ: "isTransactionFinished"}, function () { + return this.Bp === ae && ("CommittedTransaction" === this.Xl || "FinishedUndo" === this.Xl || "FinishedRedo" === this.Xl) + }); + u.defineProperty(Zd, {object: "object"}, function () { + return this.$q + }, function (a) { + this.$q = a + }); + u.defineProperty(Zd, {oldValue: "oldValue"}, function () { + return this.br + }, function (a) { + this.br = a + }); + u.defineProperty(Zd, {zg: "oldParam"}, function () { + return this.ar + }, function (a) { + this.ar = a + }); + u.defineProperty(Zd, {newValue: "newValue"}, function () { + return this.Xq + }, function (a) { + this.Xq = a + }); + u.defineProperty(Zd, {xg: "newParam"}, function () { + return this.Wq + }, function (a) { + this.Wq = a + }); + + function J(a) { + 1 < arguments.length && u.k("Model constructor can only take one optional argument, the Array of node data."); + u.gc(this); + this.wx = this.Ub = ""; + this.vk = !1; + this.gy = {}; + this.mf = []; + this.tc = new la(null, Object); + this.Tl = "key"; + this.Xt = this.Eu = null; + this.nx = this.ox = !1; + this.Yq = "category"; + this.uh = new la(null, F); + this.jj = null; + this.qi = !1; + this.Gy = null; + this.ha = new ee; + void 0 !== a && (this.ah = a) + } + + u.fa("Model", J); + J.prototype.clear = J.prototype.clear = function () { + this.mf = []; + this.tc.clear(); + this.uh.clear(); + this.ha.clear() + }; + g = J.prototype; + g.At = function () { + var a = ""; + "" !== this.name && (a += ',\n "name": ' + this.quote(this.name)); + "" !== this.Sk && (a += ',\n "dataFormat": ' + this.quote(this.Sk)); + this.nb && (a += ',\n "isReadOnly": ' + this.nb); + "key" !== this.Jm && "string" === typeof this.Jm && (a += ',\n "nodeKeyProperty": ' + this.quote(this.Jm)); + this.Xy && (a += ',\n "copiesArrays": true'); + this.Wy && (a += ',\n "copiesArrayObjects": true'); + "category" !== this.Im && "string" === typeof this.Im && (a += ',\n "nodeCategoryProperty": ' + this.quote(this.Im)); + return a + }; + g.pA = function () { + var a = "", b = this.Zs, c = !1, d; + for (d in b) if (!fe(d, b[d])) { + c = !0; + break + } + c && (a = ',\n "modelData": ' + oe(this, b)); + return a + ',\n "nodeDataArray": ' + pe(this, this.ah, !0) + }; + g.ft = function (a) { + a.name && (this.name = a.name); + a.dataFormat && (this.Sk = a.dataFormat); + a.isReadOnly && (this.nb = a.isReadOnly); + a.nodeKeyProperty && (this.Jm = a.nodeKeyProperty); + a.copiesArrays && (this.Xy = a.copiesArrays); + a.copiesArrayObjects && (this.Wy = a.copiesArrayObjects); + a.nodeCategoryProperty && (this.Im = a.nodeCategoryProperty) + }; + g.Qz = function (a) { + var b = a.modelData; + u.Sa(b) && (this.ht(b), this.Zs = b); + a = a.nodeDataArray; + u.isArray(a) && (this.ht(a), this.ah = a) + }; + g.toString = function (a) { + void 0 === a && (a = 0); + if (1 < a) return this.kA(); + var b = ("" !== this.name ? this.name : "") + " Model"; + if (0 < a) { + b += "\n node data:"; + a = this.ah; + for (var c = u.qb(a), d = 0; d < c; d++) var e = u.fb(a, d), b = b + (" " + this.wb(e) + ":" + de(e)) + } + return b + }; + J.prototype.toJson = J.prototype.toJSON = J.prototype.kA = function (a) { + void 0 === a && (a = this.constructor === J ? "go.Model" : this.constructor === Q ? "go.GraphLinksModel" : this.constructor === qe ? "go.TreeModel" : u.rg(this)); + return '{ "class": ' + this.quote(a) + this.At() + this.pA() + "}" + }; + J.fromJson = J.fromJSON = function (a, b) { + void 0 === b && (b = null); + null !== b && u.C(b, J, J, "fromJson:model"); + var c = null; + if ("string" === typeof a) if (window.JSON && window.JSON.parse) try { + c = window.JSON.parse(a) + } catch (d) { + } else u.trace("WARNING: no JSON.parse available"); else "object" === typeof a ? c = a : u.k("Unable to construct a Model from: " + a); + if (null === b) { + var e; + e = null; + var f = c["class"]; + if ("string" === typeof f) try { + var h = null; + 0 === f.indexOf("go.") ? (f = f.substr(3), h = da[f]) : (h = da[f], void 0 === h && (h = window[f])); + "function" === typeof h && + (e = new h) + } catch (k) { + } + null === e || e instanceof J ? b = e : u.k("Unable to construct a Model of declared class: " + c["class"]) + } + null === b && (b = new Q); + b.ft(c); + b.Qz(c); + return b + }; + J.prototype.replaceJsonObjects = J.prototype.ht = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + u.Sa(d) && u.RC(a, c, this.ht(d)) + } else if (u.Sa(a)) { + for (c in a) if (d = a[c], u.Sa(d) && (d = this.ht(d), a[c] = d, "points" === c && Array.isArray(d))) { + for (var e = 0 === d.length % 2, f = 0; f < d.length; f++) if ("number" !== typeof d[f]) { + e = !1; + break + } + if (e) { + e = new E(w); + for (f = 0; f < d.length / 2; f++) e.add(new w(d[2 * f], d[2 * f + 1])); + e.freeze(); + a[c] = e + } + } + if ("object" === typeof a) { + c = a; + d = a["class"]; + if ("NaN" === d) c = NaN; else if ("Date" === + d) c = new Date(a.value); else if ("go.Point" === d) c = new w(re(a.x), re(a.y)); else if ("go.Size" === d) c = new ia(re(a.width), re(a.height)); else if ("go.Rect" === d) c = new z(re(a.x), re(a.y), re(a.width), re(a.height)); else if ("go.Margin" === d) c = new rb(re(a.top), re(a.right), re(a.bottom), re(a.left)); else if ("go.Spot" === d) c = "string" === typeof a["enum"] ? tb(a["enum"]) : new L(re(a.x), re(a.y), re(a.offsetX), re(a.offsetY)); else if ("go.Brush" === d) { + if (c = new ga, c.type = Da(ga, a.type), "string" === typeof a.color && (c.color = a.color), a.start instanceof + L && (c.start = a.start), a.end instanceof L && (c.end = a.end), "number" === typeof a.startRadius && (c.ut = re(a.startRadius)), "number" === typeof a.endRadius && (c.us = re(a.endRadius)), a = a.colorStops, u.Sa(a)) for (b in a) c.addColorStop(parseFloat(b), a[b]) + } else "go.Geometry" === d && (b = null, b = "string" === typeof a.path ? sd(a.path) : new $c, b.type = Da($c, a.type), "number" === typeof a.startX && (b.ua = re(a.startX)), "number" === typeof a.startY && (b.va = re(a.startY)), "number" === typeof a.endX && (b.F = re(a.endX)), "number" === typeof a.endY && (b.G = + re(a.endY)), a.spot1 instanceof L && (b.A = a.spot1), a.spot2 instanceof L && (b.B = a.spot2), c = b); + a = c + } + } + return a + }; + J.prototype.quote = function (a) { + for (var b = "", c = a.length, d = 0; d < c; d++) var e = a[d], b = '"' === e || "\\" === e ? b + ("\\" + e) : "\b" === e ? b + "\\b" : "\f" === e ? b + "\\f" : "\n" === e ? b + "\\n" : "\r" === e ? b + "\\r" : "\t" === e ? b + "\\t" : b + e; + return '"' + b + '"' + }; + J.prototype.writeJsonValue = J.prototype.Bt = function (a) { + return void 0 === a ? "undefined" : null === a ? "null" : !0 === a ? "true" : !1 === a ? "false" : "string" === typeof a ? this.quote(a) : "number" === typeof a ? Infinity === a ? "9e9999" : -Infinity === a ? "-9e9999" : isNaN(a) ? '{"class":"NaN"}' : a.toString() : a instanceof Date ? '{"class":"Date", "value":"' + a.toJSON() + '"}' : a instanceof Number ? this.Bt(a.valueOf()) : u.isArray(a) ? pe(this, a) : u.Sa(a) ? oe(this, a) : "function" === typeof a ? "null" : a.toString() + }; + + function pe(a, b, c) { + void 0 === c && (c = !1); + var d = u.qb(b); + if (0 >= d) return "[]"; + var e = new Ba; + e.add("[ "); + c && 1 < d && e.add("\n"); + for (var f = 0; f < d; f++) { + var h = u.fb(b, f); + void 0 !== h && (0 < f && (e.add(","), c && e.add("\n")), e.add(a.Bt(h))) + } + c && 1 < d && e.add("\n"); + e.add(" ]"); + return e.toString() + } + + function fe(a, b) { + return void 0 === b || "__gohashid" === a || "_" === a[0] || "function" === typeof b ? !0 : !1 + } + + function se(a) { + return isNaN(a) ? "NaN" : Infinity === a ? "9e9999" : -Infinity === a ? "-9e9999" : a + } + + function oe(a, b) { + var c = b; + if (c instanceof w) { + var d = c; + b = {"class": "go.Point", x: se(d.x), y: se(d.y)} + } else if (c instanceof ia) { + var e = c; + b = {"class": "go.Size", width: se(e.width), height: se(e.height)} + } else if (c instanceof z) b = { + "class": "go.Rect", + x: se(c.x), + y: se(c.y), + width: se(c.width), + height: se(c.height) + }; else if (c instanceof rb) b = { + "class": "go.Margin", + top: se(c.top), + right: se(c.right), + bottom: se(c.bottom), + left: se(c.left) + }; else if (c instanceof L) e = c, b = e.pd() ? { + "class": "go.Spot", x: se(e.x), y: se(e.y), offsetX: se(e.offsetX), + offsetY: se(e.offsetY) + } : {"class": "go.Spot", "enum": e.toString()}; else if (c instanceof ga) { + b = {"class": "go.Brush", type: c.type.name}; + if (c.type === te) b.color = c.color; else if (c.type === ue || c.type === ve) b.start = c.start, b.end = c.end, c.type === ve && (0 !== c.ut && (b.startRadius = se(c.ut)), isNaN(c.us) || (b.endRadius = se(c.us))); + if (null !== c.os) { + for (var f = {}, h = c.os.i; h.next();) f[h.key] = h.value; + b.colorStops = f + } + } else if (c instanceof $c) b = { + "class": "go.Geometry", + type: c.type.name + }, 0 !== c.ua && (b.startX = se(c.ua)), 0 !== c.va && (b.startY = + se(c.va)), 0 !== c.F && (b.endX = se(c.F)), 0 !== c.G && (b.endY = se(c.G)), c.A.L(xb) || (b.spot1 = c.A), c.B.L(Vb) || (b.spot2 = c.B), c.type === ad && (b.path = qd(c)); else if (c instanceof S || c instanceof D || c instanceof we || c instanceof J || c instanceof xe || c instanceof sa || c instanceof Je || c instanceof xa || c instanceof ee || c instanceof Ke) return u.trace("ERROR: trying to convert a GraphObject or Diagram or Model or Tool or Layout or UndoManager into JSON text: " + c.toString()), "{}"; + f = "{"; + c = !0; + for (d in b) if (e = u.sb(b, d), !fe(d, + e)) if (c ? c = !1 : f += ", ", f += '"' + d + '":', "points" === d && e instanceof E && e.oa === w) { + h = e; + e = "["; + for (h = h.i; h.next();) { + var k = h.value; + 1 < e.length && (e += ","); + e += a.Bt(k.x); + e += ","; + e += a.Bt(k.y) + } + e += "]"; + f += e + } else f += a.Bt(e); + return f + "}" + } + + function re(a) { + return "number" === typeof a ? a : "NaN" === a ? NaN : "9e9999" === a ? Infinity : "-9e9999" === a ? -Infinity : parseFloat(a) + } + + u.defineProperty(J, {name: "name"}, function () { + return this.Ub + }, function (a) { + var b = this.Ub; + b !== a && (u.j(a, "string", J, "name"), this.Ub = a, this.h("name", b, a)) + }); + u.defineProperty(J, {Sk: "dataFormat"}, function () { + return this.wx + }, function (a) { + var b = this.wx; + b !== a && (u.j(a, "string", J, "dataFormat"), this.wx = a, this.h("dataFormat", b, a)) + }); + u.defineProperty(J, {nb: "isReadOnly"}, function () { + return this.vk + }, function (a) { + var b = this.vk; + b !== a && (u.j(a, "boolean", J, "isReadOnly"), this.vk = a, this.h("isReadOnly", b, a)) + }); + u.defineProperty(J, {Zs: "modelData"}, function () { + return this.gy + }, function (a) { + var b = this.gy; + b !== a && (u.j(a, "object", J, "modelData"), this.gy = a, this.h("modelData", b, a), this.Nb(a)) + }); + J.prototype.addChangedListener = J.prototype.Jy = function (a) { + u.j(a, "function", J, "addChangedListener:listener"); + null === this.jj && (this.jj = new E("function")); + this.jj.add(a) + }; + J.prototype.removeChangedListener = J.prototype.Tz = function (a) { + u.j(a, "function", J, "removeChangedListener:listener"); + null !== this.jj && (this.jj.remove(a), 0 === this.jj.count && (this.jj = null)) + }; + J.prototype.Jv = function (a) { + this.cb || this.ha.ED(a); + if (null !== this.jj) { + var b = this.jj, c = b.length; + if (1 === c) b = b.ja(0), b(a); else if (0 !== c) for (var d = b.Ke(), e = 0; e < c; e++) b = d[e], b(a) + } + }; + J.prototype.raiseChangedEvent = J.prototype.Dc = function (a, b, c, d, e, f, h) { + Le(this, "", a, b, c, d, e, f, h) + }; + J.prototype.raiseChanged = J.prototype.h = function (a, b, c, d, e) { + Le(this, "", $d, a, this, b, c, d, e) + }; + J.prototype.raiseDataChanged = J.prototype.Pz = function (a, b, c, d, e, f) { + Le(this, "", $d, b, a, c, d, e, f) + }; + + function Le(a, b, c, d, e, f, h, k, l) { + void 0 === k && (k = null); + void 0 === l && (l = null); + var m = new Zd; + m.ga = a; + m.Ad = c; + m.Lf = b; + m.propertyName = d; + m.object = e; + m.oldValue = f; + m.zg = k; + m.newValue = h; + m.xg = l; + a.Jv(m) + } + + u.defineProperty(J, {ha: "undoManager"}, function () { + return this.Gy + }, function (a) { + var b = this.Gy; + b !== a && (u.C(a, ee, J, "undoManager"), null !== b && b.SH(this), this.Gy = a, null !== a && a.MF(this)) + }); + u.defineProperty(J, {cb: "skipsUndoManager"}, function () { + return this.qi + }, function (a) { + u.j(a, "boolean", J, "skipsUndoManager"); + this.qi = a + }); + J.prototype.pm = function (a, b) { + if (null !== a && a.ga === this) if (a.Ad === $d) { + var c = a.object, d = a.propertyName, e = a.ta(b); + u.Oa(c, d, e) + } else a.Ad === be ? "nodeDataArray" === a.Lf ? (c = a.newValue, u.Sa(c) && (d = this.wb(c), void 0 !== d && (b ? (u.zi(this.mf, a.xg), this.tc.remove(d)) : (u.yi(this.mf, a.xg, c), this.tc.add(d, c))))) : "" === a.Lf ? (c = a.object, !u.isArray(c) && a.propertyName && (c = u.sb(a.object, a.propertyName)), u.isArray(c) && (d = a.newValue, e = a.xg, b ? u.zi(c, e) : u.yi(c, e, d))) : u.k("unknown ChangedEvent.Insert object: " + a.toString()) : a.Ad === + ce ? "nodeDataArray" === a.Lf ? (c = a.oldValue, u.Sa(c) && (d = this.wb(c), void 0 !== d && (b ? (u.yi(this.mf, a.zg, c), this.tc.add(d, c)) : (u.zi(this.mf, a.zg), this.tc.remove(d))))) : "" === a.Lf ? (c = a.object, !u.isArray(c) && a.propertyName && (c = u.sb(a.object, a.propertyName)), u.isArray(c) && (d = a.oldValue, e = a.zg, b ? u.yi(c, e, d) : u.zi(c, e))) : u.k("unknown ChangedEvent.Remove object: " + a.toString()) : a.Ad !== ae && u.k("unknown ChangedEvent: " + a.toString()) + }; + J.prototype.startTransaction = J.prototype.Wb = function (a) { + return this.ha.Wb(a) + }; + J.prototype.commitTransaction = J.prototype.Wd = function (a) { + return this.ha.Wd(a) + }; + J.prototype.rollbackTransaction = J.prototype.ap = function () { + return this.ha.ap() + }; + J.prototype.updateTargetBindings = J.prototype.Nb = function (a, b) { + void 0 === b && (b = ""); + Le(this, "SourceChanged", ae, b, a, null, null) + }; + u.defineProperty(J, {Jm: "nodeKeyProperty"}, function () { + return this.Tl + }, function (a) { + var b = this.Tl; + b !== a && (Me(a, J, "nodeKeyProperty"), 0 < this.tc.count && u.k("Cannot set Model.nodeKeyProperty when there is existing node data"), this.Tl = a, this.h("nodeKeyProperty", b, a)) + }); + + function Me(a, b, c) { + "string" !== typeof a && "function" !== typeof a && u.Kd(a, "string or function", b, c) + } + + J.prototype.getKeyForNodeData = J.prototype.wb = function (a) { + if (null !== a) { + var b = this.Tl; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("Key value for node data " + a + " is not a number or a string: " + b) + } + } + }; + J.prototype.setKeyForNodeData = J.prototype.bA = function (a, b) { + void 0 !== b && null !== b && Ne(b) || u.Kd(b, "number or string", J, "setKeyForNodeData:key"); + if (null !== a) { + var c = this.Tl; + if ("" !== c) if (this.Ue(a)) { + var d = u.sb(a, c); + d !== b && null === this.qf(b) && (u.Oa(a, c, b), this.tc.remove(d), this.tc.add(b, a), Le(this, "nodeKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c), this.gt(d, b)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(J, {RJ: "makeUniqueKeyFunction"}, function () { + return this.Eu + }, function (a) { + var b = this.Eu; + b !== a && (null !== a && u.j(a, "function", J, "makeUniqueKeyFunction"), this.Eu = a, this.h("makeUniqueKeyFunction", b, a)) + }); + + function Ne(a) { + return "number" === typeof a || "string" === typeof a + } + + J.prototype.containsNodeData = J.prototype.Ue = function (a) { + a = this.wb(a); + return void 0 === a ? !1 : this.tc.contains(a) + }; + J.prototype.findNodeDataForKey = J.prototype.qf = function (a) { + null === a && u.k("Model.findNodeDataForKey:key must not be null"); + return void 0 !== a && Ne(a) ? this.tc.ta(a) : null + }; + u.defineProperty(J, {ah: "nodeDataArray"}, function () { + return this.mf + }, function (a) { + var b = this.mf; + if (b !== a) { + u.Qy(a, J, "nodeDataArray"); + this.tc.clear(); + this.mA(); + for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + if (!u.Sa(e)) { + u.k("Model.nodeDataArray must only contain Objects, not: " + e); + return + } + u.Is(e) + } + this.mf = a; + for (var f = new E(Object), d = 0; d < c; d++) { + var e = u.fb(a, d), h = this.wb(e); + void 0 === h ? f.add(e) : null !== this.tc.ta(h) ? f.add(e) : this.tc.add(h, e) + } + for (d = f.i; d.next();) e = d.value, this.UD(e), f = this.wb(e), void 0 !== f && + this.tc.add(f, e); + Le(this, "nodeDataArray", $d, "nodeDataArray", this, b, a); + for (d = 0; d < c; d++) e = u.fb(a, d), this.$o(e), this.Zo(e); + this.XC(); + u.eH(a) || (this.nb = !0) + } + }); + J.prototype.makeNodeDataKeyUnique = J.prototype.UD = function (a) { + if (null !== a) { + var b = this.Tl; + if ("" !== b) { + var c = this.wb(a); + if (void 0 === c || this.tc.contains(c)) { + var d = this.Eu; + if (null !== d && (c = d(this, a), void 0 !== c && null !== c && !this.tc.contains(c))) { + u.Oa(a, b, c); + return + } + if ("string" === typeof c) { + for (d = 2; this.tc.contains(c + d);) d++; + u.Oa(a, b, c + d) + } else if (void 0 === c || "number" === typeof c) { + for (d = -this.tc.count - 1; this.tc.contains(d);) d--; + u.Oa(a, b, d) + } else u.k("Model.getKeyForNodeData returned something other than a string or a number: " + + c) + } + } + } + }; + J.prototype.addNodeData = J.prototype.km = function (a) { + if (null !== a) { + u.Is(a); + var b = this.wb(a); + if (void 0 === b || this.tc.ta(b) !== a) this.UD(a), b = this.wb(a), void 0 === b ? u.k("Model.makeNodeDataKeyUnique failed on " + a + ". Data not added to Model.") : (this.tc.add(b, a), b = u.qb(this.mf), u.yi(this.mf, b, a), Le(this, "nodeDataArray", be, "nodeDataArray", this, null, a, null, b), this.$o(a), this.Zo(a)) + } + }; + J.prototype.addNodeDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.km(u.fb(a, c)); else for (a = a.i; a.next();) this.km(a.value) + }; + J.prototype.removeNodeData = J.prototype.Vz = function (a) { + if (null !== a) { + var b = this.wb(a); + void 0 !== b && this.tc.contains(b) && (this.tc.remove(b), b = u.Py(this.mf, a), 0 > b || (u.zi(this.mf, b), Le(this, "nodeDataArray", ce, "nodeDataArray", this, a, null, b, null), this.zt(a))) + } + }; + J.prototype.removeNodeDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.Vz(u.fb(a, c)); else for (a = a.i; a.next();) this.Vz(a.value) + }; + g = J.prototype; + g.gt = function (a, b) { + var c = Oe(this, a); + c instanceof F && this.uh.add(b, c) + }; + g.mA = function () { + }; + g.$o = function () { + }; + g.Zo = function () { + }; + g.zt = function () { + }; + + function Pe(a, b, c) { + if (void 0 !== b) { + var d = a.uh.ta(b); + null === d && (d = new F(Object), a.uh.add(b, d)); + d.add(c) + } + } + + function Qe(a, b, c) { + if (void 0 !== b) { + var d = a.uh.ta(b); + d instanceof F && (void 0 === c || null === c ? a.uh.remove(b) : (d.remove(c), 0 === d.count && a.uh.remove(b))) + } + } + + function Oe(a, b) { + if (void 0 === b) return null; + var c = a.uh.ta(b); + return c instanceof F ? c : null + } + + J.prototype.clearUnresolvedReferences = J.prototype.XC = function (a) { + void 0 === a ? this.uh.clear() : this.uh.remove(a) + }; + u.defineProperty(J, {fJ: "copyNodeDataFunction"}, function () { + return this.Xt + }, function (a) { + var b = this.Xt; + b !== a && (null !== a && u.j(a, "function", J, "copyNodeDataFunction"), this.Xt = a, this.h("copyNodeDataFunction", b, a)) + }); + u.defineProperty(J, {Xy: "copiesArrays"}, function () { + return this.ox + }, function (a) { + var b = this.ox; + b !== a && (null !== a && u.j(a, "boolean", J, "copiesArrays"), this.ox = a, this.h("copiesArrays", b, a)) + }); + u.defineProperty(J, {Wy: "copiesArrayObjects"}, function () { + return this.nx + }, function (a) { + var b = this.nx; + b !== a && (null !== a && u.j(a, "boolean", J, "copiesArrayObjects"), this.nx = a, this.h("copiesArrayObjects", b, a)) + }); + J.prototype.copyNodeData = function (a) { + if (null === a) return null; + var b = null, b = this.Xt, b = null !== b ? b(a, this) : Re(this, a, !0); + u.Sa(b) && u.gc(b); + return b + }; + + function Re(a, b, c) { + if (a.Xy && Array.isArray(b)) { + var d = []; + for (c = 0; c < b.length; c++) { + var e = Re(a, b[c], a.Wy); + d.push(e) + } + u.gc(d); + return d + } + if (c && u.Sa(b)) { + c = (c = b.constructor) ? new c : {}; + for (d in b) if ("__gohashid" !== d) { + var e = u.sb(b, d), f; + f = e; + f instanceof S || f instanceof D || f instanceof we || f instanceof Se || f instanceof Te || f instanceof xe || f instanceof sa || f instanceof Je || f instanceof Md || f instanceof Nd ? ("_" !== d[0] && u.trace('Warning: found GraphObject or Diagram reference when copying model data on property "' + + d + '" of data object: ' + b.toString() + " \nModel data should not have any references to a Diagram or any part of a diagram, such as: " + f.toString()), f = !0) : f = f instanceof J || f instanceof ee || f instanceof Ke || f instanceof Zd ? !0 : !1; + f || (e = Re(a, e, !1)); + u.Oa(c, d, e) + } + u.gc(c); + return c + } + return b + } + + var Ue = !1; + J.prototype.setDataProperty = function (a, b, c) { + if (this.Ue(a)) if (b === this.Jm) this.bA(a, c); else { + if (b === this.Im) { + this.Dw(a, c); + return + } + } else !Ue && a instanceof S && (Ue = !0, u.trace('Model.setDataProperty is modifying a GraphObject, "' + a.toString() + '"'), u.trace(" Is that really your intent?")); + var d = u.sb(a, b); + d !== c && (u.Oa(a, b, c), this.Pz(a, b, d, c)) + }; + J.prototype.addArrayItem = function (a, b) { + this.XG(a, -1, b) + }; + J.prototype.insertArrayItem = J.prototype.XG = function (a, b, c) { + a === this.mf && u.k("Model.insertArrayItem or Model.addArrayItem should not be called on the Model.nodeDataArray"); + 0 > b && (b = u.qb(a)); + u.yi(a, b, c); + Le(this, "", be, "", a, null, c, null, b) + }; + J.prototype.removeArrayItem = function (a, b) { + void 0 === b && (b = -1); + a === this.mf && u.k("Model.removeArrayItem should not be called on the Model.nodeDataArray"); + -1 === b && (b = u.qb(a) - 1); + var c = u.fb(a, b); + u.zi(a, b); + Le(this, "", ce, "", a, c, null, b, null) + }; + u.defineProperty(J, {Im: "nodeCategoryProperty"}, function () { + return this.Yq + }, function (a) { + var b = this.Yq; + b !== a && (Me(a, J, "nodeCategoryProperty"), this.Yq = a, this.h("nodeCategoryProperty", b, a)) + }); + J.prototype.getCategoryForNodeData = J.prototype.fz = function (a) { + if (null === a) return ""; + var b = this.Yq; + if ("" === b) return ""; + b = u.sb(a, b); + if (void 0 === b) return ""; + if ("string" === typeof b) return b; + u.k("getCategoryForNodeData found a non-string category for " + a + ": " + b); + return "" + }; + J.prototype.setCategoryForNodeData = J.prototype.Dw = function (a, b) { + u.j(b, "string", J, "setCategoryForNodeData:cat"); + if (null !== a) { + var c = this.Yq; + if ("" !== c) if (this.Ue(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "nodeCategory", $d, c, a, d, b)) + } else u.Oa(a, c, b) + } + }; + + function Q(a, b) { + 2 < arguments.length && u.k("GraphLinksModel constructor can only take two optional arguments, the Array of node data and the Array of link data."); + J.call(this); + this.Bh = []; + this.Rl = new F(Object); + this.ik = this.Wt = null; + this.fj = "from"; + this.ij = "to"; + this.Dq = this.Cq = ""; + this.zq = "category"; + this.Ch = ""; + this.Ou = "isGroup"; + this.pj = "group"; + this.px = !1; + void 0 !== a && (this.ah = a); + void 0 !== b && (this.Qj = b) + } + + u.Ga(Q, J); + u.fa("GraphLinksModel", Q); + Q.prototype.clear = Q.prototype.clear = function () { + J.prototype.clear.call(this); + this.Bh = []; + this.Rl.clear() + }; + g = Q.prototype; + g.toString = function (a) { + void 0 === a && (a = 0); + if (2 <= a) return this.kA(); + var b = ("" !== this.name ? this.name : "") + " GraphLinksModel"; + if (0 < a) { + b += "\n node data:"; + a = this.ah; + for (var c = u.qb(a), d = 0, d = 0; d < c; d++) var e = u.fb(a, d), b = b + (" " + this.wb(e) + ":" + de(e)); + b += "\n link data:"; + a = this.Qj; + c = u.qb(a); + for (d = 0; d < c; d++) e = u.fb(a, d), b += " " + this.$k(e) + "--\x3e" + this.cl(e) + } + return b + }; + g.At = function () { + var a = J.prototype.At.call(this), b = ""; + "category" !== this.Ts && "string" === typeof this.Ts && (b += ',\n "linkCategoryProperty": ' + this.quote(this.Ts)); + "from" !== this.Ko && "string" === typeof this.Ko && (b += ',\n "linkFromKeyProperty": ' + this.quote(this.Ko)); + "to" !== this.Mo && "string" === typeof this.Mo && (b += ',\n "linkToKeyProperty": ' + this.quote(this.Mo)); + "" !== this.Us && "string" === typeof this.Us && (b += ',\n "linkFromPortIdProperty": ' + this.quote(this.Us)); + "" !== this.Ws && "string" === typeof this.Ws && (b += + ',\n "linkToPortIdProperty": ' + this.quote(this.Ws)); + "" !== this.Vs && "string" === typeof this.Vs && (b += ',\n "linkLabelKeysProperty": ' + this.quote(this.Vs)); + "isGroup" !== this.bt && "string" === typeof this.bt && (b += ',\n "nodeIsGroupProperty": ' + this.quote(this.bt)); + "group" !== this.Vo && "string" === typeof this.Vo && (b += ',\n "nodeGroupKeyProperty": ' + this.quote(this.Vo)); + return a + b + }; + g.pA = function () { + var a = J.prototype.pA.call(this), b = ',\n "linkDataArray": ' + pe(this, this.Qj, !0); + return a + b + }; + g.ft = function (a) { + J.prototype.ft.call(this, a); + a.linkFromKeyProperty && (this.Ko = a.linkFromKeyProperty); + a.linkToKeyProperty && (this.Mo = a.linkToKeyProperty); + a.linkFromPortIdProperty && (this.Us = a.linkFromPortIdProperty); + a.linkToPortIdProperty && (this.Ws = a.linkToPortIdProperty); + a.linkCategoryProperty && (this.Ts = a.linkCategoryProperty); + a.linkLabelKeysProperty && (this.Vs = a.linkLabelKeysProperty); + a.nodeIsGroupProperty && (this.bt = a.nodeIsGroupProperty); + a.nodeGroupKeyProperty && (this.Vo = a.nodeGroupKeyProperty) + }; + g.Qz = function (a) { + J.prototype.Qz.call(this, a); + a = a.linkDataArray; + u.isArray(a) && (this.ht(a), this.Qj = a) + }; + g.pm = function (a, b) { + var c = null; + if (a.Ad === be) { + if ("linkDataArray" === a.Lf ? c = this.Bh : "linkLabelKeys" === a.Lf && (c = this.Pj(a.object)), u.isArray(c)) { + b ? u.zi(c, a.xg) : u.yi(c, a.xg, a.newValue); + return + } + } else if (a.Ad === ce && ("linkDataArray" === a.Lf ? c = this.Bh : "linkLabelKeys" === a.Lf && (c = this.Pj(a.object)), u.isArray(c))) { + b ? u.yi(c, a.zg, a.oldValue) : u.zi(c, a.zg); + return + } + J.prototype.pm.call(this, a, b) + }; + u.defineProperty(Q, {Oy: "archetypeNodeData"}, function () { + return this.ik + }, function (a) { + var b = this.ik; + b !== a && (null !== a && u.C(a, Object, Q, "archetypeNodeData"), this.ik = a, this.h("archetypeNodeData", b, a)) + }); + Q.prototype.Gm = function (a) { + if (void 0 !== a) { + var b = this.ik; + if (null !== b) { + var c = this.qf(a); + null === c && (c = this.copyNodeData(b), u.Oa(c, this.Tl, a), this.km(c)) + } + return a + } + }; + u.defineProperty(Q, {Ko: "linkFromKeyProperty"}, function () { + return this.fj + }, function (a) { + var b = this.fj; + b !== a && (Me(a, Q, "linkFromKeyProperty"), this.fj = a, this.h("linkFromKeyProperty", b, a)) + }); + Q.prototype.getFromKeyForLinkData = Q.prototype.$k = function (a) { + if (null !== a) { + var b = this.fj; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("FromKey value for link data " + a + " is not a number or a string: " + b) + } + } + }; + Q.prototype.setFromKeyForLinkData = Q.prototype.Ew = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", Q, "setFromKeyForLinkData:key"); + if (null !== a) { + var c = this.fj; + if ("" !== c) if (b = this.Gm(b), this.Ci(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "linkFromKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Mo: "linkToKeyProperty"}, function () { + return this.ij + }, function (a) { + var b = this.ij; + b !== a && (Me(a, Q, "linkToKeyProperty"), this.ij = a, this.h("linkToKeyProperty", b, a)) + }); + Q.prototype.getToKeyForLinkData = Q.prototype.cl = function (a) { + if (null !== a) { + var b = this.ij; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("ToKey value for link data " + a + " is not a number or a string: " + b) + } + } + }; + Q.prototype.setToKeyForLinkData = Q.prototype.Gw = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", Q, "setToKeyForLinkData:key"); + if (null !== a) { + var c = this.ij; + if ("" !== c) if (b = this.Gm(b), this.Ci(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "linkToKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Us: "linkFromPortIdProperty"}, function () { + return this.Cq + }, function (a) { + var b = this.Cq; + b !== a && (Me(a, Q, "linkFromPortIdProperty"), this.Cq = a, this.h("linkFromPortIdProperty", b, a)) + }); + Q.prototype.getFromPortIdForLinkData = Q.prototype.FG = function (a) { + if (null === a) return ""; + var b = this.Cq; + if ("" === b) return ""; + a = u.sb(a, b); + return void 0 === a ? "" : a + }; + Q.prototype.setFromPortIdForLinkData = Q.prototype.aA = function (a, b) { + u.j(b, "string", Q, "setFromPortIdForLinkData:portname"); + if (null !== a) { + var c = this.Cq; + if ("" !== c) if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "linkFromPortId", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Ws: "linkToPortIdProperty"}, function () { + return this.Dq + }, function (a) { + var b = this.Dq; + b !== a && (Me(a, Q, "linkToPortIdProperty"), this.Dq = a, this.h("linkToPortIdProperty", b, a)) + }); + Q.prototype.getToPortIdForLinkData = Q.prototype.IG = function (a) { + if (null === a) return ""; + var b = this.Dq; + if ("" === b) return ""; + a = u.sb(a, b); + return void 0 === a ? "" : a + }; + Q.prototype.setToPortIdForLinkData = Q.prototype.eA = function (a, b) { + u.j(b, "string", Q, "setToPortIdForLinkData:portname"); + if (null !== a) { + var c = this.Dq; + if ("" !== c) if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "linkToPortId", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(Q, {Vs: "linkLabelKeysProperty"}, function () { + return this.Ch + }, function (a) { + var b = this.Ch; + b !== a && (Me(a, Q, "linkLabelKeysProperty"), this.Ch = a, this.h("linkLabelKeysProperty", b, a)) + }); + Q.prototype.getLabelKeysForLinkData = Q.prototype.Pj = function (a) { + if (null === a) return u.mh; + var b = this.Ch; + if ("" === b) return u.mh; + a = u.sb(a, b); + return void 0 === a ? u.mh : a + }; + Q.prototype.setLabelKeysForLinkData = Q.prototype.FE = function (a, b) { + u.Qy(b, Q, "setLabelKeysForLinkData:arr"); + if (null !== a) { + var c = this.Ch; + if ("" !== c) if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = u.mh); + if (d !== b) { + for (var e = u.qb(d), f = 0; f < e; f++) { + var h = u.fb(d, f); + Qe(this, h, a) + } + u.Oa(a, c, b); + e = u.qb(b); + for (f = 0; f < e; f++) h = u.fb(b, f), null === this.qf(h) && Pe(this, h, a); + Le(this, "linkLabelKeys", $d, c, a, d, b); + "string" === typeof c && this.Nb(a, c) + } + } else u.Oa(a, c, b) + } + }; + Q.prototype.addLabelKeyForLinkData = Q.prototype.Ly = function (a, b) { + if (null !== b && void 0 !== b && (Ne(b) || u.Kd(b, "number or string", Q, "addLabelKeyForLinkData:key"), null !== a)) { + var c = this.Ch; + if ("" !== c) { + var d = u.sb(a, c); + void 0 === d ? (c = [], c.push(b), this.FE(a, c)) : u.isArray(d) ? 0 <= u.Py(d, b) || (u.yi(d, Infinity, b), this.Ci(a) && (null === this.qf(b) && Pe(this, b, a), Le(this, "linkLabelKeys", be, c, a, null, b))) : u.k(c + " property is not an Array; cannot addLabelKeyForLinkData: " + a) + } + } + }; + Q.prototype.removeLabelKeyForLinkData = Q.prototype.mE = function (a, b) { + if (null !== b && void 0 !== b && (Ne(b) || u.Kd(b, "number or string", Q, "removeLabelKeyForLinkData:key"), null !== a)) { + var c = this.Ch; + if ("" !== c) { + var d = u.sb(a, c); + if (u.isArray(d)) { + var e = u.Py(d, b); + 0 > e || (u.zi(d, e), this.Ci(a) && (Qe(this, b, a), Le(this, "linkLabelKeys", ce, c, a, b, null))) + } else void 0 !== d && u.k(c + " property is not an Array; cannot removeLabelKeyforLinkData: " + a) + } + } + }; + u.defineProperty(Q, {Qj: "linkDataArray"}, function () { + return this.Bh + }, function (a) { + var b = this.Bh; + if (b !== a) { + u.Qy(a, Q, "linkDataArray"); + for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + if (!u.Sa(e)) { + u.k("GraphLinksModel.linkDataArray must only contain Objects, not: " + e); + return + } + u.Is(e) + } + this.Bh = a; + for (var f = new F(Object), d = 0; d < c; d++) e = u.fb(a, d), f.add(e); + this.Rl = f; + Le(this, "linkDataArray", $d, "linkDataArray", this, b, a); + for (d = 0; d < c; d++) e = u.fb(a, d), af(this, e) + } + }); + Q.prototype.containsLinkData = Q.prototype.Ci = function (a) { + return null === a ? !1 : this.Rl.contains(a) + }; + Q.prototype.addLinkData = Q.prototype.xv = function (a) { + if (null !== a) { + if (void 0 === u.Uc(a)) u.gc(a); else if (this.Ci(a)) return; + this.Rl.add(a); + var b = u.qb(this.Bh); + u.yi(this.Bh, b, a); + Le(this, "linkDataArray", be, "linkDataArray", this, null, a, null, b); + af(this, a) + } + }; + Q.prototype.addLinkDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.xv(u.fb(a, c)); else for (a = a.i; a.next();) this.xv(a.value) + }; + Q.prototype.removeLinkData = Q.prototype.Uz = function (a) { + if (null !== a) { + this.Rl.remove(a); + var b = this.Bh.indexOf(a); + if (!(0 > b)) { + u.zi(this.Bh, b); + Le(this, "linkDataArray", ce, "linkDataArray", this, a, null, b, null); + b = this.$k(a); + Qe(this, b, a); + b = this.cl(a); + Qe(this, b, a); + var c = this.Pj(a); + if (u.isArray(c)) for (var d = u.qb(c), e = 0; e < d; e++) b = u.fb(c, e), Qe(this, b, a) + } + } + }; + Q.prototype.removeLinkDataCollection = function (a) { + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) this.Uz(u.fb(a, c)); else for (a = a.i; a.next();) this.Uz(a.value) + }; + + function af(a, b) { + var c = a.$k(b), c = a.Gm(c); + null === a.qf(c) && Pe(a, c, b); + c = a.cl(b); + c = a.Gm(c); + null === a.qf(c) && Pe(a, c, b); + var d = a.Pj(b); + if (u.isArray(d)) for (var e = u.qb(d), f = 0; f < e; f++) c = u.fb(d, f), null === a.qf(c) && Pe(a, c, b) + } + + u.defineProperty(Q, {eJ: "copyLinkDataFunction"}, function () { + return this.Wt + }, function (a) { + var b = this.Wt; + b !== a && (null !== a && u.j(a, "function", Q, "copyLinkDataFunction"), this.Wt = a, this.h("copyLinkDataFunction", b, a)) + }); + Q.prototype.copyLinkData = Q.prototype.eD = function (a) { + if (null === a) return null; + var b = null, b = this.Wt; + if (null !== b) b = b(a, this); else { + var b = new a.constructor, c; + for (c in a) if ("__gohashid" !== c) { + var d = u.sb(a, c); + u.Oa(b, c, d) + } + } + null !== b && (u.gc(b), "" !== this.fj && u.Oa(b, this.fj, void 0), "" !== this.ij && u.Oa(b, this.ij, void 0), "" !== this.Ch && u.Oa(b, this.Ch, [])); + return b + }; + u.defineProperty(Q, {bt: "nodeIsGroupProperty"}, function () { + return this.Ou + }, function (a) { + var b = this.Ou; + b !== a && (Me(a, Q, "nodeIsGroupProperty"), this.Ou = a, this.h("nodeIsGroupProperty", b, a)) + }); + Q.prototype.isGroupForNodeData = Q.prototype.sz = function (a) { + if (null === a) return !1; + var b = this.Ou; + return "" === b ? !1 : u.sb(a, b) ? !0 : !1 + }; + u.defineProperty(Q, {Vo: "nodeGroupKeyProperty"}, function () { + return this.pj + }, function (a) { + var b = this.pj; + b !== a && (Me(a, Q, "nodeGroupKeyProperty"), this.pj = a, this.h("nodeGroupKeyProperty", b, a)) + }); + u.defineProperty(Q, {tm: "copiesGroupKeyOfNodeData"}, function () { + return this.px + }, function (a) { + this.px !== a && (u.j(a, "boolean", Q, "copiesGroupKeyOfNodeData"), this.px = a) + }); + Q.prototype.getGroupKeyForNodeData = Q.prototype.Bm = function (a) { + if (null !== a) { + var b = this.pj; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("GroupKey value for node data " + a + " is not a number or a string: " + b) + } + } + }; + Q.prototype.setGroupKeyForNodeData = Q.prototype.Fw = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", Q, "setGroupKeyForNodeData:key"); + if (null !== a) { + var c = this.pj; + if ("" !== c) if (this.Ue(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "nodeGroupKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + Q.prototype.copyNodeData = function (a) { + if (null === a) return null; + a = J.prototype.copyNodeData.call(this, a); + this.tm || "" === this.pj || u.Oa(a, this.pj, void 0); + return a + }; + Q.prototype.setDataProperty = function (a, b, c) { + if (this.Ue(a)) if (b === this.Jm) this.bA(a, c); else { + if (b === this.Im) { + this.Dw(a, c); + return + } + if (b === this.Vo) { + this.Fw(a, c); + return + } + b === this.bt && u.k("GraphLinksModel.setDataProperty: property name must not be the nodeIsGroupProperty: " + b) + } else if (this.Ci(a)) { + if (b === this.Ko) { + this.Ew(a, c); + return + } + if (b === this.Mo) { + this.Gw(a, c); + return + } + if (b === this.Us) { + this.aA(a, c); + return + } + if (b === this.Ws) { + this.eA(a, c); + return + } + if (b === this.Ts) { + this.EE(a, c); + return + } + if (b === this.Vs) { + this.FE(a, c); + return + } + } else !Ue && + a instanceof S && (Ue = !0, u.trace('GraphLinksModel.setDataProperty is modifying a GraphObject, "' + a.toString() + '"'), u.trace(" Is that really your intent?")); + var d = u.sb(a, b); + d !== c && (u.Oa(a, b, c), this.Pz(a, b, d, c)) + }; + g = Q.prototype; + g.gt = function (a, b) { + J.prototype.gt.call(this, a, b); + for (var c = this.tc.i; c.next();) this.Xz(c.value, a, b); + for (var d = this.Rl.i; d.next();) { + var e = c.value, f = a, h = b; + if (this.$k(e) === f) { + var k = this.fj; + u.Oa(e, k, h); + Le(this, "linkFromKey", $d, k, e, f, h); + "string" === typeof k && this.Nb(e, k) + } + this.cl(e) === f && (k = this.ij, u.Oa(e, k, h), Le(this, "linkToKey", $d, k, e, f, h), "string" === typeof k && this.Nb(e, k)); + var l = this.Pj(e); + if (u.isArray(l)) for (var m = u.qb(l), k = this.Ch, n = 0; n < m; n++) u.fb(l, n) === f && (u.RC(l, n, h), Le(this, "linkLabelKeys", be, k, + e, f, h)) + } + }; + g.Xz = function (a, b, c) { + if (this.Bm(a) === b) { + var d = this.pj; + u.Oa(a, d, c); + Le(this, "nodeGroupKey", $d, d, a, b, c); + "string" === typeof d && this.Nb(a, d) + } + }; + g.mA = function () { + J.prototype.mA.call(this); + for (var a = this.Qj, b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + af(this, d) + } + }; + g.$o = function (a) { + J.prototype.$o.call(this, a); + a = this.wb(a); + var b = Oe(this, a); + if (null !== b) { + for (var c = new E(Object), b = b.i; b.next();) { + var d = b.value; + if (this.Ue(d)) { + if (this.Bm(d) === a) { + var e = this.pj; + Le(this, "nodeGroupKey", $d, e, d, a, a); + "string" === typeof e && this.Nb(d, e); + c.add(d) + } + } else { + this.$k(d) === a && (e = this.fj, Le(this, "linkFromKey", $d, e, d, a, a), "string" === typeof e && this.Nb(d, e), c.add(d)); + this.cl(d) === a && (e = this.ij, Le(this, "linkToKey", $d, e, d, a, a), "string" === typeof e && this.Nb(d, e), c.add(d)); + var f = this.Pj(d); + if (u.isArray(f)) for (var h = + u.qb(f), e = this.Ch, k = 0; k < h; k++) u.fb(f, k) === a && (Le(this, "linkLabelKeys", be, e, d, a, a), c.add(d)) + } + } + for (c = c.i; c.next();) Qe(this, a, c.value) + } + }; + g.Zo = function (a) { + J.prototype.Zo.call(this, a); + var b = this.Bm(a); + null === this.qf(b) && Pe(this, b, a) + }; + g.zt = function (a) { + J.prototype.zt.call(this, a); + var b = this.Bm(a); + Qe(this, b, a) + }; + u.defineProperty(Q, {Ts: "linkCategoryProperty"}, function () { + return this.zq + }, function (a) { + var b = this.zq; + b !== a && (Me(a, Q, "linkCategoryProperty"), this.zq = a, this.h("linkCategoryProperty", b, a)) + }); + Q.prototype.getCategoryForLinkData = Q.prototype.Zv = function (a) { + if (null === a) return ""; + var b = this.zq; + if ("" === b) return ""; + b = u.sb(a, b); + if (void 0 === b) return ""; + if ("string" === typeof b) return b; + u.k("getCategoryForLinkData found a non-string category for " + a + ": " + b); + return "" + }; + Q.prototype.setCategoryForLinkData = Q.prototype.EE = function (a, b) { + u.j(b, "string", Q, "setCategoryForLinkData:cat"); + if (null !== a) { + var c = this.zq; + if ("" === c) return ""; + if (this.Ci(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "linkCategory", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + + function qe(a) { + 1 < arguments.length && u.k("TreeModel constructor can only take one optional argument, the Array of node data."); + J.call(this); + this.qj = "parent"; + this.qx = !1; + this.er = "parentLinkCategory"; + void 0 !== a && (this.ah = a) + } + + u.Ga(qe, J); + u.fa("TreeModel", qe); + qe.prototype.toString = function (a) { + void 0 === a && (a = 0); + if (2 <= a) return this.kA(); + var b = ("" !== this.name ? this.name : "") + " TreeModel"; + if (0 < a) { + b += "\n node data:"; + a = this.ah; + for (var c = u.qb(a), d = 0; d < c; d++) var e = u.fb(a, d), b = b + (" " + this.wb(e) + ":" + de(e)) + } + return b + }; + qe.prototype.At = function () { + var a = J.prototype.At.call(this), b = ""; + "parent" !== this.Wo && "string" === typeof this.Wo && (b += ',\n "nodeParentKeyProperty": ' + this.quote(this.Wo)); + return a + b + }; + qe.prototype.ft = function (a) { + J.prototype.ft.call(this, a); + a.nodeParentKeyProperty && (this.Wo = a.nodeParentKeyProperty) + }; + qe.prototype.Gm = function (a) { + return a + }; + u.defineProperty(qe, {Wo: "nodeParentKeyProperty"}, function () { + return this.qj + }, function (a) { + var b = this.qj; + b !== a && (Me(a, qe, "nodeParentKeyProperty"), this.qj = a, this.h("nodeParentKeyProperty", b, a)) + }); + u.defineProperty(qe, {um: "copiesParentKeyOfNodeData"}, function () { + return this.qx + }, function (a) { + this.qx !== a && (u.j(a, "boolean", qe, "copiesParentKeyOfNodeData"), this.qx = a) + }); + qe.prototype.getParentKeyForNodeData = qe.prototype.Cm = function (a) { + if (null !== a) { + var b = this.qj; + if ("" !== b && (b = u.sb(a, b), void 0 !== b)) { + if (Ne(b)) return b; + u.k("ParentKey value for node data " + a + " is not a number or a string: " + b) + } + } + }; + qe.prototype.setParentKeyForNodeData = qe.prototype.ih = function (a, b) { + null === b && (b = void 0); + void 0 === b || Ne(b) || u.Kd(b, "number or string", qe, "setParentKeyForNodeData:key"); + if (null !== a) { + var c = this.qj; + if ("" !== c) if (b = this.Gm(b), this.Ue(a)) { + var d = u.sb(a, c); + d !== b && (Qe(this, d, a), u.Oa(a, c, b), null === this.qf(b) && Pe(this, b, a), Le(this, "nodeParentKey", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + u.defineProperty(qe, {lK: "parentLinkCategoryProperty"}, function () { + return this.er + }, function (a) { + var b = this.er; + b !== a && (Me(a, qe, "parentLinkCategoryProperty"), this.er = a, this.h("parentLinkCategoryProperty", b, a)) + }); + qe.prototype.getParentLinkCategoryForNodeData = qe.prototype.HG = function (a) { + if (null === a) return ""; + var b = this.er; + if ("" === b) return ""; + b = u.sb(a, b); + if (void 0 === b) return ""; + if ("string" === typeof b) return b; + u.k("getParentLinkCategoryForNodeData found a non-string category for " + a + ": " + b); + return "" + }; + qe.prototype.setParentLinkCategoryForNodeData = qe.prototype.hI = function (a, b) { + u.j(b, "string", qe, "setParentLinkCategoryForNodeData:cat"); + if (null !== a) { + var c = this.er; + if ("" === c) return ""; + if (this.Ue(a)) { + var d = u.sb(a, c); + void 0 === d && (d = ""); + d !== b && (u.Oa(a, c, b), Le(this, "parentLinkCategory", $d, c, a, d, b), "string" === typeof c && this.Nb(a, c)) + } else u.Oa(a, c, b) + } + }; + qe.prototype.copyNodeData = function (a) { + if (null === a) return null; + a = J.prototype.copyNodeData.call(this, a); + this.um || "" === this.qj || u.Oa(a, this.qj, void 0); + return a + }; + qe.prototype.setDataProperty = function (a, b, c) { + if (this.Ue(a)) if (b === this.Jm) this.bA(a, c); else { + if (b === this.Im) { + this.Dw(a, c); + return + } + if (b === this.Wo) { + this.ih(a, c); + return + } + } else !Ue && a instanceof S && (Ue = !0, u.trace('TreeModel.setDataProperty is modifying a GraphObject, "' + a.toString() + '"'), u.trace(" Is that really your intent?")); + var d = u.sb(a, b); + d !== c && (u.Oa(a, b, c), this.Pz(a, b, d, c)) + }; + g = qe.prototype; + g.gt = function (a, b) { + J.prototype.gt.call(this, a, b); + for (var c = this.tc.i; c.next();) this.Xz(c.value, a, b) + }; + g.Xz = function (a, b, c) { + if (this.Cm(a) === b) { + var d = this.qj; + u.Oa(a, d, c); + Le(this, "nodeParentKey", $d, d, a, b, c); + "string" === typeof d && this.Nb(a, d) + } + }; + g.$o = function (a) { + J.prototype.$o.call(this, a); + a = this.wb(a); + var b = Oe(this, a); + if (null !== b) { + for (var c = new E(Object), b = b.i; b.next();) { + var d = b.value; + if (this.Ue(d) && this.Cm(d) === a) { + var e = this.qj; + Le(this, "nodeParentKey", $d, e, d, a, a); + "string" === typeof e && this.Nb(d, e); + c.add(d) + } + } + for (c = c.i; c.next();) Qe(this, a, c.value) + } + }; + g.Zo = function (a) { + J.prototype.Zo.call(this, a); + var b = this.Cm(a), b = this.Gm(b); + null === this.qf(b) && Pe(this, b, a) + }; + g.zt = function (a) { + J.prototype.zt.call(this, a); + var b = this.Cm(a); + Qe(this, b, a) + }; + + function bf(a, b, c) { + u.gc(this); + this.Ca = !1; + void 0 === a ? a = "" : u.j(a, "string", bf, "constructor:targetprop"); + void 0 === b ? b = a : u.j(b, "string", bf, "constructor:sourceprop"); + void 0 === c ? c = null : null !== c && u.j(c, "function", bf, "constructor:conv"); + this.mC = -1; + this.fg = null; + this.ov = a; + this.mv = this.Ay = 0; + this.hC = null; + this.Ey = !1; + this.fv = b; + this.mx = c; + this.ey = cf; + this.gx = null + } + + u.fa("Binding", bf); + var cf; + bf.OneWay = cf = u.s(bf, "OneWay", 1); + var df; + bf.TwoWay = df = u.s(bf, "TwoWay", 2); + bf.parseEnum = function (a, b) { + u.j(a, "function", bf, "parseEnum:ctor"); + u.rb(b, a, bf, "parseEnum:defval"); + return function (c) { + c = Da(a, c); + return null === c ? b : c + } + }; + var de; + bf.toString = de = function (a) { + var b = a; + u.Sa(a) && (a.text ? b = a.text : a.name ? b = a.name : void 0 !== a.key ? b = a.key : void 0 !== a.id ? b = a.id : a.constructor === Object && (a.Text ? b = a.Text : a.Name ? b = a.Name : void 0 !== a.Key ? b = a.Key : void 0 !== a.Id ? b = a.Id : void 0 !== a.ID && (b = a.ID))); + return void 0 === b ? "undefined" : null === b ? "null" : b.toString() + }; + bf.prototype.toString = function () { + return "Binding(" + this.Lw + ":" + this.LE + (-1 !== this.tl ? " " + this.tl : "") + " " + this.mode.name + ")" + }; + bf.prototype.freeze = function () { + this.Ca = !0; + return this + }; + bf.prototype.La = function () { + this.Ca = !1; + return this + }; + u.defineProperty(bf, {tl: null}, function () { + return this.mC + }, function (a) { + u.I(this); + u.j(a, "number", bf, "targetId"); + this.mC = a + }); + u.defineProperty(bf, {Lw: "targetProperty"}, function () { + return this.ov + }, function (a) { + u.I(this); + u.j(a, "string", bf, "targetProperty"); + this.ov = a + }); + u.defineProperty(bf, {Nm: "sourceName"}, function () { + return this.hC + }, function (a) { + u.I(this); + null !== a && u.j(a, "string", bf, "sourceName"); + this.hC = a; + null !== a && (this.Ey = !1) + }); + u.defineProperty(bf, {xt: "toModel"}, function () { + return this.Ey + }, function (a) { + u.I(this); + u.j(a, "boolean", bf, "toModel"); + this.Ey = a + }); + u.defineProperty(bf, {LE: "sourceProperty"}, function () { + return this.fv + }, function (a) { + u.I(this); + u.j(a, "string", bf, "sourceProperty"); + this.fv = a + }); + u.defineProperty(bf, {eG: "converter"}, function () { + return this.mx + }, function (a) { + u.I(this); + null !== a && u.j(a, "function", bf, "converter"); + this.mx = a + }); + u.defineProperty(bf, {SF: "backConverter"}, function () { + return this.gx + }, function (a) { + u.I(this); + null !== a && u.j(a, "function", bf, "backConverter"); + this.gx = a + }); + u.defineProperty(bf, {mode: "mode"}, function () { + return this.ey + }, function (a) { + u.I(this); + u.rb(a, bf, bf, "mode"); + this.ey = a + }); + bf.prototype.makeTwoWay = function (a) { + void 0 === a && (a = null); + null !== a && u.j(a, "function", bf, "makeTwoWay"); + this.mode = df; + this.SF = a; + return this + }; + bf.prototype.ofObject = bf.prototype.rw = function (a) { + void 0 === a && (a = ""); + this.Nm = a; + this.xt = !1; + return this + }; + bf.prototype.ofModel = function () { + this.Nm = null; + this.xt = !0; + return this + }; + bf.prototype.ofData = function () { + this.Nm = null; + this.xt = !1; + return this + }; + + function ef(a, b, c) { + a = a.Nm; + var d = null; + return d = null === a || "" === a ? b : "." === a ? c : ".." === a ? c.S : b.je(a) + } + + bf.prototype.updateTarget = bf.prototype.ZE = function (a, b, c) { + var d = this.fv; + if (void 0 === c || d === c) { + c = this.ov; + var e = this.mx; + if (null === e && "" === c) u.trace("Binding error: target property is the empty string: " + this.toString()); else { + var f = b; + "" !== d && (f = u.sb(b, d)); + if (void 0 !== f) if (null === e) "" !== c && u.Oa(a, c, f); else try { + if ("" !== c) { + var h = e(f, a); + u.Oa(a, c, h) + } else e(f, a) + } catch (k) { + } + } + } + }; + bf.prototype.updateSource = bf.prototype.Mw = function (a, b, c, d) { + void 0 === d && (d = null); + if (this.ey === df) { + var e = this.ov; + if (void 0 === c || e === c) { + c = this.fv; + var f = this.gx; + if (null !== f || "" !== c) { + var h = a; + "" !== e && (h = u.sb(a, e)); + if (void 0 !== h) if (null === f) null !== d && d.ga ? d.ga.setDataProperty(b, c, h) : u.Oa(b, c, h); else try { + if ("" !== c) { + var k = f(h, b); + null !== d && d.ga ? d.ga.setDataProperty(b, c, k) : u.Oa(b, c, k) + } else f(h, b) + } catch (l) { + } + } + } + } + }; + + function Ke() { + this.mF = (new E(Zd)).freeze(); + this.Ub = ""; + this.nB = !1 + } + + u.fa("Transaction", Ke); + Ke.prototype.toString = function (a) { + var b = "Transaction: " + this.name + " " + this.Ug.count.toString() + (this.Ms ? "" : ", incomplete"); + if (void 0 !== a && 0 < a) { + a = this.Ug.count; + for (var c = 0; c < a; c++) { + var d = this.Ug.ja(c); + null !== d && (b += "\n " + d.toString()) + } + } + return b + }; + Ke.prototype.clear = Ke.prototype.clear = function () { + var a = this.Ug; + a.La(); + for (var b = a.count - 1; 0 <= b; b--) { + var c = a.ja(b); + null !== c && c.clear() + } + a.clear(); + a.freeze() + }; + Ke.prototype.canUndo = Ke.prototype.canUndo = function () { + return this.Ms + }; + Ke.prototype.undo = Ke.prototype.undo = function () { + if (this.canUndo()) for (var a = this.Ug.count - 1; 0 <= a; a--) { + var b = this.Ug.ja(a); + null !== b && b.undo() + } + }; + Ke.prototype.canRedo = Ke.prototype.canRedo = function () { + return this.Ms + }; + Ke.prototype.redo = Ke.prototype.redo = function () { + if (this.canRedo()) for (var a = this.Ug.count, b = 0; b < a; b++) { + var c = this.Ug.ja(b); + null !== c && c.redo() + } + }; + u.u(Ke, {Ug: "changes"}, function () { + return this.mF + }); + u.defineProperty(Ke, {name: "name"}, function () { + return this.Ub + }, function (a) { + this.Ub = a + }); + u.defineProperty(Ke, {Ms: "isComplete"}, function () { + return this.nB + }, function (a) { + this.nB = a + }); + + function ee() { + this.hy = new F(J); + this.Ne = !1; + this.tF = (new E(Ke)).freeze(); + this.Ig = -1; + this.CB = 999; + this.fi = !1; + this.bu = null; + this.Jk = 0; + this.GA = !1; + this.Og = (new E("string")).freeze(); + this.Qn = new E("number"); + this.Kx = !0; + this.Yx = !1 + } + + u.fa("UndoManager", ee); + ee.prototype.toString = function (a) { + for (var b = "UndoManager " + this.Ii + "<" + this.history.count + "<=" + this.VD, b = b + "[", c = this.bE.count, d = 0; d < c; d++) 0 < d && (b += " "), b += this.bE.ja(d); + b += "]"; + if (void 0 !== a && 0 < a) for (c = this.history.count, d = 0; d < c; d++) b += "\n " + this.history.ja(d).toString(a - 1); + return b + }; + ee.prototype.clear = ee.prototype.clear = function () { + var a = this.history; + a.La(); + for (var b = a.count - 1; 0 <= b; b--) { + var c = a.ja(b); + null !== c && c.clear() + } + a.clear(); + this.Ig = -1; + a.freeze(); + this.fi = !1; + this.bu = null; + this.Jk = 0; + this.Og.La(); + this.Og.clear(); + this.Og.freeze(); + this.Qn.clear() + }; + ee.prototype.addModel = ee.prototype.MF = function (a) { + this.hy.add(a) + }; + ee.prototype.removeModel = ee.prototype.SH = function (a) { + this.hy.remove(a) + }; + ee.prototype.startTransaction = ee.prototype.Wb = function (a) { + void 0 === a && (a = ""); + null === a && (a = ""); + if (this.gb) return !1; + !0 === this.Kx && (this.Kx = !1, this.Jk++, this.Rc("StartingFirstTransaction", a, this.Di), 0 < this.Jk && this.Jk--); + this.isEnabled && (this.Og.La(), this.Og.add(a), this.Og.freeze(), null === this.Di ? this.Qn.add(0) : this.Qn.add(this.Di.Ug.count)); + this.Jk++; + var b = 1 === this.Le; + b && this.Rc("StartedTransaction", a, this.Di); + return b + }; + ee.prototype.commitTransaction = ee.prototype.Wd = function (a) { + void 0 === a && (a = ""); + return ff(this, !0, a) + }; + ee.prototype.rollbackTransaction = ee.prototype.ap = function () { + return ff(this, !1, "") + }; + + function ff(a, b, c) { + if (a.gb) return !1; + a.Ry && 1 > a.Le && u.trace("Ending transaction without having started a transaction: " + c); + var d = 1 === a.Le; + d && b && a.isEnabled && a.Rc("CommittingTransaction", c, a.Di); + var e = 0; + if (0 < a.Le && (a.Jk--, a.isEnabled)) { + var f = a.Og.count; + 0 < f && ("" === c && (c = a.Og.ja(0)), a.Og.La(), a.Og.hd(f - 1), a.Og.freeze()); + f = a.Qn.count; + 0 < f && (e = a.Qn.ja(f - 1), a.Qn.hd(f - 1)) + } + f = a.Di; + if (d) { + if (b) { + a.Yx = !1; + if (a.isEnabled && null !== f) { + b = f; + b.Ms = !0; + b.name = c; + d = a.history; + d.La(); + for (e = d.count - 1; e > a.Ii; e--) f = d.ja(e), null !== + f && f.clear(), d.hd(e), a.Yx = !0; + e = a.VD; + 0 === e && (e = 1); + 0 < e && d.count >= e && (f = d.ja(0), null !== f && f.clear(), d.hd(0), a.Ig--); + d.add(b); + a.Ig++; + d.freeze(); + f = b + } + a.Rc("CommittedTransaction", c, f) + } else { + a.fi = !0; + try { + a.isEnabled && null !== f && (f.Ms = !0, f.undo()) + } finally { + a.Rc("RolledBackTransaction", c, f), a.fi = !1 + } + null !== f && f.clear() + } + a.bu = null; + return !0 + } + if (a.isEnabled && !b && null !== f) { + a = e; + c = f.Ug; + for (b = c.count - 1; b >= a; b--) d = c.ja(b), null !== d && d.undo(), c.La(), c.hd(b); + c.freeze() + } + return !1 + } + + ee.prototype.canUndo = ee.prototype.canUndo = function () { + if (!this.isEnabled || 0 < this.Le || this.gb) return !1; + var a = this.UE; + return null !== a && a.canUndo() ? !0 : !1 + }; + ee.prototype.undo = ee.prototype.undo = function () { + if (this.canUndo()) { + var a = this.UE; + try { + this.Rc("StartingUndo", "Undo", a), this.fi = !0, this.Ig--, a.undo() + } catch (b) { + u.trace("undo error: " + b.toString()) + } finally { + this.fi = !1, this.Rc("FinishedUndo", "Undo", a) + } + } + }; + ee.prototype.canRedo = ee.prototype.canRedo = function () { + if (!this.isEnabled || 0 < this.Le || this.gb) return !1; + var a = this.TE; + return null !== a && a.canRedo() ? !0 : !1 + }; + ee.prototype.redo = ee.prototype.redo = function () { + if (this.canRedo()) { + var a = this.TE; + try { + this.Rc("StartingRedo", "Redo", a), this.fi = !0, this.Ig++, a.redo() + } catch (b) { + u.trace("redo error: " + b.toString()) + } finally { + this.fi = !1, this.Rc("FinishedRedo", "Redo", a) + } + } + }; + ee.prototype.Rc = function (a, b, c) { + void 0 === c && (c = null); + var d = new Zd; + d.Ad = ae; + d.propertyName = a; + d.object = c; + d.oldValue = b; + for (a = this.BH; a.next();) b = a.value, d.ga = b, b.Jv(d) + }; + ee.prototype.handleChanged = ee.prototype.ED = function (a) { + if (this.isEnabled && !this.gb && !this.skipsEvent(a)) { + var b = this.Di; + null === b && (this.bu = b = new Ke); + var c = a.copy(), b = b.Ug; + b.La(); + b.add(c); + b.freeze(); + this.Ry && 0 >= this.Le && !this.Kx && (a = a.g, null !== a && !1 === a.lf || u.trace("Change not within a transaction: " + c.toString())) + } + }; + ee.prototype.skipsEvent = function (a) { + if (null === a || 0 > a.Ad.value) return !0; + a = a.object; + if (a instanceof S) { + if (a = a.layer, null !== a && a.Ac) return !0 + } else if (a instanceof we && a.Ac) return !0; + return !1 + }; + u.u(ee, {BH: "models"}, function () { + return this.hy.i + }); + u.defineProperty(ee, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + this.Ne = a + }); + u.u(ee, {UE: "transactionToUndo"}, function () { + return 0 <= this.Ii && this.Ii <= this.history.count - 1 ? this.history.ja(this.Ii) : null + }); + u.u(ee, {TE: "transactionToRedo"}, function () { + return this.Ii < this.history.count - 1 ? this.history.ja(this.Ii + 1) : null + }); + u.u(ee, {gb: "isUndoingRedoing"}, function () { + return this.fi + }); + u.u(ee, {history: "history"}, function () { + return this.tF + }); + u.defineProperty(ee, {VD: "maxHistoryLength"}, function () { + return this.CB + }, function (a) { + this.CB = a + }); + u.u(ee, {Ii: "historyIndex"}, function () { + return this.Ig + }); + u.u(ee, {Di: "currentTransaction"}, function () { + return this.bu + }); + u.u(ee, {Le: "transactionLevel"}, function () { + return this.Jk + }); + u.u(ee, {ND: "isInTransaction"}, function () { + return 0 < this.Jk + }); + u.defineProperty(ee, {Ry: "checksTransactionLevel"}, function () { + return this.GA + }, function (a) { + this.GA = a + }); + u.u(ee, {bE: "nestedTransactionNames"}, function () { + return this.Og + }); + + function sa() { + 0 < arguments.length && u.Wc(sa); + u.gc(this); + this.Y = null; + this.JA = !0; + this.LA = this.MA = this.XA = this.NA = !1; + this.Ak = this.ax = null; + this.EC = 1.05; + this.VA = 1; + this.Zx = NaN; + this.zB = null; + this.FC = NaN + } + + u.fa("CommandHandler", sa); + var gf = null, hf = ""; + sa.prototype.toString = function () { + return "CommandHandler" + }; + u.u(sa, {g: "diagram"}, function () { + return this.Y + }); + sa.prototype.Ec = function (a) { + this.Y = a + }; + sa.prototype.doKeyDown = function () { + var a = this.g; + if (null !== a) { + var b = a.N, c = u.Em ? b.Ys : b.control, d = b.shift, e = b.alt, f = b.key; + !c || "C" !== f && "Insert" !== f ? c && "X" === f || d && "Del" === f ? this.canCutSelection() && this.cutSelection() : c && "V" === f || d && "Insert" === f ? this.canPasteSelection() && this.pasteSelection() : c && "Y" === f || e && d && "Backspace" === f ? this.canRedo() && this.redo() : c && "Z" === f || e && "Backspace" === f ? this.canUndo() && this.undo() : "Del" === f || "Backspace" === f ? this.canDeleteSelection() && this.deleteSelection() : c && "A" === f ? this.canSelectAll() && + this.selectAll() : "Esc" === f ? this.canStopCommand() && this.stopCommand() : "Up" === f ? a.Se && (c ? a.scroll("pixel", "up") : a.scroll("line", "up")) : "Down" === f ? a.Se && (c ? a.scroll("pixel", "down") : a.scroll("line", "down")) : "Left" === f ? a.Re && (c ? a.scroll("pixel", "left") : a.scroll("line", "left")) : "Right" === f ? a.Re && (c ? a.scroll("pixel", "right") : a.scroll("line", "right")) : "PageUp" === f ? d && a.Re ? a.scroll("page", "left") : a.Se && a.scroll("page", "up") : "PageDown" === f ? d && a.Re ? a.scroll("page", "right") : a.Se && a.scroll("page", "down") : "Home" === + f ? (b = a.Cd, c && a.Se ? a.position = new w(a.position.x, b.y) : !c && a.Re && (a.position = new w(b.x, a.position.y))) : "End" === f ? (b = a.Cd, d = a.ob, c && a.Se ? a.position = new w(d.x, b.bottom - d.height) : !c && a.Re && (a.position = new w(b.right - d.width, d.y))) : "Subtract" === f ? this.canDecreaseZoom() && this.decreaseZoom() : "Add" === f ? this.canIncreaseZoom() && this.increaseZoom() : c && "0" === f ? this.canResetZoom() && this.resetZoom() : d && "Z" === f ? this.canZoomToFit() && this.zoomToFit() : c && !d && "G" === f ? this.canGroupSelection() && this.groupSelection() : c && + d && "G" === f ? this.canUngroupSelection() && this.ungroupSelection() : b.event && 113 === b.event.which ? this.canEditTextBlock() && this.editTextBlock() : b.event && 93 === b.event.which ? this.canShowContextMenu() && this.showContextMenu() : b.bubbles = !0 : this.canCopySelection() && this.copySelection() + } + }; + sa.prototype.doKeyUp = function () { + var a = this.g; + null !== a && (a.N.bubbles = !0) + }; + sa.prototype.stopCommand = function () { + var a = this.g; + if (null !== a) { + var b = a.Va; + b instanceof jf && a.of && a.Lv(); + null !== b && b.doCancel() + } + }; + sa.prototype.canStopCommand = function () { + return !0 + }; + sa.prototype.selectAll = function () { + var a = this.g; + if (null !== a) { + a.ma(); + try { + a.ac = "wait"; + a.za("ChangingSelection"); + for (var b = a.Sj; b.next();) b.value.Za = !0; + for (var c = a.yg; c.next();) c.value.Za = !0; + for (var d = a.links; d.next();) d.value.Za = !0 + } finally { + a.za("ChangedSelection"), a.ac = "" + } + } + }; + sa.prototype.canSelectAll = function () { + var a = this.g; + return null !== a && a.of + }; + sa.prototype.deleteSelection = function () { + var a = this.g; + if (null !== a && !a.za("SelectionDeleting", a.selection)) try { + a.ac = "wait"; + a.Wb("Delete"); + a.za("ChangingSelection"); + for (var b = new F(G), c = a.selection.i; c.next();) kf(b, c.value, !0, this.qG ? Infinity : 0, !0, function (a) { + return a.canDelete() + }); + a.Wz(b, !0); + a.za("SelectionDeleted", b) + } finally { + a.za("ChangedSelection"), a.Wd("Delete"), a.ac = "" + } + }; + sa.prototype.canDeleteSelection = function () { + var a = this.g; + return null === a || a.nb || a.uf || !a.lm || 0 === a.selection.count ? !1 : !0 + }; + + function kf(a, b, c, d, e, f) { + void 0 === f && (f = null); + if (!(a.contains(b) || null !== f && !f(b) || b instanceof lf)) if (a.add(b), b instanceof U) { + if (c && b instanceof V) for (var h = b.Mc; h.next();) kf(a, h.value, c, d, e, f); + if (e) for (h = b.oe; h.next();) { + var k = h.value; + if (!a.contains(k)) { + var l = k.W, m = k.ca; + null !== l && a.contains(l) && null !== m && a.contains(m) ? kf(a, k, c, d, e, f) : null !== l && null !== m || kf(a, k, c, d, e, f) + } + } + if (1 < d) for (b = b.tD(); b.next();) kf(a, b.value, c, d - 1, e, f) + } else if (b instanceof W) for (h = b.ug; h.next();) kf(a, h.value, c, d, e, f) + } + + sa.prototype.to = function (a, b, c) { + var d = new la(G, G); + for (a = a.i; a.next();) mf(this, a.value, b, d, c); + if (null !== b) { + c = b.ga; + a = !1; + null !== b.tb.Ed && (a = b.tb.Ed.Gi); + for (var e = new F(W), f = new la(W, W), h = d.i; h.next();) { + var k = h.value; + if (k instanceof W) { + var l = k; + a || null !== l.W && null !== l.ca || e.add(l) + } else if (c instanceof qe && k instanceof U && null !== k.data) { + var l = c, m = k, k = h.key, n = k.zm(); + null !== n && (n = d.ta(n), null !== n ? (l.ih(m.data, l.wb(n.data)), l = b.ng(m.data), k = k.As(), null !== k && null !== l && f.add(k, l)) : l.ih(m.data, void 0)) + } + } + 0 < e.count && + b.Wz(e, !1); + if (0 < f.count) for (b = f.i; b.next();) d.add(b.key, b.value) + } + for (b = d.i; b.next();) b.value.Nb(); + return d + }; + + function mf(a, b, c, d, e) { + if (null === b || e && !b.canCopy()) return null; + if (d.contains(b)) return d.ta(b); + var f = null, h = b.data; + if (null !== h && null !== c) { + var k = c.ga; + b instanceof W ? k instanceof Q && (h = k.eD(h), u.Sa(h) && (k.xv(h), f = c.ng(h))) : (h = k.copyNodeData(h), u.Sa(h) && (k.km(h), f = c.Nh(h))) + } else nf(b), f = b.copy(), null !== c && null !== f && c.add(f); + if (!(f instanceof G)) return null; + f.Za = !1; + f.Wg = !1; + d.add(b, f); + if (b instanceof U) { + for (k = b.oe; k.next();) { + h = k.value; + if (h.W === b) { + var l = d.ta(h); + null !== l && (l.W = f) + } + h.ca === b && (l = d.ta(h), null !== + l && (l.ca = f)) + } + if (b instanceof V && f instanceof V) for (k = f, b = b.Mc; b.next();) h = mf(a, b.value, c, d, e), h instanceof W || null === h || (h.Ra = k) + } else if (b instanceof W) for (k = b.W, null !== k && (k = d.ta(k), null !== k && (f.W = k)), k = b.ca, null !== k && (k = d.ta(k), null !== k && (f.ca = k)), b = b.ug; b.next();) k = mf(a, b.value, c, d, e), null !== k && (k.ce = f); + return f + } + + sa.prototype.copySelection = function () { + var a = this.g; + if (null !== a) { + for (var b = new F(G), a = a.selection.i; a.next();) kf(b, a.value, !0, this.hG ? Infinity : 0, this.fG, function (a) { + return a.canCopy() + }); + this.copyToClipboard(b) + } + }; + sa.prototype.canCopySelection = function () { + var a = this.g; + return null !== a && a.Ij && a.My && 0 !== a.selection.count ? !0 : !1 + }; + sa.prototype.cutSelection = function () { + this.copySelection(); + this.deleteSelection() + }; + sa.prototype.canCutSelection = function () { + var a = this.g; + return null !== a && !a.nb && !a.uf && a.Ij && a.lm && a.My && 0 !== a.selection.count ? !0 : !1 + }; + sa.prototype.copyToClipboard = function (a) { + var b = this.g; + if (null !== b) { + var c = null; + if (null === a) gf = null, hf = ""; else { + var c = b.ga, d = !1, e = !1, f = null; + try { + if (c instanceof qe) { + var h = c, d = h.um; + h.um = this.dD + } + c instanceof Q && (h = c, e = h.tm, h.tm = this.cD); + f = b.to(a, null, !0) + } finally { + c instanceof qe && (c.um = d), c instanceof Q && (c.tm = e), c = new E(G), c.Td(f), gf = c, hf = b.ga.Sk + } + } + b.za("ClipboardChanged", c) + } + }; + sa.prototype.pasteFromClipboard = function () { + var a = new F(G), b = gf; + if (null === b) return a; + var c = this.g; + if (null === c || hf !== c.ga.Sk) return a; + var d = c.ga, e = !1, f = !1, h = null; + try { + if (d instanceof qe) { + var k = d, e = k.um; + k.um = this.dD + } + d instanceof Q && (k = d, f = k.tm, k.tm = this.cD); + h = c.to(b, c, !1) + } finally { + for (d instanceof qe && (d.um = e), d instanceof Q && (d.tm = f), b = h.i; b.next();) c = b.value, d = b.key, c.location.J() || (d.location.J() ? c.location = d.location : !c.position.J() && d.position.J() && (c.position = d.position)), a.add(c) + } + return a + }; + sa.prototype.pasteSelection = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null !== b) try { + b.ac = "wait"; + b.Wb("Paste"); + b.za("ChangingSelection"); + var c = this.pasteFromClipboard(); + 0 < c.count && of(b); + for (var d = c.i; d.next();) d.value.Za = !0; + b.za("ChangedSelection"); + if (null !== a) { + var e = b.computePartsBounds(b.selection); + if (e) { + var f = b.tb.Ed; + null === f && (f = new uf, f.Ec(b)); + var h = f.computeEffectiveCollection(b.selection); + f.moveParts(h, new w(a.x - e.Ja, a.y - e.Ua), !1) + } + } + b.za("ClipboardPasted", c) + } finally { + b.Wd("Paste"), b.ac = + "" + } + }; + sa.prototype.canPasteSelection = function () { + var a = this.g; + return null === a || a.nb || a.uf || !a.lo || !a.My || null === gf || hf !== a.ga.Sk ? !1 : !0 + }; + sa.prototype.undo = function () { + var a = this.g; + null !== a && a.ha.undo() + }; + sa.prototype.canUndo = function () { + var a = this.g; + return null === a || a.nb || a.uf ? !1 : a.NC && a.ha.canUndo() + }; + sa.prototype.redo = function () { + var a = this.g; + null !== a && a.ha.redo() + }; + sa.prototype.canRedo = function () { + var a = this.g; + return null === a || a.nb || a.uf ? !1 : a.NC && a.ha.canRedo() + }; + sa.prototype.decreaseZoom = function (a) { + void 0 === a && (a = 1 / this.Ow); + u.ze(a, sa, "decreaseZoom:factor"); + var b = this.g; + null !== b && b.no === vf && (a *= b.scale, a < b.Yg || a > b.Xg || (b.scale = a)) + }; + sa.prototype.canDecreaseZoom = function (a) { + void 0 === a && (a = 1 / this.Ow); + u.ze(a, sa, "canDecreaseZoom:factor"); + var b = this.g; + if (null === b || b.no !== vf) return !1; + a *= b.scale; + return a < b.Yg || a > b.Xg ? !1 : b.Gv + }; + sa.prototype.increaseZoom = function (a) { + void 0 === a && (a = this.Ow); + u.ze(a, sa, "increaseZoom:factor"); + var b = this.g; + null !== b && b.no === vf && (a *= b.scale, a < b.Yg || a > b.Xg || (b.scale = a)) + }; + sa.prototype.canIncreaseZoom = function (a) { + void 0 === a && (a = this.Ow); + u.ze(a, sa, "canIncreaseZoom:factor"); + var b = this.g; + if (null === b || b.no !== vf) return !1; + a *= b.scale; + return a < b.Yg || a > b.Xg ? !1 : b.Gv + }; + sa.prototype.resetZoom = function (a) { + void 0 === a && (a = this.Pv); + u.ze(a, sa, "resetZoom:newscale"); + var b = this.g; + null === b || a < b.Yg || a > b.Xg || (b.scale = a) + }; + sa.prototype.canResetZoom = function (a) { + void 0 === a && (a = this.Pv); + u.ze(a, sa, "canResetZoom:newscale"); + var b = this.g; + return null === b || a < b.Yg || a > b.Xg ? !1 : b.Gv + }; + sa.prototype.zoomToFit = function () { + var a = this.g; + if (null !== a) { + var b = a.scale, c = a.position; + b !== this.FC || isNaN(this.Zx) ? (this.Zx = b, this.zB = c.copy(), a.zoomToFit(), a.bf(), this.FC = a.scale) : (a.scale = this.Zx, a.position = this.zB) + } + }; + sa.prototype.canZoomToFit = function () { + var a = this.g; + return null === a ? !1 : a.Gv + }; + sa.prototype.collapseTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Collapse Tree"); + var c = new E(U); + if (null !== a && a.Vc) a.collapseTree(), c.add(a); else for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof U && (a = e, a.Vc && (a.collapseTree(), c.add(a))) + } + b.za("TreeCollapsed", c) + } finally { + b.Wd("Collapse Tree") + } + }; + sa.prototype.canCollapseTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) { + if (!a.Vc) return !1; + if (0 < a.Yv().count) return !0 + } else for (a = b.selection.i; a.next();) if (b = a.value, b instanceof U && b.Vc && 0 < b.Yv().count) return !0; + return !1 + }; + sa.prototype.expandTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Expand Tree"); + var c = new E(U); + if (null === a || a.Vc) for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof U && (a = e, a.Vc || (a.expandTree(), c.add(a))) + } else a.expandTree(), c.add(a); + b.za("TreeExpanded", c) + } finally { + b.Wd("Expand Tree") + } + }; + sa.prototype.canExpandTree = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) { + if (a.Vc) return !1; + if (0 < a.Yv().count) return !0 + } else for (a = b.selection.i; a.next();) if (b = a.value, b instanceof U && !b.Vc && 0 < b.Yv().count) return !0; + return !1 + }; + sa.prototype.groupSelection = function () { + var a = this.g; + if (null !== a) { + var b = a.ga; + if (b instanceof Q) { + var c = this.OC; + if (null !== c) { + var d = null; + try { + a.ac = "wait"; + a.Wb("Group"); + a.za("ChangingSelection"); + for (var e = new E(G), f = a.selection.i; f.next();) { + var h = f.value; + h.Fd() && h.canGroup() && e.add(h) + } + for (var k = new E(G), l = e.i; l.next();) { + for (var m = l.value, f = !1, n = e.i; n.next();) if (m.Ph(n.value)) { + f = !0; + break + } + f || k.add(m) + } + if (0 < k.count) { + var p = k.first().Ra; + if (null !== p) for (; null !== p;) { + for (var e = !1, q = k.i; q.next();) if (!q.value.Ph(p)) { + e = + !0; + break + } + if (e) p = p.Ra; else break + } + if (c instanceof V) nf(c), d = c.copy(), null !== d && a.add(d); else if (b.sz(c)) { + var r = b.copyNodeData(c); + u.Sa(r) && (b.km(r), d = a.Xv(r)) + } + if (null !== d) { + null !== p && this.isValidMember(p, d) && (d.Ra = p); + for (var s = k.i; s.next();) { + var t = s.value; + this.isValidMember(d, t) && (t.Ra = d) + } + a.select(d) + } + } + a.za("ChangedSelection"); + a.za("SelectionGrouped", d) + } finally { + a.Wd("Group"), a.ac = "" + } + } + } + } + }; + sa.prototype.canGroupSelection = function () { + var a = this.g; + if (null === a || a.nb || a.uf || !a.lo || !a.Bv || !(a.ga instanceof Q) || null === this.OC) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canGroup()) return !0 + } + return !1 + }; + + function wf(a) { + var b = u.eb(); + for (a = a.i; a.next();) { + var c = a.value; + c instanceof W || b.push(c) + } + a = new F(G); + for (var c = b.length, d = 0; d < c; d++) { + for (var e = b[d], f = !0, h = 0; h < c; h++) if (e.Ph(b[h])) { + f = !1; + break + } + f && a.add(e) + } + u.ra(b); + return a + } + + sa.prototype.isValidMember = function (a, b) { + if (null === b || a === b || b instanceof W) return !1; + if (null !== a) { + if (a === b || a.Ph(b)) return !1; + var c = a.Bz; + if (null !== c && !c(a, b) || null === a.data && null !== b.data || null !== a.data && null === b.data) return !1 + } + c = this.Bz; + return null !== c ? c(a, b) : !0 + }; + sa.prototype.ungroupSelection = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof Q) try { + b.ac = "wait"; + b.Wb("Ungroup"); + b.za("ChangingSelection"); + var d = new E(V); + if (null !== a) d.add(a); else for (var e = b.selection.i; e.next();) { + var f = e.value; + f instanceof V && (a = f, a.canUngroup() && d.add(a)) + } + if (0 < d.count) { + b.Lv(); + for (var h = d.i; h.next();) { + var k = h.value; + k.expandSubGraph(); + var l = k.Ra, m = null !== l && null !== l.data ? c.wb(l.data) : void 0, n = new E(G); + n.Td(k.Mc); + for (var p = n.i; p.next();) { + var q = + p.value; + q.Za = !0; + if (!(q instanceof W)) { + var r = q.data; + null !== r ? c.Fw(r, m) : q.Ra = l + } + } + b.remove(k) + } + } + b.za("ChangedSelection"); + b.za("SelectionUngrouped", d, n) + } finally { + b.Wd("Ungroup"), b.ac = "" + } + } + }; + sa.prototype.canUngroupSelection = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb || b.uf || !b.lm || !b.Fv || !(b.ga instanceof Q)) return !1; + if (null !== a) { + if (a.canUngroup()) return !0 + } else for (a = b.selection.i; a.next();) if (b = a.value, b instanceof V && b.canUngroup()) return !0; + return !1 + }; + sa.prototype.addTopLevelParts = function (a, b) { + for (var c = !0, d = wf(a).i; d.next();) { + var e = d.value; + null !== e.Ra && (!b || this.isValidMember(null, e) ? e.Ra = null : c = !1) + } + return c + }; + sa.prototype.collapseSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Collapse SubGraph"); + var c = new E(V); + if (null !== a && a.be) a.collapseSubGraph(), c.add(a); else for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof V && (a = e, a.be && (a.collapseSubGraph(), c.add(a))) + } + b.za("SubGraphCollapsed", c) + } finally { + b.Wd("Collapse SubGraph") + } + }; + sa.prototype.canCollapseSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) return a.be ? !0 : !1; + for (a = b.selection.i; a.next();) if (b = a.value, b instanceof V && b.be) return !0; + return !1 + }; + sa.prototype.expandSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return !1; + try { + b.Wb("Expand SubGraph"); + var c = new E(V); + if (null === a || a.be) for (var d = b.selection.i; d.next();) { + var e = d.value; + e instanceof V && (a = e, a.be || (a.expandSubGraph(), c.add(a))) + } else a.expandSubGraph(), c.add(a); + b.za("SubGraphExpanded", c) + } finally { + b.Wd("Expand SubGraph") + } + }; + sa.prototype.canExpandSubGraph = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b || b.nb) return !1; + if (null !== a) return a.be ? !1 : !0; + for (a = b.selection.i; a.next();) if (b = a.value, b instanceof V && !b.be) return !0; + return !1 + }; + sa.prototype.editTextBlock = function (a) { + void 0 === a && (a = null); + null !== a && u.C(a, qa, sa, "editTextBlock"); + var b = this.g; + if (null !== b) { + var c = b.tb.iA; + if (null !== c) { + if (null === a) { + a = null; + for (var d = b.selection.i; d.next();) { + var e = d.value; + if (e.canEdit()) { + a = e; + break + } + } + if (null === a) return; + a = a.vs(function (a) { + return a instanceof qa && a.bz + }) + } + null !== a && (b.Va = null, c.kh = a, b.Va = c) + } + } + }; + sa.prototype.canEditTextBlock = function (a) { + void 0 === a && (a = null); + null !== a && u.C(a, qa, sa, "canEditTextBlock"); + var b = this.g; + if (null === b || b.nb || b.uf || !b.Ev || null === b.tb.iA) return !1; + if (null !== a) { + if (a = a.T, null !== a && a.canEdit()) return !0 + } else for (b = b.selection.i; b.next();) if (a = b.value, a.canEdit() && (a = a.vs(function (a) { + return a instanceof qa && a.bz + }), null !== a)) return !0; + return !1 + }; + sa.prototype.showContextMenu = function (a) { + var b = this.g; + if (null !== b) { + var c = b.tb.Vy; + if (null !== c && (void 0 === a && (a = 0 < b.selection.count ? b.selection.first() : b), a = c.findObjectWithContextMenu(a), null !== a)) { + var d = new Md, e = null; + a instanceof S ? e = a.lb(Ib) : b.fH || (e = b.ob, e = new w(e.x + e.width / 2, e.y + e.height / 2)); + null !== e && (d.ff = b.VE(e), d.da = e, b.N = d); + b.Va = c; + xf(c, !1, a) + } + } + }; + sa.prototype.canShowContextMenu = function (a) { + var b = this.g; + if (null === b) return !1; + var c = b.tb.Vy; + if (null === c) return !1; + void 0 === a && (a = 0 < b.selection.count ? b.selection.first() : b); + return null === c.findObjectWithContextMenu(a) ? !1 : !0 + }; + u.defineProperty(sa, {fG: "copiesConnectedLinks"}, function () { + return this.JA + }, function (a) { + u.j(a, "boolean", sa, "copiesConnectedLinks"); + this.JA = a + }); + u.defineProperty(sa, {hG: "copiesTree"}, function () { + return this.NA + }, function (a) { + u.j(a, "boolean", sa, "copiesTree"); + this.NA = a + }); + u.defineProperty(sa, {qG: "deletesTree"}, function () { + return this.XA + }, function (a) { + u.j(a, "boolean", sa, "deletesTree"); + this.XA = a + }); + u.defineProperty(sa, {dD: "copiesParentKey"}, function () { + return this.MA + }, function (a) { + u.j(a, "boolean", sa, "copiesParentKey"); + this.MA = a + }); + u.defineProperty(sa, {cD: "copiesGroupKey"}, function () { + return this.LA + }, function (a) { + u.j(a, "boolean", sa, "copiesGroupKey"); + this.LA = a + }); + u.defineProperty(sa, {OC: "archetypeGroupData"}, function () { + return this.ax + }, function (a) { + null !== a && u.C(a, Object, sa, "archetypeGroupData"); + var b = this.g; + null !== b && (b = b.ga, b instanceof Q && (a instanceof V || b.sz(a) || u.k("CommandHandler.archetypeGroupData must be either a Group or a data object for which GraphLinksModel.isGroupForNodeData is true: " + a))); + this.ax = a + }); + u.defineProperty(sa, {Bz: "memberValidation"}, function () { + return this.Ak + }, function (a) { + null !== a && u.j(a, "function", sa, "memberValidation"); + this.Ak = a + }); + u.defineProperty(sa, {Pv: "defaultScale"}, function () { + return this.VA + }, function (a) { + u.ze(a, sa, "defaultScale"); + 0 < a || u.k("defaultScale must be larger than zero, not: " + a); + this.VA = a + }); + u.defineProperty(sa, {Ow: "zoomFactor"}, function () { + return this.EC + }, function (a) { + u.ze(a, sa, "zoomFactor"); + 1 < a || u.k("zoomFactor must be larger than 1.0, not: " + a); + this.EC = a + }); + + function xe() { + 0 < arguments.length && u.Wc(xe); + u.gc(this); + this.Y = null; + this.Ub = ""; + this.Ne = !0; + this.lB = !1; + this.AC = null; + this.vv = -1 + } + + u.fa("Tool", xe); + xe.prototype.Ec = function (a) { + this.Y = a + }; + xe.prototype.toString = function () { + return "" !== this.name ? this.name + " Tool" : u.rg(Object.getPrototypeOf(this)) + }; + xe.prototype.updateAdornments = function () { + }; + xe.prototype.canStart = function () { + return this.isEnabled + }; + xe.prototype.doStart = function () { + }; + xe.prototype.doActivate = function () { + this.na = !0 + }; + xe.prototype.doDeactivate = function () { + this.na = !1 + }; + xe.prototype.doStop = function () { + }; + xe.prototype.doCancel = function () { + this.stopTool() + }; + xe.prototype.stopTool = function () { + var a = this.g; + null !== a && a.Va === this && (a.Va = null, a.ac = "") + }; + xe.prototype.doMouseDown = function () { + !this.na && this.canStart() && this.doActivate() + }; + xe.prototype.doMouseMove = function () { + }; + xe.prototype.doMouseUp = function () { + this.stopTool() + }; + xe.prototype.doMouseWheel = function () { + }; + xe.prototype.canStartMultiTouch = function () { + return !0 + }; + xe.prototype.standardPinchZoomStart = function () { + var a = this.g; + if (null !== a) { + var b = a.N.event, c = null, d = null; + if (void 0 !== b.targetTouches) { + if (2 > b.targetTouches.length) return; + c = b.targetTouches[0]; + d = b.targetTouches[1] + } else if (null !== a.Df[0]) c = a.Df[0], d = a.Df[1]; else return; + this.doCancel(); + if (a.yn) { + a.Lx = !0; + a.MB = a.scale; + var e = a.Ab, f = a.zb, h = a.ib.getBoundingClientRect(), k = c.clientX - e / h.width * h.left, + l = c.clientY - f / h.height * h.top, c = d, d = c.clientX - e / h.width * h.left - k, + f = c.clientY - f / h.height * h.top - l, f = Math.sqrt(d * d + f * + f); + a.iC = f; + b.preventDefault(); + b.cancelBubble = !0 + } else yf(a) + } + }; + xe.prototype.standardPinchZoomMove = function () { + var a = this.g; + if (null !== a) { + var b = a.N.event; + this.doCancel(); + yf(a); + var c = null, d = null; + if (void 0 !== b.targetTouches) { + if (2 > b.targetTouches.length) return; + c = b.targetTouches[0]; + d = b.targetTouches[1] + } else if (null !== a.Df[0]) c = a.Df[0], d = a.Df[1]; else return; + if (a.yn && a.Lx) { + var e = a.Ab, f = a.zb, h = a.ib.getBoundingClientRect(), k = c, c = k.clientX - e / h.width * h.left, + l = k.clientY - f / h.height * h.top, k = d, d = k.clientX - e / h.width * h.left, + f = k.clientY - f / h.height * h.top, h = d - c, e = f - l, h = Math.sqrt(h * + h + e * e) / a.iC, + c = new w((Math.min(d, c) + Math.max(d, c)) / 2, (Math.min(f, l) + Math.max(f, l)) / 2), + l = a.MB * h, d = a.Eb; + l !== a.scale && d.canResetZoom(l) && (f = a.Rm, a.Rm = c, d.resetZoom(l), a.Rm = f); + b.preventDefault(); + b.cancelBubble = !0 + } + } + }; + xe.prototype.doKeyDown = function () { + var a = this.g; + null !== a && "Esc" === a.N.key && this.doCancel() + }; + xe.prototype.doKeyUp = function () { + }; + xe.prototype.startTransaction = xe.prototype.Wb = function (a) { + void 0 === a && (a = this.name); + this.zf = null; + var b = this.g; + return null === b ? !1 : b.Wb(a) + }; + xe.prototype.stopTransaction = xe.prototype.Uj = function () { + var a = this.g; + return null === a ? !1 : null === this.zf ? a.ap() : a.Wd(this.zf) + }; + xe.prototype.standardMouseSelect = function () { + var a = this.g; + if (null !== a && a.of) { + var b = a.N, c = a.zs(b.da, !1); + if (null !== c) if (u.Em ? b.Ys : b.control) { + a.za("ChangingSelection"); + for (b = c; null !== b && !b.canSelect();) b = b.Ra; + null !== b && (b.Za = !b.Za); + a.za("ChangedSelection") + } else if (b.shift) { + if (!c.Za) { + a.za("ChangingSelection"); + for (b = c; null !== b && !b.canSelect();) b = b.Ra; + null !== b && (b.Za = !0); + a.za("ChangedSelection") + } + } else { + if (!c.Za) { + for (b = c; null !== b && !b.canSelect();) b = b.Ra; + null !== b && a.select(b) + } + } else !b.left || (u.Em ? b.Ys : b.control) || + b.shift || a.Lv() + } + }; + xe.prototype.standardMouseClick = function (a, b) { + void 0 === a && (a = null); + void 0 === b && (b = function (a) { + return !a.layer.Ac + }); + var c = this.g; + if (null !== c) { + var d = c.N, e = c.ke(d.da, a, b); + d.pe = e; + zf(e, d, c) + } + }; + + function zf(a, b, c) { + var d = 0; + b.left ? d = 1 === b.Te ? 1 : 2 === b.Te ? 2 : 1 : b.right && 1 === b.Te && (d = 3); + var e = ""; + if (null !== a) { + switch (d) { + case 1: + e = "ObjectSingleClicked"; + break; + case 2: + e = "ObjectDoubleClicked"; + break; + case 3: + e = "ObjectContextClicked" + } + 0 !== d && c.za(e, a) + } else { + switch (d) { + case 1: + e = "BackgroundSingleClicked"; + break; + case 2: + e = "BackgroundDoubleClicked"; + break; + case 3: + e = "BackgroundContextClicked" + } + 0 !== d && c.za(e) + } + if (null !== a) for (b.Tc = !1; null !== a;) { + c = null; + switch (d) { + case 1: + c = a.click; + break; + case 2: + c = a.ts ? a.ts : a.click; + break; + case 3: + c = + a.Uy + } + if (null !== c && (c(b, a), b.Tc)) break; + a = a.S + } else { + a = null; + switch (d) { + case 1: + a = c.click; + break; + case 2: + a = c.ts ? c.ts : c.click; + break; + case 3: + a = c.Uy + } + null !== a && a(b) + } + } + + xe.prototype.standardMouseOver = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + if (null !== b.g && !0 !== a.Lb.ld) { + var c = a.cb; + a.cb = !0; + var d = a.ke(b.da, null, null); + b.pe = d; + var e = !1; + if (d !== a.en) { + var f = a.en, h = f; + a.en = d; + this.doCurrentObjectChanged(f, d); + for (b.Tc = !1; null !== f;) { + var k = f.$D; + if (null !== k) { + if (d === f) break; + if (null !== d && d.gl(f)) break; + k(b, f, d); + e = !0; + if (b.Tc) break + } + f = f.S + } + f = h; + for (b.Tc = !1; null !== d;) { + k = d.ZD; + if (null !== k) { + if (f === d) break; + if (null !== f && f.gl(d)) break; + k(b, d, f); + e = !0; + if (b.Tc) break + } + d = d.S + } + d = a.en + } + if (null !== d) { + f = + d; + for (k = ""; null !== f;) { + k = f.cursor; + if ("" !== k) break; + f = f.S + } + a.ac = k; + b.Tc = !1; + for (f = d; null !== f;) { + k = f.Fz; + if (null !== k && (k(b, f), e = !0, b.Tc)) break; + f = f.S + } + } else a.ac = "", k = a.Fz, null !== k && (k(b), e = !0); + e && a.de(); + a.cb = c + } + } + }; + xe.prototype.doCurrentObjectChanged = function () { + }; + xe.prototype.standardMouseWheel = function () { + var a = this.g; + if (null !== a) { + var b = a.N, c = b.Uk; + if (0 !== c && a.Cd.J()) { + var d = a.Eb, e = a.tb.$s; + if ((e === Af && !b.shift || e === Bf && b.control) && (0 < c ? d.canIncreaseZoom() : d.canDecreaseZoom())) e = a.Rm, a.Rm = b.ff, 0 < c ? d.increaseZoom() : d.decreaseZoom(), a.Rm = e, b.bubbles = !1; else if (e === Af && b.shift || e === Bf && !b.control) { + d = a.position.copy(); + e = 0 < c ? c : -c; + if (!b.shift && a.Se) { + var f = a.mt, e = e / 40 * f; + 0 < c ? a.scroll("pixel", "up", e) : a.scroll("pixel", "down", e) + } else b.shift && a.Re && (f = a.lt, e = e / 40 * f, 0 < c ? + a.scroll("pixel", "left", e) : a.scroll("pixel", "right", e)); + a.position.L(d) || (b.bubbles = !1) + } + } + } + }; + xe.prototype.standardWaitAfter = function (a) { + u.j(a, "number", xe, "standardWaitAfter:delay"); + this.cancelWaitAfter(); + var b = this; + this.vv = u.setTimeout(function () { + b.doWaitAfter() + }, a) + }; + xe.prototype.cancelWaitAfter = function () { + -1 !== this.vv && u.clearTimeout(this.vv); + this.vv = -1 + }; + xe.prototype.doWaitAfter = function () { + }; + xe.prototype.findToolHandleAt = function (a, b) { + var c = this.g; + if (null === c) return null; + c = c.ke(a, null, function (a) { + a = a.T; + return null === a ? !1 : null !== a.vc + }); + if (null === c) return null; + var d = c.T; + return null === d || d.Kc !== b ? null : c + }; + xe.prototype.isBeyondDragSize = function (a, b) { + var c = this.g; + if (null === c) return !1; + void 0 === a && (a = c.wc.ff); + void 0 === b && (b = c.N.ff); + var d = c.tb.vG, e = d.width, d = d.height; + c.wc.jl && (e += 6, d += 6); + return Math.abs(b.x - a.x) > e || Math.abs(b.y - a.y) > d + }; + u.u(xe, {g: "diagram"}, function () { + return this.Y + }); + u.defineProperty(xe, {name: "name"}, function () { + return this.Ub + }, function (a) { + u.j(a, "string", xe, "name"); + this.Ub = a + }); + u.defineProperty(xe, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + u.j(a, "boolean", xe, "isEnabled"); + this.Ne = a + }); + u.defineProperty(xe, {na: "isActive"}, function () { + return this.lB + }, function (a) { + u.j(a, "boolean", xe, "isActive"); + this.lB = a + }); + u.defineProperty(xe, {zf: "transactionResult"}, function () { + return this.AC + }, function (a) { + null !== a && u.j(a, "string", xe, "transactionResult"); + this.AC = a + }); + + function uf() { + 0 < arguments.length && u.Wc(uf); + xe.call(this); + this.name = "Dragging"; + this.KA = this.pB = !0; + this.iq = this.cB = !1; + this.tB = !0; + this.Mx = (new ia(NaN, NaN)).freeze(); + this.Nx = xb; + this.Ox = (new w(NaN, NaN)).freeze(); + this.bB = !1; + this.$A = this.IA = this.aB = this.QA = this.pi = null; + this.Rp = this.rB = !1; + this.bo = new w(NaN, NaN); + this.gv = new w; + this.jv = !1; + this.ev = this.oB = !0; + this.pn = 100; + this.Yi = []; + this.sF = (new F(G)).freeze() + } + + u.Ga(uf, xe); + u.fa("DraggingTool", uf); + u.defineProperty(uf, {MD: "isCopyEnabled"}, function () { + return this.pB + }, function (a) { + u.j(a, "boolean", uf, "isCopyEnabled"); + this.pB = a + }); + u.defineProperty(uf, {gG: "copiesEffectiveCollection"}, function () { + return this.KA + }, function (a) { + u.j(a, "boolean", uf, "copiesEffectiveCollection"); + this.KA = a + }); + u.defineProperty(uf, {wG: "dragsTree"}, function () { + return this.cB + }, function (a) { + u.j(a, "boolean", uf, "dragsTree"); + this.cB = a + }); + u.defineProperty(uf, {gw: "isGridSnapEnabled"}, function () { + return this.iq + }, function (a) { + u.j(a, "boolean", uf, "isGridSnapEnabled"); + this.iq = a + }); + u.defineProperty(uf, {YG: "isComplexRoutingRealtime"}, function () { + return this.oB + }, function (a) { + u.j(a, "boolean", uf, "isComplexRoutingRealtime"); + this.oB = a + }); + u.defineProperty(uf, {$G: "isGridSnapRealtime"}, function () { + return this.tB + }, function (a) { + u.j(a, "boolean", uf, "isGridSnapRealtime"); + this.tB = a + }); + u.defineProperty(uf, {DD: "gridSnapCellSize"}, function () { + return this.Mx + }, function (a) { + u.C(a, ia, uf, "gridSnapCellSize"); + this.Mx.L(a) || (this.Mx = a = a.Z()) + }); + u.defineProperty(uf, {JG: "gridSnapCellSpot"}, function () { + return this.Nx + }, function (a) { + u.C(a, L, uf, "gridSnapCellSpot"); + this.Nx.L(a) || (this.Nx = a = a.Z()) + }); + u.defineProperty(uf, {KG: "gridSnapOrigin"}, function () { + return this.Ox + }, function (a) { + u.C(a, w, uf, "gridSnapOrigin"); + this.Ox.L(a) || (this.Ox = a = a.Z()) + }); + u.defineProperty(uf, {Gi: "dragsLink"}, function () { + return this.bB + }, function (a) { + u.j(a, "boolean", uf, "dragsLink"); + this.bB = a + }); + u.defineProperty(uf, {rs: "currentPart"}, function () { + return this.QA + }, function (a) { + null !== a && u.C(a, G, uf, "currentPart"); + this.QA = a + }); + u.defineProperty(uf, {oc: "copiedParts"}, function () { + return this.IA + }, function (a) { + this.IA = a + }); + u.defineProperty(uf, {cc: "draggedParts"}, function () { + return this.aB + }, function (a) { + this.aB = a + }); + u.u(uf, {uJ: "draggingParts"}, function () { + return null !== this.oc ? this.oc.Ni() : null !== this.cc ? this.cc.Ni() : this.sF + }); + u.defineProperty(uf, {Sc: "draggedLink"}, function () { + return this.$A + }, function (a) { + null !== a && u.C(a, W, uf, "draggedLink"); + this.$A = a + }); + u.defineProperty(uf, {fw: "isDragOutStarted"}, function () { + return this.rB + }, function (a) { + this.rB = a + }); + u.defineProperty(uf, {Tj: "startPoint"}, function () { + return this.gv + }, function (a) { + u.C(a, w, uf, "startPoint"); + this.gv.L(a) || (this.gv = a = a.Z()) + }); + u.defineProperty(uf, {iD: "delay"}, function () { + return this.pn + }, function (a) { + u.j(a, "number", uf, "delay"); + this.pn = a + }); + uf.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || !a.Nk && !a.Ij && !a.Av || !a.of) return !1; + var b = a.N; + return !b.left || a.Va !== this && (!this.isBeyondDragSize() || b.jl && b.timestamp - a.wc.timestamp < this.pn) ? !1 : null !== this.findDraggablePart() + }; + uf.prototype.findDraggablePart = function () { + var a = this.g; + if (null === a) return null; + a = a.zs(a.wc.da, !1); + if (null === a) return null; + for (; null !== a && !a.canSelect();) a = a.Ra; + return null !== a && (a.canMove() || a.canCopy()) ? a : null + }; + uf.prototype.standardMouseSelect = function () { + var a = this.g; + if (null !== a && a.of) { + var b = a.zs(a.wc.da, !1); + if (null !== b) { + for (; null !== b && !b.canSelect();) b = b.Ra; + this.rs = b; + this.rs.Za || (a.za("ChangingSelection"), b = a.N, (u.Em ? b.Ys : b.control) || b.shift || of(a), this.rs.Za = !0, a.za("ChangedSelection")) + } + } + }; + uf.prototype.doActivate = function () { + var a = this.g; + if (null !== a) { + this.standardMouseSelect(); + var b = this.rs; + null !== b && (b.canMove() || b.canCopy()) && (this.na = !0, this.bo.set(a.position), Cf(this, a.selection), this.Yi.length = 0, this.cc = this.computeEffectiveCollection(a.selection), a.tt = !0, Df(this, this.cc), this.Wb("Drag"), this.Tj = a.wc.da, a.Ge = !0, a.Av && (this.fw = !0, this.Rp = !1, Ef = this, Ff = this.g, this.doSimulatedDragOut())) + } + }; + + function Cf(a, b) { + if (a.Gi) { + var c = a.g; + null !== c && c.mm && (c.ga instanceof Q && 1 === b.count && b.first() instanceof W ? (a.Sc = b.first(), a.Sc.canRelinkFrom() && a.Sc.canRelinkTo() && a.Sc.ls(), a.pi = c.tb.iE, null === a.pi && (a.pi = new Gf, a.pi.Ec(c))) : (a.Sc = null, a.pi = null)) + } + } + + uf.prototype.computeEffectiveCollection = function (a) { + var b = null !== this.g && this.g.Va === this, c = new la(G); + if (null === a) return c; + for (var d = a.i; d.next();) Hf(this, c, d.value, b); + if (null !== this.Sc && this.Gi) return c; + for (d = a.i; d.next();) a = d.value, a instanceof W && (b = a.W, null === b || c.contains(b) ? (b = a.ca, null === b || c.contains(b) || c.remove(a)) : c.remove(a)); + return c + }; + + function If(a) { + return void 0 === a ? new Jf(K.Wj) : new Jf(a.copy()) + } + + function Hf(a, b, c, d) { + if (!b.contains(c) && (!d || c.canMove() || c.canCopy())) if (c instanceof U) { + b.add(c, If(c.location)); + if (c instanceof V) for (var e = c.Mc; e.next();) Hf(a, b, e.value, d); + for (e = c.oe; e.next();) { + var f = e.value; + if (!b.contains(f)) { + var h = f.W, k = f.ca; + null !== h && b.contains(h) && null !== k && b.contains(k) && Hf(a, b, f, d) + } + } + if (a.wG) for (c = c.tD(); c.next();) Hf(a, b, c.value, d) + } else if (c instanceof W) for (f = c, b.add(f, If()), e = f.ug; e.next();) Hf(a, b, e.value, d); else c instanceof lf || b.add(c, If(c.location)) + } + + uf.prototype.doDeactivate = function () { + this.na = !1; + var a = this.g; + null !== a && Kf(a); + Zf(this); + $f(this, this.cc); + this.cc = null; + this.Rp = this.fw = !1; + if (0 < ag.count) { + for (var b = ag.length, c = 0; c < b; c++) { + var d = ag.ja(c); + bg(d); + cg(d); + Zf(d); + null !== d.g && Kf(d.g) + } + ag.clear() + } + bg(this); + this.bo.m(NaN, NaN); + Ef = Ff = null; + cg(this); + a.Ge = !1; + a.ac = ""; + a.tt = !1; + this.Uj() + }; + + function Zf(a) { + var b = a.g; + if (null !== b) { + var c = b.cb; + b.cb = !0; + dg(a, b.N, null); + b.cb = c + } + a.Yi.length = 0 + } + + function eg() { + var a = Ef; + cg(a); + fg(a); + var b = a.g; + null !== b && a.bo.J() && (b.position = a.bo); + null !== b && Kf(b) + } + + uf.prototype.doCancel = function () { + cg(this); + fg(this); + var a = this.g; + null !== a && this.bo.J() && (a.position = this.bo); + this.stopTool() + }; + + function Df(a, b) { + if (null !== b) { + a.jv = !0; + for (var c = b.i; c.next();) { + var d = c.key; + d instanceof W && (d.ip = !0) + } + } + } + + function $f(a, b) { + if (null !== b) { + for (var c = b.i; c.next();) { + var d = c.key; + d instanceof W && (d.ip = !1, d.el && gg(d) && d.Vb()) + } + a.jv = !1 + } + } + + uf.prototype.doKeyDown = function () { + var a = this.g; + null !== a && (a = a.N, null !== a && this.na && ("Esc" === a.key ? this.doCancel() : this.doMouseMove())) + }; + uf.prototype.doKeyUp = function () { + var a = this.g; + null !== a && null !== a.N && this.na && this.doMouseMove() + }; + + function hg(a, b) { + for (var c = Infinity, d = Infinity, e = -Infinity, f = -Infinity, h = a.i; h.next();) { + var k = h.value; + if (k.Fd() && k.Ea()) { + var l = k.location, k = l.x, l = l.y; + isNaN(k) || isNaN(l) || (k < c && (c = k), l < d && (d = l), k > e && (e = k), l > f && (f = l)) + } + } + Infinity === c ? b.m(0, 0, 0, 0) : b.m(c, d, e - c, f - d) + } + + function ig(a, b) { + if (null === a.oc) { + var c = a.g; + if (!(null === c || b && (c.nb || c.uf)) && null !== a.cc) { + var d = c.ha; + d.isEnabled && d.ND ? null !== d.Di && 0 < d.Di.Ug.count && (c.ha.ap(), c.Wb("Drag")) : fg(a); + c.cb = !b; + c.Vm = !b; + a.Tj = c.wc.da; + d = a.gG ? a.cc.Ni() : c.selection; + d = c.to(d, c, !0); + for (c = d.i; c.next();) c.value.location = c.key.location; + c = u.Sf(); + hg(d, c); + u.ic(c); + for (var c = new la(G), e = a.cc.i; e.next();) { + var f = e.key; + f.Fd() && f.canCopy() && (f = d.ta(f), null !== f && (f.pf(), c.add(f, If(f.location)))) + } + for (d = d.i; d.next();) e = d.value, e instanceof W && + e.canCopy() && c.add(e, If()); + a.oc = c; + Cf(a, c.Ni()); + null !== a.Sc && (c = a.Sc, d = c.Mm, c.ll(a.Tj.x - (d.x + d.width / 2), a.Tj.y - (d.y + d.height / 2))) + } + } + } + + function cg(a) { + var b = a.g; + if (null !== b) { + if (null !== a.oc && (b.Wz(a.oc.Ni(), !1), a.oc = null, null !== a.cc)) for (var c = a.cc.i; c.next();) c.key instanceof W && (c.value.point = new w(0, 0)); + b.cb = !1; + b.Vm = !1; + a.Tj = b.wc.da + } + } + + function bg(a) { + if (null !== a.Sc) { + if (a.Gi && null !== a.pi) { + var b = a.pi; + b.g.remove(b.qe); + b.g.remove(b.re) + } + a.Sc = null; + a.pi = null + } + } + + function jg(a, b, c) { + var d = a.g; + if (null !== d) { + var e = a.Tj, f = u.K(); + f.assign(d.N.da); + a.moveParts(b, f.vt(e), c); + u.v(f) + } + } + + uf.prototype.moveParts = function (a, b, c) { + if (null !== a && (u.C(a, la, uf, "moveParts:parts"), 0 !== a.count)) { + var d = u.K(), e = u.K(); + e.assign(b); + isNaN(e.x) && (e.x = 0); + isNaN(e.y) && (e.y = 0); + var f = this.jv; + f || Df(this, a); + for (var h = new E(kg), k = new E(Pa), l = a.i; l.next();) { + var m = l.key; + if (m.Fd()) { + var n = lg(this, m, a); + if (null !== n) h.add(new kg(m, l.value, n)); else if (!c || m.canMove()) { + n = l.value.point; + d.assign(n); + var p = u.K(), q = this.computeMove(m, d.add(e), a, p); + m.location = q; + u.v(p); + l.value.IE = p.vt(n) + } + } else l.key instanceof W && k.add(l.Cb) + } + for (c = + h.i; c.next();) h = c.value, n = h.info.point, d.assign(n), h.Cc.location = d.add(h.LG.IE); + n = u.K(); + c = u.K(); + for (k = k.i; k.next();) if (p = k.value, h = p.key, h instanceof W) if (h.ip) l = h.W, m = h.ca, null !== this.Sc && this.Gi ? (p = p.value.point, a.add(h, If(e)), l = b.x - p.x, m = b.y - p.y, h.ll(l, m)) : (null !== l && (n.assign(l.location), q = a.ta(l), null !== q && n.vt(q.point)), null !== m && (c.assign(m.location), q = a.ta(m), null !== q && c.vt(q.point)), null !== l && null !== m ? n.De(c) ? (p = p.value.point, l = d, l.assign(n), l.vt(p), a.add(h, If(n)), h.ll(l.x, l.y)) : (h.ip = !1, + h.Vb()) : (p = p.value.point, a.add(h, If(null !== l ? n : null !== m ? c : b)), l = e.x - p.x, m = e.y - p.y, h.ll(l, m))); else if (null === h.W || null === h.ca) p = p.value.point, a.add(h, If(b)), l = e.x - p.x, m = e.y - p.y, h.ll(l, m); + u.v(d); + u.v(e); + u.v(n); + u.v(c); + f || $f(this, a) + } + }; + + function lg(a, b, c) { + b = b.Ra; + if (null !== b) { + a = lg(a, b, c); + if (null !== a) return a; + a = c.ta(b); + if (null !== a) return a + } + return null + } + + function fg(a) { + if (null !== a.cc) { + for (var b = a.g, c = a.cc.i; c.next();) { + var d = c.key; + d.Fd() && (d.location = c.value.point) + } + for (c = a.cc.i; c.next();) if (d = c.key, d instanceof W && d.ip) { + var e = c.value.point; + a.cc.add(d, If()); + d.ll(-e.x, -e.y) + } + b.bf() + } + } + + uf.prototype.computeMove = function (a, b, c, d) { + void 0 === d && (d = new w); + d.assign(b); + if (null === a) return d; + void 0 === c && (c = null); + var e = b; + if (this.gw && (this.$G || null === c || this.g.N.up) && (e = u.K(), c = e, c.assign(b), null !== a)) { + var f = this.g; + if (null !== f) { + var h = f.Gs, k = this.DD, f = k.width, k = k.height, l = this.KG, m = l.x, l = l.y, n = this.JG; + if (null !== h) { + var p = h.aw; + isNaN(f) && (f = p.width); + isNaN(k) && (k = p.height); + h = h.CD; + isNaN(m) && (m = h.x); + isNaN(l) && (l = h.y) + } + h = u.fc(0, 0); + h.rt(0, 0, f, k, n); + K.xs(b.x, b.y, m + h.x, l + h.y, f, k, c); + u.v(h) + } + } + c = null !== a.mD ? + a.mD(a, b, e) : e; + k = a.AH; + f = k.x; + isNaN(f) && (f = a.location.x); + k = k.y; + isNaN(k) && (k = a.location.y); + h = a.vH; + m = h.x; + isNaN(m) && (m = a.location.x); + h = h.y; + isNaN(h) && (h = a.location.y); + d.m(Math.max(f, Math.min(c.x, m)), Math.max(k, Math.min(c.y, h))); + e !== b && u.v(e); + return d + }; + + function mg(a, b) { + if (null === b) return !0; + var c = b.T; + return null === c || c instanceof lf || c.layer.Ac || a.cc && a.cc.contains(c) || a.oc && a.oc.contains(c) ? !0 : !1 + } + + function ng(a, b, c, d) { + var e = a.g; + if (null !== e) { + a.Gi && (null !== a.Sc && (a.Sc.W = null, a.Sc.ca = null), vg(a, !1)); + var f = !1; + !1 === a.ev && (f = e.cb, e.cb = !0); + var h = wg(e, b, null, function (b) { + return !mg(a, b) + }), k = e.N; + k.pe = h; + var l = e.cb; + e.cb = !0; + var m = dg(a, k, h); + if (a.na || null !== Ef) { + if (null === h) { + var n = e.EH; + null !== n && (n(k), m = !0) + } + if (a.na || null !== Ef) if (a.doDragOver(b, h), a.na || null !== Ef) e.cb = l, m && e.bf(), !1 === a.ev && (e.cb = f), (e.Re || e.Se) && (c || d) && xg(e, k.ff) + } + } + } + + function dg(a, b, c) { + var d = !1, e = a.Yi.length, f = 0 < e ? a.Yi[0] : null; + if (c === f) return !1; + b.Tc = !1; + for (var h = 0; h < e; h++) { + var k = a.Yi[h], l = k.DH; + if (null !== l && (l(b, k, c), d = !0, b.Tc)) break + } + a.Yi.length = 0; + if (!a.na && null === Ef || null === c) return d; + for (b.Tc = !1; null !== c;) a.Yi.push(c), c = yg(c); + e = a.Yi.length; + for (h = 0; h < e && (k = a.Yi[h], l = k.CH, null === l || (l(b, k, f), d = !0, !b.Tc)); h++) ; + return d + } + + function yg(a) { + var b = a.S; + return null !== b ? b : a instanceof G && !(a instanceof V) && (a = a.Ra, null !== a && a.OG) ? a : null + } + + function zg(a, b, c) { + var d = a.pi; + if (null === d) return null; + var e = a.g.ym(b, d.fE, function (a) { + return d.findValidLinkablePort(a, c) + }); + a = u.K(); + for (var f = Infinity, h = null, e = e.i; e.next();) { + var k = e.value; + if (null !== k.T) { + var l = k.lb(Ib, a), l = b.Lj(l); + l < f && (h = k, f = l) + } + } + u.v(a); + return h + } + + function vg(a, b) { + var c = a.Sc; + if (null !== c && !(2 > c.ka)) { + var d = a.g; + if (null !== d && !d.nb && (d = a.pi, null !== d)) { + var e = null, f = null; + null === c.W && (e = zg(a, c.l(0), !1), null !== e && (f = e.T)); + var h = null, k = null; + null === c.ca && (h = zg(a, c.l(c.ka - 1), !0), null !== h && (k = h.T)); + d.isValidLink(f, e, k, h) ? b ? (c.jn = c.l(0).copy(), c.nn = c.l(c.ka - 1).copy(), c.ip = !1, c.W = f, null !== e && (c.pg = e.Jd), c.ca = k, null !== h && (c.lh = h.Jd)) : Ag(d, f, e, k, h) : Ag(d, null, null, null, null) + } + } + } + + uf.prototype.doDragOver = function () { + }; + + function Bg(a, b) { + var c = a.g; + if (null !== c) { + a.Gi && vg(a, !0); + Zf(a); + var d = wg(c, b, null, function (b) { + return !mg(a, b) + }), e = c.N; + e.pe = d; + if (null !== d) { + e.Tc = !1; + for (var f = d; null !== f;) { + var h = f.Cz; + if (null !== h && (h(e, f), e.Tc)) break; + f = yg(f) + } + } else h = c.Cz, null !== h && h(e); + if (a.na || null !== Ef) if (a.doDropOnto(b, d), a.na || null !== Ef) for (d = c.selection.i; d.next();) e = d.value, e instanceof U && Cg(c, e.ba) + } + } + + uf.prototype.doDropOnto = function () { + }; + uf.prototype.doMouseMove = function () { + if (this.na) { + var a = this.g; + if (null !== a && null !== this.rs && null !== this.cc) { + var b = !1, c = !1; + this.mayCopy() ? (b = !0, a.ac = "copy", ig(this, !1), Df(this, this.oc), jg(this, this.oc, !1), $f(this, this.oc)) : this.mayMove() ? (c = !0, a.ac = "default", cg(this), jg(this, this.cc, !0)) : this.mayDragOut() ? (a.ac = "no-drop", ig(this, !1), jg(this, this.oc, !1)) : cg(this); + ng(this, a.N.da, c, b) + } + } + }; + uf.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + if (null !== a) { + var b = !1, c = this.mayCopy(); + c && null !== this.oc ? (cg(this), ig(this, !0), Df(this, this.oc), jg(this, this.oc, !1), $f(this, this.oc), null !== this.oc && a.CE(this.oc.Ni())) : (b = !0, cg(this), this.mayMove() && (jg(this, this.cc, !0), this.ev = !1, ng(this, a.N.da, !0, !1), this.ev = !0)); + this.Rp = !0; + Bg(this, a.N.da); + if (this.na) { + this.oc = null; + if (b && null !== this.cc) for (b = this.cc.i; b.next();) { + var d = b.key; + d instanceof U && (d = d.Ra, null === d || null === d.placeholder || this.cc.contains(d) || + d.aD && d.R()) + } + a.pc(); + $f(this, this.cc); + this.zf = c ? "Copy" : "Move"; + a.za(c ? "SelectionCopied" : "SelectionMoved", a.selection) + } + this.stopTool() + } + } + }; + uf.prototype.mayCopy = function () { + if (!this.MD) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.lo || !a.Ij || (u.Em ? !a.N.alt : !a.N.control)) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canCopy()) return !0 + } + return null !== this.Sc && this.Gi && this.Sc.canCopy() ? !0 : !1 + }; + uf.prototype.mayDragOut = function () { + if (!this.MD) return !1; + var a = this.g; + if (null === a || !a.Av || !a.Ij || a.Nk) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canCopy()) return !0 + } + return null !== this.Sc && this.Gi && this.Sc.canCopy() ? !0 : !1 + }; + uf.prototype.mayMove = function () { + var a = this.g; + if (null === a || a.nb || !a.Nk) return !1; + for (a = a.selection.i; a.next();) { + var b = a.value; + if (b.Fd() && b.canMove()) return !0 + } + return null !== this.Sc && this.Gi && this.Sc.canMove() ? !0 : !1 + }; + var ag = new E(uf), Ef = null, Ff = null; + uf.prototype.mayDragIn = function () { + var a = this.g; + if (null === a || !a.MC || a.nb || a.uf || !a.lo) return !1; + var b = Ef; + return null === b || b.g.ga.Sk !== a.ga.Sk ? !1 : !0 + }; + uf.prototype.doSimulatedDragEnter = function () { + if (this.mayDragIn()) { + var a = this.g; + a.Lb.Mi(); + Dg(a); + a = Ef; + null !== a && (a.g.ac = "copy") + } + }; + uf.prototype.doSimulatedDragLeave = function () { + var a = Ef; + null !== a && a.doSimulatedDragOut(); + this.doCancel() + }; + uf.prototype.doSimulatedDragOver = function () { + var a = this.g; + if (null !== a) { + var b = Ef; + null !== b && null !== b.cc && this.mayDragIn() && (a.ac = "copy", Eg(this, b.cc.Ni(), !1), jg(this, this.oc, !1), ng(this, a.N.da, !1, !0)) + } + }; + uf.prototype.doSimulatedDrop = function () { + var a = this.g; + if (null !== a) { + var b = Ef; + null !== b && (b.Rp = !0, cg(this), this.mayDragIn() && (this.Wb("Drop"), Eg(this, b.cc.Ni(), !0), jg(this, this.oc, !1), null !== this.oc && a.CE(this.oc.Ni()), this.zf = "ExternalCopy", Bg(this, a.N.da), a.pc(), this.oc = null, a.focus(), a.za("ExternalObjectsDropped", a.selection), this.Uj())) + } + }; + + function Eg(a, b, c) { + if (null === a.oc) { + var d = a.g; + if (null !== d && !d.nb && !d.uf) { + d.cb = !c; + d.Vm = !c; + a.Tj = d.N.da; + d = d.to(b, d, !0); + c = u.Sf(); + hg(b, c); + var e = c.x + c.width / 2, f = c.y + c.height / 2; + u.ic(c); + var h = a.gv; + c = new la(G); + var k = u.K(); + for (b = b.i; b.next();) { + var l = b.value; + if (l.Fd() && l.canCopy()) { + var m = l.location, l = d.ta(l); + k.m(h.x - (e - m.x), h.y - (f - m.y)); + l.location = k; + l.pf(); + c.add(l, If(k)) + } + } + u.v(k); + for (d = d.i; d.next();) e = d.value, e instanceof W && e.canCopy() && c.add(e, If()); + a.oc = c; + Cf(a, c.Ni()); + null !== a.Sc && (c = a.Sc, d = c.Mm, c.ll(a.Tj.x - + (d.x + d.width / 2), a.Tj.y - (d.y + d.height / 2))) + } + } + } + + uf.prototype.doSimulatedDragOut = function () { + var a = this.g; + null !== a && (this.mayCopy() || this.mayMove() ? a.ac = "" : a.ac = "no-drop") + }; + + function Jf(a) { + this.point = a; + this.IE = K.Wj + } + + u.fa("DraggingInfo", Jf); + + function kg(a, b, c) { + this.Cc = a; + this.info = b; + this.LG = c + } + + function Fg() { + 0 < arguments.length && u.Wc(Fg); + xe.call(this); + this.XB = 100; + this.xB = !1; + var a = new W, b = new X; + b.tg = !0; + b.stroke = "blue"; + a.add(b); + b = new X; + b.jp = "Standard"; + b.fill = "blue"; + b.stroke = "blue"; + a.add(b); + a.wf = "Tool"; + this.tC = a; + a = new U; + b = new X; + b.Jd = ""; + b.Fb = "Rectangle"; + b.fill = null; + b.stroke = "magenta"; + b.hb = 2; + b.xa = K.Tw; + a.add(b); + a.pl = !1; + a.wf = "Tool"; + this.rC = a; + this.sC = b; + a = new U; + b = new X; + b.Jd = ""; + b.Fb = "Rectangle"; + b.fill = null; + b.stroke = "magenta"; + b.hb = 2; + b.xa = K.Tw; + a.add(b); + a.pl = !1; + a.wf = "Tool"; + this.uC = a; + this.vC = b; + this.TB = + this.SB = this.OB = this.NB = this.PB = null; + this.sB = !0; + this.EF = new la(S, "boolean"); + this.YB = this.xk = this.nC = null + } + + u.Ga(Fg, xe); + u.fa("LinkingBaseTool", Fg); + Fg.prototype.doStop = function () { + var a = this.g; + null !== a && Kf(a); + this.fh = this.eh = this.dh = this.bh = this.qc = null; + this.Nw.clear(); + this.Rf = null + }; + u.defineProperty(Fg, {fE: "portGravity"}, function () { + return this.XB + }, function (a) { + u.j(a, "number", Fg, "portGravity"); + 0 <= a && (this.XB = a) + }); + u.defineProperty(Fg, {Io: "isUnconnectedLinkValid"}, function () { + return this.xB + }, function (a) { + u.j(a, "boolean", Fg, "isUnconnectedLinkValid"); + this.xB = a + }); + u.defineProperty(Fg, {Dg: "temporaryLink"}, function () { + return this.tC + }, function (a) { + u.C(a, W, Fg, "temporaryLink"); + this.tC = a + }); + u.defineProperty(Fg, {qe: "temporaryFromNode"}, function () { + return this.rC + }, function (a) { + u.C(a, U, Fg, "temporaryFromNode"); + this.rC = a + }); + u.defineProperty(Fg, {Om: "temporaryFromPort"}, function () { + return this.sC + }, function (a) { + u.C(a, S, Fg, "temporaryFromPort"); + this.sC = a + }); + u.defineProperty(Fg, {re: "temporaryToNode"}, function () { + return this.uC + }, function (a) { + u.C(a, U, Fg, "temporaryToNode"); + this.uC = a + }); + u.defineProperty(Fg, {Pm: "temporaryToPort"}, function () { + return this.vC + }, function (a) { + u.C(a, S, Fg, "temporaryToPort"); + this.vC = a + }); + u.defineProperty(Fg, {qc: "originalLink"}, function () { + return this.PB + }, function (a) { + null !== a && u.C(a, W, Fg, "originalLink"); + this.PB = a + }); + u.defineProperty(Fg, {bh: "originalFromNode"}, function () { + return this.NB + }, function (a) { + null !== a && u.C(a, U, Fg, "originalFromNode"); + this.NB = a + }); + u.defineProperty(Fg, {dh: "originalFromPort"}, function () { + return this.OB + }, function (a) { + null !== a && u.C(a, S, Fg, "originalFromPort"); + this.OB = a + }); + u.defineProperty(Fg, {eh: "originalToNode"}, function () { + return this.SB + }, function (a) { + null !== a && u.C(a, U, Fg, "originalToNode"); + this.SB = a + }); + u.defineProperty(Fg, {fh: "originalToPort"}, function () { + return this.TB + }, function (a) { + null !== a && u.C(a, S, Fg, "originalToPort"); + this.TB = a + }); + u.defineProperty(Fg, {$d: "isForwards"}, function () { + return this.sB + }, function (a) { + u.j(a, "boolean", Fg, "isForwards"); + this.sB = a + }); + u.u(Fg, {Nw: "validPortsCache"}, function () { + return this.EF + }); + u.defineProperty(Fg, {Rf: "targetPort"}, function () { + return this.nC + }, function (a) { + null !== a && u.C(a, S, Fg, "targetPort"); + this.nC = a + }); + Fg.prototype.copyPortProperties = function (a, b, c, d, e) { + if (null !== a && null !== b && null !== c && null !== d) { + d.xa = b.ba.size; + e ? (d.xb = b.xb, d.vl = b.vl) : (d.vb = b.vb, d.Yk = b.Yk); + c.Ze = Ib; + var f = u.K(); + c.location = b.lb(Ib, f); + u.v(f); + d.angle = b.Zk(); + null !== this.ww && this.ww(a, b, c, d, e) + } + }; + Fg.prototype.setNoTargetPortProperties = function (a, b, c) { + null !== b && (b.xa = K.Tw, b.vb = vb, b.xb = vb); + null !== a && (a.location = this.g.N.da); + null !== this.ww && this.ww(null, null, a, b, c) + }; + Fg.prototype.doMouseDown = function () { + this.na && this.doMouseMove() + }; + Fg.prototype.doMouseMove = function () { + if (this.na) { + var a = this.g; + if (null !== a) { + this.Rf = this.findTargetPort(this.$d); + if (null !== this.Rf) { + var b = this.Rf.T; + if (b instanceof U) { + this.$d ? this.copyPortProperties(b, this.Rf, this.re, this.Pm, !0) : this.copyPortProperties(b, this.Rf, this.qe, this.Om, !1); + return + } + } + this.$d ? this.setNoTargetPortProperties(this.re, this.Pm, !0) : this.setNoTargetPortProperties(this.qe, this.Om, !1); + (a.Re || a.Se) && xg(a, a.N.ff) + } + } + }; + Fg.prototype.findValidLinkablePort = function (a, b) { + if (null === a) return null; + var c = a.T; + if (!(c instanceof U)) return null; + for (; null !== a;) { + var d = b ? a.OE : a.vD; + if (!0 === d && (null !== a.Jd || a instanceof U) && (b ? this.isValidTo(c, a) : this.isValidFrom(c, a))) return a; + if (!1 === d) break; + a = a.S + } + return null + }; + Fg.prototype.findTargetPort = function (a) { + var b = this.g, c = b.N.da, d = this.fE; + 0 >= d && (d = .1); + for (var e = this, f = b.ym(c, d, function (b) { + return e.findValidLinkablePort(b, a) + }, null, !0), d = Infinity, b = null, f = f.i; f.next();) { + var h = f.value, k = h.T; + if (k instanceof U) { + var l = h.lb(Ib, u.K()), m = c.x - l.x, n = c.y - l.y; + u.v(l); + l = m * m + n * n; + l < d && (m = this.Nw.ta(h), null !== m ? m && (b = h, d = l) : a && this.isValidLink(this.bh, this.dh, k, h) || !a && this.isValidLink(k, h, this.eh, this.fh) ? (this.Nw.add(h, !0), b = h, d = l) : this.Nw.add(h, !1)) + } + } + return null !== b && (c = b.T, + c instanceof U && (null === c.layer || c.layer.gs)) ? b : null + }; + Fg.prototype.isValidFrom = function (a, b) { + if (null === a || null === b) return this.Io; + if (this.g.Va === this && (null !== a.layer && !a.layer.gs || !0 !== b.vD)) return !1; + var c = b.DG; + if (Infinity > c) { + if (null !== this.qc && a === this.bh && b === this.dh) return !0; + var d = b.Jd; + null === d && (d = ""); + if (a.Wv(d).count >= c) return !1 + } + return !0 + }; + Fg.prototype.isValidTo = function (a, b) { + if (null === a || null === b) return this.Io; + if (this.g.Va === this && (null !== a.layer && !a.layer.gs || !0 !== b.OE)) return !1; + var c = b.yI; + if (Infinity > c) { + if (null !== this.qc && a === this.eh && b === this.fh) return !0; + var d = b.Jd; + null === d && (d = ""); + if (a.og(d).count >= c) return !1 + } + return !0 + }; + Fg.prototype.isInSameNode = function (a, b) { + if (null === a || null === b) return !1; + if (a === b) return !0; + var c = a.T, d = b.T; + return null !== c && c === d + }; + Fg.prototype.isLinked = function (a, b) { + if (null === a || null === b) return !1; + var c = a.T; + if (!(c instanceof U)) return !1; + var d = a.Jd; + null === d && (d = ""); + var e = b.T; + if (!(e instanceof U)) return !1; + var f = b.Jd; + null === f && (f = ""); + for (e = e.og(f); e.next();) if (f = e.value, f.W === c && f.pg === d) return !0; + return !1 + }; + Fg.prototype.isValidLink = function (a, b, c, d) { + if (!this.isValidFrom(a, b) || !this.isValidTo(c, d) || !(null === b || null === d || (b.CG && d.xI || !this.isInSameNode(b, d)) && (b.BG && d.wI || !this.isLinked(b, d))) || null !== this.qc && (null !== a && this.isLabelDependentOnLink(a, this.qc) || null !== c && this.isLabelDependentOnLink(c, this.qc)) || null !== a && null !== c && (null === a.data && null !== c.data || null !== a.data && null === c.data) || !this.isValidCycle(a, c, this.qc)) return !1; + if (null !== a) { + var e = a.pw; + if (null !== e && !e(a, b, c, d, this.qc)) return !1 + } + if (null !== + c && (e = c.pw, null !== e && !e(a, b, c, d, this.qc))) return !1; + e = this.pw; + return null !== e ? e(a, b, c, d, this.qc) : !0 + }; + Fg.prototype.isLabelDependentOnLink = function (a, b) { + if (null === a) return !1; + var c = a.ce; + if (null === c) return !1; + if (c === b) return !0; + var d = new F(U); + d.add(a); + return Gg(this, c, b, d) + }; + + function Gg(a, b, c, d) { + if (b === c) return !0; + var e = b.W; + if (null !== e && e.tf && (d.add(e), Gg(a, e.ce, c, d))) return !0; + b = b.ca; + return null !== b && b.tf && (d.add(b), Gg(a, b.ce, c, d)) ? !0 : !1 + } + + Fg.prototype.isValidCycle = function (a, b, c) { + void 0 === c && (c = null); + if (null === a || null === b) return this.Io; + var d = this.g.DI; + if (d !== Hg) { + if (d === Ig) { + if (null !== c && !c.Bc) return !0; + for (d = b.oe; d.next();) { + var e = d.value; + if (e !== c && e.Bc && e.ca === b) return !1 + } + return !Jg(this, a, b, c, !0) + } + if (d === Kg) { + if (null !== c && !c.Bc) return !0; + for (d = a.oe; d.next();) if (e = d.value, e !== c && e.Bc && e.W === a) return !1; + return !Jg(this, a, b, c, !0) + } + if (d === Lg) return a === b ? a = !0 : (d = new F(U), d.add(b), a = Ug(this, d, a, b, c)), !a; + if (d === Vg) return !Jg(this, a, b, c, !1); + if (d === + Wg) return a === b ? a = !0 : (d = new F(U), d.add(b), a = Xg(this, d, a, b, c)), !a + } + return !0 + }; + + function Jg(a, b, c, d, e) { + if (b === c) return !0; + if (null === b || null === c) return !1; + for (var f = b.oe; f.next();) { + var h = f.value; + if (h !== d && (!e || h.Bc) && h.ca === b && (h = h.W, h !== b && Jg(a, h, c, d, e))) return !0 + } + return !1 + } + + function Ug(a, b, c, d, e) { + if (c === d) return !0; + if (null === c || null === d || b.contains(c)) return !1; + b.add(c); + for (var f = c.oe; f.next();) { + var h = f.value; + if (h !== e && h.ca === c && (h = h.W, h !== c && Ug(a, b, h, d, e))) return !0 + } + return !1 + } + + function Xg(a, b, c, d, e) { + if (c === d) return !0; + if (null === c || null === d || b.contains(c)) return !1; + b.add(c); + for (var f = c.oe; f.next();) { + var h = f.value; + if (h !== e) { + var k = h.W, h = h.ca, k = k === c ? h : k; + if (k !== c && Xg(a, b, k, d, e)) return !0 + } + } + return !1 + } + + u.defineProperty(Fg, {pw: "linkValidation"}, function () { + return this.xk + }, function (a) { + null !== a && u.j(a, "function", Fg, "linkValidation"); + this.xk = a + }); + u.defineProperty(Fg, {ww: "portTargeted"}, function () { + return this.YB + }, function (a) { + null !== a && u.j(a, "function", Fg, "portTargeted"); + this.YB = a + }); + + function ta() { + 0 < arguments.length && u.Wc(ta); + Fg.call(this); + this.name = "Linking"; + this.ex = {}; + this.bx = null; + this.la = Yg; + this.yy = this.jC = null + } + + u.Ga(ta, Fg); + u.fa("LinkingTool", ta); + var Yg; + ta.Either = Yg = u.s(ta, "Either", 0); + var Zg; + ta.ForwardsOnly = Zg = u.s(ta, "ForwardsOnly", 0); + var $g; + ta.BackwardsOnly = $g = u.s(ta, "BackwardsOnly", 0); + u.defineProperty(ta, {OF: "archetypeLinkData"}, function () { + return this.ex + }, function (a) { + null !== a && u.C(a, Object, ta, "archetypeLinkData"); + a instanceof S && u.C(a, W, ta, "archetypeLinkData"); + this.ex = a + }); + u.defineProperty(ta, {PC: "archetypeLabelNodeData"}, function () { + return this.bx + }, function (a) { + null !== a && u.C(a, Object, ta, "archetypeLabelNodeData"); + a instanceof S && u.C(a, U, ta, "archetypeLabelNodeData"); + this.bx = a + }); + u.defineProperty(ta, {direction: "direction"}, function () { + return this.la + }, function (a) { + u.rb(a, ta, ta, "direction"); + this.la = a + }); + u.defineProperty(ta, {ME: "startObject"}, function () { + return this.jC + }, function (a) { + null !== a && u.C(a, S, ta, "startObject"); + this.jC = a + }); + u.u(ta, {Kw: "startPort"}, function () { + return this.yy + }); + ta.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.gs) return !1; + var b = a.ga; + return (b instanceof Q || b instanceof qe) && a.N.left && (a.Va === this || this.isBeyondDragSize()) ? null !== this.findLinkablePort() : !1 + }; + ta.prototype.findLinkablePort = function () { + var a = this.g; + if (null === a) return null; + var b = this.ME; + null === b && (b = a.ke(a.wc.da, null, null)); + if (null === b || !(b.T instanceof U)) return null; + a = this.direction; + if (a === Yg || a === Zg) { + var c = this.findValidLinkablePort(b, !1); + if (null !== c) return this.$d = !0, c + } + if (a === Yg || a === $g) if (c = this.findValidLinkablePort(b, !0), null !== c) return this.$d = !1, c; + return null + }; + ta.prototype.doActivate = function () { + var a = this.g; + if (null !== a && (null === this.Kw && (this.yy = this.findLinkablePort()), null !== this.Kw)) { + this.Wb(this.name); + a.Ge = !0; + a.ac = "pointer"; + if (this.$d) { + this.dh = this.Kw; + var b = this.dh.T; + b instanceof U && (this.bh = b); + this.copyPortProperties(this.bh, this.dh, this.qe, this.Om, !1) + } else this.fh = this.Kw, b = this.fh.T, b instanceof U && (this.eh = b), this.copyPortProperties(this.eh, this.fh, this.re, this.Pm, !0); + a.add(this.qe); + a.add(this.re); + null !== this.Dg && (null !== this.qe && (this.Dg.W = this.qe), + null !== this.re && (this.Dg.ca = this.re), this.Dg.Vb(), a.add(this.Dg)); + this.na = !0 + } + }; + ta.prototype.doDeactivate = function () { + this.na = !1; + var a = this.g; + null !== a && (a.remove(this.Dg), a.remove(this.qe), a.remove(this.re), a.Ge = !1, a.ac = "", this.Uj()) + }; + ta.prototype.doStop = function () { + Fg.prototype.doStop.call(this); + this.ME = this.yy = null + }; + ta.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + if (null === a) return; + var b = this.zf = null, c = null, d = null, e = null, f = this.Rf = this.findTargetPort(this.$d); + if (null !== f) { + var h = f.T; + h instanceof U && (this.$d ? (null !== this.bh && (b = this.bh, c = this.dh), d = h, e = f) : (b = h, c = f, null !== this.eh && (d = this.eh, e = this.fh))) + } else this.$d ? null !== this.bh && this.Io && (b = this.bh, c = this.dh) : null !== this.eh && this.Io && (d = this.eh, e = this.fh); + if (null !== b || null !== d) b = this.insertLink(b, c, d, e), null !== b ? (null === f && (this.$d ? b.nn = a.N.da.copy() : + b.jn = a.N.da.copy()), a.of && a.select(b), this.zf = this.name, a.za("LinkDrawn", b)) : a.ga.XC() + } + this.stopTool() + }; + ta.prototype.insertLink = function (a, b, c, d) { + var e = this.g; + if (null === e) return null; + var f = e.ga; + if (f instanceof qe) { + var h = a; + b = c; + e.qd || (h = c, b = a); + if (null !== h && null !== b) return f.ih(b.data, f.wb(h.data)), b.As() + } else if (f instanceof Q) if (h = "", null !== a && (null === b && (b = a), h = b.Jd, null === h && (h = "")), b = "", null !== c && (null === d && (d = c), b = d.Jd, null === b && (b = "")), d = this.OF, d instanceof W) { + if (nf(d), f = d.copy(), null !== f) return f.W = a, f.pg = h, f.ca = c, f.lh = b, e.add(f), a = this.PC, a instanceof U && (nf(a), a = a.copy(), null !== a && (a.ce = f, e.add(a))), + f + } else if (null !== d && (d = f.eD(d), u.Sa(d))) return null !== a && f.Ew(d, f.wb(a.data)), f.aA(d, h), null !== c && f.Gw(d, f.wb(c.data)), f.eA(d, b), f.xv(d), a = this.PC, null === a || a instanceof U || (a = f.copyNodeData(a), u.Sa(a) && (f.km(a), a = f.wb(a), void 0 !== a && f.Ly(d, a))), f = e.ng(d); + return null + }; + + function Gf() { + 0 < arguments.length && u.Wc(Gf); + Fg.call(this); + this.name = "Relinking"; + var a = new X; + a.Fb = "Diamond"; + a.xa = K.Qw; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.cursor = "pointer"; + a.Pf = 0; + this.gB = a; + a = new X; + a.Fb = "Diamond"; + a.xa = K.Qw; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.cursor = "pointer"; + a.Pf = -1; + this.wC = a; + this.Yb = null; + this.QB = new z + } + + u.Ga(Gf, Fg); + u.fa("RelinkingTool", Gf); + Gf.prototype.updateAdornments = function (a) { + if (null !== a && a instanceof W) { + var b = "RelinkFrom", c = null; + if (a.Za && !this.g.nb) { + var d = a.nt; + null !== d && a.canRelinkFrom() && a.ba.J() && a.Ea() && d.ba.J() && d.kl() && (c = a.xo(b), null === c && (c = this.makeAdornment(d, !1), null !== c && (c.Kc = b), a.Kk(b, c))) + } + null === c && a.ol(b); + b = "RelinkTo"; + c = null; + a.Za && !this.g.nb && (d = a.nt, null !== d && a.canRelinkTo() && a.ba.J() && a.Ea() && d.ba.J() && d.kl() && (c = a.xo(b), null === c && (c = this.makeAdornment(d, !0), null !== c && (c.Kc = b), a.Kk(b, c)))); + null === c && a.ol(b) + } + }; + Gf.prototype.makeAdornment = function (a, b) { + var c = new lf; + c.type = ah; + var d = b ? this.vI : this.AG; + null !== d && c.add(d.copy()); + c.vc = a; + return c + }; + u.defineProperty(Gf, {AG: "fromHandleArchetype"}, function () { + return this.gB + }, function (a) { + null !== a && u.C(a, S, Gf, "fromHandleArchetype"); + this.gB = a + }); + u.defineProperty(Gf, {vI: "toHandleArchetype"}, function () { + return this.wC + }, function (a) { + null !== a && u.C(a, S, Gf, "toHandleArchetype"); + this.wC = a + }); + u.u(Gf, {handle: "handle"}, function () { + return this.Yb + }); + Gf.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.mm) return !1; + var b = a.ga; + if (!(b instanceof Q || b instanceof qe) || !a.N.left) return !1; + b = this.findToolHandleAt(a.wc.da, "RelinkFrom"); + null === b && (b = this.findToolHandleAt(a.wc.da, "RelinkTo")); + return null !== b + }; + Gf.prototype.doActivate = function () { + var a = this.g; + if (null !== a) { + if (null === this.qc) { + var b = this.findToolHandleAt(a.wc.da, "RelinkFrom"); + null === b && (b = this.findToolHandleAt(a.wc.da, "RelinkTo")); + if (null === b) return; + var c = b.T; + if (!(c instanceof lf && c.Kh instanceof W)) return; + this.Yb = b; + this.$d = null === c || "RelinkTo" === c.Kc; + this.qc = c.Kh + } + this.Wb(this.name); + a.Ge = !0; + a.ac = "pointer"; + this.dh = this.qc.od; + this.bh = this.qc.W; + this.fh = this.qc.fe; + this.eh = this.qc.ca; + this.QB.set(this.qc.ba); + null !== this.qc && 0 < this.qc.ka && (null === + this.qc.W && (null !== this.Om && (this.Om.xa = K.op), null !== this.qe && (this.qe.location = this.qc.l(0))), null === this.qc.ca && (null !== this.Pm && (this.Pm.xa = K.op), null !== this.re && (this.re.location = this.qc.l(this.qc.ka - 1)))); + this.copyPortProperties(this.bh, this.dh, this.qe, this.Om, !1); + this.copyPortProperties(this.eh, this.fh, this.re, this.Pm, !0); + a.add(this.qe); + a.add(this.re); + null !== this.Dg && (null !== this.qe && (this.Dg.W = this.qe), null !== this.re && (this.Dg.ca = this.re), this.copyLinkProperties(this.qc, this.Dg), this.Dg.Vb(), + a.add(this.Dg)); + this.na = !0 + } + }; + Gf.prototype.copyLinkProperties = function (a, b) { + if (null !== a && null !== b) { + b.es = a.es; + b.Yy = a.Yy; + var c = a.Ve; + if (c === bh || c === ch) c = dh; + b.Ve = c; + b.Ov = a.Ov; + b.zw = a.zw; + b.gp = a.gp; + b.vb = a.vb; + b.Yk = a.Yk; + b.Es = a.Es; + b.Fs = a.Fs; + b.xb = a.xb; + b.vl = a.vl; + b.wt = a.wt; + b.yt = a.yt + } + }; + Gf.prototype.doDeactivate = function () { + this.na = !1; + var a = this.g; + null !== a && (a.remove(this.Dg), a.remove(this.qe), a.remove(this.re), a.Ge = !1, a.ac = "", this.Uj()) + }; + Gf.prototype.doStop = function () { + Fg.prototype.doStop.call(this); + this.Yb = null + }; + Gf.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + if (null === a) return; + this.zf = null; + var b = this.bh, c = this.dh, d = this.eh, e = this.fh, f = this.qc; + this.Rf = this.findTargetPort(this.$d); + if (null !== this.Rf) { + var h = this.Rf.T; + h instanceof U && (this.$d ? (d = h, e = this.Rf) : (b = h, c = this.Rf)) + } else this.Io ? this.$d ? e = d = null : c = b = null : f = null; + null !== f && (this.reconnectLink(f, this.$d ? d : b, this.$d ? e : c, this.$d), null === this.Rf && (this.$d ? f.nn = a.N.da.copy() : f.jn = a.N.da.copy(), f.Vb()), a.of && (f.Za = !0), this.zf = this.name, a.za("LinkRelinked", + f, this.$d ? this.fh : this.dh)); + eh(this.qc, this.QB) + } + this.stopTool() + }; + Gf.prototype.reconnectLink = function (a, b, c, d) { + if (null === this.g) return !1; + c = null !== c && null !== c.Jd ? c.Jd : ""; + d ? (a.ca = b, a.lh = c) : (a.W = b, a.pg = c); + return !0 + }; + + function Ag(a, b, c, d, e) { + null !== b ? (a.copyPortProperties(b, c, a.qe, a.Om, !1), a.g.add(a.qe)) : a.g.remove(a.qe); + null !== d ? (a.copyPortProperties(d, e, a.re, a.Pm, !0), a.g.add(a.re)) : a.g.remove(a.re) + } + + function fh() { + 0 < arguments.length && u.Wc(fh); + xe.call(this); + this.name = "LinkReshaping"; + var a = new X; + a.Fb = "Rectangle"; + a.xa = K.mp; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + this.pk = a; + a = new X; + a.Fb = "Diamond"; + a.xa = K.mp; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + this.DB = a; + this.ZB = 3; + this.$w = this.Yb = null; + this.RB = new w; + this.my = null + } + + u.Ga(fh, xe); + u.fa("LinkReshapingTool", fh); + var gh; + fh.None = gh = u.s(fh, "None", 0); + var hh; + fh.Horizontal = hh = u.s(fh, "Horizontal", 1); + var ih; + fh.Vertical = ih = u.s(fh, "Vertical", 2); + var jh; + fh.All = jh = u.s(fh, "All", 3); + fh.prototype.getReshapingBehavior = fh.prototype.AD = function (a) { + return a && a.$B ? a.$B : gh + }; + fh.prototype.setReshapingBehavior = fh.prototype.qt = function (a, b) { + u.C(a, S, fh, "setReshapingBehavior:obj"); + u.rb(b, fh, fh, "setReshapingBehavior:behavior"); + a.$B = b + }; + fh.prototype.updateAdornments = function (a) { + if (null !== a && a instanceof W) { + if (a.Za && !this.g.nb) { + var b = a.path; + if (null !== b && a.canReshape() && a.ba.J() && a.Ea() && b.ba.J() && b.kl()) { + var c = a.xo(this.name); + if (null === c || c.xF !== a.ka || c.GF !== a.it) c = this.makeAdornment(b), null !== c && (c.xF = a.ka, c.GF = a.it, a.Kk(this.name, c)); + if (null !== c) { + c.location = a.position; + return + } + } + } + a.ol(this.name) + } + }; + fh.prototype.makeAdornment = function (a) { + var b = a.T, c = b.ka, d = b.dc, e = null; + if (null !== b.points && 1 < c) { + e = new lf; + e.type = ah; + var c = b.Bs, f = b.lw, h = d ? 1 : 0; + if (b.it && b.Ve !== kh) for (var k = c + h; k < f - h; k++) { + var l = this.makeResegmentHandle(a, k); + null !== l && (l.Pf = k, l.Bw = .5, e.add(l)) + } + for (k = c + 1; k < f; k++) if (l = this.makeHandle(a, k), null !== l) { + l.Pf = k; + if (k !== c) if (k === c + 1 && d) { + var h = b.l(c), m = b.l(c + 1); + K.D(h.x, m.x) && K.D(h.y, m.y) && (m = b.l(c - 1)); + K.D(h.x, m.x) ? (this.qt(l, ih), l.cursor = "n-resize") : K.D(h.y, m.y) && (this.qt(l, hh), l.cursor = "w-resize") + } else k === + f - 1 && d ? (h = b.l(f - 1), m = b.l(f), K.D(h.x, m.x) && K.D(h.y, m.y) && (h = b.l(f + 1)), K.D(h.x, m.x) ? (this.qt(l, ih), l.cursor = "n-resize") : K.D(h.y, m.y) && (this.qt(l, hh), l.cursor = "w-resize")) : k !== f && (this.qt(l, jh), l.cursor = "move"); + e.add(l) + } + e.Kc = this.name; + e.vc = a + } + return e + }; + fh.prototype.makeHandle = function () { + var a = this.Hs; + return null === a ? null : a.copy() + }; + u.defineProperty(fh, {Hs: "handleArchetype"}, function () { + return this.pk + }, function (a) { + null !== a && u.C(a, S, fh, "handleArchetype"); + this.pk = a + }); + fh.prototype.makeResegmentHandle = function () { + var a = this.zH; + return null === a ? null : a.copy() + }; + u.defineProperty(fh, {zH: "midHandleArchetype"}, function () { + return this.DB + }, function (a) { + null !== a && u.C(a, S, fh, "midHandleArchetype"); + this.DB = a + }); + u.u(fh, {handle: "handle"}, function () { + return this.Yb + }); + u.u(fh, {fs: "adornedLink"}, function () { + return this.$w + }); + fh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null !== a && !a.nb && a.Cv && a.N.left ? null !== this.findToolHandleAt(a.wc.da, this.name) : !1 + }; + fh.prototype.doActivate = function () { + var a = this.g; + if (null !== a && (this.Yb = this.findToolHandleAt(a.wc.da, this.name), null !== this.Yb)) { + var b = this.Yb.T.Kh; + if (b instanceof W) { + this.$w = b; + a.Ge = !0; + this.Wb(this.name); + if (b.it && .5 === this.Yb.Bw) { + var c = b.points.copy(), d = this.Yb.lb(Ib); + c.Yd(this.Yb.Pf + 1, d); + b.dc && c.Yd(this.Yb.Pf + 1, d); + b.points = c; + b.Zd(); + this.Yb = this.findToolHandleAt(a.wc.da, this.name) + } + this.RB = b.l(this.Yb.Pf); + this.my = b.points.copy(); + this.na = !0 + } + } + }; + fh.prototype.doDeactivate = function () { + this.Uj(); + this.$w = this.Yb = null; + var a = this.g; + null !== a && (a.Ge = !1); + this.na = !1 + }; + fh.prototype.doCancel = function () { + var a = this.fs; + null !== a && (a.points = this.my); + this.stopTool() + }; + fh.prototype.doMouseMove = function () { + var a = this.g; + this.na && null !== a && (a = this.computeReshape(a.N.da), this.reshape(a)) + }; + fh.prototype.doMouseUp = function () { + var a = this.g; + if (this.na && null !== a) { + var b = this.computeReshape(a.N.da); + this.reshape(b); + b = this.fs; + if (null !== b && b.it) { + var c = this.handle.Pf, d = b.l(c - 1), e = b.l(c), f = b.l(c + 1); + if (b.dc) { + if (c > b.Bs + 1 && c < b.lw - 1) { + var h = b.l(c - 2); + if (Math.abs(d.x - e.x) < this.gh && Math.abs(d.y - e.y) < this.gh && (lh(this, h, d, e, f, !0) || lh(this, h, d, e, f, !1))) { + var k = b.points.copy(); + lh(this, h, d, e, f, !0) ? (k.Bg(c - 2, new w(h.x, (f.y + h.y) / 2)), k.Bg(c + 1, new w(f.x, (f.y + h.y) / 2))) : (k.Bg(c - 2, new w((f.x + h.x) / 2, h.y)), k.Bg(c + 1, + new w((f.x + h.x) / 2, f.y))); + k.hd(c); + k.hd(c - 1); + b.points = k; + b.Zd() + } else h = b.l(c + 2), Math.abs(e.x - f.x) < this.gh && Math.abs(e.y - f.y) < this.gh && (lh(this, d, e, f, h, !0) || lh(this, d, e, f, h, !1)) && (k = b.points.copy(), lh(this, d, e, f, h, !0) ? (k.Bg(c - 1, new w(d.x, (d.y + h.y) / 2)), k.Bg(c + 2, new w(h.x, (d.y + h.y) / 2))) : (k.Bg(c - 1, new w((d.x + h.x) / 2, d.y)), k.Bg(c + 2, new w((d.x + h.x) / 2, h.y))), k.hd(c + 1), k.hd(c), b.points = k, b.Zd()) + } + } else h = u.K(), K.Hm(d.x, d.y, f.x, f.y, e.x, e.y, h) && h.Lj(e) < this.gh * this.gh && (k = b.points.copy(), k.hd(c), b.points = k, b.Zd()), + u.v(h) + } + a.pc(); + this.zf = this.name; + a.za("LinkReshaped", this.fs) + } + this.stopTool() + }; + + function lh(a, b, c, d, e, f) { + return f ? Math.abs(b.y - c.y) < a.gh && Math.abs(c.y - d.y) < a.gh && Math.abs(d.y - e.y) < a.gh : Math.abs(b.x - c.x) < a.gh && Math.abs(c.x - d.x) < a.gh && Math.abs(d.x - e.x) < a.gh + } + + u.defineProperty(fh, {gh: "resegmentingDistance"}, function () { + return this.ZB + }, function (a) { + u.j(a, "number", fh, "resegmentingDistance"); + this.ZB = a + }); + fh.prototype.reshape = function (a) { + var b = this.fs; + b.rl(); + var c = this.handle.Pf, d = this.AD(this.handle); + if (b.dc) if (c === b.Bs + 1) c = b.Bs + 1, d === ih ? (b.V(c, b.l(c - 1).x, a.y), b.V(c + 1, b.l(c + 2).x, a.y)) : d === hh && (b.V(c, a.x, b.l(c - 1).y), b.V(c + 1, a.x, b.l(c + 2).y)); else if (c === b.lw - 1) c = b.lw - 1, d === ih ? (b.V(c - 1, b.l(c - 2).x, a.y), b.V(c, b.l(c + 1).x, a.y)) : d === hh && (b.V(c - 1, a.x, b.l(c - 2).y), b.V(c, a.x, b.l(c + 1).y)); else { + var d = c, e = b.l(d), f = b.l(d - 1), h = b.l(d + 1); + K.D(f.x, e.x) && K.D(e.y, h.y) ? (K.D(f.x, b.l(d - 2).x) && !K.D(f.y, b.l(d - 2).y) ? (b.w(d, a.x, + f.y), c++, d++) : b.V(d - 1, a.x, f.y), K.D(h.y, b.l(d + 2).y) && !K.D(h.x, b.l(d + 2).x) ? b.w(d + 1, h.x, a.y) : b.V(d + 1, h.x, a.y)) : K.D(f.y, e.y) && K.D(e.x, h.x) ? (K.D(f.y, b.l(d - 2).y) && !K.D(f.x, b.l(d - 2).x) ? (b.w(d, f.x, a.y), c++, d++) : b.V(d - 1, f.x, a.y), K.D(h.x, b.l(d + 2).x) && !K.D(h.y, b.l(d + 2).y) ? b.w(d + 1, a.x, h.y) : b.V(d + 1, a.x, h.y)) : K.D(f.x, e.x) && K.D(e.x, h.x) ? (K.D(f.x, b.l(d - 2).x) && !K.D(f.y, b.l(d - 2).y) ? (b.w(d, a.x, f.y), c++, d++) : b.V(d - 1, a.x, f.y), K.D(h.x, b.l(d + 2).x) && !K.D(h.y, b.l(d + 2).y) ? b.w(d + 1, a.x, h.y) : b.V(d + 1, a.x, h.y)) : K.D(f.y, e.y) && K.D(e.y, + h.y) && (K.D(f.y, b.l(d - 2).y) && !K.D(f.x, b.l(d - 2).x) ? (b.w(d, f.x, a.y), c++, d++) : b.V(d - 1, f.x, a.y), K.D(h.y, b.l(d + 2).y) && !K.D(h.x, b.l(d + 2).x) ? b.w(d + 1, h.x, a.y) : b.V(d + 1, h.x, a.y)); + b.V(c, a.x, a.y) + } else b.V(c, a.x, a.y), 1 === c && b.computeSpot(!0).ne() && (e = b.W, f = b.od, null === e || e.Ea() || (e = e.findVisibleNode(), e !== b.W && (f = e.Xk(""))), d = f.lb(Ib, u.K()), e = b.getLinkPointFromPoint(e, f, d, a, !0, u.K()), b.V(0, e.x, e.y), u.v(d), u.v(e)), c === b.ka - 2 && b.computeSpot(!1).ne() && (c = b.ca, e = b.fe, null === c || c.Ea() || (c = c.findVisibleNode(), c !== b.ca && + (e = c.Xk(""))), d = e.lb(Ib, u.K()), e = b.getLinkPointFromPoint(c, e, d, a, !1, u.K()), b.V(b.ka - 1, e.x, e.y), u.v(d), u.v(e)); + b.Bi() + }; + fh.prototype.computeReshape = function (a) { + var b = this.fs, c = this.handle.Pf; + switch (this.AD(this.handle)) { + case jh: + return a; + case ih: + return b = b.l(c), new w(b.x, a.y); + case hh: + return b = b.l(c), new w(a.x, b.y); + default: + case gh: + return b.l(c) + } + }; + u.u(fh, {hK: "originalPoint"}, function () { + return this.RB + }); + u.u(fh, {iK: "originalPoints"}, function () { + return this.my + }); + + function mh() { + 0 < arguments.length && u.Wc(mh); + xe.call(this); + this.name = "Resizing"; + this.nj = (new ia(1, 1)).freeze(); + this.lj = (new ia(9999, 9999)).freeze(); + this.Ti = (new ia(NaN, NaN)).freeze(); + this.iq = !1; + this.Gb = null; + var a = new X; + a.Hj = Ib; + a.Fb = "Rectangle"; + a.xa = K.mp; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.hb = 1; + a.cursor = "pointer"; + this.pk = a; + this.Yb = null; + this.Tu = new ia; + this.ly = new w; + this.Jx = new ia(0, 0); + this.Ix = new ia(Infinity, Infinity); + this.Hx = new ia(1, 1); + this.KB = !0 + } + + u.Ga(mh, xe); + u.fa("ResizingTool", mh); + mh.prototype.updateAdornments = function (a) { + if (!(null === a || a instanceof W)) { + if (a.Za && !this.g.nb) { + var b = a.sE; + if (null !== b && a.canResize() && a.ba.J() && a.Ea() && b.ba.J() && b.kl()) { + var c = a.xo(this.name); + null === c && (c = this.makeAdornment(b)); + if (null !== c) { + var d = b.Zk(); + c.angle = d; + var e = b.lb(c.Ze, u.K()), f = b.Hi(); + c.location = e; + u.v(e); + e = c.placeholder; + if (null !== e) { + var b = b.Ha, h = u.ul(); + h.m(b.width * f, b.height * f); + e.xa = h; + u.Oj(h) + } + nh(this, c, d); + a.Kk(this.name, c); + return + } + } + } + a.ol(this.name) + } + }; + mh.prototype.makeAdornment = function (a) { + var b = null, b = a.T.rE; + if (null === b) { + b = new lf; + b.type = oh; + b.Ze = Ib; + var c = new ph; + c.tg = !0; + b.add(c); + b.add(this.makeHandle(a, xb)); + b.add(this.makeHandle(a, Gb)); + b.add(this.makeHandle(a, Vb)); + b.add(this.makeHandle(a, Kb)); + b.add(this.makeHandle(a, vc)); + b.add(this.makeHandle(a, xc)); + b.add(this.makeHandle(a, Cc)); + b.add(this.makeHandle(a, wc)) + } else if (nf(b), b = b.copy(), null === b) return null; + b.Kc = this.name; + b.vc = a; + return b + }; + mh.prototype.makeHandle = function (a, b) { + var c = this.Hs; + if (null === c) return null; + c = c.copy(); + c.alignment = b; + return c + }; + + function nh(a, b, c) { + if (null !== b) if (!b.alignment.Lc() && "" !== b.cursor) a:{ + a = b.alignment; + a.ne() && (a = Ib); + if (0 >= a.x) c = 0 >= a.y ? c + 225 : 1 <= a.y ? c + 135 : c + 180; else if (1 <= a.x) 0 >= a.y ? c += 315 : 1 <= a.y && (c += 45); else if (0 >= a.y) c += 270; else if (1 <= a.y) c += 90; else break a; + 0 > c ? c += 360 : 360 <= c && (c -= 360); + b.cursor = 22.5 > c ? "e-resize" : 67.5 > c ? "se-resize" : 112.5 > c ? "s-resize" : 157.5 > c ? "sw-resize" : 202.5 > c ? "w-resize" : 247.5 > c ? "nw-resize" : 292.5 > c ? "n-resize" : 337.5 > c ? "ne-resize" : "e-resize" + } else if (b instanceof A) for (b = b.elements; b.next();) nh(a, + b.value, c) + } + + u.defineProperty(mh, {Hs: "handleArchetype"}, function () { + return this.pk + }, function (a) { + null !== a && u.C(a, S, mh, "handleArchetype"); + this.pk = a + }); + u.u(mh, {handle: "handle"}, function () { + return this.Yb + }); + u.defineProperty(mh, {vc: "adornedObject"}, function () { + return this.Gb + }, function (a) { + null !== a && u.C(a, S, mh, "adornedObject"); + this.Gb = a + }); + mh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null !== a && !a.nb && a.hs && a.N.left ? null !== this.findToolHandleAt(a.wc.da, this.name) ? !0 : !1 : !1 + }; + mh.prototype.doActivate = function () { + var a = this.g; + null !== a && (this.Yb = this.findToolHandleAt(a.wc.da, this.name), null !== this.Yb && (this.Gb = this.Yb.T.vc, this.ly.set(this.Gb.T.location), this.Tu.set(this.Gb.xa), this.Hx = this.computeCellSize(), this.Jx = this.computeMinSize(), this.Ix = this.computeMaxSize(), a.Ge = !0, this.KB = a.Lb.isEnabled, a.Lb.isEnabled = !1, this.Wb(this.name), this.na = !0)) + }; + mh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (this.Uj(), this.Gb = this.Yb = null, this.na = a.Ge = !1, a.Lb.isEnabled = this.KB) + }; + mh.prototype.doCancel = function () { + this.Gb.xa = this.Tu; + this.Gb.T.location = this.ly; + this.stopTool() + }; + mh.prototype.doMouseMove = function () { + var a = this.g; + if (this.na && null !== a) { + var b = this.Jx, c = this.Ix, d = this.Hx, e = this.Gb.zD(a.N.da, u.K()), f = qh; + this.Gb instanceof X && (f = rh(this.Gb)); + b = this.computeResize(e, this.Yb.alignment, b, c, d, !(f === sh || f === th || a.N.shift)); + this.resize(b); + a.bf(); + u.v(e) + } + }; + mh.prototype.doMouseUp = function () { + var a = this.g; + if (this.na && null !== a) { + var b = this.Jx, c = this.Ix, d = this.Hx, e = this.Gb.zD(a.N.da, u.K()), f = qh; + this.Gb instanceof X && (f = rh(this.Gb)); + b = this.computeResize(e, this.Yb.alignment, b, c, d, !(f === sh || f === th || a.N.shift)); + this.resize(b); + u.v(e); + a.pc(); + this.zf = this.name; + a.za("PartResized", this.Gb, this.Tu) + } + this.stopTool() + }; + mh.prototype.resize = function (a) { + if (null !== this.g) { + var b = this.vc, c = b.T, d = b.Zk(), e = b.Hi(), f = Math.PI * d / 180, h = Math.cos(f), f = Math.sin(f), + k = 0 < d && 180 > d ? 1 : 0, l = 90 < d && 270 > d ? 1 : 0, d = 180 < d && 360 > d ? 1 : 0, + m = b.Ha.width, n = b.Ha.height; + b.xa = a.size; + var p = c.position.copy(); + c.pf(); + m = b.Ha.width - m; + n = b.Ha.height - n; + if (0 !== m || 0 !== n) 0 !== m && (p.x += e * ((a.x + m * l) * h - (a.y + n * k) * f)), 0 !== n && (p.y += e * ((a.x + m * d) * f + (a.y + n * l) * h)), c.move(p) + } + }; + mh.prototype.computeResize = function (a, b, c, d, e, f) { + b.ne() && (b = Ib); + var h = this.vc.Ha, k = h.x, l = h.y, m = h.x + h.width, n = h.y + h.height, p = 1; + if (!f) { + var p = h.width, q = h.height; + 0 >= p && (p = 1); + 0 >= q && (q = 1); + p = q / p + } + q = u.K(); + K.xs(a.x, a.y, k, l, e.width, e.height, q); + a = h.copy(); + 0 >= b.x ? 0 >= b.y ? (a.x = Math.max(q.x, m - d.width), a.x = Math.min(a.x, m - c.width), a.width = Math.max(m - a.x, c.width), a.y = Math.max(q.y, n - d.height), a.y = Math.min(a.y, n - c.height), a.height = Math.max(n - a.y, c.height), f || (b = a.height / a.width, p < b ? (a.height = p * a.width, a.y = n - a.height) : + (a.width = a.height / p, a.x = m - a.width))) : 1 <= b.y ? (a.x = Math.max(q.x, m - d.width), a.x = Math.min(a.x, m - c.width), a.width = Math.max(m - a.x, c.width), a.height = Math.max(Math.min(q.y - l, d.height), c.height), f || (b = a.height / a.width, p < b ? a.height = p * a.width : (a.width = a.height / p, a.x = m - a.width))) : (a.x = Math.max(q.x, m - d.width), a.x = Math.min(a.x, m - c.width), a.width = m - a.x, f || (a.height = p * a.width, a.y = l + .5 * (n - l - a.height))) : 1 <= b.x ? 0 >= b.y ? (a.width = Math.max(Math.min(q.x - k, d.width), c.width), a.y = Math.max(q.y, n - d.height), a.y = Math.min(a.y, n - + c.height), a.height = Math.max(n - a.y, c.height), f || (b = a.height / a.width, p < b ? (a.height = p * a.width, a.y = n - a.height) : a.width = a.height / p)) : 1 <= b.y ? (a.width = Math.max(Math.min(q.x - k, d.width), c.width), a.height = Math.max(Math.min(q.y - l, d.height), c.height), f || (b = a.height / a.width, p < b ? a.height = p * a.width : a.width = a.height / p)) : (a.width = Math.max(Math.min(q.x - k, d.width), c.width), f || (a.height = p * a.width, a.y = l + .5 * (n - l - a.height))) : 0 >= b.y ? (a.y = Math.max(q.y, n - d.height), a.y = Math.min(a.y, n - c.height), a.height = n - a.y, f || (a.width = a.height / + p, a.x = k + .5 * (m - k - a.width))) : 1 <= b.y && (a.height = Math.max(Math.min(q.y - l, d.height), c.height), f || (a.width = a.height / p, a.x = k + .5 * (m - k - a.width))); + u.v(q); + return a + }; + mh.prototype.computeMinSize = function () { + var a = this.vc.vg.copy(), b = this.vg; + !isNaN(b.width) && b.width > a.width && (a.width = b.width); + !isNaN(b.height) && b.height > a.height && (a.height = b.height); + return a + }; + mh.prototype.computeMaxSize = function () { + var a = this.vc.af.copy(), b = this.af; + !isNaN(b.width) && b.width < a.width && (a.width = b.width); + !isNaN(b.height) && b.height < a.height && (a.height = b.height); + return a + }; + mh.prototype.computeCellSize = function () { + var a = new ia(NaN, NaN), b = this.vc.T; + if (null !== b) { + var c = b.VH; + !isNaN(c.width) && 0 < c.width && (a.width = c.width); + !isNaN(c.height) && 0 < c.height && (a.height = c.height) + } + c = this.qo; + isNaN(a.width) && !isNaN(c.width) && 0 < c.width && (a.width = c.width); + isNaN(a.height) && !isNaN(c.height) && 0 < c.height && (a.height = c.height); + b = this.g; + (isNaN(a.width) || isNaN(a.height)) && b && (c = b.tb.Ed, null !== c && c.gw && (c = c.DD, isNaN(a.width) && !isNaN(c.width) && 0 < c.width && (a.width = c.width), isNaN(a.height) && !isNaN(c.height) && + 0 < c.height && (a.height = c.height)), b = b.Gs, null !== b && b.visible && this.gw && (c = b.aw, isNaN(a.width) && !isNaN(c.width) && 0 < c.width && (a.width = c.width), isNaN(a.height) && !isNaN(c.height) && 0 < c.height && (a.height = c.height))); + if (isNaN(a.width) || 0 === a.width || Infinity === a.width) a.width = 1; + if (isNaN(a.height) || 0 === a.height || Infinity === a.height) a.height = 1; + return a + }; + u.defineProperty(mh, {vg: "minSize"}, function () { + return this.nj + }, function (a) { + u.C(a, ia, mh, "minSize"); + if (!this.nj.L(a)) { + var b = a.width; + isNaN(b) && (b = 0); + a = a.height; + isNaN(a) && (a = 0); + this.nj.m(b, a) + } + }); + u.defineProperty(mh, {af: "maxSize"}, function () { + return this.lj + }, function (a) { + u.C(a, ia, mh, "maxSize"); + if (!this.lj.L(a)) { + var b = a.width; + isNaN(b) && (b = Infinity); + a = a.height; + isNaN(a) && (a = Infinity); + this.lj.m(b, a) + } + }); + u.defineProperty(mh, {qo: "cellSize"}, function () { + return this.Ti + }, function (a) { + u.C(a, ia, mh, "cellSize"); + this.Ti.L(a) || this.Ti.assign(a) + }); + u.defineProperty(mh, {gw: "isGridSnapEnabled"}, function () { + return this.iq + }, function (a) { + u.j(a, "boolean", mh, "isGridSnapEnabled"); + this.iq = a + }); + u.u(mh, {fK: "originalDesiredSize"}, function () { + return this.Tu + }); + u.u(mh, {gK: "originalLocation"}, function () { + return this.ly + }); + + function uh() { + 0 < arguments.length && u.Wc(uh); + xe.call(this); + this.name = "Rotating"; + this.gC = 45; + this.fC = 2; + this.Gb = null; + var a = new X; + a.Fb = "Ellipse"; + a.xa = K.Qw; + a.fill = "lightblue"; + a.stroke = "dodgerblue"; + a.hb = 1; + a.cursor = "pointer"; + this.pk = a; + this.Yb = null; + this.Su = 0; + this.aC = new w + } + + u.Ga(uh, xe); + u.fa("RotatingTool", uh); + uh.prototype.updateAdornments = function (a) { + if (!(null === a || a instanceof W)) { + if (a.Za && !this.g.nb) { + var b = a.vE; + if (null !== b && a.canRotate() && a.ba.J() && a.Ea() && b.ba.J() && b.kl()) { + var c = a.xo(this.name); + null === c && (c = this.makeAdornment(b)); + if (null !== c) { + c.angle = b.Zk(); + var d = null, e = null; + b === a || b === a.ec ? (d = a.ec, e = a.Ze) : (d = b, e = Ib); + for (var f = d.Ha, e = u.fc(f.width * e.x + e.offsetX, f.height * e.y + e.offsetY); null !== d && d !== b;) d.transform.ab(e), d = d.S; + var d = e.y, f = Math.max(e.x - b.Ha.width, 0), h = u.K(); + c.location = b.lb(new L(1, 0, 50 + + f, d), h); + u.v(h); + u.v(e); + a.Kk(this.name, c); + return + } + } + } + a.ol(this.name) + } + }; + uh.prototype.makeAdornment = function (a) { + var b = null, b = a.T.YH; + if (null === b) { + b = new lf; + b.type = vh; + b.Ze = Ib; + var c = this.Hs; + null !== c && b.add(c.copy()) + } else if (nf(b), b = b.copy(), null === b) return null; + b.Kc = this.name; + b.vc = a; + return b + }; + u.defineProperty(uh, {Hs: "handleArchetype"}, function () { + return this.pk + }, function (a) { + null !== a && u.C(a, S, uh, "handleArchetype"); + this.pk = a + }); + u.u(uh, {handle: "handle"}, function () { + return this.Yb + }); + u.defineProperty(uh, {vc: "adornedObject"}, function () { + return this.Gb + }, function (a) { + null !== a && u.C(a, S, uh, "adornedObject"); + this.Gb = a + }); + uh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null !== a && !a.nb && a.Dv && a.N.left ? null !== this.findToolHandleAt(a.wc.da, this.name) ? !0 : !1 : !1 + }; + uh.prototype.doActivate = function () { + var a = this.g; + if (null !== a && (this.Yb = this.findToolHandleAt(a.wc.da, this.name), null !== this.Yb)) { + this.Gb = this.Yb.T.vc; + var b = this.Gb.T, c = b.ec; + this.aC = this.Gb === b || this.Gb === c ? c.lb(b.Ze) : this.Gb.lb(Ib); + this.Su = this.Gb.angle; + a.Ge = !0; + a.az = !0; + this.Wb(this.name); + this.na = !0 + } + }; + uh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (this.Uj(), this.Gb = this.Yb = null, this.na = a.Ge = !1) + }; + uh.prototype.doCancel = function () { + var a = this.g; + null !== a && (a.az = !1); + this.rotate(this.Su); + this.stopTool() + }; + uh.prototype.doMouseMove = function () { + var a = this.g; + this.na && null !== a && (a = this.computeRotate(a.N.da), this.rotate(a)) + }; + uh.prototype.doMouseUp = function () { + var a = this.g; + if (this.na && null !== a) { + a.az = !1; + var b = this.computeRotate(a.N.da); + this.rotate(b); + a.pc(); + this.zf = this.name; + a.za("PartRotated", this.Gb, this.Su) + } + this.stopTool() + }; + uh.prototype.rotate = function (a) { + null !== this.Gb && (this.Gb.angle = a) + }; + uh.prototype.computeRotate = function (a) { + a = this.aC.Fi(a); + var b = this.Gb.S; + null !== b && (a -= b.Zk(), 360 <= a ? a -= 360 : 0 > a && (a += 360)); + var b = Math.min(Math.abs(this.mI), 180), c = Math.min(Math.abs(this.lI), b / 2); + !this.g.N.shift && 0 < b && 0 < c && (a % b < c ? a = Math.floor(a / b) * b : a % b > b - c && (a = (Math.floor(a / b) + 1) * b)); + 360 <= a ? a -= 360 : 0 > a && (a += 360); + return a + }; + u.defineProperty(uh, {mI: "snapAngleMultiple"}, function () { + return this.gC + }, function (a) { + u.j(a, "number", uh, "snapAngleMultiple"); + this.gC = a + }); + u.defineProperty(uh, {lI: "snapAngleEpsilon"}, function () { + return this.fC + }, function (a) { + u.j(a, "number", uh, "snapAngleEpsilon"); + this.fC = a + }); + u.u(uh, {eK: "originalAngle"}, function () { + return this.Su + }); + + function wh() { + 0 < arguments.length && u.Wc(wh); + xe.call(this); + this.name = "ClickSelecting" + } + + u.Ga(wh, xe); + u.fa("ClickSelectingTool", wh); + wh.prototype.canStart = function () { + return !this.isEnabled || null === this.g || this.isBeyondDragSize() ? !1 : !0 + }; + wh.prototype.doMouseUp = function () { + this.na && (this.standardMouseSelect(), this.standardMouseClick()); + this.stopTool() + }; + + function xh() { + 0 < arguments.length && u.Wc(xh); + xe.call(this); + this.name = "Action"; + this.Um = null + } + + u.Ga(xh, xe); + u.fa("ActionTool", xh); + xh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a) return !1; + var b = a.N, c = a.ke(b.da, function (a) { + for (; null !== a.S && !a.pz;) a = a.S; + return a + }, function (a) { + return a.pz + }); + return null !== c ? (this.Um = c, a.en = a.ke(b.da, null, null), !0) : !1 + }; + xh.prototype.doMouseDown = function () { + if (this.na) { + var a = this.g.N, b = this.Um; + null !== b && (a.pe = b, null !== b.HC && b.HC(a, b)) + } else this.canStart() && this.doActivate() + }; + xh.prototype.doMouseMove = function () { + if (this.na) { + var a = this.g.N, b = this.Um; + null !== b && (a.pe = b, null !== b.IC && b.IC(a, b)) + } + }; + xh.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g, b = a.N, c = this.Um; + if (null === c) return; + b.pe = c; + null !== c.JC && c.JC(b, c); + this.isBeyondDragSize() || zf(c, b, a) + } + this.stopTool() + }; + xh.prototype.doCancel = function () { + var a = this.g; + if (null !== a) { + var a = a.N, b = this.Um; + if (null === b) return; + a.pe = b; + null !== b.GC && b.GC(a, b) + } + this.stopTool() + }; + xh.prototype.doStop = function () { + this.Um = null + }; + + function va() { + 0 < arguments.length && u.Wc(va); + xe.call(this); + this.name = "ClickCreating"; + this.ik = null; + this.qB = !0; + this.fB = new w(0, 0) + } + + u.Ga(va, xe); + u.fa("ClickCreatingTool", va); + va.prototype.canStart = function () { + if (!this.isEnabled || null === this.Oy) return !1; + var a = this.g; + if (null === a || a.nb || a.uf || !a.lo || !a.N.left || this.isBeyondDragSize()) return !1; + if (this.ZG) { + if (1 === a.N.Te && (this.fB = a.N.ff.copy()), 2 !== a.N.Te || this.isBeyondDragSize(this.fB)) return !1 + } else if (1 !== a.N.Te) return !1; + return a.Va !== this && null !== a.zs(a.N.da, !0) ? !1 : !0 + }; + va.prototype.doMouseUp = function () { + var a = this.g; + this.na && null !== a && this.insertPart(a.N.da); + this.stopTool() + }; + va.prototype.insertPart = function (a) { + var b = this.g; + if (null === b) return null; + var c = this.Oy; + if (null === c) return null; + this.Wb(this.name); + var d = null; + c instanceof G ? c.Fd() && (nf(c), d = c.copy(), null !== d && b.add(d)) : null !== c && (c = b.ga.copyNodeData(c), u.Sa(c) && (b.ga.km(c), d = b.Nh(c))); + null !== d && (d.location = a, b.of && b.select(d)); + b.pc(); + this.zf = this.name; + b.za("PartCreated", d); + this.Uj(); + return d + }; + u.defineProperty(va, {Oy: "archetypeNodeData"}, function () { + return this.ik + }, function (a) { + null !== a && u.C(a, Object, va, "archetypeNodeData"); + this.ik = a + }); + u.defineProperty(va, {ZG: "isDoubleClick"}, function () { + return this.qB + }, function (a) { + u.j(a, "boolean", va, "isDoubleClick"); + this.qB = a + }); + + function Hh(a, b, c) { + this.text = a; + this.ZC = b; + this.visible = c + } + + function Ih() { + 0 < arguments.length && u.Wc(Ih); + xe.call(this); + this.name = "ContextMenu"; + this.fn = this.OA = null; + this.HB = new w; + this.xx = this.on = null; + Jh(this) + } + + u.Ga(Ih, xe); + u.fa("ContextMenuTool", Ih); + u.hD = !1; + u.ms = null; + u.ns = null; + + function Jh(a) { + a.on = new lf; + a.xC = function () { + a.stopTool() + }; + if (!1 === u.hD) { + var b = u.createElement("div"), c = u.createElement("div"); + b.style.cssText = "top: 0px;z-index:300;position: fixed;display: none;text-align: center;left: 25%;width: 50%;background-color: #F5F5F5;padding: 16px;border: 16px solid #444;border-radius: 10px;margin-top: 10px"; + c.style.cssText = "z-index:299;position: fixed;display: none;top: 0;left: 0;width: 100%;height: 100%;background-color: black;-moz-opacity: 0.8;opacity:.80;filter: alpha(opacity=80);"; + var d = + u.createElement("style"); + window.document.getElementsByTagName("head")[0].appendChild(d); + d.sheet.insertRule(".defaultCXul { list-style: none; }", 0); + d.sheet.insertRule(".defaultCXli {font:700 1.5em Helvetica, Arial, sans-serif;position: relative;min-width: 60px; }", 0); + d.sheet.insertRule(".defaultCXa {color: #444;display: inline-block;padding: 4px;text-decoration: none;margin: 2px;border: 1px solid gray;border-radius: 10px; }", 0); + b.addEventListener("contextmenu", function (a) { + a.preventDefault(); + return !1 + }, + !1); + b.addEventListener("selectstart", function (a) { + a.preventDefault(); + return !1 + }, !1); + c.addEventListener("contextmenu", function (a) { + a.preventDefault(); + return !1 + }, !1); + window.document.body && (window.document.body.appendChild(b), window.document.body.appendChild(c)); + u.ns = b; + u.ms = c; + u.hD = !0 + } + } + + Ih.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null === a || this.isBeyondDragSize() || !a.N.right ? !1 : null !== this.on && a.N.jl || null !== this.findObjectWithContextMenu() ? !0 : !1 + }; + Ih.prototype.doStart = function () { + var a = this.g; + null !== a && this.HB.set(a.wc.da) + }; + Ih.prototype.doStop = function () { + this.hideDefaultContextMenu(); + this.hideContextMenu(); + this.fn = null + }; + Ih.prototype.findObjectWithContextMenu = function (a) { + void 0 === a && (a = null); + var b = this.g; + if (null === b) return null; + var c = b.N, d = null; + a instanceof D || (d = a instanceof S ? a : b.ke(c.da, null, function (a) { + return !a.layer.Ac + })); + if (null !== d) { + for (a = d; null !== a;) { + c = a.contextMenu; + if (null !== c) return a; + a = a.S + } + if (null !== this.on && b.N.jl) return d.T + } else if (c = b.contextMenu, null !== c) return b; + return null + }; + Ih.prototype.doActivate = function () { + }; + Ih.prototype.doMouseUp = function () { + var a = this.g; + null !== a && (this.na ? null !== this.Hf && (a = a.ke(a.N.da, null, null), null !== a && a.gl(this.Hf) && this.standardMouseClick(null, null), this.stopTool()) : this.canStart() && xf(this, !0)) + }; + + function xf(a, b, c) { + void 0 === c && (c = null); + a.na = !0; + b && a.standardMouseSelect(); + a.standardMouseClick(); + a.fn = null; + null === c && (c = a.findObjectWithContextMenu()); + null !== c ? (b = c.contextMenu, null !== b ? (a.fn = c instanceof S ? c : null, a.showContextMenu(b, a.fn)) : a.showDefaultContextMenu()) : a.showDefaultContextMenu() + } + + Ih.prototype.doMouseMove = function () { + this.na && this.standardMouseOver() + }; + Ih.prototype.showContextMenu = function (a, b) { + u.C(a, lf, Ih, "showContextMenu:contextmenu"); + null !== b && u.C(b, S, Ih, "showContextMenu:obj"); + var c = this.g; + if (null !== c) { + a !== this.Hf && this.hideContextMenu(); + a.wf = "Tool"; + a.pl = !1; + a.scale = 1 / c.scale; + a.Kc = this.name; + c.add(a); + if (null !== b) { + var c = null, d = b.zo(); + null !== d && (c = d.data); + a.vc = b; + a.data = c + } else a.data = c.ga; + a.pf(); + this.positionContextMenu(a, b); + this.Hf = a + } + }; + Ih.prototype.positionContextMenu = function (a) { + if (null === a.placeholder) { + var b = this.g; + if (null !== b) { + var c = b.N.da.copy(), d = a.Ba, e = b.ob; + b.N.jl && (c.x -= d.width); + c.x + d.width > e.right && (c.x -= d.width + 5); + c.x < e.x && (c.x = e.x); + c.y + d.height > e.bottom && (c.y -= d.height + 5); + c.y < e.y && (c.y = e.y); + a.position = c + } + } + }; + Ih.prototype.hideContextMenu = function () { + var a = this.g; + null !== a && null !== this.Hf && (this.Hf.data = null, this.Hf.vc = null, a.remove(this.Hf), this.Hf = null, this.standardMouseOver()) + }; + Ih.prototype.initializeDefaultButtons = function () { + if (null === this.g) return null; + var a = new E(Hh); + a.add(new Hh("Copy", function (a) { + a.Eb.copySelection() + }, function (a) { + return a.Eb.canCopySelection() + })); + a.add(new Hh("Cut", function (a) { + a.Eb.cutSelection() + }, function (a) { + return a.Eb.canCutSelection() + })); + a.add(new Hh("Delete", function (a) { + a.Eb.deleteSelection() + }, function (a) { + return a.Eb.canDeleteSelection() + })); + a.add(new Hh("Paste", function (a) { + a.Eb.pasteSelection(a.N.da) + }, function (a) { + return a.Eb.canPasteSelection() + })); + a.add(new Hh("Select All", function (a) { + a.Eb.selectAll() + }, function (a) { + return a.Eb.canSelectAll() + })); + a.add(new Hh("Undo", function (a) { + a.Eb.undo() + }, function (a) { + return a.Eb.canUndo() + })); + a.add(new Hh("Redo", function (a) { + a.Eb.redo() + }, function (a) { + return a.Eb.canRedo() + })); + a.add(new Hh("Zoom To Fit", function (a) { + a.Eb.zoomToFit() + }, function (a) { + return a.Eb.canZoomToFit() + })); + a.add(new Hh("Reset Zoom", function (a) { + a.Eb.resetZoom() + }, function (a) { + return a.Eb.canResetZoom() + })); + a.add(new Hh("Group Selection", function (a) { + a.Eb.groupSelection() + }, + function (a) { + return a.Eb.canGroupSelection() + })); + a.add(new Hh("Ungroup Selection", function (a) { + a.Eb.ungroupSelection() + }, function (a) { + return a.Eb.canUngroupSelection() + })); + a.add(new Hh("Edit Text", function (a) { + a.Eb.editTextBlock() + }, function (a) { + return a.Eb.canEditTextBlock() + })); + return a + }; + Ih.prototype.showDefaultContextMenu = function () { + var a = this.g; + if (null !== a) { + null === this.xx && (this.xx = this.initializeDefaultButtons()); + this.on !== this.Hf && this.hideContextMenu(); + u.ns.innerHTML = ""; + u.ms.addEventListener("click", this.xC, !1); + var b = this, c = u.createElement("ul"); + c.className = "defaultCXul"; + u.ns.appendChild(c); + c.innerHTML = ""; + for (var d = this.xx.i; d.next();) { + var e = d.value, f = e.text, h = e.visible; + if ("function" === typeof e.ZC && ("function" !== typeof h || h(a))) { + h = u.createElement("li"); + h.className = "defaultCXli"; + var k = u.createElement("a"); + k.className = "defaultCXa"; + k.href = "#"; + k.nF = e.ZC; + k.addEventListener("click", function (c) { + this.nF(a); + b.stopTool(); + c.preventDefault(); + return !1 + }, !1); + k.textContent = f; + h.appendChild(k); + c.appendChild(h) + } + } + u.ns.style.display = "block"; + u.ms.style.display = "block"; + this.Hf = this.on + } + }; + Ih.prototype.hideDefaultContextMenu = function () { + null !== this.Hf && this.Hf === this.on && (u.ns.style.display = "none", u.ms.style.display = "none", u.ms.removeEventListener("click", this.xC, !1), this.Hf = null) + }; + u.defineProperty(Ih, {Hf: "currentContextMenu"}, function () { + return this.OA + }, function (a) { + null !== a && u.C(a, lf, Ih, "currentContextMenu"); + this.OA = a + }); + u.defineProperty(Ih, {hJ: "currentObject"}, function () { + return this.fn + }, function (a) { + null !== a && u.C(a, S, Ih, "currentObject"); + this.fn = a + }); + u.u(Ih, {$J: "mouseDownPoint"}, function () { + return this.HB + }); + + function Kh() { + 0 < arguments.length && u.Wc(Kh); + xe.call(this); + this.name = "DragSelecting"; + this.pn = 175; + this.vB = !1; + var a = new G; + a.wf = "Tool"; + a.pl = !1; + var b = new X; + b.name = "SHAPE"; + b.Fb = "Rectangle"; + b.fill = null; + b.stroke = "magenta"; + a.add(b); + this.zl = a + } + + u.Ga(Kh, xe); + u.fa("DragSelectingTool", Kh); + Kh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || !a.of) return !1; + var b = a.N; + return !b.left || a.Va !== this && (!this.isBeyondDragSize() || b.timestamp - a.wc.timestamp < this.iD || null !== a.zs(b.da, !0)) ? !1 : !0 + }; + Kh.prototype.doActivate = function () { + var a = this.g; + null !== a && (this.na = !0, a.Ge = !0, a.cb = !0, a.add(this.Tg), this.doMouseMove()) + }; + Kh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (a.remove(this.Tg), a.cb = !1, this.na = a.Ge = !1) + }; + Kh.prototype.doMouseMove = function () { + if (null !== this.g && this.na && null !== this.Tg) { + var a = this.computeBoxBounds(), b = this.Tg.je("SHAPE"); + null === b && (b = this.Tg.If()); + b.xa = a.size; + this.Tg.position = a.position + } + }; + Kh.prototype.doMouseUp = function () { + if (this.na) { + var a = this.g; + a.remove(this.Tg); + try { + a.ac = "wait", this.selectInRect(this.computeBoxBounds()) + } finally { + a.ac = "" + } + } + this.stopTool() + }; + Kh.prototype.computeBoxBounds = function () { + var a = this.g; + return null === a ? new z(0, 0, 0, 0) : new z(a.wc.da, a.N.da) + }; + Kh.prototype.selectInRect = function (a) { + var b = this.g; + if (null !== b) { + var c = b.N; + b.za("ChangingSelection"); + a = b.Nj(a, null, function (a) { + return a instanceof G ? a.canSelect() : !1 + }, this.hH); + if (u.Em ? c.Ys : c.control) if (c.shift) for (a = a.i; a.next();) c = a.value, c.Za && (c.Za = !1); else for (a = a.i; a.next();) c = a.value, c.Za = !c.Za; else { + if (!c.shift) { + for (var c = new E(G), d = b.selection.i; d.next();) { + var e = d.value; + a.contains(e) || c.add(e) + } + for (c = c.i; c.next();) c.value.Za = !1 + } + for (a = a.i; a.next();) c = a.value, c.Za || (c.Za = !0) + } + b.za("ChangedSelection") + } + }; + u.defineProperty(Kh, {iD: "delay"}, function () { + return this.pn + }, function (a) { + u.j(a, "number", Kh, "delay"); + this.pn = a + }); + u.defineProperty(Kh, {hH: "isPartialInclusion"}, function () { + return this.vB + }, function (a) { + u.j(a, "boolean", Kh, "isPartialInclusion"); + this.vB = a + }); + u.defineProperty(Kh, {Tg: "box"}, function () { + return this.zl + }, function (a) { + null !== a && u.C(a, G, Kh, "box"); + this.zl = a + }); + + function Lh() { + 0 < arguments.length && u.Wc(Lh); + xe.call(this); + this.name = "Panning"; + this.ny = new w; + this.Si = !1; + var a = this; + this.lC = function () { + window.document.removeEventListener("scroll", a.lC, !1); + a.stopTool() + } + } + + u.Ga(Lh, xe); + u.fa("PanningTool", Lh); + Lh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + return null === a || !a.Re && !a.Se || !a.N.left || a.Va !== this && !this.isBeyondDragSize() ? !1 : !0 + }; + Lh.prototype.doActivate = function () { + var a = this.g; + null !== a && (this.Si ? (a.N.bubbles = !0, window.document.addEventListener("scroll", this.lC, !1)) : (a.ac = "move", a.Ge = !0, this.ny = a.position.copy()), this.na = !0) + }; + Lh.prototype.doDeactivate = function () { + var a = this.g; + null !== a && (a.ac = "", this.na = a.Ge = !1) + }; + Lh.prototype.doCancel = function () { + var a = this.g; + null !== a && (a.position = this.ny, a.Ge = !1); + this.stopTool() + }; + Lh.prototype.doMouseMove = function () { + this.move() + }; + Lh.prototype.doMouseUp = function () { + this.move(); + this.stopTool() + }; + Lh.prototype.move = function () { + var a = this.g; + if (this.na && a) if (this.Si) a.N.bubbles = !0; else { + var b = a.position, c = a.wc.da, d = a.N.da, e = b.x + c.x - d.x, c = b.y + c.y - d.y; + a.Re || (e = b.x); + a.Se || (c = b.y); + a.position = new w(e, c) + } + }; + u.defineProperty(Lh, {bubbles: "bubbles"}, function () { + return this.Si + }, function (a) { + u.j(a, "boolean", Lh, "bubbles"); + this.Si = a + }); + u.u(Lh, {jK: "originalPosition"}, function () { + return this.ny + }); + + function Mh() { + 0 < arguments.length && u.Wc(Mh); + xe.call(this); + this.name = "TextEditing"; + this.pC = null; + this.Qx = 0; + this.RA = this.pv = null; + this.kC = Nh; + this.Hk = null; + this.Xa = Oh; + this.Dk = null; + this.EB = 1; + this.dC = !0; + var a = u.createElement("textarea"); + a.AA = !0; + this.WA = a; + a.addEventListener("input", function () { + var a = this.textEditingTool, c = a.pC; + c.text = this.value; + Ph(c, a.Qx, Infinity); + this.rows = c.oH + }, !1); + a.addEventListener("keydown", function (a) { + var c = a.which, d = this.textEditingTool; + if (null !== d) if (13 === c) !1 === d.pv.iw && a.preventDefault(), + d.acceptText(Qh); else { + if (9 === c) return d.acceptText(Rh), a.preventDefault(), !1; + 27 === c && (d.doCancel(), null !== d.g && d.g.focus()) + } + }, !1); + a.addEventListener("focus", function () { + var a = this.textEditingTool; + a.Xa === Sh ? a.Xa = Th : a.Xa === Uh ? a.Xa = Vh : a.Xa === Vh && (a.Xa = Th); + "function" === typeof this.select && a.$z && this.select() + }, !1); + a.addEventListener("blur", function () { + "function" === typeof this.focus && this.focus(); + var a = this.textEditingTool; + "function" === typeof this.select && a.$z && this.select() + }, !1) + } + + u.fa("TextEditingTool", Mh); + u.Ga(Mh, xe); + var Wh; + Mh.LostFocus = Wh = u.s(Mh, "LostFocus", 0); + var Xh; + Mh.MouseDown = Xh = u.s(Mh, "MouseDown", 1); + var Rh; + Mh.Tab = Rh = u.s(Mh, "Tab", 2); + var Qh; + Mh.Enter = Qh = u.s(Mh, "Enter", 3); + Mh.SingleClick = u.s(Mh, "SingleClick", 0); + var Nh; + Mh.SingleClickSelected = Nh = u.s(Mh, "SingleClickSelected", 1); + var Oh = u.s(Mh, "StateNone", 0), Sh = u.s(Mh, "StateActive", 1), Th = u.s(Mh, "StateEditing", 2), + Vh = u.s(Mh, "StateEditing2", 3), Yh = u.s(Mh, "StateValidating", 4), Uh = u.s(Mh, "StateValidated", 5); + u.defineProperty(Mh, {kh: "textBlock"}, function () { + return this.pv + }, function (a) { + null !== a && u.C(a, qa, Mh, "textBlock"); + this.pv = a + }); + u.defineProperty(Mh, {mg: "currentTextEditor"}, function () { + return this.RA + }, function (a) { + this.RA = a + }); + u.defineProperty(Mh, {nG: "defaultTextEditor"}, function () { + return this.WA + }, function (a) { + u.C(a, Element, Mh, "defaultTextEditor"); + this.WA = a + }); + u.defineProperty(Mh, {pI: "starting"}, function () { + return this.kC + }, function (a) { + u.rb(a, Mh, Mh, "starting"); + this.kC = a + }); + Mh.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || a.nb || !a.N.left || this.isBeyondDragSize()) return !1; + a = a.ke(a.N.da, null, function (a) { + return a instanceof qa + }); + if (null === a || !a.bz || !a.T.canEdit()) return !1; + a = a.T; + return null === a || this.pI === Nh && !a.Za ? !1 : !0 + }; + Mh.prototype.doStart = function () { + this.na || null === this.kh || this.doActivate() + }; + Mh.prototype.doActivate = function () { + if (!this.na) { + var a = this.g; + if (null !== a) { + var b = this.kh; + null === b && (b = a.ke(a.N.da, function (a) { + return a instanceof qa ? a : null + })); + if (null !== b) { + this.kh = b; + var c = b.T; + if (null !== c) { + this.na = !0; + this.Xa = Sh; + var d = this.nG, e = !1; + null !== b.NE && (d = b.NE); + null === d || d.AA || (e = !0); + this.pC = this.kh.copy(); + a.cI(c.ba); + if (d.AA) { + var f = b.lb(Ib), h = a.position, k = a.scale, l = b.Hi() * k; + l < this.YD && (l = this.YD); + this.Qx = b.Ha.width; + var c = this.Qx * l, m = b.Ha.height * l, n = (f.x - h.x) * k, f = (f.y - h.y) * k; + d.value = b.text; + a.Vk.style.font = + b.font; + d.style.font = "inherit"; + d.style.fontSize = 100 * l + "%"; + d.style.lineHeight = "normal"; + d.style.width = c + 6 + "px"; + d.style.height = m + 2 + "px"; + d.style.left = (n - c / 2 | 0) - 1 + "px"; + d.style.top = (f - m / 2 | 0) - 1 + "px"; + d.style.textAlign = b.textAlign; + d.style.margin = "0"; + d.style.padding = "1px"; + d.style.border = "0"; + d.style.outline = "none"; + d.style["white-space"] = "pre-wrap"; + d.style.overflow = "hidden" + } + a.Vk.appendChild(d); + d.style.position = "absolute"; + d.style.zIndex = 100; + d.className = "start"; + d.textEditingTool = this; + d.BK = l; + if (e && "function" === typeof d.onActivate) d.onActivate(); + this.mg = d; + "function" === typeof d.focus && d.focus(); + "function" === typeof d.select && this.$z && d.select() + } + } + } + } + }; + Mh.prototype.doCancel = function () { + null !== this.Dk && (this.mg.style.border = this.Dk, this.Dk = null); + this.stopTool() + }; + Mh.prototype.doMouseUp = function () { + !this.na && this.canStart() && this.doActivate() + }; + Mh.prototype.doMouseDown = function () { + this.na && this.acceptText(Xh) + }; + Mh.prototype.acceptText = function (a) { + switch (a) { + case Xh: + if (this.Xa === Uh || this.Xa === Vh) "function" === typeof this.mg.focus && this.mg.focus(); else if (this.Xa === Sh || this.Xa === Th) this.Xa = Yh, Zh(this); + break; + case Wh: + case Qh: + case Rh: + if (Qh === a && !0 === this.pv.iw) break; + if (this.Xa === Sh || this.Xa === Th) this.Xa = Yh, Zh(this) + } + }; + + function Zh(a) { + if (null !== a.kh && null !== a.mg) { + var b = a.kh, c = a.kh.text, d = a.mg.value, e = "", e = "function" === typeof d ? d() : d; + if (!a.isValidText(a.kh, c, e)) { + a.Xa = Th; + null !== b.cz && b.cz(a, c, e); + null === a.Dk && (a.Dk = a.mg.style.border, a.mg.style.border = "3px solid red"); + "function" === typeof a.mg.focus && a.mg.focus(); + return + } + a.Wb(a.name); + a.Xa = Uh; + c !== e && (a.kh.text = e); + a.zf = a.name; + b = a.g; + null !== b && b.za("TextEdited", a.kh, c); + a.Uj(); + a.stopTool(); + null !== b && b.focus() + } + null !== a.Dk && (a.mg.style.border = a.Dk, a.Dk = null) + } + + Mh.prototype.doDeactivate = function () { + var a = this.g; + if (null !== a) { + this.Xa = Oh; + this.kh = null; + if (null !== this.mg) { + var b = this.mg; + if ("function" === typeof b.onDeactivate) b.onDeactivate(); + null !== b && a.Vk.removeChild(b) + } + this.na = !1 + } + }; + Mh.prototype.isValidText = function (a, b, c) { + u.C(a, qa, Mh, "isValidText:textblock"); + var d = this.jA; + if (null !== d && !d(a, b, c)) return !1; + d = a.jA; + return null === d || d(a, b, c) ? !0 : !1 + }; + u.defineProperty(Mh, {jA: "textValidation"}, function () { + return this.Hk + }, function (a) { + null !== a && u.j(a, "function", Mh, "textValidation"); + this.Hk = a + }); + u.defineProperty(Mh, {YD: "minimumEditorScale"}, function () { + return this.EB + }, function (a) { + null !== a && u.j(a, "number", Mh, "minimumEditorScale"); + this.EB = a + }); + u.defineProperty(Mh, {$z: "selectsTextOnActivate"}, function () { + return this.dC + }, function (a) { + null !== a && u.j(a, "boolean", Mh, "selectsTextOnActivate"); + this.dC = a + }); + + function jf() { + xe.call(this); + this.name = "ToolManager"; + this.uF = new E(xe); + this.vF = new E(xe); + this.wF = new E(xe); + this.jB = this.kB = 1E3; + this.ZA = (new ia(2, 2)).Ka(); + this.au = this.vx = null; + this.IB = Bf; + this.hB = $h + } + + u.Ga(jf, xe); + u.fa("ToolManager", jf); + var Bf; + jf.WheelScroll = Bf = u.s(jf, "WheelScroll", 0); + var Af; + jf.WheelZoom = Af = u.s(jf, "WheelZoom", 1); + jf.WheelNone = u.s(jf, "WheelNone", 2); + var $h; + jf.GestureZoom = $h = u.s(jf, "GestureZoom", 3); + var ai; + jf.GestureCancel = ai = u.s(jf, "GestureCancel", 4); + var bi; + jf.GestureNone = bi = u.s(jf, "GestureNone", 5); + u.defineProperty(jf, {$s: "mouseWheelBehavior"}, function () { + return this.IB + }, function (a) { + u.rb(a, jf, jf, "mouseWheelBehavior"); + this.IB = a + }); + u.defineProperty(jf, {Bo: "gestureBehavior"}, function () { + return this.hB + }, function (a) { + u.rb(a, jf, jf, "gestureBehavior"); + this.hB = a + }); + jf.prototype.initializeStandardTools = function () { + this.HF = new xh; + this.iE = new Gf; + this.rH = new fh; + this.uE = new mh; + this.$H = new uh; + this.TD = new ta; + this.Ed = new uf; + this.uG = new Kh; + this.JH = new Lh; + this.Vy = new Ih; + this.iA = new Mh; + this.VF = new va; + this.WF = new wh + }; + jf.prototype.doMouseDown = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + b.jl && this.Bo === ai && (b.bubbles = !1); + if (b.Ps) { + if (this.Bo === bi) { + b.bubbles = !0; + return + } + if (this.Bo === ai) return; + if (a.Va.canStartMultiTouch()) { + a.Va.standardPinchZoomStart(); + return + } + } + b = a.ha; + b.Ry && 0 !== b.Le && u.trace("WARNING: In ToolManager.doMouseDown: UndoManager.transactionLevel is not zero"); + for (var b = this.cf.length, c = 0; c < b; c++) { + var d = this.cf.ja(c); + null === d.g && d.Ec(this.g); + if (d.canStart()) { + a.Va = d; + a.Va === d && (d.na || d.doActivate(), d.doMouseDown()); + return + } + } + 1 === a.N.button && (this.$s === Bf ? this.$s = Af : this.$s === Af && (this.$s = Bf)); + this.doActivate(); + this.standardWaitAfter(this.FD) + } + }; + jf.prototype.doMouseMove = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + if (b.Ps) { + if (this.Bo === bi) { + b.bubbles = !0; + return + } + if (this.Bo === ai) return; + if (a.Va.canStartMultiTouch()) { + a.Va.standardPinchZoomMove(); + return + } + } + if (this.na) for (var b = this.Mf.length, c = 0; c < b; c++) { + var d = this.Mf.ja(c); + null === d.g && d.Ec(this.g); + if (d.canStart()) { + a.Va = d; + a.Va === d && (d.na || d.doActivate(), d.doMouseMove()); + return + } + } + this.standardMouseOver(); + this.isBeyondDragSize() && this.standardWaitAfter(this.na ? this.FD : this.QG) + } + }; + jf.prototype.doCurrentObjectChanged = function (a, b) { + var c = this.Rk; + null === c || null !== b && (b === c || b.gl(c)) || this.hideToolTip() + }; + jf.prototype.doWaitAfter = function () { + var a = this.g; + null !== a && a.ib && (this.doMouseHover(), this.na || this.doToolTip()) + }; + jf.prototype.doMouseHover = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + null === b.pe && (b.pe = a.ke(b.da, null, null)); + var c = b.pe; + if (null !== c) for (b.Tc = !1; null !== c;) { + a = this.na ? c.Dz : c.Ez; + if (null !== a && (a(b, c), b.Tc)) break; + c = c.S + } else a = this.na ? a.Dz : a.Ez, null !== a && a(b) + } + }; + jf.prototype.doToolTip = function () { + var a = this.g; + if (null !== a) { + var b = a.N; + null === b.pe && (b.pe = a.ke(b.da, null, null)); + b = b.pe; + if (null !== b) { + if (b !== this.Rk && !b.gl(this.Rk)) { + for (; null !== b;) { + a = b.lA; + if (null !== a) { + this.showToolTip(a, b); + return + } + b = b.S + } + this.hideToolTip() + } + } else a = a.lA, null !== a ? this.showToolTip(a, null) : this.hideToolTip() + } + }; + jf.prototype.showToolTip = function (a, b) { + u.C(a, lf, jf, "showToolTip:tooltip"); + null !== b && u.C(b, S, jf, "showToolTip:obj"); + var c = this.g; + if (null !== c) { + a !== this.Rk && this.hideToolTip(); + a.wf = "Tool"; + a.pl = !1; + a.scale = 1 / c.scale; + c.add(a); + if (null !== b && b !== this.au) { + var c = null, d = b.zo(); + null !== d && (c = d.data); + a.vc = b; + a.data = c + } else null === b && (a.data = c.ga); + if (null === b || b !== this.au) a.pf(), this.positionToolTip(a, b); + this.vx = a; + this.au = b + } + }; + jf.prototype.positionToolTip = function (a) { + if (null === a.placeholder) { + var b = this.g; + if (null !== b) { + var c = b.N.da.copy(), d = a.Ba, e = b.ob; + b.N.jl && (c.x -= d.width); + c.x + d.width > e.right && (c.x -= d.width + 5); + c.x < e.x && (c.x = e.x); + c.y = c.y + 20 + d.height > e.bottom ? c.y - (d.height + 5) : c.y + 20; + c.y < e.y && (c.y = e.y); + a.position = c + } + } + }; + jf.prototype.hideToolTip = function () { + if (null !== this.Rk) { + var a = this.g; + null !== a && (this.Rk.data = null, this.Rk.vc = null, a.remove(this.Rk), this.au = this.vx = null) + } + }; + u.u(jf, {Rk: "currentToolTip"}, function () { + return this.vx + }); + jf.prototype.doMouseUp = function () { + this.cancelWaitAfter(); + if (this.na) { + var a = this.g; + if (null === a) return; + for (var b = this.Nf.length, c = 0; c < b; c++) { + var d = this.Nf.ja(c); + null === d.g && d.Ec(this.g); + if (d.canStart()) { + a.Va = d; + a.Va === d && (d.na || d.doActivate(), d.doMouseUp()); + return + } + } + } + this.doDeactivate() + }; + jf.prototype.doMouseWheel = function () { + this.standardMouseWheel() + }; + jf.prototype.doKeyDown = function () { + var a = this.g; + null !== a && a.Eb.doKeyDown() + }; + jf.prototype.doKeyUp = function () { + var a = this.g; + null !== a && a.Eb.doKeyUp() + }; + jf.prototype.doCancel = function () { + null !== Ef && Ef.doCancel(); + xe.prototype.doCancel.call(this) + }; + jf.prototype.findTool = function (a) { + u.j(a, "string", jf, "findTool:name"); + for (var b = this.cf.length, c = 0; c < b; c++) { + var d = this.cf.ja(c); + if (d.name === a) return d + } + b = this.Mf.length; + for (c = 0; c < b; c++) if (d = this.Mf.ja(c), d.name === a) return d; + b = this.Nf.length; + for (c = 0; c < b; c++) if (d = this.Nf.ja(c), d.name === a) return d; + return null + }; + jf.prototype.replaceTool = function (a, b) { + u.j(a, "string", jf, "replaceTool:name"); + null !== b && (u.C(b, xe, jf, "replaceTool:newtool"), b.g && b.g !== this.g && u.k("Cannot share tools between Diagrams: " + b.toString()), b.Ec(this.g)); + for (var c = this.cf.length, d = 0; d < c; d++) { + var e = this.cf.ja(d); + if (e.name === a) return null !== b ? this.cf.Bg(d, b) : this.cf.hd(d), e + } + c = this.Mf.length; + for (d = 0; d < c; d++) if (e = this.Mf.ja(d), e.name === a) return null !== b ? this.Mf.Bg(d, b) : this.Mf.hd(d), e; + c = this.Nf.length; + for (d = 0; d < c; d++) if (e = this.Nf.ja(d), e.name === + a) return null !== b ? this.Nf.Bg(d, b) : this.Nf.hd(d), e; + return null + }; + + function ci(a, b, c, d) { + u.j(b, "string", jf, "replaceStandardTool:name"); + u.C(d, E, jf, "replaceStandardTool:list"); + null !== c && (u.C(c, xe, jf, "replaceStandardTool:newtool"), c.g && c.g !== a.g && u.k("Cannot share tools between Diagrams: " + c.toString()), c.name = b, c.Ec(a.g)); + a.findTool(b) ? a.replaceTool(b, c) : null !== c && d.add(c) + } + + u.u(jf, {cf: "mouseDownTools"}, function () { + return this.uF + }); + u.u(jf, {Mf: "mouseMoveTools"}, function () { + return this.vF + }); + u.u(jf, {Nf: "mouseUpTools"}, function () { + return this.wF + }); + u.defineProperty(jf, {QG: "hoverDelay"}, function () { + return this.kB + }, function (a) { + u.j(a, "number", jf, "hoverDelay"); + this.kB = a + }); + u.defineProperty(jf, {FD: "holdDelay"}, function () { + return this.jB + }, function (a) { + u.j(a, "number", jf, "holdDelay"); + this.jB = a + }); + u.defineProperty(jf, {vG: "dragSize"}, function () { + return this.ZA + }, function (a) { + u.C(a, ia, jf, "dragSize"); + this.ZA = a.Z() + }); + u.defineProperty(jf, {HF: "actionTool"}, function () { + return this.findTool("Action") + }, function (a) { + ci(this, "Action", a, this.cf) + }); + u.defineProperty(jf, {iE: "relinkingTool"}, function () { + return this.findTool("Relinking") + }, function (a) { + ci(this, "Relinking", a, this.cf) + }); + u.defineProperty(jf, {rH: "linkReshapingTool"}, function () { + return this.findTool("LinkReshaping") + }, function (a) { + ci(this, "LinkReshaping", a, this.cf) + }); + u.defineProperty(jf, {uE: "resizingTool"}, function () { + return this.findTool("Resizing") + }, function (a) { + ci(this, "Resizing", a, this.cf) + }); + u.defineProperty(jf, {$H: "rotatingTool"}, function () { + return this.findTool("Rotating") + }, function (a) { + ci(this, "Rotating", a, this.cf) + }); + u.defineProperty(jf, {TD: "linkingTool"}, function () { + return this.findTool("Linking") + }, function (a) { + ci(this, "Linking", a, this.Mf) + }); + u.defineProperty(jf, {Ed: "draggingTool"}, function () { + return this.findTool("Dragging") + }, function (a) { + ci(this, "Dragging", a, this.Mf) + }); + u.defineProperty(jf, {uG: "dragSelectingTool"}, function () { + return this.findTool("DragSelecting") + }, function (a) { + ci(this, "DragSelecting", a, this.Mf) + }); + u.defineProperty(jf, {JH: "panningTool"}, function () { + return this.findTool("Panning") + }, function (a) { + ci(this, "Panning", a, this.Mf) + }); + u.defineProperty(jf, {Vy: "contextMenuTool"}, function () { + return this.findTool("ContextMenu") + }, function (a) { + ci(this, "ContextMenu", a, this.Nf) + }); + u.defineProperty(jf, {iA: "textEditingTool"}, function () { + return this.findTool("TextEditing") + }, function (a) { + ci(this, "TextEditing", a, this.Nf) + }); + u.defineProperty(jf, {VF: "clickCreatingTool"}, function () { + return this.findTool("ClickCreating") + }, function (a) { + ci(this, "ClickCreating", a, this.Nf) + }); + u.defineProperty(jf, {WF: "clickSelectingTool"}, function () { + return this.findTool("ClickSelecting") + }, function (a) { + ci(this, "ClickSelecting", a, this.Nf) + }); + + function Te() { + this.pF = di; + this.Fl = this.Gl = this.Y = null; + this.CA = this.ld = this.Fn = this.dj = !1; + this.Ne = !0; + this.$t = this.Zt = this.PA = null; + this.tx = 0; + this.Ex = 600; + this.yF = new w(0, 0); + this.EA = this.DA = this.BC = !1; + this.Sn = new la(S, ei) + } + + u.fa("AnimationManager", Te); + Te.prototype.Ec = function (a) { + this.Y = a + }; + + function di(a, b, c, d) { + a /= d / 2; + return 1 > a ? c / 2 * a * a + b : -c / 2 * (--a * (a - 2) - 1) + b + } + + Te.prototype.prepareAnimation = Te.prototype.ml = function () { + this.Ne && (this.dj && this.Mi(), this.ld = !0, this.CA = !1) + }; + + function fi(a) { + a.Ne && requestAnimationFrame(function () { + !1 === a.ld || a.dj || (a.Y.im = 1, gi(a.Y), a.ld = !1, a.Y.za("AnimationStarting"), hi(a)) + }) + } + + function ii(a, b, c, d, e) { + if (a.ld && (!(b instanceof G) || b.JD)) { + var f = a.Sn; + if (f.contains(b)) { + b = f.ta(b); + a = b.start; + var h = b.end; + void 0 === a[c] && (a[c] = ji(d)); + h[c] = ji(e) + } else a = new pa, h = new pa, a[c] = ji(d), h[c] = ji(e), f.add(b, new ei(a, h)) + } + } + + function ji(a) { + return a instanceof w ? a.copy() : a instanceof ia ? a.copy() : a + } + + function hi(a) { + var b; + void 0 === b && (b = new pa); + var c = a.Y; + if (null !== c) if (0 === a.Sn.count) a.dj = !1, ki(c, !1), c.bf(); else { + a.dj = !0; + var d = b.wJ || a.pF, e = b.cK || null, f = b.dK || null, h = b.duration || a.Ex; + b = a.yF; + for (var k = a.Sn.i; k.next();) { + var l = k.value.start.position; + l instanceof w && (l.J() || l.assign(b)) + } + a.PA = d; + a.Zt = e; + a.$t = f; + a.tx = h; + var m = a.oF = a.Sn; + li(a); + mi(a, c, m, d, 0, h, null !== a.Gl && null !== a.Fl); + Dg(a.Y); + ni(a); + requestAnimationFrame(function (b) { + var e = b || +new Date, f = e + h; + (function s(b) { + if (!1 !== a.dj) { + b = b || +new Date; + var k = b > f ? + h : b - e; + li(a); + mi(a, c, m, d, k, h, null !== a.Gl && null !== a.Fl); + a.Zt && a.Zt(); + Dg(c); + ni(a); + b > f ? oi(a) : requestAnimationFrame(s) + } + })(e) + }) + } + } + + var pi = { + opacity: function (a, b, c, d, e, f) { + a.opacity = d(e, b, c - b, f) + }, position: function (a, b, c, d, e, f) { + e !== f ? a.GE(d(e, b.x, c.x - b.x, f), d(e, b.y, c.y - b.y, f)) : a.position = new w(d(e, b.x, c.x - b.x, f), d(e, b.y, c.y - b.y, f)) + }, scale: function (a, b, c, d, e, f) { + a.scale = d(e, b, c - b, f) + }, visible: function (a, b, c, d, e, f) { + a.visible = e !== f ? b : c + } + }; + + function li(a) { + if (!a.Fn) { + var b = a.Y; + a.BC = b.cb; + a.DA = b.Iw; + a.EA = b.tt; + b.cb = !0; + b.Iw = !0; + b.tt = !0; + a.Fn = !0 + } + } + + function ni(a) { + var b = a.Y; + b.cb = a.BC; + b.Iw = a.DA; + b.tt = a.EA; + a.Fn = !1 + } + + function mi(a, b, c, d, e, f, h) { + for (c = c.i; c.next();) { + var k = c.key, l = c.value, m = l.start, l = l.end, n; + for (n in l) if (void 0 !== pi[n]) pi[n](k, m[n], l[n], d, e, f) + } + h && (h = a.Gl, a = a.Fl, n = a.y - h.y, a = d(e, h.x, a.x - h.x, f), d = d(e, h.y, n, f), e = b.qz, b.qz = !0, b.position = new w(a, d), b.qz = e) + } + + Te.prototype.stopAnimation = Te.prototype.Mi = function () { + !0 === this.ld && (this.ld = !1, this.CA && this.Y.de()); + this.dj && this.Ne && (li(this), mi(this, this.Y, this.oF, this.PA, this.tx, this.tx, null !== this.Gl && null !== this.Fl), ni(this), oi(this)) + }; + + function oi(a) { + a.dj = !1; + a.Gl = null; + a.Fl = null; + a.Sn = new la(S, ei); + li(a); + for (var b = a.Y.links; b.next();) { + var c = b.value; + null !== c.Xn && (c.points = c.Xn, c.Xn = null) + } + b = a.Y; + ki(b, !1); + b.pc(); + b.bf(); + qi(b); + ni(a); + a.$t && a.$t(); + a.$t = null; + a.Zt = null; + b.za("AnimationFinished"); + b.de() + } + + function ri(a, b, c) { + var d = b.ba, e = c.ba, f = null; + c instanceof V && (f = c.placeholder); + null !== f ? (c = f.lb(xb), c.x += f.padding.left, c.y += f.padding.top, ii(a, b, "position", c, b.position)) : ii(a, b, "position", new w(e.x + e.width / 2 - d.width / 2, e.y + e.height / 2 - d.height / 2), b.position); + ii(a, b, "opacity", .01, b.opacity) + } + + function si(a, b, c) { + a.ld && (null === a.Gl && b.J() && null === a.Fl && (a.Gl = b.copy()), a.Fl = c.copy()) + } + + u.defineProperty(Te, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + u.j(a, "boolean", Te, "isEnabled"); + this.Ne = a + }); + u.defineProperty(Te, {duration: "duration"}, function () { + return this.Ex + }, function (a) { + u.j(a, "number", Te, "duration"); + 1 > a && u.wa(a, ">= 1", Te, "duration"); + this.Ex = a + }); + u.u(Te, {Vg: "isAnimating"}, function () { + return this.dj + }); + u.u(Te, {HJ: "isTicking"}, function () { + return this.Fn + }); + + function ei(a, b) { + this.start = a; + this.end = b + } + + function we() { + 0 < arguments.length && u.Wc(we); + u.gc(this); + this.Y = null; + this.Db = new E(G); + this.Ub = ""; + this.Ic = 1; + this.Wx = !1; + this.Fk = this.Iy = this.fk = this.ek = this.dk = this.ck = this.ak = this.bk = this.$j = this.hk = this.Zj = this.gk = this.Yj = this.Xj = !0; + this.Rx = !1; + this.Uu = [] + } + + u.fa("Layer", we); + we.prototype.Ec = function (a) { + this.Y = a + }; + we.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = 'Layer "' + this.name + '"'; + if (0 >= a) return b; + for (var c = 0, d = 0, e = 0, f = 0, h = 0, k = this.Db.i; k.next();) { + var l = k.value; + l instanceof V ? e++ : l instanceof U ? d++ : l instanceof W ? f++ : l instanceof lf ? h++ : c++ + } + k = ""; + 0 < c && (k += c + " Parts "); + 0 < d && (k += d + " Nodes "); + 0 < e && (k += e + " Groups "); + 0 < f && (k += f + " Links "); + 0 < h && (k += h + " Adornments "); + if (1 < a) for (a = this.Db.i; a.next();) c = a.value, k += "\n " + c.toString(), d = c.data, null !== d && u.Uc(d) && (k += " #" + u.Uc(d)), c instanceof U ? k += " " + + de(d) : c instanceof W && (k += " " + de(c.W) + " " + de(c.ca)); + return b + " " + this.Db.count + ": " + k + }; + we.prototype.findObjectAt = we.prototype.ke = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + if (!1 === this.Fk) return null; + var d = !1; + this.g.ob.Aa(a) && (d = !0); + for (var e = u.K(), f = this.Db.n, h = f.length; h--;) { + var k = f[h]; + if ((!0 !== d || !1 !== ti(k)) && k.Ea() && (e.assign(a), Wa(e, k.Ff), k = k.ke(e, b, c), null !== k && (null !== b && (k = b(k)), null !== k && (null === c || c(k))))) return u.v(e), k + } + u.v(e); + return null + }; + we.prototype.findObjectsAt = we.prototype.ys = function (a, b, c, d) { + void 0 === b && (b = null); + void 0 === c && (c = null); + d instanceof E || d instanceof F || (d = new F(S)); + if (!1 === this.Fk) return d; + var e = !1; + this.g.ob.Aa(a) && (e = !0); + for (var f = u.K(), h = this.Db.n, k = h.length; k--;) { + var l = h[k]; + !0 === e && !1 === ti(l) || !l.Ea() || (f.assign(a), Wa(f, l.Ff), l.ys(f, b, c, d) && (null !== b && (l = b(l)), null === l || null !== c && !c(l) || d.add(l))) + } + u.v(f); + return d + }; + we.prototype.findObjectsIn = we.prototype.Nj = function (a, b, c, d, e) { + void 0 === b && (b = null); + void 0 === c && (c = null); + void 0 === d && (d = !1); + e instanceof E || e instanceof F || (e = new F(S)); + if (!1 === this.Fk) return e; + var f = !1; + this.g.ob.Kj(a) && (f = !0); + for (var h = this.Db.n, k = h.length; k--;) { + var l = h[k]; + (!0 !== f || !1 !== ti(l)) && l.Ea() && l.Nj(a, b, c, d, e) && (null !== b && (l = b(l)), null === l || null !== c && !c(l) || e.add(l)) + } + return e + }; + we.prototype.dz = function (a, b, c, d, e, f, h) { + if (!1 === this.Fk) return e; + for (var k = this.Db.n, l = k.length; l--;) { + var m = k[l]; + (!0 !== h || !1 !== ti(m)) && f(m) && m.Ea() && m.Nj(a, b, c, d, e) && (null !== b && (m = b(m)), null === m || null !== c && !c(m) || e.add(m)) + } + return e + }; + we.prototype.findObjectsNear = we.prototype.ym = function (a, b, c, d, e, f) { + void 0 === c && (c = null); + void 0 === d && (d = null); + void 0 === e && (e = !0); + if (!1 !== e && !0 !== e) { + if (e instanceof E || e instanceof F) f = e; + e = !0 + } + f instanceof E || f instanceof F || (f = new F(S)); + if (!1 === this.Fk) return f; + var h = !1; + this.g.ob.Aa(a) && (h = !0); + for (var k = u.K(), l = u.K(), m = this.Db.n, n = m.length; n--;) { + var p = m[n]; + !0 === h && !1 === ti(p) || !p.Ea() || (k.assign(a), Wa(k, p.Ff), l.m(a.x + b, a.y), Wa(l, p.Ff), p.ym(k, l, c, d, e, f) && (null !== c && (p = c(p)), null === p || null !== d && !d(p) || + f.add(p))) + } + u.v(k); + u.v(l); + return f + }; + g = we.prototype; + g.xf = function (a, b) { + if (this.visible) { + var c; + c = void 0 === b ? a.ob : b; + for (var d = this.Db.n, e = d.length, f = 0; f < e; f++) { + var h = d[f]; + h.BB = f; + if (!(h instanceof W && !1 === h.hg)) { + if (h instanceof lf) { + var k = h; + if (null !== k.Kh) continue + } + if (jb(h.ba, c)) for (h.xf(!0), ui(h), h = h.zv; h.next();) k = h.value, Ph(k, Infinity, Infinity), k.zc(), k.xf(!0); else h.xf(!1), null !== h.zv && 0 < h.zv.count && ui(h) + } + } + } + }; + g.We = function (a, b, c, d) { + if (this.visible && 0 !== this.Ic && (void 0 === d && (d = !0), d || !this.Ac)) { + 1 !== this.Ic && (a.globalAlpha = this.Ic); + c = this.Uu; + c.length = 0; + d = b.scale; + for (var e = this.Db.n, f = e.length, h = 0; h < f; h++) { + var k = e[h]; + if (ti(k) || vi(k)) { + if (k instanceof W) { + var l = k; + l.dc && c.push(l); + if (!1 === l.hg) continue + } + l = k.ba; + 1 < l.width * d || 1 < l.height * d ? k.We(a, b) : wi(k, a) + } + } + a.globalAlpha = 1 + } + }; + + function xi(a, b, c, d) { + if (a.visible && 0 !== a.Ic) { + 1 !== a.Ic && (b.globalAlpha = a.Ic); + var e = a.Uu; + e.length = 0; + var f = c.scale; + a = a.Db.n; + for (var h = a.length, k = d.length, l = 0; l < h; l++) { + var m = a[l]; + if (ti(m) || vi(m)) { + if (m instanceof W) { + var n = m; + n.dc && e.push(n); + if (!1 === n.hg) continue + } + var n = yi(m, m.ba), p; + a:{ + p = n; + for (var q = d, r = k, s = 2 / f, t = 4 / f, v = 0; v < r; v++) { + var x = q[v]; + if (0 !== x.width && 0 !== x.height && p.HD(x.x - s, x.y - s, x.width + t, x.height + t)) { + p = !0; + break a + } + } + p = !1 + } + p && (1 < n.width * f || 1 < n.height * f ? m.We(b, c) : wi(m, b)) + } + } + b.globalAlpha = 1 + } + } + + g.h = function (a, b, c, d, e) { + var f = this.g; + null !== f && f.Dc($d, a, this, b, c, d, e) + }; + g.Eo = function (a, b, c) { + var d = this.Db; + b.Bu = this; + if (a >= d.count) a = d.count; else if (d.ja(a) === b) return -1; + d.Yd(a, b); + b.Js(c); + d = this.g; + null !== d && (c ? d.ma() : d.Eo(b)); + b instanceof V && this.Jw(b); + return a + }; + g.Fe = function (a, b, c) { + if (!c && b.layer !== this && null !== b.layer) return b.layer.Fe(a, b, c); + var d = this.Db; + if (0 > a || a >= d.length) { + if (a = d.indexOf(b), 0 > a) return -1 + } else if (d.ja(a) !== b && (a = d.indexOf(b), 0 > a)) return -1; + b.Ks(c); + d.hd(a); + d = this.g; + null !== d && (c ? d.ma() : d.Fe(b)); + b.Bu = null; + return a + }; + g.Jw = function (a) { + for (; null !== a;) { + if (a.layer === this) { + var b = a; + if (0 !== b.Mc.count) { + for (var c = -1, d = -1, e = this.Db.n, f = e.length, h = 0; h < f; h++) { + var k = e[h]; + if (k === b && (c = h, 0 <= d)) break; + if (0 > d && k.Ra === b && (d = h, 0 <= c)) break + } + !(0 > d) && d < c && (e = this.Db, e.hd(c), e.Yd(d, b)) + } + } + a = a.Ra + } + }; + g.clear = function () { + for (var a = this.Db.Ke(), b = a.length, c = 0; c < b; c++) a[c].xf(!1), this.Fe(-1, a[c], !1) + }; + u.u(we, {Sj: "parts"}, function () { + return this.Db.i + }); + u.u(we, {mK: "partsBackwards"}, function () { + return this.Db.Fm + }); + u.u(we, {g: "diagram"}, function () { + return this.Y + }); + u.defineProperty(we, {name: "name"}, function () { + return this.Ub + }, function (a) { + u.j(a, "string", we, "name"); + var b = this.Ub; + if (b !== a) { + var c = this.g; + if (null !== c) for ("" === b && u.k("Cannot rename default Layer to: " + a), c = c.mw; c.next();) c.value.name === a && u.k("Layer.name is already present in this diagram: " + a); + this.Ub = a; + this.h("name", b, a); + for (a = this.Db.i; a.next();) a.value.wf = this.Ub + } + }); + u.defineProperty(we, {opacity: "opacity"}, function () { + return this.Ic + }, function (a) { + var b = this.Ic; + b !== a && (u.j(a, "number", we, "opacity"), (0 > a || 1 < a) && u.wa(a, "0 <= value <= 1", we, "opacity"), this.Ic = a, this.h("opacity", b, a), a = this.g, null !== a && a.ma()) + }); + u.defineProperty(we, {Ac: "isTemporary"}, function () { + return this.Wx + }, function (a) { + var b = this.Wx; + b !== a && (u.j(a, "boolean", we, "isTemporary"), this.Wx = a, this.h("isTemporary", b, a)) + }); + u.defineProperty(we, {visible: "visible"}, function () { + return this.Iy + }, function (a) { + var b = this.Iy; + if (b !== a) { + u.j(a, "boolean", we, "visible"); + this.Iy = a; + this.h("visible", b, a); + for (b = this.Db.i; b.next();) b.value.He(a); + a = this.g; + null !== a && a.ma() + } + }); + u.defineProperty(we, {Ag: "pickable"}, function () { + return this.Fk + }, function (a) { + var b = this.Fk; + b !== a && (u.j(a, "boolean", we, "pickable"), this.Fk = a, this.h("pickable", b, a)) + }); + u.defineProperty(we, {KD: "isBoundsIncluded"}, function () { + return this.Rx + }, function (a) { + this.Rx !== a && (this.Rx = a, null !== this.g && this.g.pc()) + }); + u.defineProperty(we, {Ij: "allowCopy"}, function () { + return this.Xj + }, function (a) { + var b = this.Xj; + b !== a && (u.j(a, "boolean", we, "allowCopy"), this.Xj = a, this.h("allowCopy", b, a)) + }); + u.defineProperty(we, {lm: "allowDelete"}, function () { + return this.Yj + }, function (a) { + var b = this.Yj; + b !== a && (u.j(a, "boolean", we, "allowDelete"), this.Yj = a, this.h("allowDelete", b, a)) + }); + u.defineProperty(we, {Ev: "allowTextEdit"}, function () { + return this.gk + }, function (a) { + var b = this.gk; + b !== a && (u.j(a, "boolean", we, "allowTextEdit"), this.gk = a, this.h("allowTextEdit", b, a)) + }); + u.defineProperty(we, {Bv: "allowGroup"}, function () { + return this.Zj + }, function (a) { + var b = this.Zj; + b !== a && (u.j(a, "boolean", we, "allowGroup"), this.Zj = a, this.h("allowGroup", b, a)) + }); + u.defineProperty(we, {Fv: "allowUngroup"}, function () { + return this.hk + }, function (a) { + var b = this.hk; + b !== a && (u.j(a, "boolean", we, "allowUngroup"), this.hk = a, this.h("allowUngroup", b, a)) + }); + u.defineProperty(we, {gs: "allowLink"}, function () { + return this.$j + }, function (a) { + var b = this.$j; + b !== a && (u.j(a, "boolean", we, "allowLink"), this.$j = a, this.h("allowLink", b, a)) + }); + u.defineProperty(we, {mm: "allowRelink"}, function () { + return this.bk + }, function (a) { + var b = this.bk; + b !== a && (u.j(a, "boolean", we, "allowRelink"), this.bk = a, this.h("allowRelink", b, a)) + }); + u.defineProperty(we, {Nk: "allowMove"}, function () { + return this.ak + }, function (a) { + var b = this.ak; + b !== a && (u.j(a, "boolean", we, "allowMove"), this.ak = a, this.h("allowMove", b, a)) + }); + u.defineProperty(we, {Cv: "allowReshape"}, function () { + return this.ck + }, function (a) { + var b = this.ck; + b !== a && (u.j(a, "boolean", we, "allowReshape"), this.ck = a, this.h("allowReshape", b, a)) + }); + u.defineProperty(we, {hs: "allowResize"}, function () { + return this.dk + }, function (a) { + var b = this.dk; + b !== a && (u.j(a, "boolean", we, "allowResize"), this.dk = a, this.h("allowResize", b, a)) + }); + u.defineProperty(we, {Dv: "allowRotate"}, function () { + return this.ek + }, function (a) { + var b = this.ek; + b !== a && (u.j(a, "boolean", we, "allowRotate"), this.ek = a, this.h("allowRotate", b, a)) + }); + u.defineProperty(we, {of: "allowSelect"}, function () { + return this.fk + }, function (a) { + var b = this.fk; + b !== a && (u.j(a, "boolean", we, "allowSelect"), this.fk = a, this.h("allowSelect", b, a)) + }); + + function D(a) { + function b() { + window.document.removeEventListener("DOMContentLoaded", b, !1); + Li(c) + } + + 1 < arguments.length && u.k("Diagram constructor can only take one optional argument, the DIV HTML element or its id."); + u.gc(this); + Mi = []; + this.sc = !0; + this.Uh = new Te; + this.Uh.Ec(this); + this.zd = 17; + var c = this; + null !== window.document.body ? Li(this) : window.document.addEventListener("DOMContentLoaded", b, !1); + this.wB = !1; + this.Zb = new E(we); + this.zb = this.Ab = 0; + this.Qg = this.Jb = this.Gg = this.ib = null; + this.qE(); + this.dq = null; + this.pE(); + this.Ma = (new w(NaN, NaN)).freeze(); + this.$b = 1; + this.tu = (new w(NaN, NaN)).freeze(); + this.uu = NaN; + this.Ku = 1E-4; + this.Hu = 100; + this.Sd = new ja; + this.wv = (new w(NaN, NaN)).freeze(); + this.ku = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.vy = (new rb(0, 0, 0, 0)).freeze(); + this.wy = Ni; + this.qy = this.oy = null; + this.xl = vf; + this.dn = uc; + this.tk = vf; + this.An = uc; + this.vu = this.su = xb; + this.Xf = new F(S); + this.Md = !0; + this.fq = !1; + this.El = new la(W, z); + this.qn = !0; + this.lF = 250; + this.Zm = -1; + this.Qt = (new rb(16, 16, 16, 16)).freeze(); + this.du = this.Ef = !1; + this.un = !0; + this.nk = + new Md; + this.Jc = new Md; + this.Ob = new Md; + this.Ui = null; + this.lv = -1; + this.kv = !1; + this.Ax = this.Bx = null; + Oi(this); + this.Rn = new F(U); + this.Ik = new F(V); + this.Nn = new F(W); + this.Db = new F(G); + this.yu = !0; + this.mB = !1; + this.sv = Hg; + this.gj = 10; + this.ux = this.yx = this.Fy = null; + this.sx = ""; + this.Pp = "auto"; + this.Zh = this.ti = this.ji = this.Nu = this.ki = this.li = this.mi = this.Yh = this.ci = this.Wh = null; + this.yn = !0; + this.iy = !1; + this.WB = {}; + this.hr = 0; + this.Df = [null, null]; + this.ix = null; + this.zu = this.Vm = this.zx = this.xy = this.eC = this.qi = !1; + this.yB = !0; + this.Tx = this.vd = + !1; + this.Od = null; + var d = this; + this.FB = function (a) { + if (a.ga === d.ga && d.Na) { + d.Na = !1; + try { + var b = a.Ad; + "" === a.Lf && b === $d && Pi(d, a.object, a.propertyName) + } finally { + d.Na = !0 + } + } + }; + this.GB = function (a) { + Qi(d, a) + }; + this.DC = !0; + this.Ig = -2; + this.$h = new la(Object, G); + this.lk = new la(Object, W); + this.Ml = new la(Object, Array); + this.Tn = new la("string", Array); + this.VB = new E(Ri); + this.vk = !1; + this.Yj = this.Xj = this.Gt = this.Ne = !0; + this.It = this.Ht = !1; + this.Nt = this.Lt = this.fk = this.ek = this.dk = this.ck = this.ak = this.bk = this.$j = this.Kt = this.hk = this.Zj = this.gk = + !0; + this.Jl = this.uB = !1; + this.Mt = this.Jt = this.qu = this.pu = !0; + this.av = this.$u = 16; + this.sy = this.Zu = !1; + this.uy = this.ty = this.vj = this.uj = null; + this.Pe = (new rb(5)).freeze(); + this.dv = (new F(G)).freeze(); + this.Iu = 999999999; + this.ru = (new F(G)).freeze(); + this.uk = this.Hl = this.ei = !0; + this.rk = this.qk = !1; + this.Nd = null; + this.Ot = !0; + this.lf = !1; + this.md = null; + this.MB = 1; + this.Lx = !1; + this.iC = 0; + this.CC = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.eu = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.Ul = new F(Si); + Ti(this); + this.Du = this.mu = this.Pu = this.TA = + this.SA = this.UA = this.hj = this.ok = this.ni = null; + Ui(this); + this.ad = null; + this.lu = !1; + this.en = null; + this.tb = new jf; + this.tb.initializeStandardTools(); + this.Va = this.$y = this.tb; + this.Eb = new sa; + this.ga = new Q; + this.qi = !0; + this.Qb = new Je; + this.qi = !1; + this.dB = this.Dx = null; + this.nf = 1; + this.im = null; + this.sk = new Vi; + void 0 !== a && Wi(this, a); + this.Ol = 1; + this.Pl = 0; + this.AB = new w; + this.zC = 500; + this.Pt = new w; + this.Ir = null; + this.sc = this.Xx = !1 + } + + u.fa("Diagram", D); + + function Ui(a) { + a.ni = new la("string", G); + var b = new U, c = new qa; + c.bind(new bf("text", "", de)); + b.add(c); + a.UA = b; + a.ni.add("", b); + b = new U; + c = new qa; + c.stroke = "brown"; + c.bind(new bf("text", "", de)); + b.add(c); + a.ni.add("Comment", b); + b = new U; + b.pl = !1; + b.TC = !1; + c = new X; + c.Fb = "Ellipse"; + c.fill = "black"; + c.stroke = null; + c.xa = (new ia(3, 3)).Ka(); + b.add(c); + a.ni.add("LinkLabel", b); + a.ok = new la("string", V); + b = new V; + b.Zz = "GROUPPANEL"; + b.type = Xi; + c = new qa; + c.font = "bold 12pt sans-serif"; + c.bind(new bf("text", "", de)); + b.add(c); + c = new A(Yi); + c.name = + "GROUPPANEL"; + var d = new X; + d.Fb = "Rectangle"; + d.fill = "rgba(128,128,128,0.2)"; + d.stroke = "black"; + c.add(d); + d = new ph; + d.padding = (new rb(5, 5, 5, 5)).Ka(); + c.add(d); + b.add(c); + a.SA = b; + a.ok.add("", b); + a.hj = new la("string", W); + b = new W; + c = new X; + c.tg = !0; + b.add(c); + c = new X; + c.jp = "Standard"; + c.fill = "black"; + c.stroke = null; + c.hb = 0; + b.add(c); + a.TA = b; + a.hj.add("", b); + b = new W; + c = new X; + c.tg = !0; + c.stroke = "brown"; + b.add(c); + a.hj.add("Comment", b); + b = new lf; + b.type = Yi; + c = new X; + c.fill = null; + c.stroke = "dodgerblue"; + c.hb = 3; + b.add(c); + c = new ph; + c.margin = (new rb(1.5, + 1.5, 1.5, 1.5)).Ka(); + b.add(c); + a.Pu = b; + a.mu = b; + b = new lf; + b.type = ah; + c = new X; + c.tg = !0; + c.fill = null; + c.stroke = "dodgerblue"; + c.hb = 3; + b.add(c); + a.Du = b + } + + function Li(a) { + var b = u.createElement("p"); + b.style.width = "100%"; + b.style.height = "200px"; + b.style.boxSizing = "content-box"; + var c = u.createElement("div"); + c.style.position = "absolute"; + c.style.visibility = "hidden"; + c.style.width = "200px"; + c.style.height = "150px"; + c.style.overflow = "hidden"; + c.style.boxSizing = "content-box"; + c.appendChild(b); + window.document.body.appendChild(c); + var d = b.offsetWidth; + c.style.overflow = "scroll"; + b = b.offsetWidth; + d === b && (b = c.clientWidth); + window.document.body.removeChild(c); + a.zd = d - b + } + + D.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = ""; + this.id && (b = this.id); + this.Vk && this.Vk.id && (b = this.Vk.id); + b = 'Diagram "' + b + '"'; + if (0 >= a) return b; + for (var c = this.Zb.i; c.next();) b += "\n " + c.value.toString(a - 1); + return b + }; + D.prototype.checkProperties = function () { + return u.check(this) + }; + D.fromDiv = function (a) { + var b = a; + "string" === typeof a && (b = window.document.getElementById(a)); + return b instanceof HTMLDivElement && b.Y instanceof D ? b.Y : null + }; + u.defineProperty(D, {Vk: "div"}, function () { + return this.Jb + }, function (a) { + null !== a && u.C(a, HTMLDivElement, D, "div"); + if (this.Jb !== a) { + Mi = []; + var b = this.Jb; + null !== b ? (b.Y = void 0, b.innerHTML = "", null !== this.ib && (this.ib.removeEventListener("touchstart", this.SE, !1), this.ib.removeEventListener("touchmove", this.RE, !1), this.ib.removeEventListener("touchend", this.QE, !1), this.ib.Dd.Y = null), b = this.tb, null !== b && (b.cf.each(function (a) { + a.cancelWaitAfter() + }), b.Mf.each(function (a) { + a.cancelWaitAfter() + }), b.Nf.each(function (a) { + a.cancelWaitAfter() + })), + b.cancelWaitAfter(), this.Va.doCancel(), this.Gg = this.ib = null, window.removeEventListener("resize", this.aF, !1), window.removeEventListener("mousemove", this.Qo, !0), window.removeEventListener("mousedown", this.Po, !0), window.removeEventListener("mouseup", this.So, !0), window.removeEventListener("mousewheel", this.Zg, !0), window.removeEventListener("DOMMouseScroll", this.Zg, !0), window.removeEventListener("mouseout", this.Ro, !0)) : this.lf = !1; + this.Jb = null; + if (null !== a) { + if (b = a.Y) b.Vk = null; + Wi(this, a); + this.Sz() + } + } + }); + + function Zi(a) { + var b = a.ib; + b.addEventListener("touchstart", a.SE, !1); + b.addEventListener("touchmove", a.RE, !1); + b.addEventListener("touchend", a.QE, !1); + b.addEventListener("mousemove", a.Qo, !1); + b.addEventListener("mousedown", a.Po, !1); + b.addEventListener("mouseup", a.So, !1); + b.addEventListener("mousewheel", a.Zg, !1); + b.addEventListener("DOMMouseScroll", a.Zg, !1); + b.addEventListener("mouseout", a.Ro, !1); + b.addEventListener("keydown", a.kH, !1); + b.addEventListener("keyup", a.lH, !1); + b.addEventListener("selectstart", function (a) { + a.preventDefault(); + return !1 + }, !1); + b.addEventListener("contextmenu", function (a) { + a.preventDefault(); + return !1 + }, !1); + b.addEventListener("gesturechange", function (b) { + a.tb.Bo === ai && b.preventDefault() + }, !1); + b.addEventListener("pointerdown", a.KH, !1); + b.addEventListener("pointermove", a.MH, !1); + b.addEventListener("pointerleave", a.LH, !1); + window.addEventListener("resize", a.aF, !1) + } + + function ki(a, b) { + a.im = null; + b && a.hE() + } + + D.prototype.computePixelRatio = function () { + if (null !== this.im) return this.im; + var a = this.Gg; + return (window.devicePixelRatio || 1) / (a.webkitBackingStorePixelRatio || a.mozBackingStorePixelRatio || a.msBackingStorePixelRatio || a.oBackingStorePixelRatio || a.backingStorePixelRatio || 1) + }; + D.prototype.doMouseMove = function () { + this.Va.doMouseMove() + }; + D.prototype.doMouseDown = function () { + this.Va.doMouseDown() + }; + D.prototype.doMouseUp = function () { + this.Va.doMouseUp() + }; + D.prototype.doMouseWheel = function () { + this.Va.doMouseWheel() + }; + D.prototype.doKeyDown = function () { + this.Va.doKeyDown() + }; + D.prototype.doKeyUp = function () { + this.Va.doKeyUp() + }; + + function gi(a) { + if (null !== a.ib) { + var b = a.Jb; + if (0 !== b.clientWidth && 0 !== b.clientHeight) { + var c = a.rk ? a.zd : 0, d = a.qk ? a.zd : 0, e = a.nf; + a.nf = a.computePixelRatio(); + a.nf !== e && (a.fq = !0, a.de()); + if (b.clientWidth !== a.Ab + c || b.clientHeight !== a.zb + d) a.Hl = !0, a.Md = !0, b = a.Qb, null !== b && b.jw && b.H(), a.vd || a.de() + } + } + } + + D.prototype.focus = D.prototype.focus = function () { + this.ib && this.ib.focus() + }; + + function $i(a, b, c) { + void 0 === b && (b = a.Gg); + void 0 === c && (c = !0); + c && (b.Et = ""); + b.Tm = ""; + b.Sm = "" + } + + function Ti(a) { + var b = new we; + b.name = "Background"; + a.cs(b); + b = new we; + b.name = ""; + a.cs(b); + b = new we; + b.name = "Foreground"; + a.cs(b); + b = new we; + b.name = "Adornment"; + b.Ac = !0; + a.cs(b); + b = new we; + b.name = "Tool"; + b.Ac = !0; + b.KD = !0; + a.cs(b); + b = new we; + b.name = "Grid"; + b.of = !1; + b.Ag = !1; + b.Ac = !0; + a.LF(b, a.ws("Background")) + } + + function aj(a) { + a.ad = new A(bj); + a.ad.name = "GRID"; + var b = new X; + b.Fb = "LineH"; + b.stroke = "lightgray"; + b.hb = .5; + b.interval = 1; + a.ad.add(b); + b = new X; + b.Fb = "LineH"; + b.stroke = "gray"; + b.hb = .5; + b.interval = 5; + a.ad.add(b); + b = new X; + b.Fb = "LineH"; + b.stroke = "gray"; + b.hb = 1; + b.interval = 10; + a.ad.add(b); + b = new X; + b.Fb = "LineV"; + b.stroke = "lightgray"; + b.hb = .5; + b.interval = 1; + a.ad.add(b); + b = new X; + b.Fb = "LineV"; + b.stroke = "gray"; + b.hb = .5; + b.interval = 5; + a.ad.add(b); + b = new X; + b.Fb = "LineV"; + b.stroke = "gray"; + b.hb = 1; + b.interval = 10; + a.ad.add(b); + b = new G; + b.add(a.ad); + b.wf = "Grid"; + b.uz = !1; + b.JD = !1; + b.Ag = !1; + b.zz = "GRID"; + a.add(b); + a.Db.remove(b); + a.ad.visible = !1 + } + + D.prototype.LB = function () { + if (this.Y.isEnabled) { + var a = this.Y; + if (a.sy && null !== a.ib) { + a.Zu = !0; + var b = a.Cd, c = a.ob, d = b.width, e = c.width, f = b.height, h = c.height, k = b.right, l = c.right, + m = b.bottom, n = c.bottom, p = b.x, q = c.x, b = b.y, c = c.y, r = a.scale; + if (e < d || h < f) { + var s = u.K(); + this.bC && a.Re ? (s.m(this.scrollLeft / r + p, a.position.y), a.position = s) : this.cC && a.Se && (s.m(a.position.x, this.scrollTop / r + b), a.position = s); + u.v(s); + a.Zu = !1; + a.Hl = !1 + } else s = u.K(), this.bC && a.Re && (p < q && (a.position = new w(this.scrollLeft + p, a.position.y)), k > l && (a.position = + new w(-(a.uj.scrollWidth - a.Ab) + this.scrollLeft - a.Ab / r + a.Cd.right, a.position.y))), this.cC && a.Se && (b < c && (a.position = new w(a.position.x, this.scrollTop + b)), m > n && (a.position = new w(a.position.x, -(a.vj.scrollHeight - a.zb) + this.scrollTop - a.zb / r + a.Cd.bottom))), u.v(s), cj(a), a.Zu = !1, a.Hl = !1, b = a.Cd, c = a.ob, k = b.right, l = c.right, m = b.bottom, n = c.bottom, p = b.x, q = c.x, b = b.y, c = c.y, e >= d && p >= q && k <= l && (a.ty.style.width = "1px"), h >= f && b >= c && m <= n && (a.uy.style.height = "1px") + } + } else dj(this.Y) + }; + D.prototype.Ru = function () { + this.Y.isEnabled ? this.Y.sy = !0 : dj(this.Y) + }; + D.prototype.computeBounds = D.prototype.kg = function () { + 0 < this.Xf.count && ej(this); + return fj(this) + }; + + function fj(a) { + if (a.uD.J()) { + var b = a.uD.copy(); + b.yv(a.padding); + return b + } + for (var c = !0, d = a.Zb.n, e = d.length, f = 0; f < e; f++) { + var h = d[f]; + if (h.visible && (!h.Ac || h.KD)) for (var h = h.Db.n, k = h.length, l = 0; l < k; l++) { + var m = h[l]; + m.uz && m.Ea() && (m = m.ba, m.J() && (c ? (c = !1, b = m.copy()) : b.Sh(m))) + } + } + c && (b = new z(0, 0, 0, 0)); + b.yv(a.padding); + return b + } + + D.prototype.computePartsBounds = function (a) { + var b = null; + for (a = a.i; a.next();) { + var c = a.value; + c instanceof W || (c.pf(), null === b ? b = c.ba.copy() : b.Sh(c.ba)) + } + return null === b ? new z(NaN, NaN, 0, 0) : b + }; + + function gj(a, b) { + if ((b || a.lf) && !a.sc && null !== a.ib && !a.Lb.Vg && a.Cd.J()) { + a.sc = !0; + var c = a.xl; + b && a.tk !== vf && (c = a.tk); + var d = c !== vf ? hj(a, c) : a.scale, c = a.ob.copy(), e = a.Ab / d, f = a.zb / d, h = null, k = a.Lb; + k.ld && (h = a.Ma.copy()); + a.position.La(); + var l = a.dn; + b && !l.pd() && a.An.pd() && (l = a.An); + ij(a, a.Ma, a.Cd, e, f, l, b); + a.position.freeze(); + null !== h && si(k, h, a.Ma); + a.scale = d; + a.sc = !1; + d = a.ob; + d.De(c) || a.dt(c, d) + } + } + + function hj(a, b) { + var c = a.Eb.Pv; + if (null === a.ib) return c; + a.ei && jj(a, a.kg()); + var d = a.Cd; + if (!d.J()) return c; + var e = d.width, d = d.height, f = a.Ab, h = a.zb, k = f / e, l = h / d; + return b === kj ? (e = Math.min(l, k), e > c && (e = c), e < a.Yg && (e = a.Yg), e > a.Xg && (e = a.Xg), e) : b === lj ? (e = l > k ? (h - a.zd) / d : (f - a.zd) / e, e > c && (e = c), e < a.Yg && (e = a.Yg), e > a.Xg && (e = a.Xg), e) : a.scale + } + + D.prototype.zoomToFit = D.prototype.zoomToFit = function () { + this.scale = hj(this, kj) + }; + D.prototype.zoomToRect = function (a, b) { + void 0 === b && (b = kj); + var c = a.width, d = a.height; + if (!(0 === c || 0 === d || isNaN(c) && isNaN(d))) { + var e = 1; + if (b === kj || b === lj) if (isNaN(c)) e = this.ob.height * this.scale / d; else if (isNaN(d)) e = this.ob.width * this.scale / c; else var e = this.Ab, + f = this.zb, + e = b === lj ? f / d > e / c ? (f - (this.qk ? this.zd : 0)) / d : (e - (this.rk ? this.zd : 0)) / c : Math.min(f / d, e / c); + this.scale = e; + this.position = new w(a.x, a.y) + } + }; + u.defineProperty(D, {qz: null}, function () { + return this.sc + }, function (a) { + this.sc = a + }); + D.prototype.alignDocument = function (a, b) { + this.ei && jj(this, this.kg()); + var c = this.Cd, d = this.ob, e = this.sc; + this.sc = !0; + this.position = new w(c.x + (a.x * c.width + a.offsetX) - (b.x * d.width - b.offsetX), c.y + (a.y * c.height + a.offsetY) - (b.y * d.height - b.offsetY)); + this.sc = e; + this.ma() + }; + + function ij(a, b, c, d, e, f, h) { + var k = b.x, l = b.y; + if (h || a.yE === Ni) f.pd() && (d > c.width && (k = c.x + (f.x * c.width + f.offsetX) - (f.x * d - f.offsetX)), e > c.height && (l = c.y + (f.y * c.height + f.offsetY) - (f.y * e - f.offsetY))), f = a.xE, h = d - c.width, d < c.width + f.left + f.right ? (k = Math.min(k + d / 2, c.right + Math.max(h, f.right) - d / 2), k = Math.max(k, c.left - Math.max(h, f.left) + d / 2), k -= d / 2) : k > c.left ? k = c.left : k < c.right - d && (k = c.right - d), d = e - c.height, e < c.height + f.top + f.bottom ? (l = Math.min(l + e / 2, c.bottom + Math.max(d, f.bottom) - e / 2), l = Math.max(l, c.top - Math.max(d, + f.top) + e / 2), l -= e / 2) : l > c.top ? l = c.top : l < c.bottom - e && (l = c.bottom - e); + b.x = isFinite(k) ? k : -a.padding.left; + b.y = isFinite(l) ? l : -a.padding.top; + null !== a.gE && (a = a.gE(a, b), b.x = a.x, b.y = a.y) + } + + D.prototype.findPartAt = D.prototype.zs = function (a, b) { + var c = b ? wg(this, a, function (a) { + return a.T + }, function (a) { + return a.canSelect() + }) : wg(this, a, function (a) { + return a.T + }); + return c instanceof G ? c : null + }; + D.prototype.findObjectAt = D.prototype.ke = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + ej(this); + for (var d = this.Zb.Fm; d.next();) { + var e = d.value; + if (e.visible && (e = e.ke(a, b, c), null !== e)) return e + } + return null + }; + + function wg(a, b, c, d) { + void 0 === c && (c = null); + void 0 === d && (d = null); + ej(a); + for (a = a.Zb.Fm; a.next();) { + var e = a.value; + if (e.visible && !e.Ac && (e = e.ke(b, c, d), null !== e)) return e + } + return null + } + + D.prototype.findObjectsAt = D.prototype.ys = function (a, b, c, d) { + void 0 === b && (b = null); + void 0 === c && (c = null); + d instanceof E || d instanceof F || (d = new F(S)); + ej(this); + for (var e = this.Zb.Fm; e.next();) { + var f = e.value; + f.visible && f.ys(a, b, c, d) + } + return d + }; + D.prototype.findObjectsIn = D.prototype.Nj = function (a, b, c, d, e) { + void 0 === b && (b = null); + void 0 === c && (c = null); + void 0 === d && (d = !1); + e instanceof E || e instanceof F || (e = new F(S)); + ej(this); + for (var f = this.Zb.Fm; f.next();) { + var h = f.value; + h.visible && h.Nj(a, b, c, d, e) + } + return e + }; + D.prototype.dz = function (a, b, c, d, e, f) { + var h = new F(S); + ej(this); + for (var k = this.Zb.Fm; k.next();) { + var l = k.value; + l.visible && l.dz(a, b, c, d, h, e, f) + } + return h + }; + D.prototype.findObjectsNear = D.prototype.ym = function (a, b, c, d, e, f) { + void 0 === c && (c = null); + void 0 === d && (d = null); + void 0 === e && (e = !0); + if (!1 !== e && !0 !== e) { + if (e instanceof E || e instanceof F) f = e; + e = !0 + } + f instanceof E || f instanceof F || (f = new F(S)); + ej(this); + for (var h = this.Zb.Fm; h.next();) { + var k = h.value; + k.visible && k.ym(a, b, c, d, e, f) + } + return f + }; + + function yf(a) { + -1 !== a.lv && (u.clearTimeout(a.lv), a.lv = -1) + } + + function mj(a, b) { + var c = b.copy(); + a.lv = u.setTimeout(function () { + c.button = 2; + a.N = c; + a.kv = !0; + a.doMouseUp() + }, 850) + } + + D.prototype.acceptEvent = function (a) { + var b = this.Jc; + this.Jc = this.Ob; + this.Ob = b; + nj(this, this, a, b, a instanceof MouseEvent); + return b + }; + + function nj(a, b, c, d, e) { + d.g = b; + e ? oj(a, c, d) : (d.ff = b.Ob.ff, d.da = b.Ob.da); + a = 0; + c.ctrlKey && (a += 1); + c.altKey && (a += 2); + c.shiftKey && (a += 4); + c.metaKey && (a += 8); + d.gd = a; + d.button = c.button; + u.Em && 0 === c.button && c.ctrlKey && (d.button = 2); + d.Wk = !1; + d.up = !1; + d.Te = 1; + d.Uk = 0; + d.Tc = !1; + d.bubbles = !1; + d.event = c; + d.timestamp = Date.now(); + d.Ps = !1; + d.Cg = c.target.Y ? c.target.Y : null; + d.pe = null + } + + function pj(a, b, c, d, e) { + d.g = a; + oj(a, c, d); + d.gd = 0; + d.button = 0; + d.Wk = !0; + d.up = !1; + d.Te = 1; + d.Uk = 0; + d.Tc = !1; + d.bubbles = !0; + d.event = b; + d.timestamp = Date.now(); + d.Ps = e; + d.Cg = b.target.Y ? b.target.Y : null; + d.pe = null; + a.nk = d.copy(); + Ef = null + } + + function qj(a, b, c, d, e) { + var f = null; + d.g = a; + if (null !== c) { + var f = window.document.elementFromPoint(c.clientX, c.clientY), h; + f && f.Y ? h = f.Y : (c = b.changedTouches[0], h = a); + oj(a, c, d) + } else null !== a.Jc ? (d.da = a.Jc.da, d.ff = a.Jc.ff, d.Cg = a.Jc.Cg) : null !== a.nk && (d.da = a.nk.da, d.ff = a.nk.ff, d.Cg = a.nk.Cg); + d.gd = 0; + d.button = 0; + d.Wk = !1; + d.up = !1; + d.Te = 1; + d.Uk = 0; + d.Tc = !1; + d.bubbles = !1; + d.event = b; + d.timestamp = Date.now(); + d.Ps = e; + d.Cg = h; + d.pe = null + } + + function rj(a, b) { + if (a.bubbles) return !0; + void 0 !== b.stopPropagation && b.stopPropagation(); + (void 0 === b.touches || 2 > b.touches.length) && b.preventDefault(); + b.cancelBubble = !0; + return !1 + } + + D.prototype.kH = function (a) { + if (!this.Y.isEnabled) return !1; + var b = this.Y.Ob; + nj(this.Y, this.Y, a, b, !1); + b.key = String.fromCharCode(a.which); + b.Wk = !0; + switch (a.which) { + case 8: + b.key = "Backspace"; + break; + case 33: + b.key = "PageUp"; + break; + case 34: + b.key = "PageDown"; + break; + case 35: + b.key = "End"; + break; + case 36: + b.key = "Home"; + break; + case 37: + b.key = "Left"; + break; + case 38: + b.key = "Up"; + break; + case 39: + b.key = "Right"; + break; + case 40: + b.key = "Down"; + break; + case 45: + b.key = "Insert"; + break; + case 46: + b.key = "Del"; + break; + case 48: + b.key = "0"; + break; + case 187: + case 61: + case 107: + b.key = + "Add"; + break; + case 189: + case 173: + case 109: + b.key = "Subtract"; + break; + case 27: + b.key = "Esc" + } + this.Y.doKeyDown(); + return 187 !== a.which && 189 !== a.which && 48 !== a.which && 107 !== a.which && 109 !== a.which && 61 !== a.which && 173 !== a.which || !0 !== a.ctrlKey ? rj(b, a) : (a.cancelBubble = !0, a.preventDefault(), a.stopPropagation(), !1) + }; + D.prototype.lH = function (a) { + if (!this.Y.isEnabled) return !1; + var b = this.Y.Ob; + nj(this.Y, this.Y, a, b, !1); + b.key = String.fromCharCode(a.which); + b.up = !0; + switch (a.which) { + case 8: + b.key = "Backspace"; + break; + case 33: + b.key = "PageUp"; + break; + case 34: + b.key = "PageDown"; + break; + case 35: + b.key = "End"; + break; + case 36: + b.key = "Home"; + break; + case 37: + b.key = "Left"; + break; + case 38: + b.key = "Up"; + break; + case 39: + b.key = "Right"; + break; + case 40: + b.key = "Down"; + break; + case 45: + b.key = "Insert"; + break; + case 46: + b.key = "Del"; + break; + case 93: + a.preventDefault() + } + this.Y.doKeyUp(); + return rj(b, a) + }; + D.prototype.$p = function (a) { + var b = this.ib; + if (null === b) return new w(0, 0); + var c = this.Ab, d = this.zb, b = b.getBoundingClientRect(), c = a.clientX - c / b.width * b.left; + a = a.clientY - d / b.height * b.top; + return null !== this.Sd ? (a = new w(c, a), Wa(a, this.Sd), a) : new w(c, a) + }; + + function oj(a, b, c) { + var d = a.ib, e = a.Ab, f = a.zb, h = 0, k = 0; + null !== d && (d = d.getBoundingClientRect(), h = b.clientX - e / d.width * d.left, k = b.clientY - f / d.height * d.top); + c.ff.m(h, k); + null !== a.Sd ? (b = u.fc(h, k), a.Sd.Oh(b), c.da.assign(b), u.v(b)) : c.da.m(h, k) + } + + D.prototype.invalidateDocumentBounds = D.prototype.pc = function () { + this.ei || (this.ei = !0, this.de(!0)) + }; + + function qi(a) { + a.vd || ej(a); + a.ei && jj(a, a.kg()); + for (a = a.Ul.i; a.next();) qi(a.value) + } + + D.prototype.redraw = D.prototype.Sz = function () { + this.sc || this.vd || (this.ma(), sj(this), cj(this), this.pc(), this.bf()) + }; + D.prototype.isUpdateRequested = function () { + return this.Ef + }; + D.prototype.delayInitialization = D.prototype.oG = function (a) { + void 0 === a && (a = null); + var b = this.Lb, c = b.isEnabled; + b.Mi(); + b.isEnabled = !1; + Dg(this); + this.lf = !1; + b.isEnabled = c; + null !== a && u.setTimeout(a, 1) + }; + D.prototype.requestUpdate = D.prototype.de = function (a) { + void 0 === a && (a = !1); + if (!0 !== this.Ef && !(this.sc || !1 === a && this.vd)) { + this.Ef = !0; + var b = this; + requestAnimationFrame(function () { + b.Ef && b.bf() + }) + } + }; + D.prototype.maybeUpdate = D.prototype.bf = function () { + if (!this.un || this.Ef) this.un && (this.un = !1), Dg(this) + }; + + function tj(a, b) { + a.sc || !a.Hl || dj(a) || (b && ej(a), gj(a, !1)) + } + + function Dg(a) { + if (!a.vd && (a.Ef = !1, null !== a.Jb)) { + a.vd = !0; + var b = a.Uh, c = a.VB; + if (!b.Fn && 0 !== c.length) { + for (var d = c.n, e = d.length, f = 0; f < e; f++) { + var h = d[f]; + uj(h, !1); + h.R() + } + c.clear() + } + d = c = !1; + b.Vg && (d = !0, c = a.cb, a.cb = !0); + b.ld || gi(a); + tj(a, !1); + null !== a.ad && (a.ad.visible && !a.lu && (vj(a), a.lu = !0), !a.ad.visible && a.lu && (a.lu = !1)); + ej(a); + 0 !== a.El.count && (wj(a), ej(a)); + e = !1; + if (!a.lf || a.Ot) a.lf ? xj(a, !a.du) : (a.Wb("Initial Layout"), !1 === b.isEnabled && b.Mi(), xj(a, !1)), e = !0; + a.du = !1; + ej(a); + a.xy || b.Vg || qi(a); + e && (a.lf || (b = a.Zb.n, a.xf(b, + b.length, a), yj(a), vj(a)), a.za("LayoutCompleted")); + tj(a, !0); + ej(a); + e && !a.lf && (a.lf = !0, a.Wd("Initial Layout"), a.cb || a.ha.clear(), u.setTimeout(function () { + a.Qh = !1 + }, 1)); + a.We(); + d && (a.cb = c); + a.vd = !1 + } + } + + function yj(a) { + if (a.tk !== vf) a.scale = hj(a, a.tk); else if (a.xl !== vf) a.scale = hj(a, a.xl); else { + var b = a.UG; + isFinite(b) && 0 < b && (a.scale = b) + } + a.ei && jj(a, a.kg()); + b = a.TG; + if (b.J()) a.position = b; else { + b = u.K(); + b.pt(a.Cd, a.SG); + var c = a.ob, c = u.Vj(0, 0, c.width, c.height), d = u.K(); + d.pt(c, a.VG); + a.position = new w(b.x - d.x, b.y - d.y); + u.ic(c); + u.v(d); + u.v(b); + gj(a, !0) + } + a.za("InitialLayoutCompleted") + } + + function ej(a) { + if ((a.vd || !a.Lb.Vg) && 0 !== a.Xf.count) for (var b = 0; 23 > b; b++) { + var c = a.Xf.i; + if (null === c || 0 === a.Xf.count) break; + a.Xf = new F(S); + var d = a, e = a.Xf; + for (c.reset(); c.next();) { + var f = c.value; + !f.Fd() || f instanceof V || !f.Ea() || (f.hl() ? (Ph(f, Infinity, Infinity), f.zc()) : e.add(f)) + } + for (c.reset(); c.next();) f = c.value, f instanceof V && f.Ea() && zj(d, f); + for (c.reset(); c.next();) f = c.value, f instanceof W && (d = f, d.Ea() && (d.hl() ? (Ph(d, Infinity, Infinity), d.zc(), d.Xs()) : e.add(d))); + for (c.reset(); c.next();) d = c.value, d instanceof + lf && d.Ea() && (d.hl() ? (Ph(d, Infinity, Infinity), d.zc()) : e.add(d)) + } + } + + function zj(a, b) { + for (var c = u.eb(), d = u.eb(), e = b.Mc; e.next();) { + var f = e.value; + f.Ea() && (f instanceof V ? (Aj(f) || Bj(f) || Cj(f)) && zj(a, f) : f instanceof W ? f.W == b || f.ca == b ? d.push(f) : c.push(f) : (Ph(f, Infinity, Infinity), f.zc())) + } + for (var e = c.length, h = 0; h < e; h++) f = c[h], Ph(f, Infinity, Infinity), f.zc(); + u.ra(c); + Ph(b, Infinity, Infinity); + b.zc(); + e = d.length; + for (h = 0; h < e; h++) f = d[h], Ph(f, Infinity, Infinity), f.zc(); + u.ra(d) + } + + D.prototype.xf = function (a, b, c, d) { + var e = this.Uh; + if (this.uk || e.Vg) for (e = 0; e < b; e++) a[e].xf(c, d) + }; + D.prototype.We = function (a, b) { + void 0 === a && (a = this.Gg); + void 0 === b && (b = null); + null === this.Jb && u.k("No div specified"); + var c = this.ib; + null === c && u.k("No canvas specified"); + if (this.Uh.ld) 0 === this.ha.Le && this.de(!0); else { + Dj(this); + var d = a !== this.Gg, e = this.Zb.n, f = e.length, h = this; + this.xf(e, f, h); + if (d) $i(this, a), cj(this); else if (!this.Md && null === b) return; + var k = this.Ma, l = this.$b, m = Math.round(k.x * l) / l, n = Math.round(k.y * l) / l, f = this.Sd; + f.reset(); + 1 !== l && f.scale(l); + 0 === k.x && 0 === k.y || f.translate(-m, -n); + k = this.nf; + u.Dm ? + (c.width = c.width, $i(this, a), a.scale(k, k)) : (a.setTransform(1, 0, 0, 1, 0, 0), a.scale(k, k), a.clearRect(0, 0, this.Ab, this.zb)); + a.miterLimit = 9; + a.setTransform(1, 0, 0, 1, 0, 0); + a.scale(k, k); + a.transform(f.m11, f.m12, f.m21, f.m22, f.dx, f.dy); + c = null !== b ? function (c) { + var d = a, e = b; + if (c.visible && 0 !== c.Ic) { + 1 !== c.Ic && (d.globalAlpha = c.Ic); + var f = c.Uu; + f.length = 0; + var k = h.scale; + c = c.Db.n; + for (var l = c.length, m = 0; m < l; m++) { + var n = c[m]; + if ((ti(n) || vi(n)) && !e.contains(n)) { + if (n instanceof W) { + var y = n; + y.dc && f.push(y); + if (!1 === y.hg) continue + } + y = + n.ba; + 1 < y.width * k || 1 < y.height * k ? n.We(d, h) : wi(n, d) + } + } + d.globalAlpha = 1 + } + } : function (b) { + b.We(a, h) + }; + Ej(this, a); + f = e.length; + for (k = 0; k < f; k++) c(e[k]); + this.sk ? this.sk.wl(this) && this.Zw() : this.$p = function () { + return new w(0, 0) + }; + d ? ($i(this), cj(this)) : this.Md = this.uk = !1 + } + }; + + function Fj(a, b, c, d, e) { + null === a.Jb && u.k("No div specified"); + var f = a.ib; + null === f && u.k("No canvas specified"); + var h = a.Gg; + if (a.Md) { + Dj(a); + var k = a.nf; + u.Dm ? (f.width = f.width, $i(a, h)) : (h.setTransform(1, 0, 0, 1, 0, 0), h.clearRect(0, 0, a.Ab * k, a.zb * k)); + h.GD = !1; + h.drawImage(a.Dx.Dd, 0 < d ? 0 : Math.round(-d), 0 < e ? 0 : Math.round(-e)); + e = a.Ma; + var f = a.$b, l = Math.round(e.x * f) / f, m = Math.round(e.y * f) / f; + d = a.Sd; + d.reset(); + 1 !== f && d.scale(f); + 0 === e.x && 0 === e.y || d.translate(-l, -m); + h.save(); + h.beginPath(); + e = c.length; + for (f = 0; f < e; f++) l = c[f], 0 !== + l.width && 0 !== l.height && h.rect(Math.floor(l.x), Math.floor(l.y), Math.ceil(l.width), Math.ceil(l.height)); + h.clip(); + h.setTransform(1, 0, 0, 1, 0, 0); + h.scale(k, k); + h.transform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + c = a.Zb.n; + e = c.length; + a.xf(c, e, a); + Ej(a, h); + for (f = 0; f < e; f++) xi(c[f], h, a, b); + h.restore(); + $i(a); + a.sk ? a.sk.wl(a) && a.Zw() : a.$p = function () { + return new w(0, 0) + }; + a.uk = !1; + a.Md = !1; + a.hE() + } + } + + function Gj(a, b, c, d, e, f, h, k, l, m) { + null === a.Jb && u.k("No div specified"); + null === a.ib && u.k("No canvas specified"); + void 0 === h && (h = null); + void 0 === k && (k = null); + void 0 === l && (l = !1); + void 0 === m && (m = !1); + Dj(a); + $i(a); + cj(a); + a.Tx = !0; + var n = new z(f.x, f.y, d.width / e, d.height / e), p = n.copy(); + p.yv(c); + vj(a, p); + ej(a); + var p = a.Zb.n, q = p.length; + a.xf(p, q, a, n); + var r = a.nf; + b.setTransform(1, 0, 0, 1, 0, 0); + b.scale(r, r); + b.clearRect(0, 0, d.width, d.height); + null !== k && "" !== k && (b.fillStyle = k, b.fillRect(0, 0, d.width, d.height)); + d = u.jh(); + d.reset(); + d.translate(c.left, c.top); + d.scale(e); + 0 === f.x && 0 === f.y || d.translate(-f.x, -f.y); + b.setTransform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + u.Ye(d); + Ej(a, b); + if (null !== h) { + var s = new F(S); + c = h.i; + for (c.reset(); c.next();) e = c.value, !1 === m && "Grid" === e.layer.name || null === e || s.add(e); + c = function (c) { + var d = l; + if (c.visible && 0 !== c.Ic && (void 0 === d && (d = !0), d || !c.Ac)) { + 1 !== c.Ic && (b.globalAlpha = c.Ic); + d = c.Uu; + d.length = 0; + var e = a.scale; + c = c.Db.n; + for (var f = c.length, h = 0; h < f; h++) { + var k = c[h]; + if ((ti(k) || vi(k)) && s.contains(k)) { + if (k instanceof + W) { + var m = k; + m.dc && d.push(m); + if (!1 === m.hg) continue + } + m = k.ba; + 1 < m.width * e || 1 < m.height * e ? k.We(b, a) : wi(k, b) + } + } + b.globalAlpha = 1 + } + } + } else if (!l && m) { + var t = a.Gs.T, v = t.layer; + c = function (c) { + c === v ? t.We(b, a) : c.We(b, a, n, l, m) + } + } else c = function (c) { + c.We(b, a, n, l, m) + }; + for (e = 0; e < q; e++) c(p[e]); + a.Tx = !1; + a.sk ? a.sk.wl(a) && a.Zw() : a.$p = function () { + return new w(0, 0) + }; + $i(a); + cj(a); + a.xf(p, q, a); + vj(a) + } + + D.prototype.getRenderingHint = D.prototype.$v = function (a) { + return this.Qg[a] + }; + D.prototype.setRenderingHint = D.prototype.iI = function (a, b) { + this.Qg[a] = b; + this.Sz() + }; + D.prototype.resetRenderingHints = D.prototype.qE = function () { + this.Qg = new pa; + this.Qg.drawShadows = !0; + this.Qg.textGreeking = !0; + this.Qg.viewportOptimizations = u.cH ? !1 : !0; + this.Qg.temporaryPixelRatio = !0; + this.Qg.pictureRatioOptimization = !0 + }; + + function Ej(a, b) { + var c = a.Qg; + if (null !== c) { + if (void 0 !== c.imageSmoothingEnabled) { + var d = !!c.imageSmoothingEnabled; + b.GD = d; + b.aK = d + } + c = c.defaultFont; + void 0 !== c && null !== c && (b.font = c, b.Et = c) + } + } + + D.prototype.getInputOption = D.prototype.gz = function (a) { + return this.dq[a] + }; + D.prototype.setInputOption = function (a, b) { + this.dq[a] = b + }; + D.prototype.resetInputOptions = D.prototype.pE = function () { + this.dq = new pa; + this.dq.extraTouchArea = 10; + this.dq.extraTouchThreshold = 10 + }; + D.prototype.setProperties = function (a) { + u.ot(this, a) + }; + + function wj(a) { + if (0 === a.ha.Le) { + for (var b = a.El.i; b.next();) { + var c = b.key, d = b.value; + c.le(); + eh(c, d) + } + a.El.clear() + } + } + + D.prototype.ma = function (a) { + void 0 === a && (a = null); + if (null === a) this.Md = !0, this.de(); else { + var b = this.ob; + null !== a && a.J() && b.sg(a) && (this.Md = !0, this.de()) + } + for (b = this.Ul.i; b.next();) b.value.ma(a) + }; + D.prototype.nz = function (a, b) { + if (!0 !== this.Md) { + this.Md = !0; + var c = !0 === this.$v("temporaryPixelRatio"); + if (!0 === this.$v("viewportOptimizations") && this.yE !== Hj && this.xE.Tv(0, 0, 0, 0) && b.width === a.width && b.height === a.height) { + var d = this.scale, e = u.Sf(), f = Math.max(a.x, b.x), h = Math.max(a.y, b.y), + k = Math.min(a.x + a.width, b.x + b.width), l = Math.min(a.y + a.height, b.y + b.height); + e.x = f; + e.y = h; + e.width = Math.max(0, k - f) * d; + e.height = Math.max(0, l - h) * d; + if (0 < e.width && 0 < e.height) { + if (!this.vd && (this.Ef = !1, null !== this.Jb)) { + this.vd = !0; + ej(this); + 0 !== this.El.count && (wj(this), ej(this)); + this.Cd.J() || jj(this, this.kg()); + var m = this.ib; + if (null !== m) { + var n = this.nf, h = this.Ab * n, k = this.zb * n, f = this.scale * n, + d = Math.round(Math.round(b.x * f) - Math.round(a.x * f)), + f = Math.round(Math.round(b.y * f) - Math.round(a.y * f)), l = this.Dx, p = this.dB; + l.width !== h && (l.width = h); + l.height !== k && (l.height = k); + p.clearRect(0, 0, h, k); + var l = 190 * this.nf, q = 70 * this.nf, r = Math.max(d, 0), s = Math.max(f, 0), + t = Math.floor(h - r), v = Math.floor(k - s); + p.GD = !1; + p.drawImage(m.Dd, r, s, t, v, 0, 0, t, v); + this.sk.wl(this) && + p.clearRect(0, 0, l, q); + var m = u.eb(), p = u.eb(), v = Math.abs(d), t = Math.abs(f), x = 0 === r ? 0 : h - v, + r = u.fc(x, 0), v = u.fc(v + x, k); + p.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + var B = this.Sd; + B.reset(); + B.scale(n, n); + 1 !== this.$b && B.scale(this.$b); + n = this.Ma; + (0 !== n.x || 0 !== n.y) && isFinite(n.x) && isFinite(n.y) && B.translate(-n.x, -n.y); + Wa(r, B); + Wa(v, B); + m.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + x = 0 === s ? 0 : k - t; + r.m(0, x); + v.m(h, t + x); + p.push(new z(Math.min(r.x, + v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + Wa(r, B); + Wa(v, B); + m.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))); + this.sk.wl(this) && (h = 0 < d ? 0 : -d, k = 0 < f ? 0 : -f, r.m(h, k), v.m(l + h, q + k), p.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y))), Wa(r, B), Wa(v, B), m.push(new z(Math.min(r.x, v.x), Math.min(r.y, v.y), Math.abs(r.x - v.x), Math.abs(r.y - v.y)))); + u.v(r); + u.v(v); + tj(this, !1); + Fj(this, m, p, d, f); + u.ra(m); + u.ra(p); + this.vd = !1 + } + } + } else this.bf(); + u.ic(e); + c && (this.im = 1, this.bf(), ki(this, !0)) + } else c ? (this.im = 1, this.bf(), ki(this, !0)) : this.bf(); + for (c = this.Ul.i; c.next();) c.value.nz() + } + }; + + function sj(a) { + !1 === a.Hl && (a.Hl = !0) + } + + function cj(a) { + !1 === a.uk && (a.uk = !0) + } + + function Dj(a) { + !1 !== a.fq && (a.fq = !1, Ij(a, a.Ab, a.zb)) + } + + function Ij(a, b, c) { + var d = a.ib, e = a.nf, f = b * e, e = c * e; + if (d.width !== f || d.height !== e) d.width = f, d.height = e, d.style.width = b + "px", d.style.height = c + "px", a.Md = !0, $i(a) + } + + function dj(a) { + var b = a.ib; + if (null === b) return !0; + var c = a.Jb, d = a.Ab, e = a.zb, f = a.CC.copy(), h = !1, k = a.rk ? a.zd : 0, l = a.qk ? a.zd : 0, + m = c.clientWidth || d + k, c = c.clientHeight || e + l; + if (m !== d + k || c !== e + l) a.rk = !1, a.qk = !1, l = k = 0, a.Ab = m, a.zb = c, h = a.fq = !0; + a.Hl = !1; + if (a.Lb.Vg) return h ? (a.Lb.Mi(), a.oG(), !1) : !0; + var n = a.ob, p = a.Cd, m = p.width, c = p.height, q = n.width, r = n.height, s = p.x, t = n.x, v = p.right, + k = n.right + k, x = p.y, B = n.y, p = p.bottom, l = n.bottom + l, y = n = "1px", C = a.scale; + a.kz && a.Re && (n = 1, s + 1 < t && (n = Math.max((t - s) * C + a.Ab, n)), v > k + 1 && (n = Math.max((v - + k) * C + a.Ab, n)), q + 1 < m && (n = Math.max((m - q) * C + a.Ab, n)), n += "px"); + a.lz && a.Se && (y = 1, x + 1 < B && (y = Math.max((B - x) * C + a.zb, y)), p > l + 1 && (y = Math.max((p - l) * C + a.zb, y)), r + 1 < c && (y = Math.max((c - r) * C + a.zb, y)), y += "px"); + var I = "1px" !== n, H = "1px" !== y; + if ((!I || !H) && I || H) H && (k -= a.zd), I && (l -= a.zd), a.kz && a.Re && (n = 1, s + 1 < t && (n = Math.max((t - s) * C + a.Ab, n)), v > k + 1 && (n = Math.max((v - k) * C + a.Ab, n)), q + 1 < m && (n = Math.max((m - q) * C + a.Ab, n)), n += "px"), a.lz && a.Se && (y = 1, x + 1 < B && (y = Math.max((B - x) * C + a.zb, y)), p > l + 1 && (y = Math.max((p - l) * C + a.zb, y)), r + 1 < c && (y = Math.max((c - + r) * C + a.zb, y)), y += "px"), I = "1px" !== n, H = "1px" !== y; + if (a.Zu && I === a.qk && H === a.rk) return d === a.Ab && e === a.zb || a.bf(), !1; + I !== a.qk && (a.zb = "1px" === n ? a.zb + a.zd : Math.max(a.zb - a.zd, 1), h = !0); + a.qk = I; + a.ty.style.width = n; + H !== a.rk && (a.Ab = "1px" === y ? a.Ab + a.zd : Math.max(a.Ab - a.zd, 1), h = !0, a.wB && (H ? (b.style.left = a.zd + "px", a.position = new w(a.Ma.x + a.zd / a.scale, a.Ma.y)) : (b.style.left = "0px", a.position = new w(a.Ma.x - a.zd / a.scale, a.Ma.y)))); + a.rk = H; + a.uy.style.height = y; + a.kz && a.Re && (q + 1 < m ? a.uj.scrollLeft = (a.position.x - s) * C : s + 1 < t ? a.uj.scrollLeft = + a.uj.scrollWidth - a.uj.clientWidth : v > k + 1 && (a.uj.scrollLeft = a.position.x * C)); + a.lz && a.Se && (r + 1 < c ? a.vj.scrollTop = (a.position.y - x) * C : x + 1 < B ? a.vj.scrollTop = a.vj.scrollHeight - a.vj.clientHeight : p > l + 1 && (a.vj.scrollTop = a.position.y * C)); + h && (a.fq = !0); + m = a.Ab; + c = a.zb; + a.vj.style.height = c + "px"; + a.vj.style.width = m + (a.rk ? a.zd : 0) + "px"; + a.uj.style.width = m + "px"; + a.uj.style.height = c + (a.qk ? a.zd : 0) + "px"; + a.sy = !1; + return d !== m || e !== c || a.Lb.ld ? (n = a.ob, a.dt(f, n, h), !1) : !0 + } + + D.prototype.add = D.prototype.add = function (a) { + u.C(a, G, D, "add:part"); + var b = a.g; + if (b !== this) { + null !== b && u.k("Cannot add part " + a.toString() + " to " + this.toString() + ". It is already a part of " + b.toString()); + this.Vm && (a.wk = "Tool"); + var c = a.wf, b = this.ws(c); + null === b && (b = this.ws("")); + null === b && u.k('Cannot add a Part when unable find a Layer named "' + c + '" and there is no default Layer'); + a.layer !== b && (c = b.Eo(99999999, a, a.g === this), 0 <= c && this.Dc(be, "parts", b, null, a, null, c), b.Ac || this.pc(), a.H(Jj), c = a.Rs, null !== + c && c(a, null, b)) + } + }; + D.prototype.Eo = function (a) { + if (a instanceof U) { + if (this.Rn.add(a), a instanceof V) { + var b = a.Ra; + null === b ? this.Ik.add(a) : b.Pn.add(a); + b = a.Qb; + null !== b && (b.g = this) + } + } else a instanceof W ? this.Nn.add(a) : a instanceof lf || this.Db.add(a); + var c = this; + Kj(a, function (a) { + Lj(c, a) + }); + a.Pb && a.R(); + b = a.data; + null !== b && (a instanceof lf || (a instanceof W ? this.lk.add(b, a) : this.$h.add(b, a)), Kj(a, function (a) { + Mj(c, a) + })); + !0 !== Bj(a) && !0 !== Cj(a) || this.Xf.add(a); + Nj(a, !0, this); + Oj(a) ? (a.ba.J() && this.ma(yi(a, a.ba)), this.pc()) : a.Ea() && a.ba.J() && + this.ma(yi(a, a.ba)); + this.de() + }; + D.prototype.Fe = function (a) { + a.ls(); + if (a instanceof U) { + if (this.Rn.remove(a), a instanceof V) { + var b = a.Ra; + null === b ? this.Ik.remove(a) : b.Pn.remove(a); + b = a.Qb; + null !== b && (b.g = null) + } + } else a instanceof W ? this.Nn.remove(a) : a instanceof lf || this.Db.remove(a); + var c = this; + Kj(a, function (a) { + Pj(c, a) + }); + b = a.data; + null !== b && (a instanceof lf || (a instanceof W ? this.lk.remove(b) : this.$h.remove(b)), Kj(a, function (a) { + Qj(c, a) + })); + this.Xf.remove(a); + Oj(a) ? (a.ba.J() && this.ma(yi(a, a.ba)), this.pc()) : a.Ea() && a.ba.J() && this.ma(yi(a, a.ba)); + this.de() + }; + D.prototype.remove = D.prototype.remove = function (a) { + u.C(a, G, D, "remove:part"); + a.Za = !1; + a.Wg = !1; + var b = a.layer; + if (null !== b && b.g === this) { + a.H(Rj); + a.xm(); + var c = b.Fe(-1, a, !1); + 0 <= c && this.Dc(ce, "parts", b, a, null, c, null); + c = a.Rs; + null !== c && c(a, b, null) + } + }; + D.prototype.removeParts = D.prototype.Wz = function (a, b) { + if (u.isArray(a)) for (var c = u.qb(a), d = 0; d < c; d++) { + var e = u.fb(a, d); + b && !e.canDelete() || this.remove(e) + } else for (e = new F(G), e.Td(a), c = e.i; c.next();) e = c.value, b && !e.canDelete() || this.remove(e) + }; + D.prototype.copyParts = D.prototype.to = function (a, b, c) { + return this.Eb.to(a, b, c) + }; + D.prototype.moveParts = D.prototype.moveParts = function (a, b, c) { + u.C(b, w, D, "moveParts:offset"); + var d = this.tb; + if (null !== d) { + d = d.Ed; + null === d && (d = new uf, d.Ec(this)); + var e = new la(G, Object); + if (null !== a) a = a.i; else { + for (a = this.Sj; a.next();) Hf(d, e, a.value, c); + for (a = this.yg; a.next();) Hf(d, e, a.value, c); + a = this.links + } + for (; a.next();) Hf(d, e, a.value, c); + d.moveParts(e, b, c) + } + }; + + function Sj(a, b, c) { + u.C(b, we, D, "addLayer:layer"); + null !== b.g && b.g !== a && u.k("Cannot share a Layer with another Diagram: " + b + " of " + b.g); + null === c ? null !== b.g && u.k("Cannot add an existing Layer to this Diagram again: " + b) : (u.C(c, we, D, "addLayer:existingLayer"), c.g !== a && u.k("Existing Layer must be in this Diagram: " + c + " not in " + c.g), b === c && u.k("Cannot move a Layer before or after itself: " + b)); + if (b.g !== a) { + b = b.name; + a = a.Zb; + c = a.count; + for (var d = 0; d < c; d++) a.ja(d).name === b && u.k("Cannot add Layer with the name '" + + b + "'; a Layer with the same name is already present in this Diagram.") + } + } + + D.prototype.addLayer = D.prototype.cs = function (a) { + Sj(this, a, null); + a.Ec(this); + var b = this.Zb, c = b.count - 1; + if (!a.Ac) for (; 0 <= c && b.ja(c).Ac;) c--; + b.Yd(c + 1, a); + null !== this.Od && this.Dc(be, "layers", this, null, a, null, c + 1); + this.ma(); + this.pc() + }; + D.prototype.addLayerBefore = D.prototype.LF = function (a, b) { + Sj(this, a, b); + a.Ec(this); + var c = this.Zb, d = c.indexOf(a); + 0 <= d && (c.remove(a), null !== this.Od && this.Dc(ce, "layers", this, a, null, d, null)); + for (var e = c.count, f = 0; f < e; f++) if (c.ja(f) === b) { + c.Yd(f, a); + break + } + null !== this.Od && this.Dc(be, "layers", this, null, a, null, f); + this.ma(); + 0 > d && this.pc() + }; + D.prototype.addLayerAfter = function (a, b) { + Sj(this, a, b); + a.Ec(this); + var c = this.Zb, d = c.indexOf(a); + 0 <= d && (c.remove(a), null !== this.Od && this.Dc(ce, "layers", this, a, null, d, null)); + for (var e = c.count, f = 0; f < e; f++) if (c.ja(f) === b) { + c.Yd(f + 1, a); + break + } + null !== this.Od && this.Dc(be, "layers", this, null, a, null, f + 1); + this.ma(); + 0 > d && this.pc() + }; + D.prototype.removeLayer = function (a) { + u.C(a, we, D, "removeLayer:layer"); + a.g !== this && u.k("Cannot remove a Layer from another Diagram: " + a + " of " + a.g); + if ("" !== a.name) { + var b = this.Zb, c = b.indexOf(a); + if (b.remove(a)) { + for (b = a.Db.copy().i; b.next();) { + var d = b.value, e = d.wf; + d.wf = e !== a.name ? e : "" + } + null !== this.Od && this.Dc(ce, "layers", this, a, null, c, null); + this.ma(); + this.pc() + } + } + }; + D.prototype.findLayer = D.prototype.ws = function (a) { + for (var b = this.mw; b.next();) { + var c = b.value; + if (c.name === a) return c + } + return null + }; + D.prototype.addChangedListener = D.prototype.Jy = function (a) { + u.j(a, "function", D, "addChangedListener:listener"); + null === this.Ui && (this.Ui = new E("function")); + this.Ui.add(a) + }; + D.prototype.removeChangedListener = D.prototype.Tz = function (a) { + u.j(a, "function", D, "removeChangedListener:listener"); + null !== this.Ui && (this.Ui.remove(a), 0 === this.Ui.count && (this.Ui = null)) + }; + D.prototype.Jv = function (a) { + this.cb || this.ha.ED(a); + a.Ad !== ae && (this.Qh = !0); + if (null !== this.Ui) { + var b = this.Ui, c = b.length; + if (1 === c) b = b.ja(0), b(a); else if (0 !== c) for (var d = b.Ke(), e = 0; e < c; e++) b = d[e], b(a) + } + }; + D.prototype.raiseChangedEvent = D.prototype.Dc = function (a, b, c, d, e, f, h) { + void 0 === f && (f = null); + void 0 === h && (h = null); + var k = new Zd; + k.g = this; + k.Ad = a; + k.propertyName = b; + k.object = c; + k.oldValue = d; + k.zg = f; + k.newValue = e; + k.xg = h; + this.Jv(k) + }; + D.prototype.raiseChanged = D.prototype.h = function (a, b, c, d, e) { + this.Dc($d, a, this, b, c, d, e) + }; + u.u(D, {Lb: "animationManager"}, function () { + return this.Uh + }); + u.u(D, {ha: "undoManager"}, function () { + return this.Od.ha + }); + u.defineProperty(D, {cb: "skipsUndoManager"}, function () { + return this.qi + }, function (a) { + u.j(a, "boolean", D, "skipsUndoManager"); + this.qi = a; + this.Od.qi = a + }); + u.defineProperty(D, {az: "delaysLayout"}, function () { + return this.zx + }, function (a) { + this.zx = a + }); + D.prototype.pm = function (a, b) { + if (null !== a && a.g === this) { + var c = a.Ad; + if (c === $d) { + var d = a.object, c = a.propertyName, e = a.ta(b); + u.Oa(d, c, e); + d instanceof S && (d = d.T, null !== d && d.Zd()); + this.Qh = !0 + } else if (c === be) { + e = a.object; + c = a.xg; + d = a.newValue; + if (e instanceof A) if ("number" === typeof c && d instanceof S) { + var f = e; + b ? f.Fe(c) : f.Yd(c, d); + d = e.T; + null !== d && d.Zd() + } else "number" === typeof c && d instanceof Se && (f = e, b ? d.ae ? f.oE(c) : f.kE(c) : (c = d.ae ? f.fd(d.index) : f.ed(d.index), c.qs(d))); else e instanceof we ? (f = !0 === a.zg, "number" === typeof c && + d instanceof G && (b ? (d.Zd(), e.Fe(f ? c : -1, d, f)) : e.Eo(c, d, f))) : e instanceof D ? "number" === typeof c && d instanceof we && (e = d, b ? this.Zb.hd(c) : (e.Ec(this), this.Zb.Yd(c, e))) : u.k("unknown ChangedEvent.Insert object: " + a.toString()); + this.Qh = !0 + } else c === ce ? (e = a.object, c = a.zg, d = a.oldValue, e instanceof A ? "number" === typeof c && d instanceof S ? (f = e, b ? f.Yd(c, d) : f.Fe(c)) : "number" === typeof c && d instanceof Se && (f = e, b ? (c = d.ae ? f.fd(d.index) : f.ed(d.index), c.qs(d)) : d.ae ? f.oE(c) : f.kE(c)) : e instanceof we ? (f = !0 === a.xg, "number" === + typeof c && d instanceof G && (b ? e.Eo(c, d, f) : (d.Zd(), e.Fe(f ? c : -1, d, f)))) : e instanceof D ? "number" === typeof c && d instanceof we && (e = d, b ? (e.Ec(this), this.Zb.Yd(c, e)) : this.Zb.hd(c)) : u.k("unknown ChangedEvent.Remove object: " + a.toString()), this.Qh = !0) : c !== ae && u.k("unknown ChangedEvent: " + a.toString()) + } + }; + D.prototype.startTransaction = D.prototype.Wb = function (a) { + return this.ha.Wb(a) + }; + D.prototype.commitTransaction = D.prototype.Wd = function (a) { + return this.ha.Wd(a) + }; + D.prototype.rollbackTransaction = D.prototype.ap = function () { + return this.ha.ap() + }; + D.prototype.updateAllTargetBindings = D.prototype.CI = function (a) { + void 0 === a && (a = ""); + for (var b = this.Sj; b.next();) b.value.Nb(a); + for (b = this.yg; b.next();) b.value.Nb(a); + for (b = this.links; b.next();) b.value.Nb(a) + }; + D.prototype.updateAllRelationshipsFromData = function () { + for (var a = this.Sj; a.next();) a.value.updateRelationshipsFromData(); + for (a = this.yg; a.next();) a.value.updateRelationshipsFromData(); + for (a = this.links; a.next();) a.value.updateRelationshipsFromData() + }; + + function Yj(a, b, c) { + if (a.sc || a.vd) a.$b = c; else if (a.sc = !0, null === a.ib) a.$b = c; else { + var d = a.ob.copy(), e = a.Ab, f = a.zb; + d.width = a.Ab / b; + d.height = a.zb / b; + var h = a.Rm.copy(); + if (isNaN(h.x)) switch (a.Ty) { + case Xb: + h.x = 0; + break; + case Yb: + h.x = e - 1; + break; + case Ib: + h.x = e / 2; + break; + case uc: + case tc: + h.x = e / 2 + } + if (isNaN(h.y)) switch (a.Ty) { + case Wb: + h.y = 0; + break; + case Zb: + h.y = f - 1; + break; + case Ib: + h.y = f / 2; + break; + case uc: + case tc: + h.y = f / 2 + } + null !== a.wE && (c = a.wE(a, c)); + c < a.Yg && (c = a.Yg); + c > a.Xg && (c = a.Xg); + a.position = new w(a.Ma.x + h.x / b - h.x / c, a.Ma.y + h.y / b - + h.y / c); + a.sc = !1; + a.$b = c; + a.dt(d, a.ob); + gj(a, !1); + a.ma(); + sj(a) + } + } + + D.prototype.dt = function (a, b, c) { + void 0 === c && (c = !1); + c || sj(this); + cj(this); + var d = this.Qb; + null === d || !d.jw || c || a.width === b.width && a.height === b.height || d.H(); + d = this.Va; + !0 === this.Jl && d instanceof jf && (this.N.da = this.XE(this.N.ff), d.doMouseMove()); + this.nz(a, b); + vj(this); + this.za("ViewportBoundsChanged", c ? u.mh : null, a) + }; + + function vj(a, b) { + void 0 === b && (b = null); + var c = a.ad; + if (null !== c && c.visible) { + for (var d = u.ul(), e = 1, f = 1, h = c.ya.n, k = h.length, l = 0; l < k; l++) { + var m = h[l], n = m.interval; + 2 > n || (hk(m.Fb) ? f = f * n / K.xD(f, n) : e = e * n / K.xD(e, n)) + } + h = c.aw; + d.m(f * h.width, e * h.height); + h = f = l = k = 0; + if (null !== b) k = b.width, l = b.height, f = b.x, h = b.y; else { + e = u.Sf(); + f = a.ob; + e.m(f.x, f.y, f.width, f.height); + for (h = a.Ul.i; h.next();) f = h.value.ob, f.J() && kb(e, f.x, f.y, f.width, f.height); + k = e.width; + l = e.height; + f = e.x; + h = e.y; + if (!e.J()) return + } + c.width = k + 2 * d.width; + c.height = l + 2 * d.height; + e = u.K(); + K.xs(f, h, 0, 0, d.width, d.height, e); + e.offset(-d.width, -d.height); + u.Oj(d); + c.T.location = e; + u.v(e) + } + } + + D.prototype.clearSelection = D.prototype.Lv = function () { + var a = 0 < this.selection.count; + a && this.za("ChangingSelection"); + of(this); + a && this.za("ChangedSelection") + }; + + function of(a) { + a = a.selection; + if (0 < a.count) { + for (var b = a.Ke(), c = b.length, d = 0; d < c; d++) b[d].Za = !1; + a.La(); + a.clear(); + a.freeze() + } + } + + D.prototype.select = D.prototype.select = function (a) { + null !== a && (u.C(a, G, D, "select:part"), a.layer.g === this && (!a.Za || 1 < this.selection.count) && (this.za("ChangingSelection"), of(this), a.Za = !0, this.za("ChangedSelection"))) + }; + D.prototype.selectCollection = D.prototype.CE = function (a) { + this.za("ChangingSelection"); + of(this); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + d instanceof G || u.k("Diagram.selectCollection given something that is not a Part: " + d); + d.Za = !0 + } else for (a = a.i; a.next();) d = a.value, d instanceof G || u.k("Diagram.selectCollection given something that is not a Part: " + d), d.Za = !0; + this.za("ChangedSelection") + }; + D.prototype.clearHighlighteds = D.prototype.WC = function () { + var a = this.bw; + if (0 < a.count) { + for (var b = a.Ke(), c = b.length, d = 0; d < c; d++) b[d].Wg = !1; + a.La(); + a.clear(); + a.freeze() + } + }; + D.prototype.highlight = function (a) { + null !== a && a.layer.g === this && (u.C(a, G, D, "highlight:part"), !a.Wg || 1 < this.bw.count) && (this.WC(), a.Wg = !0) + }; + D.prototype.highlightCollection = function (a) { + this.WC(); + if (u.isArray(a)) for (var b = u.qb(a), c = 0; c < b; c++) { + var d = u.fb(a, c); + d instanceof G || u.k("Diagram.highlightCollection given something that is not a Part: " + d); + d.Wg = !0 + } else for (a = a.i; a.next();) d = a.value, d instanceof G || u.k("Diagram.highlightCollection given something that is not a Part: " + d), d.Wg = !0 + }; + D.prototype.scroll = D.prototype.scroll = function (a, b, c) { + void 0 === c && (c = 1); + var d = "up" === b || "down" === b, e = 0; + "pixel" === a ? e = c : "line" === a ? e = c * (d ? this.mt : this.lt) : "page" === a ? (a = d ? this.ob.height : this.ob.width, a *= this.scale, 0 !== a && (e = Math.max(a - (d ? this.mt : this.lt), 0), e *= c)) : u.k("scrolling unit must be 'pixel', 'line', or 'page', not: " + a); + e /= this.scale; + c = this.position.copy(); + "up" === b ? c.y = this.position.y - e : "down" === b ? c.y = this.position.y + e : "left" === b ? c.x = this.position.x - e : "right" === b ? c.x = this.position.x + e : u.k("scrolling direction must be 'up', 'down', 'left', or 'right', not: " + + b); + this.position = c + }; + D.prototype.scrollToRect = D.prototype.cI = function (a) { + var b = this.ob; + b.Kj(a) || (a = a.Ok, a.x -= b.width / 2, a.y -= b.height / 2, this.position = a) + }; + D.prototype.centerRect = function (a) { + var b = this.ob; + a = a.Ok; + a.x -= b.width / 2; + a.y -= b.height / 2; + this.position = a + }; + D.prototype.transformDocToView = D.prototype.VE = function (a) { + var b = this.Sd; + b.reset(); + 1 !== this.$b && b.scale(this.$b); + var c = this.Ma; + (0 !== c.x || 0 !== c.y) && isFinite(c.x) && isFinite(c.y) && b.translate(-c.x, -c.y); + return a.copy().transform(this.Sd) + }; + D.prototype.transformViewToDoc = D.prototype.XE = function (a) { + var b = this.Sd; + b.reset(); + 1 !== this.$b && b.scale(this.$b); + var c = this.Ma; + (0 !== c.x || 0 !== c.y) && isFinite(c.x) && isFinite(c.y) && b.translate(-c.x, -c.y); + return Wa(a.copy(), this.Sd) + }; + var vf; + D.None = vf = u.s(D, "None", 0); + var kj; + D.Uniform = kj = u.s(D, "Uniform", 1); + var lj; + D.UniformToFill = lj = u.s(D, "UniformToFill", 2); + var Hg; + D.CycleAll = Hg = u.s(D, "CycleAll", 10); + var Lg; + D.CycleNotDirected = Lg = u.s(D, "CycleNotDirected", 11); + var Vg; + D.CycleNotDirectedFast = Vg = u.s(D, "CycleNotDirectedFast", 12); + var Wg; + D.CycleNotUndirected = Wg = u.s(D, "CycleNotUndirected", 13); + var Ig; + D.CycleDestinationTree = Ig = u.s(D, "CycleDestinationTree", 14); + var Kg; + D.CycleSourceTree = Kg = u.s(D, "CycleSourceTree", 15); + var Ni; + D.DocumentScroll = Ni = u.s(D, "DocumentScroll", 1); + var Hj; + D.InfiniteScroll = Hj = u.s(D, "InfiniteScroll", 2); + u.defineProperty(D, {DI: "validCycle"}, function () { + return this.sv + }, function (a) { + var b = this.sv; + b !== a && (u.rb(a, D, D, "validCycle"), this.sv = a, this.h("validCycle", b, a)) + }); + u.defineProperty(D, {ow: "linkSpacing"}, function () { + return this.gj + }, function (a) { + var b = this.gj; + b !== a && (u.ze(a, D, "linkSpacing"), 0 > a && u.wa(a, ">= zero", D, "linkSpacing"), this.gj = a, this.h("linkSpacing", b, a)) + }); + u.u(D, {mw: "layers"}, function () { + return this.Zb.i + }); + u.defineProperty(D, {uf: "isModelReadOnly"}, function () { + var a = this.Od; + return null === a ? !1 : a.nb + }, function (a) { + var b = this.Od; + null !== b && (b.nb = a) + }); + u.defineProperty(D, {nb: "isReadOnly"}, function () { + return this.vk + }, function (a) { + var b = this.vk; + b !== a && (u.j(a, "boolean", D, "isReadOnly"), this.vk = a, this.h("isReadOnly", b, a)) + }); + u.defineProperty(D, {isEnabled: "isEnabled"}, function () { + return this.Ne + }, function (a) { + var b = this.Ne; + b !== a && (u.j(a, "boolean", D, "isEnabled"), this.Ne = a, this.h("isEnabled", b, a)) + }); + u.defineProperty(D, {My: "allowClipboard"}, function () { + return this.Gt + }, function (a) { + var b = this.Gt; + b !== a && (u.j(a, "boolean", D, "allowClipboard"), this.Gt = a, this.h("allowClipboard", b, a)) + }); + u.defineProperty(D, {Ij: "allowCopy"}, function () { + return this.Xj + }, function (a) { + var b = this.Xj; + b !== a && (u.j(a, "boolean", D, "allowCopy"), this.Xj = a, this.h("allowCopy", b, a)) + }); + u.defineProperty(D, {lm: "allowDelete"}, function () { + return this.Yj + }, function (a) { + var b = this.Yj; + b !== a && (u.j(a, "boolean", D, "allowDelete"), this.Yj = a, this.h("allowDelete", b, a)) + }); + u.defineProperty(D, {Av: "allowDragOut"}, function () { + return this.Ht + }, function (a) { + var b = this.Ht; + b !== a && (u.j(a, "boolean", D, "allowDragOut"), this.Ht = a, this.h("allowDragOut", b, a)) + }); + u.defineProperty(D, {MC: "allowDrop"}, function () { + return this.It + }, function (a) { + var b = this.It; + b !== a && (u.j(a, "boolean", D, "allowDrop"), this.It = a, this.h("allowDrop", b, a)) + }); + u.defineProperty(D, {Ev: "allowTextEdit"}, function () { + return this.gk + }, function (a) { + var b = this.gk; + b !== a && (u.j(a, "boolean", D, "allowTextEdit"), this.gk = a, this.h("allowTextEdit", b, a)) + }); + u.defineProperty(D, {Bv: "allowGroup"}, function () { + return this.Zj + }, function (a) { + var b = this.Zj; + b !== a && (u.j(a, "boolean", D, "allowGroup"), this.Zj = a, this.h("allowGroup", b, a)) + }); + u.defineProperty(D, {Fv: "allowUngroup"}, function () { + return this.hk + }, function (a) { + var b = this.hk; + b !== a && (u.j(a, "boolean", D, "allowUngroup"), this.hk = a, this.h("allowUngroup", b, a)) + }); + u.defineProperty(D, {lo: "allowInsert"}, function () { + return this.Kt + }, function (a) { + var b = this.Kt; + b !== a && (u.j(a, "boolean", D, "allowInsert"), this.Kt = a, this.h("allowInsert", b, a)) + }); + u.defineProperty(D, {gs: "allowLink"}, function () { + return this.$j + }, function (a) { + var b = this.$j; + b !== a && (u.j(a, "boolean", D, "allowLink"), this.$j = a, this.h("allowLink", b, a)) + }); + u.defineProperty(D, {mm: "allowRelink"}, function () { + return this.bk + }, function (a) { + var b = this.bk; + b !== a && (u.j(a, "boolean", D, "allowRelink"), this.bk = a, this.h("allowRelink", b, a)) + }); + u.defineProperty(D, {Nk: "allowMove"}, function () { + return this.ak + }, function (a) { + var b = this.ak; + b !== a && (u.j(a, "boolean", D, "allowMove"), this.ak = a, this.h("allowMove", b, a)) + }); + u.defineProperty(D, {Cv: "allowReshape"}, function () { + return this.ck + }, function (a) { + var b = this.ck; + b !== a && (u.j(a, "boolean", D, "allowReshape"), this.ck = a, this.h("allowReshape", b, a)) + }); + u.defineProperty(D, {hs: "allowResize"}, function () { + return this.dk + }, function (a) { + var b = this.dk; + b !== a && (u.j(a, "boolean", D, "allowResize"), this.dk = a, this.h("allowResize", b, a)) + }); + u.defineProperty(D, {Dv: "allowRotate"}, function () { + return this.ek + }, function (a) { + var b = this.ek; + b !== a && (u.j(a, "boolean", D, "allowRotate"), this.ek = a, this.h("allowRotate", b, a)) + }); + u.defineProperty(D, {of: "allowSelect"}, function () { + return this.fk + }, function (a) { + var b = this.fk; + b !== a && (u.j(a, "boolean", D, "allowSelect"), this.fk = a, this.h("allowSelect", b, a)) + }); + u.defineProperty(D, {NC: "allowUndo"}, function () { + return this.Lt + }, function (a) { + var b = this.Lt; + b !== a && (u.j(a, "boolean", D, "allowUndo"), this.Lt = a, this.h("allowUndo", b, a)) + }); + u.defineProperty(D, {Gv: "allowZoom"}, function () { + return this.Nt + }, function (a) { + var b = this.Nt; + b !== a && (u.j(a, "boolean", D, "allowZoom"), this.Nt = a, this.h("allowZoom", b, a)) + }); + u.defineProperty(D, {lz: "hasVerticalScrollbar"}, function () { + return this.qu + }, function (a) { + var b = this.qu; + b !== a && (u.j(a, "boolean", D, "hasVerticalScrollbar"), this.qu = a, sj(this), this.ma(), this.h("hasVerticalScrollbar", b, a), gj(this, !1)) + }); + u.defineProperty(D, {kz: "hasHorizontalScrollbar"}, function () { + return this.pu + }, function (a) { + var b = this.pu; + b !== a && (u.j(a, "boolean", D, "hasHorizontalScrollbar"), this.pu = a, sj(this), this.ma(), this.h("hasHorizontalScrollbar", b, a), gj(this, !1)) + }); + u.defineProperty(D, {Re: "allowHorizontalScroll"}, function () { + return this.Jt + }, function (a) { + var b = this.Jt; + b !== a && (u.j(a, "boolean", D, "allowHorizontalScroll"), this.Jt = a, this.h("allowHorizontalScroll", b, a), gj(this, !1)) + }); + u.defineProperty(D, {Se: "allowVerticalScroll"}, function () { + return this.Mt + }, function (a) { + var b = this.Mt; + b !== a && (u.j(a, "boolean", D, "allowVerticalScroll"), this.Mt = a, this.h("allowVerticalScroll", b, a), gj(this, !1)) + }); + u.defineProperty(D, {lt: "scrollHorizontalLineChange"}, function () { + return this.$u + }, function (a) { + var b = this.$u; + b !== a && (u.j(a, "number", D, "scrollHorizontalLineChange"), 0 > a && u.wa(a, ">= 0", D, "scrollHorizontalLineChange"), this.$u = a, this.h("scrollHorizontalLineChange", b, a)) + }); + u.defineProperty(D, {mt: "scrollVerticalLineChange"}, function () { + return this.av + }, function (a) { + var b = this.av; + b !== a && (u.j(a, "number", D, "scrollVerticalLineChange"), 0 > a && u.wa(a, ">= 0", D, "scrollVerticalLineChange"), this.av = a, this.h("scrollVerticalLineChange", b, a)) + }); + u.defineProperty(D, {N: "lastInput"}, function () { + return this.Ob + }, function (a) { + this.Ob = a + }); + u.defineProperty(D, {wc: "firstInput"}, function () { + return this.nk + }, function (a) { + this.nk = a + }); + u.defineProperty(D, {ac: "currentCursor"}, function () { + return this.sx + }, function (a) { + "" === a && (a = this.Pp); + this.sx !== a && (u.j(a, "string", D, "currentCursor"), null !== this.ib && (this.sx = a, this.ib.style.cursor = a, this.Jb.style.cursor = a)) + }); + u.defineProperty(D, {lJ: "defaultCursor"}, function () { + return this.Pp + }, function (a) { + "" === a && (a = "auto"); + var b = this.Pp; + b !== a && (u.j(a, "string", D, "defaultCursor"), this.Pp = a, this.h("defaultCursor", b, a)) + }); + u.defineProperty(D, {zJ: "hasGestureZoom"}, function () { + return this.yn + }, function (a) { + var b = this.yn; + b !== a && (u.j(a, "boolean", D, "hasGestureZoom"), this.yn = a, this.h("hasGestureZoom", b, a)) + }); + u.defineProperty(D, {click: "click"}, function () { + return this.Wh + }, function (a) { + var b = this.Wh; + b !== a && (null !== a && u.j(a, "function", D, "click"), this.Wh = a, this.h("click", b, a)) + }); + u.defineProperty(D, {ts: "doubleClick"}, function () { + return this.ci + }, function (a) { + var b = this.ci; + b !== a && (null !== a && u.j(a, "function", D, "doubleClick"), this.ci = a, this.h("doubleClick", b, a)) + }); + u.defineProperty(D, {Uy: "contextClick"}, function () { + return this.Yh + }, function (a) { + var b = this.Yh; + b !== a && (null !== a && u.j(a, "function", D, "contextClick"), this.Yh = a, this.h("contextClick", b, a)) + }); + u.defineProperty(D, {Fz: "mouseOver"}, function () { + return this.mi + }, function (a) { + var b = this.mi; + b !== a && (null !== a && u.j(a, "function", D, "mouseOver"), this.mi = a, this.h("mouseOver", b, a)) + }); + u.defineProperty(D, {Ez: "mouseHover"}, function () { + return this.li + }, function (a) { + var b = this.li; + b !== a && (null !== a && u.j(a, "function", D, "mouseHover"), this.li = a, this.h("mouseHover", b, a)) + }); + u.defineProperty(D, {Dz: "mouseHold"}, function () { + return this.ki + }, function (a) { + var b = this.ki; + b !== a && (null !== a && u.j(a, "function", D, "mouseHold"), this.ki = a, this.h("mouseHold", b, a)) + }); + u.defineProperty(D, {EH: "mouseDragOver"}, function () { + return this.Nu + }, function (a) { + var b = this.Nu; + b !== a && (null !== a && u.j(a, "function", D, "mouseDragOver"), this.Nu = a, this.h("mouseDragOver", b, a)) + }); + u.defineProperty(D, {Cz: "mouseDrop"}, function () { + return this.ji + }, function (a) { + var b = this.ji; + b !== a && (null !== a && u.j(a, "function", D, "mouseDrop"), this.ji = a, this.h("mouseDrop", b, a)) + }); + u.defineProperty(D, {lA: "toolTip"}, function () { + return this.ti + }, function (a) { + var b = this.ti; + b !== a && (null !== a && u.C(a, lf, D, "toolTip"), this.ti = a, this.h("toolTip", b, a)) + }); + u.defineProperty(D, {contextMenu: "contextMenu"}, function () { + return this.Zh + }, function (a) { + var b = this.Zh; + b !== a && (null !== a && u.C(a, lf, D, "contextMenu"), this.Zh = a, this.h("contextMenu", b, a)) + }); + u.defineProperty(D, {Eb: "commandHandler"}, function () { + return this.ix + }, function (a) { + var b = this.ix; + b !== a && (u.C(a, sa, D, "commandHandler"), null !== a.g && u.k("Cannot share CommandHandlers between Diagrams: " + a.toString()), null !== b && b.Ec(null), this.ix = a, a.Ec(this)) + }); + u.defineProperty(D, {tb: "toolManager"}, function () { + return this.Fy + }, function (a) { + var b = this.Fy; + b !== a && (u.C(a, jf, D, "toolManager"), null !== a.g && u.k("Cannot share ToolManagers between Diagrams: " + a.toString()), null !== b && b.Ec(null), this.Fy = a, a.Ec(this)) + }); + u.defineProperty(D, {$y: "defaultTool"}, function () { + return this.yx + }, function (a) { + var b = this.yx; + b !== a && (u.C(a, xe, D, "defaultTool"), this.yx = a, this.Va === b && (this.Va = a)) + }); + u.defineProperty(D, {Va: "currentTool"}, function () { + return this.ux + }, function (a) { + var b = this.ux; + if (null !== b) for (b.na && b.doDeactivate(), b.cancelWaitAfter(), b.doStop(), b = this.Ul.i; b.next();) b.value.ma(); + null === a && (a = this.$y); + null !== a && (u.C(a, xe, D, "currentTool"), this.ux = a, a.Ec(this), a.doStart()) + }); + u.u(D, {selection: "selection"}, function () { + return this.dv + }); + u.defineProperty(D, {wH: "maxSelectionCount"}, function () { + return this.Iu + }, function (a) { + var b = this.Iu; + if (b !== a) if (u.j(a, "number", D, "maxSelectionCount"), 0 <= a && !isNaN(a)) { + if (this.Iu = a, this.h("maxSelectionCount", b, a), !this.ha.gb && (a = this.selection.count - a, 0 < a)) { + this.za("ChangingSelection"); + for (var b = this.selection.Ke(), c = 0; c < a; c++) b[c].Za = !1; + this.za("ChangedSelection") + } + } else u.wa(a, ">= 0", D, "maxSelectionCount") + }); + u.defineProperty(D, {HH: "nodeSelectionAdornmentTemplate"}, function () { + return this.Pu + }, function (a) { + var b = this.Pu; + b !== a && (u.C(a, lf, D, "nodeSelectionAdornmentTemplate"), this.Pu = a, this.h("nodeSelectionAdornmentTemplate", b, a)) + }); + u.defineProperty(D, {MG: "groupSelectionAdornmentTemplate"}, function () { + return this.mu + }, function (a) { + var b = this.mu; + b !== a && (u.C(a, lf, D, "groupSelectionAdornmentTemplate"), this.mu = a, this.h("groupSelectionAdornmentTemplate", b, a)) + }); + u.defineProperty(D, {sH: "linkSelectionAdornmentTemplate"}, function () { + return this.Du + }, function (a) { + var b = this.Du; + b !== a && (u.C(a, lf, D, "linkSelectionAdornmentTemplate"), this.Du = a, this.h("linkSelectionAdornmentTemplate", b, a)) + }); + u.u(D, {bw: "highlighteds"}, function () { + return this.ru + }); + u.defineProperty(D, {Qh: "isModified"}, function () { + var a = this.ha; + return a.isEnabled ? null !== a.Di ? !0 : this.Vx && this.Ig !== a.Ii : this.Vx + }, function (a) { + if (this.Vx !== a) { + u.j(a, "boolean", D, "isModified"); + this.Vx = a; + var b = this.ha; + !a && b.isEnabled && (this.Ig = b.Ii); + a || ik(this) + } + }); + + function ik(a) { + var b = a.Qh; + a.DC !== b && (a.DC = b, a.za("Modified")) + } + + u.defineProperty(D, {ga: "model"}, function () { + return this.Od + }, function (a) { + var b = this.Od; + if (b !== a) { + u.C(a, J, D, "model"); + this.Va.doCancel(); + null !== b && b.ha !== a.ha && b.ha.ND && u.k("Do not replace a Diagram.model while a transaction is in progress."); + this.Lb.Mi(); + this.Lv(); + this.lf = !1; + this.un = !0; + this.Ig = -2; + this.Ef = !1; + var c = this.vd; + this.vd = !0; + this.Lb.ml(); + null !== b && (b.Tz(this.GB), b instanceof Q && jk(this, b.Qj), jk(this, b.ah)); + this.Od = a; + a.Jy(this.FB); + kk(this, a.ah); + a instanceof Q && lk(this, a.Qj); + a.Tz(this.FB); + a.Jy(this.GB); + this.vd = c; + this.sc || this.ma(); + null !== b && (a.ha.isEnabled = b.ha.isEnabled) + } + }); + u.defineProperty(D, {Na: null}, function () { + return this.yB + }, function (a) { + this.yB = a + }); + + function Qi(a, b) { + if (b.ga === a.ga) { + var c = b.Ad, d = b.propertyName; + if (c === ae && "S" === d[0]) if ("StartingFirstTransaction" === d) c = a.tb, c.cf.each(function (b) { + b.Ec(a) + }), c.Mf.each(function (b) { + b.Ec(a) + }), c.Nf.each(function (b) { + b.Ec(a) + }), a.vd || a.lf || (a.du = !0, a.un && (a.Ef = !0), a.Uh.ml()); else if ("StartingUndo" === d || "StartingRedo" === d) { + var e = a.Lb; + e.Vg && !a.cb && e.Mi(); + a.za("ChangingSelection") + } else "StartedTransaction" === d && (e = a.Lb, e.Vg && !a.cb && e.Mi(), a.zu && e.ml()); else if (a.Na) { + a.Na = !1; + try { + var f = b.Lf; + if ("" !== f) if (c === $d) { + if ("linkFromKey" === + f) { + var h = b.object, k = a.ng(h); + if (null !== k) { + var l = b.newValue, m = a.Xe(l); + k.W = m + } + } else if ("linkToKey" === f) h = b.object, k = a.ng(h), null !== k && (l = b.newValue, m = a.Xe(l), k.ca = m); else if ("linkFromPortId" === f) { + if (h = b.object, k = a.ng(h), null !== k) { + var n = b.newValue; + "string" === typeof n && (k.pg = n) + } + } else if ("linkToPortId" === f) h = b.object, k = a.ng(h), null !== k && (n = b.newValue, "string" === typeof n && (k.lh = n)); else if ("nodeGroupKey" === f) { + var h = b.object, p = a.Nh(h); + if (null !== p) { + var q = b.newValue; + if (void 0 !== q) { + var r = a.Xe(q); + p.Ra = r instanceof + V ? r : null + } else p.Ra = null + } + } else if ("linkLabelKeys" === f) { + if (h = b.object, k = a.ng(h), null !== k) { + var s = b.oldValue, t = b.newValue; + if (u.isArray(s)) for (var v = u.qb(s), x = 0; x < v; x++) { + var B = u.fb(s, x), m = a.Xe(B); + null !== m && (m.ce = null) + } + if (u.isArray(t)) for (v = u.qb(t), x = 0; x < v; x++) B = u.fb(t, x), m = a.Xe(B), null !== m && (m.ce = k) + } + } else if ("nodeParentKey" === f) { + var y = b.object, C = a.Xe(b.newValue), I = a.Xv(y); + if (null !== I) { + var H = I.As(); + null !== H ? null === C ? a.remove(H) : a.qd ? H.W = C : H.ca = C : mk(a, C, I) + } + } else if ("parentLinkCategory" === f) { + var y = b.object, + I = a.Xv(y), T = b.newValue; + null !== I && "string" === typeof T && (H = I.As(), null !== H && (H.Kc = T)) + } else if ("nodeCategory" === f) { + var h = b.object, aa = a.Nh(h), T = b.newValue; + null !== aa && "string" === typeof T && (aa.Kc = T) + } else if ("linkCategory" === f) { + var h = b.object, R = a.ng(h), T = b.newValue; + null !== R && "string" === typeof T && (R.Kc = T) + } else if ("nodeDataArray" === f) { + var N = b.oldValue; + jk(a, N); + var Z = b.newValue; + kk(a, Z) + } else "linkDataArray" === f && (N = b.oldValue, jk(a, N), Z = b.newValue, lk(a, Z)); + a.Qh = !0 + } else c === be ? (Z = b.newValue, "nodeDataArray" === f && + u.Sa(Z) ? nk(a, Z) : "linkDataArray" === f && u.Sa(Z) ? ok(a, Z) : "linkLabelKeys" === f && Ne(Z) && (k = a.ng(b.object), m = a.Xe(Z), null !== k && null !== m && (m.ce = k)), a.Qh = !0) : c === ce ? (N = b.oldValue, "nodeDataArray" === f && u.Sa(N) ? pk(a, N) : "linkDataArray" === f && u.Sa(N) ? pk(a, N) : "linkLabelKeys" === f && Ne(N) && (m = a.Xe(N), null !== m && (m.ce = null)), a.Qh = !0) : c === ae && ("SourceChanged" === f ? Pi(a, b.object, b.propertyName) : "ModelDisplaced" === f && a.nl()); else if (c === $d) { + var Ea = b.propertyName, h = b.object; + if (h === a.ga) { + if ("nodeKeyProperty" === Ea || "nodeCategoryProperty" === + Ea || "linkFromKeyProperty" === Ea || "linkToKeyProperty" === Ea || "linkFromPortIdProperty" === Ea || "linkToPortIdProperty" === Ea || "linkLabelKeysProperty" === Ea || "nodeIsGroupProperty" === Ea || "nodeGroupKeyProperty" === Ea || "nodeParentKeyProperty" === Ea || "linkCategoryProperty" === Ea) a.ha.gb || a.nl() + } else Pi(a, h, Ea); + a.Qh = !0 + } else if (c === be || c === ce) qk(a, b), a.Qh = !0; else if (c === ae) { + if ("FinishedUndo" === d || "FinishedRedo" === d) a.ha.fi = !0, a.za("ChangedSelection"), ej(a), a.ha.fi = !1; + a.du = !0; + a.bf(); + e = a.Uh; + e.ld && 0 === a.ha.Le && fi(e); + "CommittedTransaction" === + d && a.ha.Yx && (a.Ig = Math.min(a.Ig, a.ha.Ii - 1)); + ik(a); + a.iy || "CommittedTransaction" !== d && "FinishedUndo" !== d && "FinishedRedo" !== d || (a.iy = !0, u.setTimeout(function () { + a.Va.standardMouseOver(); + a.iy = !1 + }, 10)) + } + } finally { + a.Na = !0 + } + } + } + } + + function Pi(a, b, c) { + if ("string" === typeof c) { + var d = a.Nh(b); + if (null !== d) d.Nb(c), a.ga instanceof qe && (d = a.ng(b), null !== d && d.Nb(c)); else { + for (var d = null, e = a.Ml.i; e.next();) { + for (var f = e.value, h = 0; h < f.length; h++) { + var k = f[h]; + null !== k.Yf && (k = k.Yf.ta(b), null !== k && (null === d && (d = u.eb()), d.push(k))) + } + if (null !== d) break + } + if (null !== d) { + for (e = 0; e < d.length; e++) d[e].Nb(c); + u.ra(d) + } + } + b === a.ga.Zs && a.CI(c) + } + } + + u.defineProperty(D, {Iw: "skipsModelSourceBindings"}, function () { + return this.eC + }, function (a) { + this.eC = a + }); + u.defineProperty(D, {tt: null}, function () { + return this.xy + }, function (a) { + this.xy = a + }); + + function qk(a, b) { + var c = b.Ad === be, d = c ? b.xg : b.zg, e = c ? b.newValue : b.oldValue, f = a.Ml.ta(b.object); + if (Array.isArray(f)) for (var h = 0; h < f.length; h++) { + var k = f[h]; + if (c) rk(k, e, d); else { + var l = d; + if (!(0 > l)) { + var m = l; + sk(k) && m++; + k.Fe(m); + tk(k, m, l) + } + } + } + } + + function Mj(a, b) { + var c = b.gi; + if (u.isArray(c)) { + var d = a.Ml.ta(c); + if (null === d) d = [], d.push(b), a.Ml.add(c, d); else { + for (c = 0; c < d.length; c++) if (d[c] === b) return; + d.push(b) + } + } + } + + function Qj(a, b) { + var c = b.gi; + if (u.isArray(c)) { + var d = a.Ml.ta(c); + if (null !== d) for (var e = 0; e < d.length; e++) if (d[e] === b) { + d.splice(e, 1); + 0 === d.length && a.Ml.remove(c); + break + } + } + } + + function Lj(a, b) { + for (var c = b.ya.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + f instanceof Ri && uk(a, f) + } + } + + function uk(a, b) { + var c = b.element; + if (null !== c) { + var c = c.src, d = a.Tn.ta(c); + if (null === d) d = [], d.push(b), a.Tn.add(c, d); else { + for (c = 0; c < d.length; c++) if (d[c] === b) return; + d.push(b) + } + } + } + + function Pj(a, b) { + for (var c = b.ya.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + f instanceof Ri && vk(a, f) + } + } + + function vk(a, b) { + var c = b.element; + if (null !== c) { + var c = c.src, d = a.Tn.ta(c); + if (null !== d) for (var e = 0; e < d.length; e++) if (d[e] === b) { + d.splice(e, 1); + 0 === d.length && a.Tn.remove(c); + break + } + } + } + + D.prototype.clear = D.prototype.clear = function () { + var a = null; + null !== this.ad && (a = this.ad.T); + this.ga.clear(); + for (var b = this.Zb.length, c = 0; c < b; c++) this.Zb.n[c].clear(); + this.Xf.clear(); + this.El.clear(); + this.Rn.clear(); + this.Ik.clear(); + this.Nn.clear(); + this.Db.clear(); + this.$h.clear(); + this.lk.clear(); + this.Ml.clear(); + this.dv.La(); + this.dv.clear(); + this.dv.freeze(); + this.ru.La(); + this.ru.clear(); + this.ru.freeze(); + gf = this.en = null; + hf = ""; + this.eu = (new z(NaN, NaN, NaN, NaN)).freeze(); + null !== a && (this.add(a), this.Db.remove(a)); + this.ma() + }; + D.prototype.reset = D.prototype.reset = function () { + this.sc = !0; + this.clear(); + this.Zb = new E(we); + this.qE(); + this.pE(); + this.Ma = (new w(NaN, NaN)).freeze(); + this.$b = 1; + this.tu = (new w(NaN, NaN)).freeze(); + this.uu = NaN; + this.Ku = 1E-4; + this.Hu = 100; + this.wv = (new w(NaN, NaN)).freeze(); + this.ku = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.xl = vf; + this.dn = uc; + this.tk = vf; + this.An = uc; + this.vu = this.su = xb; + this.Qt = (new rb(16, 16, 16, 16)).freeze(); + this.yu = !0; + this.sv = Hg; + this.Pp = "auto"; + this.Zh = this.ti = this.ji = this.Nu = this.ki = this.li = this.mi = this.Yh = + this.ci = this.Wh = null; + this.vk = !1; + this.Yj = this.Xj = this.Gt = this.Ne = !0; + this.It = this.Ht = !1; + this.Mt = this.Jt = this.qu = this.pu = this.Nt = this.Lt = this.fk = this.ek = this.dk = this.ck = this.ak = this.bk = this.$j = this.Kt = this.hk = this.Zj = this.gk = !0; + this.av = this.$u = 16; + this.Pe = (new rb(5)).freeze(); + this.Iu = 999999999; + this.Nd = null; + Ui(this); + this.ad = null; + this.qi = !0; + Ti(this); + this.Qb = new Je; + this.qi = !1; + this.ga = new Q; + this.lf = !1; + this.un = !0; + this.sc = this.Ef = !1; + this.ma() + }; + D.prototype.rebuildParts = D.prototype.nl = function () { + for (var a = this.Jz.i; a.next();) { + var b = a.value, c = a.key; + (!b.Fd() || b instanceof V) && u.k('Invalid node template in Diagram.nodeTemplateMap: template for "' + c + '" must be a Node or a simple Part, not a Group or Link: ' + b) + } + for (a = this.iz.i; a.next();) b = a.value, c = a.key, b instanceof V || u.k('Invalid group template in Diagram.groupTemplateMap: template for "' + c + '" must be a Group, not a normal Node or Link: ' + b); + for (a = this.xz.i; a.next();) b = a.value, c = a.key, b instanceof + W || u.k('Invalid link template in Diagram.linkTemplateMap: template for "' + c + '" must be a Link, not a normal Node or simple Part: ' + b); + a = u.eb(); + for (b = this.selection.i; b.next();) (c = b.value.data) && a.push(c); + for (var b = u.eb(), d = this.bw.i; d.next();) (c = d.value.data) && b.push(c); + c = u.eb(); + for (d = this.yg.i; d.next();) { + var e = d.value; + null !== e.data && (c.push(e.data), c.push(e.location)) + } + for (d = this.links.i; d.next();) e = d.value, null !== e.data && (c.push(e.data), c.push(e.location)); + for (d = this.Sj.i; d.next();) e = d.value, null !== + e.data && (c.push(e.data), c.push(e.location)); + d = this.ga; + d instanceof Q && jk(this, d.Qj); + jk(this, d.ah); + kk(this, d.ah); + d instanceof Q && lk(this, d.Qj); + for (d = 0; d < a.length; d++) e = this.Nh(a[d]), null !== e && (e.Za = !0); + for (d = 0; d < b.length; d++) e = this.Nh(b[d]), null !== e && (e.Wg = !0); + for (d = 0; d < c.length; d += 2) e = this.Nh(c[d]), null !== e && (e.location = c[d + 1]); + u.ra(a); + u.ra(b); + u.ra(c) + }; + + function kk(a, b) { + if (null !== b) { + for (var c = a.ga, d = u.qb(b), e = 0; e < d; e++) { + var f = u.fb(b, e); + c.Ue(f) ? nk(a, f, !1) : c instanceof Q && ok(a, f) + } + if (c instanceof Q || c instanceof qe) { + for (e = 0; e < d; e++) f = u.fb(b, e), c.Ue(f) && wk(a, f); + if (c instanceof Q) for (c = a.links; c.next();) xk(c.value) + } + yk(a, !1) + } + } + + function nk(a, b, c) { + if (void 0 !== b && null !== b && !a.ha.gb && !a.$h.contains(b)) { + void 0 === c && (c = !0); + var d = a.fz(b), e = zk(a, b, d); + null !== e && (nf(e), e = e.copy(), null !== e && (e.Vh = d, a.Vm && (e.wk = "Tool"), a.add(e), e.data = b, c && wk(a, b))) + } + } + + D.prototype.fz = function (a) { + return this.ga.fz(a) + }; + var Ak = !1, Bk = !1; + + function zk(a, b, c) { + var d = !1, e = a.ga; + e instanceof Q && (d = e.sz(b)); + d ? (b = a.iz.ta(c), null === b && (b = a.iz.ta(""), null === b && (Bk || (Bk = !0, u.trace('No Group template found for category "' + c + '"'), u.trace(" Using default group template")), b = a.SA))) : (b = a.Jz.ta(c), null === b && (b = a.Jz.ta(""), null === b && (Ak || (Ak = !0, u.trace('No Node template found for category "' + c + '"'), u.trace(" Using default node template")), b = a.UA))); + return b + } + + function wk(a, b) { + var c = a.ga; + if (c instanceof Q || c instanceof qe) { + var d = c.wb(b); + if (void 0 !== d) { + var e = Oe(c, d), f = a.Nh(b); + if (null !== e && null !== f) { + for (e = e.i; e.next();) { + var h = e.value; + if (c instanceof Q) { + var k = c; + if (k.Ue(h)) { + if (f instanceof V && k.Bm(h) === d) { + var l = f, h = a.Nh(h); + null !== h && (h.Ra = l) + } + } else { + var m = a.ng(h); + if (null !== m && f instanceof U && (l = f, k.$k(h) === d && (m.W = l), k.cl(h) === d && (m.ca = l), h = k.Pj(h), u.isArray(h))) for (k = 0; k < u.qb(h); k++) if (u.fb(h, k) === d) { + l.ce = m; + break + } + } + } else c instanceof qe && (m = c, m.Ue(h) && f instanceof + U && (l = f, m.Cm(h) === d && (h = a.Xv(h), mk(a, l, h)))) + } + Qe(c, d) + } + c instanceof Q ? (c = c.Bm(b), void 0 !== c && (c = a.Xe(c), c instanceof V && (f.Ra = c))) : c instanceof qe && (c = c.Cm(b), void 0 !== c && f instanceof U && (l = f, f = a.Xe(c), mk(a, f, l))) + } + } + } + + function mk(a, b, c) { + if (null !== b && null !== c) { + var d = a.tb.TD, e = b, f = c; + if (a.qd) for (b = f.oe; b.next();) { + if (b.value.ca === f) return + } else for (e = c, f = b, b = e.oe; b.next();) if (b.value.W === e) return; + null !== d && Jg(d, e, f, null, !0) || (d = a.Zv(c.data), b = Ck(a, d), null !== b && (nf(b), b = b.copy(), null !== b && (b.Vh = d, b.W = e, b.ca = f, a.add(b), b.data = c.data))) + } + } + + function lk(a, b) { + if (null !== b) { + for (var c = u.qb(b), d = 0; d < c; d++) { + var e = u.fb(b, d); + ok(a, e) + } + yk(a, !1) + } + } + + function ok(a, b) { + if (void 0 !== b && null !== b && !a.ha.gb && !a.lk.contains(b)) { + var c = a.Zv(b), d = Ck(a, c); + if (null !== d && (nf(d), d = d.copy(), null !== d)) { + d.Vh = c; + var c = a.ga, e = c.FG(b); + "" !== e && (d.pg = e); + e = c.$k(b); + void 0 !== e && (e = a.Xe(e), e instanceof U && (d.W = e)); + e = c.IG(b); + "" !== e && (d.lh = e); + e = c.cl(b); + void 0 !== e && (e = a.Xe(e), e instanceof U && (d.ca = e)); + c = c.Pj(b); + if (u.isArray(c)) for (var e = u.qb(c), f = 0; f < e; f++) { + var h = u.fb(c, f), h = a.Xe(h); + null !== h && (h.ce = d) + } + a.add(d); + d.data = b + } + } + } + + D.prototype.Zv = function (a) { + var b = this.ga, c = ""; + b instanceof Q ? c = b.Zv(a) : b instanceof qe && (c = b.HG(a)); + return c + }; + var Dk = !1; + + function Ck(a, b) { + var c = a.xz.ta(b); + null === c && (c = a.xz.ta(""), null === c && (Dk || (Dk = !0, u.trace('No Link template found for category "' + b + '"'), u.trace(" Using default link template")), c = a.TA)); + return c + } + + function jk(a, b) { + for (var c = u.qb(b), d = 0; d < c; d++) { + var e = u.fb(b, d); + pk(a, e) + } + } + + function pk(a, b) { + if (void 0 !== b && null !== b) { + var c = a.Nh(b); + if (null !== c) { + c.Za = !1; + c.Wg = !1; + var d = c.layer; + if (null !== d && d.g === a) { + var e = a.ga; + if (e instanceof Q && c instanceof U) { + var f = c, h = e.wb(f.data); + if (void 0 !== h) { + for (var k = f.oe; k.next();) Pe(e, h, k.value.data); + f.tf && (k = f.ce, null !== k && Pe(e, h, k.data)); + if (f instanceof V) for (f = f.Mc; f.next();) k = f.value.data, e.Ue(k) && Pe(e, h, k) + } + } else if (e instanceof qe && c instanceof U) { + f = c; + k = a.ng(f.data); + if (null !== k) { + k.Za = !1; + k.Wg = !1; + var l = k.layer; + if (null !== l) { + var m = l.Fe(-1, k, !1); + 0 <= m && a.Dc(ce, "parts", l, k, null, m, null); + m = k.Rs; + null !== m && m(k, l, null) + } + } + k = a.qd; + for (f = f.oe; f.next();) l = f.value, l = (k ? l.ca : l.W).data, e.Ue(l) && Pe(e, h, l) + } + e = d.Fe(-1, c, !1); + 0 <= e && a.Dc(ce, "parts", d, c, null, e, null); + e = c.Rs; + null !== e && e(c, d, null) + } + } + } + } + + D.prototype.findPartForKey = D.prototype.zG = function (a) { + if (null === a || void 0 === a) return null; + a = this.ga.qf(a); + return null === a ? null : this.$h.ta(a) + }; + D.prototype.findNodeForKey = D.prototype.Xe = function (a) { + if (null === a || void 0 === a) return null; + a = this.ga.qf(a); + if (null === a) return null; + a = this.$h.ta(a); + return a instanceof U ? a : null + }; + D.prototype.findPartForData = D.prototype.Nh = function (a) { + if (null === a) return null; + var b = this.$h.ta(a); + return null !== b ? b : b = this.lk.ta(a) + }; + D.prototype.findNodeForData = D.prototype.Xv = function (a) { + if (null === a) return null; + a = this.$h.ta(a); + return a instanceof U ? a : null + }; + D.prototype.findLinkForData = D.prototype.ng = function (a) { + return null === a ? null : this.lk.ta(a) + }; + D.prototype.findNodesByExample = function (a) { + for (var b = new F, c = this.Rn.i; c.next();) { + var d = c.value, e = d.data; + if (null !== e) for (var f = 0; f < arguments.length; f++) { + var h = arguments[f]; + if (u.Sa(h) && Ek(this, e, h)) { + b.add(d); + break + } + } + } + return b.i + }; + D.prototype.findLinksByExample = function (a) { + for (var b = new F, c = this.Nn.i; c.next();) { + var d = c.value, e = d.data; + if (null !== e) for (var f = 0; f < arguments.length; f++) { + var h = arguments[f]; + if (u.Sa(h) && Ek(this, e, h)) { + b.add(d); + break + } + } + } + return b.i + }; + + function Ek(a, b, c) { + for (var d in c) { + var e = b[d], f = c[d]; + if (u.isArray(f)) { + if (!u.isArray(e) || e.length >= f.length) return !1; + for (var h = 0; h < e.length; h++) { + var k = e[h], l = f[h]; + if (void 0 !== l && !Fk(a, k, l)) return !1 + } + } else if (!Fk(a, e, f)) return !1 + } + return !0 + } + + function Fk(a, b, c) { + if ("function" === typeof c) { + if (!c(b)) return !1 + } else if (c instanceof RegExp) { + if (!b || !c.test(b.toString())) return !1 + } else if (u.Sa(b) && u.Sa(c)) { + if (!Ek(a, b, c)) return !1 + } else if (b !== c) return !1; + return !0 + } + + u.defineProperty(D, {bK: "nodeTemplate"}, function () { + return this.ni.ta("") + }, function (a) { + var b = this.ni.ta(""); + b !== a && (u.C(a, G, D, "nodeTemplate"), this.ni.add("", a), this.h("nodeTemplate", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {Jz: "nodeTemplateMap"}, function () { + return this.ni + }, function (a) { + var b = this.ni; + b !== a && (u.C(a, la, D, "nodeTemplateMap"), this.ni = a, this.h("nodeTemplateMap", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {yJ: "groupTemplate"}, function () { + return this.ok.ta("") + }, function (a) { + var b = this.ok.ta(""); + b !== a && (u.C(a, V, D, "groupTemplate"), this.ok.add("", a), this.h("groupTemplate", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {iz: "groupTemplateMap"}, function () { + return this.ok + }, function (a) { + var b = this.ok; + b !== a && (u.C(a, la, D, "groupTemplateMap"), this.ok = a, this.h("groupTemplateMap", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {QJ: "linkTemplate"}, function () { + return this.hj.ta("") + }, function (a) { + var b = this.hj.ta(""); + b !== a && (u.C(a, W, D, "linkTemplate"), this.hj.add("", a), this.h("linkTemplate", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {xz: "linkTemplateMap"}, function () { + return this.hj + }, function (a) { + var b = this.hj; + b !== a && (u.C(a, la, D, "linkTemplateMap"), this.hj = a, this.h("linkTemplateMap", b, a), this.ha.gb || this.nl()) + }); + u.defineProperty(D, {fH: null}, function () { + return this.Jl + }, function (a) { + this.Jl = a + }); + u.defineProperty(D, {Ge: "isMouseCaptured"}, function () { + return this.uB + }, function (a) { + var b = this.ib; + null !== b && (a ? (this.N.bubbles = !1, b.removeEventListener("mousemove", this.Qo, !1), b.removeEventListener("mousedown", this.Po, !1), b.removeEventListener("mouseup", this.So, !1), b.removeEventListener("mousewheel", this.Zg, !1), b.removeEventListener("DOMMouseScroll", this.Zg, !1), b.removeEventListener("mouseout", this.Ro, !1), window.addEventListener("mousemove", this.Qo, !0), window.addEventListener("mousedown", this.Po, !0), + window.addEventListener("mouseup", this.So, !0), window.addEventListener("mousewheel", this.Zg, !0), window.addEventListener("DOMMouseScroll", this.Zg, !0), window.addEventListener("mouseout", this.Ro, !0), window.addEventListener("selectstart", this.preventDefault, !1)) : (window.removeEventListener("mousemove", this.Qo, !0), window.removeEventListener("mousedown", this.Po, !0), window.removeEventListener("mouseup", this.So, !0), window.removeEventListener("mousewheel", this.Zg, !0), window.removeEventListener("DOMMouseScroll", + this.Zg, !0), window.removeEventListener("mouseout", this.Ro, !0), window.removeEventListener("selectstart", this.preventDefault, !1), b.addEventListener("mousemove", this.Qo, !1), b.addEventListener("mousedown", this.Po, !1), b.addEventListener("mouseup", this.So, !1), b.addEventListener("mousewheel", this.Zg, !1), b.addEventListener("DOMMouseScroll", this.Zg, !1), b.addEventListener("mouseout", this.Ro, !1)), this.uB = a) + }); + u.defineProperty(D, {position: "position"}, function () { + return this.Ma + }, function (a) { + var b = this.Ma; + if (!b.L(a)) { + u.C(a, w, D, "position"); + var c = this.ob.copy(); + a = a.copy(); + if (!this.sc && null !== this.ib) { + this.sc = !0; + var d = this.scale; + ij(this, a, this.Cd, this.Ab / d, this.zb / d, this.dn, !1); + this.sc = !1 + } + this.Ma = a.Z(); + a = this.Lb; + a.ld && si(a, b, this.Ma); + this.sc || this.dt(c, this.ob) + } + }); + u.defineProperty(D, {TG: "initialPosition"}, function () { + return this.tu + }, function (a) { + this.tu.L(a) || (u.C(a, w, D, "initialPosition"), this.tu = a.Z()) + }); + u.defineProperty(D, {UG: "initialScale"}, function () { + return this.uu + }, function (a) { + this.uu !== a && (u.j(a, "number", D, "initialScale"), this.uu = a) + }); + u.defineProperty(D, {Gs: "grid"}, function () { + null === this.ad && aj(this); + return this.ad + }, function (a) { + var b = this.ad; + if (b !== a) { + null === b && (aj(this), b = this.ad); + u.C(a, A, D, "grid"); + a.type !== bj && u.k("Diagram.grid must be a Panel of type Panel.Grid"); + var c = b.S; + null !== c && c.remove(b); + this.ad = a; + a.name = "GRID"; + null !== c && c.add(a); + vj(this); + this.ma(); + this.h("grid", b, a) + } + }); + u.u(D, {ob: "viewportBounds"}, function () { + var a = this.CC; + if (null === this.ib) return a; + var b = this.Ma, c = this.$b; + a.m(b.x, b.y, Math.max(this.Ab, 0) / c, Math.max(this.zb, 0) / c); + return a + }); + u.defineProperty(D, {uD: "fixedBounds"}, function () { + return this.ku + }, function (a) { + var b = this.ku; + b.L(a) || (u.C(a, z, D, "fixedBounds"), -Infinity !== a.width && Infinity !== a.height && -Infinity !== a.height || u.k("fixedBounds width/height must not be Infinity"), this.ku = a = a.Z(), this.pc(), this.h("fixedBounds", b, a)) + }); + u.defineProperty(D, {xE: "scrollMargin"}, function () { + return this.vy + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, D, "scrollMargin"); + var b = this.vy; + b.L(a) || (this.vy = a = a.Z(), this.pc(), this.h("scrollMargin", b, a)) + }); + u.defineProperty(D, {yE: "scrollMode"}, function () { + return this.wy + }, function (a) { + var b = this.wy; + b !== a && (u.rb(a, D, D, "scrollMode"), this.wy = a, a === Ni && gj(this, !1), this.h("scrollMode", b, a)) + }); + u.defineProperty(D, {gE: "positionComputation"}, function () { + return this.oy + }, function (a) { + var b = this.oy; + b !== a && (null !== a && u.j(a, "function", D, "positionComputation"), this.oy = a, gj(this, !1), this.h("positionComputation", b, a)) + }); + u.defineProperty(D, {wE: "scaleComputation"}, function () { + return this.qy + }, function (a) { + var b = this.qy; + b !== a && (null !== a && u.j(a, "function", D, "scaleComputation"), this.qy = a, Yj(this, this.scale, this.scale), this.h("scaleComputation", b, a)) + }); + u.u(D, {Cd: "documentBounds"}, function () { + return this.eu + }); + + function jj(a, b) { + a.ei = !1; + var c = a.eu; + c.L(b) || (b = b.Z(), a.eu = b, gj(a, !1), a.za("DocumentBoundsChanged", null, c.copy()), sj(a)) + } + + u.defineProperty(D, {scale: "scale"}, function () { + return this.$b + }, function (a) { + var b = this.$b; + u.ze(a, D, "scale"); + b !== a && Yj(this, b, a) + }); + u.defineProperty(D, {no: "autoScale"}, function () { + return this.xl + }, function (a) { + var b = this.xl; + b !== a && (u.rb(a, D, D, "autoScale"), this.xl = a, this.h("autoScale", b, a), a !== vf && gj(this, !1)) + }); + u.defineProperty(D, {BJ: "initialAutoScale"}, function () { + return this.tk + }, function (a) { + var b = this.tk; + b !== a && (u.rb(a, D, D, "initialAutoScale"), this.tk = a, this.h("initialAutoScale", b, a)) + }); + u.defineProperty(D, {VG: "initialViewportSpot"}, function () { + return this.vu + }, function (a) { + var b = this.vu; + b !== a && (u.C(a, L, D, "initialViewportSpot"), a.pd() || u.k("initialViewportSpot must be a real Spot: " + a), this.vu = a, this.h("initialViewportSpot", b, a)) + }); + u.defineProperty(D, {SG: "initialDocumentSpot"}, function () { + return this.su + }, function (a) { + var b = this.su; + b !== a && (u.C(a, L, D, "initialDocumentSpot"), a.pd() || u.k("initialViewportSpot must be a real Spot: " + a), this.su = a, this.h("initialDocumentSpot", b, a)) + }); + u.defineProperty(D, {Yg: "minScale"}, function () { + return this.Ku + }, function (a) { + u.ze(a, D, "minScale"); + var b = this.Ku; + b !== a && (0 < a ? (this.Ku = a, this.h("minScale", b, a), a > this.scale && (this.scale = a)) : u.wa(a, "> 0", D, "minScale")) + }); + u.defineProperty(D, {Xg: "maxScale"}, function () { + return this.Hu + }, function (a) { + u.ze(a, D, "maxScale"); + var b = this.Hu; + b !== a && (0 < a ? (this.Hu = a, this.h("maxScale", b, a), a < this.scale && (this.scale = a)) : u.wa(a, "> 0", D, "maxScale")) + }); + u.defineProperty(D, {Rm: "zoomPoint"}, function () { + return this.wv + }, function (a) { + this.wv.L(a) || (u.C(a, w, D, "zoomPoint"), this.wv = a = a.Z()) + }); + u.defineProperty(D, {Ty: "contentAlignment"}, function () { + return this.dn + }, function (a) { + var b = this.dn; + b.L(a) || (u.C(a, L, D, "contentAlignment"), this.dn = a = a.Z(), this.h("contentAlignment", b, a), gj(this, !1)) + }); + u.defineProperty(D, {CJ: "initialContentAlignment"}, function () { + return this.An + }, function (a) { + var b = this.An; + b.L(a) || (u.C(a, L, D, "initialContentAlignment"), this.An = a = a.Z(), this.h("initialContentAlignment", b, a)) + }); + u.defineProperty(D, {padding: "padding"}, function () { + return this.Pe + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, D, "padding"); + var b = this.Pe; + b.L(a) || (this.Pe = a = a.Z(), this.pc(), this.h("padding", b, a)) + }); + u.u(D, {yg: "nodes"}, function () { + return this.Rn.i + }); + u.u(D, {links: "links"}, function () { + return this.Nn.i + }); + u.u(D, {Sj: "parts"}, function () { + return this.Db.i + }); + D.prototype.findTopLevelNodesAndLinks = function () { + for (var a = new F(G), b = this.Rn.i; b.next();) { + var c = b.value; + c.Ho && a.add(c) + } + for (b = this.Nn.i; b.next();) c = b.value, c.Ho && a.add(c); + return a.i + }; + D.prototype.findTopLevelGroups = function () { + return this.Ik.i + }; + u.defineProperty(D, {Qb: "layout"}, function () { + return this.Nd + }, function (a) { + var b = this.Nd; + b !== a && (u.C(a, Je, D, "layout"), null !== b && (b.g = null, b.group = null), this.Nd = a, a.g = this, a.group = null, this.Ot = !0, this.h("layout", b, a), this.de()) + }); + D.prototype.layoutDiagram = function (a) { + ej(this); + a && yk(this, !0); + xj(this, !1) + }; + + function yk(a, b) { + for (var c = a.Ik.i; c.next();) Gk(a, c.value, b); + null !== a.Qb && (b ? a.Qb.vf = !1 : a.Qb.H()) + } + + function Gk(a, b, c) { + if (null !== b) { + for (var d = b.Pn.i; d.next();) Gk(a, d.value, c); + null !== b.Qb && (c ? b.Qb.vf = !1 : b.Qb.H()) + } + } + + function xj(a, b) { + if (!a.zx) { + var c = a.Qb, d = a.zu; + a.zu = !0; + var e = a.Na; + a.Na = !0; + try { + a.Wb("Layout"); + for (var f = a.Ik.i; f.next();) Hk(a, f.value, b); + c.vf || b && !c.PD || (c.doLayout(a), ej(a), c.vf = !0) + } finally { + a.Wd("Layout"), a.Ot = !c.vf, a.zu = d, a.Na = e + } + } + } + + function Hk(a, b, c) { + if (null !== b) { + for (var d = b.Pn.i; d.next();) Hk(a, d.value, c); + d = b.Qb; + null === d || d.vf || c && !d.PD || (b.jy = !b.location.J(), d.doLayout(b), b.H(Ik), d.vf = !0, zj(a, b)) + } + } + + u.defineProperty(D, {qd: "isTreePathToChildren"}, function () { + return this.yu + }, function (a) { + var b = this.yu; + if (b !== a && (u.j(a, "boolean", D, "isTreePathToChildren"), this.yu = a, this.h("isTreePathToChildren", b, a), !this.ha.gb)) for (a = this.yg; a.next();) Jk(a.value) + }); + D.prototype.findTreeRoots = function () { + for (var a = new E(U), b = this.yg; b.next();) { + var c = b.value; + c.Ho && null === c.As() && a.add(c) + } + return a.i + }; + u.defineProperty(D, {me: null}, function () { + return this.mB + }, function (a) { + this.mB = a + }); + + function Oi(a) { + function b(a) { + var b = a.toLowerCase(), h = new E("function"); + c.add(a, h); + c.add(b, h); + d.add(a, a); + d.add(b, a) + } + + var c = new la("string", E), d = new la("string", "string"); + b("AnimationStarting"); + b("AnimationFinished"); + b("BackgroundSingleClicked"); + b("BackgroundDoubleClicked"); + b("BackgroundContextClicked"); + b("ClipboardChanged"); + b("ClipboardPasted"); + b("DocumentBoundsChanged"); + b("ExternalObjectsDropped"); + b("InitialLayoutCompleted"); + b("LayoutCompleted"); + b("LinkDrawn"); + b("LinkRelinked"); + b("LinkReshaped"); + b("Modified"); + b("ObjectSingleClicked"); + b("ObjectDoubleClicked"); + b("ObjectContextClicked"); + b("PartCreated"); + b("PartResized"); + b("PartRotated"); + b("SelectionMoved"); + b("SelectionCopied"); + b("SelectionDeleting"); + b("SelectionDeleted"); + b("SelectionGrouped"); + b("SelectionUngrouped"); + b("ChangingSelection"); + b("ChangedSelection"); + b("SubGraphCollapsed"); + b("SubGraphExpanded"); + b("TextEdited"); + b("TreeCollapsed"); + b("TreeExpanded"); + b("ViewportBoundsChanged"); + a.Bx = c; + a.Ax = d + } + + function ma(a, b) { + var c = a.Ax.ta(b); + return null !== c ? c : a.Ax.ta(b.toLowerCase()) + } + + function Kk(a, b) { + var c = a.Bx.ta(b); + if (null !== c) return c; + c = a.Bx.ta(b.toLowerCase()); + if (null !== c) return c; + u.k("Unknown DiagramEvent name: " + b); + return null + } + + D.prototype.addDiagramListener = D.prototype.Ky = function (a, b) { + u.j(a, "string", D, "addDiagramListener:name"); + u.j(b, "function", D, "addDiagramListener:listener"); + var c = Kk(this, a); + null !== c && c.add(b) + }; + D.prototype.removeDiagramListener = D.prototype.lE = function (a, b) { + u.j(a, "string", D, "removeDiagramListener:name"); + u.j(b, "function", D, "addDiagramListener:listener"); + var c = Kk(this, a); + null !== c && c.remove(b) + }; + D.prototype.raiseDiagramEvent = D.prototype.za = function (a, b, c) { + var d = Kk(this, a), e = new Nd; + e.g = this; + e.name = ma(this, a); + void 0 !== b && (e.hA = b); + void 0 !== c && (e.Mz = c); + a = d.length; + if (1 === a) d = d.ja(0), d(e); else if (0 !== a) for (b = d.Ke(), c = 0; c < a; c++) d = b[c], d(e); + return e.cancel + }; + + function Cg(a, b) { + var c = !1; + a.ob.Kj(b) && (c = !0); + c = a.dz(b, function (a) { + return a.T + }, function (a) { + return a instanceof W + }, !0, function (a) { + return a instanceof W + }, c); + if (0 !== c.count) for (c = c.i; c.next();) { + var d = c.value; + d.el && d.Vb() + } + } + + D.prototype.isUnoccupied = D.prototype.Jo = function (a, b) { + void 0 === b && (b = null); + return Lk(this, !1, null, b).Jo(a.x, a.y, a.width, a.height) + }; + + function Lk(a, b, c, d) { + null === a.md && (a.md = new Mk); + if (a.md.Ls || a.md.group !== c || a.md.fA !== d) { + if (null === c) { + b = a.ei ? fj(a) : a.Cd.copy(); + b.Jf(100, 100); + a.md.initialize(b); + b = u.Sf(); + for (var e = a.yg; e.next();) { + var f = e.value, h = f.layer; + null !== h && h.visible && !h.Ac && Nk(a, f, d, b) + } + } else for (c.ba.J() || c.pf(), b = c.ba.copy(), b.Jf(20, 20), a.md.initialize(b), b = u.Sf(), e = c.Mc; e.next();) f = e.value, f instanceof U && Nk(a, f, d, b); + u.ic(b); + a.md.group = c; + a.md.fA = d; + a.md.Ls = !1 + } else b && Ok(a.md); + return a.md + } + + function Nk(a, b, c, d) { + if (b !== c) if (b.Ea() && b.canAvoid()) { + c = b.getAvoidableRect(d); + d = a.md.ro; + b = a.md.po; + for (var e = c.x + c.width, f = c.y + c.height, h = c.x; h < e; h += d) { + for (var k = c.y; k < f; k += b) Pk(a.md, h, k); + Pk(a.md, h, f) + } + for (k = c.y; k < f; k += b) Pk(a.md, e, k); + Pk(a.md, e, f) + } else if (b instanceof V) for (b = b.Mc; b.next();) e = b.value, e instanceof U && Nk(a, e, c, d) + } + + function Qk(a, b) { + null === a.md || a.md.Ls || null !== b && !b.canAvoid() || (a.md.Ls = !0) + } + + D.prototype.simulatedMouseMove = D.prototype.Hw = function (a, b, c) { + if (null !== Ef) { + var d = Ef.g; + c instanceof D || (c = null); + var e = Ff; + c !== e && (null !== e && e !== d && null !== e.tb.Ed && (Kf(e), Ef.fw = !1, e.tb.Ed.doSimulatedDragLeave()), Ff = c, null !== c && c !== d && null !== c.tb.Ed && (eg(), e = c.tb.Ed, ag.contains(e) || ag.add(e), c.tb.Ed.doSimulatedDragEnter())); + if (null === c || c === d || !c.MC || c.nb || !c.lo) return !1; + d = c.tb.Ed; + null !== d && (null !== a ? b = c.$p(a) : null === b && (b = new w), c.Ob.da = b, c.Ob.Wk = !1, c.Ob.up = !1, d.doSimulatedDragOver()); + return !0 + } + return !1 + }; + D.prototype.simulatedMouseUp = D.prototype.JE = function (a, b, c, d) { + if (null !== Ef) { + null === d && (d = b); + b = Ff; + var e = Ef.g; + if (d !== b) { + if (null !== b && b !== e && null !== b.tb.Ed) return Kf(b), Ef.fw = !1, b.tb.Ed.doSimulatedDragLeave(), !1; + Ff = d; + null !== d && null !== d.tb.Ed && (eg(), b = d.tb.Ed, ag.contains(b) || ag.add(b), d.tb.Ed.doSimulatedDragEnter()) + } + if (null === d) return Ef.doCancel(), !0; + if (d !== this) return null !== a && (c = d.$p(a)), d.Ob.da = c, d.Ob.Wk = !1, d.Ob.up = !0, a = d.tb.Ed, null !== a && a.doSimulatedDrop(), a = Ef, null !== a && (d = a.mayCopy(), a.zf = d ? "Copy" : + "Move", a.stopTool()), !0 + } + return !1 + }; + u.defineProperty(D, {SC: "autoScrollRegion"}, function () { + return this.Qt + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, D, "autoScrollRegion"); + var b = this.Qt; + b.L(a) || (this.Qt = a = a.Z(), this.pc(), this.h("autoScrollRegion", b, a)) + }); + + function xg(a, b) { + a.Pt.assign(b); + Rk(a, a.Pt).De(a.position) ? Kf(a) : Sk(a) + } + + function Sk(a) { + -1 === a.Zm && (a.Zm = u.setInterval(function () { + if (-1 !== a.Zm) { + Kf(a); + var b = a.N.event; + if (null !== b) { + var c = Rk(a, a.Pt); + c.De(a.position) || (a.position = c, a.N.da = a.XE(a.Pt), a.Hw(b, null, b.target.Y) || a.doMouseMove(), a.ei = !0, jj(a, a.kg()), a.Md = !0, a.bf(), Sk(a)) + } + } + }, a.lF)) + } + + function Kf(a) { + -1 !== a.Zm && (u.clearInterval(a.Zm), a.Zm = -1) + } + + function Rk(a, b) { + var c = a.position, d = a.SC; + if (0 >= d.top && 0 >= d.left && 0 >= d.right && 0 >= d.bottom) return c; + var e = a.ob, f = a.scale, e = u.Vj(0, 0, e.width * f, e.height * f), h = u.fc(0, 0); + if (b.x >= e.x && b.x < e.x + d.left) { + var k = Math.max(a.lt, 1), k = k | 0; + h.x -= k; + b.x < e.x + d.left / 2 && (h.x -= k); + b.x < e.x + d.left / 4 && (h.x -= 4 * k) + } else b.x <= e.x + e.width && b.x > e.x + e.width - d.right && (k = Math.max(a.lt, 1), k |= 0, h.x += k, b.x > e.x + e.width - d.right / 2 && (h.x += k), b.x > e.x + e.width - d.right / 4 && (h.x += 4 * k)); + b.y >= e.y && b.y < e.y + d.top ? (k = Math.max(a.mt, 1), k |= 0, h.y -= k, b.y < e.y + + d.top / 2 && (h.y -= k), b.y < e.y + d.top / 4 && (h.y -= 4 * k)) : b.y <= e.y + e.height && b.y > e.y + e.height - d.bottom && (k = Math.max(a.mt, 1), k |= 0, h.y += k, b.y > e.y + e.height - d.bottom / 2 && (h.y += k), b.y > e.y + e.height - d.bottom / 4 && (h.y += 4 * k)); + h.De(K.Wj) || (c = new w(c.x + h.x / f, c.y + h.y / f)); + u.ic(e); + u.v(h); + return c + } + + D.prototype.makeSVG = D.prototype.makeSvg = function (a) { + void 0 === a && (a = new pa); + a.context = "svg"; + a = Tk(this, a); + return null !== a ? a.sl : null + }; + D.prototype.makeImage = function (a) { + void 0 === a && (a = new pa); + var b = (a.document || document).createElement("img"); + b.src = this.tH(a); + return b + }; + D.prototype.makeImageData = D.prototype.tH = function (a) { + void 0 === a && (a = new pa); + var b = Tk(this, a); + return null !== b ? b.toDataURL(a.type, a.details) : "" + }; + var Uk = !1; + + function Tk(a, b) { + a.Lb.Mi(); + a.bf(); + if (null === a.ib) return null; + "object" !== typeof b && u.k("properties argument must be an Object."); + var c = !1, d = b.size || null, e = b.scale || null; + void 0 !== b.scale && isNaN(b.scale) && (e = "NaN"); + var f = b.maxSize; + void 0 === b.maxSize && (c = !0, f = "svg" === b.context ? new ia(Infinity, Infinity) : new ia(2E3, 2E3)); + var h = b.position || null, k = b.parts || null, l = void 0 === b.padding ? 1 : b.padding, + m = b.background || null, n = b.omitTemporary; + void 0 === n && (n = !0); + var p = b.document || document, q = b.elementFinished || null, r = + b.showTemporary; + void 0 === r && (r = !n); + n = b.showGrid; + void 0 === n && (n = r); + null !== d && isNaN(d.width) && isNaN(d.height) && (d = null); + "number" === typeof l ? l = new rb(l) : l instanceof rb || (l = new rb(0)); + l.left = Math.max(l.left, 0); + l.right = Math.max(l.right, 0); + l.top = Math.max(l.top, 0); + l.bottom = Math.max(l.bottom, 0); + a.qn = !1; + $i(a); + var s = new oa(null, p), t = s.getContext("2d"), v = s; + if (!(d || e || k || h)) return s.width = a.Ab + Math.ceil(l.left + l.right), s.height = a.zb + Math.ceil(l.top + l.bottom), "svg" === b.context && (t = v = new Nc(s.Dd, p, q), t instanceof + Nc && (a.qn = !0)), Gj(a, t, l, new ia(s.width, s.height), a.$b, a.Ma, k, m, r, n), a.qn = !0, v; + var x = a.Eb.Pv, B = new w(0, 0), y = a.Cd.copy(); + y.tI(a.padding); + if (r) for (var C = !0, C = a.Zb.n, I = C.length, H = 0; H < I; H++) { + var T = C[H]; + if (T.visible && T.Ac) for (var aa = T.Db.n, T = aa.length, R = 0; R < T; R++) { + var N = aa[R]; + N.uz && N.Ea() && (N = N.ba, N.J() && y.Sh(N)) + } + } + B.x = y.x; + B.y = y.y; + if (null !== k) { + var Z, C = !0, aa = k.i; + for (aa.reset(); aa.next();) I = aa.value, I instanceof G && (N = I, T = N.layer, null !== T && !T.visible || null !== T && !r && T.Ac || !N.Ea() || (N = N.ba, N.J() && (C ? (C = !1, Z = + N.copy()) : Z.Sh(N)))); + C && (Z = new z(0, 0, 0, 0)); + y.width = Z.width; + y.height = Z.height; + B.x = Z.x; + B.y = Z.y + } + null !== h && h.J() && (B = h, e || (e = x)); + C = aa = 0; + null !== l && (aa = l.left + l.right, C = l.top + l.bottom); + H = I = 0; + null !== d && (I = d.width, H = d.height, isFinite(I) && (I = Math.max(0, I - aa)), isFinite(H) && (H = Math.max(0, H - C))); + Z = h = 0; + null !== d && null !== e ? ("NaN" === e && (e = x), d.J() ? (h = I, Z = H) : isNaN(H) ? (h = I, Z = y.height * e) : (h = y.width * e, Z = H)) : null !== d ? d.J() ? (e = Math.min(I / y.width, H / y.height), h = I, Z = H) : isNaN(H) ? (e = I / y.width, h = I, Z = y.height * e) : (e = H / y.height, + h = y.width * e, Z = H) : null !== e ? "NaN" === e && f.J() ? (e = Math.min((f.width - aa) / y.width, (f.height - C) / y.height), e > x ? (e = x, h = y.width, Z = y.height) : (h = f.width, Z = f.height)) : (h = y.width * e, Z = y.height * e) : (e = x, h = y.width, Z = y.height); + null !== l ? (h += aa, Z += C) : l = new rb(0); + null !== f && (d = f.width, f = f.height, "svg" !== b.context && c && !Uk && (h > d || Z > f) && (u.trace("Diagram.makeImage(data): Diagram width or height is larger than the default max size. (" + Math.ceil(h) + "x" + Math.ceil(Z) + " vs 2000x2000) Consider increasing the max size."), Uk = !0), + isNaN(d) && (d = 2E3), isNaN(f) && (f = 2E3), isFinite(d) && (h = Math.min(h, d)), isFinite(f) && (Z = Math.min(Z, f))); + s.width = Math.ceil(h); + s.height = Math.ceil(Z); + "svg" === b.context && (t = v = new Nc(s.Dd, p, q), t instanceof Nc && (a.qn = !0)); + Gj(a, t, l, new ia(Math.ceil(h), Math.ceil(Z)), e, B, k, m, r, n); + a.qn = !0; + return v + } + + D.inherit = function (a, b) { + u.j(a, "function", D, "inherit"); + u.j(b, "function", D, "inherit"); + b.AF && u.k("Cannot inherit from " + u.rg(b)); + u.Ga(a, b) + }; + + function Vi() { + this.DF = "63ad05bbe23a1786468a4c741b6d2"; + this.DF === this._tk ? this.vh = !0 : Vk(this, !1) + } + + function Vk(a, b) { + var c = "p", d = window[u.Da("76a715b2f73f148a")][u.Da("72ba13b5")]; + if (u.Da("77bb5bb2f32603de") === window[u.Da("76a715b2f73f148a")][u.Da("6aba19a7ec351488")]) try { + a.vh = !window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b")])([u.Da("7bb8069ae7")] === u.Da(u.adym)); + if (!1 === a.vh) return; + a.vh = !window[u.Da("4da118b7ec2108")]([u.Da("5bb806bfea351a904a84515e1b6d38b6")])([u.Da("49bc19a1e6")])([u.Da("59bd04a1e6380fa5539b6c7a197c31bb4cfd3e")])([u.Da("7bb8069ae7")] === u.Da(u.adym)); + if (!1 === a.vh) return + } catch (e) { + } + for (var f = d[u.Da("76ad18b4f73e")], h = d[u.Da("73a612b6fb191d")](u.Da("35e7")) + 2; h < f; h++) c += d[h]; + d = c[u.Da("73a612b6fb191d")](u.Da(u.adym)); + 0 >= d && u.Da(u.adym) !== u.Da("7da71ca0ad381e90") && (d = c[u.Da("73a612b6fb191d")](u.Da("76a715b2ef3e149757"))); + a.vh = !(0 < d && d < c[u.Da("73a612b6fb191d")](u.Da("35"))); + a.vh && (c = window.document[u.Da("79ba13b2f7333e8846865a7d00")]("div"), d = u.Da("02cncncn"), "." === d[0] && (d = d[u.Da("69bd14a0f724128a44")](1)), c[u.Da("79a417a0f0181a8946")] = d, window.document[u.Da("78a712aa")] ? + (window.document[u.Da("78a712aa")][u.Da("7bb806b6ed32388c4a875b")](c), d = window[u.Da("7dad0290ec3b0b91578e5b40007031bf")](c)[u.Da("7dad0283f1390b81519f4645156528bf")](u.Da("78a704b7e62456904c9b12701b6532a8")), window.document[u.Da("78a712aa")][u.Da("68ad1bbcf533388c4a875b")](c), d && -1 !== d.indexOf(u.Da(u.XF)) && -1 !== d.indexOf(u.Da(u.YF)) && (a.vh = !1)) : (a.vh = null, b && (a.vh = !1))) + } + + Vi.prototype.wl = function (a) { + a.Gg.setTransform(a.nf, 0, 0, a.nf, 0, 0); + null === this.vh && Vk(this, !0); + return 0 < this.vh && this !== this.BF ? !0 : !1 + }; + Vi.prototype.t = function () { + this.BF = null + }; + + function Wi(a, b) { + void 0 !== b && null !== b || u.k("Diagram setup requires an argument DIV."); + null !== a.Jb && u.k("Diagram has already completed setup."); + "string" === typeof b ? a.Jb = window.document.getElementById(b) : b instanceof HTMLDivElement ? a.Jb = b : u.k("No DIV or DIV id supplied: " + b); + null === a.Jb && u.k("Invalid DIV id; could not get element with id: " + b); + void 0 !== a.Jb.Y && u.k("Invalid div id; div already has a Diagram associated with it."); + "static" === window.getComputedStyle(a.Jb, null).position && (a.Jb.style.position = + "relative"); + a.Jb.style["-webkit-tap-highlight-color"] = "rgba(255, 255, 255, 0)"; + a.Jb.style["-ms-touch-action"] = "none"; + a.Jb.innerHTML = ""; + a.Jb.Y = a; + var c = new oa(a); + c.Dd.innerHTML = "This text is displayed if your browser does not support the Canvas HTML element."; + void 0 !== c.style && (c.style.position = "absolute", c.style.top = "0px", c.style.left = "0px", "rtl" === window.getComputedStyle(a.Jb, null).getPropertyValue("direction") && (a.wB = !0), c.style.zIndex = "2", c.style.DK = "none", c.style.webkitUserSelect = "none", c.style.MozUserSelect = + "none"); + a.Ab = a.Jb.clientWidth || 1; + a.zb = a.Jb.clientHeight || 1; + a.ib = c; + a.Gg = c.getContext("2d"); + var d = a.Gg; + a.nf = a.computePixelRatio(); + Ij(a, a.Ab, a.zb); + a.Zw = d[u.Da("7eba17a4ca3b1a8346")][u.Da("78a118b7")](d, u.wl, 4, 4); + a.Jb.insertBefore(c.Dd, a.Jb.firstChild); + c = new oa(null); + c.width = 1; + c.height = 1; + a.Dx = c; + a.dB = c.getContext("2d"); + var c = u.createElement("div"), d = u.createElement("div"), e = u.createElement("div"), + f = u.createElement("div"); + c.style.position = "absolute"; + c.style.overflow = "auto"; + c.style.width = a.Ab + "px"; + c.style.height = + a.zb + "px"; + c.style.zIndex = "1"; + d.style.position = "absolute"; + d.style.overflow = "auto"; + d.style.width = a.Ab + "px"; + d.style.height = a.zb + "px"; + d.style.zIndex = "1"; + e.style.position = "absolute"; + e.style.width = "1px"; + e.style.height = "1px"; + f.style.position = "absolute"; + f.style.width = "1px"; + f.style.height = "1px"; + a.Jb.appendChild(c); + a.Jb.appendChild(d); + c.appendChild(e); + d.appendChild(f); + c.onscroll = a.LB; + c.onmousedown = a.Ru; + c.ontouchstart = a.Ru; + c.Y = a; + c.bC = !0; + d.onscroll = a.LB; + d.onmousedown = a.Ru; + d.ontouchstart = a.Ru; + d.Y = a; + d.cC = !0; + a.uj = + c; + a.vj = d; + a.ty = e; + a.uy = f; + a.hE = u.gD(function () { + a.im = null; + a.ma() + }, 300, !1); + a.aF = u.gD(function () { + gi(a) + }, 250, !1); + a.preventDefault = function (a) { + a.preventDefault(); + return !1 + }; + a.Qo = function (b) { + if (a.isEnabled) { + a.Jl = !0; + var c = a.Jc; + u.Dm && c.jl ? (b.preventDefault(), b.simulated = !0, a.Ir = b) : (a.Jc = a.Ob, a.Ob = c, nj(a, a, b, c, !0), a.Hw(b, null, b.target.Y) || (a.doMouseMove(), a.Va.isBeyondDragSize() && (yf(a), a.Ol = 0))) + } + }; + a.Po = function (b) { + if (a.isEnabled) { + a.Jl = !0; + var c = a.Jc; + if (u.Dm && null !== a.Ir) a.Ir = b, b.preventDefault(); else if (u.Dm && + 400 > b.timeStamp - a.Pl) b.preventDefault(); else if (a.Jc = a.Ob, a.Ob = c, nj(a, a, b, c, !0), c.Wk = !0, c.Te = b.detail, a.nk = c.copy(), !0 === c.Vp.simulated) b.preventDefault(), b.simulated = !0; else if (Ef = null, a.doMouseDown(), 1 === b.button) return b.preventDefault(), !1 + } + }; + a.So = function (b) { + if (a.isEnabled) { + a.Jl = !0; + var c = a.Jc; + if (u.Dm) { + if (400 > b.timeStamp - a.Pl) { + b.preventDefault(); + return + } + a.Pl = b.timeStamp + } + if (u.Dm && null !== a.Ir) a.Ir = null, b.preventDefault(); else { + a.Jc = a.Ob; + a.Ob = c; + nj(a, a, b, c, !0); + c.up = !0; + c.Te = b.detail; + if (u.aH || u.bH) b.timeStamp - + a.Pl < a.zC && !a.Va.isBeyondDragSize() ? a.Ol++ : a.Ol = 1, a.Pl = b.timeStamp, c.Te = a.Ol; + c.bubbles = b.bubbles; + b.target.Y && (c.Cg = b.target.Y); + a.JE(b, null, new w, c.Cg) || (a.doMouseUp(), Kf(a), rj(c, b)) + } + } + }; + a.Zg = function (b) { + if (a.isEnabled) { + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + nj(a, a, b, c, !0); + c.bubbles = !0; + c.Uk = void 0 !== b.wheelDelta ? b.wheelDelta : -40 * b.detail; + a.doMouseWheel(); + rj(c, b) + } + }; + a.Ro = function () { + if (a.isEnabled) { + a.Jl = !1; + var b = a.Va; + b.cancelWaitAfter(); + b instanceof jf && b.hideToolTip() + } + }; + a.SE = function (b) { + if (a.isEnabled) { + a.kv = !1; + a.Xx = !0; + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + pj(a, b, b.targetTouches[0], c, 1 < b.touches.length); + a.doMouseDown(); + 2 > b.touches.length && mj(a, c); + rj(c, b) + } + }; + a.RE = function (b) { + if (a.isEnabled) { + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + var d = null; + 0 < b.changedTouches.length ? d = b.changedTouches[0] : 0 < b.targetTouches.length && (d = b.targetTouches[0]); + qj(a, b, d, c, 1 < b.touches.length); + (a.Va.isBeyondDragSize() || 1 < b.touches.length) && yf(a); + a.Hw(d ? d : b, null, c.Cg) || (a.doMouseMove(), rj(c, b)) + } + }; + a.QE = function (b) { + if (a.isEnabled) { + yf(a); + if (a.kv) return b.preventDefault(), + !1; + var c = a.Jc; + a.Jc = a.Ob; + a.Ob = c; + if (1 < b.touches.length) a.yn && (a.Lx = !1); else { + var d = null, e = null; + 0 < b.changedTouches.length ? e = b.changedTouches[0] : 0 < b.targetTouches.length && (e = b.targetTouches[0]); + c.g = a; + c.Te = 1; + if (null !== e) { + var d = window.document.elementFromPoint(e.clientX, e.clientY), f, p; + d && d.Y ? (p = e, f = d.Y) : (p = b.changedTouches[0], f = a); + oj(f, p, c); + f = e.screenX; + p = e.screenY; + var q = a.AB; + b.timeStamp - a.Pl < a.zC && !(25 < Math.abs(q.x - f) || 25 < Math.abs(q.y - p)) ? a.Ol++ : a.Ol = 1; + c.Te = a.Ol; + a.Pl = b.timeStamp; + a.AB.m(f, p) + } + c.gd = 0; + c.button = + 0; + c.Wk = !1; + c.up = !0; + c.Uk = 0; + c.Tc = !1; + c.bubbles = !1; + c.event = b; + c.timestamp = Date.now(); + c.Cg = null === d ? b.target.Y : d.Y ? d.Y : null; + c.pe = null; + a.JE(e ? e : b, null, new w, c.Cg) || (a.doMouseUp(), rj(c, b), a.Xx = !1) + } + } + }; + a.KH = function (b) { + if ("touch" === b.pointerType) { + var c = a.WB; + void 0 === c[b.pointerId] && (a.hr++, c[b.pointerId] = b); + a.Df[0] = null; + a.Df[1] = null; + for (var d in c) if (null === a.Df[0]) a.Df[0] = c[d]; else if (null === a.Df[1]) { + a.Df[1] = c[d]; + break + } + a.isEnabled && (a.kv = !1, c = a.Jc, a.Jc = a.Ob, a.Ob = c, pj(a, b, b, c, 1 < a.hr), a.doMouseDown(), 2 > a.hr && + mj(a, c), rj(c, b)) + } + }; + a.MH = function (b) { + if ("touch" === b.pointerType && !(2 > a.hr)) { + var c = a.Df; + c[0].pointerId === b.pointerId && (c[0] = b); + c[1].pointerId === b.pointerId && (c[1] = b); + a.isEnabled && (c = a.Jc, a.Jc = a.Ob, a.Ob = c, qj(a, b, b, c, !0), yf(a), a.Hw(b, null, c.Cg) || (a.doMouseMove(), rj(c, b))) + } + }; + a.LH = function (b) { + if ("touch" === b.pointerType) { + var c = a.WB; + void 0 !== c[b.pointerId] && (a.hr--, delete c[b.pointerId], c = a.Df, null !== c[0] && c[0].pointerId === b.pointerId && (c[0] = null), null !== c[1] && c[1].pointerId === b.pointerId && (c[1] = null)) + } + }; + $i(a); + Zi(a) + } + + function Wk(a) { + 1 < arguments.length && u.k("Palette constructor can only take one optional argument, the DIV HTML element or its id."); + D.call(this, a); + this.Av = !0; + this.Nk = !1; + this.nb = !0; + this.Ty = Db; + this.Qb = new Xk + } + + u.Ga(Wk, D); + u.fa("Palette", Wk); + + function Si(a) { + 1 < arguments.length && u.k("Overview constructor can only take one optional argument, the DIV HTML element or its id."); + D.call(this, a); + this.Uh.isEnabled = !1; + this.sc = !0; + this.rj = null; + this.rF = this.hu = !0; + this.iI("drawShadows", !1); + var b = new G, c = new X; + c.stroke = "magenta"; + c.hb = 2; + c.fill = "transparent"; + c.name = "BOXSHAPE"; + b.pl = !0; + b.Zz = "BOXSHAPE"; + b.zz = "BOXSHAPE"; + b.tE = "BOXSHAPE"; + b.cursor = "move"; + b.add(c); + this.zl = b; + c = new lf; + c.type = oh; + c.Ze = Ib; + var d = new ph; + d.tg = !0; + c.add(d); + d = new X; + d.Hj = Ib; + d.Fb = "Rectangle"; + d.xa = new ia(64, 64); + d.cursor = "se-resize"; + d.alignment = Vb; + c.add(d); + b.rE = c; + this.lm = this.Ij = !1; + this.of = this.hs = !0; + this.SC = 0; + this.Cy = u.createElement("canvas"); + this.CF = this.Cy.getContext("2d"); + this.tb.Ed = new Yk; + this.tb.uE = new Zk; + var e = this; + this.click = function () { + var a = e.rj; + if (null !== a) { + var b = a.ob, c = e.N.da; + a.position = new w(c.x - b.width / 2, c.y - b.height / 2) + } + }; + this.dE = function () { + $k(e) + }; + this.cE = function () { + null !== e.rj && (e.pc(), e.ma()) + }; + this.no = kj; + this.sc = !1 + } + + u.Ga(Si, D); + u.fa("Overview", Si); + + function al(a) { + a.sc || a.vd || !1 !== a.Ef || (a.Ef = !0, requestAnimationFrame(function () { + if (a.Ef && !a.vd && (a.Ef = !1, null !== a.Jb)) { + a.vd = !0; + ej(a); + a.Cd.J() || jj(a, a.kg()); + null === a.Jb && u.k("No div specified"); + null === a.ib && u.k("No canvas specified"); + if (a.Md) { + var b = a.rj; + if (null !== b && !b.Lb.Vg && !b.Lb.ld) { + var b = a.Gg, c = a.Cy; + b.setTransform(1, 0, 0, 1, 0, 0); + b.clearRect(0, 0, a.ib.width, a.ib.height); + b.drawImage(c, 0, 0); + c = a.Sd; + c.reset(); + 1 !== a.$b && c.scale(a.scale); + 0 === a.position.x && 0 === a.position.y || c.translate(-a.Ma.x, -a.Ma.y); + b.setTransform(c.m11, + c.m12, c.m21, c.m22, c.dx, c.dy); + for (var c = a.Zb.n, d = c.length, e = 0; e < d; e++) c[e].We(b, a); + a.uk = !1; + a.Md = !1 + } + } + a.vd = !1 + } + })) + } + + Si.prototype.computePixelRatio = function () { + return 1 + }; + Si.prototype.We = function () { + null === this.Jb && u.k("No div specified"); + null === this.ib && u.k("No canvas specified"); + if (this.Md) { + var a = this.rj; + if (null !== a && !a.Lb.Vg && !a.Lb.ld) { + if (!this.rF) { + var b = a.tb.Ed; + if (null !== b && b.na) return + } + Dj(this); + b = a.Gs; + (null !== b && b.visible && isNaN(b.width) || isNaN(b.height)) && vj(a); + var c = this.ib, b = this.Gg, d = this.Cy, e = this.CF; + d.width = c.width; + d.height = c.height; + b.Et = ""; + b.setTransform(1, 0, 0, 1, 0, 0); + b.clearRect(0, 0, this.ib.width, this.ib.height); + d = this.Sd; + d.reset(); + 1 !== this.$b && d.scale(this.scale); + 0 === this.position.x && 0 === this.position.y || d.translate(-this.Ma.x, -this.Ma.y); + b.setTransform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy); + for (var d = this.hu, f = this.ob, h = a.Zb.n, k = h.length, a = 0; a < k; a++) { + var l = h[a], m = b, n = f, p = d; + if (l.visible && 0 !== l.Ic && (void 0 === p && (p = !0), p || !l.Ac)) { + 1 !== l.Ic && (m.globalAlpha = l.Ic); + for (var p = this.scale, l = l.Db.n, q = l.length, r = 0; r < q; r++) { + var s = l[r], t = s.ba; + t.sg(n) && (1 < t.width * p || 1 < t.height * p ? s.We(m, this) : wi(s, m)) + } + m.globalAlpha = 1 + } + } + e.drawImage(c.Dd, 0, 0); + c = this.Zb.n; + e = c.length; + for (a = 0; a < e; a++) c[a].We(b, + this); + this.Md = this.uk = !1 + } + } + }; + u.defineProperty(Si, {Lz: "observed"}, function () { + return this.rj + }, function (a) { + var b = this.rj; + null !== a && u.C(a, D, Si, "observed"); + a instanceof Si && u.k("Overview.observed Diagram may not be an Overview itself: " + a); + b !== a && (null !== b && (this.remove(this.Tg), b.lE("ViewportBoundsChanged", this.dE), b.lE("DocumentBoundsChanged", this.cE), b.Ul.remove(this)), this.rj = a, null !== a && (a.Ky("ViewportBoundsChanged", this.dE), a.Ky("DocumentBoundsChanged", this.cE), a.Ul.add(this), this.add(this.Tg), $k(this)), this.pc(), this.h("observed", + b, a)) + }); + u.defineProperty(Si, {Tg: "box"}, function () { + return this.zl + }, function (a) { + var b = this.zl; + b !== a && (this.zl = a, this.remove(b), this.add(this.zl), $k(this), this.h("box", b, a)) + }); + u.defineProperty(Si, {vJ: "drawsTemporaryLayers"}, function () { + return this.hu + }, function (a) { + this.hu !== a && (this.hu = a, this.Sz()) + }); + + function $k(a) { + var b = a.Tg; + if (null !== b) { + var c = a.rj; + if (null !== c) { + a.Md = !0; + var c = c.ob, d = b.nt, e = u.ul(); + e.m(c.width, c.height); + d.xa = e; + u.Oj(e); + a = 2 / a.scale; + d instanceof X && (d.hb = a); + b.location = new w(c.x - a / 2, c.y - a / 2) + } + } + } + + Si.prototype.kg = function () { + var a = this.rj; + return null === a ? K.kF : a.Cd + }; + Si.prototype.nz = function () { + !0 !== this.Md && (this.Md = !0, al(this)) + }; + Si.prototype.dt = function (a) { + this.sc || (cj(this), this.ma(), sj(this), this.pc(), $k(this), this.za("ViewportBoundsChanged", null, a)) + }; + + function Yk() { + uf.call(this); + this.Ck = null + } + + u.Ga(Yk, uf); + Yk.prototype.canStart = function () { + if (!this.isEnabled) return !1; + var a = this.g; + if (null === a || !a.Nk || !a.of) return !1; + var b = a.Lz; + if (null === b) return !1; + if (null === this.findDraggablePart()) { + var c = b.ob; + this.Ck = new w(c.width / 2, c.height / 2); + a = a.wc.da; + b.position = new w(a.x - this.Ck.x, a.y - this.Ck.y) + } + return !0 + }; + Yk.prototype.doActivate = function () { + this.Ck = null; + uf.prototype.doActivate.call(this) + }; + Yk.prototype.moveParts = function () { + var a = this.g, b = a.Lz; + if (null !== b) { + var c = a.Tg; + if (null !== c) { + if (null === this.Ck) { + var d = a.wc.da, c = c.location; + this.Ck = new w(d.x - c.x, d.y - c.y) + } + a = a.N.da; + b.position = new w(a.x - this.Ck.x, a.y - this.Ck.y) + } + } + }; + + function Zk() { + mh.call(this) + } + + u.Ga(Zk, mh); + Zk.prototype.resize = function (a) { + var b = this.g.Lz; + if (null !== b) { + var c = b.ob.copy(); + b.position = a.position; + (c.width !== a.width || c.height !== a.height) && 0 < a.width && 0 < a.height && (b.scale = Math.min(c.width / a.width, c.height / a.height)) + } + }; + + function ga(a) { + 1 < arguments.length && u.k("Brush constructor can take at most one optional argument, the Brush type."); + u.gc(this); + this.Ca = !1; + void 0 === a ? (this.oa = te, this.cn = "black") : "string" === typeof a ? (this.oa = te, this.cn = a) : (this.oa = a, this.cn = "black"); + var b = this.oa; + b === ue ? (this.ao = Db, this.sn = Ub) : this.sn = b === ve ? this.ao = Ib : this.ao = vb; + this.hv = 0; + this.iu = NaN; + this.Fg = this.Wu = this.Eg = null; + this.kx = this.lx = 0 + } + + u.fa("Brush", ga); + var te; + ga.Solid = te = u.s(ga, "Solid", 0); + var ue; + ga.Linear = ue = u.s(ga, "Linear", 1); + var ve; + ga.Radial = ve = u.s(ga, "Radial", 2); + var bl; + ga.Pattern = bl = u.s(ga, "Pattern", 4); + ga.prototype.copy = function () { + var a = new ga; + a.oa = this.oa; + a.cn = this.cn; + a.ao = this.ao.Z(); + a.sn = this.sn.Z(); + a.hv = this.hv; + a.iu = this.iu; + null !== this.Eg && (a.Eg = this.Eg.copy()); + a.Wu = this.Wu; + return a + }; + ga.prototype.Ka = function () { + this.freeze(); + Object.freeze(this); + return this + }; + ga.prototype.freeze = function () { + this.Ca = !0; + null !== this.Eg && this.Eg.freeze(); + return this + }; + ga.prototype.La = function () { + Object.isFrozen(this) && u.k("cannot thaw constant: " + this); + this.Ca = !1; + null !== this.Eg && this.Eg.La(); + return this + }; + ga.prototype.toString = function () { + var a = "Brush("; + if (this.type === te) a += this.color; else if (a = this.type === ue ? a + "Linear " : this.type === ve ? a + "Radial " : this.type === bl ? a + "Pattern " : a + "(unknown) ", a += this.start + " " + this.end, null !== this.os) for (var b = this.os.i; b.next();) a += " " + b.key + ":" + b.value; + return a + ")" + }; + ga.prototype.addColorStop = ga.prototype.addColorStop = function (a, b) { + u.I(this); + ("number" !== typeof a || !isFinite(a) || 1 < a || 0 > a) && u.wa(a, "0 <= loc <= 1", ga, "addColorStop:loc"); + u.j(b, "string", ga, "addColorStop:color"); + null === this.Eg && (this.Eg = new la("number", "string")); + this.Eg.add(a, b); + this.oa === te && (this.type = ue); + this.Fg = null + }; + u.defineProperty(ga, {type: "type"}, function () { + return this.oa + }, function (a) { + u.I(this, a); + u.rb(a, ga, ga, "type"); + this.oa = a; + this.start.ne() && (a === ue ? this.start = Db : a === ve && (this.start = Ib)); + this.end.ne() && (a === ue ? this.end = Ub : a === ve && (this.end = Ib)); + this.Fg = null + }); + u.defineProperty(ga, {color: "color"}, function () { + return this.cn + }, function (a) { + u.I(this, a); + this.cn = a; + this.Fg = null + }); + u.defineProperty(ga, {start: "start"}, function () { + return this.ao + }, function (a) { + u.I(this, a); + u.C(a, L, ga, "start"); + this.ao = a.Z(); + this.Fg = null + }); + u.defineProperty(ga, {end: "end"}, function () { + return this.sn + }, function (a) { + u.I(this, a); + u.C(a, L, ga, "end"); + this.sn = a.Z(); + this.Fg = null + }); + u.defineProperty(ga, {ut: "startRadius"}, function () { + return this.hv + }, function (a) { + u.I(this, a); + u.ze(a, ga, "startRadius"); + 0 > a && u.wa(a, ">= zero", ga, "startRadius"); + this.hv = a; + this.Fg = null + }); + u.defineProperty(ga, {us: "endRadius"}, function () { + return this.iu + }, function (a) { + u.I(this, a); + u.ze(a, ga, "endRadius"); + 0 > a && u.wa(a, ">= zero", ga, "endRadius"); + this.iu = a; + this.Fg = null + }); + u.defineProperty(ga, {os: "colorStops"}, function () { + return this.Eg + }, function (a) { + u.I(this, a); + this.Eg = a; + this.Fg = null + }); + u.defineProperty(ga, {pattern: "pattern"}, function () { + return this.Wu + }, function (a) { + u.I(this, a); + this.Wu = a; + this.Fg = null + }); + ga.randomColor = function (a, b) { + void 0 === a && (a = 128); + void 0 === b && (b = Math.max(a, 255)); + var c = Math.abs(b - a), d = Math.floor(a + Math.random() * c).toString(16), + e = Math.floor(a + Math.random() * c).toString(16), c = Math.floor(a + Math.random() * c).toString(16); + 2 > d.length && (d = "0" + d); + 2 > e.length && (e = "0" + e); + 2 > c.length && (c = "0" + c); + return "#" + d + e + c + }; + var cl = u.createElement("canvas").getContext("2d"), fa; + ga.isValidColor = fa = function (a) { + if ("black" === a) return !0; + if ("" === a) return !1; + cl.fillStyle = "#000000"; + var b = cl.fillStyle; + cl.fillStyle = a; + if (cl.fillStyle !== b) return !0; + cl.fillStyle = "#FFFFFF"; + b = cl.fillStyle; + cl.fillStyle = a; + return cl.fillStyle !== b + }; + + function S() { + u.gc(this); + this.ea = 30723; + this.Ic = 1; + this.Pg = null; + this.Ub = ""; + this.lc = this.Ib = null; + this.Ma = (new w(NaN, NaN)).freeze(); + this.jf = (new ia(NaN, NaN)).freeze(); + this.nj = K.op; + this.lj = K.jF; + this.Sd = new ja; + this.Xm = new ja; + this.yk = new ja; + this.$b = this.fu = 1; + this.Ym = 0; + this.Hh = dl; + this.Gq = K.np; + this.Pc = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.Xb = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.Hc = (new z(0, 0, NaN, NaN)).freeze(); + this.Sr = this.Wp = this.Q = this.ir = this.jr = null; + this.Tr = this.Xp = Infinity; + this.vp = this.se = uc; + this.wr = + 0; + this.tj = 1; + this.Cp = 0; + this.Wi = 1; + this.Ar = -Infinity; + this.zr = 0; + this.Br = K.Wj; + this.Cr = dh; + this.Jp = ""; + this.Gc = this.P = null; + this.$m = -1; + this.Wl = this.Xh = this.Bl = this.$n = null + } + + u.Lh(S); + u.fa("GraphObject", S); + S.prototype.cloneProtected = function (a) { + a.ea = this.ea | 6144; + a.Ic = this.Ic; + a.Ub = this.Ub; + a.Ib = this.Ib; + a.lc = this.lc; + a.Ma.assign(this.Ma); + a.jf.assign(this.jf); + a.nj = this.nj.Z(); + a.lj = this.lj.Z(); + a.yk = this.yk.copy(); + a.$b = this.$b; + a.Ym = this.Ym; + a.Hh = this.Hh; + a.Gq = this.Gq.Z(); + a.Pc.assign(this.Pc); + a.Xb.assign(this.Xb); + a.Hc.assign(this.Hc); + a.ir = this.ir; + a.Q = null !== this.Q ? this.Q.copy() : null; + a.Wp = this.Wp; + a.Xp = this.Xp; + a.Sr = this.Sr; + a.Tr = this.Tr; + a.se = this.se.Z(); + a.vp = this.vp.Z(); + a.wr = this.wr; + a.tj = this.tj; + a.Cp = this.Cp; + a.Wi = + this.Wi; + a.Ar = this.Ar; + a.zr = this.zr; + a.Br = this.Br.Z(); + a.Cr = this.Cr; + a.Jp = this.Jp; + a.P = null !== this.P ? this.P.copy() : null; + a.Gc = this.Gc; + a.$m = this.$m; + if (null !== this.Bl) { + a.Bl = u.Pk(this.Bl); + for (var b = 0; b < this.Bl.length; b++) { + var c = this.Bl[b]; + a[c] = this[c] + } + } + null !== this.Xh && (a.Xh = this.Xh.copy()) + }; + S.prototype.Mh = function (a) { + a.jr = null; + a.Wl = null; + a.R() + }; + S.prototype.clone = function () { + var a = new this.constructor; + this.cloneProtected(a); + return a + }; + S.prototype.copy = function () { + return this.clone() + }; + S.prototype.toString = function () { + return u.rg(Object.getPrototypeOf(this)) + "#" + u.Uc(this) + }; + var qh; + S.None = qh = u.s(S, "None", 0); + var dl; + S.Default = dl = u.s(S, "Default", 0); + var el; + S.Vertical = el = u.s(S, "Vertical", 4); + var fl; + S.Horizontal = fl = u.s(S, "Horizontal", 5); + var cd; + S.Fill = cd = u.s(S, "Fill", 3); + var sh; + S.Uniform = sh = u.s(S, "Uniform", 1); + var th; + S.UniformToFill = th = u.s(S, "UniformToFill", 2); + + function gl(a) { + a.P = new hl + } + + S.prototype.Ee = function () { + var a = new il; + a.cj = vb; + a.Ej = vb; + a.aj = 10; + a.Cj = 10; + a.$i = jl; + a.Bj = jl; + a.bj = 0; + a.Dj = 0; + this.Q = a + }; + + function kl(a, b, c, d, e, f, h) { + var k = .001, l = f.length; + a.moveTo(b, c); + d -= b; + k = e - c; + 0 === d && (d = .001); + e = k / d; + for (var m = Math.sqrt(d * d + k * k), n = 0, p = !0, q = 0 === h ? !1 : !0; .1 <= m;) { + if (q) { + k = f[n++ % l]; + for (k -= h; 0 > k;) k += f[n++ % l], p = !p; + q = !1 + } else k = f[n++ % l]; + k > m && (k = m); + var r = Math.sqrt(k * k / (1 + e * e)); + 0 > d && (r = -r); + b += r; + c += e * r; + p ? a.lineTo(b, c) : a.moveTo(b, c); + m -= k; + p = !p + } + } + + S.prototype.raiseChangedEvent = S.prototype.Dc = function (a, b, c, d, e, f, h) { + var k = this.T; + null !== k && (k.Lm(a, b, c, d, e, f, h), 0 !== (this.ea & 1024) && c === this && a === $d && ll(this, k, b)) + }; + + function ll(a, b, c) { + var d = a.zo(); + if (null !== d) for (var e = a.Gc.i; e.next();) { + var f = e.value, h = null; + if (null !== f.Nm) { + h = ef(f, d, a); + if (null === h) continue; + f.Mw(a, h, c, null) + } else if (f.xt) { + var k = b.g; + null !== k && f.Mw(a, k.ga.Zs, c, k) + } else { + var l = d.data; + if (null === l) continue; + k = b.g; + null !== k && k.Iw || f.Mw(a, l, c, k) + } + null !== h && (k = d.Vv(f.tl), null !== k && f.ZE(k, h, c)) + } + } + + S.prototype.Vv = function (a) { + return this.$m === a ? this : null + }; + S.prototype.raiseChanged = S.prototype.h = function (a, b, c) { + this.Dc($d, a, this, b, c) + }; + + function ml(a, b, c, d, e) { + var f = a.Pc, h = a.yk; + h.reset(); + nl(a, h, b, c, d, e); + a.yk = h; + f.x = b; + f.y = c; + f.width = d; + f.height = e; + h.Os() || h.WE(f) + } + + function ol(a, b, c, d) { + if (!1 === a.Ag) return !1; + d.multiply(a.transform); + return c ? a.sg(b, d) : a.sm(b, d) + } + + S.prototype.sD = function (a, b, c) { + if (!1 === this.Ag) return !1; + var d = this.Ha; + b = a.Lj(b); + var e = !1; + c && (e = Xa(a.x, a.y, 0, 0, 0, d.height) < b || Xa(a.x, a.y, 0, d.height, d.width, d.height) < b || Xa(a.x, a.y, d.width, d.height, d.width, 0) < b || Xa(a.x, a.y, d.width, 0, 0, 0) < b); + c || (e = Xa(a.x, a.y, 0, 0, 0, d.height) < b && Xa(a.x, a.y, 0, d.height, d.width, d.height) < b && Xa(a.x, a.y, d.width, d.height, d.width, 0) < b && Xa(a.x, a.y, d.width, 0, 0, 0) < b); + return e + }; + S.prototype.Tf = function () { + return !0 + }; + S.prototype.containsPoint = S.prototype.Aa = function (a) { + var b = u.K(); + b.assign(a); + this.transform.ab(b); + var c = this.ba; + if (!c.J()) return !1; + var d = this.g; + if (null !== d && d.Xx) { + var e = d.gz("extraTouchThreshold"), f = d.gz("extraTouchArea"), h = f / 2, k = this.Ha, + d = this.Hi() * d.scale, l = 1 / d; + if (k.width * d < e && k.height * d < e) return a = qb(c.x - h * l, c.y - h * l, c.width + f * l, c.height + f * l, b.x, b.y), u.v(b), a + } + if (this instanceof lf || this instanceof X ? qb(c.x - 5, c.y - 5, c.width + 10, c.height + 10, b.x, b.y) : c.Aa(b)) { + if (this.Xh && !this.Xh.Aa(b)) return !1; + if (null !== + this.lc && c.Aa(b) || null !== this.Ib && this.Hc.Aa(a)) return !0; + u.v(b); + return this.Jj(a) + } + u.v(b); + return !1 + }; + S.prototype.Jj = function (a) { + var b = this.Ha; + return qb(0, 0, b.width, b.height, a.x, a.y) + }; + S.prototype.containsRect = S.prototype.Kj = function (a) { + if (0 === this.angle) return this.ba.Kj(a); + var b = this.Ha, b = u.Vj(0, 0, b.width, b.height), c = this.transform, d = !1, e = u.fc(a.x, a.y); + b.Aa(c.Oh(e)) && (e.m(a.x, a.bottom), b.Aa(c.Oh(e)) && (e.m(a.right, a.bottom), b.Aa(c.Oh(e)) && (e.m(a.right, a.y), b.Aa(c.Oh(e)) && (d = !0)))); + u.v(e); + u.ic(b); + return d + }; + S.prototype.containedInRect = S.prototype.sm = function (a, b) { + if (void 0 === b) return a.Kj(this.ba); + var c = this.Ha, d = !1, e = u.fc(0, 0); + a.Aa(b.ab(e)) && (e.m(0, c.height), a.Aa(b.ab(e)) && (e.m(c.width, c.height), a.Aa(b.ab(e)) && (e.m(c.width, 0), a.Aa(b.ab(e)) && (d = !0)))); + return d + }; + S.prototype.intersectsRect = S.prototype.sg = function (a, b) { + if (void 0 === b && (b = this.transform, 0 === this.angle)) return a.sg(this.ba); + var c = this.Ha, d = b, e = u.fc(0, 0), f = u.fc(0, c.height), h = u.fc(c.width, c.height), + k = u.fc(c.width, 0), l = !1; + if (a.Aa(d.ab(e)) || a.Aa(d.ab(f)) || a.Aa(d.ab(h)) || a.Aa(d.ab(k))) l = !0; else { + var c = u.Vj(0, 0, c.width, c.height), m = u.fc(a.x, a.y); + c.Aa(d.Oh(m)) ? l = !0 : (m.m(a.x, a.bottom), c.Aa(d.Oh(m)) ? l = !0 : (m.m(a.right, a.bottom), c.Aa(d.Oh(m)) ? l = !0 : (m.m(a.right, a.y), c.Aa(d.Oh(m)) && (l = !0)))); + u.v(m); + u.ic(c); + !l && (K.dw(a, e, f) || K.dw(a, f, h) || K.dw(a, h, k) || K.dw(a, k, e)) && (l = !0) + } + u.v(e); + u.v(f); + u.v(h); + u.v(k); + return l + }; + S.prototype.getDocumentPoint = S.prototype.lb = function (a, b) { + void 0 === b && (b = new w); + a.ne() && u.k("getDocumentPoint:s Spot must be real: " + a.toString()); + var c = this.Ha; + b.m(a.x * c.width + a.offsetX, a.y * c.height + a.offsetY); + this.Ff.ab(b); + return b + }; + S.prototype.getDocumentAngle = S.prototype.Zk = function () { + var a; + a = this.Ff; + 1 === a.m11 && 0 === a.m12 ? a = 0 : (a = 180 * Math.atan2(a.m12, a.m11) / Math.PI, 0 > a && (a += 360)); + return a + }; + S.prototype.getDocumentScale = S.prototype.Hi = function () { + if (0 !== (this.ea & 4096) === !1) return this.fu; + var a = this.$b; + return null !== this.S ? a * this.S.Hi() : a + }; + S.prototype.getLocalPoint = S.prototype.zD = function (a, b) { + void 0 === b && (b = new w); + b.assign(a); + this.Ff.Oh(b); + return b + }; + S.prototype.getNearestIntersectionPoint = S.prototype.bl = function (a, b, c) { + return this.Co(a.x, a.y, b.x, b.y, c) + }; + g = S.prototype; + g.Co = function (a, b, c, d, e) { + var f = this.transform, h = 1 / (f.m11 * f.m22 - f.m12 * f.m21), k = f.m22 * h, l = -f.m12 * h, m = -f.m21 * h, + n = f.m11 * h, p = h * (f.m21 * f.dy - f.m22 * f.dx), q = h * (f.m12 * f.dx - f.m11 * f.dy); + if (null !== this.nm) return f = this.ba, K.bl(f.left, f.top, f.right, f.bottom, a, b, c, d, e); + h = a * k + b * m + p; + a = a * l + b * n + q; + b = c * k + d * m + p; + c = c * l + d * n + q; + e.m(0, 0); + d = this.Ha; + c = K.bl(0, 0, d.width, d.height, h, a, b, c, e); + e.transform(f); + return c + }; + + function Ph(a, b, c, d, e) { + if (!1 !== Aj(a)) { + var f = a.margin, h = f.right + f.left, f = f.top + f.bottom; + b = Math.max(b - h, 0); + c = Math.max(c - f, 0); + e = e || 0; + d = Math.max((d || 0) - h, 0); + e = Math.max(e - f, 0); + var h = a.angle, f = 0, f = a.xa, k = 0; + a.hb && (k = a.hb); + 90 === h || 270 === h ? (b = isFinite(f.height) ? f.height + k : b, c = isFinite(f.width) ? f.width + k : c) : (b = isFinite(f.width) ? f.width + k : b, c = isFinite(f.height) ? f.height + k : c); + var f = d || 0, k = e || 0, l = a instanceof A; + switch (pl(a, !0)) { + case qh: + k = f = 0; + l && (c = b = Infinity); + break; + case cd: + isFinite(b) && b > d && (f = b); + isFinite(c) && + c > e && (k = c); + break; + case fl: + isFinite(b) && b > d && (f = b); + k = 0; + l && (c = Infinity); + break; + case el: + isFinite(c) && c > e && (k = c), f = 0, l && (b = Infinity) + } + var l = a.af, m = a.vg; + f > l.width && m.width < l.width && (f = l.width); + k > l.height && m.height < l.height && (k = l.height); + d = Math.max(f / a.scale, m.width); + e = Math.max(k / a.scale, m.height); + l.width < d && (d = Math.min(m.width, d)); + l.height < e && (e = Math.min(m.height, e)); + b = Math.min(l.width, b); + c = Math.min(l.height, c); + b = Math.max(d, b); + c = Math.max(e, c); + if (90 === h || 270 === h) f = b, b = c, c = f, f = d, d = e, e = f; + a.Pc.La(); + a.Oo(b, c, + d, e); + a.Pc.freeze(); + a.Pc.J() || u.k("Non-real measuredBounds has been set. Object " + a + ", measuredBounds: " + a.Pc.toString()); + uj(a, !1) + } + } + + g.zc = function (a, b, c, d, e) { + this.Jg(); + var f = u.Sf(); + f.assign(this.Xb); + this.Xb.La(); + if (!1 === Bj(this)) { + var h = this.Xb; + h.x = a; + h.y = b; + h.width = c; + h.height = d + } else this.xi(a, b, c, d); + this.Xb.freeze(); + this.Xh = void 0 === e ? null : e; + c = !1; + void 0 !== e ? c = !0 : null !== this.S && (e = this.S.Hc, d = this.Ba, null !== this.nm && (d = this.Xb), c = b + d.height, d = a + d.width, c = !(0 <= a + .05 && d <= e.width + .05 && 0 <= b + .05 && c <= e.height + .05), this instanceof qa && (a = this.Hc, this.Gu > a.height || this.ej.Oe > a.width)) && (c = !0); + this.ea = c ? this.ea | 256 : this.ea & -257; + this.Xb.J() || + u.k("Non-real actualBounds has been set. Object " + this + ", actualBounds: " + this.Xb.toString()); + this.sw(f, this.Xb); + u.ic(f) + }; + g.xi = function () { + }; + + function ql(a, b, c, d, e) { + var f = a.ba; + f.x = b; + f.y = c; + f.width = d; + f.height = e; + if (!a.xa.J()) { + f = a.Pc; + c = a.margin; + b = c.right + c.left; + var h = c.top + c.bottom; + c = f.width + b; + f = f.height + h; + d += b; + e += h; + b = pl(a, !0); + c === d && f === e && (b = qh); + switch (b) { + case qh: + if (c > d || f > e) uj(a, !0), Ph(a, c > d ? d : c, f > e ? e : f); + break; + case cd: + uj(a, !0); + Ph(a, d, e, 0, 0); + break; + case fl: + uj(a, !0); + Ph(a, d, f, 0, 0); + break; + case el: + uj(a, !0), Ph(a, c, e, 0, 0) + } + } + } + + g.sw = function () { + rl(this, !1); + var a = this.T; + null !== a && null !== a.g && (a.dl(), this.Qu(a), this.ma(), a = this.T, null !== a && (a.nt !== this && a.sE !== this && a.vE !== this || sl(a, !0))) + }; + g.Qu = function (a) { + null !== this.Jd && sl(a, !0) + }; + g.We = function (a, b) { + if (this.visible) { + var c = this.opacity, d = 1; + if (1 !== c) { + if (0 === c) return; + d = a.globalAlpha; + a.globalAlpha = d * c + } + if (a instanceof Nc) a:{ + if (this.visible) { + var e = null, f = a.kw; + if (this instanceof A && (this.type === tl || this.type === ul)) vl(this, a, b); else { + var h = this.Xb; + if (0 !== h.width && 0 !== h.height && !isNaN(h.x) && !isNaN(h.y)) { + var k = this.transform, l = this.S; + 0 !== (this.ea & 4096) === !0 && wl(this); + var m = 0 !== (this.ea & 256), n = !1; + this instanceof qa && xl(this, a); + if (m) { + n = l.Tf() ? l.Ha : l.ba; + if (this.Xh) var p = this.Xh, q = p.x, r = + p.y, s = p.width, + p = p.height; else q = Math.max(h.x, n.x), r = Math.max(h.y, n.y), s = Math.min(h.right, n.right) - q, p = Math.min(h.bottom, n.bottom) - r; + if (q > h.width + h.x || h.x > n.width + n.x || r > h.height + h.y || h.y > n.height + n.y) break a; + n = !0; + Uc(a, 1, 0, 0, 1, 0, 0); + a.save(); + a.beginPath(); + a.rect(q, r, s, p); + a.clip() + } + q = !1; + if (this instanceof G && (q = !0, !this.Ea())) break a; + r = !1; + s = b.Qg; + this.T && s.drawShadows && (r = this.T.il); + a.Ei.$e = [1, 0, 0, 1, 0, 0]; + null !== this.lc && (yl(this, a, this.lc, !0, !0), this.lc instanceof ga && this.lc.type === ve ? (a.beginPath(), + a.rect(h.x, h.y, h.width, h.height), zl(a, this.lc)) : a.fillRect(h.x, h.y, h.width, h.height)); + q && this.il && s.drawShadows && (Uc(a, 1, 0, 0, 1, 0, 0), h = this.em, a.shadowOffsetX = h.x, a.shadowOffsetY = h.y, a.shadowColor = this.dm, a.shadowBlur = this.cm / b.scale, a.$a()); + this instanceof A ? Uc(a, k.m11, k.m12, k.m21, k.m22, k.dx, k.dy) : a.Ei.$e = [k.m11, k.m12, k.m21, k.m22, k.dx, k.dy]; + if (null !== this.Ib) { + var p = this.Ha, h = k = 0, s = p.width, p = p.height, t = 0; + this instanceof X && (p = this.Pa.kb, k = p.x, h = p.y, s = p.width, p = p.height, t = this.Sg); + yl(this, a, this.Ib, + !0, !1); + this.Ib instanceof ga && this.Ib.type === ve ? (a.beginPath(), a.rect(k - t / 2, h - t / 2, s + t, p + t), zl(a, this.Ib)) : a.fillRect(k - t / 2, h - t / 2, s + t, p + t) + } + s = h = k = 0; + r && (null !== this.Ib || null !== this.lc || null !== l && 0 !== (l.ea & 512) || null !== l && l.type === Yi && l.If() !== this) ? (Al(this, !0), k = a.shadowOffsetX, h = a.shadowOffsetY, s = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0) : Al(this, !1); + this.Mj(a, b); + r && 0 !== (this.ea & 512) === !0 && (a.shadowOffsetX = k, a.shadowOffsetY = h, a.shadowBlur = s); + q && r && (a.shadowOffsetX = 0, a.shadowOffsetY = + 0, a.shadowBlur = 0); + m && (a.restore(), n && a.rf.pop(), $i(b, a)); + this instanceof A && (e = a.rf.pop()); + q && r && a.rf.pop(); + null !== a.nD && (null === e && (f === a.kw ? (Uc(a, 1, 0, 0, 1, 0, 0), e = a.rf.pop()) : e = a.kw), a.nD(this, e)) + } + } + } + } else { + if (this instanceof A && (this.type === tl || this.type === ul)) { + vl(this, a, b); + 1 !== c && (a.globalAlpha = d); + return + } + q = this.Xb; + if (0 !== q.width && 0 !== q.height && !isNaN(q.x) && !isNaN(q.y)) { + e = this.transform; + f = this.S; + 0 !== (this.ea & 4096) === !0 && wl(this); + l = 0 !== (this.ea & 256); + this instanceof qa && xl(this, a); + if (l) { + m = f.Tf() ? f.Ha : + f.ba; + this.Xh ? (h = this.Xh, n = h.x, r = h.y, k = h.width, h = h.height) : (n = Math.max(q.x, m.x), r = Math.max(q.y, m.y), k = Math.min(q.right, m.right) - n, h = Math.min(q.bottom, m.bottom) - r); + if (n > q.width + q.x || q.x > m.width + m.x || r > q.height + q.y || q.y > m.height + m.y) { + 1 !== c && (a.globalAlpha = d); + return + } + a.save(); + a.beginPath(); + a.rect(n, r, k, h); + a.clip() + } + r = b.Qg; + m = !1; + if (this instanceof G) { + m = !0; + if (!this.Ea()) { + 1 !== c && (a.globalAlpha = d); + return + } + this.il && r.drawShadows && (n = this.em, a.shadowOffsetX = n.x * b.scale * b.nf, a.shadowOffsetY = n.y * b.scale * b.nf, a.shadowColor = + this.dm, a.shadowBlur = this.cm) + } + n = !1; + this.T && r.drawShadows && (n = this.T.il); + null !== this.lc && (yl(this, a, this.lc, !0, !0), this.lc instanceof ga && this.lc.type === ve ? (a.beginPath(), a.rect(q.x, q.y, q.width, q.height), zl(a, this.lc)) : a.fillRect(q.x, q.y, q.width, q.height)); + e.Os() || a.transform(e.m11, e.m12, e.m21, e.m22, e.dx, e.dy); + null !== this.Ib && (h = this.Ha, r = q = 0, k = h.width, h = h.height, s = 0, this instanceof X && (h = this.Pa.kb, q = h.x, r = h.y, k = h.width, h = h.height, s = this.Sg), yl(this, a, this.Ib, !0, !1), this.Ib instanceof ga && this.Ib.type === + ve ? (a.beginPath(), a.rect(q - s / 2, r - s / 2, k + s, h + s), zl(a, this.Ib)) : a.fillRect(q - s / 2, r - s / 2, k + s, h + s)); + k = r = q = 0; + n && (null !== this.Ib || null !== this.lc || null !== f && 0 !== (f.ea & 512) || null !== f && (f.type === Yi || f.type === oh) && f.If() !== this) ? (Al(this, !0), q = a.shadowOffsetX, r = a.shadowOffsetY, k = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0) : Al(this, !1); + this.Mj(a, b); + n && 0 !== (this.ea & 512) === !0 && (a.shadowOffsetX = q, a.shadowOffsetY = r, a.shadowBlur = k); + m && n && (a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0); + l ? (a.restore(), + this instanceof A ? $i(b, a, !0) : $i(b, a, !1)) : e.Os() || (f = 1 / (e.m11 * e.m22 - e.m12 * e.m21), a.transform(e.m22 * f, -e.m12 * f, -e.m21 * f, e.m11 * f, f * (e.m21 * e.dy - e.m22 * e.dx), f * (e.m12 * e.dx - e.m11 * e.dy))) + } + } + 1 !== c && (a.globalAlpha = d) + } + }; + + function vl(a, b, c) { + var d = a.Xb; + 0 === d.width || 0 === d.height || isNaN(d.x) || isNaN(d.y) || (null !== a.lc && (yl(a, b, a.lc, !0, !0), a.lc instanceof ga && a.lc.type === ve ? (b.beginPath(), b.rect(d.x, d.y, d.width, d.height), zl(b, a.lc)) : b.fillRect(d.x, d.y, d.width, d.height)), null !== a.Ib && (yl(a, b, a.Ib, !0, !1), a.Ib instanceof ga && a.Ib.type === ve ? (b.beginPath(), b.rect(d.x, d.y, d.width, d.height), zl(b, a.Ib)) : b.fillRect(d.x, d.y, d.width, d.height)), a.Mj(b, c)) + } + + g.Mj = function () { + }; + + function zl(a, b) { + if (b instanceof ga && b.type === ve && !(a instanceof Nc)) { + var c = b.lx, d = b.kx; + d > c ? (a.scale(c / d, 1), a.translate((d - c) / 2, 0)) : c > d && (a.scale(1, d / c), a.translate(0, (c - d) / 2)); + a.Ft ? a.clip() : a.fill(); + d > c ? (a.translate(-(d - c) / 2, 0), a.scale(1 / (c / d), 1)) : c > d && (a.translate(0, -(c - d) / 2), a.scale(1, 1 / (d / c))) + } else a.Ft ? a.clip() : a.fill() + } + + function Bl(a) { + a.Ft || a.stroke() + } + + function yl(a, b, c, d, e) { + if (null !== c) { + var f = 1, h = 1; + if ("string" === typeof c) d ? b.Sm !== c && (b.fillStyle = c, b.Sm = c) : b.Tm !== c && (b.strokeStyle = c, b.Tm = c); else if (c.type === te) c = c.color, d ? b.Sm !== c && (b.fillStyle = c, b.Sm = c) : b.Tm !== c && (b.strokeStyle = c, b.Tm = c); else { + var k, h = a.Ha, f = h.width, h = h.height; + if (e) var l = a.ba, f = l.width, h = l.height; + var m = b instanceof CanvasRenderingContext2D; + if (m && (c.Fg && c.type === bl || c.lx === f && c.kx === h)) k = c.Fg; else { + var n = l = 0, p = 0, q = 0, r = 0, s = 0, s = r = 0; + e && (l = a.ba, f = l.width, h = l.height, r = l.x, s = l.y); + l = c.start.x * + f + c.start.offsetX; + n = c.start.y * h + c.start.offsetY; + p = c.end.x * f + c.end.offsetX; + q = c.end.y * h + c.end.offsetY; + l += r; + p += r; + n += s; + q += s; + c.type === ue ? k = b.createLinearGradient(l, n, p, q) : c.type === ve ? (s = isNaN(c.us) ? Math.max(f, h) / 2 : c.us, isNaN(c.ut) ? (r = 0, s = Math.max(f, h) / 2) : r = c.ut, k = b.createRadialGradient(l, n, r, p, q, s)) : c.type === bl ? k = b.createPattern(c.pattern, "repeat") : u.Kd(c.type, "Brush type"); + if (c.type !== bl && (a = c.os, null !== a)) for (a = a.i; a.next();) k.addColorStop(a.key, a.value); + m && (c.Fg = k, c.lx = f, c.kx = h) + } + d ? b.Sm !== k && (b.fillStyle = + k, b.Sm = k) : b.Tm !== k && (b.strokeStyle = k, b.Tm = k) + } + } + } + + S.prototype.isContainedBy = S.prototype.gl = function (a) { + if (a instanceof A) a:{ + if (this !== a && null !== a) for (var b = this.S; null !== b;) { + if (b === a) { + a = !0; + break a + } + b = b.S + } + a = !1 + } else a = !1; + return a + }; + S.prototype.isVisibleObject = S.prototype.kl = function () { + if (!this.visible) return !1; + var a = this.S; + return null !== a ? a.kl() : !0 + }; + + function wl(a) { + if (0 !== (a.ea & 2048) === !0) { + var b = a.Sd; + b.reset(); + if (!a.Xb.J() || !a.Pc.J()) { + Cl(a, !1); + return + } + b.translate(a.Xb.x, a.Xb.y); + b.translate(-a.Ba.x, -a.Ba.y); + var c = a.Ha; + nl(a, b, c.x, c.y, c.width, c.height); + Cl(a, !1); + Dl(a, !0) + } + 0 !== (a.ea & 4096) === !0 && (b = a.S, null === b ? (a.Xm.set(a.Sd), a.fu = a.scale, Dl(a, !1)) : null !== b.Ff && (c = a.Xm, c.reset(), b.Tf() ? c.multiply(b.Xm) : null !== b.S && c.multiply(b.S.Xm), c.multiply(a.Sd), a.fu = a.scale * b.fu, Dl(a, !1))) + } + + function nl(a, b, c, d, e, f) { + 1 !== a.scale && b.scale(a.scale); + if (0 !== a.angle) { + var h = Ib; + a.Ze && a.Ze.pd() && (h = a.Ze); + var k = u.K(); + if (a instanceof G && a.ec !== a) for (c = a.ec, d = c.Ha, k.rt(d.x, d.y, d.width, d.height, h), c.yk.ab(k), k.offset(-c.Ba.x, -c.Ba.y), h = c.S; null !== h && h !== a;) h.yk.ab(k), k.offset(-h.Ba.x, -h.Ba.y), h = h.S; else k.rt(c, d, e, f, h); + b.rotate(a.angle, k.x, k.y); + u.v(k) + } + } + + g = S.prototype; + g.R = function (a) { + void 0 === a && (a = !1); + if (!0 !== Aj(this)) { + uj(this, !0); + rl(this, !0); + var b = this.S; + null !== b ? a || b.R() : (a = this.g, null !== a && (a.Xf.add(this), this instanceof U && (a.ha.gb || this.sf(), null !== this.ce && El(this.ce)), a.de(!0))); + if (this instanceof A) { + if (this.oa === Yi || this.oa === ah) a = this.If(), null !== a && a.R(!0); + a = this.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + !0 !== Aj(d) && (d.xa.J() || (d instanceof ph || d instanceof A || d instanceof qa || pl(d, !1) !== qh) && d.R(!0)) + } + } + } + }; + g.Fo = function () { + !1 === Aj(this) && (uj(this, !0), rl(this, !0)) + }; + + function El(a) { + if (!1 === Bj(a)) { + if (null !== a.S) a.S.R(); else { + var b = a.g; + null !== b && (b.Xf.add(a), a instanceof U && a.sf(), b.de()) + } + rl(a, !0) + } + } + + g.Jg = function () { + 0 !== (this.ea & 2048) === !1 && (Cl(this, !0), Dl(this, !0)) + }; + g.mz = function () { + Dl(this, !0) + }; + g.ma = function () { + var a = this.T; + null !== a && a.ma() + }; + + function pl(a, b) { + var c = a.stretch, d = a.S; + if (null !== d && d.oa === Fl) return Gl(a, d.fd(a.rc), d.ed(a.column), b); + if (null !== d && d.oa === Yi && d.If() === a) return Hl(a, cd, b); + if (c === dl) { + if (null !== d) { + if (d.oa === oh && d.If() === a) return Hl(a, cd, b); + c = d.Bd; + return c === dl ? Hl(a, qh, b) : Hl(a, c, b) + } + return Hl(a, qh, b) + } + return Hl(a, c, b) + } + + function Gl(a, b, c, d) { + var e = a.stretch; + if (e !== dl) return Hl(a, e, d); + var f = e = null; + switch (b.stretch) { + case el: + f = !0; + break; + case cd: + f = !0 + } + switch (c.stretch) { + case fl: + e = !0; + break; + case cd: + e = !0 + } + b = a.S.Bd; + null === e && (e = b === fl || b === cd); + null === f && (f = b === el || b === cd); + return !0 === e && !0 === f ? Hl(a, cd, d) : !0 === e ? Hl(a, fl, d) : !0 === f ? Hl(a, el, d) : Hl(a, qh, d) + } + + function Hl(a, b, c) { + if (c) return b; + if (b === qh) return qh; + c = a.xa; + if (c.J()) return qh; + a = a.angle; + if (!isNaN(c.width)) if (90 !== a && 270 !== a) { + if (b === fl) return qh; + if (b === cd) return el + } else { + if (b === el) return qh; + if (b === cd) return fl + } + if (!isNaN(c.height)) if (90 !== a && 270 !== a) { + if (b === el) return qh; + if (b === cd) return fl + } else { + if (b === fl) return qh; + if (b === cd) return el + } + return b + } + + u.defineProperty(S, {Cw: "segmentOrientation"}, function () { + return this.Cr + }, function (a) { + var b = this.Cr; + b !== a && (this.Cr = a, this.R(), this.h("segmentOrientation", b, a)) + }); + u.defineProperty(S, {Pf: "segmentIndex"}, function () { + return this.Ar + }, function (a) { + a = Math.round(a); + var b = this.Ar; + b !== a && (this.Ar = a, this.R(), this.h("segmentIndex", b, a)) + }); + u.defineProperty(S, {Bw: "segmentFraction"}, function () { + return this.zr + }, function (a) { + isNaN(a) ? a = 0 : 0 > a ? a = 0 : 1 < a && (a = 1); + var b = this.zr; + b !== a && (this.zr = a, this.R(), this.h("segmentFraction", b, a)) + }); + u.defineProperty(S, {BE: "segmentOffset"}, function () { + return this.Br + }, function (a) { + var b = this.Br; + b.L(a) || (this.Br = a = a.Z(), this.R(), this.h("segmentOffset", b, a)) + }); + u.defineProperty(S, {stretch: "stretch"}, function () { + return this.Hh + }, function (a) { + var b = this.Hh; + b !== a && (this.Hh = a, this.R(), this.h("stretch", b, a)) + }); + u.defineProperty(S, {name: "name"}, function () { + return this.Ub + }, function (a) { + var b = this.Ub; + b !== a && (this.Ub = a, null !== this.T && (this.T.Bk = null), this.h("name", b, a)) + }); + u.defineProperty(S, {opacity: "opacity"}, function () { + return this.Ic + }, function (a) { + var b = this.Ic; + b !== a && (u.j(a, "number", S, "opacity"), (0 > a || 1 < a) && u.wa(a, "0 <= value <= 1", S, "opacity"), this.Ic = a, this.h("opacity", b, a), a = this.g, b = this.T, null !== a && null !== b && a.ma(yi(b, b.ba))) + }); + u.defineProperty(S, {visible: "visible"}, function () { + return 0 !== (this.ea & 1) + }, function (a) { + var b = 0 !== (this.ea & 1); + b !== a && (this.ea ^= 1, this.h("visible", b, a), b = this.S, null !== b ? b.R() : this instanceof G && (this.dl(), this.He(a)), this.ma(), Il(this)) + }); + u.defineProperty(S, {Ag: "pickable"}, function () { + return 0 !== (this.ea & 2) + }, function (a) { + var b = 0 !== (this.ea & 2); + b !== a && (this.ea ^= 2, this.h("pickable", b, a)) + }); + u.defineProperty(S, {BG: "fromLinkableDuplicates"}, function () { + return 0 !== (this.ea & 4) + }, function (a) { + var b = 0 !== (this.ea & 4); + b !== a && (this.ea ^= 4, this.h("fromLinkableDuplicates", b, a)) + }); + u.defineProperty(S, {CG: "fromLinkableSelfNode"}, function () { + return 0 !== (this.ea & 8) + }, function (a) { + var b = 0 !== (this.ea & 8); + b !== a && (this.ea ^= 8, this.h("fromLinkableSelfNode", b, a)) + }); + u.defineProperty(S, {wI: "toLinkableDuplicates"}, function () { + return 0 !== (this.ea & 16) + }, function (a) { + var b = 0 !== (this.ea & 16); + b !== a && (this.ea ^= 16, this.h("toLinkableDuplicates", b, a)) + }); + u.defineProperty(S, {xI: "toLinkableSelfNode"}, function () { + return 0 !== (this.ea & 32) + }, function (a) { + var b = 0 !== (this.ea & 32); + b !== a && (this.ea ^= 32, this.h("toLinkableSelfNode", b, a)) + }); + u.defineProperty(S, {tg: "isPanelMain"}, function () { + return 0 !== (this.ea & 64) + }, function (a) { + var b = 0 !== (this.ea & 64); + b !== a && (this.ea ^= 64, this.R(), this.h("isPanelMain", b, a)) + }); + u.defineProperty(S, {pz: "isActionable"}, function () { + return 0 !== (this.ea & 128) + }, function (a) { + var b = 0 !== (this.ea & 128); + b !== a && (this.ea ^= 128, this.h("isActionable", b, a)) + }); + u.defineProperty(S, {nm: "areaBackground"}, function () { + return this.lc + }, function (a) { + var b = this.lc; + b !== a && (a instanceof ga && a.freeze(), this.lc = a, this.ma(), this.h("areaBackground", b, a)) + }); + u.defineProperty(S, {background: "background"}, function () { + return this.Ib + }, function (a) { + var b = this.Ib; + b !== a && (a instanceof ga && a.freeze(), this.Ib = a, this.ma(), this.h("background", b, a)) + }); + + function Al(a, b) { + a.ea = b ? a.ea | 512 : a.ea & -513 + } + + function Jl(a, b) { + a.ea = b ? a.ea | 1024 : a.ea & -1025 + } + + function Cl(a, b) { + a.ea = b ? a.ea | 2048 : a.ea & -2049 + } + + function Dl(a, b) { + a.ea = b ? a.ea | 4096 : a.ea & -4097 + } + + function Aj(a) { + return 0 !== (a.ea & 8192) + } + + function uj(a, b) { + a.ea = b ? a.ea | 8192 : a.ea & -8193 + } + + function Bj(a) { + return 0 !== (a.ea & 16384) + } + + function rl(a, b) { + a.ea = b ? a.ea | 16384 : a.ea & -16385 + } + + u.u(S, {T: "part"}, function () { + if (this instanceof G) return this; + if (this.Wl) return this.Wl; + var a; + for (a = this.S; a;) { + if (a instanceof G) return this.Wl = a; + a = a.S + } + return null + }); + u.u(S, {S: "panel"}, function () { + return this.Pg + }); + S.prototype.ql = function (a) { + this.Pg = a + }; + u.u(S, {layer: "layer"}, function () { + var a = this.T; + return null !== a ? a.layer : null + }); + u.u(S, {g: "diagram"}, function () { + var a = this.T; + return null !== a ? a.g : null + }, {configurable: !0}); + u.defineProperty(S, {position: "position"}, function () { + return this.Ma + }, function (a) { + var b = this.Ma; + b.L(a) || (a = a.Z(), this.dA(a, b) && this.h("position", b, a)) + }); + S.prototype.dA = function (a) { + this.Ma = a; + El(this); + this.Jg(); + return !0 + }; + S.prototype.GE = function (a, b) { + this.Ma.m(a, b); + Kl(this, !0); + this.Jg() + }; + u.u(S, {ba: "actualBounds"}, function () { + return this.Xb + }); + u.defineProperty(S, {scale: "scale"}, function () { + return this.$b + }, function (a) { + var b = this.$b; + b !== a && (0 >= a && u.k("GraphObject.scale must be greater than zero"), this.$b = a, this.Jg(), this.R(), this.h("scale", b, a)) + }); + u.defineProperty(S, {angle: "angle"}, function () { + return this.Ym + }, function (a) { + var b = this.Ym; + b !== a && (a %= 360, 0 > a && (a += 360), b !== a && (this.Ym = a, this.R(), this.Jg(), this.h("angle", b, a))) + }); + u.defineProperty(S, {xa: "desiredSize"}, function () { + return this.jf + }, function (a) { + var b = this.jf; + b.L(a) || (this.jf = a = a.Z(), this.R(), this instanceof X && this.le(), this.h("desiredSize", b, a), a = this.T, null !== a && 0 !== (this.ea & 1024) && (ll(this, a, "width"), ll(this, a, "height"))) + }); + u.defineProperty(S, {width: "width"}, function () { + return this.jf.width + }, function (a) { + if (this.jf.width !== a) { + var b = this.jf; + this.jf = a = (new ia(a, this.jf.height)).freeze(); + this.R(); + this instanceof X && this.le(); + this.h("desiredSize", b, a); + b = this.T; + null !== b && 0 !== (this.ea & 1024) && ll(this, b, "width") + } + }); + u.defineProperty(S, {height: "height"}, function () { + return this.jf.height + }, function (a) { + if (this.jf.height !== a) { + var b = this.jf; + this.jf = a = (new ia(this.jf.width, a)).freeze(); + this.R(); + this instanceof X && this.le(); + this.h("desiredSize", b, a); + b = this.T; + null !== b && 0 !== (this.ea & 1024) && ll(this, b, "height") + } + }); + u.defineProperty(S, {vg: "minSize"}, function () { + return this.nj + }, function (a) { + var b = this.nj; + b.L(a) || (a = a.copy(), isNaN(a.width) && (a.width = 0), isNaN(a.height) && (a.height = 0), a.freeze(), this.nj = a, this.R(), this.h("minSize", b, a)) + }); + u.defineProperty(S, {af: "maxSize"}, function () { + return this.lj + }, function (a) { + var b = this.lj; + b.L(a) || (a = a.copy(), isNaN(a.width) && (a.width = Infinity), isNaN(a.height) && (a.height = Infinity), a.freeze(), this.lj = a, this.R(), this.h("maxSize", b, a)) + }); + u.u(S, {Ba: "measuredBounds"}, function () { + return this.Pc + }); + u.u(S, {Ha: "naturalBounds"}, function () { + return this.Hc + }, {configurable: !0}); + u.defineProperty(S, {margin: "margin"}, function () { + return this.Gq + }, function (a) { + "number" === typeof a && (a = new rb(a)); + var b = this.Gq; + b.L(a) || (this.Gq = a = a.Z(), this.R(), this.h("margin", b, a)) + }); + u.u(S, {transform: null}, function () { + 0 !== (this.ea & 2048) === !0 && wl(this); + return this.Sd + }); + u.u(S, {Ff: null}, function () { + 0 !== (this.ea & 4096) === !0 && wl(this); + return this.Xm + }); + u.defineProperty(S, {alignment: "alignment"}, function () { + return this.se + }, function (a) { + var b = this.se; + b.L(a) || (a.ne() && !a.Lc() && u.k("alignment must be a real Spot or Spot.Default"), this.se = a = a.Z(), El(this), this.h("alignment", b, a)) + }); + u.defineProperty(S, {column: "column"}, function () { + return this.Cp + }, function (a) { + a = Math.round(a); + var b = this.Cp; + b !== a && (0 > a && u.wa(a, ">= 0", S, "column"), this.Cp = a, this.R(), this.h("column", b, a)) + }); + u.defineProperty(S, {$F: "columnSpan"}, function () { + return this.Wi + }, function (a) { + a = Math.round(a); + var b = this.Wi; + b !== a && (1 > a && u.wa(a, ">= 1", S, "columnSpan"), this.Wi = a, this.R(), this.h("columnSpan", b, a)) + }); + u.defineProperty(S, {rc: "row"}, function () { + return this.wr + }, function (a) { + a = Math.round(a); + var b = this.wr; + b !== a && (0 > a && u.wa(a, ">= 0", S, "row"), this.wr = a, this.R(), this.h("row", b, a)) + }); + u.defineProperty(S, {rowSpan: "rowSpan"}, function () { + return this.tj + }, function (a) { + a = Math.round(a); + var b = this.tj; + b !== a && (1 > a && u.wa(a, ">= 1", S, "rowSpan"), this.tj = a, this.R(), this.h("rowSpan", b, a)) + }); + u.defineProperty(S, {Hj: "alignmentFocus"}, function () { + return this.vp + }, function (a) { + var b = this.vp; + b.L(a) || (a.ne() && !a.Lc() && u.k("alignmentFocus must be a real Spot or Spot.Default"), this.vp = a = a.Z(), this.R(), this.h("alignmentFocus", b, a)) + }); + u.defineProperty(S, {Jd: "portId"}, function () { + return this.ir + }, function (a) { + var b = this.ir; + if (b !== a) { + var c = this.T; + null === c || c instanceof U || (u.k("portID being set on a Link: " + a), c = null); + null !== b && null !== c && Ll(c, this); + this.ir = a; + if (null !== a && c) { + c.xh = !0; + null === c.Qd && Ml(c); + var d = this.Jd; + null !== d && c.Qd.add(d, this) + } + this.h("portId", b, a) + } + }); + + function Nl(a) { + var b = {value: null}; + Ol(a, b); + return b.value + } + + function Ol(a, b) { + var c = a.S; + return null === c || !Ol(c, b) && a.visible ? (b.value = a, !1) : !0 + } + + function Il(a) { + var b = a.T; + b instanceof U && (a = a.g, null === a || a.ha.gb || b.sf()) + } + + u.defineProperty(S, {xb: "toSpot"}, function () { + return null !== this.Q ? this.Q.Ej : vb + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Ej; + b.L(a) || (a = a.Z(), this.Q.Ej = a, this.h("toSpot", b, a), Il(this)) + }); + u.defineProperty(S, {vl: "toEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.Cj : 10 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Cj; + b !== a && (0 > a && u.wa(a, ">= 0", S, "toEndSegmentLength"), this.Q.Cj = a, this.h("toEndSegmentLength", b, a), Il(this)) + }); + u.defineProperty(S, {wt: "toEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.Bj : jl + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Bj; + b !== a && (this.Q.Bj = a, this.h("toEndSegmentDirection", b, a), Il(this)) + }); + u.defineProperty(S, {yt: "toShortLength"}, function () { + return null !== this.Q ? this.Q.Dj : 0 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Dj; + b !== a && (this.Q.Dj = a, this.h("toShortLength", b, a), Il(this)) + }); + u.defineProperty(S, {OE: "toLinkable"}, function () { + return this.Sr + }, function (a) { + var b = this.Sr; + b !== a && (this.Sr = a, this.h("toLinkable", b, a)) + }); + u.defineProperty(S, {yI: "toMaxLinks"}, function () { + return this.Tr + }, function (a) { + var b = this.Tr; + b !== a && (0 > a && u.wa(a, ">= 0", S, "toMaxLinks"), this.Tr = a, this.h("toMaxLinks", b, a)) + }); + u.defineProperty(S, {vb: "fromSpot"}, function () { + return null !== this.Q ? this.Q.cj : vb + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.cj; + b.L(a) || (a = a.Z(), this.Q.cj = a, this.h("fromSpot", b, a), Il(this)) + }); + u.defineProperty(S, {Yk: "fromEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.aj : 10 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.aj; + b !== a && (0 > a && u.wa(a, ">= 0", S, "fromEndSegmentLength"), this.Q.aj = a, this.h("fromEndSegmentLength", b, a), Il(this)) + }); + u.defineProperty(S, {Es: "fromEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.$i : jl + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.$i; + b !== a && (this.Q.$i = a, this.h("fromEndSegmentDirection", b, a), Il(this)) + }); + u.defineProperty(S, {Fs: "fromShortLength"}, function () { + return null !== this.Q ? this.Q.bj : 0 + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.bj; + b !== a && (this.Q.bj = a, this.h("fromShortLength", b, a), Il(this)) + }); + u.defineProperty(S, {vD: "fromLinkable"}, function () { + return this.Wp + }, function (a) { + var b = this.Wp; + b !== a && (this.Wp = a, this.h("fromLinkable", b, a)) + }); + u.defineProperty(S, {DG: "fromMaxLinks"}, function () { + return this.Xp + }, function (a) { + var b = this.Xp; + b !== a && (0 > a && u.wa(a, ">= 0", S, "fromMaxLinks"), this.Xp = a, this.h("fromMaxLinks", b, a)) + }); + u.defineProperty(S, {cursor: "cursor"}, function () { + return this.Jp + }, function (a) { + var b = this.Jp; + b !== a && (u.j(a, "string", S, "cursor"), this.Jp = a, this.h("cursor", b, a)) + }); + u.defineProperty(S, {click: "click"}, function () { + return null !== this.P ? this.P.Wh : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Wh; + b !== a && (null !== a && u.j(a, "function", S, "click"), this.P.Wh = a, this.h("click", b, a)) + }); + u.defineProperty(S, {ts: "doubleClick"}, function () { + return null !== this.P ? this.P.ci : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ci; + b !== a && (null !== a && u.j(a, "function", S, "doubleClick"), this.P.ci = a, this.h("doubleClick", b, a)) + }); + u.defineProperty(S, {Uy: "contextClick"}, function () { + return null !== this.P ? this.P.Yh : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Yh; + b !== a && (null !== a && u.j(a, "function", S, "contextClick"), this.P.Yh = a, this.h("contextClick", b, a)) + }); + u.defineProperty(S, {ZD: "mouseEnter"}, function () { + return null !== this.P ? this.P.Rq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Rq; + b !== a && (null !== a && u.j(a, "function", S, "mouseEnter"), this.P.Rq = a, this.h("mouseEnter", b, a)) + }); + u.defineProperty(S, {$D: "mouseLeave"}, function () { + return null !== this.P ? this.P.Sq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Sq; + b !== a && (null !== a && u.j(a, "function", S, "mouseLeave"), this.P.Sq = a, this.h("mouseLeave", b, a)) + }); + u.defineProperty(S, {Fz: "mouseOver"}, function () { + return null !== this.P ? this.P.mi : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.mi; + b !== a && (null !== a && u.j(a, "function", S, "mouseOver"), this.P.mi = a, this.h("mouseOver", b, a)) + }); + u.defineProperty(S, {Ez: "mouseHover"}, function () { + return null !== this.P ? this.P.li : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.li; + b !== a && (null !== a && u.j(a, "function", S, "mouseHover"), this.P.li = a, this.h("mouseHover", b, a)) + }); + u.defineProperty(S, {Dz: "mouseHold"}, function () { + return null !== this.P ? this.P.ki : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ki; + b !== a && (null !== a && u.j(a, "function", S, "mouseHold"), this.P.ki = a, this.h("mouseHold", b, a)) + }); + u.defineProperty(S, {CH: "mouseDragEnter"}, function () { + return null !== this.P ? this.P.Pq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Pq; + b !== a && (null !== a && u.j(a, "function", S, "mouseDragEnter"), this.P.Pq = a, this.h("mouseDragEnter", b, a)) + }); + u.defineProperty(S, {DH: "mouseDragLeave"}, function () { + return null !== this.P ? this.P.Qq : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Qq; + b !== a && (null !== a && u.j(a, "function", S, "mouseDragLeave"), this.P.Qq = a, this.h("mouseDragLeave", b, a)) + }); + u.defineProperty(S, {Cz: "mouseDrop"}, function () { + return null !== this.P ? this.P.ji : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ji; + b !== a && (null !== a && u.j(a, "function", S, "mouseDrop"), this.P.ji = a, this.h("mouseDrop", b, a)) + }); + u.defineProperty(S, {HC: "actionDown"}, function () { + return null !== this.P ? this.P.qp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.qp; + b !== a && (null !== a && u.j(a, "function", S, "actionDown"), this.P.qp = a, this.h("actionDown", b, a)) + }); + u.defineProperty(S, {IC: "actionMove"}, function () { + return null !== this.P ? this.P.rp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.rp; + b !== a && (null !== a && u.j(a, "function", S, "actionMove"), this.P.rp = a, this.h("actionMove", b, a)) + }); + u.defineProperty(S, {JC: "actionUp"}, function () { + return null !== this.P ? this.P.sp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.sp; + b !== a && (null !== a && u.j(a, "function", S, "actionUp"), this.P.sp = a, this.h("actionUp", b, a)) + }); + u.defineProperty(S, {GC: "actionCancel"}, function () { + return null !== this.P ? this.P.pp : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.pp; + b !== a && (null !== a && u.j(a, "function", S, "actionCancel"), this.P.pp = a, this.h("actionCancel", b, a)) + }); + u.defineProperty(S, {lA: "toolTip"}, function () { + return null !== this.P ? this.P.ti : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.ti; + b !== a && (null !== a && u.C(a, lf, S, "toolTip"), this.P.ti = a, this.h("toolTip", b, a)) + }); + u.defineProperty(S, {contextMenu: "contextMenu"}, function () { + return null !== this.P ? this.P.Zh : null + }, function (a) { + null === this.P && gl(this); + var b = this.P.Zh; + b !== a && (null !== a && u.C(a, lf, S, "contextMenu"), this.P.Zh = a, this.h("contextMenu", b, a)) + }); + S.prototype.bind = S.prototype.bind = function (a) { + a.fg = this; + var b = this.zo(); + null !== b && Pl(b) && u.k("Cannot add a Binding to a template that has already been copied: " + a); + null === this.Gc && (this.Gc = new E(bf)); + this.Gc.add(a) + }; + S.prototype.findTemplateBinder = S.prototype.zo = function () { + for (var a = this instanceof A ? this : this.S; null !== a;) { + if (null !== a.yl) return a; + a = a.S + } + return null + }; + S.fromSvg = S.fromSVG = function (a) { + return Ql(a) + }; + S.prototype.setProperties = function (a) { + u.ot(this, a) + }; + var Rl; + S.make = Rl = function (a, b) { + var c = arguments, d = null, e = null; + if ("function" === typeof a) e = a; else if ("string" === typeof a) { + var f = Sl.ta(a); + "function" === typeof f ? (c = u.Pk(arguments), d = f(c)) : e = da[a] + } + null === d && (void 0 === e && (d = window.$, void 0 !== d && void 0 !== d.noop && u.k("GraphObject.make failed to complete. Is it conflicting with another $ var? (such as jQuery)"), u.k("GraphObject.make failed to complete, it may be conflicting with another var.")), null !== e && e.constructor || u.k("GraphObject.make requires a class function or class name, not: " + + a), d = new e); + f = 1; + if (d instanceof D && 1 < c.length) { + var h = d, e = c[1]; + if ("string" === typeof e || e instanceof HTMLDivElement) Wi(h, e), f++ + } + for (; f < c.length; f++) e = c[f], void 0 === e ? u.k("Undefined value at argument " + f + " for object being constructed by GraphObject.make: " + d) : Tl(d, e); + return d + }; + + function Tl(a, b) { + if ("string" === typeof b) if (a instanceof qa) a.text = b; else if (a instanceof X) a.Fb = b; else if (a instanceof Ri) a.source = b; else if (a instanceof A) { + var c = Da(A, b); + null !== c ? a.type = c : u.k("Unknown Panel type as an argument to GraphObject.make: " + b) + } else a instanceof ga ? (c = Da(ga, b), null !== c ? a.type = c : u.k("Unknown Brush type as an argument to GraphObject.make: " + b)) : a instanceof $c ? (c = Da($c, b), null !== c ? a.type = c : u.k("Unknown Geometry type as an argument to GraphObject.make: " + b)) : a instanceof Jd ? + (c = Da(Jd, b), null !== c ? a.type = c : u.k("Unknown PathSegment type as an argument to GraphObject.make: " + b)) : u.k("Unable to use a string as an argument to GraphObject.make: " + b); else if (b instanceof S) c = b, a instanceof A || u.k("A GraphObject can only be added to a Panel, not to: " + a), a.add(c); else if (b instanceof Se) { + var d = b, c = a, e; + d.ae && c.fd ? e = c.fd(d.index) : !d.ae && c.ed ? e = c.ed(d.index) : u.k("A RowColumnDefinition can only be added to a Panel, not to: " + a); + e.qs(d) + } else if (b instanceof ea) a instanceof W && b.Ae === + W ? 2 === (b.value & 2) ? a.zw = b : b === kh || b === ch || b === bh ? a.Ve = b : b === Ul || b === Vl || b === Wl ? a.es = b : b !== Xl && b !== dh && u.k("Unknown Link enum value for a Link property: " + b) : a instanceof A && b.Ae === A ? a.type = b : a instanceof qa && b.Ae === qa ? a.bF = b : a instanceof X && (b === qh || b === sh || b === th || b === dl) ? a.yD = b : a instanceof Ri && (b === qh || b === sh || b === th) ? a.RG = b : a instanceof S && b.Ae === W ? (c = a, 0 === b.name.indexOf("Orient") ? c.Cw = b : u.k("Unknown Link enum value for GraphObject.segmentOrientation property: " + b)) : a instanceof S && b.Ae === S ? a.stretch = + b : a instanceof Se && b.Ae === Se ? a.st = b : a instanceof D && b.Ae === D ? a.no = b : a instanceof ga && b.Ae === ga ? a.type = b : a instanceof $c && b.Ae === $c ? a.type = b : a instanceof Jd && b.Ae === Jd ? a.type = b : a instanceof bf && b.Ae === bf ? a.mode = b : a instanceof Zd && b.Ae === Zd ? a.Ad = b : a instanceof Y && b.Ae === Y ? 0 === b.name.indexOf("Alignment") ? a.alignment = b : 0 === b.name.indexOf("Arrangement") ? a.Gf = b : 0 === b.name.indexOf("Compaction") ? a.compaction = b : 0 === b.name.indexOf("Path") ? a.path = b : 0 === b.name.indexOf("Sorting") ? a.sorting = b : 0 === b.name.indexOf("Style") ? + a.AI = b : u.k("Unknown enum value: " + b) : a instanceof Yl && b.Ae === Yl ? 0 === b.name.indexOf("Aggressive") ? a.NF = b : 0 === b.name.indexOf("Cycle") ? a.kG = b : 0 === b.name.indexOf("Init") ? a.WG = b : 0 === b.name.indexOf("Layer") ? a.mH = b : u.k("Unknown enum value: " + b) : a instanceof Xk && b.Ae === Xk ? b === Zl || b === $l || b === am || b === bm ? a.sorting = b : b === cm || b === dm ? a.Gf = b : b === em || b === fm ? a.alignment = b : u.k("Unknown enum value: " + b) : a instanceof gm && b.Ae === gm ? b === hm || b === im || b === jm || b === km || b === lm ? a.sorting = b : b === mm || b === nm || b === om || b === wm ? a.direction = + b : b === xm || b === ym || b === zm || b === Am ? a.Gf = b : b === Bm || b === Cm ? a.qw = b : u.k("Unknown enum value: " + b) : u.k("No property to set for this enum value: " + b); else if (b instanceof bf) a instanceof S ? a.bind(b) : a instanceof Se ? a.bind(b) : u.k("A Binding can only be applied to a GraphObject or RowColumnDefinition, not to: " + a); else if (b instanceof bd) a instanceof $c ? a.ub.add(b) : u.k("A PathFigure can only be added to a Geometry, not to: " + a); else if (b instanceof Jd) a instanceof bd ? a.Fa.add(b) : u.k("A PathSegment can only be added to a PathFigure, not to: " + + a); else if (b instanceof Je) a instanceof D ? a.Qb = b : a instanceof V ? a.Qb = b : u.k("A Layout can only be assigned to a Diagram or a Group, not to: " + a); else if (Array.isArray(b)) for (c = 0; c < b.length; c++) Tl(a, b[c]); else if ("object" === typeof b && null !== b) if (a instanceof ga) { + e = new pa; + for (c in b) d = parseFloat(c), isNaN(d) ? e[c] = b[c] : a.addColorStop(d, b[c]); + u.ot(a, e) + } else if (a instanceof Se) { + void 0 !== b.row ? (e = b.row, (void 0 === e || null === e || Infinity === e || isNaN(e) || 0 > e) && u.k("Must specify non-negative integer row for RowColumnDefinition " + + b), a.ae = !0, a.index = e) : void 0 !== b.column && (e = b.column, (void 0 === e || null === e || Infinity === e || isNaN(e) || 0 > e) && u.k("Must specify non-negative integer column for RowColumnDefinition " + b), a.ae = !1, a.index = e); + e = new pa; + for (c in b) "row" !== c && "column" !== c && (e[c] = b[c]); + u.ot(a, e) + } else u.ot(a, b); else u.k('Unknown initializer "' + b + '" for object being constructed by GraphObject.make: ' + a) + } + + var Sl = new la("string", "function"); + S.getBuilders = function () { + var a = new la("string", "function"), b; + for (b in Sl) if (b !== b.toLowerCase()) { + var c = Sl[b]; + "function" === typeof c && a.add(b, c) + } + a.freeze(); + return a + }; + var Dm; + S.defineBuilder = Dm = function (a, b) { + u.j(a, "string", S, "defineBuilder:name"); + u.j(b, "function", S, "defineBuilder:func"); + var c = a.toLowerCase(); + "" !== a && "none" !== c && a !== c || u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: " + a); + Sl.add(a, b) + }; + var Em; + S.takeBuilderArgument = Em = function (a, b, c) { + void 0 === c && (c = null); + var d = a[1]; + if ("function" === typeof c ? c(d) : "string" === typeof d) return a.splice(1, 1), d; + if (void 0 === b) throw Error("no " + ("function" === typeof c ? "satisfactory" : "string") + " argument for GraphObject builder " + a[0]); + return b + }; + Dm("Button", function () { + var a = new ga(ue); + a.addColorStop(0, "white"); + a.addColorStop(1, "lightgray"); + var b = new ga(ue); + b.addColorStop(0, "white"); + b.addColorStop(1, "dodgerblue"); + a = Rl(A, Yi, {pz: !0}, { + _buttonFillNormal: a, + _buttonStrokeNormal: "gray", + _buttonFillOver: b, + _buttonStrokeOver: "blue" + }, Rl(X, { + name: "ButtonBorder", + Fb: "Rectangle", + A: new L(0, 0, 2.761423749153968, 2.761423749153968), + B: new L(1, 1, -2.761423749153968, -2.761423749153968), + fill: a, + stroke: "gray" + })); + a.ZD = function (a, b) { + var e = b.je("ButtonBorder"); + if (e instanceof + X) { + var f = b._buttonFillOver; + b._buttonFillNormal = e.fill; + e.fill = f; + f = b._buttonStrokeOver; + b._buttonStrokeNormal = e.stroke; + e.stroke = f + } + }; + a.$D = function (a, b) { + var e = b.je("ButtonBorder"); + e instanceof X && (e.fill = b._buttonFillNormal, e.stroke = b._buttonStrokeNormal) + }; + return a + }); + Dm("TreeExpanderButton", function () { + var a = Rl("Button", { + _treeExpandedFigure: "MinusLine", + _treeCollapsedFigure: "PlusLine" + }, Rl(X, {name: "ButtonIcon", Fb: "MinusLine", xa: K.mp}, (new bf("figure", "isTreeExpanded", function (a, c) { + var d = c.S; + return a ? d._treeExpandedFigure : d._treeCollapsedFigure + })).rw()), {visible: !1}, (new bf("visible", "isTreeLeaf", function (a) { + return !a + })).rw()); + a.click = function (a, c) { + var d = c.T; + d instanceof lf && (d = d.Kh); + if (d instanceof U) { + var e = d.g; + if (null !== e) { + e = e.Eb; + if (d.Vc) { + if (!e.canCollapseTree(d)) return + } else if (!e.canExpandTree(d)) return; + a.Tc = !0; + d.Vc ? e.collapseTree(d) : e.expandTree(d) + } + } + }; + return a + }); + Dm("SubGraphExpanderButton", function () { + var a = Rl("Button", { + _subGraphExpandedFigure: "MinusLine", + _subGraphCollapsedFigure: "PlusLine" + }, Rl(X, { + name: "ButtonIcon", + Fb: "MinusLine", + xa: K.mp + }, (new bf("figure", "isSubGraphExpanded", function (a, c) { + var d = c.S; + return a ? d._subGraphExpandedFigure : d._subGraphCollapsedFigure + })).rw())); + a.click = function (a, c) { + var d = c.T; + d instanceof lf && (d = d.Kh); + if (d instanceof V) { + var e = d.g; + if (null !== e) { + e = e.Eb; + if (d.be) { + if (!e.canCollapseSubGraph(d)) return + } else if (!e.canExpandSubGraph(d)) return; + a.Tc = + !0; + d.be ? e.collapseSubGraph(d) : e.expandSubGraph(d) + } + } + }; + return a + }); + Dm("ContextMenuButton", function () { + var a = Rl("Button"); + a.stretch = fl; + var b = a.je("ButtonBorder"); + b instanceof X && (b.Fb = "Rectangle", b.A = new L(0, 0, 2, 3), b.B = new L(1, 1, -2, -2)); + return a + }); + Dm("PanelExpanderButton", function (a) { + var b = Em(a, "COLLAPSIBLE"); + a = Rl("Button", Rl(X, "TriangleUp", {xa: new ia(6, 4)}, (new bf("figure", "visible", function (a) { + return a ? "TriangleUp" : "TriangleDown" + })).rw(b))); + var c = a.je("ButtonBorder"); + c instanceof X && (c.stroke = null, c.fill = "transparent"); + a.click = function (a, c) { + var f = c.g; + if (null !== f) { + var h = c.T.je(b); + null !== h && (f.Wb("Collapse/Expand Panel"), h.visible = !h.visible, f.Wd("Collapse/Expand Panel")) + } + }; + return a + }); + + function hl() { + this.Zh = this.ti = this.pp = this.sp = this.rp = this.qp = this.ji = this.Qq = this.Pq = this.ki = this.li = this.mi = this.Sq = this.Rq = this.Yh = this.ci = this.Wh = null + } + + hl.prototype.copy = function () { + var a = new hl; + a.Wh = this.Wh; + a.ci = this.ci; + a.Yh = this.Yh; + a.Rq = this.Rq; + a.Sq = this.Sq; + a.mi = this.mi; + a.li = this.li; + a.ki = this.ki; + a.Pq = this.Pq; + a.Qq = this.Qq; + a.ji = this.ji; + a.qp = this.qp; + a.rp = this.rp; + a.sp = this.sp; + a.pp = this.pp; + a.ti = this.ti; + a.Zh = this.Zh; + return a + }; + + function A(a) { + S.call(this); + void 0 === a ? 0 === arguments.length ? this.oa = vh : u.k("invalid argument to Panel constructor: undefined") : (u.rb(a, A, A, "type"), this.oa = a); + this.ya = new E(S); + this.Pe = K.np; + this.Kg = !1; + this.oa === bj && (this.Kg = !0); + this.gq = !1; + this.Mp = uc; + this.bi = dl; + this.oa === Fl && Fm(this); + this.jo = sh; + this.aq = (new ia(10, 10)).freeze(); + this.bq = K.Wj; + this.yl = this.qh = null; + this.uq = NaN; + this.Zf = this.gi = null; + this.Hn = "category"; + this.Yf = null; + this.vi = new z(NaN, NaN, NaN, NaN); + this.hm = null; + this.xh = !1; + this.xr = null + } + + u.Ga(A, S); + u.Lh(A); + u.fa("Panel", A); + + function Fm(a) { + a.Xi = K.np; + a.th = 1; + a.ai = null; + a.Dl = null; + a.sh = 1; + a.rh = null; + a.Cl = null; + a.yd = []; + a.rd = []; + a.am = Gm; + a.Al = Gm; + a.ui = 0; + a.hi = 0 + } + + A.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.oa = this.oa; + a.Pe = this.Pe.Z(); + a.Kg = this.Kg; + a.gq = this.gq; + a.Mp = this.Mp.Z(); + a.bi = this.bi; + if (a.oa === Fl) { + a.Xi = this.Xi.Z(); + a.th = this.th; + a.ai = this.ai; + a.Dl = this.Dl; + a.sh = this.sh; + a.rh = this.rh; + a.Cl = this.Cl; + var b = []; + if (0 < this.yd.length) for (var c = this.yd, d = c.length, e = 0; e < d; e++) if (void 0 !== c[e]) { + var f = c[e].copy(); + f.ql(a); + b[e] = f + } + a.yd = b; + b = []; + if (0 < this.rd.length) for (c = this.rd, d = c.length, e = 0; e < d; e++) void 0 !== c[e] && (f = c[e].copy(), f.ql(a), + b[e] = f); + a.rd = b; + a.am = this.am; + a.Al = this.Al; + a.ui = this.ui; + a.hi = this.hi + } + a.jo = this.jo; + a.aq.assign(this.aq); + a.bq = this.bq.Z(); + a.qh = this.qh; + a.yl = this.yl; + a.uq = this.uq; + a.gi = this.gi; + a.Zf = this.Zf; + a.Hn = this.Hn; + a.vi.assign(this.vi); + a.xh = this.xh; + null !== this.xr && (a.xr = this.xr) + }; + A.prototype.Mh = function (a) { + S.prototype.Mh.call(this, a); + a.ya = this.ya; + for (var b = a.ya.n, c = b.length, d = 0; d < c; d++) b[d].Pg = a; + a.hm = null + }; + A.prototype.copy = function () { + var a = S.prototype.copy.call(this); + if (null !== a) { + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d].copy(), f = a; + e.ql(f); + e.Wl = null; + var h = f.ya, k = h.count; + h.Yd(k, e); + h = f.T; + if (null !== h) { + h.Bk = null; + null !== e.Jd && h instanceof U && (h.xh = !0); + var l = f.g; + null !== l && l.ha.gb || h.Dc(be, "elements", f, null, e, null, k) + } + } + return a + } + return null + }; + A.prototype.toString = function () { + return "Panel(" + this.type + ")#" + u.Uc(this) + }; + var vh; + A.Position = vh = u.s(A, "Position", 0); + A.Horizontal = u.s(A, "Horizontal", 1); + var Xi; + A.Vertical = Xi = u.s(A, "Vertical", 2); + var oh; + A.Spot = oh = u.s(A, "Spot", 3); + var Yi; + A.Auto = Yi = u.s(A, "Auto", 4); + var Fl; + A.Table = Fl = u.s(A, "Table", 5); + A.Viewbox = u.s(A, "Viewbox", 6); + var tl; + A.TableRow = tl = u.s(A, "TableRow", 7); + var ul; + A.TableColumn = ul = u.s(A, "TableColumn", 8); + var ah; + A.Link = ah = u.s(A, "Link", 9); + var bj; + A.Grid = bj = u.s(A, "Grid", 10); + u.defineProperty(A, {type: "type"}, function () { + return this.oa + }, function (a) { + var b = this.oa; + b !== a && (b !== tl && b !== ul || u.k("Cannot change Panel.type when it is already a TableRow or a TableColumn: " + a), this.oa = a, this.oa === bj ? this.Kg = !0 : this.oa === Fl && Fm(this), this.R(), this.h("type", b, a)) + }); + u.u(A, {elements: "elements"}, function () { + return this.ya.i + }); + u.u(A, {Ha: "naturalBounds"}, function () { + return this.Hc + }); + u.defineProperty(A, {padding: "padding"}, function () { + return this.Pe + }, function (a) { + "number" === typeof a ? (0 > a && u.wa(a, ">= 0", A, "padding"), a = new rb(a)) : (u.C(a, rb, A, "padding"), 0 > a.left && u.wa(a.left, ">= 0", A, "padding:value.left"), 0 > a.right && u.wa(a.right, ">= 0", A, "padding:value.right"), 0 > a.top && u.wa(a.top, ">= 0", A, "padding:value.top"), 0 > a.bottom && u.wa(a.bottom, ">= 0", A, "padding:value.bottom")); + var b = this.Pe; + b.L(a) || (this.Pe = a = a.Z(), this.R(), this.h("padding", b, a)) + }); + u.defineProperty(A, {Tk: "defaultAlignment"}, function () { + return this.Mp + }, function (a) { + var b = this.Mp; + b.L(a) || (this.Mp = a = a.Z(), this.R(), this.h("defaultAlignment", b, a)) + }); + u.defineProperty(A, {Bd: "defaultStretch"}, function () { + return this.bi + }, function (a) { + var b = this.bi; + b !== a && (u.rb(a, S, A, "defaultStretch"), this.bi = a, this.R(), this.h("defaultStretch", b, a)) + }); + u.defineProperty(A, {rJ: "defaultSeparatorPadding"}, function () { + return void 0 === this.Xi ? K.np : this.Xi + }, function (a) { + if (void 0 !== this.Xi) { + "number" === typeof a && (a = new rb(a)); + var b = this.Xi; + b.L(a) || (this.Xi = a = a.Z(), this.h("defaultSeparatorPadding", b, a)) + } + }); + u.defineProperty(A, {pJ: "defaultRowSeparatorStroke"}, function () { + return void 0 === this.ai ? null : this.ai + }, function (a) { + var b = this.ai; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.ai = a, this.h("defaultRowSeparatorStroke", b, a)) + }); + u.defineProperty(A, {qJ: "defaultRowSeparatorStrokeWidth"}, function () { + return void 0 === this.th ? 1 : this.th + }, function (a) { + if (void 0 !== this.th) { + var b = this.th; + b !== a && isFinite(a) && 0 <= a && (this.th = a, this.h("defaultRowSeparatorStrokeWidth", b, a)) + } + }); + u.defineProperty(A, {oJ: "defaultRowSeparatorDashArray"}, function () { + return void 0 === this.Dl ? null : this.Dl + }, function (a) { + if (void 0 !== this.Dl) { + var b = this.Dl; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", A, "defaultRowSeparatorDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("defaultRowSeparatorDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.Dl = a; + this.ma(); + this.h("defaultRowSeparatorDashArray", + b, a) + } + } + }); + u.defineProperty(A, {jJ: "defaultColumnSeparatorStroke"}, function () { + return void 0 === this.rh ? null : this.rh + }, function (a) { + if (void 0 !== this.rh) { + var b = this.rh; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.rh = a, this.h("defaultColumnSeparatorStroke", b, a)) + } + }); + u.defineProperty(A, {kJ: "defaultColumnSeparatorStrokeWidth"}, function () { + return void 0 === this.sh ? 1 : this.sh + }, function (a) { + if (void 0 !== this.sh) { + var b = this.sh; + b !== a && isFinite(a) && 0 <= a && (this.sh = a, this.h("defaultColumnSeparatorStrokeWidth", b, a)) + } + }); + u.defineProperty(A, {iJ: "defaultColumnSeparatorDashArray"}, function () { + return void 0 === this.Cl ? null : this.Cl + }, function (a) { + if (void 0 !== this.Cl) { + var b = this.Cl; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", A, "defaultColumnSeparatorDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("defaultColumnSeparatorDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.Cl = a; + this.ma(); + this.h("defaultColumnSeparatorDashArray", + b, a) + } + } + }); + u.defineProperty(A, {FK: "viewboxStretch"}, function () { + return this.jo + }, function (a) { + var b = this.jo; + b !== a && (u.rb(a, S, A, "viewboxStretch"), this.jo = a, this.h("viewboxStretch", b, a)) + }); + u.defineProperty(A, {aw: "gridCellSize"}, function () { + return this.aq + }, function (a) { + var b = this.aq; + b.L(a) || (u.C(a, ia, A, "gridCellSize"), a.J() && 0 !== a.width && 0 !== a.height || u.k("Invalid Panel.gridCellSize: " + a), this.aq = a.Z(), null !== this.g && this === this.g.Gs && vj(this.g), this.ma(), this.h("gridCellSize", b, a)) + }); + u.defineProperty(A, {CD: "gridOrigin"}, function () { + return this.bq + }, function (a) { + var b = this.bq; + b.L(a) || (u.C(a, w, A, "gridOrigin"), a.J() || u.k("Invalid Panel.gridOrigin: " + a), this.bq = a.Z(), null !== this.g && vj(this.g), this.ma(), this.h("gridOrigin", b, a)) + }); + g = A.prototype; + g.Qu = function (a) { + S.prototype.Qu.call(this, a); + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) b[d].Qu(a) + }; + g.Mj = function (a, b) { + if (this.oa === bj) { + var c = this.Hi() * b.scale; + 0 >= c && (c = 1); + var d = this.aw, e = d.width, d = d.height, f = this.Ha, h = f.width, f = f.height, k = Math.ceil(h / e), + l = Math.ceil(f / d), m = this.CD; + a.save(); + a.beginPath(); + a.rect(0, 0, h, f); + a.clip(); + for (var n = [], p = this.ya.n, q = p.length, r = 0; r < q; r++) { + var s = p[r], t = []; + n.push(t); + if (s.visible) for (var s = hk(s.Fb), v = r + 1; v < q; v++) { + var x = p[v]; + x.visible && hk(x.Fb) === s && (x = x.interval, 2 <= x && t.push(x)) + } + } + p = this.ya.n; + q = p.length; + for (r = 0; r < q; r++) { + var B = p[r]; + if (B.visible) { + var t = n[r], s = B.interval, + v = !1, y = !0, C = B.gA; + null !== C && (v = !0, void 0 !== a.setLineDash ? (a.setLineDash(C), a.lineDashOffset = B.cd) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = C, a.webkitLineDashOffset = B.cd) : void 0 !== a.mozDash ? (a.mozDash = C, a.mozDashOffset = B.cd) : y = !1); + if ("LineV" === B.Fb) { + a.lineWidth = B.hb; + yl(this, a, B.stroke, !1, !1); + a.beginPath(); + for (var I = x = Math.floor(-m.x / e); I <= x + k; I++) { + var H = I * e + m.x; + if (0 <= H && H < h && Hm(I, s, t) && (v && !y ? kl(a, H, 0, H, f, C, B.cd) : (a.moveTo(H, 0), a.lineTo(H, f)), 2 > e * s * c)) break + } + a.stroke() + } else if ("LineH" === B.Fb) { + a.lineWidth = + B.hb; + yl(this, a, B.stroke, !1, !1); + a.beginPath(); + for (I = x = Math.floor(-m.y / d); I <= x + l && !(H = I * d + m.y, 0 <= H && H <= f && Hm(I, s, t) && (v && !y ? kl(a, 0, H, h, H, C, B.cd) : (a.moveTo(0, H), a.lineTo(h, H)), 2 > d * s * c)); I++) ; + a.stroke() + } else if ("BarV" === B.Fb) for (yl(this, a, B.fill, !0, !1), B = B.width, isNaN(B) && (B = e), I = x = Math.floor(-m.x / e); I <= x + k && !(H = I * e + m.x, 0 <= H && H < h && Hm(I, s, t) && (a.fillRect(H, 0, B, f), 2 > e * s * c)); I++) ; else if ("BarH" === B.Fb) for (yl(this, a, B.fill, !0, !1), B = B.height, isNaN(B) && (B = d), I = x = Math.floor(-m.y / d); I <= x + l && !(H = I * d + m.y, 0 <= H && + H <= f && Hm(I, s, t) && (a.fillRect(0, H, h, B), 2 > d * s * c)); I++) ; + v && (void 0 !== a.setLineDash ? (a.setLineDash(u.mh), a.lineDashOffset = 0) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = u.mh, a.webkitLineDashOffset = 0) : void 0 !== a.mozDash && (a.mozDash = null, a.mozDashOffset = 0)) + } + } + a.restore(); + $i(b, a, !1) + } else { + this.oa === Fl && (a.lineCap = "butt", Im(this, a, !0, this.yd, !0), Im(this, a, !1, this.rd, !0), Jm(this, a, !0, this.yd), Jm(this, a, !1, this.rd), Im(this, a, !0, this.yd, !1), Im(this, a, !1, this.rd, !1)); + (c = this.LD) && a.save(); + e = this.If(); + d = this.ya.n; + h = d.length; + for (f = 0; f < h; f++) k = d[f], c && k === e && (a.Ft = !0), k.We(a, b), c && k === e && (a.Ft = !1); + c && (a.restore(), $i(b, a, !1)) + } + }; + + function Jm(a, b, c, d) { + for (var e = d.length, f = a.ba, h = c ? a.fd(0) : a.ed(0), k = 0; k < e; k++) { + var l = d[k]; + if (void 0 !== l && l !== h && 0 !== l.Qa) { + var m = l.ep; + isNaN(m) && (m = c ? a.th : a.sh); + var n = l.dp; + null === n && (n = c ? a.ai : a.rh); + if (0 !== m && null !== n) { + yl(a, b, n, !1, !1); + var n = !1, p = !0, q = l.gI; + null !== q && (n = !0, void 0 !== b.setLineDash ? (b.setLineDash(q), b.lineDashOffset = a.cd) : void 0 !== b.webkitLineDash ? (b.webkitLineDash = q, b.webkitLineDashOffset = a.cd) : void 0 !== b.mozDash ? (b.mozDash = q, b.mozDashOffset = a.cd) : p = !1); + b.beginPath(); + var r = l.position + m; + c ? r > f.height && (m -= r - f.height) : r > f.width && (m -= r - f.width); + l = l.position + m / 2; + b.lineWidth = m; + r = a.padding; + c ? (l += r.top, m = r.left, r = f.width - r.right, n && !p ? kl(b, m, l, r, l, q, 0) : (b.moveTo(m, l), b.lineTo(r, l))) : (l += r.left, m = r.top, r = f.height - r.bottom, n && !p ? kl(b, l, m, l, r, q, 0) : (b.moveTo(l, m), b.lineTo(l, r))); + b.stroke(); + n && (void 0 !== b.setLineDash ? (b.setLineDash(u.mh), b.lineDashOffset = 0) : void 0 !== b.webkitLineDash ? (b.webkitLineDash = u.mh, b.webkitLineDashOffset = 0) : void 0 !== b.mozDash && (b.mozDash = null, b.mozDashOffset = 0)) + } + } + } + } + + function Im(a, b, c, d, e) { + for (var f = d.length, h = a.ba, k = 0; k < f; k++) { + var l = d[k]; + if (void 0 !== l && null !== l.background && l.Zy !== e && 0 !== l.Qa) { + var m = c ? h.height : h.width; + if (!(l.position > m)) { + var n = l.lg(), p = l.ep; + isNaN(p) && (p = c ? a.th : a.sh); + var q = l.dp; + null === q && (q = c ? a.ai : a.rh); + null === q && (p = 0); + n -= p; + p = l.position + p; + n += l.Qa; + p + n > m && (n = m - p); + 0 >= n || (m = a.padding, yl(a, b, l.background, !0, !1), c ? b.fillRect(m.left, p + m.top, h.width - (m.left + m.right), n) : b.fillRect(p + m.left, m.top, n, h.height - (m.top + m.bottom))) + } + } + } + } + + function Hm(a, b, c) { + if (0 !== a % b) return !1; + b = c.length; + for (var d = 0; d < b; d++) if (0 === a % c[d]) return !1; + return !0 + } + + function hk(a) { + return "LineV" === a || "BarV" === a + } + + g.Co = function (a, b, c, d, e) { + var f = this.Tf(), h = this.transform, k = 1 / (h.m11 * h.m22 - h.m12 * h.m21), l = h.m22 * k, m = -h.m12 * k, + n = -h.m21 * k, p = h.m11 * k, q = k * (h.m21 * h.dy - h.m22 * h.dx), r = k * (h.m12 * h.dx - h.m11 * h.dy); + if (null !== this.nm) return h = this.ba, K.bl(h.left, h.top, h.right, h.bottom, a, b, c, d, e); + if (null !== this.background) f = a * l + b * n + q, k = a * m + b * p + r, a = c * l + d * n + q, c = c * m + d * p + r, e.m(0, 0), d = this.Ha, c = K.bl(0, 0, d.width, d.height, f, k, a, c, e), e.transform(h); else { + f || (l = 1, n = m = 0, p = 1, r = q = 0); + k = a * l + b * n + q; + a = a * m + b * p + r; + l = c * l + d * n + q; + d = c * m + d * p + r; + e.m(l, d); + m = (l - k) * (l - k) + (d - a) * (d - a); + c = !1; + p = this.ya.n; + r = p.length; + n = u.K(); + for (q = 0; q < r; q++) b = p[q], b.visible && b.Co(k, a, l, d, n) && (c = !0, b = (k - n.x) * (k - n.x) + (a - n.y) * (a - n.y), b < m && (m = b, e.set(n))); + u.v(n); + f && e.transform(h) + } + return c + }; + g.R = function (a) { + S.prototype.R.call(this, a); + this.oa === Yi && (a = this.If(), null !== a && a.R(!0)); + a = this.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + !0 !== Aj(d) && (d.xa.J() || (d instanceof ph || d instanceof A || d instanceof qa || pl(d, !1) !== qh) && d.R(!0)) + } + }; + g.Fo = function () { + if (!1 === Aj(this)) { + uj(this, !0); + rl(this, !0); + for (var a = this.ya.n, b = a.length, c = 0; c < b; c++) a[c].Fo() + } + }; + g.Jg = function () { + if (0 !== (this.ea & 2048) === !1) { + Cl(this, !0); + Dl(this, !0); + for (var a = this.ya.n, b = a.length, c = 0; c < b; c++) a[c].mz() + } + }; + g.mz = function () { + Dl(this, !0); + for (var a = this.ya.n, b = a.length, c = 0; c < b; c++) a[c].mz() + }; + g.Oo = function (a, b, c, d) { + var e = this.vi; + e.width = 0; + e.height = 0; + var f = this.xa, h = this.vg; + void 0 === c && (c = h.width, d = h.height); + c = Math.max(c, h.width); + d = Math.max(d, h.height); + var k = this.af; + isNaN(f.width) || (a = Math.min(f.width, k.width)); + isNaN(f.height) || (b = Math.min(f.height, k.height)); + a = Math.max(c, a); + b = Math.max(d, b); + var l = this.padding; + a = Math.max(a - l.left - l.right, 0); + b = Math.max(b - l.top - l.bottom, 0); + var m = this.ya.n; + if (0 !== m.length) { + var n = this.oa.Ub; + switch (n) { + case "Position": + var p = a, q = b, r = c, s = d, t = m.length; + e.x = 0; + e.y = + 0; + e.width = 0; + for (var v = e.height = 0; v < t; v++) { + var x = m[v]; + if (x.visible || x === this.ec) { + var B = x.margin, y = B.right + B.left, C = B.top + B.bottom; + Ph(x, p, q, r, s); + var I = x.Ba, H = Math.max(I.width + y, 0), T = Math.max(I.height + C, 0), + aa = x.position.x, R = x.position.y; + isFinite(aa) || (aa = 0); + isFinite(R) || (R = 0); + if (x instanceof X) { + var N = x; + if (N.rz) var Z = N.hb / 2, aa = aa - Z, R = R - Z + } + kb(e, aa, R, H, T) + } + } + break; + case "Vertical": + for (var Ea = a, ua = c, Oa = m.length, na = u.eb(), Ca = 0; Ca < Oa; Ca++) { + var ra = m[Ca]; + if (ra.visible || ra === this.ec) { + var dc = pl(ra, !1); + if (dc !== qh && + dc !== el) na.push(ra); else { + var ed = ra.margin, Lf = ed.right + ed.left, ec = ed.top + ed.bottom; + Ph(ra, Ea, Infinity, ua, 0); + var Ve = ra.Ba, Mf = Math.max(Ve.width + Lf, 0), Ta = Math.max(Ve.height + ec, 0); + e.width = Math.max(e.width, Mf); + e.height += Ta + } + } + } + var db = na.length; + if (0 !== db) { + this.xa.width ? Ea = Math.min(this.xa.width, this.af.width) : 0 !== e.width && (Ea = Math.min(e.width, this.af.width)); + for (Ca = 0; Ca < db; Ca++) if (ra = na[Ca], ra.visible || ra === this.ec) ed = ra.margin, Lf = ed.right + ed.left, ec = ed.top + ed.bottom, Ph(ra, Ea, Infinity, ua, 0), Ve = ra.Ba, Mf = Math.max(Ve.width + + Lf, 0), Ta = Math.max(Ve.height + ec, 0), e.width = Math.max(e.width, Mf), e.height += Ta; + u.ra(na) + } + break; + case "Horizontal": + for (var wa = b, za = d, lb = m.length, Eb = u.eb(), $a = 0; $a < lb; $a++) { + var jc = m[$a]; + if (jc.visible || jc === this.ec) { + var ge = pl(jc, !1); + if (ge !== qh && ge !== fl) Eb.push(jc); else { + var nc = jc.margin, Od = nc.right + nc.left, he = nc.top + nc.bottom; + Ph(jc, Infinity, wa, 0, za); + var We = jc.Ba, pf = Math.max(We.width + Od, 0), Pd = Math.max(We.height + he, 0); + e.width += pf; + e.height = Math.max(e.height, Pd) + } + } + } + var Fb = Eb.length; + if (0 !== Fb) { + this.xa.height ? wa = + Math.min(this.xa.height, this.af.height) : 0 !== e.height && (wa = Math.min(e.height, this.af.height)); + for ($a = 0; $a < Fb; $a++) if (jc = Eb[$a], jc.visible || jc === this.ec) nc = jc.margin, Od = nc.right + nc.left, he = nc.top + nc.bottom, Ph(jc, Infinity, wa, 0, za), We = jc.Ba, pf = Math.max(We.width + Od, 0), Pd = Math.max(We.height + he, 0), e.width += pf, e.height = Math.max(e.height, Pd); + u.ra(Eb) + } + break; + case "Spot": + a:{ + var Lb = a, Ec = b, Mg = c, Mb = d, yb = m.length, fc = this.If(), mb = fc.margin, ye = 0, + Qd = 0, og = mb.right + mb.left, Nf = mb.top + mb.bottom; + Ph(fc, Lb, Ec, Mg, Mb); + var zb = + fc.Ba, fd = zb.width, oc = zb.height, wb = Math.max(fd + og, 0), Fc = Math.max(oc + Nf, 0); + e.x = -mb.left; + e.y = -mb.top; + e.width = wb; + e.height = Fc; + for (var Nb = 0; Nb < yb; Nb++) { + var Na = m[Nb]; + if (Na !== fc && (Na.visible || Na === this.ec)) { + mb = Na.margin; + ye = mb.right + mb.left; + Qd = mb.top + mb.bottom; + Ph(Na, Lb, Ec, 0, 0); + var zb = Na.Ba, wb = Math.max(zb.width + ye, 0), Fc = Math.max(zb.height + Qd, 0), + eb = Na.alignment; + eb.Lc() && (eb = this.Tk); + eb.pd() || (eb = Ib); + var Ab = Na.Hj; + Ab.Lc() && (Ab = Ib); + kb(e, eb.x * fd + eb.offsetX - (Ab.x * zb.width - Ab.offsetX) - mb.left, eb.y * oc + eb.offsetY - (Ab.y * + zb.height - Ab.offsetY) - mb.top, wb, Fc) + } + } + var gc = fc.stretch; + gc === dl && (gc = pl(fc, !1)); + switch (gc) { + case qh: + break a; + case cd: + if (!isFinite(Lb) && !isFinite(Ec)) break a; + break; + case fl: + if (!isFinite(Lb)) break a; + break; + case el: + if (!isFinite(Ec)) break a + } + zb = fc.Ba; + fd = zb.width; + oc = zb.height; + wb = Math.max(fd + og, 0); + Fc = Math.max(oc + Nf, 0); + mb = fc.margin; + e.x = -mb.left; + e.y = -mb.top; + e.width = wb; + e.height = Fc; + for (Nb = 0; Nb < yb; Nb++) Na = m[Nb], Na === fc || !Na.visible && Na !== this.ec || (mb = Na.margin, ye = mb.right + mb.left, Qd = mb.top + mb.bottom, zb = Na.Ba, wb = Math.max(zb.width + + ye, 0), Fc = Math.max(zb.height + Qd, 0), eb = Na.alignment, eb.Lc() && (eb = this.Tk), eb.pd() || (eb = Ib), Ab = Na.Hj, Ab.Lc() && (Ab = Ib), kb(e, eb.x * fd + eb.offsetX - (Ab.x * zb.width - Ab.offsetX) - mb.left, eb.y * oc + eb.offsetY - (Ab.y * zb.height - Ab.offsetY) - mb.top, wb, Fc)) + } + break; + case "Auto": + var Rd = a, Sd = b, qf = c, ze = d, rf = m.length, Rb = this.If(), cb = Rb.margin, + pc = cb.right + cb.left, Pc = cb.top + cb.bottom; + Ph(Rb, Rd, Sd, qf, ze); + var gd = Rb.Ba, ab = Math.max(gd.width + pc, 0), ub = Math.max(gd.height + Pc, 0), kc = Km(Rb), + hd = kc.x * ab + kc.offsetX, Ng = kc.y * ub + kc.offsetY, kc = Lm(Rb), + Og = kc.x * ab + kc.offsetX, Pg = kc.y * ub + kc.offsetY, Of = Rd, Gc = Sd; + isFinite(Rd) && (Of = Math.abs(hd - Og)); + isFinite(Sd) && (Gc = Math.abs(Ng - Pg)); + var Qc = u.ul(); + Qc.m(0, 0); + for (var Hc = 0; Hc < rf; Hc++) { + var nb = m[Hc]; + if (nb !== Rb && (nb.visible || nb === this.ec)) { + var cb = nb.margin, ie = cb.right + cb.left, ob = cb.top + cb.bottom; + Ph(nb, Of, Gc, 0, 0); + gd = nb.Ba; + ab = Math.max(gd.width + ie, 0); + ub = Math.max(gd.height + ob, 0); + Qc.m(Math.max(ab, Qc.width), Math.max(ub, Qc.height)) + } + } + if (1 === rf) e.width = ab, e.height = ub, u.Oj(Qc); else { + var yc = Km(Rb), Ae = Lm(Rb), Bb = 0, Cb = 0; + Ae.x !== + yc.x && Ae.y !== yc.y && (Bb = Qc.width / Math.abs(Ae.x - yc.x), Cb = Qc.height / Math.abs(Ae.y - yc.y)); + u.Oj(Qc); + var id = 0; + if (Rb instanceof X) { + var Rc = Rb, id = Rc.hb * Rc.scale; + rh(Rc) === sh && (Bb = Cb = Math.max(Bb, Cb)) + } + var Bb = Bb + (Math.abs(yc.offsetX) + Math.abs(Ae.offsetX) + id), + Cb = Cb + (Math.abs(yc.offsetY) + Math.abs(Ae.offsetY) + id), Td = Rb.stretch; + Td === dl && (Td = pl(Rb, !1)); + switch (Td) { + case qh: + ze = qf = 0; + break; + case cd: + isFinite(Rd) && (Bb = Rd); + isFinite(Sd) && (Cb = Sd); + break; + case fl: + isFinite(Rd) && (Bb = Rd); + ze = 0; + break; + case el: + qf = 0, isFinite(Sd) && (Cb = Sd) + } + Rb instanceof + X && !Rb.xa.J() && (Rc = Rb, Rc.Rg ? Rc.jk = null : Rc.Pa = null); + Rb.Fo(); + Ph(Rb, Bb, Cb, qf, ze); + e.width = Rb.Ba.width + pc; + e.height = Rb.Ba.height + Pc + } + break; + case "Table": + for (var Ud = a, Xe = b, pm = c, zi = d, Fa = m.length, Be = u.eb(), Vd = u.eb(), ca = 0; ca < Fa; ca++) { + var ha = m[ca], pg = ha instanceof A ? ha : null; + if (null === pg || pg.type !== tl && pg.type !== ul || !ha.visible) Be.push(ha); else { + Vd.push(ha); + for (var Qg = pg.ya.n, yh = Qg.length, Sc = 0; Sc < yh; Sc++) { + var zh = Qg[Sc]; + pg.type === tl ? zh.rc = ha.rc : pg.type === ul && (zh.column = ha.column); + Be.push(zh) + } + } + } + Fa = Be.length; + 0 === Fa && + (this.fd(0), this.ed(0)); + for (var Sb = [], ca = 0; ca < Fa; ca++) ha = Be[ca], uj(ha, !0), rl(ha, !0), Sb[ha.rc] || (Sb[ha.rc] = []), Sb[ha.rc][ha.column] || (Sb[ha.rc][ha.column] = []), Sb[ha.rc][ha.column].push(ha); + u.ra(Be); + for (var Rg = u.eb(), Tc = u.eb(), je = u.eb(), Ic = {count: 0}, jd = {count: 0}, zc = Ud, kd = Xe, Pf = this.yd, Fa = Pf.length, ca = 0; ca < Fa; ca++) { + var ba = Pf[ca]; + void 0 !== ba && (ba.Qa = 0) + } + Pf = this.rd; + Fa = Pf.length; + for (ca = 0; ca < Fa; ca++) ba = Pf[ca], void 0 !== ba && (ba.Qa = 0); + for (var ke = Sb.length, Ce = 0, ca = 0; ca < ke; ca++) Sb[ca] && (Ce = Math.max(Ce, Sb[ca].length)); + for (var Tj = Math.min(this.ui, ke - 1), Uj = Math.min(this.hi, Ce - 1), Ac = 0, ke = Sb.length, ca = Tj; ca < ke; ca++) if (Sb[ca]) { + var Ce = Sb[ca].length, fb = this.fd(ca); + fb.Qa = 0; + for (Sc = Uj; Sc < Ce; Sc++) if (Sb[ca][Sc]) { + var gb = this.ed(Sc); + void 0 === Rg[Sc] && (gb.Qa = 0, Rg[Sc] = !0); + for (var Vj = Sb[ca][Sc], Qf = Vj.length, qg = 0; qg < Qf; qg++) if (ha = Vj[qg], ha.visible || ha === this.ec) { + var rg = 1 < ha.tj || 1 < ha.Wi; + rg && Tc.push(ha); + var Ob = ha.margin, Rf = Ob.right + Ob.left, Sf = Ob.top + Ob.bottom, + Wd = Gl(ha, fb, gb, !1), le = ha.xa, qm = !isNaN(le.height), + Ah = !isNaN(le.width) && qm; + rg || Wd === qh || Ah || (void 0 === Ic[Sc] && (Ic[Sc] = -1, Ic.count++), void 0 === jd[ca] && (jd[ca] = -1, jd.count++), je.push(ha)); + Ph(ha, Infinity, Infinity, 0, 0); + var De = ha.Ba, Ye = Math.max(De.width + Rf, 0), Cd = Math.max(De.height + Sf, 0); + 1 !== ha.tj || Wd !== qh && Wd !== fl || (ba = this.fd(ca), Ac = Math.max(Cd - ba.Qa, 0), Ac > kd && (Ac = kd), ba.Qa += Ac, kd = Math.max(kd - Ac, 0)); + 1 !== ha.Wi || Wd !== qh && Wd !== el || (ba = this.ed(Sc), Ac = Math.max(Ye - ba.Qa, 0), Ac > zc && (Ac = zc), ba.Qa += Ac, zc = Math.max(zc - Ac, 0)); + rg && ha.Fo() + } + } + } + u.ra(Rg); + for (var qc = 0, Xd = 0, Fa = this.ps, ca = 0; ca < Fa; ca++) void 0 !== + this.rd[ca] && (qc += this.ed(ca).yb); + Fa = this.kt; + for (ca = 0; ca < Fa; ca++) void 0 !== this.yd[ca] && (Xd += this.fd(ca).yb); + for (var zc = Math.max(Ud - qc, 0), Wj = kd = Math.max(Xe - Xd, 0), Xj = zc, Fa = je.length, ca = 0; ca < Fa; ca++) { + var ha = je[ca], fb = this.fd(ha.rc), gb = this.ed(ha.column), Ai = ha.Ba, Ob = ha.margin, + Rf = Ob.right + Ob.left, Sf = Ob.top + Ob.bottom; + Ic[ha.column] = 0 === gb.Qa ? Math.max(Ai.width + Rf, Ic[ha.column]) : null; + jd[ha.rc] = 0 === fb.Qa ? Math.max(Ai.height + Sf, jd[ha.rc]) : null + } + var Sg = 0, Bc = 0; + for (ca in jd) "count" !== ca && (Sg += jd[ca]); + for (ca in Ic) "count" !== + ca && (Bc += Ic[ca]); + for (var pb = u.ul(), ca = 0; ca < Fa; ca++) if (ha = je[ca], ha.visible || ha === this.ec) { + var fb = this.fd(ha.rc), gb = this.ed(ha.column), me = 0; + isFinite(gb.width) ? me = gb.width : (me = isFinite(zc) && null !== Ic[ha.column] ? 0 === Bc ? gb.Qa + zc : Ic[ha.column] / Bc * Xj : null !== Ic[ha.column] ? zc : gb.Qa || zc, me = Math.max(0, me - gb.lg())); + var Jc = 0; + isFinite(fb.height) ? Jc = fb.height : (Jc = isFinite(kd) && null !== jd[ha.rc] ? 0 === Sg ? fb.Qa + kd : jd[ha.rc] / Sg * Wj : null !== jd[ha.rc] ? kd : fb.Qa || kd, Jc = Math.max(0, Jc - fb.lg())); + pb.m(Math.max(gb.Ki, Math.min(me, + gb.Kf)), Math.max(fb.Ki, Math.min(Jc, fb.Kf))); + Wd = Gl(ha, fb, gb, !1); + switch (Wd) { + case fl: + pb.height = Infinity; + break; + case el: + pb.width = Infinity + } + Ob = ha.margin; + Rf = Ob.right + Ob.left; + Sf = Ob.top + Ob.bottom; + ha.Fo(); + Ph(ha, pb.width, pb.height, gb.Ki, fb.Ki); + De = ha.Ba; + Ye = Math.max(De.width + Rf, 0); + Cd = Math.max(De.height + Sf, 0); + isFinite(zc) && (Ye = Math.min(Ye, pb.width)); + isFinite(kd) && (Cd = Math.min(Cd, pb.height)); + var Tg = 0, Tg = fb.Qa; + fb.Qa = Math.max(fb.Qa, Cd); + Ac = fb.Qa - Tg; + kd = Math.max(kd - Ac, 0); + Tg = gb.Qa; + gb.Qa = Math.max(gb.Qa, Ye); + Ac = gb.Qa - Tg; + zc = Math.max(zc - Ac, 0) + } + u.ra(je); + for (var Ee = u.ul(), Fa = Tc.length, ca = 0; ca < Fa; ca++) if (ha = Tc[ca], ha.visible || ha === this.ec) { + fb = this.fd(ha.rc); + gb = this.ed(ha.column); + pb.m(Math.max(gb.Ki, Math.min(Ud, gb.Kf)), Math.max(fb.Ki, Math.min(Xe, fb.Kf))); + Wd = Gl(ha, fb, gb, !1); + switch (Wd) { + case cd: + 0 !== gb.Qa && (pb.width = Math.min(pb.width, gb.Qa)); + 0 !== fb.Qa && (pb.height = Math.min(pb.height, fb.Qa)); + break; + case fl: + 0 !== gb.Qa && (pb.width = Math.min(pb.width, gb.Qa)); + break; + case el: + 0 !== fb.Qa && (pb.height = Math.min(pb.height, fb.Qa)) + } + isFinite(gb.width) && + (pb.width = gb.width); + isFinite(fb.height) && (pb.height = fb.height); + Ee.m(0, 0); + for (var Pb = 1; Pb < ha.tj && !(ha.rc + Pb >= this.kt); Pb++) ba = this.fd(ha.rc + Pb), Ee.height += Math.max(ba.Ki, isNaN(ba.Qe) ? ba.Kf : Math.min(ba.Qe, ba.Kf)); + for (Pb = 1; Pb < ha.Wi && !(ha.column + Pb >= this.ps); Pb++) ba = this.ed(ha.column + Pb), Ee.width += Math.max(ba.Ki, isNaN(ba.Qe) ? ba.Kf : Math.min(ba.Qe, ba.Kf)); + pb.width += Ee.width; + pb.height += Ee.height; + Ob = ha.margin; + Rf = Ob.right + Ob.left; + Sf = Ob.top + Ob.bottom; + Ph(ha, pb.width, pb.height, pm, zi); + for (var De = ha.Ba, Ye = Math.max(De.width + + Rf, 0), Cd = Math.max(De.height + Sf, 0), Bh = 0, Pb = 0; Pb < ha.tj && !(ha.rc + Pb >= this.kt); Pb++) ba = this.fd(ha.rc + Pb), Bh += ba.total || 0; + if (Bh < Cd) for (var Dd = Cd - Bh; 0 < Dd;) { + var Ed = ba.yb || 0; + isNaN(ba.height) && ba.Kf > Ed && (ba.Qa = Math.min(ba.Kf, Ed + Dd), ba.yb !== Ed && (Dd -= ba.yb - Ed)); + if (-1 === ba.index - 1) break; + ba = this.fd(ba.index - 1) + } + for (var Tf = 0, Pb = 0; Pb < ha.Wi && !(ha.column + Pb >= this.ps); Pb++) ba = this.ed(ha.column + Pb), Tf += ba.total || 0; + if (Tf < Ye) for (Dd = Ye - Tf; 0 < Dd;) { + Ed = ba.yb || 0; + isNaN(ba.width) && ba.Kf > Ed && (ba.Qa = Math.min(ba.Kf, Ed + Dd), ba.yb !== + Ed && (Dd -= ba.yb - Ed)); + if (-1 === ba.index - 1) break; + ba = this.ed(ba.index - 1) + } + } + u.ra(Tc); + u.Oj(Ee); + u.Oj(pb); + for (var Uf = 0, Ze = 0, Wd = pl(this, !0), Fd = this.xa, Vf = this.af, ne = Xd = qc = 0, ld = 0, Fa = this.ps, ca = 0; ca < Fa; ca++) void 0 !== this.rd[ca] && (ba = this.ed(ca), isFinite(ba.width) ? (ne += ba.width, ne += ba.lg()) : Mm(ba) === Nm ? (ne += ba.yb, ne += ba.lg()) : 0 !== ba.yb && (qc += ba.yb, qc += ba.lg())); + var Uf = isFinite(Fd.width) ? Math.min(Fd.width, Vf.width) : Wd !== qh && isFinite(Ud) ? Ud : qc, + Uf = Math.max(Uf, this.vg.width), Uf = Math.max(Uf - ne, 0), Ch = Math.max(Uf / qc, + 1); + isFinite(Ch) || (Ch = 1); + for (ca = 0; ca < Fa; ca++) void 0 !== this.rd[ca] && (ba = this.ed(ca), isFinite(ba.width) || Mm(ba) === Nm || (ba.Qa = ba.yb * Ch), ba.position = e.width, 0 !== ba.yb && (e.width += ba.yb, e.width += ba.lg())); + Fa = this.kt; + for (ca = 0; ca < Fa; ca++) void 0 !== this.yd[ca] && (ba = this.fd(ca), isFinite(ba.height) ? (ld += ba.height, ld += ba.lg()) : Mm(ba) === Nm ? (ld += ba.yb, ld += ba.lg()) : 0 !== ba.yb && (Xd += ba.yb, Xd += ba.lg())); + var Ze = isFinite(Fd.height) ? Math.min(Fd.height, Vf.height) : Wd !== qh && isFinite(Xe) ? Xe : Xd, + Ze = Math.max(Ze, this.vg.height), + Ze = Math.max(Ze - ld, 0), Wf = Math.max(Ze / Xd, 1); + isFinite(Wf) || (Wf = 1); + for (ca = 0; ca < Fa; ca++) void 0 !== this.yd[ca] && (ba = this.fd(ca), isFinite(ba.height) || Mm(ba) === Nm || (ba.Qa = ba.yb * Wf), ba.position = e.height, 0 !== ba.yb && (e.height += ba.yb, e.height += ba.lg())); + Fa = Vd.length; + for (ca = 0; ca < Fa; ca++) { + var Tb = Vd[ca]; + Tb.type === tl ? (me = e.width, ba = this.fd(Tb.rc), Jc = ba.Qa) : (ba = this.ed(Tb.column), me = ba.Qa, Jc = e.height); + Tb.Pc.m(0, 0, me, Jc); + uj(Tb, !1); + Sb[Tb.rc] || (Sb[Tb.rc] = []); + Sb[Tb.rc][Tb.column] || (Sb[Tb.rc][Tb.column] = []); + Sb[Tb.rc][Tb.column].push(Tb) + } + u.ra(Vd); + this.xr = Sb; + break; + case "Viewbox": + var sg = a, tg = b, sf = c, Bi = d; + 1 < m.length && u.k("Viewbox Panel cannot contain more than one GraphObject."); + var Fe = m[0]; + Fe.$b = 1; + Fe.Fo(); + Ph(Fe, Infinity, Infinity, sf, Bi); + var Ci = Fe.Ba, Zj = Fe.margin, Jp = Zj.right + Zj.left, Kp = Zj.top + Zj.bottom; + if (isFinite(sg) || isFinite(tg)) { + var Rr = Fe.scale, ak = Ci.width, bk = Ci.height, Lp = Math.max(sg - Jp, 0), + Mp = Math.max(tg - Kp, 0), Di = 1; + this.jo === sh ? 0 !== ak && 0 !== bk && (Di = Math.min(Lp / ak, Mp / bk)) : 0 !== ak && 0 !== bk && (Di = Math.max(Lp / ak, Mp / bk)); + 0 === Di && (Di = 1E-4); + Fe.$b *= Di; + Rr !== Fe.scale && (uj(Fe, !0), Ph(Fe, Infinity, Infinity, sf, Bi)) + } + Ci = Fe.Ba; + e.width = isFinite(sg) ? sg : Math.max(Ci.width + Jp, 0); + e.height = isFinite(tg) ? tg : Math.max(Ci.height + Kp, 0); + break; + case "Link": + var Np = m.length, ug = this instanceof lf ? this.Kh : this; + if (ug instanceof W) if (0 === Np) { + var ck = this.Hc; + bb(ck, 0, 0); + var Yd = this.Ba; + Yd.m(0, 0, 0, 0) + } else { + var dk = this instanceof lf ? null : ug.path, $e = ug.Mm, Ge = this.vi; + Ge.assign($e); + Ge.x = 0; + var Dh = Ge.y = 0, Ei = ug.points, Dh = void 0 !== this.ka ? this.ka : Ei.count; + this.Mg.m($e.x, $e.y); + this.Vi.clear(); + null !== dk && (Om(dk, $e.width, $e.height), Yd = dk.Ba, Ge.Sh(Yd), this.Vi.add(Yd)); + for (var Eh = u.jh(), Fi = u.K(), Xf = u.K(), rm = 0; rm < Np; rm++) { + var Qb = m[rm]; + if (Qb !== dk) if (Qb.tg && Qb instanceof X) Om(Qb, $e.width, $e.height), Yd = Qb.Ba, Ge.Sh(Yd), this.Vi.add(Yd); else if (2 > Dh) Ph(Qb, Infinity, Infinity), Yd = Qb.Ba, Ge.Sh(Yd), this.Vi.add(Yd); else { + var Yf = Qb.Pf, Pp = Qb.Bw, sm = Qb.Hj; + sm.ne() && (sm = Ib); + var Gi = Qb.Cw, Sr = Qb.BE, Hi = 0, Ii = 0, ek = 0; + if (Yf < -Dh || Yf >= Dh) { + var Qp = ug.XD, Ji = ug.WD; + Gi !== dh && (ek = ug.computeAngle(Qb, Gi, Ji), Qb.angle = ek); + Hi = Qp.x - + $e.x; + Ii = Qp.y - $e.y + } else { + var tf, Fh; + if (0 <= Yf) tf = Ei.ja(Yf), Fh = Yf < Dh - 1 ? Ei.ja(Yf + 1) : tf; else { + var tm = Dh + Yf; + tf = Ei.ja(tm); + Fh = 0 < tm ? Ei.ja(tm - 1) : tf + } + Ji = 0 <= Yf ? tf.Fi(Fh) : Fh.Fi(tf); + Gi !== dh && (ek = ug.computeAngle(Qb, Gi, Ji), Qb.Ym = ek); + Hi = tf.x + (Fh.x - tf.x) * Pp - $e.x; + Ii = tf.y + (Fh.y - tf.y) * Pp - $e.y + } + Ph(Qb, Infinity, Infinity); + var Yd = Qb.Ba, ck = Qb.Ha, Ki = 0; + Qb instanceof X && (Ki = Qb.hb); + var fk = ck.width + Ki, um = ck.height + Ki; + Eh.reset(); + Eh.translate(-Yd.x, -Yd.y); + Eh.scale(Qb.scale, Qb.scale); + Eh.rotate(Gi === dh ? Qb.angle : Ji, fk / 2, um / 2); + var Gh = new z(0, + 0, fk, um); + Fi.pt(Gh, sm); + Eh.ab(Fi); + var Tr = -Fi.x + Ki / 2, Ur = -Fi.y + Ki / 2; + Xf.assign(Sr); + isNaN(Xf.x) && (Xf.x = 0 <= Yf ? fk / 2 + 3 : -(fk / 2 + 3)); + isNaN(Xf.y) && (Xf.y = -(um / 2 + 3)); + Xf.rotate(Ji); + Hi += Xf.x; + Ii += Xf.y; + Gh.set(Yd); + Gh.x = Hi + Tr; + Gh.y = Ii + Ur; + this.Vi.add(Gh); + Ge.Sh(Gh) + } + } + if (this.ue) for (var Rp = this.ug; Rp.next();) Ph(Rp.value, Infinity, Infinity); + this.vi = Ge; + var vm = this.Mg; + vm.m(vm.x + Ge.x, vm.y + Ge.y); + bb(e, Ge.width || 0, Ge.height || 0); + u.Ye(Eh); + u.v(Fi); + u.v(Xf) + } + break; + case "Grid": + break; + case "TableRow": + case "TableColumn": + u.k(this.toString() + + " is not an element of a Table Panel. TableRow and TableColumn Panels can only be elements of a Table Panel."); + break; + default: + u.k("Unknown panel type: " + n) + } + } + var He = e.width, Ie = e.height, gk = this.padding, Vr = gk.top + gk.bottom, He = He + (gk.left + gk.right), + Ie = Ie + Vr; + isFinite(f.width) && (He = f.width); + isFinite(f.height) && (Ie = f.height); + He = Math.min(k.width, He); + Ie = Math.min(k.height, Ie); + He = Math.max(h.width, He); + Ie = Math.max(h.height, Ie); + He = Math.max(c, He); + Ie = Math.max(d, Ie); + e.width = He; + e.height = Ie; + bb(this.Hc, He, Ie); + ml(this, + 0, 0, He, Ie) + }; + A.prototype.findMainElement = A.prototype.If = function () { + if (null === this.hm) { + var a = this.ya.n, b = a.length; + if (0 === b) return null; + for (var c = 0; c < b; c++) { + var d = a[c]; + if (!0 === d.tg) return this.hm = d + } + this.hm = a[0] + } + return this.hm + }; + A.prototype.xi = function (a, b, c, d) { + var e = this.vi, f = this.ya.n, h = u.Vj(0, 0, 0, 0); + if (0 === f.length) { + var k = this.ba; + k.x = a; + k.y = b; + k.width = c; + k.height = d + } else { + if (!this.xa.J()) { + var l = pl(this, !0), m = this.Pc, n = m.width, p = m.height, q = this.margin, r = q.left + q.right, + s = q.top + q.bottom; + n === c && p === d && (l = qh); + switch (l) { + case qh: + if (n > c || p > d) this.R(), Ph(this, n > c ? c : n, p > d ? d : p); + break; + case cd: + this.R(!0); + Ph(this, c + r, d + s, 0, 0); + break; + case fl: + this.R(!0); + Ph(this, c + r, p + s, 0, 0); + break; + case el: + this.R(!0), Ph(this, n + r, d + s, 0, 0) + } + } + k = this.ba; + k.x = a; + k.y = + b; + k.width = c; + k.height = d; + var t = this.oa.Ub; + switch (t) { + case "Position": + for (var v = f.length, x = e.x - this.padding.left, B = e.y - this.padding.top, y = 0; y < v; y++) { + var C = f[y], I = C.Ba, H = C.margin, T = C.position.x, aa = C.position.y; + h.x = isNaN(T) ? -x : T - x; + h.y = isNaN(aa) ? -B : aa - B; + if (C instanceof X) { + var R = C; + if (R.rz) { + var N = R.hb / 2; + h.x -= N; + h.y -= N + } + } + h.x += H.left; + h.y += H.top; + h.width = I.width; + h.height = I.height; + C.visible && C.zc(h.x, h.y, h.width, h.height) + } + break; + case "Vertical": + for (var Z = f.length, Ea = this.padding.left, ua = this.padding.top, Oa = 0; Oa < Z; Oa++) { + var na = + Ea, Ca = f[Oa]; + if (Ca.visible) { + var ra = Ca.Ba, dc = Ca.margin, ed = dc.left + dc.right, Lf = Ea + this.padding.right, + ec = ra.width, Ve = pl(Ca, !1); + if (isNaN(Ca.xa.width) && Ve === cd || Ve === fl) ec = Math.max(e.width - ed - Lf, 0); + var Mf = ec + ed + Lf, Ta = Ca.alignment; + Ta.Lc() && (Ta = this.Tk); + Ta.pd() || (Ta = Ib); + Ca.zc(na + Ta.offsetX + dc.left + (e.width * Ta.x - Mf * Ta.x), ua + Ta.offsetY + dc.top, ec, ra.height); + ua += ra.height + dc.bottom + dc.top + } + } + break; + case "Horizontal": + for (var db = f.length, wa = this.padding.top, za = this.padding.left, lb = 0; lb < db; lb++) { + var Eb = wa, $a = f[lb]; + if ($a.visible) { + var jc = $a.Ba, ge = $a.margin, nc = ge.top + ge.bottom, Od = wa + this.padding.bottom, + he = jc.height, We = pl($a, !1); + if (isNaN($a.xa.height) && We === cd || We === el) he = Math.max(e.height - nc - Od, 0); + var pf = he + nc + Od, Pd = $a.alignment; + Pd.Lc() && (Pd = this.Tk); + Pd.pd() || (Pd = Ib); + $a.zc(za + Pd.offsetX + ge.left, Eb + Pd.offsetY + ge.top + (e.height * Pd.y - pf * Pd.y), jc.width, he); + za += jc.width + ge.left + ge.right + } + } + break; + case "Spot": + var Fb = f.length, Lb = this.If(), Ec = Lb.Ba, Mg = Ec.width, Mb = Ec.height, yb = this.padding, + fc = yb.left, mb = yb.top; + h.x = fc - e.x; + h.y = mb - e.y; + Lb.zc(h.x, h.y, Mg, Mb); + for (var ye = 0; ye < Fb; ye++) { + var Qd = f[ye]; + if (Qd !== Lb) { + var og = Qd.Ba, Nf = og.width, zb = og.height, fd = Qd.alignment; + fd.Lc() && (fd = this.Tk); + fd.pd() || (fd = Ib); + var oc = Qd.Hj; + oc.Lc() && (oc = Ib); + h.x = fd.x * Mg + fd.offsetX - (oc.x * Nf - oc.offsetX); + h.y = fd.y * Mb + fd.offsetY - (oc.y * zb - oc.offsetY); + h.x -= e.x; + h.y -= e.y; + Qd.visible && Qd.zc(fc + h.x, mb + h.y, Nf, zb) + } + } + break; + case "Auto": + var wb = f.length, Fc = this.If(), Nb = Fc.Ba, Na = u.Sf(); + Na.m(0, 0, 1, 1); + var eb = Fc.margin, Ab = eb.left, gc = eb.top, Rd = this.padding, Sd = Rd.left, qf = Rd.top; + h.x = Ab; + h.y = gc; + h.width = Nb.width; + h.height = Nb.height; + Fc.zc(Sd + h.x, qf + h.y, h.width, h.height); + var ze = Km(Fc), rf = Lm(Fc), Rb = 0 + ze.y * Nb.height + ze.offsetY, + cb = 0 + rf.x * Nb.width + rf.offsetX, pc = 0 + rf.y * Nb.height + rf.offsetY; + Na.x = 0 + ze.x * Nb.width + ze.offsetX; + Na.y = Rb; + kb(Na, cb, pc, 0, 0); + Na.x += Ab + Sd; + Na.y += gc + qf; + for (var Pc = 0; Pc < wb; Pc++) { + var gd = f[Pc]; + if (gd !== Fc) { + var ab = gd.Ba, eb = gd.margin, ub = Math.max(ab.width + eb.right + eb.left, 0), + kc = Math.max(ab.height + eb.top + eb.bottom, 0), hd = gd.alignment; + hd.Lc() && (hd = this.Tk); + hd.pd() || (hd = Ib); + h.x = + Na.width * hd.x + hd.offsetX - ub * hd.x + eb.left + Na.x; + h.y = Na.height * hd.y + hd.offsetY - kc * hd.y + eb.top + Na.y; + h.width = Na.width; + h.height = Na.height; + gd.visible && (qb(Na.x, Na.y, Na.width, Na.height, h.x, h.y, ab.width, ab.height) ? gd.zc(h.x, h.y, ab.width, ab.height) : gd.zc(h.x, h.y, ab.width, ab.height, new z(Na.x, Na.y, Na.width, Na.height))) + } + } + u.ic(Na); + break; + case "Table": + for (var Ng = f.length, Og = this.padding, Pg = Og.left, Of = Og.top, Gc = this.xr, Qc = 0, Hc = 0, nb = Gc.length, ie = 0, ob = 0; ob < nb; ob++) Gc[ob] && (ie = Math.max(ie, Gc[ob].length)); + for (var yc = + Math.min(this.ui, nb - 1); yc !== nb && (void 0 === this.yd[yc] || 0 === this.yd[yc].yb);) yc++; + for (var yc = Math.min(yc, nb - 1), Ae = -this.yd[yc].Ma, Bb = Math.min(this.hi, ie - 1); Bb !== ie && (void 0 === this.rd[Bb] || 0 === this.rd[Bb].yb);) Bb++; + for (var Bb = Math.min(Bb, ie - 1), Cb = -this.rd[Bb].Ma, id = u.ul(), ob = 0; ob < nb; ob++) if (Gc[ob]) for (var ie = Gc[ob].length, Rc = this.fd(ob), Hc = Rc.Ma + Ae + Of + Rc.$C(), Td = 0; Td < ie; Td++) if (Gc[ob][Td]) for (var Ud = this.ed(Td), Qc = Ud.Ma + Cb + Pg + Ud.$C(), Xe = Gc[ob][Td], pm = Xe.length, zi = 0; zi < pm; zi++) { + var Fa = Xe[zi], Be = Fa.Ba, + Vd = Fa instanceof A ? Fa : null; + if (null === Vd || Vd.type !== tl && Vd.type !== ul) { + id.m(0, 0); + for (var ca = 1; ca < Fa.rowSpan && !(ob + ca >= this.kt); ca++) { + var ha = this.fd(ob + ca); + id.height += ha.total + } + for (ca = 1; ca < Fa.$F && !(Td + ca >= this.ps); ca++) { + var pg = this.ed(Td + ca); + id.width += pg.total + } + var Qg = Ud.yb + id.width, yh = Rc.yb + id.height; + h.x = Qc; + h.y = Hc; + h.width = Qg; + h.height = yh; + var Sc = Qc, zh = Hc, Sb = Qg, Rg = yh; + Qc + Qg > e.width && (Sb = Math.max(e.width - Qc, 0)); + Hc + yh > e.height && (Rg = Math.max(e.height - Hc, 0)); + var Tc = Fa.alignment, je = 0, Ic = 0, jd = 0, zc = 0; + if (Tc.Lc()) { + Tc = + this.Tk; + Tc.pd() || (Tc = Ib); + var je = Tc.x, Ic = Tc.y, jd = Tc.offsetX, zc = Tc.offsetY, kd = Ud.alignment, + Pf = Rc.alignment; + kd.pd() && (je = kd.x, jd = kd.offsetX); + Pf.pd() && (Ic = Pf.y, zc = Pf.offsetY) + } else je = Tc.x, Ic = Tc.y, jd = Tc.offsetX, zc = Tc.offsetY; + if (isNaN(je) || isNaN(Ic)) Ic = je = .5, zc = jd = 0; + var ba = Be.width, ke = Be.height, Ce = Fa.margin, Tj = Ce.left + Ce.right, + Uj = Ce.top + Ce.bottom, Ac = Gl(Fa, Rc, Ud, !1); + !isNaN(Fa.xa.width) || Ac !== cd && Ac !== fl || (ba = Math.max(Qg - Tj, 0)); + !isNaN(Fa.xa.height) || Ac !== cd && Ac !== el || (ke = Math.max(yh - Uj, 0)); + var fb = Fa.af, gb = + Fa.vg, ba = Math.min(fb.width, ba), ke = Math.min(fb.height, ke), + ba = Math.max(gb.width, ba), ke = Math.max(gb.height, ke), Vj = ke + Uj; + h.x += h.width * je - (ba + Tj) * je + jd + Ce.left; + h.y += h.height * Ic - Vj * Ic + zc + Ce.top; + Fa.visible && (qb(Sc, zh, Sb, Rg, h.x, h.y, Be.width, Be.height) ? Fa.zc(h.x, h.y, ba, ke) : Fa.zc(h.x, h.y, ba, ke, new z(Sc, zh, Sb, Rg))) + } else { + Fa.Jg(); + Fa.Xb.La(); + var Qf = Fa.Xb; + Qf.x = Vd.type === tl ? Pg : Qc; + Qf.y = Vd.type === ul ? Of : Hc; + Qf.width = Be.width; + Qf.height = Be.height; + Fa.Xb.freeze(); + rl(Fa, !1) + } + } + u.Oj(id); + for (ob = 0; ob < Ng; ob++) Fa = f[ob], Vd = Fa instanceof + A ? Fa : null, null === Vd || Vd.type !== tl && Vd.type !== ul || (Qf = Fa.Xb, Fa.Hc.La(), Fa.Hc.m(0, 0, Qf.width, Qf.height), Fa.Hc.freeze()); + break; + case "Viewbox": + var qg = f[0], rg = qg.Ba, Ob = qg.margin, Rf = Ob.top + Ob.bottom, + Sf = Math.max(rg.width + (Ob.right + Ob.left), 0), Wd = Math.max(rg.height + Rf, 0), + le = qg.alignment; + le.Lc() && (le = this.Tk); + le.pd() || (le = Ib); + h.x = e.width * le.x - Sf * le.x + le.offsetX; + h.y = e.height * le.y - Wd * le.y + le.offsetY; + h.width = rg.width; + h.height = rg.height; + qg.zc(h.x, h.y, h.width, h.height); + break; + case "Link": + var qm = f.length, Ah = this instanceof + lf ? this.Kh : this; + if (Ah instanceof W) { + var De = this instanceof lf ? null : Ah.path, Ye = this.Vi.n, Cd = 0; + if (null !== De && Cd < this.Vi.count) { + var qc = Ye[Cd]; + Cd++; + De.zc(qc.x - this.vi.x, qc.y - this.vi.y, qc.width, qc.height) + } + for (var Xd = 0; Xd < qm; Xd++) { + var Wj = f[Xd]; + Wj !== De && Cd < this.Vi.count && (qc = Ye[Cd], Cd++, Wj.zc(qc.x - this.vi.x, qc.y - this.vi.y, qc.width, qc.height)) + } + var Xj = Ah.points, Ai = Xj.count; + if (2 <= Ai && this.ue) for (var Sg = this.ug; Sg.next();) { + var Bc = Sg.value, pb = Ai, me = Xj, Jc = Bc.Pf, Tg = Bc.Bw, Ee = Bc.Hj; + Ee.ne() && (Ee = Ib); + var Pb = Bc.Cw, + Bh = Bc.BE, Dd = 0, Ed = 0, Tf = 0; + if (Jc < -pb || Jc >= pb) { + var Uf = this.XD, Ze = this.WD; + Pb !== dh && (Tf = this.computeAngle(Bc, Pb, Ze), Bc.angle = Tf); + Dd = Uf.x; + Ed = Uf.y + } else { + var Fd = void 0, Vf = void 0; + if (0 <= Jc) Fd = me.n[Jc], Vf = Jc < pb - 1 ? me.n[Jc + 1] : Fd; else var ne = pb + Jc, + Fd = me.n[ne], Vf = 0 < ne ? me.n[ne - 1] : Fd; + Ze = 0 <= Jc ? Fd.Fi(Vf) : Vf.Fi(Fd); + Pb !== dh && (Tf = this.computeAngle(Bc, Pb, Ze), Bc.angle = Tf); + Dd = Fd.x + (Vf.x - Fd.x) * Tg; + Ed = Fd.y + (Vf.y - Fd.y) * Tg + } + var ld = u.jh(); + ld.reset(); + ld.scale(Bc.scale, Bc.scale); + ld.rotate(Bc.angle, 0, 0); + var Ch = Bc.Ha, Wf = u.Vj(0, 0, Ch.width, + Ch.height), Tb = u.K(); + Tb.pt(Wf, Ee); + ld.ab(Tb); + var sg = -Tb.x, tg = -Tb.y, sf = Bh.copy(); + isNaN(sf.x) && (sf.x = 0 <= Jc ? Tb.x + 3 : -(Tb.x + 3)); + isNaN(sf.y) && (sf.y = -(Tb.y + 3)); + sf.rotate(Ze); + Dd += sf.x; + Ed += sf.y; + ld.WE(Wf); + var sg = sg + Wf.x, tg = tg + Wf.y, Bi = u.fc(Dd + sg, Ed + tg); + Bc.move(Bi); + u.v(Bi); + u.v(Tb); + u.ic(Wf); + u.Ye(ld) + } + this instanceof lf ? this.Xs() : Ah.Xs() + } + break; + case "Grid": + break; + case "TableRow": + case "TableColumn": + u.k(this.toString() + " is not an element of a Table Panel.TableRow and TableColumn panels can only be elements of a Table Panel."); + break; + default: + u.k("Unknown panel type: " + t) + } + u.ic(h) + } + }; + A.prototype.Jj = function (a) { + var b = this.Ha; + if (qb(0, 0, b.width, b.height, a.x, a.y)) { + for (var b = this.ya.n, c = b.length, d = u.fc(0, 0); c--;) { + var e = b[c]; + if (e.visible || e === this.ec) if (Wa(d.set(a), e.transform), e.Aa(d)) return u.v(d), !0 + } + u.v(d); + return null === this.Ib && null === this.lc ? !1 : !0 + } + return !1 + }; + A.prototype.Vv = function (a) { + if (this.$m === a) return this; + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d].Vv(a); + if (null !== e) return e + } + return null + }; + + function Pm(a, b, c) { + c(a, b); + if (b instanceof A) { + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) Pm(a, b[e], c) + } + } + + function Kj(a, b) { + Qm(a, a, b) + } + + function Qm(a, b, c) { + c(b); + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) { + var f = b[e]; + f instanceof A && Qm(a, f, c) + } + } + + A.prototype.walkVisualTree = function (a) { + Rm(this, this, a) + }; + + function Rm(a, b, c) { + c(b); + if (b instanceof A) { + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) Rm(a, b[e], c) + } + } + + A.prototype.findInVisualTree = A.prototype.vs = function (a) { + return Sm(this, this, a) + }; + + function Sm(a, b, c) { + if (c(b)) return b; + if (b instanceof A) { + b = b.ya.n; + for (var d = b.length, e = 0; e < d; e++) { + var f = Sm(a, b[e], c); + if (null !== f) return f + } + } + return null + } + + A.prototype.findObject = A.prototype.je = function (a) { + if (this.name === a) return this; + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d]; + if (e.name === a) return e; + if (e instanceof A) if (null === e.gi && null === e.Zf) { + if (e = e.je(a), null !== e) return e + } else if (sk(e) && (e = e.ya.first(), null !== e && (e = e.je(a), null !== e))) return e + } + return null + }; + + function Tm(a) { + a = a.ya.n; + for (var b = a.length, c = 0, d = 0; d < b; d++) { + var e = a[d]; + if (e instanceof A) c = Math.max(c, Tm(e)); else if (e instanceof X) { + a:{ + if (!e.Rg) switch (e.tn) { + case "None": + case "Square": + case "Ellipse": + case "Circle": + case "LineH": + case "LineV": + case "FramedRectangle": + case "RoundedRectangle": + case "Line1": + case "Line2": + case "Border": + case "Cube1": + case "Cube2": + case "Junction": + case "Cylinder1": + case "Cylinder2": + case "Cylinder3": + case "Cylinder4": + case "PlusLine": + case "XLine": + case "ThinCross": + case "ThickCross": + e = + 0; + break a + } + e = e.Sg / 2 * e.gm * e.Hi() + } + c = Math.max(c, e) + } + } + return c + } + + g = A.prototype; + g.Tf = function () { + return !(this.type === tl || this.type === ul) + }; + g.ke = function (a, b, c) { + if (!1 === this.Ag) return null; + void 0 === b && (b = null); + void 0 === c && (c = null); + if (Bj(this)) return null; + var d = this.Ha, e = 1 / this.Hi(), f = this.Tf(), h = f ? a : Wa(u.fc(a.x, a.y), this.transform), k = this.g, + l = 10, m = 5; + null !== k && (l = k.gz("extraTouchArea"), m = l / 2); + if (qb(-(m * e), -(m * e), d.width + l * e, d.height + l * e, h.x, h.y)) { + if (!this.Kg) { + var e = this.ya.n, n = e.length, k = u.K(), m = (l = this.LD) ? this.If() : null; + if (l && (m.Tf() ? Wa(k.set(a), m.transform) : k.set(a), !m.Aa(k))) return u.v(k), f || u.v(h), null; + for (; n--;) { + var p = e[n]; + if (p.visible || + p === this.ec) if (p.Tf() ? Wa(k.set(a), p.transform) : k.set(a), !l || p !== m) { + var q = null; + p instanceof A ? q = p.ke(k, b, c) : !0 === p.Ag && p.Aa(k) && (q = p); + if (null !== q && (null !== b && (q = b(q)), null !== q && (null === c || c(q)))) return u.v(k), f || u.v(h), q + } + } + u.v(k) + } + if (null === this.background && null === this.nm) return f || u.v(h), null; + a = qb(0, 0, d.width, d.height, h.x, h.y) ? this : null; + f || u.v(h); + return a + } + f || u.v(h); + return null + }; + g.ys = function (a, b, c, d) { + if (!1 === this.Ag) return !1; + void 0 === b && (b = null); + void 0 === c && (c = null); + d instanceof E || d instanceof F || (d = new E(S)); + var e = this.Ha, f = this.Tf(), h = f ? a : Wa(u.fc(a.x, a.y), this.transform); + if (qb(0, 0, e.width, e.height, h.x, h.y)) { + if (!this.Kg) { + for (var e = this.ya.n, k = e.length, l = u.K(); k--;) { + var m = e[k]; + if (m.visible || m === this.ec) { + m.Tf() ? Wa(l.set(a), m.transform) : l.set(a); + var n = m, m = m instanceof A ? m : null; + (null !== m ? m.ys(l, b, c, d) : n.Aa(l)) && !1 !== n.Ag && (null !== b && (n = b(n)), null === n || null !== c && !c(n) || d.add(n)) + } + } + u.v(l) + } + f || + u.v(h); + return null !== this.background || null !== this.nm + } + f || u.v(h); + return !1 + }; + g.Nj = function (a, b, c, d, e, f) { + if (!1 === this.Ag) return !1; + void 0 === b && (b = null); + void 0 === c && (c = null); + var h = f; + void 0 === f && (h = u.jh(), h.reset()); + h.multiply(this.transform); + if (this.sm(a, h)) return Um(this, b, c, e), void 0 === f && u.Ye(h), !0; + if (this.sg(a, h)) { + if (!this.Kg) for (var k = this.ya.n, l = k.length; l--;) { + var m = k[l]; + if (m.visible || m === this.ec) { + var n = m.ba, p = this.Ha; + if (!(n.x > p.width || n.y > p.height || 0 > n.x + n.width || 0 > n.y + n.height)) { + n = m; + m = m instanceof A ? m : null; + p = u.jh(); + p.set(h); + if (null !== m ? m.Nj(a, b, c, d, e, p) : ol(n, a, d, p)) null !== + b && (n = b(n)), null === n || null !== c && !c(n) || e.add(n); + u.Ye(p) + } + } + } + void 0 === f && u.Ye(h); + return d + } + void 0 === f && u.Ye(h); + return !1 + }; + + function Um(a, b, c, d) { + for (var e = a.ya.n, f = e.length; f--;) { + var h = e[f]; + if (h.visible) { + var k = h.ba, l = a.Ha; + k.x > l.width || k.y > l.height || 0 > k.x + k.width || 0 > k.y + k.height || (h instanceof A && Um(h, b, c, d), null !== b && (h = b(h)), null === h || null !== c && !c(h) || d.add(h)) + } + } + } + + g.ym = function (a, b, c, d, e, f) { + if (!1 === this.Ag) return !1; + void 0 === c && (c = null); + void 0 === d && (d = null); + var h = this.Ha, k = this.Tf(), l = k ? a : Wa(u.fc(a.x, a.y), this.transform), + m = k ? b : Wa(u.fc(b.x, b.y), this.transform), n = l.Lj(m), + p = 0 < l.x && l.x < h.width && 0 < l.y && l.y < h.height || Xa(l.x, l.y, 0, 0, 0, h.height) < n || Xa(l.x, l.y, 0, h.height, h.width, h.height) < n || Xa(l.x, l.y, h.width, h.height, h.width, 0) < n || Xa(l.x, l.y, h.width, 0, 0, 0) < n, + h = 0 < l.x && l.x < h.width && 0 < l.y && l.y < h.height && Xa(l.x, l.y, 0, 0, 0, h.height) < n && Xa(l.x, l.y, 0, h.height, h.width, h.height) < + n && Xa(l.x, l.y, h.width, h.height, h.width, 0) < n && Xa(l.x, l.y, h.width, 0, 0, 0) < n; + k || (u.v(l), u.v(m)); + if (p) { + if (!this.Kg) { + k = u.K(); + l = u.K(); + m = this.ya.n; + for (n = m.length; n--;) { + var q = m[n]; + if (q.visible || q === this.ec) { + var r = q.ba, s = this.Ha; + r.x > s.width || r.y > s.height || 0 > r.x + r.width || 0 > r.y + r.height || (q.Tf() ? (r = q.transform, Wa(k.set(a), r), Wa(l.set(b), r)) : (k.set(a), l.set(b)), r = q, q = q instanceof A ? q : null, null !== q ? !q.ym(k, l, c, d, e, f) : !r.sD(k, l, e)) || (null !== c && (r = c(r)), null === r || null !== d && !d(r) || f.add(r)) + } + } + u.v(k); + u.v(l) + } + return e ? + p : h + } + return !1 + }; + + function Km(a) { + var b = a.A; + if (void 0 === b || b === uc) b = null; + null === b && a instanceof X && (a = a.Pa, null !== a && (b = a.A)); + null === b && (b = xb); + return b + } + + function Lm(a) { + var b = a.B; + if (void 0 === b || b === uc) b = null; + null === b && a instanceof X && (a = a.Pa, null !== a && (b = a.B)); + null === b && (b = Vb); + return b + } + + A.prototype.add = A.prototype.add = function (a) { + u.C(a, S, A, "add:element"); + this.Yd(this.ya.count, a) + }; + A.prototype.elt = A.prototype.ja = function (a) { + return this.ya.ja(a) + }; + A.prototype.insertAt = A.prototype.Yd = function (a, b) { + b instanceof G && u.k("Cannot add a Part to a Panel: " + b); + if (this === b || this.gl(b)) this === b && u.k("Cannot make a Panel contain itself: " + this.toString()), u.k("Cannot make a Panel indirectly contain itself: " + this.toString() + " already contains " + b.toString()); + var c = b.S; + null !== c && c !== this && u.k("Cannot add a GraphObject that already belongs to another Panel to this Panel: " + b.toString() + ", already contained by " + c.toString() + ", cannot be shared by this Panel: " + + this.toString()); + this.oa !== bj || b instanceof X || u.k("Can only add Shapes to a Grid Panel, not: " + b); + b.ql(this); + b.Wl = null; + if (null !== this.QD) { + var d = b.data; + null !== d && "object" === typeof d && (null === this.Yf && (this.Yf = new la(Object, A)), this.Yf.add(d, b)) + } + var e = this.ya, d = -1; + if (c === this) { + for (var f = -1, h = this.ya.n, k = h.length, l = 0; l < k; l++) if (h[l] === b) { + f = l; + break + } + if (-1 !== f) { + if (f === a || f + 1 >= e.count && a >= e.count) return; + e.hd(f); + d = f + } else u.k("element " + b.toString() + " has panel " + c.toString() + " but is not contained by it.") + } + if (0 > + a || a > e.count) a = e.count; + e.Yd(a, b); + this.R(); + b.R(); + null !== b.Jd ? this.xh = !0 : b instanceof A && !0 === b.xh && (this.xh = !0); + c = this.T; + null !== c && (c.Bk = null, c.kj = NaN, this.xh && c instanceof U && (c.xh = !0), c.xh && (c.Qd = null), e = this.g, null !== e && e.ha.gb || (-1 !== d && c.Dc(ce, "elements", this, b, null, d, null), c.Dc(be, "elements", this, null, b, null, a))) + }; + A.prototype.remove = A.prototype.remove = function (a) { + u.C(a, S, A, "remove:element"); + for (var b = this.ya.n, c = b.length, d = -1, e = 0; e < c; e++) if (b[e] === a) { + d = e; + break + } + -1 !== d && this.Fe(d) + }; + A.prototype.removeAt = A.prototype.hd = function (a) { + 0 <= a && this.Fe(a) + }; + A.prototype.Fe = function (a) { + var b = this.ya, c = b.ja(a); + c.Wl = null; + c.ql(null); + if (null !== this.Yf) { + var d = c.data; + "object" === typeof d && this.Yf.remove(d) + } + b.hd(a); + uj(this, !1); + this.R(); + this.hm === c && (this.hm = null); + b = this.T; + null !== b && (b.Bk = null, b.kj = NaN, d = this.g, null !== d && d.ha.gb || b.Dc(ce, "elements", this, c, null, a, null)) + }; + u.u(A, {kt: "rowCount"}, function () { + return void 0 === this.yd ? 0 : this.yd.length + }); + A.prototype.getRowDefinition = A.prototype.fd = function (a) { + 0 > a && u.wa(a, ">= 0", A, "getRowDefinition:idx"); + a = Math.round(a); + var b = this.yd; + if (void 0 === b[a]) { + var c = new Se; + c.ql(this); + c.ae = !0; + c.index = a; + b[a] = c + } + return b[a] + }; + A.prototype.removeRowDefinition = A.prototype.oE = function (a) { + 0 > a && u.wa(a, ">= 0", A, "removeRowDefinition:idx"); + a = Math.round(a); + var b = this.yd; + this.Dc(ce, "coldefs", this, b[a], null, a, null); + b[a] && delete b[a]; + this.R() + }; + u.u(A, {ps: "columnCount"}, function () { + return void 0 === this.rd ? 0 : this.rd.length + }); + A.prototype.getColumnDefinition = A.prototype.ed = function (a) { + 0 > a && u.wa(a, ">= 0", A, "getColumnDefinition:idx"); + a = Math.round(a); + var b = this.rd; + if (void 0 === b[a]) { + var c = new Se; + c.ql(this); + c.ae = !1; + c.index = a; + b[a] = c + } + return b[a] + }; + A.prototype.removeColumnDefinition = A.prototype.kE = function (a) { + 0 > a && u.wa(a, ">= 0", A, "removeColumnDefinition:idx"); + a = Math.round(a); + var b = this.rd; + this.Dc(ce, "coldefs", this, b[a], null, a, null); + b[a] && delete b[a]; + this.R() + }; + u.defineProperty(A, {bI: "rowSizing"}, function () { + return void 0 === this.am ? Gm : this.am + }, function (a) { + if (void 0 !== this.am) { + var b = this.am; + b !== a && (a !== Gm && a !== Nm && u.k("rowSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"), this.am = a, this.R(), this.h("rowSizing", b, a)) + } + }); + u.defineProperty(A, {ZF: "columnSizing"}, function () { + return void 0 === this.Al ? Gm : this.Al + }, function (a) { + if (void 0 !== this.Al) { + var b = this.Al; + b !== a && (a !== Gm && a !== Nm && u.k("columnSizing must be RowColumnDefinition.ProportionalExtra or RowColumnDefinition.None"), this.Al = a, this.R(), this.h("columnSizing", b, a)) + } + }); + u.defineProperty(A, {CK: "topIndex"}, function () { + return void 0 === this.ui ? 0 : this.ui + }, function (a) { + if (void 0 !== this.ui) { + var b = this.ui; + b !== a && ((!isFinite(a) || 0 > a) && u.k("topIndex must be greater than zero and a real number. Was " + a), this.ui = a, this.R(), this.h("topIndex", b, a)) + } + }); + u.defineProperty(A, {OJ: "leftIndex"}, function () { + return void 0 === this.hi ? 0 : this.hi + }, function (a) { + if (void 0 !== this.hi) { + var b = this.hi; + b !== a && ((!isFinite(a) || 0 > a) && u.k("leftIndex must be greater than zero and a real number. Was " + a), this.hi = a, this.R(), this.h("leftIndex", b, a)) + } + }); + A.prototype.findRowForLocalY = function (a) { + if (0 > a) return -1; + if (this.type !== Fl) return NaN; + for (var b = 0, c = this.yd, d = c.length, e = this.ui; e < d; e++) { + var f = c[e]; + if (void 0 !== f && (b += f.total, a < b)) return e + } + return -1 + }; + A.prototype.findColumnForLocalX = function (a) { + if (0 > a) return -1; + if (this.type !== Fl) return NaN; + for (var b = 0, c = this.rd, d = c.length, e = this.hi; e < d; e++) { + var f = c[e]; + if (void 0 !== f && (b += f.total, a < b)) return e + } + return -1 + }; + u.defineProperty(A, {data: "data"}, function () { + return this.qh + }, function (a) { + var b = this.qh; + if (b !== a) { + var c = this instanceof G && !(this instanceof lf); + c && u.j(a, "object", A, "data"); + nf(this); + this.qh = a; + var d = this.g; + null !== d && (c ? this instanceof W ? (null !== b && d.lk.remove(b), null !== a && d.lk.add(a, this)) : (null !== b && d.$h.remove(b), null !== a && d.$h.add(a, this)) : (c = this.S, null !== c && null !== c.Yf && (null !== b && c.Yf.remove(b), null !== a && c.Yf.add(a, this)))); + this.h("data", b, a); + null !== d && d.ha.gb || null !== a && this.Nb() + } + }); + u.defineProperty(A, {iH: "itemIndex"}, function () { + return this.uq + }, function (a) { + var b = this.uq; + b !== a && (this.uq = a, this.h("itemIndex", b, a)) + }); + + function Pl(a) { + a = a.yl; + return null !== a && a.Ca + } + + function nf(a) { + var b = a.yl; + if (null === b) null !== a.data && u.k("Template cannot have .data be non-null: " + a), a.yl = b = new E(bf); else if (b.Ca) return; + var c = new E(S); + Pm(a, a, function (a, d) { + var e = d.Gc; + if (null !== e) for (Jl(d, !1), e = e.i; e.next();) { + var f = e.value; + f.mode === df && Jl(d, !0); + if (null !== f.Nm) { + var h = ef(f, a, d); + null !== h && (c.add(h), null === h.$n && (h.$n = new E(bf)), h.$n.add(f)) + } + b.add(f) + } + if (d instanceof A && d.type === Fl) { + if (0 < d.yd.length) for (e = d.yd, f = e.length, h = 0; h < f; h++) { + var k = e[h]; + if (void 0 !== k && null !== k.Gc) for (var l = + k.Gc.i; l.next();) { + var v = l.value; + v.fg = k; + v.Ay = 2; + v.mv = k.index; + b.add(v) + } + } + if (0 < d.rd.length) for (e = d.rd, f = e.length, h = 0; h < f; h++) if (k = e[h], void 0 !== k && null !== k.Gc) for (l = k.Gc.i; l.next();) v = l.value, v.fg = k, v.Ay = 1, v.mv = k.index, b.add(v) + } + }); + for (var d = c.i; d.next();) { + var e = d.value; + if (null !== e.$n) { + Jl(e, !0); + for (var f = e.$n.i; f.next();) { + var h = f.value; + null === e.Gc && (e.Gc = new E(bf)); + e.Gc.add(h) + } + } + e.$n = null + } + for (d = b.i; d.next();) if (e = d.value, f = e.fg, null !== f) { + e.fg = null; + var k = e.Lw, l = k.indexOf("."); + 0 < l && f instanceof A && (h = k.substring(0, + l), k = k.substr(l + 1), l = f.je(h), null !== l ? (f = l, e.Lw = k) : u.trace('Warning: unable to find GraphObject named "' + h + '" for Binding: ' + e.toString())); + f instanceof Se ? (e.tl = u.Uc(f.S), f.S.$m = e.tl) : (e.tl = u.Uc(f), f.$m = e.tl) + } + b.freeze(); + a instanceof G && a.Fd() && (Ph(a, Infinity, Infinity), a.zc()) + } + + A.prototype.updateTargetBindings = A.prototype.Nb = function (a) { + var b = this.yl; + if (null !== b) for (void 0 === a && (a = ""), b = b.i; b.next();) { + var c = b.value, d = c.LE; + if ("" === a || "" === d || d === a) if (d = c.Lw, null !== c.eG || "" !== d) { + var d = this.data, e = c.Nm; + if (null !== e) d = "" === e ? this : "." === e ? this : ".." === e ? this : this.je(e); else { + var f = this.g; + null !== f && c.xt && (d = f.ga.Zs) + } + if (null !== d) { + var f = this, h = c.tl; + if (-1 !== h) { + if (f = this.Vv(h), null === f) continue + } else null !== c.fg && (f = c.fg); + "." === e ? d = f : ".." === e && (d = f.S); + e = c.Ay; + if (0 !== e) { + if (!(f instanceof + A)) continue; + h = f; + 1 === e ? f = h.ed(c.mv) : 2 === e && (f = h.fd(c.mv)) + } + void 0 !== f && c.ZE(f, d) + } + } + } + }; + u.defineProperty(A, {QD: "itemArray"}, function () { + return this.gi + }, function (a) { + var b = this.gi; + if (b !== a) { + var c = this.g; + null !== c && null !== b && Qj(c, this); + this.gi = a; + null !== c && null !== a && Mj(c, this); + this.h("itemArray", b, a); + null !== c && c.ha.gb || this.Rz() + } + }); + + function sk(a) { + return a.type === oh || a.type === Yi || a.type === ah || a.type === Fl && 0 < a.ya.length && (a = a.ya.ja(0), a.tg && a instanceof A && (a.type === tl || a.type === ul)) ? !0 : !1 + } + + A.prototype.rebuildItemElements = A.prototype.Rz = function () { + var a = 0; + for (sk(this) && (a = 1); this.ya.length > a;) this.Fe(a); + a = this.QD; + if (null !== a) for (var b = u.qb(a), c = 0; c < b; c++) rk(this, u.fb(a, c), c) + }; + + function rk(a, b, c) { + if (!(void 0 === b || null === b || 0 > c)) { + var d = a.getCategoryForItemData(b, c), d = a.findTemplateForItemData(b, c, d); + if (null !== d) { + nf(d); + d = d.copy(); + "object" === typeof b && (null === a.Yf && (a.Yf = new la(Object, A)), a.Yf.add(b, d)); + var e = c; + sk(a) && e++; + a.Yd(e, d); + tk(a, e, c); + d.data = b + } + } + } + + function tk(a, b, c) { + for (a = a.ya; b < a.length;) { + var d = a.ja(b); + if (d instanceof A) { + var e = b, f = c; + d.type === tl ? d.rc = e : d.type === ul && (d.column = e); + d.iH = f + } + b++; + c++ + } + } + + function vi(a) { + a = a.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + if (d instanceof Vm || d instanceof A && vi(d)) return !0 + } + return !1 + } + + u.defineProperty(A, {LJ: "itemTemplate"}, function () { + return null === this.Zf ? null : this.Zf.ta("") + }, function (a) { + if (null === this.Zf) { + if (null === a) return; + this.Zf = new la("string", A) + } + var b = this.Zf.ta(""); + b !== a && (u.C(a, A, A, "itemTemplate"), (a instanceof G || a.tg) && u.k("itemTemplate must not be a Part or be Panel.isPanelMain: " + a), this.Zf.add("", a), this.h("itemTemplate", b, a), a = this.g, null !== a && a.ha.gb || this.Rz()) + }); + u.defineProperty(A, {jH: "itemTemplateMap"}, function () { + return this.Zf + }, function (a) { + var b = this.Zf; + if (b !== a) { + u.C(a, la, A, "itemTemplateMap"); + for (var c = a.i; c.next();) { + var d = c.value; + (d instanceof G || d.tg) && u.k("Template in itemTemplateMap must not be a Part or be Panel.isPanelMain: " + d) + } + this.Zf = a; + this.h("itemTemplateMap", b, a); + a = this.g; + null !== a && a.ha.gb || this.Rz() + } + }); + u.defineProperty(A, {KJ: "itemCategoryProperty"}, function () { + return this.Hn + }, function (a) { + var b = this.Hn; + b !== a && ("string" !== typeof a && "function" !== typeof a && u.Kd(a, "string or function", A, "itemCategoryProperty"), this.Hn = a, this.h("itemCategoryProperty", b, a)) + }); + A.prototype.getCategoryForItemData = function (a) { + if (null === a) return ""; + var b = this.Hn, c = ""; + if ("function" === typeof b) c = b(a); else if ("string" === typeof b && "object" === typeof a) { + if ("" === b) return ""; + c = u.sb(a, b) + } else return ""; + if (void 0 === c) return ""; + if ("string" === typeof c) return c; + u.k("Panel.getCategoryForItemData found a non-string category for " + a + ": " + c); + return "" + }; + var Wm = !1, Xm = null; + A.prototype.findTemplateForItemData = function (a, b, c) { + a = this.jH; + b = null; + null !== a && (b = a.ta(c)); + null === b && (Wm || (Wm = !0, u.trace('No item template Panel found for category "' + c + '" on ' + this), u.trace(" Using default item template."), c = new A, a = new qa, a.bind(new bf("text", "", de)), c.add(a), Xm = c), b = Xm); + return b + }; + u.defineProperty(A, {DJ: "isAtomic"}, function () { + return this.Kg + }, function (a) { + var b = this.Kg; + b !== a && (u.j(a, "boolean", A, "isAtomic"), this.Kg = a, this.h("isAtomic", b, a)) + }); + u.defineProperty(A, {LD: "isClipping"}, function () { + return this.gq + }, function (a) { + var b = this.gq; + b !== a && (u.j(a, "boolean", A, "isClipping"), this.gq = a, this.h("isClipping", b, a)) + }); + + function Se() { + u.gc(this); + this.Pg = null; + this.xu = !0; + this.ud = 0; + this.Qe = NaN; + this.oj = 0; + this.mj = Infinity; + this.se = uc; + this.Ma = this.yb = 0; + this.Gc = null; + this.Jr = Ym; + this.Hh = dl; + this.Gr = this.wj = null; + this.Hr = NaN; + this.Ib = this.Dh = null; + this.Ip = !1 + } + + u.fa("RowColumnDefinition", Se); + Se.prototype.copy = function () { + var a = new Se; + a.xu = this.xu; + a.ud = this.ud; + a.Qe = this.Qe; + a.oj = this.oj; + a.mj = this.mj; + a.se = this.se; + a.yb = this.yb; + a.Ma = this.Ma; + a.Hh = this.Hh; + a.Jr = this.Jr; + a.wj = null === this.wj ? null : this.wj.Z(); + a.Gr = this.Gr; + a.Hr = this.Hr; + a.Dh = null; + null !== this.Dh && (a.Dh = u.Pk(this.Dh)); + a.Ib = this.Ib; + a.Ip = this.Ip; + a.Gc = this.Gc; + return a + }; + Se.prototype.qs = function (a) { + u.C(a, Se, Se, "copyFrom:pd"); + a.ae ? this.height = a.height : this.width = a.width; + this.Ki = a.Ki; + this.Kf = a.Kf; + this.alignment = a.alignment; + this.stretch = a.stretch; + this.st = a.st; + this.wj = null === a.wj ? null : a.wj.Z(); + this.dp = a.dp; + this.ep = a.ep; + this.Dh = null; + a.Dh && (this.Dh = u.Pk(a.Dh)); + this.background = a.background; + this.Zy = a.Zy; + this.Gc = a.Gc + }; + Se.prototype.toString = function () { + return "RowColumnDefinition " + (this.ae ? "(Row " : "(Column ") + this.index + ") #" + u.Uc(this) + }; + var Ym; + Se.Default = Ym = u.s(Se, "Default", 0); + var Nm; + Se.None = Nm = u.s(Se, "None", 1); + var Gm; + Se.ProportionalExtra = Gm = u.s(Se, "ProportionalExtra", 2); + Se.prototype.ql = function (a) { + this.Pg = a + }; + Se.prototype.computeEffectiveSpacingTop = Se.prototype.$C = function () { + var a = 0; + if (0 !== this.index) { + var b = this.Pg, c = this.dp; + null === c && null !== b && (c = this.ae ? b.ai : b.rh); + null !== c && (a = this.ep, isNaN(a) && (a = null !== b ? this.ae ? b.th : b.sh : 0)) + } + b = this.DE; + if (null === b) if (b = this.Pg, null !== b) b = b.Xi; else return a; + return a + (this.ae ? b.top : b.left) + }; + Se.prototype.computeEffectiveSpacing = Se.prototype.lg = function () { + var a = 0; + if (0 !== this.index) { + var b = this.Pg, c = this.dp; + null === c && null !== b && (c = this.ae ? b.ai : b.rh); + null !== c && (a = this.ep, isNaN(a) && (a = null !== b ? this.ae ? b.th : b.sh : 0)) + } + b = this.DE; + if (null === b) if (b = this.Pg, null !== b) b = b.Xi; else return a; + return a + (this.ae ? b.top + b.bottom : b.left + b.right) + }; + Se.prototype.Rc = function (a, b, c, d, e) { + var f = this.Pg; + if (null !== f && (f.Dc($d, a, this, b, c, d, e), null !== this.Gc && (b = f.zo(), null !== b && (b = b.data, null !== b)))) for (c = this.Gc.i; c.next();) c.value.Mw(this, b, a, null) + }; + u.u(Se, {S: "panel"}, function () { + return this.Pg + }); + u.defineProperty(Se, {ae: "isRow"}, function () { + return this.xu + }, function (a) { + this.xu = a + }); + u.defineProperty(Se, {index: "index"}, function () { + return this.ud + }, function (a) { + this.ud = a + }); + u.defineProperty(Se, {height: "height"}, function () { + return this.Qe + }, function (a) { + var b = this.Qe; + b !== a && (0 > a && u.wa(a, ">= 0", Se, "height"), this.Qe = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("height", b, a)) + }); + u.defineProperty(Se, {width: "width"}, function () { + return this.Qe + }, function (a) { + var b = this.Qe; + b !== a && (0 > a && u.wa(a, ">= 0", Se, "width"), this.Qe = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("width", b, a)) + }); + u.defineProperty(Se, {Ki: "minimum"}, function () { + return this.oj + }, function (a) { + var b = this.oj; + b !== a && ((0 > a || !isFinite(a)) && u.wa(a, ">= 0", Se, "minimum"), this.oj = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("minimum", b, a)) + }); + u.defineProperty(Se, {Kf: "maximum"}, function () { + return this.mj + }, function (a) { + var b = this.mj; + b !== a && (0 > a && u.wa(a, ">= 0", Se, "maximum"), this.mj = a, this.Qa = this.yb, null !== this.S && this.S.R(), this.Rc("maximum", b, a)) + }); + u.defineProperty(Se, {alignment: "alignment"}, function () { + return this.se + }, function (a) { + var b = this.se; + b.L(a) || (this.se = a.Z(), null !== this.S && this.S.R(), this.Rc("alignment", b, a)) + }); + u.defineProperty(Se, {stretch: "stretch"}, function () { + return this.Hh + }, function (a) { + var b = this.Hh; + b !== a && (this.Hh = a, null !== this.S && this.S.R(), this.Rc("stretch", b, a)) + }); + u.defineProperty(Se, {DE: "separatorPadding"}, function () { + return this.wj + }, function (a) { + "number" === typeof a && (a = new rb(a)); + var b = this.wj; + null !== a && null !== b && b.L(a) || (null !== a && (a = a.Z()), this.wj = a, null !== this.S && this.S.R(), this.Rc("separatorPadding", b, a)) + }); + u.defineProperty(Se, {dp: "separatorStroke"}, function () { + return this.Gr + }, function (a) { + var b = this.Gr; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.Gr = a, null !== this.S && this.S.R(), this.Rc("separatorStroke", b, a)) + }); + u.defineProperty(Se, {ep: "separatorStrokeWidth"}, function () { + return this.Hr + }, function (a) { + var b = this.Hr; + b !== a && (this.Hr = a, null !== this.S && this.S.R(), this.Rc("separatorStrokeWidth", b, a)) + }); + u.defineProperty(Se, {gI: "separatorDashArray"}, function () { + return this.Dh + }, function (a) { + var b = this.Dh; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", Se, "separatorDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("separatorDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.Dh = a; + null !== this.S && this.S.ma(); + this.Rc("separatorDashArray", b, a) + } + }); + u.defineProperty(Se, {background: "background"}, function () { + return this.Ib + }, function (a) { + var b = this.Ib; + b !== a && (null === a || "string" === typeof a || a instanceof ga) && (a instanceof ga && a.freeze(), this.Ib = a, null !== this.S && this.S.ma(), this.Rc("background", b, a)) + }); + u.defineProperty(Se, {Zy: "coversSeparators"}, function () { + return this.Ip + }, function (a) { + var b = this.Ip; + b !== a && (u.j(a, "boolean", Se, "coversSeparators"), this.Ip = a, null !== this.S && this.S.ma(), this.Rc("coversSeparators", b, a)) + }); + u.defineProperty(Se, {st: "sizing"}, function () { + return this.Jr + }, function (a) { + var b = this.Jr; + b !== a && (this.Jr = a, null !== this.S && this.S.R(), this.Rc("sizing", b, a)) + }); + + function Mm(a) { + if (a.st === Ym) { + var b = a.Pg; + return a.ae ? b.bI : b.ZF + } + return a.st + } + + u.defineProperty(Se, {Qa: "actual"}, function () { + return this.yb + }, function (a) { + this.yb = isNaN(this.Qe) ? Math.max(Math.min(this.mj, a), this.oj) : Math.max(Math.min(this.mj, this.Qe), this.oj) + }); + u.defineProperty(Se, {total: "total"}, function () { + return this.yb + this.lg() + }, function (a) { + this.yb = isNaN(this.Qe) ? Math.max(Math.min(this.mj, a), this.oj) : Math.max(Math.min(this.mj, this.Qe), this.oj); + this.yb = Math.max(0, this.yb - this.lg()) + }); + u.defineProperty(Se, {position: "position"}, function () { + return this.Ma + }, function (a) { + this.Ma = a + }); + Se.prototype.bind = Se.prototype.bind = function (a) { + a.fg = this; + var b = this.S; + null !== b && (b = b.zo(), null !== b && Pl(b) && u.k("Cannot add a Binding to a RowColumnDefinition that is already frozen: " + a)); + null === this.Gc && (this.Gc = new E(bf)); + this.Gc.add(a) + }; + + function X() { + S.call(this); + this.Pa = null; + this.tn = "None"; + this.Rg = !1; + this.Zp = dl; + this.jk = null; + this.yc = this.jd = "black"; + this.Sg = 1; + this.co = "butt"; + this.eo = "miter"; + this.gm = 10; + this.fm = null; + this.cd = 0; + this.si = this.ri = uc; + this.dr = this.cr = NaN; + this.hq = !1; + this.nq = !0; + this.gr = null; + this.wn = this.fo = "None"; + this.eq = 1 + } + + u.Ga(X, S); + u.fa("Shape", X); + X.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.Pa = this.Pa; + a.tn = this.tn; + a.Rg = this.Rg; + a.Zp = this.Zp; + a.jk = this.jk; + a.jd = this.jd; + a.yc = this.yc; + a.Sg = this.Sg; + a.co = this.co; + a.eo = this.eo; + a.gm = this.gm; + a.fm = null; + null !== this.fm && (a.fm = u.Pk(this.fm)); + a.cd = this.cd; + a.ri = this.ri.Z(); + a.si = this.si.Z(); + a.cr = this.cr; + a.dr = this.dr; + a.hq = this.hq; + a.nq = this.nq; + a.gr = this.gr; + a.fo = this.fo; + a.wn = this.wn; + a.eq = this.eq + }; + X.prototype.toString = function () { + return "Shape(" + ("None" !== this.Fb ? this.Fb : "None" !== this.jp ? this.jp : this.ez) + ")#" + u.Uc(this) + }; + + function Zm(a, b, c, d) { + var e = .001, f = d.Ba, h = f.width, f = f.height, k = 0, l = 0, m = 0, n = 0, e = c.length; + if (!(4 > e)) { + for (var k = c[0], l = c[1], p = 0, q = 0, r = 0, s = m = 0, t = q = 0, v = u.eb(), x = 2; x < e; x += 2) m = c[x], n = c[x + 1], p = m - k, q = n - l, 0 === p && (p = .001), r = q / p, s = Math.atan2(q, p), q = Math.sqrt(p * p + q * q), k = [], k[0] = p, k[1] = s, k[2] = r, k[3] = q, v.push(k), t += q, k = m, l = n; + k = c[0]; + l = c[1]; + c = 0; + for (var e = h, n = h / 2, x = 0 === n ? !1 : !0, q = 0, m = v[q], p = m[0], s = m[1], r = m[2], m = m[3], B = 0; .1 <= t;) { + 0 === B && (x ? (e = h, c++, e -= n, t -= n, x = !1) : (e = h, c++), 0 === e && (e = 1)); + if (e > t) { + u.ra(v); + return + } + e > m ? (B = + e - m, e = m) : B = 0; + var y = Math.sqrt(e * e / (1 + r * r)); + 0 > p && (y = -y); + k += y; + l += r * y; + a.translate(k, l); + a.rotate(s); + a.translate(-(h / 2), -(f / 2)); + 0 === B && d.Mj(a, b); + a.translate(h / 2, f / 2); + a.rotate(-s); + a.translate(-k, -l); + t -= e; + m -= e; + if (0 !== B) { + q++; + if (q === v.length) { + u.ra(v); + return + } + m = v[q]; + p = m[0]; + s = m[1]; + r = m[2]; + m = m[3]; + e = B + } + } + u.ra(v) + } + } + + X.prototype.Mj = function (a, b) { + if (null !== this.yc || null !== this.jd) { + null !== this.jd && yl(this, a, this.jd, !0, !1); + null !== this.yc && yl(this, a, this.yc, !1, !1); + var c = this.Sg; + if (0 === c) { + var d = this.T; + d instanceof lf && d.type === ah && d.vc instanceof X && (c = d.vc.hb) + } + a.lineWidth = c; + a.lineJoin = this.eo; + a.lineCap = this.co; + a.miterLimit = this.gm; + var e = !1; + this.T && b.Qg.drawShadows && (e = this.T.il); + var f = !0; + null !== this.yc && null === this.jd && (f = !1); + var d = !1, h = !0, k = this.gA; + null !== k && (d = !0, void 0 !== a.setLineDash ? (a.setLineDash(k), a.lineDashOffset = + this.cd) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = k, a.webkitLineDashOffset = this.cd) : void 0 !== a.mozDash ? (a.mozDash = k, a.mozDashOffset = this.cd) : h = !1); + var l = this.Pa; + if (null !== l) { + if (l.oa === dd) a.beginPath(), d && !h ? kl(a, l.nc, l.uc, l.pb, l.Bb, k, this.cd) : (a.moveTo(l.nc, l.uc), a.lineTo(l.pb, l.Bb)), null !== this.jd && zl(a, this.jd), 0 !== c && null !== this.yc && Bl(a); else if (l.oa === md) { + var m = l.nc, n = l.uc, p = l.pb, q = l.Bb, l = Math.min(m, p), r = Math.min(n, q), + m = Math.abs(p - m), n = Math.abs(q - n); + null !== this.jd && (a.beginPath(), a.rect(l, + r, m, n), zl(a, this.jd)); + if (null !== this.yc) { + var s = p = 0, t = 0; + f && e && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0); + d && !h ? (h = u.eb(), h.push(l), h.push(r), h.push(l + m), h.push(r), h.push(l + m), h.push(r + n), h.push(l), h.push(r + n), h.push(l), h.push(r), a.beginPath(), $m(a, h, k, this.cd), Bl(a), u.ra(h)) : 0 !== c && (a.beginPath(), a.rect(l, r, m, n), Bl(a)); + f && e && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t) + } + } else if (l.oa === nd) m = l.nc, n = l.uc, p = l.pb, q = l.Bb, l = Math.abs(p - m) / + 2, r = Math.abs(q - n) / 2, m = Math.min(m, p) + l, n = Math.min(n, q) + r, a.beginPath(), a.moveTo(m, n - r), a.bezierCurveTo(m + K.sa * l, n - r, m + l, n - K.sa * r, m + l, n), a.bezierCurveTo(m + l, n + K.sa * r, m + K.sa * l, n + r, m, n + r), a.bezierCurveTo(m - K.sa * l, n + r, m - l, n + K.sa * r, m - l, n), a.bezierCurveTo(m - l, n - K.sa * r, m - K.sa * l, n - r, m, n - r), a.closePath(), null !== this.jd && zl(a, this.jd), d && !h && (h = u.eb(), K.ye(m, n - r, m + K.sa * l, n - r, m + l, n - K.sa * r, m + l, n, .5, h), K.ye(m + l, n, m + l, n + K.sa * r, m + K.sa * l, n + r, m, n + r, .5, h), K.ye(m, n + r, m - K.sa * l, n + r, m - l, n + K.sa * r, m - l, n, .5, h), K.ye(m - l, n, + m - l, n - K.sa * r, m - K.sa * l, n - r, m, n - r, .5, h), a.beginPath(), $m(a, h, k, this.cd), u.ra(h)), 0 !== c && null !== this.yc && (t = s = p = 0, f && e && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0), Bl(a), f && e && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t)); else if (l.oa === ad) { + r = l.Zi; + n = r.length; + for (q = 0; q < n; q++) { + m = r.n[q]; + a.beginPath(); + a.moveTo(m.ua, m.va); + for (var p = m.Fa.n, s = p.length, v = null, t = 0; t < s; t++) { + var x = p[t]; + switch (x.oa) { + case yd: + a.moveTo(x.F, x.G); + break; + case pd: + a.lineTo(x.F, + x.G); + break; + case zd: + a.bezierCurveTo(x.bd, x.xe, x.dg, x.eg, x.pb, x.Bb); + break; + case Ad: + a.quadraticCurveTo(x.bd, x.xe, x.pb, x.Bb); + break; + case Bd: + if (x.radiusX === x.radiusY) v = Math.PI / 180, a.arc(x.bd, x.xe, x.radiusX, x.Je * v, (x.Je + x.Qf) * v, 0 > x.Qf); else for (var v = Hd(x, m), B = v.length, y = 0; y < B; y++) { + var C = v[y]; + 0 === y && a.lineTo(C[0], C[1]); + a.bezierCurveTo(C[2], C[3], C[4], C[5], C[6], C[7]) + } + break; + case Gd: + y = B = 0; + null !== v && v.type === Bd ? (v = Hd(v, m), v = v[v.length - 1] || null, null !== v && (B = v[6], y = v[7])) : (B = null !== v ? v.F : m.ua, y = null !== v ? v.G : m.va); + v = Id(x, m, B, y); + B = v.length; + for (y = 0; y < B; y++) C = v[y], a.bezierCurveTo(C[2], C[3], C[4], C[5], C[6], C[7]); + break; + default: + u.k("Segment not of valid type") + } + x.zh && a.closePath(); + v = x + } + e ? (t = s = p = 0, m.En ? (!0 === m.Il && null !== this.jd ? (zl(a, this.jd), f = !0) : f = !1, 0 !== c && null !== this.yc && (f && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0), d && !h || Bl(a), f && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t))) : (f && (p = a.shadowOffsetX, s = a.shadowOffsetY, t = a.shadowBlur, a.shadowOffsetX = + 0, a.shadowOffsetY = 0, a.shadowBlur = 0), !0 === m.Il && null !== this.jd && zl(a, this.jd), 0 !== c && null !== this.yc && (d && !h || Bl(a)), f && (a.shadowOffsetX = p, a.shadowOffsetY = s, a.shadowBlur = t))) : (!0 === m.Il && null !== this.jd && zl(a, this.jd), 0 === c || null === this.yc || d && !h || Bl(a)) + } + if (d && !h) for (c = f, f = l.Zi, h = f.length, l = 0; l < h; l++) { + r = f.n[l]; + a.beginPath(); + n = u.eb(); + n.push(r.ua); + n.push(r.va); + q = r.ua; + m = r.va; + p = q; + s = m; + t = r.Fa.n; + x = t.length; + for (v = 0; v < x; v++) { + B = t[v]; + switch (B.oa) { + case yd: + $m(a, n, k, this.cd); + n.length = 0; + n.push(B.F); + n.push(B.G); + q = B.F; + m = B.G; + p = q; + s = m; + break; + case pd: + n.push(B.F); + n.push(B.G); + q = B.F; + m = B.G; + break; + case zd: + K.ye(q, m, B.bd, B.xe, B.dg, B.eg, B.pb, B.Bb, .5, n); + q = B.F; + m = B.G; + break; + case Ad: + K.Xo(q, m, B.bd, B.xe, B.pb, B.Bb, .5, n); + q = B.F; + m = B.G; + break; + case Bd: + for (var y = Hd(B, r), C = y.length, I = 0; I < C; I++) { + var H = y[I]; + K.ye(q, m, H[2], H[3], H[4], H[5], H[6], H[7], .5, n); + q = H[6]; + m = H[7] + } + break; + case Gd: + y = Id(B, r, q, m); + C = y.length; + for (I = 0; I < C; I++) H = y[I], K.ye(q, m, H[2], H[3], H[4], H[5], H[6], H[7], .5, n), q = H[6], m = H[7]; + break; + default: + u.k("Segment not of valid type") + } + B.zh && (n.push(p), + n.push(s), $m(a, n, k, this.cd)) + } + $m(a, n, k, this.cd); + u.ra(n); + null !== this.yc && (q = n = r = 0, c && e && (r = a.shadowOffsetX, n = a.shadowOffsetY, q = a.shadowBlur, a.shadowOffsetX = 0, a.shadowOffsetY = 0, a.shadowBlur = 0), Bl(a), c && e && (a.shadowOffsetX = r, a.shadowOffsetY = n, a.shadowBlur = q)) + } + } + d && (void 0 !== a.setLineDash ? (a.setLineDash(u.mh), a.lineDashOffset = 0) : void 0 !== a.webkitLineDash ? (a.webkitLineDash = u.mh, a.webkitLineDashOffset = 0) : void 0 !== a.mozDash && (a.mozDash = null, a.mozDashOffset = 0)); + if (null !== this.eE) { + d = this.eE; + Ph(d, Infinity, Infinity); + k = d.Ba; + d.zc(0, 0, k.width, k.height); + a.save(); + k = this.dd.ub.first(); + a.beginPath(); + c = u.eb(); + c.push(k.ua); + c.push(k.va); + e = k.ua; + f = k.va; + h = e; + l = f; + r = k.Fa.n; + n = r.length; + for (q = 0; q < n; q++) { + m = r[q]; + switch (m.oa) { + case yd: + Zm(a, b, c, d); + c.length = 0; + c.push(m.F); + c.push(m.G); + e = m.F; + f = m.G; + h = e; + l = f; + break; + case pd: + c.push(m.F); + c.push(m.G); + e = m.F; + f = m.G; + break; + case zd: + K.ye(e, f, m.bd, m.xe, m.dg, m.eg, m.pb, m.Bb, .5, c); + e = m.F; + f = m.G; + break; + case Ad: + K.Xo(e, f, m.bd, m.xe, m.pb, m.Bb, .5, c); + e = m.F; + f = m.G; + break; + case Bd: + p = Hd(m, k); + s = p.length; + for (t = 0; t < s; t++) x = + p[t], K.ye(e, f, x[2], x[3], x[4], x[5], x[6], x[7], .5, c), e = x[6], f = x[7]; + break; + case Gd: + p = Id(m, k, e, f); + s = p.length; + for (t = 0; t < s; t++) x = p[t], K.ye(e, f, x[2], x[3], x[4], x[5], x[6], x[7], .5, c), e = x[6], f = x[7]; + break; + default: + u.k("Segment not of valid type") + } + m.zh && (c.push(h), c.push(l), Zm(a, b, c, d)) + } + Zm(a, b, c, d); + u.ra(c); + a.restore() + } + } + } + }; + + function $m(a, b, c, d) { + var e = .001, f = c.length, h = 0, k = 0, l = 0, m = 0, e = b.length; + if (!(4 > e)) if (h = b[0], k = b[1], 4 === e) kl(a, h, k, b[2], b[3], c, d); else { + a.moveTo(h, k); + for (var n = 0, p = 0, q = 0, r = p = l = 0, s = u.eb(), t = 2; t < e; t += 2) l = b[t], m = b[t + 1], n = l - h, p = m - k, 0 === n && (n = .001), q = p / n, p = Math.sqrt(n * n + p * p), h = [], h[0] = n, h[1] = q, h[2] = p, s.push(h), r += p, h = l, k = m; + h = b[0]; + k = b[1]; + b = 0; + for (var m = !0, e = c[b % f], t = 0 !== d, p = 0, l = s[p], n = l[0], q = l[1], l = l[2], v = 0; .1 <= r;) { + 0 === v && (e = c[b % f], b++, t && (d %= e, e -= d, t = !1)); + e > r && (e = r); + e > l ? (v = e - l, e = l) : v = 0; + var x = Math.sqrt(e * e / + (1 + q * q)); + 0 > n && (x = -x); + h += x; + k += q * x; + m ? a.lineTo(h, k) : a.moveTo(h, k); + r -= e; + l -= e; + if (0 !== v) { + p++; + if (p === s.length) { + u.ra(s); + return + } + l = s[p]; + n = l[0]; + q = l[1]; + l = l[2]; + e = v + } else m = !m + } + u.ra(s) + } + } + + X.prototype.getDocumentPoint = X.prototype.lb = function (a, b) { + void 0 === b && (b = new w); + a.ne() && u.k("getDocumentPoint:s Spot must be real: " + a.toString()); + var c = this.Ha, d = this.hb; + b.m(a.x * (c.width + d) - d / 2 + c.x + a.offsetX, a.y * (c.height + d) - d / 2 + c.y + a.offsetY); + this.Ff.ab(b); + return b + }; + X.prototype.Jj = function (a, b) { + var c = this.Pa; + if (null === c || null === this.fill && null === this.stroke) return !1; + var d = c.kb, e = this.hb / 2; + c.type !== dd || b || (e += 2); + var f = u.Sf(); + f.assign(d); + f.Jf(e + 2, e + 2); + if (!f.Aa(a)) return u.ic(f), !1; + d = e + 1E-4; + if (c.type === dd) { + if (null === this.stroke) return !1; + d = (c.F - c.ua) * (a.x - c.ua) + (c.G - c.va) * (a.y - c.va); + if (0 > (c.ua - c.F) * (a.x - c.F) + (c.va - c.G) * (a.y - c.G) || 0 > d) return !1; + u.ic(f); + return K.Hd(c.ua, c.va, c.F, c.G, e, a.x, a.y) + } + if (c.type === md) { + var h = c.ua, k = c.va, l = c.F, m = c.G, c = Math.min(h, l), n = Math.min(k, + m), h = Math.abs(l - h), k = Math.abs(m - k); + f.x = c; + f.y = n; + f.width = h; + f.height = k; + if (null === this.fill) { + f.Jf(-d, -d); + if (f.Aa(a)) return u.ic(f), !1; + f.Jf(d, d) + } + null !== this.stroke && f.Jf(e, e); + e = f.Aa(a); + u.ic(f); + return e + } + if (c.type === nd) { + h = c.ua; + k = c.va; + l = c.F; + m = c.G; + c = Math.min(h, l); + n = Math.min(k, m); + h = Math.abs(l - h); + k = Math.abs(m - k); + h /= 2; + k /= 2; + c = a.x - (c + h); + n = a.y - (n + k); + if (null === this.fill) { + h -= d; + k -= d; + if (0 >= h || 0 >= k || 1 >= c * c / (h * h) + n * n / (k * k)) return u.ic(f), !1; + h += d; + k += d + } + null !== this.stroke && (h += e, k += e); + u.ic(f); + return 0 >= h || 0 >= k ? !1 : 1 >= c * c / + (h * h) + n * n / (k * k) + } + if (c.type === ad) return u.ic(f), null === this.fill ? Ld(c, a.x, a.y, e) : c.Aa(a, e, 1 < this.hb, b); + u.k("Unknown Geometry type"); + return !1 + }; + X.prototype.Oo = function (a, b, c, d) { + var e = this.xa, f = this.Sg; + a = Math.max(a, 0); + b = Math.max(b, 0); + var h; + if (this.Rg) h = this.Pa.kb; else { + var k = this.Fb, l = K.Uw[k]; + if (void 0 === l) { + var m = K.qg[k]; + "string" === typeof m && (m = K.qg[m]); + "function" === typeof m ? (l = m(null, 100, 100), K.Uw[k] = l) : u.k("Unsupported Figure:" + k) + } + h = l.kb + } + var k = h.width, l = h.height, m = h.width, n = h.height; + switch (pl(this, !0)) { + case qh: + d = c = 0; + break; + case cd: + m = Math.max(a - f, 0); + n = Math.max(b - f, 0); + break; + case fl: + m = Math.max(a - f, 0); + d = 0; + break; + case el: + c = 0, n = Math.max(b - f, 0) + } + isFinite(e.width) && + (m = e.width); + isFinite(e.height) && (n = e.height); + e = this.af; + h = this.vg; + c = Math.max(c, h.width) - f; + d = Math.max(d, h.height) - f; + m = Math.min(e.width, m); + n = Math.min(e.height, n); + m = isFinite(m) ? Math.max(c, m) : Math.max(k, c); + n = isFinite(n) ? Math.max(d, n) : Math.max(l, d); + c = rh(this); + switch (c) { + case qh: + break; + case cd: + k = m; + l = n; + break; + case sh: + c = Math.min(m / k, n / l); + isFinite(c) || (c = 1); + k *= c; + l *= c; + break; + default: + u.k(c + " is not a valid geometryStretch.") + } + if (this.Rg) h = this.dd, e = k, d = l, c = h.copy(), h = h.kb, e /= h.width, d /= h.height, isFinite(e) || (e = 1), + isFinite(d) || (d = 1), 1 === e && 1 === d || c.scale(e, d), this.Pa = c; else if (null === this.Pa || this.Pa.Dn !== a - f || this.Pa.Cn !== b - f) this.Pa = K.makeGeometry(this, k, l); + h = this.Pa.kb; + Infinity === a || Infinity === b ? ml(this, h.x - f / 2, h.y - f / 2, 0 === a && 0 === k ? 0 : h.width + f, 0 === b && 0 === l ? 0 : h.height + f) : ml(this, -(f / 2), -(f / 2), m + f, n + f) + }; + + function Om(a, b, c) { + if (!1 !== Aj(a)) { + a.Pc.La(); + var d = a.Sg; + if (0 === d) { + var e = a.T; + e instanceof lf && e.type === ah && e.vc instanceof X && (d = e.vc.hb) + } + d *= a.$b; + ml(a, -(d / 2), -(d / 2), b + d, c + d); + b = a.Pc; + c = a.af; + d = a.vg; + b.width = Math.min(c.width, b.width); + b.height = Math.min(c.height, b.height); + b.width = Math.max(d.width, b.width); + b.height = Math.max(d.height, b.height); + a.Pc.freeze(); + a.Pc.J() || u.k("Non-real measuredBounds has been set. Object " + a + ", measuredBounds: " + a.Pc.toString()); + uj(a, !1) + } + } + + function rh(a) { + var b = a.yD; + return a.Rg ? b === dl ? cd : b : b === dl ? K.Uw[a.Fb].Bd : b + } + + X.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + X.prototype.getNearestIntersectionPoint = X.prototype.bl = function (a, b, c) { + return this.Co(a.x, a.y, b.x, b.y, c) + }; + X.prototype.Co = function (a, b, c, d, e) { + var f = this.transform, h = 1 / (f.m11 * f.m22 - f.m12 * f.m21), k = f.m22 * h, l = -f.m12 * h, m = -f.m21 * h, + n = f.m11 * h, p = h * (f.m21 * f.dy - f.m22 * f.dx), q = h * (f.m12 * f.dx - f.m11 * f.dy), + f = a * k + b * m + p, h = a * l + b * n + q, k = c * k + d * m + p, l = c * l + d * n + q, m = this.hb / 2, + p = this.Pa; + null === p && (Ph(this, Infinity, Infinity), p = this.Pa); + q = p.kb; + n = !1; + if (p.type === dd) if (1.5 >= this.hb) n = K.$g(p.nc, p.uc, p.pb, p.Bb, f, h, k, l, e); else { + var r = 0, s = 0; + p.nc === p.pb ? (r = m, s = 0) : (b = (p.Bb - p.uc) / (p.pb - p.nc), s = m / Math.sqrt(1 + b * b), r = s * b); + d = u.eb(); + b = new w; + K.$g(p.nc + + r, p.uc + s, p.pb + r, p.Bb + s, f, h, k, l, b) && d.push(b); + b = new w; + K.$g(p.nc - r, p.uc - s, p.pb - r, p.Bb - s, f, h, k, l, b) && d.push(b); + b = new w; + K.$g(p.nc + r, p.uc + s, p.nc - r, p.uc - s, f, h, k, l, b) && d.push(b); + b = new w; + K.$g(p.pb + r, p.Bb + s, p.pb - r, p.Bb - s, f, h, k, l, b) && d.push(b); + b = d.length; + if (0 === b) return u.ra(d), !1; + n = !0; + s = Infinity; + for (r = 0; r < b; r++) { + var k = d[r], t = (k.x - f) * (k.x - f) + (k.y - h) * (k.y - h); + t < s && (s = t, e.x = k.x, e.y = k.y) + } + u.ra(d) + } else if (p.type === md) b = q.x - m, n = K.bl(b, q.y - m, q.x + q.width + m, q.y + q.height + m, f, h, k, l, e); else if (p.type === nd) a:if (b = q.copy().Jf(m, + m), 0 === b.width) n = K.$g(b.x, b.y, b.x, b.y + b.height, f, h, k, l, e); else if (0 === b.height) n = K.$g(b.x, b.y, b.x + b.width, b.y, f, h, k, l, e); else { + a = b.width / 2; + var v = b.height / 2; + d = b.x + a; + b = b.y + v; + c = 9999; + f !== k && (c = (h - l) / (f - k)); + if (9999 > Math.abs(c)) { + n = h - b - c * (f - d); + if (0 > a * a * c * c + v * v - n * n) { + e.x = NaN; + e.y = NaN; + n = !1; + break a + } + m = Math.sqrt(a * a * c * c + v * v - n * n); + k = (-(a * a * c * n) + a * v * m) / (v * v + a * a * c * c) + d; + a = (-(a * a * c * n) - a * v * m) / (v * v + a * a * c * c) + d; + l = c * (k - d) + n + b; + b = c * (a - d) + n + b; + d = Math.abs((f - k) * (f - k)) + Math.abs((h - l) * (h - l)); + h = Math.abs((f - a) * (f - a)) + Math.abs((h - b) * + (h - b)); + d < h ? (e.x = k, e.y = l) : (e.x = a, e.y = b) + } else { + k = v * v; + l = f - d; + k -= k / (a * a) * l * l; + if (0 > k) { + e.x = NaN; + e.y = NaN; + n = !1; + break a + } + m = Math.sqrt(k); + l = b + m; + b -= m; + d = Math.abs(l - h); + h = Math.abs(b - h); + d < h ? (e.x = f, e.y = l) : (e.x = f, e.y = b) + } + n = !0 + } else if (p.type === ad) { + var x = 0, B = 0, y = t = 0, q = u.K(), r = k - f, s = l - h, s = r * r + s * s; + e.x = k; + e.y = l; + for (r = 0; r < p.ub.count; r++) for (var C = p.ub.n[r], I = C.Fa, x = C.ua, B = C.va, H = x, T = B, aa = 0; aa < I.count; aa++) { + var R = I.n[aa], N = R.type, t = R.F, y = R.G, Z = !1; + switch (N) { + case yd: + H = t; + T = y; + break; + case pd: + Z = an(x, B, t, y, f, h, k, l, q); + break; + case zd: + var Z = + R.Rb, N = R.jc, Ea = R.df, ua = R.ef, Z = K.js(x, B, Z, N, Ea, ua, t, y, f, h, k, l, .5, q); + break; + case Ad: + Z = (x + 2 * R.Rb) / 3; + N = (B + 2 * R.jc) / 3; + Ea = (2 * R.Rb + t) / 3; + ua = (2 * R.Rb + t) / 3; + Z = K.js(x, B, Z, N, Ea, ua, t, y, f, h, k, l, .5, q); + break; + case Bd: + case Gd: + y = R.type === Bd ? Hd(R, C) : Id(R, C, x, B); + N = y.length; + for (Ea = 0; Ea < N; Ea++) v = y[Ea], 0 === Ea && an(x, B, v[0], v[1], f, h, k, l, q) && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0)), K.js(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7], f, h, k, l, .5, q) && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0)); + t = v[6]; + y = v[7]; + break; + default: + u.k("Unknown Segment type: " + R.type) + } + x = + t; + B = y; + Z && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0)); + R.ew && (t = H, y = T, an(x, B, t, y, f, h, k, l, q) && (t = bn(f, h, q, s, e), t < s && (s = t, n = !0))) + } + f = c - a; + h = d - b; + b = Math.sqrt(f * f + h * h); + 0 !== b && (f /= b, h /= b); + e.x -= f * m; + e.y -= h * m; + u.v(q) + } else u.k("Invalid Geometry type"); + if (!n) return !1; + this.transform.ab(e); + return !0 + }; + + function bn(a, b, c, d, e) { + a = c.x - a; + b = c.y - b; + b = a * a + b * b; + return b < d ? (e.x = c.x, e.y = c.y, b) : d + } + + function an(a, b, c, d, e, f, h, k, l) { + var m = !1, n = (e - h) * (b - d) - (f - k) * (a - c); + if (0 === n) return !1; + l.x = ((e * k - f * h) * (a - c) - (e - h) * (a * d - b * c)) / n; + l.y = ((e * k - f * h) * (b - d) - (f - k) * (a * d - b * c)) / n; + (a > c ? a - c : c - a) < (b > d ? b - d : d - b) ? (e = b < d ? b : d, a = b < d ? d : b, (l.y > e || K.mb(l.y, e)) && (l.y < a || K.mb(l.y, a)) && (m = !0)) : (e = a < c ? a : c, a = a < c ? c : a, (l.x > e || K.mb(l.x, e)) && (l.x < a || K.mb(l.x, a)) && (m = !0)); + return m + } + + X.prototype.containedInRect = X.prototype.sm = function (a, b) { + if (void 0 === b) return a.Kj(this.ba); + var c = this.Pa; + null === c && (Ph(this, Infinity, Infinity), c = this.Pa); + var c = c.kb, d = this.hb / 2, e = !1, f = u.K(); + f.m(c.x - d, c.y - d); + a.Aa(b.ab(f)) && (f.m(c.x - d, c.bottom + d), a.Aa(b.ab(f)) && (f.m(c.right + d, c.bottom + d), a.Aa(b.ab(f)) && (f.m(c.right + d, c.y - d), a.Aa(b.ab(f)) && (e = !0)))); + u.v(f); + return e + }; + X.prototype.intersectsRect = X.prototype.sg = function (a, b) { + if (this.sm(a, b) || void 0 === b && (b = this.transform, a.Kj(this.ba))) return !0; + var c = u.jh(); + c.set(b); + c.oz(); + var d = a.left, e = a.right, f = a.top, h = a.bottom, k = u.K(); + k.m(d, f); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + k.m(e, f); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + k.m(d, h); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + k.m(e, h); + c.ab(k); + if (this.Jj(k, !0)) return u.v(k), !0; + var l = u.K(), m = u.K(); + c.set(b); + c.aE(this.transform); + c.oz(); + l.x = e; + l.y = f; + l.transform(c); + k.x = d; + k.y = + f; + k.transform(c); + var n = !1; + cn(this, k, l, m) ? n = !0 : (k.x = e, k.y = h, k.transform(c), cn(this, k, l, m) ? n = !0 : (l.x = d, l.y = h, l.transform(c), cn(this, k, l, m) ? n = !0 : (k.x = d, k.y = f, k.transform(c), cn(this, k, l, m) && (n = !0)))); + u.v(k); + u.Ye(c); + u.v(l); + u.v(m); + return n + }; + + function cn(a, b, c, d) { + if (!a.bl(b, c, d)) return !1; + a = b.x; + b = b.y; + var e = c.x; + c = c.y; + var f = d.x; + d = d.y; + if (a === e) { + var h = 0; + a = 0; + b < c ? (h = b, a = c) : (h = c, a = b); + return d >= h && d <= a + } + a < e ? (h = a, a = e) : h = e; + return f >= h && f <= a + } + + X.prototype.sD = function (a, b, c) { + function d(a, b) { + for (var c = a.length, d = 0; d < c; d += 2) if (b.ss(a[d], a[d + 1]) > e) return !0; + return !1 + } + + if (c && null !== this.fill && this.Jj(a, !0)) return !0; + var e = a.Lj(b); + b = e; + 1.5 < this.hb && (e = this.hb / 2 + Math.sqrt(e), e *= e); + var f = this.Pa; + null === f && (Ph(this, Infinity, Infinity), f = this.Pa); + if (!c) { + var h = f.kb, k = h.x, l = h.y, m = h.x + h.width, h = h.y + h.height; + if (Ya(a.x, a.y, k, l) <= e && Ya(a.x, a.y, m, l) <= e && Ya(a.x, a.y, k, h) <= e && Ya(a.x, a.y, m, h) <= e) return !0 + } + k = f.nc; + l = f.uc; + m = f.pb; + h = f.Bb; + if (f.type === dd) { + if (c = Xa(a.x, a.y, + k, l, m, h), f = (k - m) * (a.x - m) + (l - h) * (a.y - h), c <= (0 <= (m - k) * (a.x - k) + (h - l) * (a.y - l) && 0 <= f ? e : b)) return !0 + } else { + if (f.type === md) return b = !1, c && (b = Xa(a.x, a.y, k, l, k, h) <= e || Xa(a.x, a.y, k, l, m, l) <= e || Xa(a.x, a.y, m, l, m, h) <= e || Xa(a.x, a.y, k, h, m, h) <= e), b; + if (f.type === nd) { + b = a.x - (k + m) / 2; + var f = a.y - (l + h) / 2, n = Math.abs(m - k) / 2, p = Math.abs(h - l) / 2; + if (0 === n || 0 === p) return c = Xa(a.x, a.y, k, l, m, h), c <= e ? !0 : !1; + if (c) { + if (a = K.sG(n, p, b, f), a * a <= e) return !0 + } else return Ya(b, f, -n, 0) >= e || Ya(b, f, 0, -p) >= e || Ya(b, f, 0, p) >= e || Ya(b, f, n, 0) >= e ? !1 : !0 + } else if (f.type === + ad) { + h = f.kb; + k = h.x; + l = h.y; + m = h.x + h.width; + h = h.y + h.height; + if (a.x > m && a.x < k && a.y > h && a.y < l && Xa(a.x, a.y, k, l, k, h) > e && Xa(a.x, a.y, k, l, m, l) > e && Xa(a.x, a.y, m, h, k, h) > e && Xa(a.x, a.y, m, h, m, l) > e) return !1; + b = Math.sqrt(e); + if (c) { + if (null === this.fill ? Ld(f, a.x, a.y, b) : f.Aa(a, b, !0)) return !0 + } else { + c = f.ub; + for (b = 0; b < c.count; b++) { + k = c.n[b]; + n = k.ua; + p = k.va; + if (a.ss(n, p) > e) return !1; + l = k.Fa.n; + m = l.length; + for (h = 0; h < m; h++) { + var q = l[h]; + switch (q.type) { + case yd: + case pd: + n = q.F; + p = q.G; + if (a.ss(n, p) > e) return !1; + break; + case zd: + f = u.eb(); + K.ye(n, p, q.Rb, q.jc, + q.df, q.ef, q.F, q.G, .8, f); + n = d(f, a); + u.ra(f); + if (n) return !1; + n = q.F; + p = q.G; + if (a.ss(n, p) > e) return !1; + break; + case Ad: + f = u.eb(); + K.Xo(n, p, q.Rb, q.jc, q.F, q.G, .8, f); + n = d(f, a); + u.ra(f); + if (n) return !1; + n = q.F; + p = q.G; + if (a.ss(n, p) > e) return !1; + break; + case Bd: + case Gd: + var q = q.type === Bd ? Hd(q, k) : Id(q, k, n, p), r = q.length, s = null, + f = u.eb(); + for (b = 0; b < r; b++) if (s = q[b], f.length = 0, K.ye(s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7], .8, f), d(f, a)) return u.ra(f), !1; + u.ra(f); + null !== s && (n = s[6], p = s[7]); + break; + default: + u.k("Unknown Segment type: " + q.type) + } + } + } + return !0 + } + } + } + return !1 + }; + u.defineProperty(X, {dd: "geometry"}, function () { + return this.jk ? this.jk : this.Pa + }, function (a) { + var b = this.Pa; + if (b !== a) { + this.jk = null !== a ? this.Pa = a.freeze() : this.Pa = null; + var c = this.T; + null !== c && (c.kj = NaN); + this.Rg = !0; + this.R(); + this.h("geometry", b, a); + a = this.T; + null !== a && 0 !== (this.ea & 1024) && ll(this, a, "geometryString") + } + }); + u.defineProperty(X, {EG: "geometryString"}, function () { + return null === this.dd ? "" : this.dd.toString() + }, function (a) { + var b = sd(a); + a = b.normalize(); + this.dd = b; + var b = u.K(), c = this.position; + c.J() ? b.m(c.x - a.x, c.y - a.y) : b.m(-a.x, -a.y); + this.position = b; + u.v(b) + }); + u.defineProperty(X, {rz: "isGeometryPositioned"}, function () { + return this.hq + }, function (a) { + var b = this.hq; + b !== a && (this.hq = a, this.R(), this.h("isGeometryPositioned", b, a)) + }); + X.prototype.le = function () { + this.Rg ? this.jk = null : this.Pa = null; + this.R() + }; + u.defineProperty(X, {fill: "fill"}, function () { + return this.jd + }, function (a) { + var b = this.jd; + b !== a && (a instanceof ga && a.freeze(), this.jd = a, this.ma(), this.h("fill", b, a)) + }); + u.defineProperty(X, {stroke: "stroke"}, function () { + return this.yc + }, function (a) { + var b = this.yc; + b !== a && (a instanceof ga && a.freeze(), this.yc = a, this.ma(), this.h("stroke", b, a)) + }); + u.defineProperty(X, {hb: "strokeWidth"}, function () { + return this.Sg + }, function (a) { + var b = this.Sg; + if (b !== a) if (0 <= a) { + this.Sg = a; + this.R(); + var c = this.T; + null !== c && (c.kj = NaN); + this.h("strokeWidth", b, a) + } else u.wa(a, "value >= 0", X, "strokeWidth:value") + }); + u.defineProperty(X, {qI: "strokeCap"}, function () { + return this.co + }, function (a) { + var b = this.co; + b !== a && ("string" !== typeof a || "butt" !== a && "round" !== a && "square" !== a ? u.wa(a, '"butt", "round", or "square"', X, "strokeCap") : (this.co = a, this.ma(), this.h("strokeCap", b, a))) + }); + u.defineProperty(X, {wK: "strokeJoin"}, function () { + return this.eo + }, function (a) { + var b = this.eo; + b !== a && ("string" !== typeof a || "miter" !== a && "bevel" !== a && "round" !== a ? u.wa(a, '"miter", "bevel", or "round"', X, "strokeJoin") : (this.eo = a, this.ma(), this.h("strokeJoin", b, a))) + }); + u.defineProperty(X, {xK: "strokeMiterLimit"}, function () { + return this.gm + }, function (a) { + var b = this.gm; + if (b !== a) if (0 < a) { + this.gm = a; + this.ma(); + var c = this.T; + null !== c && (c.kj = NaN); + this.h("strokeMiterLimit", b, a) + } else u.wa(a, "value > 0", X, "strokeWidth:value") + }); + u.defineProperty(X, {gA: "strokeDashArray"}, function () { + return this.fm + }, function (a) { + var b = this.fm; + if (b !== a) { + null === a || Array.isArray(a) || u.Kd(a, "Array", X, "strokeDashArray:value"); + if (null !== a) { + for (var c = a.length, d = 0, e = 0; e < c; e++) { + var f = a[e]; + "number" === typeof f && 0 <= f && isFinite(f) || u.k("strokeDashArray:value " + f + " must be a positive number or zero."); + d += f + } + if (0 === d) { + if (null === b) return; + a = null + } + } + this.fm = a; + this.ma(); + this.h("strokeDashArray", b, a) + } + }); + u.defineProperty(X, {rI: "strokeDashOffset"}, function () { + return this.cd + }, function (a) { + var b = this.cd; + b !== a && 0 <= a && (this.cd = a, this.ma(), this.h("strokeDashOffset", b, a)) + }); + u.defineProperty(X, {Fb: "figure"}, function () { + return this.tn + }, function (a) { + var b = this.tn; + if (b !== a) { + var c = K.qg[a]; + "function" === typeof c ? c = a : (c = K.qg[a.toLowerCase()]) || u.k("Unknown Shape.figure: " + a); + b !== c && (a = this.T, null !== a && (a.kj = NaN), this.tn = c, this.Rg = !1, this.le(), this.h("figure", b, c)) + } + }); + u.defineProperty(X, {jp: "toArrow"}, function () { + return this.fo + }, function (a) { + var b = this.fo; + !0 === a ? a = "Standard" : !1 === a && (a = ""); + if (b !== a) { + var c = K.UC(a); + null === c ? u.k("Unknown Shape.toArrow: " + a) : b !== c && (this.fo = c, this.Rg = !1, this.le(), dn(this), this.h("toArrow", b, c)) + } + }); + u.defineProperty(X, {ez: "fromArrow"}, function () { + return this.wn + }, function (a) { + var b = this.wn; + !0 === a ? a = "Standard" : !1 === a && (a = ""); + if (b !== a) { + var c = K.UC(a); + null === c ? u.k("Unknown Shape.fromArrow: " + a) : b !== c && (this.wn = c, this.Rg = !1, this.le(), dn(this), this.h("fromArrow", b, c)) + } + }); + + function dn(a) { + var b = a.g; + null !== b && b.ha.gb || (a.Cw = en, "None" !== a.fo ? (a.Pf = -1, a.Hj = xc) : "None" !== a.wn && (a.Pf = 0, a.Hj = new L(1 - xc.x, xc.y))) + } + + u.defineProperty(X, {A: "spot1"}, function () { + return this.ri + }, function (a) { + u.C(a, L, X, "spot1"); + var b = this.ri; + b.L(a) || (this.ri = a = a.Z(), this.R(), this.h("spot1", b, a)) + }); + u.defineProperty(X, {B: "spot2"}, function () { + return this.si + }, function (a) { + u.C(a, L, X, "spot2"); + var b = this.si; + b.L(a) || (this.si = a = a.Z(), this.R(), this.h("spot2", b, a)) + }); + u.defineProperty(X, {xc: "parameter1"}, function () { + return this.cr + }, function (a) { + var b = this.cr; + b !== a && (this.cr = a, this.le(), this.h("parameter1", b, a)) + }); + u.defineProperty(X, {et: "parameter2"}, function () { + return this.dr + }, function (a) { + var b = this.dr; + b !== a && (this.dr = a, this.le(), this.h("parameter2", b, a)) + }); + u.u(X, {Ha: "naturalBounds"}, function () { + if (null !== this.Pa) return this.Hc.assign(this.Pa.kb), this.Hc; + var a = this.xa; + return new z(0, 0, a.width, a.height) + }); + u.defineProperty(X, {FJ: "isRectangular"}, function () { + return this.nq + }, function (a) { + var b = this.nq; + b !== a && (this.nq = a, this.R(), this.h("isRectangular", b, a)) + }); + u.defineProperty(X, {eE: "pathObject"}, function () { + return this.gr + }, function (a) { + var b = this.gr; + b !== a && (this.gr = a, this.ma(), this.h("pathObject", b, a)) + }); + u.defineProperty(X, {yD: "geometryStretch"}, function () { + return this.Zp + }, function (a) { + var b = this.Zp; + b !== a && (u.rb(a, S, X, "geometryStretch"), this.Zp = a, this.h("geometryStretch", b, a)) + }); + u.defineProperty(X, {interval: "interval"}, function () { + return this.eq + }, function (a) { + var b = this.eq; + a = Math.floor(a); + b !== a && 0 <= a && (this.eq = a, null !== this.g && vj(this.g), this.R(), this.h("interval", b, a)) + }); + X.getFigureGenerators = function () { + var a = new la("string", "function"), b; + for (b in K.qg) if (b !== b.toLowerCase()) { + var c = K.qg[b]; + "function" === typeof c && a.add(b, c) + } + a.freeze(); + return a + }; + X.defineFigureGenerator = function (a, b) { + u.j(a, "string", X, "defineFigureGenerator:name"); + "string" === typeof b ? "" !== b && K.qg[b] || u.k("Shape.defineFigureGenerator synonym must not be empty or None or not a defined figure name: " + b) : u.j(b, "function", X, "defineFigureGenerator:func"); + var c = a.toLowerCase(); + "" !== a && "none" !== c && a !== c || u.k("Shape.defineFigureGenerator name must not be empty or None or all-lower-case: " + a); + var d = K.qg; + d[a] = b; + d[c] = a + }; + X.getArrowheadGeometries = function () { + var a = new la("string", $c), b; + for (b in K.Qi) if (b !== b.toLowerCase()) { + var c = K.Qi[b]; + c instanceof $c && a.add(b, c) + } + a.freeze(); + return a + }; + X.defineArrowheadGeometry = function (a, b) { + u.j(a, "string", X, "defineArrowheadGeometry:name"); + var c = null; + "string" === typeof b ? (u.j(b, "string", X, "defineArrowheadGeometry:pathstr"), c = sd(b, !1)) : (u.C(b, $c, X, "defineArrowheadGeometry:pathstr"), c = b); + var d = a.toLowerCase(); + "" !== a && "none" !== d && a !== d || u.k("Shape.defineArrowheadGeometry name must not be empty or None or all-lower-case: " + a); + var e = K.Qi; + e[a] = c; + e[d] = a + }; + + function qa() { + S.call(this); + this.ie = ""; + this.yc = "black"; + this.Hg = "13px sans-serif"; + this.Rd = "start"; + this.kq = !0; + this.Kl = this.Ll = !1; + this.Ek = fn; + this.jm = gn; + this.Gu = this.ve = 0; + this.vn = this.ay = this.by = null; + this.ej = new hn; + this.Tp = !1; + this.kf = this.Hk = this.Rr = null; + this.zj = this.yj = 0; + this.ii = Infinity + } + + u.Ga(qa, S); + u.fa("TextBlock", qa); + var jn = new pa, kn = 0, ln = new pa, mn = 0, nn = "...", on = "", pn = u.createElement("canvas").getContext("2d"); + qa.getEllipsis = function () { + return nn + }; + qa.setEllipsis = function (a) { + nn = a; + ln = new pa; + mn = 0 + }; + qa.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.ie = this.ie; + a.yc = this.yc; + a.Hg = this.Hg; + a.Rd = this.Rd; + a.kq = this.kq; + a.Ll = this.Ll; + a.Kl = this.Kl; + a.jm = this.jm; + a.Ek = this.Ek; + a.ve = this.ve; + a.Gu = this.Gu; + a.by = this.by; + a.ay = this.ay; + a.vn = this.vn; + a.ej.qs(this.ej); + a.Tp = this.Tp; + a.Rr = this.Rr; + a.Hk = this.Hk; + a.kf = this.kf; + a.yj = this.yj; + a.zj = this.zj; + a.ii = this.ii + }; + qa.prototype.toString = function () { + return 22 < this.ie.length ? 'TextBlock("' + this.ie.substring(0, 20) + '"...)' : 'TextBlock("' + this.ie + '")' + }; + var qn; + qa.None = qn = u.s(qa, "None", 0); + var rn; + qa.WrapFit = rn = u.s(qa, "WrapFit", 1); + var gn; + qa.WrapDesiredSize = gn = u.s(qa, "WrapDesiredSize", 2); + var fn; + qa.OverflowClip = fn = u.s(qa, "OverflowClip", 0); + var sn; + qa.OverflowEllipsis = sn = u.s(qa, "OverflowEllipsis", 1); + qa.prototype.R = function () { + S.prototype.R.call(this); + this.ay = this.by = null + }; + u.defineProperty(qa, {font: "font"}, function () { + return this.Hg + }, function (a) { + var b = this.Hg; + b !== a && (this.Hg = a, this.vn = null, this.R(), this.h("font", b, a)) + }); + qa.isValidFont = function (a) { + var b = pn.font; + if (a === b || "10px sans-serif" === a) return !0; + pn.font = "10px sans-serif"; + var c; + pn.font = a; + var d = pn.font; + if ("10px sans-serif" !== d) return pn.font = b, !0; + pn.font = "19px serif"; + c = pn.font; + pn.font = a; + d = pn.font; + pn.font = b; + return d !== c + }; + u.defineProperty(qa, {text: "text"}, function () { + return this.ie + }, function (a) { + var b = this.ie; + a = null !== a && void 0 !== a ? a.toString() : ""; + b !== a && (this.ie = a, this.R(), this.h("text", b, a)) + }); + u.defineProperty(qa, {textAlign: "textAlign"}, function () { + return this.Rd + }, function (a) { + var b = this.Rd; + b !== a && ("start" === a || "end" === a || "left" === a || "right" === a || "center" === a ? (this.Rd = a, this.ma(), this.h("textAlign", b, a)) : u.wa(a, '"start", "end", "left", "right", or "center"', qa, "textAlign")) + }); + u.u(qa, {Ha: "naturalBounds"}, function () { + if (!this.Hc.J()) { + var a = tn(this, this.ie, this.ej, 999999).width, b = un(this, a, this.ej), c = this.xa; + isNaN(c.width) || (a = c.width); + isNaN(c.height) || (b = c.height); + bb(this.Hc, a, b) + } + return this.Hc + }); + u.defineProperty(qa, {iw: "isMultiline"}, function () { + return this.kq + }, function (a) { + var b = this.kq; + b !== a && (this.kq = a, this.R(), this.h("isMultiline", b, a)) + }); + u.defineProperty(qa, {JJ: "isUnderline"}, function () { + return this.Ll + }, function (a) { + var b = this.Ll; + b !== a && (this.Ll = a, this.ma(), this.h("isUnderline", b, a)) + }); + u.defineProperty(qa, {GJ: "isStrikethrough"}, function () { + return this.Kl + }, function (a) { + var b = this.Kl; + b !== a && (this.Kl = a, this.ma(), this.h("isStrikethrough", b, a)) + }); + u.defineProperty(qa, {bF: "wrap"}, function () { + return this.jm + }, function (a) { + var b = this.jm; + b !== a && (this.jm = a, this.R(), this.h("wrap", b, a)) + }); + u.defineProperty(qa, {overflow: "overflow"}, function () { + return this.Ek + }, function (a) { + var b = this.Ek; + b !== a && (this.Ek = a, this.R(), this.h("overflow", b, a)) + }); + u.defineProperty(qa, {stroke: "stroke"}, function () { + return this.yc + }, function (a) { + var b = this.yc; + b !== a && (a instanceof ga && a.freeze(), this.yc = a, this.ma(), this.h("stroke", b, a)) + }); + u.u(qa, {oH: "lineCount"}, function () { + return this.ve + }); + u.defineProperty(qa, {bz: "editable"}, function () { + return this.Tp + }, function (a) { + var b = this.Tp; + b !== a && (this.Tp = a, this.h("editable", b, a)) + }); + u.defineProperty(qa, {NE: "textEditor"}, function () { + return this.Rr + }, function (a) { + var b = this.Rr; + b !== a && (a instanceof HTMLElement || u.k("textEditor must be an HTMLElement"), this.Rr = a, this.h("textEditor", b, a)) + }); + u.defineProperty(qa, {cz: "errorFunction"}, function () { + return this.kf + }, function (a) { + var b = this.kf; + b !== a && (null !== a && u.j(a, "function", qa, "errorFunction"), this.kf = a, this.h("errorFunction", b, a)) + }); + + function xl(a, b) { + var c = a.Hg; + null !== c && b.Et !== c && (b.font = c, b.Et = c) + } + + qa.prototype.Mj = function (a, b) { + if (null !== this.yc && 0 !== this.ie.length && null !== this.Hg) { + var c = this.Ha.width, d = vn(this); + a.textAlign = this.Rd; + yl(this, a, this.yc, !0, !1); + (this.Ll || this.Kl) && yl(this, a, this.yc, !1, !1); + var e = this.ej, f = 0, h = !1, k = u.fc(0, 0); + this.Ff.ab(k); + var l = u.fc(0, d); + this.Ff.ab(l); + var m = k.Lj(l); + u.v(k); + u.v(l); + k = b.scale; + 8 > m * k * k && (h = !0); + b.Gg !== a && (h = !1); + !1 === b.$v("textGreeking") && (h = !1); + for (var m = this.yj, k = this.zj, l = this.ve, n = 0; n < l; n++) { + var p = e.gf[n], q = e.te[n]; + p > c && (p = c); + var f = f + m, r = q, q = a, s = f, t = c, + v = d, x = 0; + h ? ("start" === this.Rd || "left" === this.Rd ? x = 0 : "end" === this.Rd || "right" === this.Rd ? x = t - p : "center" === this.Rd ? x = (t - p) / 2 : u.k("textAlign must be start, end, left, right, or center"), q.fillRect(0 + x, s + .25 * v, p, 1)) : ("start" === this.Rd || "left" === this.Rd ? x = 0 : "end" === this.Rd || "right" === this.Rd ? x = t : "center" === this.Rd ? x = t / 2 : u.k("textAlign must be start, end, left, right, or center"), q.fillText(r, 0 + x, s + v - .25 * v), r = v / 20 | 0, 0 === r && (r = 1), "end" === this.Rd || "right" === this.Rd ? x -= p : "center" === this.Rd && (x -= p / 2), this.Ll && + (q.beginPath(), q.lineWidth = r, q.moveTo(0 + x, s + v - .2 * v), q.lineTo(0 + x + p, s + v - .2 * v), q.stroke()), this.Kl && (q.beginPath(), q.lineWidth = r, s = s + v - v / 2.2 | 0, 0 !== r % 2 && (s += .5), q.moveTo(0 + x, s), q.lineTo(0 + x + p, s), q.stroke())); + f += d + k + } + } + }; + qa.prototype.Oo = function (a, b, c, d) { + var e = this.ej; + e.reset(); + var f = 0, h = 0; + if (isNaN(this.xa.width)) { + f = this.ie.replace(/\r\n/g, "\n").replace(/\r/g, "\n"); + if (0 === f.length) f = 0; else if (this.iw) { + for (var k = h = 0, l = !1; !l;) { + var m = f.indexOf("\n", k); + -1 === m && (m = f.length, l = !0); + k = wn(f.substr(k, m - k).replace(/^\s+|\s+$/g, ""), this.Hg); + k > h && (h = k); + k = m + 1 + } + f = h + } else h = f.indexOf("\n", 0), 0 <= h && (f = f.substr(0, h)), f = k = wn(f, this.Hg); + f = Math.min(f, a / this.scale); + f = Math.max(8, f) + } else f = this.xa.width; + null !== this.S && (f = Math.min(f, this.S.af.width), + f = Math.max(f, this.S.vg.width)); + h = un(this, f, e); + m = h = isNaN(this.xa.height) ? Math.min(h, b / this.scale) : this.xa.height; + if (0 !== e.Oe && 1 !== e.te.length && this.Ek === sn && (b = this.Hg, l = this.Ek === sn ? xn(b) : 0, k = this.yj + this.zj, k = Math.max(0, vn(this) + k), m = Math.max(Math.floor(m / k) - 1, 0), !(m + 1 >= e.te.length))) { + k = e.te[m]; + for (a = Math.max(1, a - l); wn(k, b) > a && 1 < k.length;) k = k.substr(0, k.length - 1); + k += nn; + a = wn(k, b); + e.te[m] = k; + e.te = e.te.slice(0, m + 1); + e.gf[m] = a; + e.gf = e.gf.slice(0, m + 1); + e.wi = e.te.length; + e.Oe = Math.max(e.Oe, a); + this.ve = e.wi + } + if (this.bF === + rn || isNaN(this.xa.width)) f = e.Oe, isNaN(this.xa.width) && (f = Math.max(8, f)); + f = Math.max(c, f); + h = Math.max(d, h); + bb(this.Hc, f, h); + ml(this, 0, 0, f, h) + }; + qa.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + + function tn(a, b, c, d) { + b = b.replace(/^\s+|\s+$/g, ""); + var e = 0, f = 0, h = 0, k = a.Hg, f = a.yj + a.zj, l = Math.max(0, vn(a) + f), h = a.Ek === sn ? xn(k) : 0; + if (a.ve >= a.ii) return new ia(0, l); + if (a.jm === qn) { + c.wi = 1; + f = wn(b, k); + if (0 === h || f <= d) return c.Oe = f, c.gf.push(c.Oe), c.te.push(b), new ia(f, l); + var m = yn(b); + b = b.substr(m.length); + for (var n = yn(b), f = wn(m + n, k); 0 < n.length && f <= d;) m += n, b = b.substr(n.length), n = yn(b), f = wn((m + n).replace(/^\s+|\s+$/g, ""), k); + m += n.replace(/^\s+|\s+$/g, ""); + for (d = Math.max(1, d - h); wn(m, k) > d && 1 < m.length;) m = m.substr(0, + m.length - 1); + m += nn; + h = wn(m, k); + c.gf.push(h); + c.Oe = h; + c.te.push(m); + return new ia(h, l) + } + var p = 0; + 0 === b.length && (p = 1, c.gf.push(0), c.te.push(b)); + for (; 0 < b.length;) { + m = yn(b); + for (b = b.substr(m.length); wn(m, k) > d;) { + n = 1; + f = wn(m.substr(0, n), k); + for (h = 0; f <= d;) n++, h = f, f = wn(m.substr(0, n), k); + 1 === n ? (c.gf[a.ve + p] = f, e = Math.max(e, f)) : (c.gf[a.ve + p] = h, e = Math.max(e, h)); + n--; + 1 > n && (n = 1); + c.te[a.ve + p] = m.substr(0, n); + p++; + m = m.substr(n); + if (a.ve + p > a.ii) break + } + n = yn(b); + for (f = wn(m + n, k); 0 < n.length && f <= d;) m += n, b = b.substr(n.length), n = yn(b), f = wn((m + + n).replace(/^\s+|\s+$/g, ""), k); + m = m.replace(/^\s+|\s+$/g, ""); + if ("" !== m && (0 === n.length ? (c.gf.push(f), e = Math.max(e, f)) : (h = wn(m, k), c.gf.push(h), e = Math.max(e, h)), c.te.push(m), p++, a.ve + p > a.ii)) break + } + c.wi = Math.min(a.ii, p); + c.Oe = Math.max(c.Oe, e); + return new ia(c.Oe, l * c.wi) + } + + function yn(a) { + for (var b = a.length, c = 0; c < b && " " !== a.charAt(c);) c++; + for (; c < b && " " === a.charAt(c);) c++; + return c >= b ? a : a.substr(0, c) + } + + function wn(a, b) { + on !== b && (on = pn.font = b); + return pn.measureText(a).width + } + + function vn(a) { + if (null !== a.vn) return a.vn; + var b = a.Hg; + on !== b && (on = pn.font = b); + var c = 0; + void 0 !== jn[b] && 5E3 > kn ? c = jn[b] : (c = 1.3 * pn.measureText("M").width, jn[b] = c, kn++); + return a.vn = c + } + + function xn(a) { + on !== a && (on = pn.font = a); + var b = 0; + void 0 !== ln[a] && 5E3 > mn ? b = ln[a] : (b = pn.measureText(nn).width, ln[a] = b, mn++); + return b + } + + function un(a, b, c) { + var d = a.ie.replace(/\r\n/g, "\n").replace(/\r/g, "\n"), e = a.yj + a.zj, e = Math.max(0, vn(a) + e); + if (0 === d.length) return c.Oe = 0, a.ve = 1, e; + if (!a.iw) { + var f = d.indexOf("\n", 0); + 0 <= f && (d = d.substr(0, f)) + } + for (var f = 0, h = a.ve = 0, k = -1, l = !1; !l;) k = d.indexOf("\n", h), -1 === k && (k = d.length, l = !0), h <= k && (h = d.substr(h, k - h), a.jm !== qn ? (c.wi = 0, h = tn(a, h, c, b), f += h.height, a.ve += c.wi) : (tn(a, h, c, b), f += e, a.ve++), a.ve === a.ii && (l = !0)), h = k + 1; + return a.Gu = f + } + + u.defineProperty(qa, {jA: "textValidation"}, function () { + return this.Hk + }, function (a) { + var b = this.Hk; + b !== a && (null !== a && u.j(a, "function", qa, "textValidation"), this.Hk = a, this.h("textValidation", b, a)) + }); + u.defineProperty(qa, {tK: "spacingAbove"}, function () { + return this.yj + }, function (a) { + var b = this.yj; + b !== a && (this.yj = a, this.h("spacingAbove", b, a)) + }); + u.defineProperty(qa, {uK: "spacingBelow"}, function () { + return this.zj + }, function (a) { + var b = this.zj; + b !== a && (this.zj = a, this.h("spacingBelow", b, a)) + }); + u.defineProperty(qa, {WJ: "maxLines"}, function () { + return this.ii + }, function (a) { + var b = this.ii; + b !== a && (a = Math.floor(a), 0 >= a && u.wa(a, "> 0", qa, "maxLines"), this.ii = a, this.h("maxLines", b, a), this.R()) + }); + u.u(qa, {XJ: "metrics"}, function () { + return this.ej + }); + + function hn() { + this.Oe = this.wi = 0; + this.gf = []; + this.te = [] + } + + hn.prototype.reset = function () { + this.Oe = this.wi = 0; + this.gf = []; + this.te = [] + }; + hn.prototype.qs = function (a) { + this.wi = a.wi; + this.Oe = a.Oe; + this.gf = u.Pk(a.gf); + this.te = u.Pk(a.te) + }; + u.u(hn, {aJ: "arrSize"}, function () { + return this.gf + }); + u.u(hn, {bJ: "arrText"}, function () { + return this.te + }); + u.u(hn, {VJ: "maxLineWidth"}, function () { + return this.Oe + }); + + function Ri() { + S.call(this); + this.Me = null; + this.Lr = ""; + this.xj = (new z(NaN, NaN, NaN, NaN)).freeze(); + this.zn = cd; + this.Qr = this.Aj = this.kf = null; + this.Sx = !1; + this.Zn = null; + this.JB = 0 + } + + u.Ga(Ri, S); + u.fa("Picture", Ri); + var zn = new pa, An = 0, Mi = []; + + function Bn() { + var a = Mi; + if (0 === a.length) for (var b = window.document.getElementsByTagName("canvas"), c = b.length, d = 0; d < c; d++) { + var e = b[d]; + e.parentElement && e.parentElement.Y && a.push(e.parentElement.Y) + } + return a + } + + var Cn; + Ri.clearCache = Cn = function (a) { + void 0 === a && (a = ""); + u.j(a, "string", Ri, "clearCache:url"); + "" !== a ? zn[a] && (delete zn[a], An--) : (zn = new pa, An = 0) + }; + Ri.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.element = this.Me; + a.Lr = this.Lr; + a.xj.assign(this.xj); + a.zn = this.zn; + a.kf = this.kf; + a.Aj = this.Aj; + a.Zn = this.Zn + }; + Ri.prototype.toString = function () { + return "Picture(" + this.source + ")#" + u.Uc(this) + }; + u.defineProperty(Ri, {element: "element"}, function () { + return this.Me + }, function (a) { + var b = this.Me; + b !== a && (a instanceof HTMLImageElement || a instanceof HTMLVideoElement || a instanceof HTMLCanvasElement || u.k("Picture.element must be an instance of Image, Canvas, or Video."), this.Sx = a instanceof HTMLCanvasElement, this.Me = a, !0 === a.complete || void 0 === a.complete ? (a.ou instanceof Event && null !== this.kf && this.kf(this, a.ou), !0 === a.Ux && null !== this.Aj && this.Aj(this, null), a.Ux = !0, this.xa.J() || (uj(this, !1), this.R())) : + a.iB || (a.addEventListener("load", function (b) { + Dn(a, b) + }), a.addEventListener("error", function (b) { + En(a, b) + }), a.iB = !0), this.h("element", b, a), this.ma()) + }); + u.defineProperty(Ri, {source: "source"}, function () { + return this.Lr + }, function (a) { + var b = this.Lr; + if (b !== a) { + u.j(a, "string", Ri, "source"); + this.Lr = a; + var c = zn, d = this.g; + if (void 0 !== c[a]) var e = c[a].mo[0].source; else { + 30 < An && (Cn(), c = zn); + e = u.createElement("img"); + e.addEventListener("load", function (a) { + Dn(e, a) + }); + e.addEventListener("error", function (a) { + En(e, a) + }); + e.iB = !0; + e.src = a; + var f = this.Zn; + null !== f && (e.crossOrigin = f(this)); + c[a] = new Fn(e); + An++ + } + null !== d && vk(d, this); + this.element = e; + null !== d && uk(d, this); + this.ma(); + this.h("source", + b, a) + } + }); + + function Dn(a, b) { + a.Ux = !0; + a.ou = !1; + for (var c = null, d = Bn(), e = d.length, f = 0; f < e; f++) { + var h = d[f], k = h.Tn.ta(a.src); + if (null !== k) { + e = k.length; + for (f = 0; f < e; f++) c = k[f], c.xa.J() || (h.VB.add(c), h.de()), null !== c.Aj && c.Aj(c, b); + h.ma() + } + } + } + + function En(a, b) { + a.ou = b; + for (var c = null, d = Bn(), e = d.length, f = 0; f < e; f++) if (c = d[f].Tn.ta(a.src), null !== c) { + for (var e = c.length, h = u.eb(), f = 0; f < e; f++) h.push(c[f]); + for (f = 0; f < e; f++) c = h[f], null !== c.kf && c.kf(c, b); + u.ra(h) + } + } + + u.defineProperty(Ri, {sK: "sourceCrossOrigin"}, function () { + return this.Zn + }, function (a) { + if (this.Zn !== a && (null !== a && u.j(a, "function", Ri, "sourceCrossOrigin"), this.Zn = a, null !== this.element)) { + var b = this.element.src; + null === a && "string" === typeof b ? this.element.crossOrigin = null : null !== a && (this.element.crossOrigin = a(this)) + } + }); + u.defineProperty(Ri, {Li: "sourceRect"}, function () { + return this.xj + }, function (a) { + var b = this.xj; + b.L(a) || (u.C(a, z, Ri, "sourceRect"), this.xj = a = a.Z(), this.ma(), this.h("sourceRect", b, a)) + }); + u.defineProperty(Ri, {RG: "imageStretch"}, function () { + return this.zn + }, function (a) { + var b = this.zn; + b !== a && (u.rb(a, S, Ri, "imageStretch"), this.zn = a, this.ma(), this.h("imageStretch", b, a)) + }); + u.defineProperty(Ri, {cz: "errorFunction"}, function () { + return this.kf + }, function (a) { + var b = this.kf; + b !== a && (null !== a && u.j(a, "function", Ri, "errorFunction"), this.kf = a, this.h("errorFunction", b, a)) + }); + u.defineProperty(Ri, {AK: "successFunction"}, function () { + return this.Aj + }, function (a) { + var b = this.Aj; + b !== a && (null !== a && u.j(a, "function", Ri, "successFunction"), this.Aj = a, this.h("successFunction", b, a)) + }); + Ri.prototype.Mj = function (a, b) { + var c = this.Me; + if (null !== c) { + var d = c.src; + null !== d && "" !== d || u.k("Element has no source attribute: " + c); + if (!(c.ou instanceof Event) && !0 === c.Ux) { + var d = this.Ha, e = 0, f = 0, h = this.Sx, k = h ? +c.width : c.naturalWidth, + h = h ? +c.height : c.naturalHeight; + void 0 === k && c.videoWidth && (k = c.videoWidth); + void 0 === h && c.videoHeight && (h = c.videoHeight); + k = k || d.width; + h = h || d.height; + if (0 !== k && 0 !== h) { + var l = k, m = h; + this.Li.J() && (e = this.xj.x, f = this.xj.y, k = this.xj.width, h = this.xj.height); + var n = k, p = h, q = this.zn; + switch (q) { + case qh: + if (this.Li.J()) break; + e += Math.max((n - d.width) / 2, 0); + f += Math.max((p - d.height) / 2, 0); + k = Math.min(d.width, n); + h = Math.min(d.height, p); + break; + case cd: + n = d.width; + p = d.height; + break; + case sh: + case th: + var r = 0; + q === sh ? (r = Math.min(d.height / p, d.width / n), n *= r, p *= r) : q === th && (r = Math.max(d.height / p, d.width / n), n *= r, p *= r, e += (n - d.width) / 2, f += (p - d.height) / 2, k *= 1 / (n / d.width), h *= 1 / (p / d.height), n = d.width, p = d.height) + } + this.JB = k * h; + var q = this.Hi() * b.scale, s = this.JB / (n * q * p * q), r = zn[this.source], q = null; + if (void 0 !== r && 16 < s) { + 2 > r.mo.length && (Gn(r, 4, l, m), Gn(r, 16, + l, m)); + for (var l = r.mo, m = l.length, q = l[0], t = 0; t < m; t++) if (l[t].Yo * l[t].Yo < s) q = l[t]; else break + } + if (!b.qn) { + if (null === this.Qr) if (null === this.Me) this.Qr = !1; else { + l = u.createElement("canvas").getContext("2d"); + l.drawImage(this.Me, 0, 0); + try { + l.getImageData(0, 0, 1, 1), this.Qr = !1 + } catch (v) { + this.Qr = !0 + } + } + if (this.Qr) return + } + if (b.$v("pictureRatioOptimization") && !b.Tx && void 0 !== r && null !== q && 1 !== q.Yo) { + a.save(); + r = q.Yo; + try { + a.drawImage(q.source, e / r, f / r, Math.min(q.source.width, k / r), Math.min(q.source.height, h / r), Math.max((d.width - + n) / 2, 0), Math.max((d.height - p) / 2, 0), Math.min(d.width, n), Math.min(d.height, p)) + } catch (x) { + } + a.restore() + } else try { + a.drawImage(c, e, f, k, h, Math.max((d.width - n) / 2, 0), Math.max((d.height - p) / 2, 0), Math.min(d.width, n), Math.min(d.height, p)) + } catch (B) { + } + } + } + } + }; + u.u(Ri, {Ha: "naturalBounds"}, function () { + return this.Hc + }); + Ri.prototype.Oo = function (a, b, c, d) { + var e = this.xa, f = pl(this, !0), h = this.Me, k = this.Sx; + if (k || !this.$x && h && h.complete) this.$x = !0; + null === h && (isFinite(a) || (a = 0), isFinite(b) || (b = 0)); + isFinite(e.width) || f === cd || f === fl ? (isFinite(a) || (a = this.Li.J() ? this.Li.width : k ? +h.width : h.naturalWidth), c = 0) : null !== h && !1 !== this.$x && (a = this.Li.J() ? this.Li.width : k ? +h.width : h.naturalWidth); + isFinite(e.height) || f === cd || f === el ? (isFinite(b) || (b = this.Li.J() ? this.Li.height : k ? +h.height : h.naturalHeight), d = 0) : null !== h && !1 !== this.$x && (b = + this.Li.J() ? this.Li.height : k ? +h.height : h.naturalHeight); + isFinite(e.width) && (a = e.width); + isFinite(e.height) && (b = e.height); + e = this.af; + f = this.vg; + c = Math.max(c, f.width); + d = Math.max(d, f.height); + a = Math.min(e.width, a); + b = Math.min(e.height, b); + a = Math.max(c, a); + b = Math.max(d, b); + null === h || h.complete || (isFinite(a) || (a = 0), isFinite(b) || (b = 0)); + bb(this.Hc, a, b); + ml(this, 0, 0, a, b) + }; + Ri.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + + function Fn(a) { + this.mo = [new Hn(a, 1)] + } + + function Gn(a, b, c, d) { + var e = new oa(null), f = e.getContext("2d"), h = 1 / b; + e.width = c / b; + e.height = d / b; + b = new Hn(e.Dd, b); + c = a.mo[a.mo.length - 1]; + f.setTransform(h * c.Yo, 0, 0, h * c.Yo, 0, 0); + f.drawImage(c.source, 0, 0); + a.mo.push(b) + } + + function Hn(a, b) { + this.source = a; + this.Yo = b + } + + function ka() { + this.o = new $c; + this.Tb = null + } + + g = ka.prototype; + g.reset = function () { + this.o = new $c; + this.Tb = null + }; + + function M(a, b, c, d, e, f) { + null === a.o && u.k("StreamGeometryContext has been closed"); + void 0 !== e && !0 === e ? (null === a.Tb && u.k("Need to call beginFigure first"), d = new Jd(yd), d.F = b, d.G = c, a.Tb.Fa.add(d)) : (a.Tb = new bd, a.Tb.ua = b, a.Tb.va = c, a.Tb.Ns = d, a.o.ub.add(a.Tb)); + void 0 !== f && (a.Tb.En = f) + } + + function P(a) { + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + var b = a.Tb.Fa.length; + 0 < b && a.Tb.Fa.ja(b - 1).close() + } + + function vd(a) { + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + 0 < a.Tb.Fa.length && (a.Tb.Ns = !0) + } + + g.$a = function (a) { + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + this.Tb.il = a + }; + g.moveTo = function (a, b, c) { + void 0 === c && (c = !1); + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + var d = new Jd(yd); + d.F = a; + d.G = b; + c && d.close(); + this.Tb.Fa.add(d) + }; + g.lineTo = function (a, b, c) { + void 0 === c && (c = !1); + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + var d = new Jd(pd); + d.F = a; + d.G = b; + c && d.close(); + this.Tb.Fa.add(d) + }; + + function O(a, b, c, d, e, f, h, k) { + void 0 === k && (k = !1); + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + var l = new Jd(zd); + l.Rb = b; + l.jc = c; + l.df = d; + l.ef = e; + l.F = f; + l.G = h; + k && l.close(); + a.Tb.Fa.add(l) + } + + function td(a, b, c, d, e) { + var f; + void 0 === f && (f = !1); + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + var h = new Jd(Ad); + h.Rb = b; + h.jc = c; + h.F = d; + h.G = e; + f && h.close(); + a.Tb.Fa.add(h) + } + + g.arcTo = function (a, b, c, d, e, f, h) { + void 0 === f && (f = 0); + void 0 === h && (h = !1); + null === this.o && u.k("StreamGeometryContext has been closed"); + null === this.Tb && u.k("Need to call beginFigure first"); + var k = new Jd(Bd); + k.Je = a; + k.Qf = b; + k.Ja = c; + k.Ua = d; + k.radiusX = e; + k.radiusY = 0 !== f ? f : e; + h && k.close(); + this.Tb.Fa.add(k) + }; + + function ud(a, b, c, d, e, f, h, k) { + var l; + void 0 === l && (l = !1); + null === a.o && u.k("StreamGeometryContext has been closed"); + null === a.Tb && u.k("Need to call beginFigure first"); + b = new Jd(Gd, h, k, b, c, d, e, f); + l && b.close(); + a.Tb.Fa.add(b) + } + + K.makeGeometry = function (a, b, c) { + var d = a.xa, e = d.width, d = d.height; + void 0 !== b && !isNaN(b) && isFinite(b) && (e = b); + void 0 !== c && !isNaN(c) && isFinite(c) && (d = c); + isFinite(e) || (e = 100); + isFinite(d) || (d = 100); + b = null; + "None" !== a.jp ? b = K.Qi[a.jp] : "None" !== a.ez ? b = K.Qi[a.ez] : (c = K.qg[a.Fb], "string" === typeof c && (c = K.qg[c]), void 0 === c && u.k("Unknown Shape.figure: " + a.Fb), b = c(a, e, d), b.Dn = e, b.Cn = d); + null === b && (c = K.qg.Rectangle, "function" === typeof c && (b = c(a, e, d))); + return b + }; + K.Ai = function (a, b, c, d, e, f, h, k, l, m, n, p, q, r) { + var s = 1 - l; + a = a * s + c * l; + b = b * s + d * l; + c = c * s + e * l; + d = d * s + f * l; + e = e * s + h * l; + f = f * s + k * l; + k = a * s + c * l; + h = b * s + d * l; + c = c * s + e * l; + d = d * s + f * l; + m.x = a; + m.y = b; + n.x = k; + n.y = h; + p.x = k * s + c * l; + p.y = h * s + d * l; + q.x = c; + q.y = d; + r.x = e; + r.y = f + }; + K.uo = function (a) { + a = K.wm(a); + var b = u.eb(); + b[0] = a[0]; + for (var c = 1, d = 1; d < a.length;) b[c] = a[d], b[c + 1] = a[d], b[c + 2] = a[d + 1], d += 2, c += 3; + u.ra(a); + return b + }; + K.wm = function (a) { + var b = K.Qk(a), c = u.eb(), d = Math.floor(b.length / 2), e = b.length - 1; + a = 0 === a % 2 ? 2 : 1; + for (var f = 0; f < e; f++) { + var h = b[f], k = b[f + 1], l = b[(d + f - 1) % e], m = b[(d + f + a) % e]; + c[2 * f] = h; + c[2 * f + 1] = K.al(h.x, h.y, l.x, l.y, k.x, k.y, m.x, m.y, new w) + } + c[c.length] = c[0]; + u.ra(b); + return c + }; + K.al = function (a, b, c, d, e, f, h, k, l) { + c = a - c; + var m = e - h, n = h = 0; + 0 === c || 0 === m ? 0 === c ? (k = (f - k) / m, h = a, n = k * h + (f - k * e)) : (d = (b - d) / c, h = e, n = d * h + (b - d * a)) : (d = (b - d) / c, k = (f - k) / m, a = b - d * a, h = (f - k * e - a) / (d - k), n = d * h + a); + l.m(h, n); + return l + }; + K.Qk = function (a) { + for (var b = u.eb(), c = 1.5 * Math.PI, d = 0, e = 0; e < a; e++) d = 2 * Math.PI / a * e + c, b[e] = new w(.5 + .5 * Math.cos(d), .5 + .5 * Math.sin(d)); + b.push(b[0]); + return b + }; + K.sA = (new L(.156, .156)).Ka(); + K.tA = (new L(.844, .844)).Ka(); + K.qg = { + None: "Rectangle", Rectangle: function (a, b, c) { + a = new $c; + a.type = md; + a.ua = 0; + a.va = 0; + a.F = b; + a.G = c; + return a + }, Square: function (a, b, c) { + a = new $c; + a.Bd = sh; + a.type = md; + a.ua = 0; + a.va = 0; + a.F = Math.min(b, c); + a.G = Math.min(b, c); + return a + }, Ellipse: function (a, b, c) { + a = new $c; + a.type = nd; + a.ua = 0; + a.va = 0; + a.F = b; + a.G = c; + a.A = K.sA; + a.B = K.tA; + return a + }, Circle: function (a, b, c) { + a = new $c; + a.Bd = sh; + a.type = nd; + a.ua = 0; + a.va = 0; + a.F = Math.min(b, c); + a.G = Math.min(b, c); + a.A = K.sA; + a.B = K.tA; + return a + }, Connector: "Ellipse", TriangleRight: function (a, b, c) { + a = new $c; + var d = + new bd, e = new Jd; + e.F = b; + e.G = .5 * c; + d.Fa.add(e); + b = new Jd; + b.F = 0; + b.G = c; + d.Fa.add(b.close()); + a.ub.add(d); + a.A = new L(0, .25); + a.B = new L(.5, .75); + return a + }, TriangleDown: function (a, b, c) { + a = new $c; + var d = new bd, e = new Jd; + e.F = b; + e.G = 0; + d.Fa.add(e); + e = new Jd; + e.F = .5 * b; + e.G = c; + d.Fa.add(e.close()); + a.ub.add(d); + a.A = new L(.25, 0); + a.B = new L(.75, .5); + return a + }, TriangleLeft: function (a, b, c) { + a = new $c; + var d = new bd; + d.ua = b; + d.va = c; + var e = new Jd; + e.F = 0; + e.G = .5 * c; + d.Fa.add(e); + c = new Jd; + c.F = b; + c.G = 0; + d.Fa.add(c.close()); + a.ub.add(d); + a.A = new L(.5, .25); + a.B = new L(1, .75); + return a + }, TriangleUp: function (a, b, c) { + a = new $c; + var d = new bd; + d.ua = b; + d.va = c; + var e = new Jd; + e.F = 0; + e.G = c; + d.Fa.add(e); + c = new Jd; + c.F = .5 * b; + c.G = 0; + d.Fa.add(c.close()); + a.ub.add(d); + a.A = new L(.25, .5); + a.B = new L(.75, 1); + return a + }, Line1: function (a, b, c) { + a = new $c; + a.type = dd; + a.ua = 0; + a.va = 0; + a.F = b; + a.G = c; + return a + }, Line2: function (a, b, c) { + a = new $c; + a.type = dd; + a.ua = b; + a.va = 0; + a.F = 0; + a.G = c; + return a + }, MinusLine: "LineH", LineH: function (a, b, c) { + a = new $c; + a.type = dd; + a.ua = 0; + a.va = c / 2; + a.F = b; + a.G = c / 2; + return a + }, LineV: function (a, b, c) { + a = + new $c; + a.type = dd; + a.ua = b / 2; + a.va = 0; + a.F = b / 2; + a.G = c; + return a + }, BarH: "Rectangle", BarV: "Rectangle", Curve1: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 0, 0, !1); + O(a, d * b, 0, 1 * b, (1 - d) * c, b, c); + b = a.o; + u.q(a); + return b + }, Curve2: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 0, 0, !1); + O(a, 0, d * c, (1 - d) * b, c, b, c); + b = a.o; + u.q(a); + return b + }, Curve3: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 1 * b, 0, !1); + O(a, 1 * b, d * c, d * b, 1 * c, 0, 1 * c); + b = a.o; + u.q(a); + return b + }, Curve4: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 1 * b, 0, !1); + O(a, (1 - d) * b, 0, 0, (1 - d) * c, 0, 1 * c); + b = a.o; + u.q(a); + return b + }, Alternative: "Triangle", Merge: "Triangle", Triangle: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0 * c, !0); + a.lineTo(0 * b, 1 * c); + a.lineTo(1 * b, 1 * c, !0); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, 1); + u.q(a); + return b + }, Decision: "Diamond", Diamond: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(0, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(1 * b, .5 * c, !0); + b = a.o; + b.A = new L(.25, .25); + b.B = new L(.75, .75); + u.q(a); + return b + }, Pentagon: function (a, b, c) { + var d = K.Qk(5); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 5 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.2, .22); + b.B = new L(.8, .9); + u.q(a); + return b + }, DataTransmission: "Hexagon", Hexagon: function (a, b, c) { + var d = K.Qk(6); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 6 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.07, .25); + b.B = new L(.93, .75); + u.q(a); + return b + }, Heptagon: function (a, b, c) { + var d = K.Qk(7); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 7 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.2, .15); + b.B = new L(.8, .85); + u.q(a); + return b + }, Octagon: function (a, + b, c) { + var d = K.Qk(8); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 8 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.15, .15); + b.B = new L(.85, .85); + u.q(a); + return b + }, Nonagon: function (a, b, c) { + var d = K.Qk(9); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 9 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.17, .13); + b.B = new L(.82, .82); + u.q(a); + return b + }, Decagon: function (a, b, c) { + var d = K.Qk(10); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 10 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.16, .16); + b.B = new L(.84, .84); + u.q(a); + return b + }, Dodecagon: function (a, b, c) { + var d = K.Qk(12); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 12 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.16, .16); + b.B = new L(.84, .84); + u.q(a); + return b + }, FivePointedStar: function (a, b, c) { + var d = K.wm(5); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 10 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.312, .383); + b.B = new L(.693, .765); + u.q(a); + return b + }, SixPointedStar: function (a, b, c) { + var d = + K.wm(6); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 12 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.17, .251); + b.B = new L(.833, .755); + u.q(a); + return b + }, SevenPointedStar: function (a, b, c) { + var d = K.wm(7); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 14 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.363, .361); + b.B = new L(.641, .709); + u.q(a); + return b + }, EightPointedStar: function (a, b, c) { + var d = K.wm(8); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 16 > e; e++) a.lineTo(d[e].x * b, d[e].y * + c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.252, .255); + b.B = new L(.75, .75); + u.q(a); + return b + }, NinePointedStar: function (a, b, c) { + var d = K.wm(9); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 18 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.355, .361); + b.B = new L(.645, .651); + u.q(a); + return b + }, TenPointedStar: function (a, b, c) { + var d = K.wm(10); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; 20 > e; e++) a.lineTo(d[e].x * b, d[e].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.281, .261); + b.B = new L(.723, .748); + u.q(a); + return b + }, FivePointedBurst: function (a, + b, c) { + var d = K.uo(5); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.312, .383); + b.B = new L(.693, .765); + u.q(a); + return b + }, SixPointedBurst: function (a, b, c) { + var d = K.uo(6); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.17, .251); + b.B = new L(.833, .755); + u.q(a); + return b + }, SevenPointedBurst: function (a, + b, c) { + var d = K.uo(7); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.363, .361); + b.B = new L(.641, .709); + u.q(a); + return b + }, EightPointedBurst: function (a, b, c) { + var d = K.uo(8); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.252, .255); + b.B = new L(.75, .75); + u.q(a); + return b + }, NinePointedBurst: function (a, + b, c) { + var d = K.uo(9); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.355, .361); + b.B = new L(.645, .651); + u.q(a); + return b + }, TenPointedBurst: function (a, b, c) { + var d = K.uo(10); + a = u.p(); + M(a, d[0].x * b, d[0].y * c, !0); + for (var e = 1; e < d.length; e += 3) O(a, d[e].x * b, d[e].y * c, d[e + 1].x * b, d[e + 1].y * c, d[e + 2].x * b, d[e + 2].y * c); + u.ra(d); + P(a); + b = a.o; + b.A = new L(.281, .261); + b.B = new L(.723, .748); + u.q(a); + return b + }, Cloud: function (a, b, c) { + a = + u.p(); + M(a, .08034461 * b, .1944299 * c, !0); + O(a, -.09239631 * b, .07836421 * c, .1406031 * b, -.0542823 * c, .2008615 * b, .05349299 * c); + O(a, .2450511 * b, -.00697547 * c, .3776197 * b, -.01112067 * c, .4338609 * b, .074219 * c); + O(a, .4539471 * b, 0, .6066018 * b, -.02526587 * c, .6558228 * b, .07004196 * c); + O(a, .6914277 * b, -.01904177 * c, .8921095 * b, -.01220843 * c, .8921095 * b, .08370865 * c); + O(a, 1.036446 * b, .04105738 * c, 1.020377 * b, .3022052 * c, .9147671 * b, .3194596 * c); + O(a, 1.04448 * b, .360238 * c, .992256 * b, .5219009 * c, .9082935 * b, .562044 * c); + O(a, 1.032337 * b, .5771781 * c, 1.018411 * + b, .8120651 * c, .9212406 * b, .8217117 * c); + O(a, 1.028411 * b, .9571472 * c, .8556702 * b, 1.052487 * c, .7592566 * b, .9156953 * c); + O(a, .7431877 * b, 1.009325 * c, .5624123 * b, 1.021761 * c, .5101666 * b, .9310455 * c); + O(a, .4820677 * b, 1.031761 * c, .3030112 * b, 1.002796 * c, .2609328 * b, .9344623 * c); + O(a, .2329994 * b, 1.01518 * c, .03213784 * b, 1.01518 * c, .08034461 * b, .870098 * c); + O(a, -.02812061 * b, .9032597 * c, -.01205169 * b, .6835638 * c, .06829292 * b, .6545475 * c); + O(a, -.01812061 * b, .6089503 * c, -.00606892 * b, .4555777 * c, .06427569 * b, .4265613 * c); + O(a, -.01606892 * b, .3892545 * c, -.01205169 * + b, .1944299 * c, .08034461 * b, .1944299 * c); + P(a); + b = a.o; + b.A = new L(.1, .1); + b.B = new L(.9, .9); + u.q(a); + return b + }, Gate: "Crescent", Crescent: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + O(a, 1 * b, 0, 1 * b, 1 * c, 0, 1 * c); + O(a, .5 * b, .75 * c, .5 * b, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.511, .19); + b.B = new L(.776, .76); + u.q(a); + return b + }, FramedRectangle: function (a, b, c) { + var d = u.p(), e = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(e) && (e = .1); + isNaN(a) && (a = .1); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c, !0); + M(d, e * b, a * c, !1, !0); + d.lineTo(e * b, (1 - a) * c); + d.lineTo((1 - + e) * b, (1 - a) * c); + d.lineTo((1 - e) * b, a * c, !0); + b = d.o; + b.A = new L(e, a); + b.B = new L(1 - e, 1 - a); + u.q(d); + return b + }, Delay: "HalfEllipse", HalfEllipse: function (a, b, c) { + var d = K.sa; + a = u.p(); + M(a, 0, 0, !0); + O(a, d * b, 0, 1 * b, (.5 - d / 2) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d / 2) * c, d * b, 1 * c, 0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .2); + b.B = new L(.75, .8); + u.q(a); + return b + }, Heart: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 1 * c, !0); + O(a, .1 * b, .8 * c, 0, .5 * c, 0 * b, .3 * c); + O(a, 0 * b, 0, .45 * b, 0, .5 * b, .3 * c); + O(a, .55 * b, 0, 1 * b, 0, 1 * b, .3 * c); + O(a, b, .5 * c, .9 * b, .8 * c, .5 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.15, .29); + b.B = new L(.86, .68); + u.q(a); + return b + }, Spade: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(.51 * b, .01 * c); + O(a, .6 * b, .2 * c, b, .25 * c, b, .5 * c); + O(a, b, .8 * c, .6 * b, .8 * c, .55 * b, .7 * c); + O(a, .5 * b, .75 * c, .55 * b, .95 * c, .75 * b, c); + a.lineTo(.25 * b, c); + O(a, .45 * b, .95 * c, .5 * b, .75 * c, .45 * b, .7 * c); + O(a, .4 * b, .8 * c, 0, .8 * c, 0, .5 * c); + O(a, 0, .25 * c, .4 * b, .2 * c, .49 * b, .01 * c); + P(a); + b = a.o; + b.A = new L(.19, .26); + b.B = new L(.8, .68); + u.q(a); + return b + }, Club: function (a, b, c) { + a = u.p(); + M(a, .4 * b, .6 * c, !0); + O(a, .5 * b, .75 * c, .45 * b, .95 * c, .15 * b, 1 * c); + a.lineTo(.85 * b, c); + O(a, .55 * b, + .95 * c, .5 * b, .75 * c, .6 * b, .6 * c); + var d = .2, e = .3, f = 0, h = 4 * (Math.SQRT2 - 1) / 3 * d; + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e + .05) * b, (.5 - h + f - .02) * c, .65 * b, .36771243 * c); + d = .2; + e = 0; + f = -.3; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, .35 * b, .36771243 * c); + d = .2; + e = -.3; + f = 0; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + O(a, (.5 + d + e - .05) * b, (.5 - h + f - .02) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, .4 * b, .6 * c); + P(a); + b = a.o; + b.A = new L(.06, .39); + b.B = new L(.93, .58); + u.q(a); + return b + }, Ring: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, b, .5 * c, !0); + O(a, b, (.5 - d) * c, (.5 + d) * b, 0, .5 * b, 0); + O(a, (.5 - d) * b, 0, 0, (.5 - d) * c, 0, .5 * c); + O(a, 0, (.5 + d) * c, (.5 - d) * b, c, .5 * b, c); + O(a, (.5 + d) * b, c, b, (.5 + d) * c, b, .5 * c); + d = 4 * (Math.SQRT2 - 1) / 3 * .4; + M(a, .5 * b, .1 * c, !0, !0); + O(a, (.5 + d) * b, .1 * c, .9 * b, (.5 - d) * c, .9 * b, .5 * c); + O(a, .9 * b, (.5 + d) * c, (.5 + d) * b, .9 * c, .5 * b, .9 * c); + O(a, (.5 - d) * b, .9 * c, .1 * b, (.5 + d) * c, .1 * b, .5 * c); + O(a, .1 * b, (.5 - d) * c, (.5 - d) * b, .1 * c, .5 * b, .1 * c); + b = a.o; + b.A = new L(.146, .146); + b.B = new L(.853, + .853); + b.Bd = sh; + u.q(a); + return b + }, YinYang: function (a, b, c) { + var d = .5; + a = u.p(); + d = .5; + M(a, .5 * b, 0, !0); + a.arcTo(270, 180, .5 * b, .5 * b, .5 * b); + O(a, 1 * b, d * c, 0, d * c, d * b, 0, !0); + var d = .1, e = .25; + M(a, (.5 + d) * b, e * c, !0, !0); + a.arcTo(0, -360, .5 * b, c * e, d * b); + P(a); + M(a, .5 * b, 0, !1); + a.arcTo(270, -180, .5 * b, .5 * b, .5 * b); + a.$a(!1); + e = .75; + M(a, (.5 + d) * b, e * c, !0); + a.arcTo(0, 360, .5 * b, c * e, d * b); + P(a); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, Peace: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, b, .5 * c, !0); + O(a, b, (.5 - d) * c, (.5 + d) * b, 0, .5 * b, 0); + O(a, (.5 - d) * b, 0, 0, (.5 - + d) * c, 0, .5 * c); + O(a, 0, (.5 + d) * c, (.5 - d) * b, c, .5 * b, c); + O(a, (.5 + d) * b, c, b, (.5 + d) * c, b, .5 * c); + d = 4 * (Math.SQRT2 - 1) / 3 * .4; + M(a, .5 * b, .1 * c, !0, !0); + O(a, (.5 + d) * b, .1 * c, .9 * b, (.5 - d) * c, .9 * b, .5 * c); + O(a, .9 * b, (.5 + d) * c, (.5 + d) * b, .9 * c, .5 * b, .9 * c); + O(a, (.5 - d) * b, .9 * c, .1 * b, (.5 + d) * c, .1 * b, .5 * c); + O(a, .1 * b, (.5 - d) * c, (.5 - d) * b, .1 * c, .5 * b, .1 * c); + var d = .07, e = 0, f = -.707 * .11, h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * + b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + d = .07; + e = -.707 * .11; + f = .707 * .11; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * + c); + d = .07; + e = .707 * .11; + f = .707 * .11; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + b = a.o; + b.A = new L(.146, .146); + b.B = new L(.853, .853); + b.Bd = sh; + u.q(a); + return b + }, NotAllowed: function (a, b, c) { + var d = K.sa, e = .5 * d, f = .5; + a = u.p(); + M(a, .5 * b, (.5 - + f) * c, !0); + O(a, (.5 - e) * b, (.5 - f) * c, (.5 - f) * b, (.5 - e) * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 + e) * c, (.5 - e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 + e) * b, (.5 + f) * c, (.5 + f) * b, (.5 + e) * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 - e) * c, (.5 + e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + var f = .4, e = .4 * d, d = u.K(), h = u.K(), k = u.K(), l = u.K(); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .42, d, h, k, l, l); + var m = u.K(), n = u.K(), p = u.K(); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .58, l, l, p, m, n); + var q = u.K(), r = u.K(), s = u.K(); + K.Ai(.5, .5 + f, .5 - e, .5 + f, .5 - f, .5 + e, .5 - f, .5, .42, q, r, s, l, l); + var t = u.K(), v = u.K(), x = u.K(); + K.Ai(.5, .5 + f, .5 - e, .5 + f, .5 - f, .5 + e, .5 - f, .5, .58, l, l, x, t, v); + M(a, x.x * b, x.y * c, !0, !0); + O(a, t.x * b, t.y * c, v.x * b, v.y * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 - e) * c, (.5 - e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + O(a, d.x * b, d.y * c, h.x * b, h.y * c, k.x * b, k.y * c); + a.lineTo(x.x * b, x.y * c); + P(a); + M(a, s.x * b, s.y * c, !0, !0); + a.lineTo(p.x * b, p.y * c); + O(a, m.x * b, m.y * c, n.x * b, n.y * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 + e) * c, (.5 + e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, q.x * b, q.y * c, r.x * b, r.y * c, s.x * b, s.y * c); + P(a); + u.v(d); + u.v(h); + u.v(k); + u.v(l); + u.v(m); + u.v(n); + u.v(p); + u.v(q); + u.v(r); + u.v(s); + u.v(t); + u.v(v); + u.v(x); + b = a.o; + u.q(a); + b.Bd = sh; + return b + }, Fragile: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.25 * b, 0); + a.lineTo(.2 * b, .15 * c); + a.lineTo(.3 * b, .25 * c); + a.lineTo(.29 * b, .33 * c); + a.lineTo(.35 * b, .25 * c); + a.lineTo(.3 * b, .15 * c); + a.lineTo(.4 * b, 0); + a.lineTo(1 * b, 0); + O(a, 1 * b, .25 * c, .75 * b, .5 * c, .55 * b, .5 * c); + a.lineTo(.55 * b, .9 * c); + a.lineTo(.7 * b, .9 * c); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.3 * b, 1 * c); + a.lineTo(.3 * b, .9 * c); + a.lineTo(.45 * b, .9 * c); + a.lineTo(.45 * b, .5 * c); + O(a, .25 * b, .5 * c, 0, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = + new L(.25, 0); + b.B = new L(.75, .4); + u.q(a); + return b + }, HourGlass: function (a, b, c) { + a = u.p(); + M(a, .65 * b, .5 * c, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(.35 * b, .5 * c); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + P(a); + b = a.o; + u.q(a); + return b + }, Lightning: function (a, b, c) { + a = u.p(); + M(a, 0 * b, .55 * c, !0); + a.lineTo(.75 * b, 0); + a.lineTo(.25 * b, .45 * c); + a.lineTo(.9 * b, .48 * c); + a.lineTo(.4 * b, 1 * c); + a.lineTo(.65 * b, .55 * c); + P(a); + b = a.o; + u.q(a); + return b + }, Parallelogram1: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo((1 - + a) * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, Input: "Output", Output: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !0); + a.lineTo(.1 * b, 0); + a.lineTo(1 * b, 0); + a.lineTo(.9 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.1, 0); + b.B = new L(.9, 1); + u.q(a); + return b + }, Parallelogram2: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .25); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo((1 - a) * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, ThickCross: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && + (a = .25); + var d = u.p(); + M(d, (.5 - a / 2) * b, 0, !0); + d.lineTo((.5 + a / 2) * b, 0); + d.lineTo((.5 + a / 2) * b, (.5 - a / 2) * c); + d.lineTo(1 * b, (.5 - a / 2) * c); + d.lineTo(1 * b, (.5 + a / 2) * c); + d.lineTo((.5 + a / 2) * b, (.5 + a / 2) * c); + d.lineTo((.5 + a / 2) * b, 1 * c); + d.lineTo((.5 - a / 2) * b, 1 * c); + d.lineTo((.5 - a / 2) * b, (.5 + a / 2) * c); + d.lineTo(0, (.5 + a / 2) * c); + d.lineTo(0, (.5 - a / 2) * c); + d.lineTo((.5 - a / 2) * b, (.5 - a / 2) * c); + P(d); + b = d.o; + b.A = new L(.5 - a / 2, .5 - a / 2); + b.B = new L(.5 + a / 2, .5 + a / 2); + u.q(d); + return b + }, ThickX: function (a, b, c) { + a = .25 / Math.SQRT2; + var d = u.p(); + M(d, .3 * b, 0, !0); + d.lineTo(.5 * b, .2 * c); + d.lineTo(.7 * b, 0); + d.lineTo(1 * b, .3 * c); + d.lineTo(.8 * b, .5 * c); + d.lineTo(1 * b, .7 * c); + d.lineTo(.7 * b, 1 * c); + d.lineTo(.5 * b, .8 * c); + d.lineTo(.3 * b, 1 * c); + d.lineTo(0, .7 * c); + d.lineTo(.2 * b, .5 * c); + d.lineTo(0, .3 * c); + P(d); + b = d.o; + b.A = new L(.5 - a, .5 - a); + b.B = new L(.5 + a, .5 + a); + u.q(d); + return b + }, ThinCross: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .1); + a = u.p(); + M(a, (.5 - d / 2) * b, 0, !0); + a.lineTo((.5 + d / 2) * b, 0); + a.lineTo((.5 + d / 2) * b, (.5 - d / 2) * c); + a.lineTo(1 * b, (.5 - d / 2) * c); + a.lineTo(1 * b, (.5 + d / 2) * c); + a.lineTo((.5 + d / 2) * b, (.5 + d / 2) * c); + a.lineTo((.5 + d / 2) * + b, 1 * c); + a.lineTo((.5 - d / 2) * b, 1 * c); + a.lineTo((.5 - d / 2) * b, (.5 + d / 2) * c); + a.lineTo(0, (.5 + d / 2) * c); + a.lineTo(0, (.5 - d / 2) * c); + a.lineTo((.5 - d / 2) * b, (.5 - d / 2) * c); + P(a); + b = a.o; + u.q(a); + return b + }, ThinX: function (a, b, c) { + a = u.p(); + M(a, .1 * b, 0, !0); + a.lineTo(.5 * b, .4 * c); + a.lineTo(.9 * b, 0); + a.lineTo(1 * b, .1 * c); + a.lineTo(.6 * b, .5 * c); + a.lineTo(1 * b, .9 * c); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.5 * b, .6 * c); + a.lineTo(.1 * b, 1 * c); + a.lineTo(0, .9 * c); + a.lineTo(.4 * b, .5 * c); + a.lineTo(0, .1 * c); + P(a); + return a.o + }, RightTriangle: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, + 1 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .5); + b.B = new L(.5, 1); + u.q(a); + return b + }, RoundedIBeam: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, 0); + O(a, .5 * b, .25 * c, .5 * b, .75 * c, 1 * b, 1 * c); + a.lineTo(0, 1 * c); + O(a, .5 * b, .75 * c, .5 * b, .25 * c, 0, 0); + P(a); + b = a.o; + u.q(a); + return b + }, RoundedRectangle: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = 5); + d = Math.min(d, b / 3); + d = Math.min(d, c / 3); + a = d * K.sa; + var e = u.p(); + M(e, d, 0, !0); + e.lineTo(b - d, 0); + O(e, b - a, 0, b, a, b, d); + e.lineTo(b, c - d); + O(e, b, c - a, b - a, c, b - d, c); + e.lineTo(d, c); + O(e, a, c, 0, c - a, 0, c - d); + e.lineTo(0, + d); + O(e, 0, a, a, 0, d, 0); + P(e); + b = e.o; + 1 < a ? (b.A = new L(0, 0, a, a), b.B = new L(1, 1, -a, -a)) : (b.A = xb, b.B = Vb); + u.q(e); + return b + }, Border: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = 5); + d = Math.min(d, b / 3); + d = Math.min(d, c / 3); + a = u.p(); + M(a, d, 0, !0); + a.lineTo(b - d, 0); + O(a, b - 0, 0, b, 0, b, d); + a.lineTo(b, c - d); + O(a, b, c - 0, b - 0, c, b - d, c); + a.lineTo(d, c); + O(a, 0, c, 0, c - 0, 0, c - d); + a.lineTo(0, d); + O(a, 0, 0, 0, 0, d, 0); + P(a); + b = a.o; + b.A = xb; + b.B = Vb; + u.q(a); + return b + }, SquareIBeam: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .2); + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, d * c); + a.lineTo((.5 + d / 2) * b, d * c); + a.lineTo((.5 + d / 2) * b, (1 - d) * c); + a.lineTo(1 * b, (1 - d) * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, (1 - d) * c); + a.lineTo((.5 - d / 2) * b, (1 - d) * c); + a.lineTo((.5 - d / 2) * b, d * c); + a.lineTo(0, d * c); + P(a); + b = a.o; + u.q(a); + return b + }, Trapezoid: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .2); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo((1 - a) * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, ManualLoop: "ManualOperation", ManualOperation: function (a, b, c) { + var d = + a ? a.xc : NaN; + isNaN(d) && (d = 0); + a = u.p(); + M(a, d, 0, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.1 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.1, 0); + b.B = new L(.9, 1); + u.q(a); + return b + }, GenderMale: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .4 * d, f = .4, h = u.K(), k = u.K(), l = u.K(), m = u.K(); + M(a, (.5 - f) * b, .5 * c, !0); + O(a, (.5 - f) * b, (.5 - e) * c, (.5 - e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .44, l, m, k, h, h); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, k.x * b, k.y * c); + var n = u.fc(k.x, k.y); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .56, + h, h, k, l, m); + var p = u.fc(k.x, k.y); + a.lineTo((.1 * n.x + .855) * b, .1 * n.y * c); + a.lineTo(.85 * b, .1 * n.y * c); + a.lineTo(.85 * b, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .15 * c); + a.lineTo((.1 * p.x + .9) * b, .15 * c); + a.lineTo((.1 * p.x + .9) * b, (.1 * p.y + .05 * .9) * c); + a.lineTo(p.x * b, p.y * c); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 + e) * c, (.5 + e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 - e) * b, (.5 + f) * c, (.5 - f) * b, (.5 + e) * c, (.5 - f) * b, .5 * c); + f = .35; + e = .35 * d; + M(a, .5 * b, (.5 - f) * c, !0, !0); + O(a, (.5 - e) * b, (.5 - f) * c, (.5 - f) * b, (.5 - e) * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 + + e) * c, (.5 - e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 + e) * b, (.5 + f) * c, (.5 + f) * b, (.5 + e) * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 - e) * c, (.5 + e) * b, (.5 - f) * c, .5 * b, (.5 - f) * c); + M(a, (.5 - f) * b, .5 * c, !0); + u.v(h); + u.v(k); + u.v(l); + u.v(m); + u.v(n); + u.v(p); + b = a.o; + b.A = new L(.202, .257); + b.B = new L(.692, .839); + b.Bd = sh; + u.q(a); + return b + }, GenderFemale: function (a, b, c) { + a = u.p(); + var d = .375, e = 0, f = -.125, h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.525 + e) * b, (.5 + d + f) * c, !0); + O(a, (.5 + h + e) * b, (.5 + d + f) * c, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + O(a, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + h + e) * + b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 - h + e) * b, (.5 - d + f) * c, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - h + e) * b, (.5 + d + f) * c, (.475 + e) * b, (.5 + d + f) * c); + a.lineTo(.475 * b, .85 * c); + a.lineTo(.425 * b, .85 * c); + a.lineTo(.425 * b, .9 * c); + a.lineTo(.475 * b, .9 * c); + a.lineTo(.475 * b, 1 * c); + a.lineTo(.525 * b, 1 * c); + a.lineTo(.525 * b, .9 * c); + a.lineTo(.575 * b, .9 * c); + a.lineTo(.575 * b, .85 * c); + a.lineTo(.525 * b, .85 * c); + P(a); + d = .325; + e = 0; + f = -.125; + h = 4 * (Math.SQRT2 - 1) / 3 * d; + M(a, (.5 + d + e) * b, (.5 + f) * c, !0, !0); + O(a, (.5 + d + e) * b, (.5 + h + f) * c, (.5 + + h + e) * b, (.5 + d + f) * c, (.5 + e) * b, (.5 + d + f) * c); + O(a, (.5 - h + e) * b, (.5 + d + f) * c, (.5 - d + e) * b, (.5 + h + f) * c, (.5 - d + e) * b, (.5 + f) * c); + O(a, (.5 - d + e) * b, (.5 - h + f) * c, (.5 - h + e) * b, (.5 - d + f) * c, (.5 + e) * b, (.5 - d + f) * c); + O(a, (.5 + h + e) * b, (.5 - d + f) * c, (.5 + d + e) * b, (.5 - h + f) * c, (.5 + d + e) * b, (.5 + f) * c); + M(a, (.525 + e) * b, (.5 + d + f) * c, !0); + b = a.o; + b.A = new L(.232, .136); + b.B = new L(.782, .611); + b.Bd = sh; + u.q(a); + return b + }, PlusLine: function (a, b, c) { + a = u.p(); + M(a, 0, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + a.moveTo(.5 * b, 0); + a.lineTo(.5 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, XLine: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(1 * b, 0); + a.moveTo(0, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, AsteriskLine: function (a, b, c) { + a = u.p(); + var d = .2 / Math.SQRT2; + M(a, d * b, (1 - d) * c, !1); + a.lineTo((1 - d) * b, d * c); + a.moveTo(d * b, d * c); + a.lineTo((1 - d) * b, (1 - d) * c); + a.moveTo(0 * b, .5 * c); + a.lineTo(1 * b, .5 * c); + a.moveTo(.5 * b, 0 * c); + a.lineTo(.5 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, CircleLine: function (a, b, c) { + var d = .5 * K.sa; + a = u.p(); + M(a, 1 * b, .5 * c, !1); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.A = new L(.146, .146); + b.B = new L(.853, .853); + b.Bd = sh; + u.q(a); + return b + }, Pie: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, (.5 * Math.SQRT2 / 2 + .5) * b, (.5 - .5 * Math.SQRT2 / 2) * c, !0); + O(a, .7 * b, 0 * c, .5 * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 - d + 0) * b, 0 * c, 0 * b, (.5 - d + 0) * c, 0 * b, .5 * c); + O(a, 0 * b, (.5 + d + 0) * c, (.5 - d + 0) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 + d + 0) * b, 1 * c, 1 * b, (.5 + d + 0) * c, 1 * b, .5 * c); + a.lineTo(.5 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, PiePiece: function (a, b, c) { + var d = K.sa / Math.SQRT2 * .5, e = Math.SQRT2 / 2, f = 1 - + Math.SQRT2 / 2; + a = u.p(); + M(a, b, c, !0); + O(a, b, (1 - d) * c, (e + d) * b, (f + d) * c, e * b, f * c); + a.lineTo(0, c); + P(a); + b = a.o; + u.q(a); + return b + }, StopSign: function (a, b, c) { + a = 1 / (Math.SQRT2 + 2); + var d = u.p(); + M(d, a * b, 0, !0); + d.lineTo((1 - a) * b, 0); + d.lineTo(1 * b, a * c); + d.lineTo(1 * b, (1 - a) * c); + d.lineTo((1 - a) * b, 1 * c); + d.lineTo(a * b, 1 * c); + d.lineTo(0, (1 - a) * c); + d.lineTo(0, a * c); + P(d); + b = d.o; + b.A = new L(a / 2, a / 2); + b.B = new L(1 - a / 2, 1 - a / 2); + u.q(d); + return b + }, LogicImplies: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .2); + a = u.p(); + M(a, (1 - d) * b, 0 * c, !1); + a.lineTo(1 * b, .5 * c); + a.lineTo((1 - + d) * b, c); + a.moveTo(0, .5 * c); + a.lineTo(b, .5 * c); + b = a.o; + b.A = xb; + b.B = new L(.8, .5); + u.q(a); + return b + }, LogicIff: function (a, b, c) { + var d = a ? a.xc : NaN; + isNaN(d) && (d = .2); + a = u.p(); + M(a, (1 - d) * b, 0 * c, !1); + a.lineTo(1 * b, .5 * c); + a.lineTo((1 - d) * b, c); + a.moveTo(0, .5 * c); + a.lineTo(b, .5 * c); + a.moveTo(d * b, 0); + a.lineTo(0, .5 * c); + a.lineTo(d * b, c); + b = a.o; + b.A = new L(.2, 0); + b.B = new L(.8, .5); + u.q(a); + return b + }, LogicNot: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, LogicAnd: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(.5 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, 1); + u.q(a); + return b + }, LogicOr: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.lineTo(1 * b, 0); + b = a.o; + b.A = new L(.219, 0); + b.B = new L(.78, .409); + u.q(a); + return b + }, LogicXor: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.moveTo(0, .5 * c); + a.lineTo(1 * b, .5 * c); + var d = .5 * K.sa; + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, LogicTruth: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.moveTo(.5 * b, 0); + a.lineTo(.5 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, LogicFalsity: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(1 * b, 1 * c); + a.moveTo(.5 * b, 1 * c); + a.lineTo(.5 * b, 0); + b = a.o; + u.q(a); + return b + }, LogicThereExists: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(0, .5 * c); + a.moveTo(1 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + b = a.o; + u.q(a); + return b + }, LogicForAll: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.lineTo(1 * b, 0); + a.moveTo(.25 * b, .5 * c); + a.lineTo(.75 * b, .5 * c); + b = a.o; + b.A = new L(.25, 0); + b.B = new L(.75, .5); + u.q(a); + return b + }, LogicIsDefinedAs: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(b, 0); + a.moveTo(0, .5 * c); + a.lineTo(b, .5 * c); + a.moveTo(0, c); + a.lineTo(b, c); + b = a.o; + b.A = new L(.01, .01); + b.B = new L(.99, .49); + u.q(a); + return b + }, LogicIntersect: function (a, b, c) { + var d = .5 * K.sa; + a = u.p(); + M(a, 0, 1 * c, !1); + a.lineTo(0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + b = + a.o; + b.A = new L(0, .5); + b.B = Vb; + u.q(a); + return b + }, LogicUnion: function (a, b, c) { + var d = .5 * K.sa; + a = u.p(); + M(a, 1 * b, 0, !1); + a.lineTo(1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + a.lineTo(0, 0); + b = a.o; + b.A = xb; + b.B = new L(1, .5); + u.q(a); + return b + }, Arrow: function (a, b, c) { + var d = a ? a.xc : NaN, e = a ? a.et : NaN; + isNaN(d) && (d = .3); + isNaN(e) && (e = .3); + a = u.p(); + M(a, 0, (.5 - e / 2) * c, !0); + a.lineTo((1 - d) * b, (.5 - e / 2) * c); + a.lineTo((1 - d) * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo((1 - d) * b, 1 * c); + a.lineTo((1 - d) * b, (.5 + e / 2) * c); + a.lineTo(0, + (.5 + e / 2) * c); + P(a); + b = a.o; + b.A = new L(0, .5 - e / 2); + d = K.al(0, .5 + e / 2, 1, .5 + e / 2, 1 - d, 1, 1, .5, u.K()); + b.B = new L(d.x, d.y); + u.v(d); + u.q(a); + return b + }, ISOProcess: "Chevron", Chevron: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.5 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(.5 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, DoubleArrow: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.3 * b, .214 * c); + a.lineTo(.3 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.3 * b, 1 * c); + a.lineTo(.3 * b, .786 * c); + a.lineTo(0, 1 * c); + P(a); + M(a, .3 * b, .214 * c, !1); + a.lineTo(.3 * b, .786 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, DoubleEndArrow: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.7 * b, .7 * c); + a.lineTo(.3 * b, .7 * c); + a.lineTo(.3 * b, 1 * c); + a.lineTo(0, .5 * c); + a.lineTo(.3 * b, 0); + a.lineTo(.3 * b, .3 * c); + a.lineTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + c = K.al(0, .5, .3, 0, 0, .3, .3, .3, u.K()); + b.A = new L(c.x, c.y); + c = K.al(.7, 1, 1, .5, .7, .7, 1, .7, c); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, IBeamArrow: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.7 * + b, .7 * c); + a.lineTo(.2 * b, .7 * c); + a.lineTo(.2 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.2 * b, 0); + a.lineTo(.2 * b, .3 * c); + a.lineTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + b.A = new L(0, .3); + c = K.al(.7, 1, 1, .5, .7, .7, 1, .7, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, Pointer: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(0, 1 * c); + a.lineTo(.2 * b, .5 * c); + a.lineTo(0, 0); + P(a); + b = a.o; + b.A = new L(.2, .35); + c = K.al(.2, .65, 1, .65, 0, 1, 1, .5, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, RoundedPointer: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(0, 1 * c); + O(a, .5 * b, .75 * c, .5 * b, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.4, .35); + c = K.al(.2, .65, 1, .65, 0, 1, 1, .5, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, SplitEndArrow: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(.7 * b, .7 * c); + a.lineTo(0, .7 * c); + a.lineTo(.2 * b, .5 * c); + a.lineTo(0, .3 * c); + a.lineTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + b.A = new L(.2, .3); + c = K.al(.7, 1, 1, .5, .7, .7, 1, .7, u.K()); + b.B = new L(c.x, c.y); + u.v(c); + u.q(a); + return b + }, MessageToUser: "SquareArrow", SquareArrow: function (a, + b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(.7 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.7 * b, 0); + P(a); + b = a.o; + b.A = xb; + b.B = new L(.7, 1); + u.q(a); + return b + }, Cone1: function (a, b, c) { + var d = K.sa; + a = .5 * d; + var e = .1 * d, d = u.p(); + M(d, 0, .9 * c, !0); + d.lineTo(.5 * b, 0); + d.lineTo(1 * b, .9 * c); + O(d, 1 * b, (.9 + e) * c, (.5 + a) * b, 1 * c, .5 * b, 1 * c); + O(d, (.5 - a) * b, 1 * c, 0, (.9 + e) * c, 0, .9 * c); + P(d); + b = d.o; + b.A = new L(.25, .5); + b.B = new L(.75, .97); + u.q(d); + return b + }, Cone2: function (a, b, c) { + a = u.p(); + M(a, 0, .9 * c, !0); + O(a, (1 - .85 / .9) * b, 1 * c, .85 / .9 * b, 1 * c, 1 * b, .9 * c); + a.lineTo(.5 * b, + 0); + a.lineTo(0, .9 * c); + P(a); + M(a, 0, .9 * c, !1); + O(a, (1 - .85 / .9) * b, .8 * c, .85 / .9 * b, .8 * c, 1 * b, .9 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, .82); + u.q(a); + return b + }, Cube1: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 1 * c, !0); + a.lineTo(1 * b, .85 * c); + a.lineTo(1 * b, .15 * c); + a.lineTo(.5 * b, 0 * c); + a.lineTo(0 * b, .15 * c); + a.lineTo(0 * b, .85 * c); + P(a); + M(a, .5 * b, 1 * c, !1); + a.lineTo(.5 * b, .3 * c); + a.lineTo(0, .15 * c); + a.moveTo(.5 * b, .3 * c); + a.lineTo(1 * b, .15 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .3); + b.B = new L(.5, .85); + u.q(a); + return b + }, Cube2: function (a, b, c) { + a = u.p(); + M(a, + 0, .3 * c, !0); + a.lineTo(0 * b, 1 * c); + a.lineTo(.7 * b, c); + a.lineTo(1 * b, .7 * c); + a.lineTo(1 * b, 0 * c); + a.lineTo(.3 * b, 0 * c); + P(a); + M(a, 0, .3 * c, !1); + a.lineTo(.7 * b, .3 * c); + a.lineTo(1 * b, 0 * c); + a.moveTo(.7 * b, .3 * c); + a.lineTo(.7 * b, 1 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .3); + b.B = new L(.7, 1); + u.q(a); + return b + }, MagneticData: "Cylinder1", Cylinder1: function (a, b, c) { + var d = K.sa; + a = .5 * d; + var e = .1 * d, d = u.p(); + M(d, 0, .1 * c, !0); + O(d, 0, (.1 - e) * c, (.5 - a) * b, 0, .5 * b, 0); + O(d, (.5 + a) * b, 0, 1 * b, (.1 - e) * c, 1 * b, .1 * c); + d.lineTo(b, .9 * c); + O(d, 1 * b, (.9 + e) * c, (.5 + a) * b, 1 * c, .5 * b, 1 * c); + O(d, (.5 - + a) * b, 1 * c, 0, (.9 + e) * c, 0, .9 * c); + d.lineTo(0, .1 * c); + M(d, 0, .1 * c, !1); + O(d, 0, (.1 + e) * c, (.5 - a) * b, .2 * c, .5 * b, .2 * c); + O(d, (.5 + a) * b, .2 * c, 1 * b, (.1 + e) * c, 1 * b, .1 * c); + d.$a(!1); + b = d.o; + b.A = new L(0, .2); + b.B = new L(1, .9); + u.q(d); + return b + }, Cylinder2: function (a, b, c) { + var d = K.sa; + a = .5 * d; + var e = .1 * d, d = u.p(); + M(d, 0, .9 * c, !0); + d.lineTo(0, .1 * c); + O(d, 0, (.1 - e) * c, (.5 - a) * b, 0, .5 * b, 0); + O(d, (.5 + a) * b, 0, 1 * b, (.1 - e) * c, 1 * b, .1 * c); + d.lineTo(1 * b, .9 * c); + O(d, 1 * b, (.9 + e) * c, (.5 + a) * b, 1 * c, .5 * b, 1 * c); + O(d, (.5 - a) * b, 1 * c, 0, (.9 + e) * c, 0, .9 * c); + M(d, 0, .9 * c, !1); + O(d, 0, (.9 - e) * c, (.5 - + a) * b, .8 * c, .5 * b, .8 * c); + O(d, (.5 + a) * b, .8 * c, 1 * b, (.9 - e) * c, 1 * b, .9 * c); + d.$a(!1); + b = d.o; + b.A = new L(0, .1); + b.B = new L(1, .8); + u.q(d); + return b + }, Cylinder3: function (a, b, c) { + var d = K.sa; + a = .1 * d; + var e = .5 * d, d = u.p(); + M(d, .1 * b, 0, !0); + d.lineTo(.9 * b, 0); + O(d, (.9 + a) * b, 0, 1 * b, (.5 - e) * c, 1 * b, .5 * c); + O(d, 1 * b, (.5 + e) * c, (.9 + a) * b, 1 * c, .9 * b, 1 * c); + d.lineTo(.1 * b, 1 * c); + O(d, (.1 - a) * b, 1 * c, 0, (.5 + e) * c, 0, .5 * c); + O(d, 0, (.5 - e) * c, (.1 - a) * b, 0, .1 * b, 0); + M(d, .1 * b, 0, !1); + O(d, (.1 + a) * b, 0, .2 * b, (.5 - e) * c, .2 * b, .5 * c); + O(d, .2 * b, (.5 + e) * c, (.1 + a) * b, 1 * c, .1 * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = + new L(.2, 0); + b.B = new L(.9, 1); + u.q(d); + return b + }, DirectData: "Cylinder4", Cylinder4: function (a, b, c) { + var d = K.sa; + a = .1 * d; + var e = .5 * d, d = u.p(); + M(d, .9 * b, 0, !0); + O(d, (.9 + a) * b, 0, 1 * b, (.5 - e) * c, 1 * b, .5 * c); + O(d, 1 * b, (.5 + e) * c, (.9 + a) * b, 1 * c, .9 * b, 1 * c); + d.lineTo(.1 * b, 1 * c); + O(d, (.1 - a) * b, 1 * c, 0, (.5 + e) * c, 0, .5 * c); + O(d, 0, (.5 - e) * c, (.1 - a) * b, 0, .1 * b, 0); + d.lineTo(.9 * b, 0); + M(d, .9 * b, 0, !1); + O(d, (.9 - a) * b, 0, .8 * b, (.5 - e) * c, .8 * b, .5 * c); + O(d, .8 * b, (.5 + e) * c, (.9 - a) * b, 1 * c, .9 * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = new L(.1, 0); + b.B = new L(.8, 1); + u.q(d); + return b + }, Prism1: function (a, + b, c) { + a = u.p(); + M(a, .25 * b, .25 * c, !0); + a.lineTo(.75 * b, 0); + a.lineTo(b, .5 * c); + a.lineTo(.5 * b, c); + a.lineTo(0, c); + P(a); + M(a, .25 * b, .25 * c, !1); + a.lineTo(.5 * b, c); + a.$a(!1); + b = a.o; + b.A = new L(.408, .172); + b.B = new L(.833, .662); + u.q(a); + return b + }, Prism2: function (a, b, c) { + a = u.p(); + M(a, 0, .25 * c, !0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .25 * c); + a.lineTo(.75 * b, .75 * c); + a.lineTo(0, 1 * c); + P(a); + M(a, 0, c, !1); + a.lineTo(.25 * b, .5 * c); + a.lineTo(b, .25 * c); + a.moveTo(0, .25 * c); + a.lineTo(.25 * b, .5 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .5); + b.B = new L(.75, .75); + u.q(a); + return b + }, + Pyramid1: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(b, .75 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .75 * c); + P(a); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, 1 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .367); + b.B = new L(.75, .875); + u.q(a); + return b + }, Pyramid2: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(b, .85 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .85 * c); + P(a); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, .7 * c); + a.lineTo(0, .85 * c); + a.moveTo(.5 * b, .7 * c); + a.lineTo(1 * b, .85 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .367); + b.B = new L(.75, .875); + u.q(a); + return b + }, Actor: function (a, + b, c) { + var d = K.sa, e = .2 * d, f = .1 * d, h = .5, k = .1; + a = u.p(); + M(a, h * b, (k + .1) * c, !0); + O(a, (h - e) * b, (k + .1) * c, (h - .2) * b, (k + f) * c, (h - .2) * b, k * c); + O(a, (h - .2) * b, (k - f) * c, (h - e) * b, (k - .1) * c, h * b, (k - .1) * c); + O(a, (h + e) * b, (k - .1) * c, (h + .2) * b, (k - f) * c, (h + .2) * b, k * c); + O(a, (h + .2) * b, (k + f) * c, (h + e) * b, (k + .1) * c, h * b, (k + .1) * c); + e = .05; + f = d * e; + M(a, .5 * b, .2 * c, !0); + a.lineTo(.95 * b, .2 * c); + h = .95; + k = .25; + O(a, (h + f) * b, (k - e) * c, (h + e) * b, (k - f) * c, (h + e) * b, k * c); + a.lineTo(1 * b, .6 * c); + a.lineTo(.85 * b, .6 * c); + a.lineTo(.85 * b, .35 * c); + e = .025; + f = d * e; + h = .825; + k = .35; + O(a, (h + e) * b, (k - f) * c, (h + f) * + b, (k - e) * c, h * b, (k - e) * c); + O(a, (h - f) * b, (k - e) * c, (h - e) * b, (k - f) * c, (h - e) * b, k * c); + a.lineTo(.8 * b, 1 * c); + a.lineTo(.55 * b, 1 * c); + a.lineTo(.55 * b, .7 * c); + e = .05; + f = d * e; + h = .5; + k = .7; + O(a, (h + e) * b, (k - f) * c, (h + f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h - f) * b, (k - e) * c, (h - e) * b, (k - f) * c, (h - e) * b, k * c); + a.lineTo(.45 * b, 1 * c); + a.lineTo(.2 * b, 1 * c); + a.lineTo(.2 * b, .35 * c); + e = .025; + f = d * e; + h = .175; + k = .35; + O(a, (h + e) * b, (k - f) * c, (h + f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h - f) * b, (k - e) * c, (h - e) * b, (k - f) * c, (h - e) * b, k * c); + a.lineTo(.15 * b, .6 * c); + a.lineTo(0 * b, .6 * c); + a.lineTo(0 * b, .25 * c); + e = .05; + f = d * e; + h = .05; + k = .25; + O(a, (h - e) * b, (k - f) * c, (h - f) * b, (k - e) * c, h * b, (k - e) * c); + a.lineTo(.5 * b, .2 * c); + b = a.o; + b.A = new L(.2, .2); + b.B = new L(.8, .65); + u.q(a); + return b + }, Card: function (a, b, c) { + a = u.p(); + M(a, 1 * b, 0 * c, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0 * b, 1 * c); + a.lineTo(0 * b, .2 * c); + a.lineTo(.2 * b, 0 * c); + P(a); + b = a.o; + b.A = new L(0, .2); + b.B = Vb; + u.q(a); + return b + }, Collate: function (a, b, c) { + a = u.p(); + M(a, .5 * b, .5 * c, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(.5 * b, .5 * c); + M(a, .5 * b, .5 * c, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(.5 * b, .5 * c); + b = a.o; + b.A = new L(.25, + 0); + b.B = new L(.75, .25); + u.q(a); + return b + }, CreateRequest: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, 0, a * c, !1); + d.lineTo(1 * b, a * c); + d.moveTo(0, (1 - a) * c); + d.lineTo(1 * b, (1 - a) * c); + d.$a(!1); + b = d.o; + b.A = new L(0, a); + b.B = new L(1, 1 - a); + u.q(d); + return b + }, Database: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5 * d, d = .1 * d; + M(a, 1 * b, .1 * c, !0); + a.lineTo(1 * b, .9 * c); + O(a, 1 * b, (.9 + d) * c, (.5 + e) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - e) * b, 1 * c, 0, (.9 + d) * c, 0, .9 * c); + a.lineTo(0, .1 * c); + O(a, 0, (.1 - d) * c, (.5 - e) * b, 0, .5 * b, 0); + O(a, (.5 + e) * b, 0, 1 * b, (.1 - d) * c, 1 * b, .1 * c); + M(a, 1 * b, .1 * c, !1); + O(a, 1 * b, (.1 + d) * c, (.5 + e) * b, .2 * c, .5 * b, .2 * c); + O(a, (.5 - e) * b, .2 * c, 0, (.1 + d) * c, 0, .1 * c); + a.moveTo(1 * b, .2 * c); + O(a, 1 * b, (.2 + d) * c, (.5 + e) * b, .3 * c, .5 * b, .3 * c); + O(a, (.5 - e) * b, .3 * c, 0, (.2 + d) * c, 0, .2 * c); + a.moveTo(1 * b, .3 * c); + O(a, 1 * b, (.3 + d) * c, (.5 + e) * b, .4 * c, .5 * b, .4 * c); + O(a, (.5 - e) * b, .4 * c, 0, (.3 + d) * c, 0, .3 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .4); + b.B = new L(1, .9); + u.q(a); + return b + }, StoredData: "DataStorage", DataStorage: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, 0); + O(a, 1 * b, 0, 1 * b, 1 * c, .75 * b, 1 * c); + a.lineTo(0, 1 * c); + O(a, .25 * b, .9 * c, .25 * b, .1 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.226, 0); + b.B = new L(.81, 1); + u.q(a); + return b + }, DiskStorage: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5 * d, d = .1 * d; + M(a, 1 * b, .1 * c, !0); + a.lineTo(1 * b, .9 * c); + O(a, 1 * b, (.9 + d) * c, (.5 + e) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - e) * b, 1 * c, 0, (.9 + d) * c, 0, .9 * c); + a.lineTo(0, .1 * c); + O(a, 0, (.1 - d) * c, (.5 - e) * b, 0, .5 * b, 0); + O(a, (.5 + e) * b, 0, 1 * b, (.1 - d) * c, 1 * b, .1 * c); + M(a, 1 * b, .1 * c, !1); + O(a, 1 * b, (.1 + d) * c, (.5 + e) * b, .2 * c, .5 * b, .2 * c); + O(a, (.5 - e) * b, .2 * c, 0, (.1 + + d) * c, 0, .1 * c); + a.moveTo(1 * b, .2 * c); + O(a, 1 * b, (.2 + d) * c, (.5 + e) * b, .3 * c, .5 * b, .3 * c); + O(a, (.5 - e) * b, .3 * c, 0, (.2 + d) * c, 0, .2 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .3); + b.B = new L(1, .9); + u.q(a); + return b + }, Display: function (a, b, c) { + a = u.p(); + M(a, .25 * b, 0, !0); + a.lineTo(.75 * b, 0); + O(a, 1 * b, 0, 1 * b, 1 * c, .75 * b, 1 * c); + a.lineTo(.25 * b, 1 * c); + a.lineTo(0, .5 * c); + P(a); + b = a.o; + b.A = new L(.25, 0); + b.B = new L(.75, 1); + u.q(a); + return b + }, DividedEvent: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) ? a = .2 : .15 > a && (a = .15); + var d = u.p(), e = .2 * K.sa; + M(d, 0, .2 * c, !0); + O(d, 0, (.2 - e) * c, (.2 - e) * b, + 0, .2 * b, 0); + d.lineTo(.8 * b, 0); + O(d, (.8 + e) * b, 0, 1 * b, (.2 - e) * c, 1 * b, .2 * c); + d.lineTo(1 * b, .8 * c); + O(d, 1 * b, (.8 + e) * c, (.8 + e) * b, 1 * c, .8 * b, 1 * c); + d.lineTo(.2 * b, 1 * c); + O(d, (.2 - e) * b, 1 * c, 0, (.8 + e) * c, 0, .8 * c); + d.lineTo(0, .2 * c); + M(d, 0, a * c, !1); + d.lineTo(1 * b, a * c); + d.$a(!1); + b = d.o; + b.A = new L(0, a); + b.B = new L(1, 1 - a); + u.q(d); + return b + }, DividedProcess: function (a, b, c) { + a = a ? a.xc : NaN; + if (isNaN(a) || .1 > a) a = .1; + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, 0, a * c, !1); + d.lineTo(1 * b, a * c); + d.$a(!1); + b = d.o; + b.A = new L(0, a); + b.B = + Vb; + u.q(d); + return b + }, Document: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, 0, .7 * c, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .7 * c); + O(a, .5 * b, .4 * c, .5 * b, 1 * c, 0, .7 * c); + P(a); + b = a.o; + b.A = xb; + b.B = new L(1, .6); + u.q(a); + return b + }, ExternalOrganization: function (a, b, c) { + a = a ? a.xc : NaN; + if (isNaN(a) || .2 > a) a = .2; + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, a * b, 0, !1); + d.lineTo(0, a * c); + d.moveTo(1 * b, a * c); + d.lineTo((1 - a) * b, 0); + d.moveTo(0, (1 - a) * c); + d.lineTo(a * b, 1 * c); + d.moveTo((1 - a) * b, 1 * c); + d.lineTo(1 * b, (1 - + a) * c); + d.$a(!1); + b = d.o; + b.A = new L(a / 2, a / 2); + b.B = new L(1 - a / 2, 1 - a / 2); + u.q(d); + return b + }, ExternalProcess: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .5 * c); + P(a); + M(a, .1 * b, .4 * c, !1); + a.lineTo(.1 * b, .6 * c); + a.moveTo(.9 * b, .6 * c); + a.lineTo(.9 * b, .4 * c); + a.moveTo(.6 * b, .1 * c); + a.lineTo(.4 * b, .1 * c); + a.moveTo(.4 * b, .9 * c); + a.lineTo(.6 * b, .9 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .25); + b.B = new L(.75, .75); + u.q(a); + return b + }, File: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .25 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + P(a); + M(a, .75 * b, 0, !1); + a.lineTo(.75 * b, .25 * c); + a.lineTo(1 * b, .25 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .25); + b.B = Vb; + u.q(a); + return b + }, Interrupt: function (a, b, c) { + a = u.p(); + M(a, 1 * b, .5 * c, !0); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(1 * b, .5 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(1 * b, 1 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(1 * b, 0); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.5, .75); + u.q(a); + return b + }, InternalStorage: function (a, b, c) { + var d = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(d) && (d = .1); + isNaN(a) && (a = .1); + var e = u.p(); + M(e, 0, 0, !0); + e.lineTo(1 * + b, 0); + e.lineTo(1 * b, 1 * c); + e.lineTo(0, 1 * c); + P(e); + M(e, d * b, 0, !1); + e.lineTo(d * b, 1 * c); + e.moveTo(0, a * c); + e.lineTo(1 * b, a * c); + e.$a(!1); + b = e.o; + b.A = new L(d, a); + b.B = Vb; + u.q(e); + return b + }, Junction: function (a, b, c) { + a = u.p(); + var d = 1 / Math.SQRT2, e = (1 - 1 / Math.SQRT2) / 2, f = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + f) * c, (.5 + f) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - f) * b, 1 * c, 0, (.5 + f) * c, 0, .5 * c); + O(a, 0, (.5 - f) * c, (.5 - f) * b, 0, .5 * b, 0); + O(a, (.5 + f) * b, 0, 1 * b, (.5 - f) * c, 1 * b, .5 * c); + M(a, (e + d) * b, (e + d) * c, !1); + a.lineTo(e * b, e * c); + a.moveTo(e * b, (e + d) * c); + a.lineTo((e + d) * b, e * c); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, LinedDocument: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, 0, .7 * c, !0); + a.lineTo(0, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .7 * c); + O(a, .5 * b, .4 * c, .5 * b, 1 * c, 0, .7 * c); + P(a); + M(a, .1 * b, 0, !1); + a.lineTo(.1 * b, .75 * c); + a.$a(!1); + b = a.o; + b.A = new L(.1, 0); + b.B = new L(1, .6); + u.q(a); + return b + }, LoopLimit: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !0); + a.lineTo(0, .25 * c); + a.lineTo(.25 * b, 0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .25 * c); + a.lineTo(1 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = Vb; + u.q(a); + return b + }, SequentialData: "MagneticTape", MagneticTape: function (a, + b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, .5 * b, 1 * c, !0); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, .9 * c, .6 * b, .9 * c); + a.lineTo(1 * b, .9 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(.5 * b, 1 * c); + b = a.o; + b.A = new L(.15, .15); + b.B = new L(.85, .8); + u.q(a); + return b + }, ManualInput: function (a, b, c) { + a = u.p(); + M(a, 1 * b, 0, !0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, .25 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = Vb; + u.q(a); + return b + }, MessageFromUser: function (a, b, c) { + a = a ? a.xc : + NaN; + isNaN(a) && (a = .7); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(a * b, .5 * c); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = xb; + b.B = new L(a, 1); + u.q(d); + return b + }, MicroformProcessing: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .25); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(.5 * b, a * c); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(.5 * b, (1 - a) * c); + d.lineTo(0, 1 * c); + P(d); + b = d.o; + b.A = new L(0, a); + b.B = new L(1, 1 - a); + u.q(d); + return b + }, MicroformRecording: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, .25 * c); + a.lineTo(1 * b, .15 * + c); + a.lineTo(1 * b, .85 * c); + a.lineTo(.75 * b, .75 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = new L(1, .75); + u.q(a); + return b + }, MultiDocument: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, b, 0, !0); + a.lineTo(b, .5 * c); + O(a, .96 * b, .47 * c, .93 * b, .45 * c, .9 * b, .44 * c); + a.lineTo(.9 * b, .6 * c); + O(a, .86 * b, .57 * c, .83 * b, .55 * c, .8 * b, .54 * c); + a.lineTo(.8 * b, .7 * c); + O(a, .4 * b, .4 * c, .4 * b, 1 * c, 0, .7 * c); + a.lineTo(0, .2 * c); + a.lineTo(.1 * b, .2 * c); + a.lineTo(.1 * b, .1 * c); + a.lineTo(.2 * b, .1 * c); + a.lineTo(.2 * b, 0); + P(a); + M(a, .1 * b, .2 * c, !1); + a.lineTo(.8 * b, .2 * c); + a.lineTo(.8 * b, .54 * + c); + a.moveTo(.2 * b, .1 * c); + a.lineTo(.9 * b, .1 * c); + a.lineTo(.9 * b, .44 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.8, .77); + u.q(a); + return b + }, MultiProcess: function (a, b, c) { + a = u.p(); + M(a, .1 * b, .1 * c, !0); + a.lineTo(.2 * b, .1 * c); + a.lineTo(.2 * b, 0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, .8 * c); + a.lineTo(.9 * b, .8 * c); + a.lineTo(.9 * b, .9 * c); + a.lineTo(.8 * b, .9 * c); + a.lineTo(.8 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, .2 * c); + a.lineTo(.1 * b, .2 * c); + P(a); + M(a, .2 * b, .1 * c, !1); + a.lineTo(.9 * b, .1 * c); + a.lineTo(.9 * b, .8 * c); + a.moveTo(.1 * b, .2 * c); + a.lineTo(.8 * b, .2 * c); + a.lineTo(.8 * + b, .9 * c); + a.$a(!1); + b = a.o; + b.A = new L(0, .2); + b.B = new L(.8, 1); + u.q(a); + return b + }, OfflineStorage: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = 1 - a, e = u.p(); + M(e, 0, 0, !0); + e.lineTo(1 * b, 0); + e.lineTo(.5 * b, 1 * c); + P(e); + M(e, .5 * a * b, a * c, !1); + e.lineTo((1 - .5 * a) * b, a * c); + e.$a(!1); + b = e.o; + b.A = new L(d / 4 + .5 * a, a); + b.B = new L(3 * d / 4 + .5 * a, a + .5 * d); + u.q(e); + return b + }, OffPageConnector: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(.75 * b, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.75 * b, 1 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = xb; + b.B = new L(.75, 1); + u.q(a); + return b + }, + Or: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(0, .5 * c); + a.moveTo(.5 * b, 1 * c); + a.lineTo(.5 * b, 0); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, PaperTape: function (a, b, c) { + c /= .8; + a = u.p(); + M(a, 0, .7 * c, !0); + a.lineTo(0, .3 * c); + O(a, .5 * b, .6 * c, .5 * b, 0, 1 * b, .3 * c); + a.lineTo(1 * b, .7 * c); + O(a, .5 * b, .4 * c, .5 * b, 1 * c, 0, .7 * c); + P(a); + b = a.o; + b.A = new L(0, .49); + b.B = + new L(1, .75); + u.q(a); + return b + }, PrimitiveFromCall: function (a, b, c) { + var d = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(d) && (d = .1); + isNaN(a) && (a = .3); + var e = u.p(); + M(e, 0, 0, !0); + e.lineTo(1 * b, 0); + e.lineTo((1 - a) * b, .5 * c); + e.lineTo(1 * b, 1 * c); + e.lineTo(0, 1 * c); + P(e); + b = e.o; + b.A = new L(d, 0); + b.B = new L(1 - a, 1); + u.q(e); + return b + }, PrimitiveToCall: function (a, b, c) { + var d = a ? a.xc : NaN; + a = a ? a.et : NaN; + isNaN(d) && (d = .1); + isNaN(a) && (a = .3); + var e = u.p(); + M(e, 0, 0, !0); + e.lineTo((1 - a) * b, 0); + e.lineTo(1 * b, .5 * c); + e.lineTo((1 - a) * b, 1 * c); + e.lineTo(0, 1 * c); + P(e); + b = e.o; + b.A = new L(d, + 0); + b.B = new L(1 - a, 1); + u.q(e); + return b + }, Subroutine: "Procedure", Procedure: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, (1 - a) * b, 0, !1); + d.lineTo((1 - a) * b, 1 * c); + d.moveTo(a * b, 0); + d.lineTo(a * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = new L(a, 0); + b.B = new L(1 - a, 1); + u.q(d); + return b + }, Process: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(0, 1 * c); + P(d); + M(d, a * b, 0, !1); + d.lineTo(a * b, 1 * c); + d.$a(!1); + b = d.o; + b.A = new L(a, 0); + b.B = Vb; + u.q(d); + return b + }, Sort: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !0); + a.lineTo(1 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + a.lineTo(0, .5 * c); + P(a); + M(a, 0, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, .25); + b.B = new L(.75, .5); + u.q(a); + return b + }, Start: function (a, b, c) { + a = u.p(); + M(a, .25 * b, 0, !0); + M(a, .25 * b, 0, !0); + a.arcTo(270, 180, .75 * b, .5 * c, .25 * b, .5 * c); + a.arcTo(90, 180, .25 * b, .5 * c, .25 * b, .5 * c); + M(a, .25 * b, 0, !1); + a.lineTo(.25 * b, 1 * c); + a.moveTo(.75 * b, 0); + a.lineTo(.75 * b, 1 * c); + a.$a(!1); + b = a.o; + b.A = new L(.25, 0); + b.B = + new L(.75, 1); + u.q(a); + return b + }, Terminator: function (a, b, c) { + a = u.p(); + M(a, .25 * b, 0, !0); + a.arcTo(270, 180, .75 * b, .5 * c, .25 * b, .5 * c); + a.arcTo(90, 180, .25 * b, .5 * c, .25 * b, .5 * c); + b = a.o; + b.A = new L(.23, 0); + b.B = new L(.77, 1); + u.q(a); + return b + }, TransmittalTape: function (a, b, c) { + a = a ? a.xc : NaN; + isNaN(a) && (a = .1); + var d = u.p(); + M(d, 0, 0, !0); + d.lineTo(1 * b, 0); + d.lineTo(1 * b, 1 * c); + d.lineTo(.75 * b, (1 - a) * c); + d.lineTo(0, (1 - a) * c); + P(d); + b = d.o; + b.A = xb; + b.B = new L(1, 1 - a); + u.q(d); + return b + }, AndGate: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0, 0, !0); + a.lineTo(.5 * + b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = xb; + b.B = new L(.55, 1); + u.q(a); + return b + }, Buffer: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, .5 * c); + a.lineTo(0, 1 * c); + P(a); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.5, .75); + u.q(a); + return b + }, Clock: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + M(a, 1 * b, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + M(a, .8 * b, .75 * c, !1); + a.lineTo(.8 * b, .25 * c); + a.lineTo(.6 * b, .25 * c); + a.lineTo(.6 * b, .75 * c); + a.lineTo(.4 * b, .75 * c); + a.lineTo(.4 * b, .25 * c); + a.lineTo(.2 * b, .25 * c); + a.lineTo(.2 * b, .75 * c); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, Ground: function (a, b, c) { + a = u.p(); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, .4 * c); + a.moveTo(.2 * b, .6 * c); + a.lineTo(.8 * b, .6 * c); + a.moveTo(.3 * b, .8 * c); + a.lineTo(.7 * b, .8 * c); + a.moveTo(.4 * b, 1 * c); + a.lineTo(.6 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, Inverter: function (a, b, c) { + a = u.p(); + var d = .1 * K.sa; + M(a, .8 * + b, .5 * c, !0); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.8 * b, .5 * c); + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.9 + d) * b, .6 * c, .9 * b, .6 * c); + O(a, (.9 - d) * b, .6 * c, .8 * b, (.5 + d) * c, .8 * b, .5 * c); + O(a, .8 * b, (.5 - d) * c, (.9 - d) * b, .4 * c, .9 * b, .4 * c); + O(a, (.9 + d) * b, .4 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.4, .75); + u.q(a); + return b + }, NandGate: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5 * d, f = .4 * d, d = .1 * d; + M(a, .8 * b, .5 * c, !0); + O(a, .8 * b, (.5 + f) * c, (.4 + e) * b, 1 * c, .4 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(.4 * b, 0); + O(a, (.4 + e) * b, 0, .8 * b, (.5 - f) * + c, .8 * b, .5 * c); + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.9 + d) * b, .6 * c, .9 * b, .6 * c); + O(a, (.9 - d) * b, .6 * c, .8 * b, (.5 + d) * c, .8 * b, .5 * c); + O(a, .8 * b, (.5 - d) * c, (.9 - d) * b, .4 * c, .9 * b, .4 * c); + O(a, (.9 + d) * b, .4 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + b = a.o; + b.A = new L(0, .05); + b.B = new L(.55, .95); + u.q(a); + return b + }, NorGate: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .5, f = d * e, h = 0, k = .5; + M(a, .8 * b, .5 * c, !0); + O(a, .7 * b, (k + f) * c, (h + f) * b, (k + e) * c, 0, 1 * c); + O(a, .25 * b, .75 * c, .25 * b, .25 * c, 0, 0); + O(a, (h + f) * b, (k - e) * c, .7 * b, (k - f) * c, .8 * b, .5 * c); + e = .1; + f = .1 * d; + h = .9; + k = .5; + M(a, (h - e) * b, k * c, !0); + O(a, + (h - e) * b, (k - f) * c, (h - f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h + f) * b, (k - e) * c, (h + e) * b, (k - f) * c, (h + e) * b, k * c); + O(a, (h + e) * b, (k + f) * c, (h + f) * b, (k + e) * c, h * b, (k + e) * c); + O(a, (h - f) * b, (k + e) * c, (h - e) * b, (k + f) * c, (h - e) * b, k * c); + b = a.o; + b.A = new L(.2, .25); + b.B = new L(.6, .75); + u.q(a); + return b + }, OrGate: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0, 0, !0); + O(a, (0 + d + d) * b, 0 * c, .8 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, .8 * b, (.5 + d) * c, (0 + d + d) * b, 1 * c, 0, 1 * c); + O(a, .25 * b, .75 * c, .25 * b, .25 * c, 0, 0); + P(a); + b = a.o; + b.A = new L(.2, .25); + b.B = new L(.75, .75); + u.q(a); + return b + }, XnorGate: function (a, + b, c) { + a = u.p(); + var d = K.sa, e = .5, f = d * e, h = .2, k = .5; + M(a, .1 * b, 0, !1); + O(a, .35 * b, .25 * c, .35 * b, .75 * c, .1 * b, 1 * c); + M(a, .8 * b, .5 * c, !0); + O(a, .7 * b, (k + f) * c, (h + f) * b, (k + e) * c, .2 * b, 1 * c); + O(a, .45 * b, .75 * c, .45 * b, .25 * c, .2 * b, 0); + O(a, (h + f) * b, (k - e) * c, .7 * b, (k - f) * c, .8 * b, .5 * c); + e = .1; + f = .1 * d; + h = .9; + k = .5; + M(a, (h - e) * b, k * c, !0); + O(a, (h - e) * b, (k - f) * c, (h - f) * b, (k - e) * c, h * b, (k - e) * c); + O(a, (h + f) * b, (k - e) * c, (h + e) * b, (k - f) * c, (h + e) * b, k * c); + O(a, (h + e) * b, (k + f) * c, (h + f) * b, (k + e) * c, h * b, (k + e) * c); + O(a, (h - f) * b, (k + e) * c, (h - e) * b, (k + f) * c, (h - e) * b, k * c); + b = a.o; + b.A = new L(.4, .25); + b.B = new L(.65, .75); + u.q(a); + return b + }, XorGate: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, .1 * b, 0, !1); + O(a, .35 * b, .25 * c, .35 * b, .75 * c, .1 * b, 1 * c); + M(a, .2 * b, 0, !0); + O(a, (.2 + d) * b, 0 * c, .9 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, .9 * b, (.5 + d) * c, (.2 + d) * b, 1 * c, .2 * b, 1 * c); + O(a, .45 * b, .75 * c, .45 * b, .25 * c, .2 * b, 0); + P(a); + b = a.o; + b.A = new L(.4, .25); + b.B = new L(.8, .75); + u.q(a); + return b + }, Capacitor: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(0, 1 * c); + a.moveTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, Resistor: function (a, b, c) { + a = u.p(); + M(a, 0, .5 * c, !1); + a.lineTo(.1 * + b, 0); + a.lineTo(.2 * b, 1 * c); + a.lineTo(.3 * b, 0); + a.lineTo(.4 * b, 1 * c); + a.lineTo(.5 * b, 0); + a.lineTo(.6 * b, 1 * c); + a.lineTo(.7 * b, .5 * c); + b = a.o; + u.q(a); + return b + }, Inductor: function (a, b, c) { + a = u.p(); + var d = .1 * K.sa, e = .1; + M(a, (e - .5 * d) * b, c, !1); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .3; + O(a, (e + .1) * b, 0, (e + d) * b, c, e * b, c); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .5; + O(a, (e + .1) * b, 0, (e + d) * b, c, e * b, c); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .7; + O(a, (e + .1) * b, 0, (e + d) * b, c, e * b, c); + O(a, (e - d) * b, c, (e - .1) * b, 0, (e + .1) * b, 0); + e = .9; + O(a, (e + .1) * b, 0, (e + d) * b, c, + (e + .5 * d) * b, c); + b = a.o; + u.q(a); + return b + }, ACvoltageSource: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0 * b, .5 * c, !1); + O(a, 0 * b, (.5 - d) * c, (.5 - d) * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 + d) * b, 0 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0 * b, (.5 + d) * c, 0 * b, .5 * c); + a.moveTo(.1 * b, .5 * c); + O(a, .5 * b, 0 * c, .5 * b, 1 * c, .9 * b, .5 * c); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, DCvoltageSource: function (a, b, c) { + a = u.p(); + M(a, 0, .75 * c, !1); + a.lineTo(0, .25 * c); + a.moveTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, Diode: function (a, b, + c) { + a = u.p(); + M(a, 1 * b, 0, !1); + a.lineTo(1 * b, .5 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + a.lineTo(1 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + b = a.o; + b.A = new L(0, .25); + b.B = new L(.5, .75); + u.q(a); + return b + }, Wifi: function (a, b, c) { + var d = b, e = c; + b *= .38; + c *= .6; + a = u.p(); + var f = K.sa, h = .8 * f, k = .8, l = 0, m = .5, d = (d - b) / 2, e = (e - c) / 2; + M(a, l * b + d, (m + k) * c + e, !0); + O(a, (l - h) * b + d, (m + k) * c + e, (l - k) * b + d, (m + h) * c + e, (l - k) * b + d, m * c + e); + O(a, (l - k) * b + d, (m - h) * c + e, (l - h) * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + O(a, l * b + d, (m - k) * c + e, (l - k + .5 * h) * b + d, (m - h) * c + e, (l - k + .5 * h) * b + d, m * c + e); + O(a, (l - k + .5 * h) * + b + d, (m + h) * c + e, l * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + P(a); + h = .4 * f; + k = .4; + l = .2; + m = .5; + M(a, l * b + d, (m + k) * c + e, !0); + O(a, (l - h) * b + d, (m + k) * c + e, (l - k) * b + d, (m + h) * c + e, (l - k) * b + d, m * c + e); + O(a, (l - k) * b + d, (m - h) * c + e, (l - h) * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + O(a, l * b + d, (m - k) * c + e, (l - k + .5 * h) * b + d, (m - h) * c + e, (l - k + .5 * h) * b + d, m * c + e); + O(a, (l - k + .5 * h) * b + d, (m + h) * c + e, l * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + P(a); + h = .2 * f; + k = .2; + m = l = .5; + M(a, (l - k) * b + d, m * c + e, !0); + O(a, (l - k) * b + d, (m - h) * c + e, (l - h) * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + O(a, (l + h) * b + d, (m - k) * c + e, (l + k) * b + d, (m - h) * c + e, + (l + k) * b + d, m * c + e); + O(a, (l + k) * b + d, (m + h) * c + e, (l + h) * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + O(a, (l - h) * b + d, (m + k) * c + e, (l - k) * b + d, (m + h) * c + e, (l - k) * b + d, m * c + e); + h = .4 * f; + k = .4; + l = .8; + m = .5; + M(a, l * b + d, (m - k) * c + e, !0); + O(a, (l + h) * b + d, (m - k) * c + e, (l + k) * b + d, (m - h) * c + e, (l + k) * b + d, m * c + e); + O(a, (l + k) * b + d, (m + h) * c + e, (l + h) * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + O(a, l * b + d, (m + k) * c + e, (l + k - .5 * h) * b + d, (m + h) * c + e, (l + k - .5 * h) * b + d, m * c + e); + O(a, (l + k - .5 * h) * b + d, (m - h) * c + e, l * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + P(a); + h = .8 * f; + k = .8; + l = 1; + m = .5; + M(a, l * b + d, (m - k) * c + e, !0); + O(a, (l + h) * b + d, (m - + k) * c + e, (l + k) * b + d, (m - h) * c + e, (l + k) * b + d, m * c + e); + O(a, (l + k) * b + d, (m + h) * c + e, (l + h) * b + d, (m + k) * c + e, l * b + d, (m + k) * c + e); + O(a, l * b + d, (m + k) * c + e, (l + k - .5 * h) * b + d, (m + h) * c + e, (l + k - .5 * h) * b + d, m * c + e); + O(a, (l + k - .5 * h) * b + d, (m - h) * c + e, l * b + d, (m - k) * c + e, l * b + d, (m - k) * c + e); + P(a); + b = a.o; + u.q(a); + return b + }, Email: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !0); + a.lineTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, 0); + P(a); + M(a, 0, 0, !1); + a.lineTo(.5 * b, .6 * c); + a.lineTo(1 * b, 0); + a.moveTo(0, 1 * c); + a.lineTo(.45 * b, .54 * c); + a.moveTo(1 * b, 1 * c); + a.lineTo(.55 * b, .54 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, Ethernet: function (a, b, c) { + a = u.p(); + M(a, .35 * b, 0, !0); + a.lineTo(.65 * b, 0); + a.lineTo(.65 * b, .4 * c); + a.lineTo(.35 * b, .4 * c); + a.lineTo(.35 * b, 0); + P(a); + M(a, .1 * b, 1 * c, !0, !0); + a.lineTo(.4 * b, 1 * c); + a.lineTo(.4 * b, .6 * c); + a.lineTo(.1 * b, .6 * c); + a.lineTo(.1 * b, 1 * c); + P(a); + M(a, .6 * b, 1 * c, !0, !0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.9 * b, .6 * c); + a.lineTo(.6 * b, .6 * c); + a.lineTo(.6 * b, 1 * c); + P(a); + M(a, 0, .5 * c, !1); + a.lineTo(1 * b, .5 * c); + a.moveTo(.5 * b, .5 * c); + a.lineTo(.5 * b, .4 * c); + a.moveTo(.75 * b, .5 * c); + a.lineTo(.75 * b, .6 * c); + a.moveTo(.25 * b, .5 * c); + a.lineTo(.25 * + b, .6 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, Power: function (a, b, c) { + a = u.p(); + var d = K.sa, e = .4 * d, f = .4, h = u.K(), k = u.K(), l = u.K(), m = u.K(); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .5, h, h, k, l, m); + var n = u.fc(k.x, k.y); + M(a, k.x * b, k.y * c, !0); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, (.5 + f) * b, .5 * c); + O(a, (.5 + f) * b, (.5 + e) * c, (.5 + e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 - e) * b, (.5 + f) * c, (.5 - f) * b, (.5 + e) * c, (.5 - f) * b, .5 * c); + K.Ai(.5 - f, .5, .5 - f, .5 - e, .5 - e, .5 - f, .5, .5 - f, .5, l, m, k, h, h); + O(a, l.x * b, l.y * c, m.x * b, m.y * c, k.x * b, k.y * c); + e = .3 * d; + f = .3; + K.Ai(.5 - f, .5, .5 - f, .5 - + e, .5 - e, .5 - f, .5, .5 - f, .5, l, m, k, h, h); + a.lineTo(k.x * b, k.y * c); + O(a, m.x * b, m.y * c, l.x * b, l.y * c, (.5 - f) * b, .5 * c); + O(a, (.5 - f) * b, (.5 + e) * c, (.5 - e) * b, (.5 + f) * c, .5 * b, (.5 + f) * c); + O(a, (.5 + e) * b, (.5 + f) * c, (.5 + f) * b, (.5 + e) * c, (.5 + f) * b, .5 * c); + K.Ai(.5, .5 - f, .5 + e, .5 - f, .5 + f, .5 - e, .5 + f, .5, .5, h, h, k, l, m); + O(a, m.x * b, m.y * c, l.x * b, l.y * c, k.x * b, k.y * c); + P(a); + M(a, .45 * b, 0, !0); + a.lineTo(.45 * b, .5 * c); + a.lineTo(.55 * b, .5 * c); + a.lineTo(.55 * b, 0); + P(a); + u.v(h); + u.v(k); + u.v(l); + u.v(m); + u.v(n); + b = a.o; + b.A = new L(.25, .55); + b.B = new L(.75, .8); + u.q(a); + return b + }, Fallout: function (a, + b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 0 * b, .5 * c, !0); + O(a, 0 * b, (.5 - d) * c, (.5 - d) * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 + d) * b, 0 * c, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0 * b, (.5 + d) * c, 0 * b, .5 * c); + var e = d = 0; + M(a, (.3 + d) * b, (.8 + e) * c, !0, !0); + a.lineTo((.5 + d) * b, (.5 + e) * c); + a.lineTo((.1 + d) * b, (.5 + e) * c); + a.lineTo((.3 + d) * b, (.8 + e) * c); + d = .4; + e = 0; + P(a); + M(a, (.3 + d) * b, (.8 + e) * c, !0, !0); + a.lineTo((.5 + d) * b, (.5 + e) * c); + a.lineTo((.1 + d) * b, (.5 + e) * c); + a.lineTo((.3 + d) * b, (.8 + e) * c); + d = .2; + e = -.3; + P(a); + M(a, (.3 + d) * b, (.8 + e) * c, !0, !0); + a.lineTo((.5 + + d) * b, (.5 + e) * c); + a.lineTo((.1 + d) * b, (.5 + e) * c); + a.lineTo((.3 + d) * b, (.8 + e) * c); + P(a); + b = a.o; + b.Bd = sh; + u.q(a); + return b + }, IrritationHazard: function (a, b, c) { + a = u.p(); + M(a, .2 * b, 0 * c, !0); + a.lineTo(.5 * b, .3 * c); + a.lineTo(.8 * b, 0 * c); + a.lineTo(1 * b, .2 * c); + a.lineTo(.7 * b, .5 * c); + a.lineTo(1 * b, .8 * c); + a.lineTo(.8 * b, 1 * c); + a.lineTo(.5 * b, .7 * c); + a.lineTo(.2 * b, 1 * c); + a.lineTo(0 * b, .8 * c); + a.lineTo(.3 * b, .5 * c); + a.lineTo(0 * b, .2 * c); + P(a); + b = a.o; + b.A = new L(.3, .3); + b.B = new L(.7, .7); + u.q(a); + return b + }, ElectricalHazard: function (a, b, c) { + a = u.p(); + M(a, .37 * b, 0 * c, !0); + a.lineTo(.5 * + b, .11 * c); + a.lineTo(.77 * b, .04 * c); + a.lineTo(.33 * b, .49 * c); + a.lineTo(1 * b, .37 * c); + a.lineTo(.63 * b, .86 * c); + a.lineTo(.77 * b, .91 * c); + a.lineTo(.34 * b, 1 * c); + a.lineTo(.34 * b, .78 * c); + a.lineTo(.44 * b, .8 * c); + a.lineTo(.65 * b, .56 * c); + a.lineTo(0 * b, .68 * c); + P(a); + b = a.o; + u.q(a); + return b + }, FireHazard: function (a, b, c) { + a = u.p(); + M(a, .1 * b, 1 * c, !0); + O(a, -.25 * b, .63 * c, .45 * b, .44 * c, .29 * b, 0 * c); + O(a, .48 * b, .17 * c, .54 * b, .35 * c, .51 * b, .42 * c); + O(a, .59 * b, .29 * c, .58 * b, .28 * c, .59 * b, .18 * c); + O(a, .8 * b, .34 * c, .88 * b, .43 * c, .75 * b, .6 * c); + O(a, .87 * b, .48 * c, .88 * b, .43 * c, .88 * b, .31 * + c); + O(a, 1.17 * b, .76 * c, .82 * b, .8 * c, .9 * b, 1 * c); + P(a); + b = a.o; + b.A = new L(.05, .645); + b.B = new L(.884, .908); + u.q(a); + return b + }, BpmnActivityLoop: function (a, b, c) { + a = u.p(); + var d = 4 * (Math.SQRT2 - 1) / 3 * .5; + M(a, .65 * b, 1 * c, !1); + O(a, (1 - d + 0) * b, 1 * c, 1 * b, (.5 + d + 0) * c, 1 * b, .5 * c); + O(a, 1 * b, (.5 - d + 0) * c, (.5 + d + 0) * b, 0 * c, .5 * b, 0 * c); + O(a, (.5 - d + 0) * b, 0 * c, 0 * b, (.5 - d + 0) * c, 0 * b, .5 * c); + O(a, 0 * b, (.5 + d + 0) * c, (.5 - d + 0) * b, 1 * c, .35 * b, .98 * c); + a.moveTo(.25 * b, .8 * c); + a.lineTo(.35 * b, 1 * c); + a.lineTo(.1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivityParallel: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(0, 1 * c); + a.moveTo(.5 * b, 0); + a.lineTo(.5 * b, 1 * c); + a.moveTo(1 * b, 0); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivitySequential: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + a.lineTo(1 * b, 0); + a.moveTo(0, .5 * c); + a.lineTo(1 * b, .5 * c); + a.moveTo(0, 1 * c); + a.lineTo(1 * b, 1 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivityAdHoc: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + M(a, 1 * b, 1 * c, !1); + M(a, 0, .5 * c, !1); + O(a, .2 * b, .35 * c, .3 * b, .35 * c, .5 * b, .5 * c); + O(a, .7 * b, .65 * c, .8 * b, .65 * c, 1 * b, .5 * c); + b = a.o; + u.q(a); + return b + }, BpmnActivityCompensation: function (a, + b, c) { + a = u.p(); + M(a, 0, .5 * c, !0); + a.lineTo(.5 * b, 0); + a.lineTo(.5 * b, .5 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(1 * b, 0); + a.lineTo(.5 * b, .5 * c); + a.lineTo(.5 * b, 1 * c); + P(a); + b = a.o; + u.q(a); + return b + }, BpmnTaskMessage: function (a, b, c) { + a = u.p(); + M(a, 0, .2 * c, !0); + a.lineTo(1 * b, .2 * c); + a.lineTo(1 * b, .8 * c); + a.lineTo(0, .8 * c); + a.lineTo(0, .8 * c); + P(a); + M(a, 0, .2 * c, !1); + a.lineTo(.5 * b, .5 * c); + a.lineTo(1 * b, .2 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, BpmnTaskScript: function (a, b, c) { + a = u.p(); + M(a, .7 * b, 1 * c, !0); + a.lineTo(.3 * b, 1 * c); + O(a, .6 * b, .5 * c, 0, .5 * c, .3 * b, 0); + a.lineTo(.7 * b, + 0); + O(a, .4 * b, .5 * c, 1 * b, .5 * c, .7 * b, 1 * c); + P(a); + M(a, .45 * b, .73 * c, !1); + a.lineTo(.7 * b, .73 * c); + a.moveTo(.38 * b, .5 * c); + a.lineTo(.63 * b, .5 * c); + a.moveTo(.31 * b, .27 * c); + a.lineTo(.56 * b, .27 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, BpmnTaskUser: function (a, b, c) { + a = u.p(); + M(a, 0, 0, !1); + M(a, .335 * b, (1 - .555) * c, !0); + a.lineTo(.335 * b, .595 * c); + a.lineTo(.665 * b, .595 * c); + a.lineTo(.665 * b, (1 - .555) * c); + O(a, .88 * b, .46 * c, .98 * b, .54 * c, 1 * b, .68 * c); + a.lineTo(1 * b, 1 * c); + a.lineTo(0, 1 * c); + a.lineTo(0, .68 * c); + O(a, .02 * b, .54 * c, .12 * b, .46 * c, .335 * b, (1 - .555) * c); + a.lineTo(.365 * + b, .405 * c); + var d = .5 - .285, e = Math.PI / 4, f = 4 * (1 - Math.cos(e)) / (3 * Math.sin(e)), e = f * d, f = f * d; + O(a, (.5 - (e + d) / 2) * b, (d + (d + f) / 2) * c, (.5 - d) * b, (d + f) * c, (.5 - d) * b, d * c); + O(a, (.5 - d) * b, (d - f) * c, (.5 - e) * b, (d - d) * c, .5 * b, (d - d) * c); + O(a, (.5 + e) * b, (d - d) * c, (.5 + d) * b, (d - f) * c, (.5 + d) * b, d * c); + O(a, (.5 + d) * b, (d + f) * c, (.5 + (e + d) / 2) * b, (d + (d + f) / 2) * c, .635 * b, .405 * c); + a.lineTo(.635 * b, .405 * c); + a.lineTo(.665 * b, (1 - .555) * c); + a.lineTo(.665 * b, .595 * c); + a.lineTo(.335 * b, .595 * c); + M(a, .2 * b, 1 * c, !1); + a.lineTo(.2 * b, .8 * c); + M(a, .8 * b, 1 * c, !1); + a.lineTo(.8 * b, .8 * c); + b = a.o; + u.q(a); + return b + }, BpmnEventConditional: function (a, b, c) { + a = u.p(); + M(a, .1 * b, 0, !0); + a.lineTo(.9 * b, 0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.1 * b, 1 * c); + P(a); + M(a, .2 * b, .2 * c, !1); + a.lineTo(.8 * b, .2 * c); + a.moveTo(.2 * b, .4 * c); + a.lineTo(.8 * b, .4 * c); + a.moveTo(.2 * b, .6 * c); + a.lineTo(.8 * b, .6 * c); + a.moveTo(.2 * b, .8 * c); + a.lineTo(.8 * b, .8 * c); + a.$a(!1); + b = a.o; + u.q(a); + return b + }, BpmnEventError: function (a, b, c) { + a = u.p(); + M(a, 0, 1 * c, !0); + a.lineTo(.33 * b, 0); + a.lineTo(.66 * b, .5 * c); + a.lineTo(1 * b, 0); + a.lineTo(.66 * b, 1 * c); + a.lineTo(.33 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, BpmnEventEscalation: function (a, + b, c) { + a = u.p(); + M(a, 0, 0, !1); + M(a, 1 * b, 1 * c, !1); + M(a, .1 * b, 1 * c, !0); + a.lineTo(.5 * b, 0); + a.lineTo(.9 * b, 1 * c); + a.lineTo(.5 * b, .5 * c); + P(a); + b = a.o; + u.q(a); + return b + }, BpmnEventTimer: function (a, b, c) { + a = u.p(); + var d = .5 * K.sa; + M(a, 1 * b, .5 * c, !0); + O(a, 1 * b, (.5 + d) * c, (.5 + d) * b, 1 * c, .5 * b, 1 * c); + O(a, (.5 - d) * b, 1 * c, 0, (.5 + d) * c, 0, .5 * c); + O(a, 0, (.5 - d) * c, (.5 - d) * b, 0, .5 * b, 0); + O(a, (.5 + d) * b, 0, 1 * b, (.5 - d) * c, 1 * b, .5 * c); + M(a, .5 * b, 0, !1); + a.lineTo(.5 * b, .15 * c); + a.moveTo(.5 * b, 1 * c); + a.lineTo(.5 * b, .85 * c); + a.moveTo(0, .5 * c); + a.lineTo(.15 * b, .5 * c); + a.moveTo(1 * b, .5 * c); + a.lineTo(.85 * + b, .5 * c); + a.moveTo(.5 * b, .5 * c); + a.lineTo(.58 * b, .1 * c); + a.moveTo(.5 * b, .5 * c); + a.lineTo(.78 * b, .54 * c); + a.$a(!1); + b = a.o; + b.Bd = sh; + u.q(a); + return b + } + }; + for (var In in K.qg) K.qg[In.toLowerCase()] = In; + K.Hv = { + "": "", + Standard: "F1 m 0,0 l 8,4 -8,4 2,-4 z", + Backward: "F1 m 8,0 l -2,4 2,4 -8,-4 z", + Triangle: "F1 m 0,0 l 8,4.62 -8,4.62 z", + BackwardTriangle: "F1 m 8,4 l 0,4 -8,-4 8,-4 0,4 z", + Boomerang: "F1 m 0,0 l 8,4 -8,4 4,-4 -4,-4 z", + BackwardBoomerang: "F1 m 8,0 l -8,4 8,4 -4,-4 4,-4 z", + SidewaysV: "m 0,0 l 8,4 -8,4 0,-1 6,-3 -6,-3 0,-1 z", + BackwardV: "m 8,0 l -8,4 8,4 0,-1 -6,-3 6,-3 0,-1 z", + OpenTriangle: "m 0,0 l 8,4 -8,4", + BackwardOpenTriangle: "m 8,0 l -8,4 8,4", + OpenTriangleLine: "m 0,0 l 8,4 -8,4 m 8.5,0 l 0,-8", + BackwardOpenTriangleLine: "m 8,0 l -8,4 8,4 m -8.5,0 l 0,-8", + OpenTriangleTop: "m 0,0 l 8,4 m 0,4", + BackwardOpenTriangleTop: "m 8,0 l -8,4 m 0,4", + OpenTriangleBottom: "m 0,8 l 8,-4", + BackwardOpenTriangleBottom: "m 0,4 l 8,4", + HalfTriangleTop: "F1 m 0,0 l 0,4 8,0 z m 0,8", + BackwardHalfTriangleTop: "F1 m 8,0 l 0,4 -8,0 z m 0,8", + HalfTriangleBottom: "F1 m 0,4 l 0,4 8,-4 z", + BackwardHalfTriangleBottom: "F1 m 8,4 l 0,4 -8,-4 z", + ForwardSemiCircle: "m 4,0 b 270 180 0 4 4", + BackwardSemiCircle: "m 4,8 b 90 180 0 -4 4", + Feather: "m 0,0 l 3,4 -3,4", + BackwardFeather: "m 3,0 l -3,4 3,4", + DoubleFeathers: "m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4", + BackwardDoubleFeathers: "m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4", + TripleFeathers: "m 0,0 l 3,4 -3,4 m 3,-8 l 3,4 -3,4 m 3,-8 l 3,4 -3,4", + BackwardTripleFeathers: "m 3,0 l -3,4 3,4 m 3,-8 l -3,4 3,4 m 3,-8 l -3,4 3,4", + ForwardSlash: "m 0,8 l 5,-8", + BackSlash: "m 0,0 l 5,8", + DoubleForwardSlash: "m 0,8 l 4,-8 m -2,8 l 4,-8", + DoubleBackSlash: "m 0,0 l 4,8 m -2,-8 l 4,8", + TripleForwardSlash: "m 0,8 l 4,-8 m -2,8 l 4,-8 m -2,8 l 4,-8", + TripleBackSlash: "m 0,0 l 4,8 m -2,-8 l 4,8 m -2,-8 l 4,8", + Fork: "m 0,4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4", + BackwardFork: "m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4", + LineFork: "m 0,0 l 0,8 m 0,-4 l 8,0 m -8,0 l 8,-4 m -8,4 l 8,4", + BackwardLineFork: "m 8,4 l -8,0 m 8,0 l -8,-4 m 8,4 l -8,4 m 8,-8 l 0,8", + CircleFork: "F1 m 6,4 b 0 360 -3 0 3 z m 0,0 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", + BackwardCircleFork: "F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 6,0 b 0 360 -3 0 3", + CircleLineFork: "F1 m 6,4 b 0 360 -3 0 3 z m 1,-4 l 0,8 m 0,-4 l 6,0 m -6,0 l 6,-4 m -6,4 l 6,4", + BackwardCircleLineFork: "F1 m 0,4 l 6,0 m -6,-4 l 6,4 m -6,4 l 6,-4 m 0,-4 l 0,8 m 7,-4 b 0 360 -3 0 3", + Circle: "F1 m 8,4 b 0 360 -4 0 4 z", + Block: "F1 m 0,0 l 0,8 8,0 0,-8 z", + StretchedDiamond: "F1 m 0,3 l 5,-3 5,3 -5,3 -5,-3 z", + Diamond: "F1 m 0,4 l 4,-4 4,4 -4,4 -4,-4 z", + Chevron: "F1 m 0,0 l 5,0 3,4 -3,4 -5,0 3,-4 -3,-4 z", + StretchedChevron: "F1 m 0,0 l 8,0 3,4 -3,4 -8,0 3,-4 -3,-4 z", + NormalArrow: "F1 m 0,2 l 4,0 0,-2 4,4 -4,4 0,-2 -4,0 z", + X: "m 0,0 l 8,8 m 0,-8 l -8,8", + TailedNormalArrow: "F1 m 0,0 l 2,0 1,2 3,0 0,-2 2,4 -2,4 0,-2 -3,0 -1,2 -2,0 1,-4 -1,-4 z", + DoubleTriangle: "F1 m 0,0 l 4,4 -4,4 0,-8 z m 4,0 l 4,4 -4,4 0,-8 z", + BigEndArrow: "F1 m 0,0 l 5,2 0,-2 3,4 -3,4 0,-2 -5,2 0,-8 z", + ConcaveTailArrow: "F1 m 0,2 h 4 v -2 l 4,4 -4,4 v -2 h -4 l 2,-2 -2,-2 z", + RoundedTriangle: "F1 m 0,1 a 1,1 0 0 1 1,-1 l 7,3 a 0.5,1 0 0 1 0,2 l -7,3 a 1,1 0 0 1 -1,-1 l 0,-6 z", + SimpleArrow: "F1 m 1,2 l -1,-2 2,0 1,2 -1,2 -2,0 1,-2 5,0 0,-2 2,2 -2,2 0,-2 z", + AccelerationArrow: "F1 m 0,0 l 0,8 0.2,0 0,-8 -0.2,0 z m 2,0 l 0,8 1,0 0,-8 -1,0 z m 3,0 l 2,0 2,4 -2,4 -2,0 0,-8 z", + BoxArrow: "F1 m 0,0 l 4,0 0,2 2,0 0,-2 2,4 -2,4 0,-2 -2,0 0,2 -4,0 0,-8 z", + TriangleLine: "F1 m 8,4 l -8,-4 0,8 8,-4 z m 0.5,4 l 0,-8", + CircleEndedArrow: "F1 m 10,4 l -2,-3 0,2 -2,0 0,2 2,0 0,2 2,-3 z m -4,0 b 0 360 -3 0 3 z", + DynamicWidthArrow: "F1 m 0,3 l 2,0 2,-1 2,-2 2,4 -2,4 -2,-2 -2,-1 -2,0 0,-2 z", + EquilibriumArrow: "m 0,3 l 8,0 -3,-3 m 3,5 l -8,0 3,3", + FastForward: "F1 m 0,0 l 3.5,4 0,-4 3.5,4 0,-4 1,0 0,8 -1,0 0,-4 -3.5,4 0,-4 -3.5,4 0,-8 z", + Kite: "F1 m 0,4 l 2,-4 6,4 -6,4 -2,-4 z", + HalfArrowTop: "F1 m 0,0 l 4,4 4,0 -8,-4 z m 0,8", + HalfArrowBottom: "F1 m 0,8 l 4,-4 4,0 -8,4 z", + OpposingDirectionDoubleArrow: "F1 m 0,4 l 2,-4 0,2 4,0 0,-2 2,4 -2,4 0,-2 -4,0 0,2 -2,-4 z", + PartialDoubleTriangle: "F1 m 0,0 4,3 0,-3 4,4 -4,4 0,-3 -4,3 0,-8 z", + LineCircle: "F1 m 0,0 l 0,8 m 7 -4 b 0 360 -3 0 3 z", + DoubleLineCircle: "F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z", + TripleLineCircle: "F1 m 0,0 l 0,8 m 2,-8 l 0,8 m 2,-8 l 0,8 m 7 -4 b 0 360 -3 0 3 z", + CircleLine: "F1 m 6 4 b 0 360 -3 0 3 z m 1,-4 l 0,8", + DiamondCircle: "F1 m 8,4 l -4,4 -4,-4 4,-4 4,4 m 8,0 b 0 360 -4 0 4 z", + PlusCircle: "F1 m 8,4 b 0 360 -4 0 4 l -8 0 z m -4 -4 l 0 8", + OpenRightTriangleTop: "m 8,0 l 0,4 -8,0 m 0,4", + OpenRightTriangleBottom: "m 8,8 l 0,-4 -8,0", + Line: "m 0,0 l 0,8", + DoubleLine: "m 0,0 l 0,8 m 2,0 l 0,-8", + TripleLine: "m 0,0 l 0,8 m 2,0 l 0,-8 m 2,0 l 0,8", + PentagonArrow: "F1 m 8,4 l -4,-4 -4,0 0,8 4,0 4,-4 z" + }; + K.jI = function () { + if (null !== K.Hv) { + for (var a in K.Hv) { + var b = sd(K.Hv[a], !1); + K.Qi[a] = b; + a.toLowerCase() !== a && (K.Qi[a.toLowerCase()] = a) + } + K.Hv = null + } + }; + K.UC = function (a) { + K.jI(); + var b = K.Qi[a]; + if (void 0 === b) { + b = a.toLowerCase(); + if ("none" === b) return "None"; + b = K.Qi[b] + } + return "string" === typeof b ? b : b instanceof $c ? a : null + }; + + function G(a) { + 0 === arguments.length ? A.call(this) : A.call(this, a); + this.O = 311807; + this.wk = this.Vh = ""; + this.ur = this.rr = this.Dr = this.xq = null; + this.Fr = ""; + this.Th = this.Er = this.bm = null; + this.tr = ""; + this.Vn = null; + this.sr = (new ia(NaN, NaN)).freeze(); + this.vr = ""; + this.Wn = null; + this.ie = ""; + this.Bu = this.Gp = this.kk = null; + this.Mg = (new w(NaN, NaN)).freeze(); + this.Eq = ""; + this.zk = null; + this.Fq = xb; + this.Oq = K.fF; + this.Hq = K.eF; + this.Qp = null; + this.yq = Jn; + this.em = (new w(6, 6)).freeze(); + this.dm = "gray"; + this.cm = 4; + this.BB = -1; + this.qF = new z; + this.Bk = + null; + this.kj = NaN + } + + u.Ga(G, A); + u.fa("Part", G); + G.prototype.cloneProtected = function (a) { + A.prototype.cloneProtected.call(this, a); + a.O = this.O & -4097 | 49152; + a.Vh = this.Vh; + a.wk = this.wk; + a.xq = this.xq; + a.Dr = this.Dr; + a.rr = this.rr; + a.ur = this.ur; + a.Fr = this.Fr; + a.Er = this.Er; + a.Th = null; + a.tr = this.tr; + a.sr.assign(this.sr); + a.vr = this.vr; + a.ie = this.ie; + a.Gp = this.Gp; + a.Mg.assign(this.Mg); + a.Eq = this.Eq; + a.Fq = this.Fq.Z(); + a.Oq = this.Oq.Z(); + a.Hq = this.Hq.Z(); + a.Qp = this.Qp; + a.yq = this.yq; + a.em.assign(this.em); + a.dm = this.dm; + a.cm = this.cm + }; + G.prototype.Mh = function (a) { + A.prototype.Mh.call(this, a); + a.dl(); + a.bm = null; + a.Vn = null; + a.Wn = null; + a.zk = null; + a.Bk = null + }; + G.prototype.toString = function () { + var a = u.rg(Object.getPrototypeOf(this)) + "#" + u.Uc(this); + null !== this.data && (a += "(" + de(this.data) + ")"); + return a + }; + G.LayoutNone = 0; + var Jj; + G.LayoutAdded = Jj = 1; + var Rj; + G.LayoutRemoved = Rj = 2; + G.LayoutShown = 4; + G.LayoutHidden = 8; + G.LayoutNodeSized = 16; + var Ik; + G.LayoutGroupLayout = Ik = 32; + G.LayoutNodeReplaced = 64; + var Jn; + G.LayoutStandard = Jn = Jj | Rj | 28 | Ik | 64; + G.LayoutAll = 16777215; + G.prototype.Lm = function (a, b, c, d, e, f, h) { + var k = this.g; + null !== k && (a === be && "elements" === b ? e instanceof A ? Kj(e, function (a) { + Mj(k, a); + Lj(k, a) + }) : e instanceof Ri && uk(k, e) : a === ce && "elements" === b && (e instanceof A ? Kj(e, function (a) { + Qj(k, a); + Pj(k, a) + }) : e instanceof Ri && vk(k, e)), k.Dc(a, b, c, d, e, f, h)) + }; + G.prototype.updateTargetBindings = G.prototype.Nb = function (a) { + A.prototype.Nb.call(this, a); + if (null !== this.data) { + a = this.ya.n; + for (var b = a.length, c = 0; c < b; c++) { + var d = a[c]; + d instanceof A && Kj(d, function (a) { + null !== a.data && a.Nb() + }) + } + } + }; + G.prototype.updateRelationshipsFromData = function () { + var a = this.data; + if (null !== a) { + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof Q) { + var d = c.Bm(a), b = b.zG(d), e = this.Ra; + b !== e && (b = null !== e ? c.wb(e.data) : void 0, e = c.Vo, "function" === typeof e ? e(a, b) : a[e] = b, c.Fw(a, d)) + } + } + } + }; + u.u(G, {zv: "adornments"}, function () { + return null === this.Th ? Ia : this.Th.RD + }); + G.prototype.findAdornment = G.prototype.xo = function (a) { + var b = this.Th; + return null === b ? null : b.ta(a) + }; + G.prototype.addAdornment = G.prototype.Kk = function (a, b) { + if (null !== b) { + var c = null, d = this.Th; + null !== d && (c = d.ta(a)); + if (c !== b) { + if (null !== c) { + var e = c.g; + null !== e && e.remove(c) + } + null === d && (this.Th = d = new la("string", lf)); + b.Vh !== a && (b.Kc = a); + d.add(a, b); + c = this.g; + null !== c && (c.add(b), b.data = this.data) + } + } + }; + G.prototype.removeAdornment = G.prototype.ol = function (a) { + var b = this.Th; + if (null !== b) { + var c = b.ta(a); + if (null !== c) { + var d = c.g; + null !== d && d.remove(c) + } + b.remove(a); + 0 === b.count && (this.Th = null) + } + }; + G.prototype.clearAdornments = G.prototype.ls = function () { + var a = this.Th; + if (null !== a) { + for (var b = u.eb(), a = a.i; a.next();) b.push(a.key); + for (var a = b.length, c = 0; c < a; c++) this.ol(b[c]); + u.ra(b) + } + }; + G.prototype.updateAdornments = function () { + var a = this.g; + if (null !== a) { + a:{ + if (this.Za && this.dI) { + var b = this.nt; + if (!(null !== b && this.ba.J() && this.Ea() && b.kl() && b.ba.J())) break a; + var c = this.xo("Selection"); + if (null === c) { + c = this.eI; + null === c && (c = this instanceof W ? a.sH : this instanceof V ? a.MG : a.HH); + if (!(c instanceof lf)) break a; + nf(c); + c = c.copy(); + null !== c && (c.Kc = "Selection", c.vc = b) + } + if (null !== c) { + var d = c.placeholder; + if (null !== d) { + var e = b.Hi(), f = 0; + b instanceof X && (f = b.hb); + var h = u.ul(); + h.m((b.Ha.width + f) * e, (b.Ha.height + + f) * e); + d.xa = h; + u.Oj(h) + } + c.angle = b.Zk(); + c.type !== ah && (d = u.K(), c.location = b.lb(xb, d), u.v(d)); + this.Kk("Selection", c); + break a + } + } + this.ol("Selection") + } + Kn(this, a); + for (a = this.zv; a.next();) b = a.value, b.Nb(), b.R() + } + }; + + function Kn(a, b) { + b.tb.cf.each(function (b) { + b.isEnabled && b.updateAdornments(a) + }) + } + + u.u(G, {layer: "layer"}, function () { + return this.Bu + }); + u.u(G, {g: "diagram"}, function () { + var a = this.Bu; + return null !== a ? a.g : null + }); + u.defineProperty(G, {wf: "layerName"}, function () { + return this.wk + }, function (a) { + var b = this.wk; + if (b !== a) { + u.j(a, "string", G, "layerName"); + var c = this.g; + if (null === c || null !== c.ws(a) && !c.Vm) if (this.wk = a, null !== c && c.pc(), this.h("layerName", b, a), b = this.layer, null !== b && b.name !== a && (c = b.g, null !== c && (a = c.ws(a), null !== a && a !== b))) { + var d = b.Fe(-1, this, !0); + 0 <= d && c.Dc(ce, "parts", b, this, null, d, !0); + d = a.Eo(99999999, this, !0); + 0 <= d && c.Dc(be, "parts", a, null, this, !0, d); + d = this.Rs; + if (null !== d) { + var e = c.Na; + c.Na = !0; + d(this, b, a); + c.Na = e + } + } + } + }); + u.defineProperty(G, {Rs: "layerChanged"}, function () { + return this.xq + }, function (a) { + var b = this.xq; + b !== a && (null !== a && u.j(a, "function", G, "layerChanged"), this.xq = a, this.h("layerChanged", b, a)) + }); + G.prototype.invalidateAdornments = G.prototype.Zd = function () { + var a = this.g; + null !== a && (cj(a), 0 !== (this.O & 16384) !== !0 && (this.O |= 16384, a.de())) + }; + + function ui(a) { + 0 !== (a.O & 16384) !== !1 && (a.updateAdornments(), a.O &= -16385, a = a.g, null !== a && (a.Md = !0)) + } + + u.defineProperty(G, {location: "location"}, function () { + return this.Mg + }, function (a) { + var b = this.Mg; + if (!(b.L(a) || this instanceof W)) { + a = a.Z(); + var c = this.g; + this.Mg = a; + if (!1 === Bj(this)) { + var d = this.Ma, e = a.x - b.x, f = a.y - b.y, h = d.copy(); + d.m(h.x + e, h.y + f); + Kl(this, !1); + !d.L(h) && c && this.h("position", h, d) + } + this.h("location", b, a) + } + }); + + function Kl(a, b) { + if (!1 === Cj(a)) { + var c = a.g; + null !== c && (c.Xf.add(a), a instanceof U && !c.ha.gb && a.sf(), b || c.de()); + Ln(a, !0) + } + } + + function Mn(a) { + if (!1 !== Cj(a)) { + var b = a.position, c = a.location; + c.J() && b.J() || (Nn(a, b, c), a.Jg()); + var b = a.Ma, c = a.Xb, d = c.copy(); + c.La(); + c.x = b.x; + c.y = b.y; + c.freeze(); + a.sw(d, c); + Ln(a, !1) + } + } + + u.u(G, {ec: "locationObject"}, function () { + if (null === this.zk) { + var a = this.zz; + "" !== a ? (a = this.je(a), this.zk = null !== a ? a : this) : this.zk = this instanceof lf ? this.type !== ah && null !== this.placeholder ? this.placeholder : this : this + } + return this.zk.visible ? this.zk : this + }); + u.defineProperty(G, {AH: "minLocation"}, function () { + return this.Oq + }, function (a) { + var b = this.Oq; + b.L(a) || (this.Oq = a = a.Z(), this.h("minLocation", b, a)) + }); + u.defineProperty(G, {vH: "maxLocation"}, function () { + return this.Hq + }, function (a) { + var b = this.Hq; + b.L(a) || (this.Hq = a = a.Z(), this.h("maxLocation", b, a)) + }); + u.defineProperty(G, {zz: "locationObjectName"}, function () { + return this.Eq + }, function (a) { + var b = this.Eq; + b !== a && (this.Eq = a, this.zk = null, El(this), this.h("locationObjectName", b, a)) + }); + u.defineProperty(G, {Ze: "locationSpot"}, function () { + return this.Fq + }, function (a) { + var b = this.Fq; + b.L(a) || (this.Fq = a = a.Z(), El(this), this.h("locationSpot", b, a)) + }); + G.prototype.move = G.prototype.move = function (a) { + this.position = a + }; + G.prototype.moveTo = G.prototype.moveTo = function (a, b) { + var c = u.fc(a, b); + this.move(c); + u.v(c) + }; + G.prototype.isVisible = G.prototype.Ea = function () { + if (!this.visible) return !1; + var a = this.layer; + if (null !== a && !a.visible) return !1; + a = this.Ra; + if (!(null === a || a.be && a.Ea())) return !1; + if (this instanceof U) { + a = this.zm(); + if (null !== a && !a.Vc) return !1; + a = this.ce; + if (null !== a) return a.Ea() + } else if (this instanceof W) { + var b = !0, c = this.g; + null !== c && (b = c.qd); + c = this.W; + if (null !== c) { + if (this.Bc && b && !c.Vc) return !1; + if (c === a) return !0; + c = c.findVisibleNode(); + if (null === c || c === a) return !1 + } + c = this.ca; + if (null !== c) { + if (this.Bc && !b && !c.Vc) return !1; + if (c === a) return !0; + b = c.findVisibleNode(); + if (null === b || b === a) return !1 + } + } + return !0 + }; + G.prototype.He = function (a) { + var b = this.g; + a ? (this.H(4), this.Zd(), null !== b && b.Xf.add(this)) : (this.H(8), this.ls()); + null !== b && (b.pc(), b.ma()) + }; + G.prototype.findObject = G.prototype.je = function (a) { + if (this.name === a) return this; + var b = this.Bk; + null === b && (this.Bk = b = new pa); + if (void 0 !== b[a]) return b[a]; + for (var c = this.ya.n, d = c.length, e = 0; e < d; e++) { + var f = c[e]; + if (f.name === a) return b[a] = f; + if (f instanceof A) if (null === f.gi && null === f.Zf) { + if (f = f.je(a), null !== f) return b[a] = f + } else if (sk(f) && (f = f.ya.first(), null !== f && f.name === a)) return b[a] = f + } + return b[a] = null + }; + + function On(a, b, c, d) { + void 0 === d && (d = new w); + c.ne() && (c = Ib); + var e = b.Ha; + d.m(e.width * c.x + c.offsetX, e.height * c.y + c.offsetY); + if (null === b || b === a) return d; + b.transform.ab(d); + for (b = b.S; null !== b && b !== a;) b.transform.ab(d), b = b.S; + a.yk.ab(d); + d.offset(-a.Pc.x, -a.Pc.y); + return d + } + + G.prototype.ensureBounds = G.prototype.pf = function () { + Ph(this, Infinity, Infinity); + this.zc() + }; + + function yi(a, b) { + var c; + c = a.qF; + var d; + isNaN(a.kj) && (a.kj = Tm(a)); + d = a.kj; + var e = 2 * d; + if (!a.il) return c.m(b.x - 1 - d, b.y - 1 - d, b.width + 2 + e, b.height + 2 + e), c; + d = b.x; + var e = b.y, f = b.width, h = b.height, k = a.shadowBlur, l = a.kI, f = f + k, h = h + k; + d -= k / 2; + e -= k / 2; + 0 < l.x ? f += l.x : (d += l.x, f -= l.x); + 0 < l.y ? h += l.y : (e += l.y, h -= l.y); + c.m(d - 1, e - 1, f + 2, h + 2); + return c + } + + g = G.prototype; + g.zc = function () { + this.Jg(); + if (!1 === Bj(this)) Mn(this); else { + var a = u.Sf(); + a.assign(this.Xb); + wl(this); + this.Xb.La(); + var b = ti(this); + this.xi(0, 0, this.Pc.width, this.Pc.height); + var c = this.position; + Nn(this, c, this.location); + var d = this.Xb; + d.x = c.x; + d.y = c.y; + d.freeze(); + this.Jg(); + this.sw(a, d); + a.L(d) ? this.xf(b) : !this.Fd() || K.D(a.width, d.width) && K.D(a.height, d.height) || 0 <= this.BB && this.H(16); + u.ic(a); + Ln(this, !1) + } + }; + g.sw = function (a, b) { + rl(this, !1); + var c = this.g; + if (null !== c) { + this.dl(); + var d = !1, e = a.J(); + if (!1 === c.ei) { + var f = c.Cd, h = c.padding, k = f.x + h.left, l = f.y + h.top, m = f.width - 2 * h.right, + f = f.height - 2 * h.bottom; + e && a.x > k && a.y > l && a.right < m && a.bottom < f && b.x > k && b.y > l && b.right < m && b.bottom < f && (d = !0) + } + 0 !== (this.O & 65536) !== !0 && a.L(b) || Nj(this, d, c); + c.ma() + } + }; + g.dA = function (a, b) { + if (!a.J() || this instanceof W) return !1; + var c = this.g; + if (null !== c && !(this instanceof lf)) { + var d = this.g.Uh; + d.ld && ii(d, this, "position", b.copy(), a.copy()) + } + if (null !== c && !0 === c.ha.gb) return !0; + c = this.Mg; + d = c.copy(); + c.m(c.x + (a.x - b.x), c.y + (a.y - b.y)); + this.Ma = a; + !1 === Cj(this) && !1 === Bj(this) && (Kl(this, !1), this.Jg(), Mn(this)); + c.L(d) || this.h("location", d, c); + return !0 + }; + g.GE = function (a, b) { + var c = this.Mg; + !1 === Cj(this) && !1 === Bj(this) ? (this.Mg.m(c.x + a - this.Ma.x, c.y + b - this.Ma.y), this.Ma.m(a, b), Kl(this, !0), this.Jg()) : (c.m(NaN, NaN), this.Ma.m(a, b)) + }; + + function Nn(a, b, c) { + var d = NaN, e = NaN, f = u.K(), h = a.Ze, k = a.ec; + h.ne() && u.k("determineOffset: Part's locationSpot must be real: " + h.toString()); + var l = k.Ha, d = 0; + k.hb && (d = k.Sg); + f.rt(0, 0, l.width + d, l.height + d, h); + if (k !== a) for (k.hb && f.offset(-d / 2, -d / 2), k.transform.ab(f), h = k.S; null !== h && h !== a;) h.transform.ab(f), h = h.S; + a.yk.ab(f); + f.offset(-a.Pc.x, -a.Pc.y); + h = a.g; + c.J() ? (k = b.x, l = b.y, d = c.x - f.x, e = c.y - f.y, b.m(d, e), c = !1, null !== h && (d = h.Uh, d.dj ? c = !0 : !d.ld || a instanceof lf || ii(d, a, "position", new w(k, l), b), c || b.x === k && b.y === + l || (d = h.cb, h.cb = !0, a.h("position", new w(k, l), b), h.cb = d))) : b.J() && (d = b.x, e = b.y, b = c.copy(), c.m(d + f.x, e + f.y), c.L(b) || null === h || (d = h.cb, h.cb = !0, a.h("location", b, c), h.cb = d)); + u.v(f) + } + + function Nj(a, b, c) { + sl(a, !1); + a instanceof U && Qk(c, a); + a.layer.Ac || b || c.pc(); + b = a.Xb; + var d = c.ob; + d.J() ? (ti(a) ? jb(b, d) || a.xf(!1) : b.sg(d) && a.xf(!0), a.updateAdornments()) : c.uk = !0 + } + + g.hl = function () { + return !0 + }; + + function wi(a, b) { + var c = a.Xb; + if (0 !== c.width && 0 !== c.height && !isNaN(c.x) && !isNaN(c.y) && a.Ea()) { + var d = a.transform, e = a.S, f = a.Xm; + f.reset(); + null !== e && (e.Tf() ? f.multiply(e.Ff) : null !== e.S && f.multiply(e.S.Ff)); + f.multiply(a.Sd); + null !== a.lc && (yl(a, b, a.lc, !0, !0), b.fillRect(c.x, c.y, c.width, c.height)); + null === a.lc && null === a.Ib && (yl(a, b, "rgba(0,0,0,0.4)", !0, !1), b.fillRect(c.x, c.y, c.width, c.height)); + null !== a.Ib && (d.Os() || b.transform(d.m11, d.m12, d.m21, d.m22, d.dx, d.dy), e = a.Ha, c = e.width, e = e.height, yl(a, b, a.Ib, !0, !1), + b.fillRect(0, 0, c + 0, e + 0), d.Os() || (c = 1 / (d.m11 * d.m22 - d.m12 * d.m21), b.transform(d.m22 * c, -d.m12 * c, -d.m21 * c, d.m11 * c, c * (d.m21 * d.dy - d.m22 * d.dx), c * (d.m12 * d.dx - d.m11 * d.dy)))) + } + } + + g.Fd = function () { + return !0 + }; + u.defineProperty(G, {Kc: "category"}, function () { + return this.Vh + }, function (a) { + var b = this.Vh; + if (b !== a) { + u.j(a, "string", G, "category"); + var c = this.g, d = this.data, e = null; + if (null !== c && null !== d && !(this instanceof lf)) { + var f = c.ga.ha; + f.isEnabled && !f.gb && (e = this.clone(), e.ya.Td(this.ya)) + } + this.Vh = a; + this.h("category", b, a); + null === c || null === d || this instanceof lf ? (e = this.Kh, null !== e && (a = e.Th, null !== a && a.remove(b), e.Kk(this.Kc, this))) : (f = c.ga, f.ha.gb || (this instanceof W ? (f instanceof Q ? f.EE(d, a) : f instanceof qe && f.hI(d, + a), c = Ck(c, a), null !== c && (nf(c), c = c.copy(), null !== c && Pn(this, c, b, a))) : (null !== f && f.Dw(d, a), c = zk(c, d, a), null !== c && (nf(c), c = c.copy(), null === c || c instanceof W || (c.location = this.location, Pn(this, c, b, a)))), null !== e && (b = this.clone(), b.ya.Td(this.ya), this.h("self", e, b)))) + } + }); + u.defineProperty(G, {self: "self"}, function () { + return this + }, function (a) { + Pn(this, a, this.Kc, a.Kc) + }); + var Qn = !1; + + function Pn(a, b, c, d) { + b.constructor === a.constructor || Qn || (Qn = !0, u.trace('Should not change the class of the Part when changing category from "' + c + '" to "' + d + '"'), u.trace(" Old class: " + u.rg(a) + ", new class: " + u.rg(b) + ", part: " + a.toString())); + a.ls(); + var e = a.data; + c = a.wf; + var f = a.Za, h = a.Wg, k = !0, l = !0, m = !1; + if (a instanceof U) var n = a, k = n.Ji, l = n.Vc, m = n.kp; + b.Mh(a); + b.cloneProtected(a); + a.Vh = d; + a.R(); + a.ma(); + b = a.g; + d = !0; + null !== b && (d = b.cb, b.cb = !0); + a.qh = e; + null !== e && a.Nb(); + null !== b && (b.cb = d); + e = a.wf; + e !== c && (a.wk = c, + a.wf = e); + a instanceof U && (n = a, n.Ji = k, n.Vc = l, n.kp = m, n.Fd() && n.H(64)); + a.Za = f; + a.Wg = h + } + + G.prototype.canCopy = function () { + if (!this.iG) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Ij) return !1; + a = a.g; + return null === a ? !0 : a.Ij ? !0 : !1 + }; + G.prototype.canDelete = function () { + if (!this.pG) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.lm) return !1; + a = a.g; + return null === a ? !0 : a.lm ? !0 : !1 + }; + G.prototype.canEdit = function () { + if (!this.uI) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Ev) return !1; + a = a.g; + return null === a ? !0 : a.Ev ? !0 : !1 + }; + G.prototype.canGroup = function () { + if (!this.NG) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Bv) return !1; + a = a.g; + return null === a ? !0 : a.Bv ? !0 : !1 + }; + G.prototype.canMove = function () { + if (!this.FH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Nk) return !1; + a = a.g; + return null === a ? !0 : a.Nk ? !0 : !1 + }; + G.prototype.canReshape = function () { + if (!this.TH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Cv) return !1; + a = a.g; + return null === a ? !0 : a.Cv ? !0 : !1 + }; + G.prototype.canResize = function () { + if (!this.UH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.hs) return !1; + a = a.g; + return null === a ? !0 : a.hs ? !0 : !1 + }; + G.prototype.canRotate = function () { + if (!this.XH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.Dv) return !1; + a = a.g; + return null === a ? !0 : a.Dv ? !0 : !1 + }; + G.prototype.canSelect = function () { + if (!this.pl) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.of) return !1; + a = a.g; + return null === a ? !0 : a.of ? !0 : !1 + }; + u.defineProperty(G, {iG: "copyable"}, function () { + return 0 !== (this.O & 1) + }, function (a) { + var b = 0 !== (this.O & 1); + b !== a && (this.O ^= 1, this.h("copyable", b, a)) + }); + u.defineProperty(G, {pG: "deletable"}, function () { + return 0 !== (this.O & 2) + }, function (a) { + var b = 0 !== (this.O & 2); + b !== a && (this.O ^= 2, this.h("deletable", b, a)) + }); + u.defineProperty(G, {uI: "textEditable"}, function () { + return 0 !== (this.O & 4) + }, function (a) { + var b = 0 !== (this.O & 4); + b !== a && (this.O ^= 4, this.h("textEditable", b, a), this.Zd()) + }); + u.defineProperty(G, {NG: "groupable"}, function () { + return 0 !== (this.O & 8) + }, function (a) { + var b = 0 !== (this.O & 8); + b !== a && (this.O ^= 8, this.h("groupable", b, a)) + }); + u.defineProperty(G, {FH: "movable"}, function () { + return 0 !== (this.O & 16) + }, function (a) { + var b = 0 !== (this.O & 16); + b !== a && (this.O ^= 16, this.h("movable", b, a)) + }); + u.defineProperty(G, {dI: "selectionAdorned"}, function () { + return 0 !== (this.O & 32) + }, function (a) { + var b = 0 !== (this.O & 32); + b !== a && (this.O ^= 32, this.h("selectionAdorned", b, a), this.Zd()) + }); + u.defineProperty(G, {uz: "isInDocumentBounds"}, function () { + return 0 !== (this.O & 64) + }, function (a) { + var b = 0 !== (this.O & 64); + if (b !== a) { + this.O ^= 64; + var c = this.g; + null !== c && c.pc(); + this.h("isInDocumentBounds", b, a) + } + }); + u.defineProperty(G, {OD: "isLayoutPositioned"}, function () { + return 0 !== (this.O & 128) + }, function (a) { + var b = 0 !== (this.O & 128); + b !== a && (this.O ^= 128, this.h("isLayoutPositioned", b, a), this.H(a ? 4 : 8)) + }); + u.defineProperty(G, {pl: "selectable"}, function () { + return 0 !== (this.O & 256) + }, function (a) { + var b = 0 !== (this.O & 256); + b !== a && (this.O ^= 256, this.h("selectable", b, a), this.Zd()) + }); + u.defineProperty(G, {TH: "reshapable"}, function () { + return 0 !== (this.O & 512) + }, function (a) { + var b = 0 !== (this.O & 512); + b !== a && (this.O ^= 512, this.h("reshapable", b, a), this.Zd()) + }); + u.defineProperty(G, {UH: "resizable"}, function () { + return 0 !== (this.O & 1024) + }, function (a) { + var b = 0 !== (this.O & 1024); + b !== a && (this.O ^= 1024, this.h("resizable", b, a), this.Zd()) + }); + u.defineProperty(G, {XH: "rotatable"}, function () { + return 0 !== (this.O & 2048) + }, function (a) { + var b = 0 !== (this.O & 2048); + b !== a && (this.O ^= 2048, this.h("rotatable", b, a), this.Zd()) + }); + u.defineProperty(G, {Za: "isSelected"}, function () { + return 0 !== (this.O & 4096) + }, function (a) { + var b = 0 !== (this.O & 4096); + if (b !== a) { + var c = this.g; + if (!a || this.canSelect() && !(null !== c && c.selection.count >= c.wH)) { + this.O ^= 4096; + var d = !1; + if (null !== c) { + d = c.cb; + c.cb = !0; + var e = c.selection; + e.La(); + a ? e.add(this) : e.remove(this); + e.freeze() + } + this.h("isSelected", b, a); + this.Zd(); + a = this.fI; + null !== a && a(this); + null !== c && (c.de(), c.cb = d) + } + } + }); + u.defineProperty(G, {Wg: "isHighlighted"}, function () { + return 0 !== (this.O & 524288) + }, function (a) { + var b = 0 !== (this.O & 524288); + if (b !== a) { + this.O ^= 524288; + var c = this.g; + null !== c && (c = c.bw, c.La(), a ? c.add(this) : c.remove(this), c.freeze()); + this.h("isHighlighted", b, a); + this.ma() + } + }); + u.defineProperty(G, {il: "isShadowed"}, function () { + return 0 !== (this.O & 8192) + }, function (a) { + var b = 0 !== (this.O & 8192); + b !== a && (this.O ^= 8192, this.h("isShadowed", b, a), this.ma()) + }); + + function Cj(a) { + return 0 !== (a.O & 32768) + } + + function Ln(a, b) { + a.O = b ? a.O | 32768 : a.O & -32769 + } + + function sl(a, b) { + a.O = b ? a.O | 65536 : a.O & -65537 + } + + function ti(a) { + return 0 !== (a.O & 131072) + } + + G.prototype.xf = function (a) { + this.O = a ? this.O | 131072 : this.O & -131073 + }; + + function Rn(a, b) { + a.O = b ? a.O | 1048576 : a.O & -1048577 + } + + u.defineProperty(G, {JD: "isAnimated"}, function () { + return 0 !== (this.O & 262144) + }, function (a) { + var b = 0 !== (this.O & 262144); + b !== a && (this.O ^= 262144, this.h("isAnimated", b, a)) + }); + u.defineProperty(G, {Zz: "selectionObjectName"}, function () { + return this.Fr + }, function (a) { + var b = this.Fr; + b !== a && (this.Fr = a, this.bm = null, this.h("selectionObjectName", b, a)) + }); + u.defineProperty(G, {eI: "selectionAdornmentTemplate"}, function () { + return this.Dr + }, function (a) { + var b = this.Dr; + b !== a && (this instanceof W && (a.type = ah), this.Dr = a, this.h("selectionAdornmentTemplate", b, a)) + }); + u.u(G, {nt: "selectionObject"}, function () { + if (null === this.bm) { + var a = this.Zz; + null !== a && "" !== a ? (a = this.je(a), this.bm = null !== a ? a : this) : this instanceof W ? (a = this.path, this.bm = null !== a ? a : this) : this.bm = this + } + return this.bm + }); + u.defineProperty(G, {fI: "selectionChanged"}, function () { + return this.Er + }, function (a) { + var b = this.Er; + b !== a && (null !== a && u.j(a, "function", G, "selectionChanged"), this.Er = a, this.h("selectionChanged", b, a)) + }); + u.defineProperty(G, {rE: "resizeAdornmentTemplate"}, function () { + return this.rr + }, function (a) { + var b = this.rr; + b !== a && (this.rr = a, this.h("resizeAdornmentTemplate", b, a)) + }); + u.defineProperty(G, {tE: "resizeObjectName"}, function () { + return this.tr + }, function (a) { + var b = this.tr; + b !== a && (this.tr = a, this.Vn = null, this.h("resizeObjectName", b, a)) + }); + u.u(G, {sE: "resizeObject"}, function () { + if (null === this.Vn) { + var a = this.tE; + null !== a && "" !== a ? (a = this.je(a), this.Vn = null !== a ? a : this) : this.Vn = this + } + return this.Vn + }); + u.defineProperty(G, {VH: "resizeCellSize"}, function () { + return this.sr + }, function (a) { + var b = this.sr; + b.L(a) || (this.sr = a = a.Z(), this.h("resizeCellSize", b, a)) + }); + u.defineProperty(G, {YH: "rotateAdornmentTemplate"}, function () { + return this.ur + }, function (a) { + var b = this.ur; + b !== a && (this.ur = a, this.h("rotateAdornmentTemplate", b, a)) + }); + u.defineProperty(G, {ZH: "rotateObjectName"}, function () { + return this.vr + }, function (a) { + var b = this.vr; + b !== a && (this.vr = a, this.Wn = null, this.h("rotateObjectName", b, a)) + }); + u.u(G, {vE: "rotateObject"}, function () { + if (null === this.Wn) { + var a = this.ZH; + null !== a && "" !== a ? (a = this.je(a), this.Wn = null !== a ? a : this) : this.Wn = this + } + return this.Wn + }); + u.defineProperty(G, {text: "text"}, function () { + return this.ie + }, function (a) { + var b = this.ie; + b !== a && (this.ie = a, this.h("text", b, a)) + }); + u.defineProperty(G, {Ra: "containingGroup"}, function () { + return this.kk + }, function (a) { + if (this.Fd()) { + var b = this.kk; + if (b !== a) { + null === a || this !== a && !a.Ph(this) || (this === a && u.k("Cannot make a Group a member of itself: " + this.toString()), u.k("Cannot make a Group indirectly contain itself: " + this.toString() + " already contains " + a.toString())); + this.H(Rj); + var c = this.g; + null !== b ? Sn(b, this) : this instanceof V && null !== c && c.Ik.remove(this); + this.kk = a; + null !== a ? Tn(a, this) : this instanceof V && null !== c && c.Ik.add(this); + this.H(Jj); + if (null !== c) { + var d = this.data, e = c.ga; + null !== d && e instanceof Q && e.Fw(d, e.wb(null !== a ? a.data : null)) + } + d = this.bD; + null !== d && (e = !0, null !== c && (e = c.Na, c.Na = !0), d(this, b, a), null !== c && (c.Na = e)); + if (this instanceof V) for (c = new F(G), kf(c, this, !0, 0, !0), c = c.i; c.next();) if (d = c.value, d instanceof U) for (d = d.oe; d.next();) xk(d.value); + if (this instanceof U) for (d = this.oe; d.next();) xk(d.value); + this.h("containingGroup", b, a); + null !== a && a.Jw() + } + } else u.k("cannot set the Part.containingGroup of a Link or Adornment") + }); + g = G.prototype; + g.dl = function () { + var a = this.Ra; + null !== a && (a.R(), null !== a.Pb && a.Pb.R(), a.sf()) + }; + g.ma = function () { + var a = this.g; + null !== a && !Bj(this) && !Cj(this) && this.Ea() && this.Xb.J() && a.ma(yi(this, this.Xb)) + }; + g.Js = function (a) { + var b = this.kk; + null === b || a || Tn(b, this) + }; + g.Ks = function (a) { + var b = this.kk; + null === b || a || Sn(b, this) + }; + g.xm = function () { + var a = this.data; + if (null !== a) { + var b = this.g; + null !== b && (b = b.ga, null !== b && b.Vz(a)) + } + }; + u.defineProperty(G, {bD: "containingGroupChanged"}, function () { + return this.Gp + }, function (a) { + var b = this.Gp; + b !== a && (null !== a && u.j(a, "function", G, "containingGroupChanged"), this.Gp = a, this.h("containingGroupChanged", b, a)) + }); + G.prototype.findSubGraphLevel = function () { + return Un(this, this) + }; + + function Un(a, b) { + var c = b.Ra; + return null !== c ? 1 + Un(a, c) : b instanceof U && (c = b.ce, null !== c) ? Un(a, c) : 0 + } + + G.prototype.findTopLevelPart = function () { + return Vn(this, this) + }; + + function Vn(a, b) { + var c = b.Ra; + return null !== c ? Vn(a, c) : b instanceof U && (c = b.ce, null !== c) ? Vn(a, c) : b + } + + u.u(G, {Ho: "isTopLevel"}, function () { + return null !== this.Ra || this instanceof U && this.tf ? !1 : !0 + }); + G.prototype.isMemberOf = G.prototype.Ph = function (a) { + return a instanceof V ? Wn(this, this, a) : !1 + }; + + function Wn(a, b, c) { + if (b === c || null === c) return !1; + var d = b.Ra; + return null === d || d !== c && !Wn(a, d, c) ? b instanceof U && (b = b.ce, null !== b) ? Wn(a, b, c) : !1 : !0 + } + + G.prototype.findCommonContainingGroup = G.prototype.yG = function (a) { + if (null === a) return null; + if (this === a) return this instanceof V ? this : null; + for (var b = this; null !== b;) b instanceof V && Rn(b, !0), b = b.Ra; + for (var c = null, b = a; null !== b;) { + if (0 !== (b.O & 1048576)) { + c = b; + break + } + b = b.Ra + } + for (b = this; null !== b;) b instanceof V && Rn(b, !1), b = b.Ra; + return c + }; + u.defineProperty(G, {nH: "layoutConditions"}, function () { + return this.yq + }, function (a) { + var b = this.yq; + b !== a && (this.yq = a, this.h("layoutConditions", b, a)) + }); + G.prototype.canLayout = function () { + if (!this.OD || !this.Ea()) return !1; + var a = this.layer; + return null !== a && a.Ac || this instanceof U && this.tf ? !1 : !0 + }; + G.prototype.invalidateLayout = G.prototype.H = function (a) { + void 0 === a && (a = 16777215); + var b; + this.OD && 0 !== (a & this.nH) ? (b = this.layer, null !== b && b.Ac || this instanceof U && this.tf ? b = !1 : (b = this.g, b = null !== b && b.ha.gb ? !1 : !0)) : b = !1; + if (b) if (b = this.kk, null !== b) { + var c = b.Qb; + null !== c ? c.H() : b.H(a) + } else a = this.g, null !== a && (c = a.Qb, null !== c && c.H()) + }; + + function Oj(a) { + if (!a.Ea()) return !1; + a = a.layer; + return null !== a && a.Ac ? !1 : !0 + } + + u.defineProperty(G, {mD: "dragComputation"}, function () { + return this.Qp + }, function (a) { + var b = this.Qp; + b !== a && (null !== a && u.j(a, "function", G, "dragComputation"), this.Qp = a, this.h("dragComputation", b, a)) + }); + u.defineProperty(G, {kI: "shadowOffset"}, function () { + return this.em + }, function (a) { + var b = this.em; + b.L(a) || (this.em = a = a.Z(), this.ma(), this.h("shadowOffset", b, a)) + }); + u.defineProperty(G, {shadowColor: "shadowColor"}, function () { + return this.dm + }, function (a) { + var b = this.dm; + b !== a && (this.dm = a, this.ma(), this.h("shadowColor", b, a)) + }); + u.defineProperty(G, {shadowBlur: "shadowBlur"}, function () { + return this.cm + }, function (a) { + var b = this.cm; + b !== a && (this.cm = a, this.ma(), this.h("shadowBlur", b, a)) + }); + + function lf(a) { + 0 === arguments.length ? G.call(this, vh) : G.call(this, a); + this.wf = "Adornment"; + this.Gb = null; + this.O &= -257; + this.Mg = new w(NaN, NaN); + this.Vi = new E(z); + this.Pb = null + } + + u.Ga(lf, G); + u.fa("Adornment", lf); + lf.prototype.toString = function () { + var a = this.Kh; + return "Adornment(" + this.Kc + ")" + (null !== a ? a.toString() : "") + }; + lf.prototype.updateRelationshipsFromData = function () { + }; + lf.prototype.Xs = function () { + var a = this.vc.T, b = this.vc; + if (a instanceof W && b instanceof X) { + var c = a.path, b = c.Pa; + a.Xs(); + for (var b = c.Pa, a = this.ya.n, c = a.length, d = 0; d < c; d++) { + var e = a[d]; + e.tg && e instanceof X && (e.Pa = b) + } + } + }; + u.u(lf, {placeholder: "placeholder"}, function () { + return this.Pb + }); + u.defineProperty(lf, {vc: "adornedObject"}, function () { + return this.Gb + }, function (a) { + var b = this.Kh, c = null; + null !== a && (c = a.T); + null === b || null !== a && b === c || b.ol(this.Kc); + this.Gb = a; + null !== c && c.Kk(this.Kc, this) + }); + u.u(lf, {Kh: "adornedPart"}, function () { + var a = this.Gb; + return null !== a ? a.T : null + }); + lf.prototype.hl = function () { + var a = this.Gb; + if (null === a) return !0; + a = a.T; + return null === a || !Bj(a) + }; + lf.prototype.Fd = function () { + return !1 + }; + u.u(lf, {Ra: "containingGroup"}, function () { + return null + }); + lf.prototype.Lm = function (a, b, c, d, e, f, h) { + if (a === be && "elements" === b) if (e instanceof ph) { + var k = e; + null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of an Adornment.") + } else e instanceof A && (k = e.vs(function (a) { + return a instanceof ph + }), k instanceof ph && (null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of an Adornment."))); else a === ce && "elements" === b && null !== this.Pb && (d === this.Pb ? this.Pb = null : d instanceof A && + this.Pb.gl(d) && (this.Pb = null)); + G.prototype.Lm.call(this, a, b, c, d, e, f, h) + }; + lf.prototype.updateAdornments = function () { + }; + lf.prototype.xm = function () { + }; + + function U(a) { + 0 === arguments.length ? G.call(this, vh) : G.call(this, a); + this.hc = new E(W); + this.Kn = this.xk = this.Bq = this.Aq = null; + this.qq = !0; + this.$r = !1; + this.Vr = null; + this.zp = this.rq = !0; + this.Ap = K.iF; + this.Qd = this.nh = null; + this.kr = Xn; + this.Fj = !1 + } + + u.Ga(U, G); + u.fa("Node", U); + U.prototype.cloneProtected = function (a) { + G.prototype.cloneProtected.call(this, a); + a.Aq = this.Aq; + a.Bq = this.Bq; + a.xk = this.xk; + a.qq = this.qq; + a.$r = this.$r; + a.Vr = this.Vr; + a.rq = this.rq; + a.zp = this.zp; + a.Ap = this.Ap.Z(); + a.kr = this.kr + }; + U.prototype.Mh = function (a) { + G.prototype.Mh.call(this, a); + a.sf(); + a.nh = this.nh; + a.Qd = null + }; + var Yn; + U.DirectionDefault = Yn = u.s(U, "DirectionDefault", 0); + U.DirectionAbsolute = u.s(U, "DirectionAbsolute", 1); + var Zn; + U.DirectionRotatedNode = Zn = u.s(U, "DirectionRotatedNode", 2); + var jl; + U.DirectionRotatedNodeOrthogonal = jl = u.s(U, "DirectionRotatedNodeOrthogonal", 3); + U.SpreadingNone = u.s(U, "SpreadingNone", 10); + var Xn; + U.SpreadingEvenly = Xn = u.s(U, "SpreadingEvenly", 11); + var $n; + U.SpreadingPacked = $n = u.s(U, "SpreadingPacked", 12); + + function ao(a, b) { + null !== b && (null === a.nh && (a.nh = new F(bo)), a.nh.add(b)) + } + + U.prototype.Lm = function (a, b, c, d, e, f, h) { + a === be && "elements" === b ? this.Qd = null : a === ce && "elements" === b && (null === this.g ? this.Qd = null : d instanceof S && Pm(this, d, function (a, b) { + Ll(a, b, !0) + })); + G.prototype.Lm.call(this, a, b, c, d, e, f, h) + }; + U.prototype.invalidateConnectedLinks = U.prototype.sf = function (a) { + void 0 === a && (a = null); + for (var b = this.oe; b.next();) { + var c = b.value; + null !== a && a.contains(c) || (co(this, c.od), co(this, c.fe), c.Vb()) + } + }; + + function co(a, b) { + if (null !== b) { + b.jr = null; + var c = a.Ra; + null === c || c.be || co(c, c.Xk("")) + } + } + + U.prototype.hl = function () { + return !0 + }; + u.defineProperty(U, {NH: "portSpreading"}, function () { + return this.kr + }, function (a) { + var b = this.kr; + b !== a && (this.kr = a, this.h("portSpreading", b, a), a = this.g, null !== a && a.ha.gb || this.sf()) + }); + u.defineProperty(U, {TC: "avoidable"}, function () { + return this.zp + }, function (a) { + var b = this.zp; + if (b !== a) { + this.zp = a; + var c = this.g; + null !== c && Qk(c, this); + this.h("avoidable", b, a) + } + }); + u.defineProperty(U, {RF: "avoidableMargin"}, function () { + return this.Ap + }, function (a) { + "number" === typeof a ? a = new rb(a) : u.C(a, rb, U, "avoidableMargin"); + var b = this.Ap; + if (!b.L(a)) { + this.Ap = a = a.Z(); + var c = this.g; + null !== c && Qk(c, this); + this.h("avoidableMargin", b, a) + } + }); + U.prototype.canAvoid = function () { + return this.TC && !this.tf + }; + U.prototype.getAvoidableRect = function (a) { + a.set(this.ba); + a.yv(this.RF); + return a + }; + U.prototype.findVisibleNode = function () { + for (var a = this; null !== a && !a.Ea();) a = a.Ra; + return a + }; + U.prototype.He = function (a) { + G.prototype.He.call(this, a); + for (var b = this.oe; b.next();) b.value.He(a) + }; + u.u(U, {oe: "linksConnected"}, function () { + return this.hc.i + }); + U.prototype.findLinksConnected = U.prototype.qD = function (a) { + void 0 === a && (a = null); + if (null === a) return this.hc.i; + var b = new Ka(this.hc), c = this; + b.Km = function (b) { + return b.W === c && b.pg === a || b.ca === c && b.lh === a + }; + return b + }; + U.prototype.findLinksOutOf = U.prototype.Wv = function (a) { + void 0 === a && (a = null); + var b = new Ka(this.hc), c = this; + b.Km = function (b) { + return b.W !== c ? !1 : null === a ? !0 : b.pg === a + }; + return b + }; + U.prototype.findLinksInto = U.prototype.og = function (a) { + void 0 === a && (a = null); + var b = new Ka(this.hc), c = this; + b.Km = function (b) { + return b.ca !== c ? !1 : null === a ? !0 : b.lh === a + }; + return b + }; + U.prototype.findNodesConnected = U.prototype.rD = function (a) { + void 0 === a && (a = null); + for (var b = null, c = null, d = this.hc.i; d.next();) { + var e = d.value; + if (e.W === this) { + if (null === a || e.pg === a) e = e.ca, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e + } else e.ca !== this || null !== a && e.lh !== a || (e = e.W, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e) + } + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findNodesOutOf = function (a) { + void 0 === a && (a = null); + for (var b = null, c = null, d = this.hc.i; d.next();) { + var e = d.value; + e.W !== this || null !== a && e.pg !== a || (e = e.ca, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e) + } + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findNodesInto = function (a) { + void 0 === a && (a = null); + for (var b = null, c = null, d = this.hc.i; d.next();) { + var e = d.value; + e.ca !== this || null !== a && e.lh !== a || (e = e.W, null !== b ? b.add(e) : null !== c && c !== e ? (b = new F(U), b.add(c), b.add(e)) : c = e) + } + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findLinksBetween = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + var d = new Ka(this.hc), e = this; + d.Km = function (d) { + return (d.W !== e || d.ca !== a || null !== b && d.pg !== b || null !== c && d.lh !== c) && (d.W !== a || d.ca !== e || null !== c && d.pg !== c || null !== b && d.lh !== b) ? !1 : !0 + }; + return d + }; + U.prototype.findLinksTo = function (a, b, c) { + void 0 === b && (b = null); + void 0 === c && (c = null); + var d = new Ka(this.hc), e = this; + d.Km = function (d) { + return d.W !== e || d.ca !== a || null !== b && d.pg !== b || null !== c && d.lh === c ? !1 : !0 + }; + return d + }; + u.defineProperty(U, {pH: "linkConnected"}, function () { + return this.Aq + }, function (a) { + var b = this.Aq; + b !== a && (null !== a && u.j(a, "function", U, "linkConnected"), this.Aq = a, this.h("linkConnected", b, a)) + }); + u.defineProperty(U, {qH: "linkDisconnected"}, function () { + return this.Bq + }, function (a) { + var b = this.Bq; + b !== a && (null !== a && u.j(a, "function", U, "linkDisconnected"), this.Bq = a, this.h("linkDisconnected", b, a)) + }); + u.defineProperty(U, {pw: "linkValidation"}, function () { + return this.xk + }, function (a) { + var b = this.xk; + b !== a && (null !== a && u.j(a, "function", U, "linkValidation"), this.xk = a, this.h("linkValidation", b, a)) + }); + + function eo(a, b, c) { + co(a, c); + if (!a.hc.contains(b)) { + a.hc.add(b); + var d = a.pH; + if (null !== d) { + var e = !0, f = a.g; + null !== f && (e = f.Na, f.Na = !0); + d(a, b, c); + null !== f && (f.Na = e) + } + b.Bc && (c = b.W, b = b.ca, null !== c && null !== b && c !== b && (d = !0, f = a.g, null !== f && (d = f.qd), a = d ? b : c, e = d ? c : b, a.Fj || (a.Fj = e), !e.Ji || null !== f && f.ha.gb || (d ? c === e && (e.Ji = !1) : b === e && (e.Ji = !1)))) + } + } + + function fo(a, b, c) { + co(a, c); + if (a.hc.remove(b)) { + var d = a.qH, e = a.g; + if (null !== d) { + var f = !0; + null !== e && (f = e.Na, e.Na = !0); + d(a, b, c); + null !== e && (e.Na = f) + } + b.Bc && (c = !0, null !== e && (c = e.qd), a = c ? b.ca : b.W, b = c ? b.W : b.ca, null !== a && (a.Fj = !1), null === b || b.Ji || (0 === b.hc.count ? (b.Fj = null, null !== e && e.ha.gb || (b.Ji = !0)) : Jk(b))) + } + } + + function Jk(a) { + a.Fj = !1; + if (0 !== a.hc.count) { + var b = !0, c = a.g; + if (null === c || !c.ha.gb) { + null !== c && (b = c.qd); + for (c = a.hc.i; c.next();) { + var d = c.value; + if (d.Bc) if (b) { + if (d.W === a) { + a.Ji = !1; + return + } + } else if (d.ca === a) { + a.Ji = !1; + return + } + } + a.Ji = !0 + } + } + } + + U.prototype.updateRelationshipsFromData = function () { + G.prototype.updateRelationshipsFromData.call(this); + var a = this.data; + if (null !== a) { + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof qe) { + var d = c.Cm(a), b = b.Xe(d), e = this.zm(); + b !== e && (b = null !== e ? c.wb(e.data) : void 0, e = c.Wo, "function" === typeof e ? e(a, b) : a[e] = b, c.ih(a, d)) + } + } + } + }; + U.prototype.Js = function (a) { + G.prototype.Js.call(this, a); + a || Jk(this); + var b = this.Kn; + null === b || a || ho(b, this) + }; + U.prototype.Ks = function (a) { + G.prototype.Ks.call(this, a); + var b = this.Kn; + null === b || a || null === b.ue || (b.ue.remove(this), b.R()) + }; + U.prototype.xm = function () { + if (0 < this.hc.count) { + var a = this.g; + if (null === a) return; + for (var b = this.hc.copy().i; b.next();) a.remove(b.value) + } + this.ce = null; + G.prototype.xm.call(this) + }; + u.u(U, {tf: "isLinkLabel"}, function () { + return null !== this.Kn + }); + u.defineProperty(U, {ce: "labeledLink"}, function () { + return this.Kn + }, function (a) { + var b = this.Kn; + if (b !== a) { + var c = this.g, d = this.data; + if (null !== b && (null !== b.ue && (b.ue.remove(this), b.R()), null !== c && null !== d && !c.ha.gb)) { + var e = b.data, f = c.ga; + if (null !== e && f instanceof Q) { + var h = f.wb(d); + void 0 !== h && f.mE(e, h) + } + } + this.Kn = a; + null !== a && (ho(a, this), null === c || null === d || c.ha.gb || (e = a.data, f = c.ga, null !== e && f instanceof Q && (h = f.wb(d), void 0 !== h && f.Ly(e, h)))); + El(this); + this.h("labeledLink", b, a) + } + }); + U.prototype.findPort = U.prototype.Xk = function (a) { + if (null === this.Qd) { + if ("" === a && !1 === this.xh) return this; + Ml(this) + } + var b = this.Qd.ta(a); + return null !== b || "" !== a && (b = this.Qd.ta(""), null !== b) ? b : this + }; + u.u(U, {port: "port"}, function () { + return this.Xk("") + }); + u.u(U, {ports: "ports"}, function () { + null === this.Qd && Ml(this); + return this.Qd.RD + }); + + function Ml(a) { + null === a.Qd ? a.Qd = new la("string", S) : a.Qd.clear(); + Pm(a, a, function (a, c) { + var d = c.Jd; + null !== d && a.Qd.add(d, c) + }); + 0 === a.Qd.count && a.Qd.add("", a) + } + + function Ll(a, b, c) { + var d = b.Jd; + if (null !== d && (null !== a.Qd && a.Qd.remove(d), b = a.g, null !== b && c)) { + c = null; + for (d = a.qD(d); d.next();) a = d.value, null === c && (c = u.eb()), c.push(a); + if (null !== c) { + for (d = 0; d < c.length; d++) a = c[d], b.remove(a); + u.ra(c) + } + } + } + + U.prototype.isInTreeOf = function (a) { + if (null === a || a === this) return !1; + var b = !0, c = this.g; + null !== c && (b = c.qd); + c = this; + if (b) for (; c !== a;) { + for (var b = null, d = c.hc.i; d.next();) { + var e = d.value; + if (e.Bc && (b = e.W, b !== c && b !== this)) break + } + if (b === this || null === b || b === c) return !1; + c = b + } else for (; c !== a;) { + b = null; + for (d = c.hc.i; d.next() && (e = d.value, !e.Bc || (b = e.ca, b === c || b === this));) ; + if (b === this || null === b || b === c) return !1; + c = b + } + return !0 + }; + U.prototype.findTreeRoot = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + b = this; + if (a) for (; ;) { + for (var a = null, c = b.hc.i; c.next();) { + var d = c.value; + if (d.Bc && (a = d.W, a !== b && a !== this)) break + } + if (a === this) return this; + if (null === a || a === b) return b; + b = a + } else for (; ;) { + a = null; + for (c = b.hc.i; c.next() && (d = c.value, !d.Bc || (a = d.ca, a === b || a === this));) ; + if (a === this) return this; + if (null === a || a === b) return b; + b = a + } + }; + U.prototype.findCommonTreeParent = function (a) { + if (null === a) return null; + if (this === a) return this; + for (var b = this; null !== b;) Rn(b, !0), b = b.zm(); + for (var c = null, b = a; null !== b;) { + if (0 !== (b.O & 1048576)) { + c = b; + break + } + b = b.zm() + } + for (b = this; null !== b;) Rn(b, !1), b = b.zm(); + return c + }; + U.prototype.findTreeParentLink = U.prototype.As = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + b = this.hc.i; + if (a) for (; b.next();) { + if (a = b.value, a.Bc && a.W !== this) return a + } else for (; b.next();) if (a = b.value, a.Bc && a.ca !== this) return a; + return null + }; + U.prototype.findTreeParentNode = U.prototype.zm = function () { + var a = this.Fj; + if (null === a) return null; + if (a instanceof U) return a; + var b = !0, a = this.g; + null !== a && (b = a.qd); + a = this.hc.i; + if (b) for (; a.next();) { + if (b = a.value, b.Bc && (b = b.W, b !== this)) return this.Fj = b + } else for (; a.next();) if (b = a.value, b.Bc && (b = b.ca, b !== this)) return this.Fj = b; + return this.Fj = null + }; + U.prototype.findTreeLevel = function () { + return io(this, this) + }; + + function io(a, b) { + var c = b.zm(); + return null === c ? 0 : 1 + io(a, c) + } + + U.prototype.findTreeChildrenLinks = U.prototype.Yv = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + if (a) { + var a = new Ka(this.hc), c = this; + a.Km = function (a) { + return a.Bc && a.W === c ? !0 : !1 + } + } else a = new Ka(this.hc), c = this, a.Km = function (a) { + return a.Bc && a.ca === c ? !0 : !1 + }; + return a + }; + U.prototype.findTreeChildrenNodes = U.prototype.tD = function () { + var a = !0, b = this.g; + null !== b && (a = b.qd); + var c = b = null, d = this.hc.i; + if (a) for (; d.next();) a = d.value, a.Bc && a.W === this && (a = a.ca, null !== b ? b.add(a) : null !== c && c !== a ? (b = new E(U), b.add(c), b.add(a)) : c = a); else for (; d.next();) a = d.value, a.Bc && a.ca === this && (a = a.W, null !== b ? b.add(a) : null !== c && c !== a ? (b = new E(U), b.add(c), b.add(a)) : c = a); + return null !== b ? b.i : null !== c ? new Ja(c) : Ia + }; + U.prototype.findTreeParts = function (a) { + void 0 === a && (a = Infinity); + u.j(a, "number", U, "collapseTree:level"); + var b = new F(G); + kf(b, this, !1, a, !0); + return b + }; + U.prototype.collapseTree = U.prototype.collapseTree = function (a) { + void 0 === a && (a = 1); + u.ze(a, U, "collapseTree:level"); + 1 > a && (a = 1); + var b = this.g; + if (null !== b && !b.me) { + var c = b.Lb; + 0 !== b.ha.Le && c.ml(); + b.me = !0; + var c = b.qd, d = new F(U); + d.add(this); + jo(this, d, c, a, this.Vc); + b.me = !1 + } + }; + + function jo(a, b, c, d, e) { + if (1 < d) for (e = c ? a.Wv() : a.og(); e.next();) { + var f = e.value; + f.Bc && (f = f.hz(a), null === f || f === a || b.contains(f) || (b.add(f), jo(f, b, c, d - 1, f.Vc))) + } else ko(a, b, c, e) + } + + function ko(a, b, c, d) { + for (var e = c ? a.Wv() : a.og(); e.next();) { + var f = e.value; + f.Bc && (f = f.hz(a), null === f || f === a || b.contains(f) || (b.add(f), d && (f.dl(), f.He(!1)), f.Vc && (f.kp = f.Vc, ko(f, b, c, f.kp)))) + } + a.Vc = !1 + } + + U.prototype.expandTree = U.prototype.expandTree = function (a) { + void 0 === a && (a = 2); + u.ze(a, U, "expandTree:level"); + 2 > a && (a = 2); + var b = this.g; + if (null !== b && !b.me) { + var c = b.Lb; + 0 !== b.ha.Le && c.ml(); + b.me = !0; + var d = b.qd, e = new F(U); + e.add(this); + lo(this, e, d, a, this.Vc, c, this); + b.me = !1 + } + }; + + function lo(a, b, c, d, e, f, h) { + for (var k = c ? a.Wv() : a.og(); k.next();) { + var l = k.value; + l.Bc && (e || l.hg || l.Vb(), l = l.hz(a), null !== l && l !== a && !b.contains(l) && (b.add(l), e || (l.He(!0), l.dl(), ri(f, l, h)), 2 < d || l.kp)) && (l.kp = !1, lo(l, b, c, d - 1, l.Vc, f, h)) + } + a.Vc = !0 + } + + u.defineProperty(U, {Vc: "isTreeExpanded"}, function () { + return this.qq + }, function (a) { + var b = this.qq; + if (b !== a) { + this.qq = a; + var c = this.g; + this.h("isTreeExpanded", b, a); + b = this.zI; + if (null !== b) { + var d = !0; + null !== c && (d = c.Na, c.Na = !0); + b(this); + null !== c && (c.Na = d) + } + a ? null === c || c.me || (0 !== c.ha.Le && c.Lb.ml(), c.me = !0, a = c.qd, b = new F(U), b.add(this), lo(this, b, a, 2, !1, c.Lb, this), c.me = !1) : null === c || c.me || (0 !== c.ha.Le && c.Lb.ml(), c.me = !0, a = c.qd, b = new F(U), b.add(this), ko(this, b, a, !0), c.me = !1) + } + }); + u.defineProperty(U, {kp: "wasTreeExpanded"}, function () { + return this.$r + }, function (a) { + var b = this.$r; + b !== a && (this.$r = a, this.h("wasTreeExpanded", b, a)) + }); + u.defineProperty(U, {zI: "treeExpandedChanged"}, function () { + return this.Vr + }, function (a) { + var b = this.Vr; + b !== a && (null !== a && u.j(a, "function", U, "treeExpandedChanged"), this.Vr = a, this.h("treeExpandedChanged", b, a)) + }); + u.defineProperty(U, {Ji: "isTreeLeaf"}, function () { + return this.rq + }, function (a) { + var b = this.rq; + b !== a && (this.rq = a, this.h("isTreeLeaf", b, a)) + }); + + function W() { + G.call(this, ah); + this.Wf = null; + this.wh = ""; + this.gg = this.Yp = null; + this.Ih = ""; + this.Ur = null; + this.qr = this.pr = this.or = !1; + this.sq = !0; + this.tp = dh; + this.Hp = 0; + this.Kp = dh; + this.Lp = NaN; + this.Yl = Xl; + this.Kr = .5; + this.ue = null; + this.Qc = (new E(w)).freeze(); + this.Xn = this.we = null; + this.hg = !1; + this.py = null; + this.zy = !1; + this.an = this.di = this.Pa = null; + this.hf = 0; + this.nn = this.jn = null; + this.Vi = new E(z); + this.Dy = new w; + this.qC = this.oC = null; + this.jx = !1; + this.Q = null + } + + u.Ga(W, G); + u.fa("Link", W); + W.prototype.cloneProtected = function (a) { + G.prototype.cloneProtected.call(this, a); + a.wh = this.wh; + a.Yp = this.Yp; + a.Ih = this.Ih; + a.Ur = this.Ur; + a.or = this.or; + a.pr = this.pr; + a.qr = this.qr; + a.sq = this.sq; + a.tp = this.tp; + a.Hp = this.Hp; + a.Kp = this.Kp; + a.Lp = this.Lp; + a.Yl = this.Yl; + a.Kr = this.Kr; + a.Q = null !== this.Q ? this.Q.copy() : null + }; + W.prototype.Mh = function (a) { + G.prototype.Mh.call(this, a); + this.wh = a.wh; + this.Ih = a.Ih; + a.we = null; + a.Vb(); + a.an = this.an; + a.hf = this.hf + }; + var Xl; + W.Normal = Xl = u.s(W, "Normal", 1); + W.Orthogonal = u.s(W, "Orthogonal", 2); + W.AvoidsNodes = u.s(W, "AvoidsNodes", 6); + var mo; + W.AvoidsNodesStraight = mo = u.s(W, "AvoidsNodesStraight", 7); + var dh; + W.None = dh = u.s(W, "None", 0); + var kh; + W.Bezier = kh = u.s(W, "Bezier", 9); + var ch; + W.JumpGap = ch = u.s(W, "JumpGap", 10); + var bh; + W.JumpOver = bh = u.s(W, "JumpOver", 11); + var Ul; + W.End = Ul = u.s(W, "End", 17); + var Vl; + W.Scale = Vl = u.s(W, "Scale", 18); + var Wl; + W.Stretch = Wl = u.s(W, "Stretch", 19); + var en; + W.OrientAlong = en = u.s(W, "OrientAlong", 21); + var no; + W.OrientPlus90 = no = u.s(W, "OrientPlus90", 22); + var oo; + W.OrientMinus90 = oo = u.s(W, "OrientMinus90", 23); + var po; + W.OrientOpposite = po = u.s(W, "OrientOpposite", 24); + var qo; + W.OrientUpright = qo = u.s(W, "OrientUpright", 25); + var ro; + W.OrientPlus90Upright = ro = u.s(W, "OrientPlus90Upright", 26); + var so; + W.OrientMinus90Upright = so = u.s(W, "OrientMinus90Upright", 27); + var to; + W.OrientUpright45 = to = u.s(W, "OrientUpright45", 28); + W.prototype.Ee = function () { + this.Q = new il + }; + W.prototype.hl = function () { + var a = this.W; + if (null !== a) { + var b = a.findVisibleNode(); + null !== b && (a = b); + if (Bj(a) || Cj(a)) return !1 + } + a = this.ca; + return null !== a && (b = a.findVisibleNode(), null !== b && (a = b), Bj(a) || Cj(a)) ? !1 : !0 + }; + W.prototype.dA = function () { + return !1 + }; + W.prototype.Fd = function () { + return !1 + }; + W.prototype.computeAngle = function (a, b, c) { + a = 0; + switch (b) { + default: + case dh: + a = 0; + break; + case en: + a = c; + break; + case no: + a = c + 90; + break; + case oo: + a = c - 90; + break; + case po: + a = c + 180; + break; + case qo: + a = K.ct(c); + 90 < a && 270 > a && (a -= 180); + break; + case ro: + a = K.ct(c + 90); + 90 < a && 270 > a && (a -= 180); + break; + case so: + a = K.ct(c - 90); + 90 < a && 270 > a && (a -= 180); + break; + case to: + a = K.ct(c); + if (45 < a && 135 > a || 225 < a && 315 > a) return 0; + 90 < a && 270 > a && (a -= 180) + } + return K.ct(a) + }; + u.defineProperty(W, {W: "fromNode"}, function () { + return this.Wf + }, function (a) { + var b = this.Wf; + if (b !== a) { + var c = this.od; + null !== b && (this.gg !== b && fo(b, this, c), uo(this), this.H(Rj)); + this.Wf = a; + this.di = null; + this.Vb(); + var d = this.g; + if (null !== d) { + var e = this.data, f = d.ga; + if (null !== e) if (f instanceof Q) { + var h = null !== a ? a.data : null; + f.Ew(e, f.wb(h)) + } else f instanceof qe && (h = null !== a ? a.data : null, d.qd ? f.ih(e, f.wb(h)) : (null !== b && f.ih(b.data, void 0), f.ih(h, f.wb(null !== this.gg ? this.gg.data : null)))) + } + e = this.od; + f = this.wD; + null !== f && + (h = !0, null !== d && (h = d.Na, d.Na = !0), f(this, c, e), null !== d && (d.Na = h)); + null !== a && (this.gg !== a && eo(a, this, e), vo(this), this.H(Jj)); + this.h("fromNode", b, a); + xk(this) + } + }); + u.defineProperty(W, {pg: "fromPortId"}, function () { + return this.wh + }, function (a) { + var b = this.wh; + if (b !== a) { + var c = this.od; + null !== c && co(this.W, c); + uo(this); + this.wh = a; + var d = this.od; + null !== d && co(this.W, d); + var e = this.g; + if (null !== e) { + var f = this.data, h = e.ga; + null !== f && h instanceof Q && h.aA(f, a) + } + c !== d && (this.di = null, this.Vb(), f = this.wD, null !== f && (h = !0, null !== e && (h = e.Na, e.Na = !0), f(this, c, d), null !== e && (e.Na = h))); + vo(this); + this.h("fromPortId", b, a) + } + }); + u.u(W, {od: "fromPort"}, function () { + var a = this.Wf; + return null === a ? null : a.Xk(this.wh) + }); + u.defineProperty(W, {wD: "fromPortChanged"}, function () { + return this.Yp + }, function (a) { + var b = this.Yp; + b !== a && (null !== a && u.j(a, "function", W, "fromPortChanged"), this.Yp = a, this.h("fromPortChanged", b, a)) + }); + u.defineProperty(W, {ca: "toNode"}, function () { + return this.gg + }, function (a) { + var b = this.gg; + if (b !== a) { + var c = this.fe; + null !== b && (this.Wf !== b && fo(b, this, c), uo(this), this.H(Rj)); + this.gg = a; + this.di = null; + this.Vb(); + var d = this.g; + if (null !== d) { + var e = this.data, f = d.ga; + if (null !== e) if (f instanceof Q) { + var h = null !== a ? a.data : null; + f.Gw(e, f.wb(h)) + } else f instanceof qe && (h = null !== a ? a.data : null, d.qd ? (null !== b && f.ih(b.data, void 0), f.ih(h, f.wb(null !== this.Wf ? this.Wf.data : null))) : f.ih(e, f.wb(h))) + } + e = this.fe; + f = this.PE; + null !== f && + (h = !0, null !== d && (h = d.Na, d.Na = !0), f(this, c, e), null !== d && (d.Na = h)); + null !== a && (this.Wf !== a && eo(a, this, e), vo(this), this.H(Jj)); + this.h("toNode", b, a); + xk(this) + } + }); + u.defineProperty(W, {lh: "toPortId"}, function () { + return this.Ih + }, function (a) { + var b = this.Ih; + if (b !== a) { + var c = this.fe; + null !== c && co(this.ca, c); + uo(this); + this.Ih = a; + var d = this.fe; + null !== d && co(this.ca, d); + var e = this.g; + if (null !== e) { + var f = this.data, h = e.ga; + null !== f && h instanceof Q && h.eA(f, a) + } + c !== d && (this.di = null, this.Vb(), f = this.PE, null !== f && (h = !0, null !== e && (h = e.Na, e.Na = !0), f(this, c, d), null !== e && (e.Na = h))); + vo(this); + this.h("toPortId", b, a) + } + }); + u.u(W, {fe: "toPort"}, function () { + var a = this.gg; + return null === a ? null : a.Xk(this.Ih) + }); + u.defineProperty(W, {PE: "toPortChanged"}, function () { + return this.Ur + }, function (a) { + var b = this.Ur; + b !== a && (null !== a && u.j(a, "function", W, "toPortChanged"), this.Ur = a, this.h("toPortChanged", b, a)) + }); + u.defineProperty(W, {vb: "fromSpot"}, function () { + return null !== this.Q ? this.Q.cj : uc + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.cj; + b.L(a) || (a = a.Z(), this.Q.cj = a, this.h("fromSpot", b, a), this.Vb()) + }); + u.defineProperty(W, {Yk: "fromEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.aj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.aj; + b !== a && (0 > a && u.wa(a, ">= 0", W, "fromEndSegmentLength"), this.Q.aj = a, this.h("fromEndSegmentLength", b, a), this.Vb()) + }); + u.defineProperty(W, {Es: "fromEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.$i : Yn + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.$i; + b !== a && (this.Q.$i = a, this.h("fromEndSegmentDirection", b, a), this.Vb()) + }); + u.defineProperty(W, {Fs: "fromShortLength"}, function () { + return null !== this.Q ? this.Q.bj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.bj; + b !== a && (this.Q.bj = a, this.h("fromShortLength", b, a), this.Vb()) + }); + u.defineProperty(W, {xb: "toSpot"}, function () { + return null !== this.Q ? this.Q.Ej : uc + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Ej; + b.L(a) || (a = a.Z(), this.Q.Ej = a, this.h("toSpot", b, a), this.Vb()) + }); + u.defineProperty(W, {vl: "toEndSegmentLength"}, function () { + return null !== this.Q ? this.Q.Cj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Cj; + b !== a && (0 > a && u.wa(a, ">= 0", W, "toEndSegmentLength"), this.Q.Cj = a, this.h("toEndSegmentLength", b, a), this.Vb()) + }); + u.defineProperty(W, {wt: "toEndSegmentDirection"}, function () { + return null !== this.Q ? this.Q.Bj : Yn + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Bj; + b !== a && (this.Q.Bj = a, this.h("toEndSegmentDirection", b, a), this.Vb()) + }); + u.defineProperty(W, {yt: "toShortLength"}, function () { + return null !== this.Q ? this.Q.Dj : NaN + }, function (a) { + null === this.Q && this.Ee(); + var b = this.Q.Dj; + b !== a && (this.Q.Dj = a, this.h("toShortLength", b, a), this.Vb()) + }); + + function xk(a) { + var b = a.W, c = a.ca; + null !== b ? null !== c ? wo(a, b.yG(c)) : wo(a, null) : wo(a, null) + } + + function wo(a, b) { + var c = a.kk; + if (c !== b) { + null !== c && Sn(c, a); + a.kk = b; + null !== b && Tn(b, a); + var d = a.bD; + if (null !== d) { + var e = !0, f = a.g; + null !== f && (e = f.Na, f.Na = !0); + d(a, c, b); + null !== f && (f.Na = e) + } + !a.hg || a.oC !== c && a.qC !== c || a.Vb() + } + } + + W.prototype.dl = function () { + var a = this.Ra; + null !== a && this.W !== a && this.ca !== a && G.prototype.dl.call(this) + }; + W.prototype.getOtherNode = W.prototype.hz = function (a) { + var b = this.W; + return a === b ? this.ca : b + }; + W.prototype.getOtherPort = function (a) { + var b = this.od; + return a === b ? this.fe : b + }; + u.u(W, {EJ: "isLabeledLink"}, function () { + return null === this.ue ? !1 : 0 < this.ue.count + }); + u.u(W, {ug: "labelNodes"}, function () { + return null === this.ue ? Ia : this.ue.i + }); + + function ho(a, b) { + null === a.ue && (a.ue = new F(U)); + a.ue.add(b); + a.R() + } + + W.prototype.Js = function (a) { + G.prototype.Js.call(this, a); + xo(this) && eh(this, this.ba); + if (!a) { + a = this.Wf; + var b = this.gg; + null !== a && (eo(a, this, this.od), vo(this)); + null !== b && (eo(b, this, this.fe), vo(this)) + } + }; + W.prototype.Ks = function (a) { + G.prototype.Ks.call(this, a); + xo(this) && eh(this, this.ba); + if (!a) { + a = this.Wf; + var b = this.gg; + null !== a && (fo(a, this, this.od), uo(this)); + null !== b && (fo(b, this, this.fe), uo(this)) + } + }; + W.prototype.xm = function () { + this.hg = !0; + if (null !== this.ue) { + var a = this.g; + if (null === a) return; + for (var b = this.ue.copy().i; b.next();) a.remove(b.value) + } + b = this.data; + null !== b && (a = this.g, null !== a && (a = a.ga, a instanceof Q ? a.Uz(b) : a instanceof qe && a.ih(b, void 0))) + }; + W.prototype.updateRelationshipsFromData = function () { + var a = this.data; + if (null !== a) { + var b = this.g; + if (null !== b) { + var c = b.ga; + if (c instanceof Q) { + var d = c.$k(a), e = b.Xe(d), f = this.W; + e !== f && (e = null !== f ? c.wb(f.data) : void 0, f = c.Ko, "function" === typeof f ? f(a, e) : a[f] = e, c.Ew(a, d)); + d = c.cl(a); + e = b.Xe(d); + f = this.ca; + e !== f && (e = null !== f ? c.wb(f.data) : void 0, f = c.Mo, "function" === typeof f ? f(a, e) : a[f] = e, c.Gw(a, d)); + var h = c.Pj(a); + if (0 < h.length || 0 < this.ug.count) { + if (1 === h.length && 1 === this.ug.count && (b = h[0], d = this.ug.first(), c.wb(d.data) === + b)) return; + var d = (new F).Td(h), k = new F; + this.ug.each(function (a) { + null !== a.data && (a = c.wb(a.data), void 0 !== a && k.add(a)) + }); + b = k.copy(); + b.jE(d); + d = d.copy(); + d.jE(k); + if (0 < b.count || 0 < d.count) h.length = 0, k.each(function (a) { + h.push(a) + }), b.each(function (b) { + c.mE(a, b) + }), d.each(function (b) { + c.Ly(a, b) + }) + } + } + } + } + }; + W.prototype.move = W.prototype.move = function (a) { + var b = this.position, c = b.x; + isNaN(c) && (c = 0); + b = b.y; + isNaN(b) && (b = 0); + c = a.x - c; + b = a.y - b; + G.prototype.move.call(this, a); + this.ll(c, b); + for (a = this.ug; a.next();) { + var d = a.value, e = d.position; + d.moveTo(e.x + c, e.y + b) + } + }; + u.defineProperty(W, {QH: "relinkableFrom"}, function () { + return this.or + }, function (a) { + var b = this.or; + b !== a && (this.or = a, this.h("relinkableFrom", b, a), this.Zd()) + }); + u.defineProperty(W, {RH: "relinkableTo"}, function () { + return this.pr + }, function (a) { + var b = this.pr; + b !== a && (this.pr = a, this.h("relinkableTo", b, a), this.Zd()) + }); + W.prototype.canRelinkFrom = function () { + if (!this.QH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.mm) return !1; + a = a.g; + return null === a || a.mm ? !0 : !1 + }; + W.prototype.canRelinkTo = function () { + if (!this.RH) return !1; + var a = this.layer; + if (null === a) return !0; + if (!a.mm) return !1; + a = a.g; + return null === a || a.mm ? !0 : !1 + }; + u.defineProperty(W, {it: "resegmentable"}, function () { + return this.qr + }, function (a) { + var b = this.qr; + b !== a && (this.qr = a, this.h("resegmentable", b, a), this.Zd()) + }); + u.defineProperty(W, {Bc: "isTreeLink"}, function () { + return this.sq + }, function (a) { + var b = this.sq; + b !== a && (this.sq = a, this.h("isTreeLink", b, a), null !== this.W && Jk(this.W), null !== this.ca && Jk(this.ca)) + }); + u.u(W, {path: "path"}, function () { + var a = this.If(); + return a instanceof X ? a : null + }); + u.u(W, {Mm: "routeBounds"}, function () { + this.updateRoute(); + var a = new z; + var b = Infinity, c = Infinity, d = this.ka; + if (0 === d) a.m(NaN, NaN, 0, 0); else { + if (1 === d) d = this.l(0), b = Math.min(d.x, b), c = Math.min(d.y, c), a.m(d.x, d.y, 0, 0); else if (2 === d) { + var e = this.l(0), f = this.l(1), b = Math.min(e.x, f.x), c = Math.min(e.y, f.y); + a.m(e.x, e.y, 0, 0); + a.Oi(f) + } else if (this.computeCurve() === kh && 3 <= d && !this.dc) if (e = this.l(0), b = e.x, c = e.y, a.m(b, c, 0, 0), 3 === d) d = this.l(1), b = Math.min(d.x, b), c = Math.min(d.y, c), f = this.l(2), b = Math.min(f.x, b), c = Math.min(f.y, + c), K.oo(e.x, e.y, d.x, d.y, d.x, d.y, f.x, f.y, .5, a); else for (var h = 3; h < d; h += 3) { + var k = this.l(h - 2); + h + 3 >= d && (h = d - 1); + var l = this.l(h - 1), f = this.l(h); + K.oo(e.x, e.y, k.x, k.y, l.x, l.y, f.x, f.y, .5, a); + b = Math.min(f.x, b); + c = Math.min(f.y, c); + e = f + } else for (e = this.l(0), f = this.l(1), b = Math.min(e.x, f.x), c = Math.min(e.y, f.y), a.m(e.x, e.y, 0, 0), a.Oi(f), h = 2; h < d; h++) e = this.l(h), b = Math.min(e.x, b), c = Math.min(e.y, c), a.Oi(e); + this.Dy.m(b - a.x, c - a.y) + } + return this.py = a + }); + u.u(W, {XD: "midPoint"}, function () { + this.updateRoute(); + return this.computeMidPoint(new w) + }); + W.prototype.computeMidPoint = function (a) { + var b = this.ka; + if (0 === b) return a.assign(K.gF), a; + if (1 === b) return a.assign(this.l(0)), a; + if (2 === b) { + var c = this.l(0), d = this.l(1); + a.m((c.x + d.x) / 2, (c.y + d.y) / 2); + return a + } + if (this.computeCurve() === kh && 3 <= b && !this.dc) { + if (3 === b) return this.l(1); + var b = (b - 1) / 3 | 0, e = 3 * (b / 2 | 0); + 1 === b % 2 ? (c = this.l(e), d = this.l(e + 1), b = this.l(e + 2), e = this.l(e + 3), K.UF(c.x, c.y, d.x, d.y, b.x, b.y, e.x, e.y, a)) : a.assign(this.l(e)); + return a + } + for (var e = 0, f = u.eb(), h = 0; h < b - 1; h++) c = 0, c = this.l(h), d = this.l(h + 1), K.mb(c.x, + d.x) ? (c = d.y - c.y, 0 > c && (c = -c)) : K.mb(c.y, d.y) ? (c = d.x - c.x, 0 > c && (c = -c)) : c = Math.sqrt(c.Lj(d)), f.push(c), e += c; + for (d = h = c = 0; c < e / 2 && h < b;) { + d = f[h]; + if (c + d > e / 2) break; + c += d; + h++ + } + u.ra(f); + b = this.l(h); + f = this.l(h + 1); + b.x === f.x ? b.y > f.y ? a.m(b.x, b.y - (e / 2 - c)) : a.m(b.x, b.y + (e / 2 - c)) : b.y === f.y ? b.x > f.x ? a.m(b.x - (e / 2 - c), b.y) : a.m(b.x + (e / 2 - c), b.y) : (e = (e / 2 - c) / d, a.m(b.x + e * (f.x - b.x), b.y + e * (f.y - b.y))); + return a + }; + u.u(W, {WD: "midAngle"}, function () { + this.updateRoute(); + return this.computeMidAngle() + }); + W.prototype.computeMidAngle = function () { + var a = this.ka; + if (2 > a) return NaN; + if (this.computeCurve() === kh && 4 <= a && !this.dc) { + var b = (a - 1) / 3 | 0, c = 3 * (b / 2 | 0); + if (1 === b % 2) { + var c = Math.floor(c), a = this.l(c), b = this.l(c + 1), d = this.l(c + 2), c = this.l(c + 3); + return K.TF(a.x, a.y, b.x, b.y, d.x, d.y, c.x, c.y) + } + if (0 < c && c + 1 < a) return a = this.l(c - 1), b = this.l(c + 1), a.Fi(b) + } + d = a / 2 | 0; + if (0 === a % 2) return a = this.l(d - 1), b = this.l(d), a.Fi(b); + var a = this.l(d - 1), b = this.l(d), d = this.l(d + 1), c = a.Lj(b), e = b.Lj(d); + return c > e ? a.Fi(b) : b.Fi(d) + }; + u.defineProperty(W, {points: "points"}, function () { + return this.Qc + }, function (a) { + var b = this.Qc; + if (b !== a) { + var c = null; + if (Array.isArray(a)) { + var d = 0 === a.length % 2; + if (d) for (var e = 0; e < a.length; e++) if ("number" !== typeof a[e] || isNaN(a[e])) { + d = !1; + break + } + if (d) for (c = new E(w), d = 0; d < a.length / 2; d++) e = (new w(a[2 * d], a[2 * d + 1])).freeze(), c.add(e); else { + for (var f = !0, d = 0; d < a.length; d++) if (e = a[d], !u.Sa(e) || "number" !== typeof e.x || isNaN(e.x) || "number" !== typeof e.y || isNaN(e.y)) { + f = !1; + break + } + if (f) for (c = new E(w), d = 0; d < a.length; d++) e = + a[d], c.add((new w(e.x, e.y)).freeze()); else u.k("Link.points array must contain only an even number of numbers or objects with x and y properties, not: " + a) + } + } else if (a instanceof E) for (c = a.copy(), a = c.i; a.next();) a.value.freeze(); else u.k("Link.points value is not an instance of List or Array: " + a); + c.freeze(); + this.Qc = c; + this.le(); + yo(this); + this.g && this.g.Lb.ld && (this.Xn = c); + this.h("points", b, c) + } + }); + u.u(W, {ka: "pointsCount"}, function () { + return this.Qc.count + }); + W.prototype.getPoint = W.prototype.l = function (a) { + return this.Qc.n[a] + }; + W.prototype.setPoint = W.prototype.yf = function (a, b) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Bg(a, b) + }; + W.prototype.setPointAt = W.prototype.V = function (a, b, c) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Bg(a, new w(b, c)) + }; + W.prototype.insertPoint = function (a, b) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Yd(a, b) + }; + W.prototype.insertPointAt = W.prototype.w = function (a, b, c) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.Yd(a, new w(b, c)) + }; + W.prototype.addPoint = W.prototype.Jh = function (a) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.add(a) + }; + W.prototype.addPointAt = W.prototype.Lk = function (a, b) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.add(new w(a, b)) + }; + W.prototype.removePoint = W.prototype.nE = function (a) { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.hd(a) + }; + W.prototype.clearPoints = W.prototype.so = function () { + null === this.we && u.k("Call Link.startRoute before modifying the points of the route."); + this.Qc.clear() + }; + W.prototype.movePoints = W.prototype.ll = function (a, b) { + for (var c = new E(w), d = this.Qc.i; d.next();) { + var e = d.value; + c.add((new w(e.x + a, e.y + b)).freeze()) + } + c.freeze(); + d = this.Qc; + this.Qc = c; + this.le(); + yo(this); + this.g && this.g.Lb.ld && (this.Xn = c); + this.h("points", d, c) + }; + W.prototype.startRoute = W.prototype.rl = function () { + null === this.we && (this.we = this.Qc, this.Qc = this.Qc.copy()) + }; + W.prototype.commitRoute = W.prototype.Bi = function () { + if (null !== this.we) { + for (var a = this.we, b = this.Qc, c = Infinity, d = Infinity, e = a.n, f = e.length, h = 0; h < f; h++) var k = e[h], c = Math.min(k.x, c), d = Math.min(k.y, d); + for (var l = Infinity, m = Infinity, n = b.n, p = n.length, h = 0; h < p; h++) k = n[h], l = Math.min(k.x, l), m = Math.min(k.y, m), k.freeze(); + b.freeze(); + if (p === f) for (h = 0; h < p; h++) { + if (f = e[h], k = n[h], f.x - c !== k.x - l || f.y - d !== k.y - m) { + this.le(); + break + } + } else this.le(); + this.we = null; + this.g && this.g.Lb.ld && (this.Xn = b); + yo(this); + this.h("points", a, b) + } + }; + W.prototype.rollbackRoute = W.prototype.WH = function () { + null !== this.we && (this.Qc = this.we, this.we = null) + }; + + function yo(a) { + 0 === a.Qc.count ? a.hg = !1 : (a.hg = !0, a.jn = a.l(0).copy(), a.nn = a.l(a.ka - 1).copy(), zo(a, !1)) + } + + W.prototype.invalidateRoute = W.prototype.Vb = function () { + if (!(this.zy || this.g && this.g.ha.gb)) { + var a = this.path; + null !== a && (this.hg = !1, this.le(), a.R()) + } + }; + u.defineProperty(W, {ip: null}, function () { + return this.zy + }, function (a) { + this.zy = a + }); + W.prototype.updateRoute = function () { + if (!this.hg && !this.jx) { + var a = !0; + try { + this.jx = !0, this.rl(), a = this.computePoints() + } finally { + this.jx = !1, a ? this.Bi() : this.WH() + } + } + }; + W.prototype.computePoints = function () { + var a = this.g; + if (null === a) return !1; + var b = this.W, c = null; + null === b ? (a.Zl || (a.Xu = new X, a.Xu.xa = K.op, a.Xu.hb = 0, a.Zl = new U, a.Zl.add(a.Xu), a.Zl.pf()), this.jn && (a.Zl.position = a.Zl.location = this.jn, a.Zl.pf(), b = a.Zl, c = a.Xu)) : c = this.od; + if (null !== c) { + var d = Nl(c); + d !== b && b.Ea() ? c = d : (d = b.findVisibleNode(), null !== d && d !== b ? (b = d, c = d.Xk("")) : b = d) + } + this.oC = b; + if (null === b || null === c || !b.location.J()) return !1; + var d = this.ca, e = null; + null === d ? (a.$l || (a.Yu = new X, a.Yu.xa = K.op, a.Yu.hb = 0, a.$l = new U, + a.$l.add(a.Yu), a.$l.pf()), this.nn && (a.$l.position = a.$l.location = this.nn, a.$l.pf(), d = a.$l, e = a.Yu)) : e = this.fe; + null !== e && (a = Nl(e), a !== d && d.Ea() ? e = a : (a = d.findVisibleNode(), null !== a && a !== d ? (d = a, e = a.Xk("")) : d = a)); + this.qC = d; + if (null === d || null === e || !d.location.J()) return !1; + var a = this.ka, f = Ao(this, c), h = Bo(this, e), k = c === e && null !== c, l = this.dc, m = this.Ve === kh; + this.di = k && !l ? m = !0 : !1; + var n = this.es === dh || k; + if (l || f !== vb || h !== vb || k) { + m = this.el; + n && (l && m || k) && this.so(); + var p = k ? this.computeCurviness() : 0, q = this.getLinkPoint(b, + c, f, !0, l, d, e), r = 0, s = 0, t = 0; + if (l || f !== vb || k) { + var v = this.computeEndSegmentLength(b, c, f, !0), t = this.getLinkDirection(b, c, q, f, !0, l, d, e); + k && (t -= l ? 90 : 30, 0 > p && (t -= 180)); + 0 > t ? t += 360 : 360 <= t && (t -= 360); + k && (v += Math.abs(p)); + 0 === t ? r = v : 90 === t ? s = v : 180 === t ? r = -v : 270 === t ? s = -v : (r = v * Math.cos(t * Math.PI / 180), s = v * Math.sin(t * Math.PI / 180)); + if (f.ne() && k) { + var x = c.lb(Ib, u.K()), B = u.fc(x.x + 1E3 * r, x.y + 1E3 * s); + this.getLinkPointFromPoint(b, c, x, B, !0, q); + u.v(x); + u.v(B) + } + } + var v = this.getLinkPoint(d, e, h, !1, l, b, c), y = 0, C = 0, I = 0; + if (l || h !== vb || k) x = + this.computeEndSegmentLength(d, e, h, !1), I = this.getLinkDirection(d, e, v, h, !1, l, b, c), k && (I += l ? 0 : 30, 0 > p && (I += 180)), 0 > I ? I += 360 : 360 <= I && (I -= 360), k && (x += Math.abs(p)), 0 === I ? y = x : 90 === I ? C = x : 180 === I ? y = -x : 270 === I ? C = -x : (y = x * Math.cos(I * Math.PI / 180), C = x * Math.sin(I * Math.PI / 180)), h.ne() && k && (x = e.lb(Ib, u.K()), B = u.fc(x.x + 1E3 * y, x.y + 1E3 * C), this.getLinkPointFromPoint(d, e, x, B, !1, v), u.v(x), u.v(B)); + e = q; + if (l || f !== vb || k) e = new w(q.x + r, q.y + s); + c = v; + if (l || h !== vb || k) c = new w(v.x + y, v.y + C); + !n && !l && f === vb && 3 < a && this.adjustPoints(0, q, + a - 2, c) ? this.yf(a - 1, v) : !n && !l && h === vb && 3 < a && this.adjustPoints(1, e, a - 1, v) ? this.yf(0, q) : !n && !l && 4 < a && this.adjustPoints(1, e, a - 2, c) ? (this.yf(0, q), this.yf(a - 1, v)) : !n && l && 6 <= a && !m && this.adjustPoints(1, e, a - 2, c) ? (this.yf(0, q), this.yf(a - 1, v)) : (this.so(), this.Jh(q), (l || f !== vb || k) && this.Jh(e), l && this.addOrthoPoints(e, t, c, I, b, d), (l || h !== vb || k) && this.Jh(c), this.Jh(v)) + } else f = !1, !n && 3 <= a && (n = this.getLinkPoint(b, c, vb, !0, !1, d, e), h = this.getLinkPoint(d, e, vb, !1, !1, b, c), f = this.adjustPoints(0, n, a - 1, h)) && (n = this.getLinkPoint(b, + c, vb, !0, !1, d, e), h = this.getLinkPoint(d, e, vb, !1, !1, b, c), this.adjustPoints(0, n, a - 1, h)), f || (this.so(), m ? (a = this.getLinkPoint(b, c, vb, !0, !1, d, e), n = this.getLinkPoint(d, e, vb, !1, !1, b, c), f = n.x - a.x, h = n.y - a.y, k = this.computeCurviness(), m = l = 0, q = a.x + f / 3, t = a.y + h / 3, r = q, s = t, K.D(h, 0) ? s = 0 < f ? s - k : s + k : (l = -f / h, m = Math.sqrt(k * k / (l * l + 1)), 0 > k && (m = -m), r = (0 > h ? -1 : 1) * m + q, s = l * (r - q) + t), q = a.x + 2 * f / 3, t = a.y + 2 * h / 3, v = q, y = t, K.D(h, 0) ? y = 0 < f ? y - k : y + k : (v = (0 > h ? -1 : 1) * m + q, y = l * (v - q) + t), this.so(), this.Jh(a), this.Lk(r, s), this.Lk(v, y), this.Jh(n), this.yf(0, + this.getLinkPoint(b, c, vb, !0, !1, d, e)), this.yf(3, this.getLinkPoint(d, e, vb, !1, !1, b, c))) : (a = d, d = this.getLinkPoint(b, c, vb, !0, !1, a, e), e = this.getLinkPoint(a, e, vb, !1, !1, b, c), this.hasCurviness() ? (h = e.x - d.x, b = e.y - d.y, c = this.computeCurviness(), a = d.x + h / 2, n = d.y + b / 2, f = a, k = n, K.D(b, 0) ? k = 0 < h ? k - c : k + c : (h = -h / b, f = Math.sqrt(c * c / (h * h + 1)), 0 > c && (f = -f), f = (0 > b ? -1 : 1) * f + a, k = h * (f - a) + n), this.Jh(d), this.Lk(f, k)) : this.Jh(d), this.Jh(e))); + return !0 + }; + + function Co(a, b) { + Math.abs(b.x - a.x) > Math.abs(b.y - a.y) ? (b.x = b.x >= a.x ? a.x + 9E9 : a.x - 9E9, b.y = a.y) : (b.y = b.y >= a.y ? a.y + 9E9 : a.y - 9E9, b.x = a.x); + return b + } + + W.prototype.getLinkPointFromPoint = function (a, b, c, d, e, f) { + void 0 === f && (f = new w); + if (null === a || null === b) return f.assign(c), f; + a.Ea() || (e = a.findVisibleNode(), null !== e && e !== a && (b = e.port)); + var h = e = 0, k = 0, l = 0; + a = null; + e = b.S; + null === e || e.Tf() || (e = e.S); + if (null === e) e = d.x, h = d.y, k = c.x, l = c.y; else { + a = e.Ff; + e = 1 / (a.m11 * a.m22 - a.m12 * a.m21); + var k = a.m22 * e, l = -a.m12 * e, m = -a.m21 * e, n = a.m11 * e, p = e * (a.m21 * a.dy - a.m22 * a.dx), + q = e * (a.m12 * a.dx - a.m11 * a.dy); + e = d.x * k + d.y * m + p; + h = d.x * l + d.y * n + q; + k = c.x * k + c.y * m + p; + l = c.x * l + c.y * n + q + } + b.Co(e, h, k, l, f); + null !== + a && f.transform(a); + return f + }; + + function Do(a, b) { + var c = b.jr; + null === c && (c = new Eo, c.port = b, c.Cc = b.T, b.jr = c); + return Fo(c, a) + } + + W.prototype.getLinkPoint = function (a, b, c, d, e, f, h, k) { + void 0 === k && (k = new w); + if (c.pd()) return b.lb(c, k), k; + if (c.Go() && (c = Do(this, b), null !== c)) { + k.assign(c.Lo); + if (e && this.zw === mo) { + var l = Do(this, h); + if (c.vm < l.vm) { + c = u.K(); + var l = u.K(), m = new z(b.lb(xb, c), b.lb(Vb, l)), n = this.computeSpot(!d); + a = this.getLinkPoint(f, h, n, !d, e, a, b, l); + a.x >= m.x && a.x <= m.x + m.width ? k.x = a.x : a.y >= m.y && a.y <= m.y + m.height && (k.y = a.y); + u.v(c); + u.v(l) + } + } + return k + } + f = b.lb(Ib, u.K()); + l = c = null; + this.ka > (e ? 6 : 2) ? (l = d ? this.l(1) : this.l(this.ka - 2), e && (l = Co(f, l.copy()))) : + (c = u.K(), l = h.lb(Ib, c), e && (l = Co(f, l))); + this.getLinkPointFromPoint(a, b, f, l, d, k); + u.v(f); + null !== c && u.v(c); + return k + }; + W.prototype.getLinkDirection = function (a, b, c, d, e, f, h, k) { + a:if (d.pd()) c = d.x > d.y ? d.x > 1 - d.y ? 0 : d.x < 1 - d.y ? 270 : 315 : d.x < d.y ? d.x > 1 - d.y ? 90 : d.x < 1 - d.y ? 180 : 135 : .5 > d.x ? 225 : .5 < d.x ? 45 : 0; else { + if (d.Go()) { + var l = Do(this, b); + if (null !== l) switch (l.ee) { + case u.Xc: + c = 270; + break a; + case u.Fc: + c = 180; + break a; + default: + case u.Oc: + c = 0; + break a; + case u.Nc: + c = 90; + break a + } + } + var l = b.lb(Ib, u.K()), m = null, n = null; + this.ka > (f ? 6 : 2) ? (n = e ? this.l(1) : this.l(this.ka - 2), n = f ? Co(l, n.copy()) : c) : (m = u.K(), n = k.lb(Ib, m)); + c = 0; + c = Math.abs(n.x - l.x) > Math.abs(n.y - l.y) ? n.x >= + l.x ? 0 : 180 : n.y >= l.y ? 90 : 270; + u.v(l); + null !== m && u.v(m) + } + d.ne() && h.Ph(a) && (c += 180, 360 <= c && (c -= 360)); + a = Yn; + a = e ? this.Es : this.wt; + a === Yn && (a = e ? b.Es : b.wt); + switch (a) { + case Zn: + b = b.Zk(); + c += b; + 360 <= c && (c -= 360); + break; + case Yn: + case jl: + b = b.Zk(); + if (0 === b) break; + 45 <= b && 135 > b ? c += 90 : 135 <= b && 225 > b ? c += 180 : 225 <= b && 315 > b && (c += 270); + 360 <= c && (c -= 360) + } + return c + }; + W.prototype.computeEndSegmentLength = function (a, b, c, d) { + if (null !== b && c.Go() && (a = Do(this, b), null !== a)) return a.Sv; + a = NaN; + a = d ? this.Yk : this.vl; + null !== b && isNaN(a) && (a = d ? b.Yk : b.vl); + isNaN(a) && (a = 10); + return a + }; + W.prototype.computeSpot = function (a) { + return a ? Ao(this, this.od) : Bo(this, this.fe) + }; + + function Ao(a, b) { + if (null === b) return Ib; + var c = a.vb; + c.Lc() && (void 0 === b && (b = a.od), null !== b && (c = b.vb)); + return c === uc ? vb : c + } + + function Bo(a, b) { + if (null === b) return Ib; + var c = a.xb; + c.Lc() && (void 0 === b && (b = a.fe), null !== b && (c = b.xb)); + return c === uc ? vb : c + } + + W.prototype.computeOtherPoint = function (a, b) { + var c = b.lb(Ib), d; + d = b.jr; + d = null !== d ? Fo(d, this) : null; + null !== d && (c = d.Lo); + return c + }; + W.prototype.computeShortLength = function (a) { + return a ? Go(this) : Ho(this) + }; + + function Go(a) { + var b = a.Fs; + isNaN(b) && (a = a.od, null !== a && (b = a.Fs)); + return isNaN(b) ? 0 : b + } + + function Ho(a) { + var b = a.yt; + isNaN(b) && (a = a.fe, null !== a && (b = a.yt)); + return isNaN(b) ? 0 : b + } + + W.prototype.Nj = function (a, b, c, d, e, f) { + if (!1 === this.Ag) return !1; + void 0 === b && (b = null); + void 0 === c && (c = null); + var h = f; + void 0 === f && (h = u.jh(), h.reset()); + h.multiply(this.transform); + if (this.sm(a, h)) return Um(this, b, c, e), void 0 === f && u.Ye(h), !0; + if (this.sg(a, h)) { + var k = !1; + if (!this.Kg) for (var l = this.ya.n, m = l.length; m--;) { + var n = l[m]; + if (n.visible || n === this.ec) { + var p = n.ba, q = this.Ha; + if (!(p.x > q.width || p.y > q.height || 0 > p.x + p.width || 0 > p.y + p.height)) { + p = u.jh(); + p.set(h); + if (n instanceof A) k = n.Nj(a, b, c, d, e, p); else if (this.path === + n) { + var k = n, r = a, s = d, q = p; + if (!1 === k.Ag) k = !1; else if (q.multiply(k.transform), s) b:{ + var t = r, v = q; + if (k.sm(t, v)) k = !0; else { + if (void 0 === v && (v = k.transform, t.Kj(k.ba))) { + k = !0; + break b + } + var q = t.left, r = t.right, s = t.top, t = t.bottom, x = u.K(), B = u.K(), + y = u.K(), C = u.jh(); + C.set(v); + C.aE(k.transform); + C.oz(); + B.x = r; + B.y = s; + B.transform(C); + x.x = q; + x.y = s; + x.transform(C); + v = !1; + cn(k, x, B, y) ? v = !0 : (x.x = r, x.y = t, x.transform(C), cn(k, x, B, y) ? v = !0 : (B.x = q, B.y = t, B.transform(C), cn(k, x, B, y) ? v = !0 : (x.x = q, x.y = s, x.transform(C), cn(k, x, B, y) && (v = !0)))); + u.Ye(C); + u.v(x); + u.v(B); + u.v(y); + k = v + } + } else k = k.sm(r, q) + } else k = ol(n, a, d, p); + k && (null !== b && (n = b(n)), n && (null === c || c(n)) && e.add(n)); + u.Ye(p) + } + } + } + void 0 === f && u.Ye(h); + return k || null !== this.background || null !== this.nm + } + void 0 === f && u.Ye(h); + return !1 + }; + u.u(W, {dc: "isOrthogonal"}, function () { + return 2 === (this.Yl.value & 2) + }); + u.u(W, {el: "isAvoiding"}, function () { + return 4 === (this.Yl.value & 4) + }); + W.prototype.computeCurve = function () { + if (null === this.di) { + var a = this.od, b = this.dc; + this.di = null !== a && a === this.fe && !b + } + return this.di ? kh : this.Ve + }; + W.prototype.computeCorner = function () { + if (this.Ve === kh) return 0; + var a = this.Yy; + if (isNaN(a) || 0 > a) a = 10; + return a + }; + W.prototype.computeCurviness = function () { + var a = this.Ov; + if (isNaN(a)) { + var b = this.hf; + if (0 !== b) { + var a = 10, c = this.g; + null !== c && (a = c.ow); + c = Math.abs(b); + a = a / 2 + ((c - 1) / 2 | 0) * a; + 0 === c % 2 && (a = -a); + 0 > b && (a = -a) + } else a = 10 + } + return a + }; + W.prototype.computeThickness = function () { + var a = this.path; + return null !== a ? Math.max(a.hb, 1) : 1 + }; + W.prototype.hasCurviness = function () { + return !isNaN(this.Ov) || 0 !== this.hf && !this.dc + }; + W.prototype.adjustPoints = function (a, b, c, d) { + var e = this.es; + if (this.dc) { + if (e === Vl) return !1; + e === Wl && (e = Ul) + } + switch (e) { + case Vl: + var f = this.l(a), h = this.l(c); + if (!f.L(b) || !h.L(d)) { + var e = f.x, f = f.y, k = h.x - e, l = h.y - f, m = Math.sqrt(k * k + l * l); + if (!K.D(m, 0)) { + var n = 0; + K.D(k, 0) ? n = 0 > l ? -Math.PI / 2 : Math.PI / 2 : (n = Math.atan(l / Math.abs(k)), 0 > k && (n = Math.PI - n)); + var h = b.x, p = b.y, l = d.x - h, q = d.y - p, r = Math.sqrt(l * l + q * q), k = 0; + K.D(l, 0) ? k = 0 > q ? -Math.PI / 2 : Math.PI / 2 : (k = Math.atan(q / Math.abs(l)), 0 > l && (k = Math.PI - k)); + m = r / m; + n = k - n; + this.yf(a, b); + for (a += + 1; a < c; a++) b = this.l(a), k = b.x - e, l = b.y - f, b = Math.sqrt(k * k + l * l), K.D(b, 0) || (q = 0, K.D(k, 0) ? q = 0 > l ? -Math.PI / 2 : Math.PI / 2 : (q = Math.atan(l / Math.abs(k)), 0 > k && (q = Math.PI - q)), k = q + n, b *= m, this.V(a, h + b * Math.cos(k), p + b * Math.sin(k))); + this.yf(c, d) + } + } + return !0; + case Wl: + f = this.l(a); + p = this.l(c); + if (!f.L(b) || !p.L(d)) { + var e = f.x, f = f.y, h = p.x, p = p.y, m = (h - e) * (h - e) + (p - f) * (p - f), k = b.x, n = b.y, + l = d.x, q = d.y, r = 0, s = 1, r = 0 !== l - k ? (q - n) / (l - k) : 9E9; + 0 !== r && (s = Math.sqrt(1 + 1 / (r * r))); + this.yf(a, b); + for (a += 1; a < c; a++) { + b = this.l(a); + var t = b.x, v = b.y, x = .5; + 0 !== m && + (x = ((e - t) * (e - h) + (f - v) * (f - p)) / m); + var B = e + x * (h - e), y = f + x * (p - f); + b = Math.sqrt((t - B) * (t - B) + (v - y) * (v - y)); + v < r * (t - B) + y && (b = -b); + 0 < r && (b = -b); + t = k + x * (l - k); + x = n + x * (q - n); + 0 !== r ? (b = t + b / s, this.V(a, b, x - (b - t) / r)) : this.V(a, t, x + b) + } + this.yf(c, d) + } + return !0; + case Ul: + return this.dc && (e = this.l(a), f = this.l(a + 1), h = this.l(a + 2), K.D(e.y, f.y) ? K.D(f.x, h.x) ? this.V(a + 1, f.x, b.y) : K.D(f.y, h.y) && this.V(a + 1, b.x, f.y) : K.D(e.x, f.x) && (K.D(f.y, h.y) ? this.V(a + 1, b.x, f.y) : K.D(f.x, h.x) && this.V(a + 1, f.x, b.y)), e = this.l(c), f = this.l(c - 1), h = this.l(c - 2), K.D(e.y, + f.y) ? K.D(f.x, h.x) ? this.V(c - 1, f.x, d.y) : K.D(f.y, h.y) && this.V(c - 1, d.x, f.y) : K.D(e.x, f.x) && (K.D(f.y, h.y) ? this.V(c - 1, d.x, f.y) : K.D(f.x, h.x) && this.V(c - 1, f.x, d.y))), this.yf(a, b), this.yf(c, d), !0; + default: + return !1 + } + }; + W.prototype.addOrthoPoints = function (a, b, c, d, e, f) { + b = -45 <= b && 45 > b ? 0 : 45 <= b && 135 > b ? 90 : 135 <= b && 225 > b ? 180 : 270; + d = -45 <= d && 45 > d ? 0 : 45 <= d && 135 > d ? 90 : 135 <= d && 225 > d ? 180 : 270; + var h = e.ba.copy(), k = f.ba.copy(); + if (h.J() && k.J()) { + h.Jf(8, 8); + k.Jf(8, 8); + h.Oi(a); + k.Oi(c); + var l, m; + if (0 === b) if (c.x > a.x || 270 === d && c.y < a.y && k.right > a.x || 90 === d && c.y > a.y && k.right > a.x) l = new w(c.x, a.y), m = new w(c.x, (a.y + c.y) / 2), 180 === d ? (l.x = this.computeMidOrthoPosition(a.x, c.x, !1), m.x = l.x, m.y = c.y) : 270 === d && c.y < a.y || 90 === d && c.y > a.y ? (l.x = a.x < k.left ? this.computeMidOrthoPosition(a.x, + k.left, !1) : a.x < k.right && (270 === d && a.y < k.top || 90 === d && a.y > k.bottom) ? this.computeMidOrthoPosition(a.x, c.x, !1) : k.right, m.x = l.x, m.y = c.y) : 0 === d && a.x < k.left && a.y > k.top && a.y < k.bottom && (l.x = a.x, l.y = a.y < c.y ? Math.min(c.y, k.top) : Math.max(c.y, k.bottom), m.y = l.y); else { + l = new w(a.x, c.y); + m = new w((a.x + c.x) / 2, c.y); + if (180 === d || 90 === d && c.y < h.top || 270 === d && c.y > h.bottom) 180 === d && (k.Aa(a) || h.Aa(c)) ? l.y = this.computeMidOrthoPosition(a.y, c.y, !0) : c.y < a.y && (180 === d || 90 === d) ? l.y = this.computeMidOrthoPosition(h.top, Math.max(c.y, + k.bottom), !0) : c.y > a.y && (180 === d || 270 === d) && (l.y = this.computeMidOrthoPosition(h.bottom, Math.min(c.y, k.top), !0)), m.x = c.x, m.y = l.y; + if (l.y > h.top && l.y < h.bottom) if (c.x >= h.left && c.x <= a.x || a.x <= k.right && a.x >= c.x) { + if (90 === d || 270 === d) l = new w(Math.max((a.x + c.x) / 2, a.x), a.y), m = new w(l.x, c.y) + } else l.y = 270 === d || (0 === d || 180 === d) && c.y < a.y ? Math.min(c.y, 0 === d ? h.top : Math.min(h.top, k.top)) : Math.max(c.y, 0 === d ? h.bottom : Math.max(h.bottom, k.bottom)), m.x = c.x, m.y = l.y + } else if (180 === b) if (c.x < a.x || 270 === d && c.y < a.y && k.left < a.x || + 90 === d && c.y > a.y && k.left < a.x) l = new w(c.x, a.y), m = new w(c.x, (a.y + c.y) / 2), 0 === d ? (l.x = this.computeMidOrthoPosition(a.x, c.x, !1), m.x = l.x, m.y = c.y) : 270 === d && c.y < a.y || 90 === d && c.y > a.y ? (l.x = a.x > k.right ? this.computeMidOrthoPosition(a.x, k.right, !1) : a.x > k.left && (270 === d && a.y < k.top || 90 === d && a.y > k.bottom) ? this.computeMidOrthoPosition(a.x, c.x, !1) : k.left, m.x = l.x, m.y = c.y) : 180 === d && a.x > k.right && a.y > k.top && a.y < k.bottom && (l.x = a.x, l.y = a.y < c.y ? Math.min(c.y, k.top) : Math.max(c.y, k.bottom), m.y = l.y); else { + l = new w(a.x, c.y); + m = new w((a.x + + c.x) / 2, c.y); + if (0 === d || 90 === d && c.y < h.top || 270 === d && c.y > h.bottom) 0 === d && (k.Aa(a) || h.Aa(c)) ? l.y = this.computeMidOrthoPosition(a.y, c.y, !0) : c.y < a.y && (0 === d || 90 === d) ? l.y = this.computeMidOrthoPosition(h.top, Math.max(c.y, k.bottom), !0) : c.y > a.y && (0 === d || 270 === d) && (l.y = this.computeMidOrthoPosition(h.bottom, Math.min(c.y, k.top), !0)), m.x = c.x, m.y = l.y; + if (l.y > h.top && l.y < h.bottom) if (c.x <= h.right && c.x >= a.x || a.x >= k.left && a.x <= c.x) { + if (90 === d || 270 === d) l = new w(Math.min((a.x + c.x) / 2, a.x), a.y), m = new w(l.x, c.y) + } else l.y = 270 === + d || (0 === d || 180 === d) && c.y < a.y ? Math.min(c.y, 180 === d ? h.top : Math.min(h.top, k.top)) : Math.max(c.y, 180 === d ? h.bottom : Math.max(h.bottom, k.bottom)), m.x = c.x, m.y = l.y + } else if (90 === b) if (c.y > a.y || 180 === d && c.x < a.x && k.bottom > a.y || 0 === d && c.x > a.x && k.bottom > a.y) l = new w(a.x, c.y), m = new w((a.x + c.x) / 2, c.y), 270 === d ? (l.y = this.computeMidOrthoPosition(a.y, c.y, !0), m.x = c.x, m.y = l.y) : 180 === d && c.x < a.x || 0 === d && c.x > a.x ? (l.y = a.y < k.top ? this.computeMidOrthoPosition(a.y, k.top, !0) : a.y < k.bottom && (180 === d && a.x < k.left || 0 === d && a.x > k.right) ? + this.computeMidOrthoPosition(a.y, c.y, !0) : k.bottom, m.x = c.x, m.y = l.y) : 90 === d && a.y < k.top && a.x > k.left && a.x < k.right && (l.x = a.x < c.x ? Math.min(c.x, k.left) : Math.max(c.x, k.right), l.y = a.y, m.x = l.x); else { + l = new w(c.x, a.y); + m = new w(c.x, (a.y + c.y) / 2); + if (270 === d || 0 === d && c.x < h.left || 180 === d && c.x > h.right) 270 === d && (k.Aa(a) || h.Aa(c)) ? l.x = this.computeMidOrthoPosition(a.x, c.x, !1) : c.x < a.x && (270 === d || 0 === d) ? l.x = this.computeMidOrthoPosition(h.left, Math.max(c.x, k.right), !1) : c.x > a.x && (270 === d || 180 === d) && (l.x = this.computeMidOrthoPosition(h.right, + Math.min(c.x, k.left), !1)), m.x = l.x, m.y = c.y; + if (l.x > h.left && l.x < h.right) if (c.y >= h.top && c.y <= a.y || a.y <= k.bottom && a.y >= c.y) { + if (0 === d || 180 === d) l = new w(a.x, Math.max((a.y + c.y) / 2, a.y)), m = new w(c.x, l.y) + } else l.x = 180 === d || (90 === d || 270 === d) && c.x < a.x ? Math.min(c.x, 90 === d ? h.left : Math.min(h.left, k.left)) : Math.max(c.x, 90 === d ? h.right : Math.max(h.right, k.right)), m.x = l.x, m.y = c.y + } else if (c.y < a.y || 180 === d && c.x < a.x && k.top < a.y || 0 === d && c.x > a.x && k.top < a.y) l = new w(a.x, c.y), m = new w((a.x + c.x) / 2, c.y), 90 === d ? (l.y = this.computeMidOrthoPosition(a.y, + c.y, !0), m.x = c.x, m.y = l.y) : 180 === d && c.x < a.x || 0 === d && c.x >= a.x ? (l.y = a.y > k.bottom ? this.computeMidOrthoPosition(a.y, k.bottom, !0) : a.y > k.top && (180 === d && a.x < k.left || 0 === d && a.x > k.right) ? this.computeMidOrthoPosition(a.y, c.y, !0) : k.top, m.x = c.x, m.y = l.y) : 270 === d && a.y > k.bottom && a.x > k.left && a.x < k.right && (l.x = a.x < c.x ? Math.min(c.x, k.left) : Math.max(c.x, k.right), l.y = a.y, m.x = l.x); else { + l = new w(c.x, a.y); + m = new w(c.x, (a.y + c.y) / 2); + if (90 === d || 0 === d && c.x < h.left || 180 === d && c.x > h.right) 90 === d && (k.Aa(a) || h.Aa(c)) ? l.x = this.computeMidOrthoPosition(a.x, + c.x, !1) : c.x < a.x && (90 === d || 0 === d) ? l.x = this.computeMidOrthoPosition(h.left, Math.max(c.x, k.right), !1) : c.x > a.x && (90 === d || 180 === d) && (l.x = this.computeMidOrthoPosition(h.right, Math.min(c.x, k.left), !1)), m.x = l.x, m.y = c.y; + if (l.x > h.left && l.x < h.right) if (c.y <= h.bottom && c.y >= a.y || a.y >= k.top && a.y <= c.y) { + if (0 === d || 180 === d) l = new w(a.x, Math.min((a.y + c.y) / 2, a.y)), m = new w(c.x, l.y) + } else l.x = 180 === d || (90 === d || 270 === d) && c.x < a.x ? Math.min(c.x, 270 === d ? h.left : Math.min(h.left, k.left)) : Math.max(c.x, 270 === d ? h.right : Math.max(h.right, + k.right)), m.x = l.x, m.y = c.y + } + var n = l, p = m; + if (this.el) { + var q = this.g, r; + (r = null === q) || (q.Lb.Vg ? r = !1 : (r = q.Va, r = r instanceof uf ? !r.jv || r.YG : !0), r = !r); + if (r || h.Aa(c) && !f.Ph(e) || k.Aa(a) && !e.Ph(f) || e === f || this.layer.Ac) a = !1; else if (e = Lk(q, !0, this.Ra, null), e.Jo(Math.min(a.x, n.x), Math.min(a.y, n.y), Math.abs(a.x - n.x), Math.abs(a.y - n.y)) && e.Jo(Math.min(n.x, p.x), Math.min(n.y, p.y), Math.abs(n.x - p.x), Math.abs(n.y - p.y)) && e.Jo(Math.min(p.x, c.x), Math.min(p.y, c.y), Math.abs(p.x - c.x), Math.abs(p.y - c.y))) a = !1; else if (h = h.copy().Sh(k), + h.Jf(2 * e.ro, 2 * e.po), Io(e, a, b, c, d, h), k = Jo(e, c.x, c.y), e.abort || 999999 !== k || (Ok(e), k = e.KE, h.Jf(e.ro * k, e.po * k), Io(e, a, b, c, d, h), k = Jo(e, c.x, c.y)), e.abort || 999999 !== k || (Ok(e), k = e.SD, h.Jf(e.ro * k, e.po * k), Io(e, a, b, c, d, h), k = Jo(e, c.x, c.y)), !e.abort && 999999 === k && e.$E && (Ok(e), Io(e, a, b, c, d, e.kb), k = Jo(e, c.x, c.y)), !e.abort && 999999 > k && 0 !== Jo(e, c.x, c.y)) { + Ko(this, e, c.x, c.y, d, !0); + d = this.l(2); + if (4 > this.ka) 0 === b || 180 === b ? (d.x = a.x, d.y = c.y) : (d.x = c.x, d.y = a.y), this.V(2, d.x, d.y), this.w(3, d.x, d.y); else if (c = this.l(3), 0 === b || + 180 === b) K.D(d.x, c.x) ? (b = 0 === b ? Math.max(d.x, a.x) : Math.min(d.x, a.x), this.V(2, b, a.y), this.V(3, b, c.y)) : K.D(d.y, c.y) ? (Math.abs(a.y - d.y) <= e.po / 2 && (this.V(2, d.x, a.y), this.V(3, c.x, a.y)), this.w(2, d.x, a.y)) : this.V(2, a.x, d.y); else if (90 === b || 270 === b) K.D(d.y, c.y) ? (b = 90 === b ? Math.max(d.y, a.y) : Math.min(d.y, a.y), this.V(2, a.x, b), this.V(3, c.x, b)) : K.D(d.x, c.x) ? (Math.abs(a.x - d.x) <= e.ro / 2 && (this.V(2, a.x, d.y), this.V(3, a.x, c.y)), this.w(2, a.x, d.y)) : this.V(2, d.x, a.y); + a = !0 + } else a = !1 + } else a = !1; + a || (this.Jh(l), this.Jh(m)) + } + }; + W.prototype.computeMidOrthoPosition = function (a, b) { + if (this.hasCurviness()) { + var c = this.computeCurviness(); + return (a + b) / 2 + c + } + return (a + b) / 2 + }; + + function gg(a) { + if (!a.el) return !1; + var b = a.points.n, c = b.length; + if (4 > c) return !1; + a = Lk(a.g, !0, a.Ra, null); + for (var d = 1; d < c - 2; d++) { + var e = b[d], f = b[d + 1]; + if (!a.Jo(Math.min(e.x, f.x), Math.min(e.y, f.y), Math.abs(e.x - f.x), Math.abs(e.y - f.y))) return !0 + } + return !1 + } + + function Ko(a, b, c, d, e, f) { + var h = b.ro, k = b.po, l = Jo(b, c, d), m = c, n = d; + for (0 === e ? m += h : 90 === e ? n += k : 180 === e ? m -= h : n -= k; 1 < l && Jo(b, m, n) === l - 1;) c = m, d = n, 0 === e ? m += h : 90 === e ? n += k : 180 === e ? m -= h : n -= k, l -= 1; + if (f) { + if (1 < l) if (180 === e || 0 === e) c = Math.floor(c / h) * h + h / 2; else if (90 === e || 270 === e) d = Math.floor(d / k) * k + k / 2 + } else c = Math.floor(c / h) * h + h / 2, d = Math.floor(d / k) * k + k / 2; + 1 < l && (f = e, m = c, n = d, 0 === e ? (f = 90, n += k) : 90 === e ? (f = 180, m -= h) : 180 === e ? (f = 270, n -= k) : 270 === e && (f = 0, m += h), Jo(b, m, n) === l - 1 ? Ko(a, b, m, n, f, !1) : (m = c, n = d, 0 === e ? (f = 270, n -= k) : 90 === + e ? (f = 0, m += h) : 180 === e ? (f = 90, n += k) : 270 === e && (f = 180, m -= h), Jo(b, m, n) === l - 1 && Ko(a, b, m, n, f, !1))); + a.Lk(c, d) + } + + W.prototype.findClosestSegment = function (a) { + var b = a.x; + a = a.y; + for (var c = this.l(0), d = this.l(1), e = Xa(b, a, c.x, c.y, d.x, d.y), f = 0, h = 1; h < this.ka - 1; h++) { + var c = this.l(h + 1), k = Xa(b, a, d.x, d.y, c.x, c.y), d = c; + k < e && (f = h, e = k) + } + return f + }; + W.prototype.invalidateGeometry = W.prototype.le = function () { + this.Pa = null; + this.R() + }; + u.u(W, {dd: "geometry"}, function () { + null === this.Pa && (this.updateRoute(), this.Pa = this.makeGeometry()); + return this.Pa + }); + W.prototype.Xs = function () { + if (null === this.Pa && !1 !== this.hg) { + this.Pa = this.makeGeometry(); + var a = this.path; + if (null !== a) { + a.Pa = this.Pa; + for (var b = this.ya.n, c = b.length, d = 0; d < c; d++) { + var e = b[d]; + e !== a && e.tg && e instanceof X && (e.Pa = this.Pa) + } + } + } + }; + W.prototype.makeGeometry = function () { + var a = this.ka; + if (2 > a) { + var b = new $c(ad), c = new bd(0, 0); + b.ub.add(c); + return b + } + var d = !1, b = this.g; + null !== b && 0 !== b.ha.Le && xo(this) && (d = !0); + var c = b = 0, e = this.l(0).copy(), f = e.copy(), b = this.Qc.n, h = this.computeCurve(); + if (h === kh && 3 <= a && !K.mb(this.gp, 0)) if (3 === a) var k = this.l(1), b = Math.min(e.x, k.x), + c = Math.min(e.y, k.y), k = this.l(2), b = Math.min(b, k.x), c = Math.min(c, k.y); else { + if (this.dc) for (k = 0; k < a; k++) c = b[k], f.x = Math.min(c.x, f.x), f.y = Math.min(c.y, f.y); else for (k = 3; k < a; k += 3) k + 3 >= a && + (k = a - 1), b = this.l(k), f.x = Math.min(b.x, f.x), f.y = Math.min(b.y, f.y); + b = f.x; + c = f.y + } else { + for (k = 0; k < a; k++) c = b[k], f.x = Math.min(c.x, f.x), f.y = Math.min(c.y, f.y); + b = f.x; + c = f.y + } + b -= this.Dy.x; + c -= this.Dy.y; + e.x -= b; + e.y -= c; + if (2 === a) { + var l = this.l(1).copy(); + l.x -= b; + l.y -= c; + 0 !== Go(this) && Lo(this, e, !0, f); + 0 !== Ho(this) && Lo(this, l, !1, f); + b = new $c(dd); + b.ua = e.x; + b.va = e.y; + b.F = l.x; + b.G = l.y + } else { + l = u.p(); + 0 !== Go(this) && Lo(this, e, !0, f); + M(l, e.x, e.y, !1, !1); + if (h === kh && 3 <= a && !K.mb(this.gp, 0)) if (3 === a) k = this.l(1), a = k.x - b, d = k.y - c, k = this.l(2).copy(), + k.x -= b, k.y -= c, 0 !== Ho(this) && Lo(this, k, !1, f), O(l, a, d, a, d, k.x, k.y); else if (this.dc) { + for (var f = new w(b, c), e = this.l(1).copy(), h = new w(b, c), a = new w(b, c), d = this.l(0), m = null, n = this.gp / 3, k = 1; k < this.ka - 1; k++) { + var m = this.l(k), p = d, q = m, r = this.l(Mo(this, m, k, !1)); + if (!K.mb(p.x, q.x) || !K.mb(q.x, r.x)) if (!K.mb(p.y, q.y) || !K.mb(q.y, r.y)) { + var s = n, t = h, v = a; + isNaN(s) && (s = this.gp / 3); + var x = p.x, p = p.y, B = q.x, q = q.y, y = r.x, r = r.y, C = s * No(x, p, B, q), + s = s * No(B, q, y, r); + K.mb(p, q) && K.mb(B, y) && (B > x ? r > q ? (t.x = B - C, t.y = q - C, v.x = B + s, v.y = q + s) : (t.x = + B - C, t.y = q + C, v.x = B + s, v.y = q - s) : r > q ? (t.x = B + C, t.y = q - C, v.x = B - s, v.y = q + s) : (t.x = B + C, t.y = q + C, v.x = B - s, v.y = q - s)); + K.mb(x, B) && K.mb(q, r) && (q > p ? (y > B ? (t.x = B - C, t.y = q - C, v.x = B + s) : (t.x = B + C, t.y = q - C, v.x = B - s), v.y = q + s) : (y > B ? (t.x = B - C, t.y = q + C, v.x = B + s) : (t.x = B + C, t.y = q + C, v.x = B - s), v.y = q - s)); + if (K.mb(x, B) && K.mb(B, y) || K.mb(p, q) && K.mb(q, r)) x = .5 * (x + y), p = .5 * (p + r), t.x = x, t.y = p, v.x = x, v.y = p; + 1 === k ? (e.x = .5 * (d.x + m.x), e.y = .5 * (d.y + m.y)) : 2 === k && K.mb(d.x, this.l(0).x) && K.mb(d.y, this.l(0).y) && (e.x = .5 * (d.x + m.x), e.y = .5 * (d.y + m.y)); + O(l, e.x - b, e.y - c, + h.x - b, h.y - c, m.x - b, m.y - c); + f.set(h); + e.set(a); + d = m + } + } + k = d.x; + d = d.y; + f = this.l(this.ka - 1); + k = .5 * (k + f.x); + d = .5 * (d + f.y); + O(l, a.x - b, a.y - c, k - b, d - c, f.x - b, f.y - c) + } else for (k = 3; k < a; k += 3) d = this.l(k - 2), k + 3 >= a && (k = a - 1), f = this.l(k - 1), e = this.l(k), k === a - 1 && 0 !== Ho(this) && (e = e.copy(), Lo(this, e, !1, K.Wj)), O(l, d.x - b, d.y - c, f.x - b, f.y - c, e.x - b, e.y - c); else { + f = u.K(); + f.assign(this.l(0)); + for (k = 1; k < a;) { + k = Mo(this, f, k, 1 < k); + t = this.l(k); + if (k >= a - 1) { + f !== t && (0 !== Ho(this) && (t = t.copy(), Lo(this, t, !1, K.Wj)), Oo(this, l, -b, -c, f, t, d)); + break + } + k = Mo(this, t, + k + 1, k < a - 3); + e = l; + h = -b; + m = -c; + n = f; + v = this.l(k); + x = f; + p = d; + K.D(n.y, t.y) && K.D(t.x, v.x) ? (s = this.computeCorner(), s = Math.min(s, Math.abs(t.x - n.x) / 2), s = B = Math.min(s, Math.abs(v.y - t.y) / 2), K.D(s, 0) ? (Oo(this, e, h, m, n, t, p), x.assign(t)) : (q = t.x, y = t.y, r = q, C = y, q = t.x > n.x ? t.x - s : t.x + s, C = v.y > t.y ? t.y + B : t.y - B, Oo(this, e, h, m, n, new w(q, y), p), td(e, t.x + h, t.y + m, r + h, C + m), x.m(r, C))) : K.D(n.x, t.x) && K.D(t.y, v.y) ? (s = this.computeCorner(), B = Math.min(s, Math.abs(t.y - n.y) / 2), B = s = Math.min(B, Math.abs(v.x - t.x) / 2), K.D(s, 0) ? (Oo(this, e, h, m, n, t, p), x.assign(t)) : + (q = t.x, C = y = t.y, y = t.y > n.y ? t.y - B : t.y + B, r = v.x > t.x ? t.x + s : t.x - s, Oo(this, e, h, m, n, new w(q, y), p), td(e, t.x + h, t.y + m, r + h, C + m), x.m(r, C))) : (Oo(this, e, h, m, n, t, p), x.assign(t)) + } + u.v(f) + } + b = l.o; + u.q(l) + } + return b + }; + + function No(a, b, c, d) { + a = c - a; + if (isNaN(a) || Infinity === a || -Infinity === a) return NaN; + 0 > a && (a = -a); + b = d - b; + if (isNaN(b) || Infinity === b || -Infinity === b) return NaN; + 0 > b && (b = -b); + return K.mb(a, 0) ? b : K.mb(b, 0) ? a : Math.sqrt(a * a + b * b) + } + + function Lo(a, b, c, d) { + var e = a.ka; + if (!(2 > e)) if (c) { + var f = a.l(1); + c = f.x - d.x; + d = f.y - d.y; + f = No(b.x, b.y, c, d); + 0 !== f && (e = 2 === e ? .5 * f : f, a = Go(a), a > e && (a = e), c = a * (c - b.x) / f, a = a * (d - b.y) / f, b.x += c, b.y += a) + } else f = a.l(e - 2), c = f.x - d.x, d = f.y - d.y, f = No(b.x, b.y, c, d), 0 !== f && (e = 2 === e ? .5 * f : f, a = Ho(a), a > e && (a = e), c = a * (b.x - c) / f, a = a * (b.y - d) / f, b.x -= c, b.y -= a) + } + + function Mo(a, b, c, d) { + for (var e = a.ka, f = b; K.mb(b.x, f.x) && K.mb(b.y, f.y);) { + if (c >= e) return e - 1; + f = a.l(c++) + } + if (!K.mb(b.x, f.x) && !K.mb(b.y, f.y)) return c - 1; + for (var h = f; K.mb(b.x, f.x) && K.mb(f.x, h.x) && (!d || (b.y >= f.y ? f.y >= h.y : f.y <= h.y)) || K.mb(b.y, f.y) && K.mb(f.y, h.y) && (!d || (b.x >= f.x ? f.x >= h.x : f.x <= h.x));) { + if (c >= e) return e - 1; + h = a.l(c++) + } + return c - 2 + } + + function Oo(a, b, c, d, e, f, h) { + if (!h && xo(a)) { + h = []; + var k = 0; + a.Ea() && (k = Po(a, e, f, h)); + var l = e.x, l = e.y; + if (0 < k) if (K.D(e.y, f.y)) if (e.x < f.x) for (var m = 0; m < k;) { + var n = Math.max(e.x, Math.min(h[m++] - 5, f.x - 10)); + b.lineTo(n + c, f.y + d); + for (var l = n + c, p = Math.min(n + 10, f.x); m < k;) { + var q = h[m]; + if (q < p + 10) m++, p = Math.min(q + 5, f.x); else break + } + q = (n + p) / 2 + c; + q = f.y - 10 + d; + n = p + c; + p = f.y + d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, l, q, n, q, n, p) + } else for (m = k - 1; 0 <= m;) { + n = Math.min(e.x, Math.max(h[m--] + 5, f.x + 10)); + b.lineTo(n + c, f.y + d); + l = n + c; + for (p = Math.max(n - 10, f.x); 0 <= + m;) if (q = h[m], q > p - 10) m--, p = Math.max(q - 5, f.x); else break; + q = f.y - 10 + d; + n = p + c; + p = f.y + d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, l, q, n, q, n, p) + } else if (K.D(e.x, f.x)) if (e.y < f.y) for (m = 0; m < k;) { + n = Math.max(e.y, Math.min(h[m++] - 5, f.y - 10)); + b.lineTo(f.x + c, n + d); + l = n + d; + for (p = Math.min(n + 10, f.y); m < k;) if (q = h[m], q < p + 10) m++, p = Math.min(q + 5, f.y); else break; + q = f.x - 10 + c; + n = f.x + c; + p += d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, q, l, q, p, n, p) + } else for (m = k - 1; 0 <= m;) { + n = Math.min(e.y, Math.max(h[m--] + 5, f.y + 10)); + b.lineTo(f.x + c, n + d); + l = n + d; + for (p = Math.max(n - 10, f.y); 0 <= + m;) if (q = h[m], q > p - 10) m--, p = Math.max(q - 5, f.y); else break; + q = f.x - 10 + c; + n = f.x + c; + p += d; + a.Ve === ch ? M(b, n, p, !1, !1) : O(b, q, l, q, p, n, p) + } + } + b.lineTo(f.x + c, f.y + d) + } + + function Po(a, b, c, d) { + var e = a.g; + if (null === e || b.L(c)) return 0; + for (e = e.mw; e.next();) { + var f = e.value; + if (null !== f && f.visible) for (var f = f.Db.n, h = f.length, k = 0; k < h; k++) { + var l = f[k]; + if (l instanceof W) { + if (l === a) return 0 < d.length && d.sort(function (a, b) { + return a - b + }), d.length; + if (l.Ea() && xo(l)) { + var m = l.Mm; + m.J() && a.Mm.sg(m) && !a.usesSamePort(l) && (m = l.path, null !== m && m.kl() && Qo(b, c, d, l)) + } + } + } + } + 0 < d.length && d.sort(function (a, b) { + return a - b + }); + return d.length + } + + function Qo(a, b, c, d) { + for (var e = K.D(a.y, b.y), f = d.ka, h = d.l(0), k = u.K(), l = 1; l < f; l++) { + var m = d.l(l); + if (l < f - 1) { + var n = d.l(l + 1); + if (h.y === m.y && m.y === n.y) { + if (m.x > h.x && n.x > m.x || m.x < h.x && n.x < m.x) m = n, l++ + } else h.x === m.x && m.x === n.x && (m.y > h.y && n.y > m.y || m.y < h.y && n.y < m.y) && (m = n, l++) + } + a:{ + var n = k, p = a.x, q = a.y, r = b.x, s = b.y, t = h.x, h = h.y, v = m.x, x = m.y; + if (!K.D(p, r)) { + if (K.D(q, s) && K.D(t, v) && Math.min(p, r) < t && Math.max(p, r) > t && Math.min(h, x) < q && Math.max(h, x) > q && !K.D(h, x)) { + n.x = t; + n.y = q; + n = !0; + break a + } + } else if (!K.D(q, s) && K.D(h, x) && Math.min(q, + s) < h && Math.max(q, s) > h && Math.min(t, v) < p && Math.max(t, v) > p && !K.D(t, v)) { + n.x = p; + n.y = h; + n = !0; + break a + } + n.x = 0; + n.y = 0; + n = !1 + } + n && (e ? c.push(k.x) : c.push(k.y)); + h = m + } + u.v(k) + } + + u.u(W, {Bs: "firstPickIndex"}, function () { + return 2 >= this.ka ? 0 : this.dc || Ao(this) !== vb ? 1 : 0 + }); + u.u(W, {lw: "lastPickIndex"}, function () { + var a = this.ka; + return 0 === a ? 0 : 2 >= a ? a - 1 : this.dc || Bo(this) !== vb ? a - 2 : a - 1 + }); + + function xo(a) { + a = a.Ve; + return a === bh || a === ch + } + + function zo(a, b) { + if (b || xo(a)) { + var c = a.g; + null === c || c.El.contains(a) || null === a.py || c.El.add(a, a.py) + } + } + + function eh(a, b) { + var c = a.layer; + if (null !== c && c.visible && !c.Ac) { + var d = c.g; + if (null !== d) for (var e = !1, d = d.mw; d.next();) { + var f = d.value; + if (f.visible) if (f === c) for (var e = !0, h = !1, f = f.Db.n, k = f.length, l = 0; l < k; l++) { + var m = f[l]; + m instanceof W && (m === a ? h = !0 : h && Ro(a, m, b)) + } else if (e) for (f = f.Db.n, k = f.length, l = 0; l < k; l++) m = f[l], m instanceof W && Ro(a, m, b) + } + } + } + + function Ro(a, b, c) { + if (null !== b && null !== b.Pa && xo(b)) { + var d = b.Mm; + d.J() && (a.Mm.sg(d) || c.sg(d)) && (a.usesSamePort(b) || b.le()) + } + } + + W.prototype.usesSamePort = function (a) { + var b = this.ka, c = a.ka; + if (0 < b && 0 < c) { + var d = this.l(0), e = a.l(0); + if (d.De(e)) return !0; + b = this.l(b - 1); + a = a.l(c - 1); + if (b.De(a) || d.De(a) || b.De(e)) return !0 + } else if (this.W === a.W || this.ca === a.ca || this.W == a.ca || this.ca == a.W) return !0; + return !1 + }; + W.prototype.He = function (a) { + G.prototype.He.call(this, a); + if (null !== this.ue) for (var b = this.ue.i; b.next();) b.value.He(a) + }; + u.defineProperty(W, {es: "adjusting"}, function () { + return this.tp + }, function (a) { + var b = this.tp; + b !== a && (this.tp = a, this.h("adjusting", b, a)) + }); + u.defineProperty(W, {Yy: "corner"}, function () { + return this.Hp + }, function (a) { + var b = this.Hp; + b !== a && (this.Hp = a, this.le(), this.h("corner", b, a)) + }); + u.defineProperty(W, {Ve: "curve"}, function () { + return this.Kp + }, function (a) { + var b = this.Kp; + b !== a && (this.Kp = a, this.Vb(), zo(this, b === ch || b === bh || a === ch || a === bh), this.h("curve", b, a)) + }); + u.defineProperty(W, {Ov: "curviness"}, function () { + return this.Lp + }, function (a) { + var b = this.Lp; + b !== a && (this.Lp = a, this.Vb(), this.h("curviness", b, a)) + }); + u.defineProperty(W, {zw: "routing"}, function () { + return this.Yl + }, function (a) { + var b = this.Yl; + b !== a && (this.Yl = a, this.di = null, this.Vb(), zo(this, 2 === (b.value & 2) || 2 === (a.value & 2)), this.h("routing", b, a)) + }); + u.defineProperty(W, {gp: "smoothness"}, function () { + return this.Kr + }, function (a) { + var b = this.Kr; + b !== a && (this.Kr = a, this.le(), this.h("smoothness", b, a)) + }); + + function vo(a) { + var b = a.Wf; + if (null !== b) { + var c = a.gg; + if (null !== c) { + var d = a.wh, e = a.Ih; + a:{ + if (null !== c && null !== b.nh) for (a = b.nh.i; a.next();) { + var f = a.value; + if (f.Uo === b && f.at === c && f.uw === d && f.vw === e || f.Uo === c && f.at === b && f.uw === e && f.vw === d) { + a = f; + break a + } + } + a = null + } + for (var h = null, k = null, l = b.hc.n, m = l.length, f = 0; f < m; f++) { + var n = l[f]; + if (n.Wf === b && n.wh === d && n.gg === c && n.Ih === e || n.Wf === c && n.wh === e && n.gg === b && n.Ih === d) null === k ? k = n : (null === h && (h = new E(W), h.add(k)), h.add(n)) + } + if (null !== h) for (null === a && (a = new bo, a.Uo = b, a.uw = + d, a.at = c, a.vw = e, ao(b, a), ao(c, a)), a.links = h, b = h.n, f = 0; f < b.length; f++) if (n = b[f], 0 === n.hf) { + c = 1; + for (d = 0; d < b.length; d++) Math.abs(b[d].hf) === c && (c++, d = -1); + n.an = a; + n.hf = n.W === a.Uo ? c : -c; + c = n.g; + (null === c || c.lf) && n.Vb() + } + } + } + } + + function uo(a) { + var b = a.an; + if (null !== b) { + var c = a.hf; + a.an = null; + a.hf = 0; + b.links.remove(a); + if (2 > b.links.count) 1 === b.links.count && (c = b.links.n[0], c.an = null, c.hf = 0, c.Vb()), c = b.Uo, null !== b && null !== c.nh && c.nh.remove(b), c = b.at, null !== b && null !== c.nh && c.nh.remove(b); else for (c = Math.abs(c), a = 0 === c % 2, b = b.links.i; b.next();) { + var d = b.value, e = Math.abs(d.hf), f = 0 === e % 2; + e > c && a === f && (d.hf = 0 < d.hf ? d.hf - 2 : d.hf + 2, d.Vb()) + } + } + } + + function bo() { + u.gc(this); + this.links = this.vw = this.at = this.uw = this.Uo = null + } + + u.Xd(bo, {Uo: !0, uw: !0, at: !0, vw: !0, links: !0, spacing: !0}); + + function Mk() { + u.gc(this); + this.fA = this.group = null; + this.Ls = !0; + this.abort = !1; + this.bg = this.ag = 1; + this.Jq = this.Iq = -1; + this.he = this.ge = 8; + this.mc = null; + this.$E = !1; + this.KE = 22; + this.SD = 111 + } + + u.Xd(Mk, {group: !0, fA: !0, Ls: !0, abort: !0, $E: !0, KE: !0, SD: !0}); + Mk.prototype.initialize = function (a) { + if (!(0 >= a.width || 0 >= a.height)) { + var b = a.y, c = a.x + a.width, d = a.y + a.height; + this.ag = Math.floor((a.x - this.ge) / this.ge) * this.ge; + this.bg = Math.floor((b - this.he) / this.he) * this.he; + this.Iq = Math.ceil((c + 2 * this.ge) / this.ge) * this.ge; + this.Jq = Math.ceil((d + 2 * this.he) / this.he) * this.he; + a = 1 + (Math.ceil((this.Iq - this.ag) / this.ge) | 0); + b = 1 + (Math.ceil((this.Jq - this.bg) / this.he) | 0); + if (null === this.mc || this.ho < a - 1 || this.io < b - 1) { + c = []; + for (d = 0; d <= a; d++) { + for (var e = [], f = 0; f <= b; f++) e[f] = 0; + c[d] = e + } + this.mc = + c; + this.ho = a - 1; + this.io = b - 1 + } + if (null !== this.mc) for (a = 0; a <= this.ho; a++) for (b = 0; b <= this.io; b++) this.mc[a][b] = 999999 + } + }; + u.u(Mk, {kb: null}, function () { + return new z(this.ag, this.bg, this.Iq - this.ag, this.Jq - this.bg) + }); + u.defineProperty(Mk, {ro: null}, function () { + return this.ge + }, function (a) { + 0 < a && a !== this.ge && (this.ge = a, this.initialize(this.kb)) + }); + u.defineProperty(Mk, {po: null}, function () { + return this.he + }, function (a) { + 0 < a && a !== this.he && (this.he = a, this.initialize(this.kb)) + }); + + function So(a, b, c) { + return a.ag <= b && b <= a.Iq && a.bg <= c && c <= a.Jq + } + + function Jo(a, b, c) { + if (!So(a, b, c)) return 0; + b -= a.ag; + b /= a.ge; + c -= a.bg; + c /= a.he; + return a.mc[b | 0][c | 0] + } + + function Pk(a, b, c) { + So(a, b, c) && (b -= a.ag, b /= a.ge, c -= a.bg, c /= a.he, a.mc[b | 0][c | 0] = 0) + } + + function Ok(a) { + if (null !== a.mc) for (var b = 0; b <= a.ho; b++) for (var c = 0; c <= a.io; c++) 1 <= a.mc[b][c] && (a.mc[b][c] |= 999999) + } + + Mk.prototype.Jo = function (a, b, c, d) { + if (a > this.Iq || a + c < this.ag || b > this.Jq || b + d < this.bg) return !0; + a = (a - this.ag) / this.ge | 0; + b = (b - this.bg) / this.he | 0; + c = Math.max(0, c) / this.ge + 1 | 0; + var e = Math.max(0, d) / this.he + 1 | 0; + 0 > a && (c += a, a = 0); + 0 > b && (e += b, b = 0); + if (0 > c || 0 > e) return !0; + d = Math.min(a + c - 1, this.ho) | 0; + for (c = Math.min(b + e - 1, this.io) | 0; a <= d; a++) for (e = b; e <= c; e++) if (0 === this.mc[a][e]) return !1; + return !0 + }; + + function To(a, b, c, d, e, f, h, k, l) { + if (!(b < f || b > h || c < k || c > l)) { + var m, n; + m = b | 0; + n = c | 0; + var p = a.mc[m][n]; + if (1 <= p && 999999 > p) for (e ? n += d : m += d, p += 1; f <= m && m <= h && k <= n && n <= l && !(p >= a.mc[m][n]);) a.mc[m][n] = p, p += 1, e ? n += d : m += d; + m = e ? n : m; + if (e) if (0 < d) for (c += d; c < m; c += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, k, l); else for (c += d; c > m; c += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, k, l); else if (0 < d) for (b += d; b < m; b += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, k, l); else for (b += d; b > m; b += d) To(a, b, c, 1, !e, f, h, k, l), To(a, b, c, -1, !e, f, h, + k, l) + } + } + + function Uo(a, b, c, d, e, f, h, k, l, m, n) { + for (var p = b | 0, q = c | 0, r = a.mc[p][q]; 0 === r && p > k && p < l && q > m && q < n;) if (h ? q += f : p += f, r = a.mc[p][q], 1 >= Math.abs(p - d) && 1 >= Math.abs(q - e)) return a.abort = !0, 0; + p = b | 0; + q = c | 0; + r = a.mc[p][q]; + b = 1; + for (a.mc[p][q] = b; 0 === r && p > k && p < l && q > m && q < n;) h ? q += f : p += f, r = a.mc[p][q], a.mc[p][q] = b, b += 1; + return h ? q : p + } + + function Io(a, b, c, d, e, f) { + if (null !== a.mc) { + a.abort = !1; + var h = b.x, k = b.y; + if (So(a, h, k)) { + var h = h - a.ag, h = h / a.ge, k = k - a.bg, k = k / a.he, l = d.x, m = d.y; + if (So(a, l, m)) if (l -= a.ag, l /= a.ge, m -= a.bg, m /= a.he, 1 >= Math.abs(h - l) && 1 >= Math.abs(k - m)) a.abort = !0; else { + var n = f.x; + b = f.y; + d = f.x + f.width; + var p = f.y + f.height, n = n - a.ag, n = n / a.ge; + b -= a.bg; + b /= a.he; + d -= a.ag; + d /= a.ge; + p -= a.bg; + p /= a.he; + f = Math.max(0, Math.min(a.ho, n | 0)); + d = Math.min(a.ho, Math.max(0, d | 0)); + b = Math.max(0, Math.min(a.io, b | 0)); + var p = Math.min(a.io, Math.max(0, p | 0)), h = h | 0, k = k | 0, l = l | 0, + m = m | 0, n = h, q = k, r = 0 === c || 90 === c ? 1 : -1; + (c = 90 === c || 270 === c) ? q = Uo(a, h, k, l, m, r, c, f, d, b, p) : n = Uo(a, h, k, l, m, r, c, f, d, b, p); + if (!a.abort) { + a:{ + c = 0 === e || 90 === e ? 1 : -1; + e = 90 === e || 270 === e; + for (var r = l | 0, s = m | 0, t = a.mc[r][s]; 0 === t && r > f && r < d && s > b && s < p;) if (e ? s += c : r += c, t = a.mc[r][s], 1 >= Math.abs(r - h) && 1 >= Math.abs(s - k)) { + a.abort = !0; + break a + } + r = l | 0; + s = m | 0; + t = a.mc[r][s]; + for (a.mc[r][s] = 999999; 0 === t && r > f && r < d && s > b && s < p;) e ? s += c : r += c, t = a.mc[r][s], a.mc[r][s] = 999999 + } + a.abort || (To(a, n, q, 1, !1, f, d, b, p), To(a, n, q, -1, !1, f, d, b, p), To(a, n, q, 1, !0, f, d, + b, p), To(a, n, q, -1, !0, f, d, b, p)) + } + } + } + } + } + + function Eo() { + u.gc(this); + this.port = this.Cc = null; + this.wg = []; + this.To = !1 + } + + u.Xd(Eo, {Cc: !0, port: !0, wg: !0, To: !0}); + Eo.prototype.toString = function () { + for (var a = this.wg, b = this.Cc.toString() + " " + a.length.toString() + ":", c = 0; c < a.length; c++) { + var d = a[c]; + null !== d && (b += "\n " + d.toString()) + } + return b + }; + + function Vo(a, b, c, d) { + b = b.offsetY; + switch (b) { + case u.Nc: + return 90; + case u.Fc: + return 180; + case u.Xc: + return 270; + case u.Oc: + return 0 + } + switch (b) { + case u.Nc | u.Xc: + return 180 < c ? 270 : 90; + case u.Fc | u.Oc: + return 90 < c && 270 >= c ? 180 : 0 + } + a = 180 * Math.atan2(a.height, a.width) / Math.PI; + switch (b) { + case u.Fc | u.Xc: + return c > a && c <= 180 + a ? 180 : 270; + case u.Xc | u.Oc: + return c > 180 - a && c <= 360 - a ? 270 : 0; + case u.Oc | u.Nc: + return c > a && c <= 180 + a ? 90 : 0; + case u.Nc | u.Fc: + return c > 180 - a && c <= 360 - a ? 180 : 90; + case u.Fc | u.Xc | u.Oc: + return 90 < c && c <= 180 + a ? 180 : c > 180 + a && c <= 360 - + a ? 270 : 0; + case u.Xc | u.Oc | u.Nc: + return 180 < c && c <= 360 - a ? 270 : c > a && 180 >= c ? 90 : 0; + case u.Oc | u.Nc | u.Fc: + return c > a && c <= 180 - a ? 90 : c > 180 - a && 270 >= c ? 180 : 0; + case u.Nc | u.Fc | u.Xc: + return c > 180 - a && c <= 180 + a ? 180 : c > 180 + a ? 270 : 90 + } + d && b !== (u.Fc | u.Xc | u.Oc | u.Nc) && (c -= 15, 0 > c && (c += 360)); + return c > a && c < 180 - a ? 90 : c >= 180 - a && c <= 180 + a ? 180 : c > 180 + a && c < 360 - a ? 270 : 0 + } + + function Fo(a, b) { + var c = a.wg; + if (0 === c.length) { + a:if (!a.To) { + c = a.To; + a.To = !0; + var d, e = null, f = a.Cc, f = f instanceof V ? f : null; + if (null === f || f.be) d = a.Cc.qD(a.port.Jd); else { + if (!f.ba.J()) { + a.To = c; + break a + } + e = f; + d = e.pD() + } + var h = a.wg.length = 0, k = a.port.lb(xb, u.K()), l = a.port.lb(Vb, u.K()), f = u.Vj(k.x, k.y, 0, 0); + f.Oi(l); + u.v(k); + u.v(l); + k = u.fc(f.x + f.width / 2, f.y + f.height / 2); + for (d = d.i; d.next();) if (l = d.value, l.Ea()) { + var m = vb, n = l.od === a.port || l.W.Ph(e), m = n ? Ao(l, a.port) : Bo(l, a.port); + if (m.Go() && (n = n ? l.fe : l.od, null !== n)) { + var p = n.T; + if (null !== + p) { + var n = l.computeOtherPoint(p, n), p = k.Fi(n), m = Vo(f, m, p, l.dc), q = 0; + 0 === m ? (q = u.Oc, 180 < p && (p -= 360)) : q = 90 === m ? u.Nc : 180 === m ? u.Fc : u.Xc; + m = a.wg[h]; + void 0 === m ? (m = new Wo(l, p, q), a.wg[h] = m) : (m.link = l, m.angle = p, m.ee = q); + m.tw.set(n); + h++ + } + } + } + u.v(k); + a.wg.sort(Eo.prototype.GH); + e = a.wg.length; + k = -1; + for (h = d = 0; h < e; h++) m = a.wg[h], void 0 !== m && (m.ee !== k && (k = m.ee, d = 0), m.Do = d, d++); + k = -1; + d = 0; + for (h = e - 1; 0 <= h; h--) m = a.wg[h], void 0 !== m && (m.ee !== k && (k = m.ee, d = m.Do + 1), m.vm = d); + h = a.wg; + n = a.port; + e = a.Cc.NH; + k = u.K(); + d = u.K(); + l = u.K(); + m = u.K(); + n.lb(xb, + k); + n.lb(Gb, d); + n.lb(Vb, l); + n.lb(Kb, m); + var r = q = p = n = 0; + if (e === $n) for (var s = 0; s < h.length; s++) { + var t = h[s]; + if (null !== t) { + var v = t.link.computeThickness(); + switch (t.ee) { + case u.Nc: + q += v; + break; + case u.Fc: + r += v; + break; + case u.Xc: + n += v; + break; + default: + case u.Oc: + p += v + } + } + } + for (var x = 0, B = 0, y = 1, s = 0; s < h.length; s++) if (t = h[s], null !== t) { + var C, I; + if (x != t.ee) { + x = t.ee; + switch (x) { + case u.Nc: + C = l; + I = m; + break; + case u.Fc: + C = m; + I = k; + break; + case u.Xc: + C = k; + I = d; + break; + default: + case u.Oc: + C = d, I = l + } + var H = I.x - C.x; + I = I.y - C.y; + switch (x) { + case u.Nc: + q > Math.abs(H) ? (y = Math.abs(H) / + q, q = Math.abs(H)) : y = 1; + break; + case u.Fc: + r > Math.abs(I) ? (y = Math.abs(I) / r, r = Math.abs(I)) : y = 1; + break; + case u.Xc: + n > Math.abs(H) ? (y = Math.abs(H) / n, n = Math.abs(H)) : y = 1; + break; + default: + case u.Oc: + p > Math.abs(I) ? (y = Math.abs(I) / p, p = Math.abs(I)) : y = 1 + } + B = 0 + } + var T = t.Lo; + if (e === $n) { + v = t.link.computeThickness(); + v *= y; + T.set(C); + switch (x) { + case u.Nc: + T.x = C.x + H / 2 + q / 2 - B - v / 2; + break; + case u.Fc: + T.y = C.y + I / 2 + r / 2 - B - v / 2; + break; + case u.Xc: + T.x = C.x + H / 2 - n / 2 + B + v / 2; + break; + default: + case u.Oc: + T.y = C.y + I / 2 - p / 2 + B + v / 2 + } + B += v + } else v = .5, e === Xn && (v = (t.Do + 1) / (t.vm + 1)), + T.x = C.x + H * v, T.y = C.y + I * v + } + u.v(k); + u.v(d); + u.v(l); + u.v(m); + C = a.wg; + for (H = 0; H < C.length; H++) I = C[H], null !== I && (I.Sv = a.computeEndSegmentLength(I)); + a.To = c; + u.ic(f) + } + c = a.wg + } + for (f = 0; f < c.length; f++) if (C = c[f], null !== C && C.link === b) return C; + return null + } + + Eo.prototype.GH = function (a, b) { + return a === b ? 0 : null === a ? -1 : null === b ? 1 : a.ee < b.ee ? -1 : a.ee > b.ee ? 1 : a.angle < b.angle ? -1 : a.angle > b.angle ? 1 : 0 + }; + Eo.prototype.computeEndSegmentLength = function (a) { + var b = a.link, c = b.computeEndSegmentLength(this.Cc, this.port, vb, b.od === this.port), d = a.Do; + if (0 > d) return c; + var e = a.vm; + if (1 >= e || !b.dc) return c; + var b = a.tw, f = a.Lo; + if (a.ee === u.Fc || a.ee === u.Nc) d = e - 1 - d; + return ((a = a.ee === u.Fc || a.ee === u.Oc) ? b.y < f.y : b.x < f.x) ? c + 8 * d : (a ? b.y === f.y : b.x === f.x) ? c : c + 8 * (e - 1 - d) + }; + + function Wo(a, b, c) { + this.link = a; + this.angle = b; + this.ee = c; + this.tw = new w; + this.vm = this.Do = 0; + this.Lo = new w; + this.Sv = 0 + } + + u.Xd(Wo, {link: !0, angle: !0, ee: !0, tw: !0, Do: !0, vm: !0, Lo: !0, Sv: !0}); + Wo.prototype.toString = function () { + return this.link.toString() + " " + this.angle.toString() + " " + this.ee.toString() + ":" + this.Do.toString() + "/" + this.vm.toString() + " " + this.Lo.toString() + " " + this.Sv.toString() + " " + this.tw.toString() + }; + + function il() { + this.Ej = this.cj = uc; + this.Cj = this.aj = NaN; + this.Bj = this.$i = Yn; + this.Dj = this.bj = NaN + } + + il.prototype.copy = function () { + var a = new il; + a.cj = this.cj.Z(); + a.Ej = this.Ej.Z(); + a.aj = this.aj; + a.Cj = this.Cj; + a.$i = this.$i; + a.Bj = this.Bj; + a.bj = this.bj; + a.Dj = this.Dj; + return a + }; + + function V(a) { + 0 === arguments.length ? U.call(this, vh) : U.call(this, a); + this.Lq = new F(G); + this.Pn = new F(V); + this.Ak = this.Mq = this.Kq = null; + this.Yr = !1; + this.pq = !0; + this.Zr = !1; + this.Pb = this.Nr = null; + this.Dp = !1; + this.Ep = !0; + this.cq = this.Fp = !1; + this.Nd = new Je; + this.Nd.group = this; + this.jy = !1 + } + + u.Ga(V, U); + u.fa("Group", V); + V.prototype.cloneProtected = function (a) { + U.prototype.cloneProtected.call(this, a); + a.Kq = this.Kq; + a.Mq = this.Mq; + a.Ak = this.Ak; + a.Yr = this.Yr; + a.pq = this.pq; + a.Zr = this.Zr; + a.Nr = this.Nr; + var b = a.vs(function (a) { + return a instanceof ph + }); + a.Pb = b instanceof ph ? b : null; + a.Dp = this.Dp; + a.Ep = this.Ep; + a.Fp = this.Fp; + a.cq = this.cq; + null !== this.Nd ? (a.Nd = this.Nd.copy(), a.Nd.group = a) : (null !== a.Nd && (a.Nd.group = null), a.Nd = null) + }; + V.prototype.Mh = function (a) { + U.prototype.Mh.call(this, a); + var b = a.yo(); + for (a = a.Mc; a.next();) { + var c = a.value; + c.R(); + c.H(8); + c.ls(); + if (c instanceof U) c.sf(b); else if (c instanceof W) for (c = c.ug; c.next();) c.value.sf(b) + } + }; + V.prototype.Lm = function (a, b, c, d, e, f, h) { + if (a === be && "elements" === b) if (e instanceof ph) { + var k = e; + null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of a Group.") + } else e instanceof A && (k = e.vs(function (a) { + return a instanceof ph + }), k instanceof ph && (null === this.Pb ? this.Pb = k : this.Pb !== k && u.k("Cannot insert a second Placeholder into the visual tree of a Group."))); else a === ce && "elements" === b && null !== this.Pb && (d === this.Pb ? this.Pb = null : d instanceof A && this.Pb.gl(d) && + (this.Pb = null)); + U.prototype.Lm.call(this, a, b, c, d, e, f, h) + }; + V.prototype.xi = function (a, b, c, d) { + this.zk = this.Pb; + A.prototype.xi.call(this, a, b, c, d) + }; + V.prototype.hl = function () { + if (!U.prototype.hl.call(this)) return !1; + for (var a = this.Mc; a.next();) { + var b = a.value; + if (b instanceof U) { + if (b.Ea() && Bj(b)) return !1 + } else if (b instanceof W && b.Ea() && Bj(b) && b.W !== this && b.ca !== this) return !1 + } + return !0 + }; + u.u(V, {placeholder: "placeholder"}, function () { + return this.Pb + }); + u.defineProperty(V, {aD: "computesBoundsAfterDrag"}, function () { + return this.Dp + }, function (a) { + var b = this.Dp; + b !== a && (u.j(a, "boolean", V, "computesBoundsAfterDrag"), this.Dp = a, this.h("computesBoundsAfterDrag", b, a)) + }); + u.defineProperty(V, {bG: "computesBoundsIncludingLinks"}, function () { + return this.Ep + }, function (a) { + u.j(a, "boolean", V, "computesBoundsIncludingLinks"); + var b = this.Ep; + b !== a && (this.Ep = a, this.h("computesBoundsIncludingLinks", b, a)) + }); + u.defineProperty(V, {cG: "computesBoundsIncludingLocation"}, function () { + return this.Fp + }, function (a) { + u.j(a, "boolean", V, "computesBoundsIncludingLocation"); + var b = this.Fp; + b !== a && (this.Fp = a, this.h("computesBoundsIncludingLocation", b, a)) + }); + u.defineProperty(V, {OG: "handlesDragDropForMembers"}, function () { + return this.cq + }, function (a) { + u.j(a, "boolean", V, "handlesDragDropForMembers"); + var b = this.cq; + b !== a && (this.cq = a, this.h("handlesDragDropForMembers", b, a)) + }); + u.u(V, {Mc: "memberParts"}, function () { + return this.Lq.i + }); + + function Tn(a, b) { + if (a.Lq.add(b)) { + b instanceof V && a.Pn.add(b); + var c = a.xH; + if (null !== c) { + var d = !0, e = a.g; + null !== e && (d = e.Na, e.Na = !0); + c(a, b); + null !== e && (e.Na = d) + } + a.Ea() && a.be || b.He(!1) + } + c = a.Pb; + null === c && (c = a); + c.R() + } + + function Sn(a, b) { + if (a.Lq.remove(b)) { + b instanceof V && a.Pn.remove(b); + var c = a.yH; + if (null !== c) { + var d = !0, e = a.g; + null !== e && (d = e.Na, e.Na = !0); + c(a, b); + null !== e && (e.Na = d) + } + a.Ea() && a.be || b.He(!0) + } + c = a.Pb; + null === c && (c = a); + c.R() + } + + V.prototype.xm = function () { + if (0 < this.Lq.count) { + var a = this.g; + if (null === a) return; + for (var b = this.Lq.copy().i; b.next();) a.remove(b.value) + } + U.prototype.xm.call(this) + }; + V.prototype.Jw = function () { + var a = this.layer; + null !== a && a.Jw(this) + }; + u.defineProperty(V, {Qb: "layout"}, function () { + return this.Nd + }, function (a) { + var b = this.Nd; + b !== a && (null !== a && u.C(a, Je, V, "layout"), null !== b && (b.g = null, b.group = null), this.Nd = a, null !== a && (a.g = this.g, a.group = this), this.h("layout", b, a)) + }); + u.defineProperty(V, {xH: "memberAdded"}, function () { + return this.Kq + }, function (a) { + var b = this.Kq; + b !== a && (null !== a && u.j(a, "function", V, "memberAdded"), this.Kq = a, this.h("memberAdded", b, a)) + }); + u.defineProperty(V, {yH: "memberRemoved"}, function () { + return this.Mq + }, function (a) { + var b = this.Mq; + b !== a && (null !== a && u.j(a, "function", V, "memberRemoved"), this.Mq = a, this.h("memberRemoved", b, a)) + }); + u.defineProperty(V, {Bz: "memberValidation"}, function () { + return this.Ak + }, function (a) { + var b = this.Ak; + b !== a && (null !== a && u.j(a, "function", V, "memberValidation"), this.Ak = a, this.h("memberValidation", b, a)) + }); + V.prototype.canAddMembers = function (a) { + var b = this.g; + if (null === b) return !1; + b = b.Eb; + for (a = wf(a).i; a.next();) if (!b.isValidMember(this, a.value)) return !1; + return !0 + }; + V.prototype.addMembers = function (a, b) { + var c = this.g; + if (null === c) return !1; + for (var c = c.Eb, d = !0, e = wf(a).i; e.next();) { + var f = e.value; + !b || c.isValidMember(this, f) ? f.Ra = this : d = !1 + } + return d + }; + u.defineProperty(V, {BI: "ungroupable"}, function () { + return this.Yr + }, function (a) { + var b = this.Yr; + b !== a && (u.j(a, "boolean", V, "ungroupable"), this.Yr = a, this.h("ungroupable", b, a)) + }); + V.prototype.canUngroup = function () { + if (!this.BI) return !1; + var a = this.layer; + if (null !== a && !a.Fv) return !1; + a = a.g; + return null === a || a.Fv ? !0 : !1 + }; + V.prototype.invalidateConnectedLinks = V.prototype.sf = function (a) { + void 0 === a && (a = null); + U.prototype.sf.call(this, a); + for (var b = this.pD(); b.next();) { + var c = b.value; + if (null === a || !a.contains(c)) { + var d = c.W; + null !== d && d.Ph(this) && !d.Ea() ? c.Vb() : (d = c.ca, null !== d && d.Ph(this) && !d.Ea() && c.Vb()) + } + } + }; + V.prototype.findExternalLinksConnected = V.prototype.pD = function () { + var a = this.yo(); + a.add(this); + for (var b = new F(W), c = a.i; c.next();) { + var d = c.value; + if (d instanceof U) for (d = d.oe; d.next();) { + var e = d.value; + a.contains(e) || b.add(e) + } + } + return b.i + }; + V.prototype.findExternalNodesConnected = function () { + var a = this.yo(); + a.add(this); + for (var b = new F(U), c = a.i; c.next();) { + var d = c.value; + if (d instanceof U) for (d = d.oe; d.next();) { + var e = d.value, f = e.W; + a.contains(f) && f !== this || b.add(f); + e = e.ca; + a.contains(e) && e !== this || b.add(e) + } + } + return b.i + }; + V.prototype.findSubGraphParts = V.prototype.yo = function () { + var a = new F(G); + kf(a, this, !0, 0, !0); + a.remove(this); + return a + }; + V.prototype.He = function (a) { + U.prototype.He.call(this, a); + for (var b = this.Mc; b.next();) b.value.He(a) + }; + V.prototype.collapseSubGraph = V.prototype.collapseSubGraph = function () { + var a = this.g; + if (null !== a && !a.me) { + a.me = !0; + var b = this.yo(); + Xo(this, b); + a.me = !1 + } + }; + + function Xo(a, b) { + for (var c = a.Mc; c.next();) { + var d = c.value; + d.He(!1); + if (d instanceof V) { + var e = d; + e.be && (e.oA = e.be, Xo(e, b)) + } + if (d instanceof U) d.sf(b); else if (d instanceof W) for (d = d.ug; d.next();) d.value.sf(b) + } + a.be = !1 + } + + V.prototype.expandSubGraph = V.prototype.expandSubGraph = function () { + var a = this.g; + if (null !== a && !a.me) { + var b = a.Lb; + 0 !== a.ha.Le && b.ml(); + a.me = !0; + var c = this.yo(); + Yo(this, c, b, this); + a.me = !1 + } + }; + + function Yo(a, b, c, d) { + for (var e = a.Mc; e.next();) { + var f = e.value; + f.He(!0); + if (f instanceof V) { + var h = f; + h.oA && (h.oA = !1, Yo(h, b, c, d)) + } + if (f instanceof U) f.sf(b), ri(c, f, d); else if (f instanceof W) for (f = f.ug; f.next();) f.value.sf(b) + } + a.be = !0 + } + + u.defineProperty(V, {be: "isSubGraphExpanded"}, function () { + return this.pq + }, function (a) { + var b = this.pq; + if (b !== a) { + u.j(a, "boolean", V, "isSubGraphExpanded"); + this.pq = a; + var c = this.g; + this.h("isSubGraphExpanded", b, a); + b = this.sI; + if (null !== b) { + var d = !0; + null !== c && (d = c.Na, c.Na = !0); + b(this); + null !== c && (c.Na = d) + } + null !== c && c.ha.gb || (a ? this.expandSubGraph() : this.collapseSubGraph()) + } + }); + u.defineProperty(V, {oA: "wasSubGraphExpanded"}, function () { + return this.Zr + }, function (a) { + var b = this.Zr; + b !== a && (u.j(a, "boolean", V, "wasSubGraphExpanded"), this.Zr = a, this.h("wasSubGraphExpanded", b, a)) + }); + u.defineProperty(V, {sI: "subGraphExpandedChanged"}, function () { + return this.Nr + }, function (a) { + var b = this.Nr; + b !== a && (null !== a && u.j(a, "function", V, "subGraphExpandedChanged"), this.Nr = a, this.h("subGraphExpandedChanged", b, a)) + }); + V.prototype.move = V.prototype.move = function (a) { + var b = this.position, c = b.x; + isNaN(c) && (c = 0); + b = b.y; + isNaN(b) && (b = 0); + var c = a.x - c, b = a.y - b, d = u.fc(c, b); + U.prototype.move.call(this, a); + for (a = this.yo().i; a.next();) { + var e = a.value; + if (!(e instanceof W || e instanceof U && e.tf)) { + var f = e.position, h = e.location; + f.J() ? (d.x = f.x + c, d.y = f.y + b, e.position = d) : h.J() && (d.x = h.x + c, d.y = h.y + b, e.location = d) + } + } + for (a.reset(); a.next();) e = a.value, e instanceof W && (f = e.position, d.x = f.x + c, d.y = f.y + b, e.move(d)); + u.v(d) + }; + + function ph() { + S.call(this); + this.Pe = K.np; + this.yr = new z(NaN, NaN, NaN, NaN) + } + + u.Ga(ph, S); + u.fa("Placeholder", ph); + ph.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.Pe = this.Pe.Z(); + a.yr = this.yr.copy() + }; + ph.prototype.Jj = function (a) { + if (null === this.background && null === this.nm) return !1; + var b = this.Ha; + return qb(0, 0, b.width, b.height, a.x, a.y) + }; + ph.prototype.Oo = function () { + var a = this.T; + null !== a && (a instanceof V || a instanceof lf) || u.k("Placeholder is not inside a Group or Adornment."); + if (a instanceof V) { + var b = this.computeBorder(this.yr), c = this.Hc; + bb(c, b.width || 0, b.height || 0); + ml(this, 0, 0, c.width, c.height); + for (var c = a.Mc, d = !1; c.next();) if (c.value.Ea()) { + d = !0; + break + } + !d || isNaN(b.x) || isNaN(b.y) || (c = new w, c.pt(b, a.Ze), a.location = new w(c.x, c.y)) + } else { + var b = this.xa, c = this.Hc, d = this.padding, e = d.left + d.right, f = d.top + d.bottom; + if (b.J()) bb(c, b.width + e || 0, + b.height + f || 0), ml(this, -d.left, -d.top, c.width, c.height); else { + var h = a.vc, k = h.lb(xb, u.K()), b = u.Vj(k.x, k.y, 0, 0); + b.Oi(h.lb(Vb, k)); + b.Oi(h.lb(Gb, k)); + b.Oi(h.lb(Kb, k)); + a.Mg.m(b.x, b.y); + bb(c, b.width + e || 0, b.height + f || 0); + ml(this, -d.left, -d.top, c.width, c.height); + u.v(k); + u.ic(b) + } + } + }; + ph.prototype.xi = function (a, b, c, d) { + var e = this.ba; + e.x = a; + e.y = b; + e.width = c; + e.height = d + }; + ph.prototype.computeBorder = function (a) { + var b = this.T; + if (b instanceof V) { + var c = b; + if (c.aD && this.yr.J()) { + var d = c.g; + if (null !== d && (d = d.Va, d instanceof uf && !d.Rp && null !== d.cc && !d.cc.contains(c))) return a.assign(this.yr), a + } + } + var c = u.Sf(), d = this.computeMemberBounds(c), e = this.padding; + a.m(d.x - e.left, d.y - e.top, d.width + e.left + e.right, d.height + e.top + e.bottom); + u.ic(c); + b instanceof V && (c = b, c.cG && c.location.J() && a.Oi(c.location)); + return a + }; + ph.prototype.computeMemberBounds = function (a) { + if (!(this.T instanceof V)) return a.m(0, 0, 0, 0), a; + for (var b = this.T, c = Infinity, d = Infinity, e = -Infinity, f = -Infinity, h = b.Mc; h.next();) { + var k = h.value; + if (k.Ea()) { + if (k instanceof W) { + var l = k; + if (!b.bG) continue; + if (Aj(l)) continue; + if (l.W === b || l.ca === b) continue + } + k = k.ba; + k.left < c && (c = k.left); + k.top < d && (d = k.top); + k.right > e && (e = k.right); + k.bottom > f && (f = k.bottom) + } + } + isFinite(c) && isFinite(d) ? a.m(c, d, e - c, f - d) : (b = b.location, c = this.padding, a.m(b.x + c.left, b.y + c.top, 0, 0)); + return a + }; + u.defineProperty(ph, {padding: "padding"}, function () { + return this.Pe + }, function (a) { + "number" === typeof a ? ((isNaN(a) || 0 > a) && u.wa(a, ">= 0", ph, "padding"), a = new rb(a)) : (u.C(a, rb, ph, "padding"), (isNaN(a.left) || 0 > a.left) && u.wa(a.left, ">= 0", ph, "padding:value.left"), (isNaN(a.right) || 0 > a.right) && u.wa(a.right, ">= 0", ph, "padding:value.right"), (isNaN(a.top) || 0 > a.top) && u.wa(a.top, ">= 0", ph, "padding:value.top"), (isNaN(a.bottom) || 0 > a.bottom) && u.wa(a.bottom, ">= 0", ph, "padding:value.bottom")); + var b = this.Pe; + b.L(a) || (this.Pe = + a = a.Z(), this.h("padding", b, a)) + }); + + function Je() { + 0 < arguments.length && u.Wc(Je); + u.gc(this); + this.Px = this.Y = null; + this.jq = this.lq = !0; + this.tq = !1; + this.wp = (new w(0, 0)).freeze(); + this.mq = this.oq = !0; + this.YA = ""; + this.Gn = !1; + this.ky = null + } + + u.fa("Layout", Je); + Je.prototype.cloneProtected = function (a) { + a.lq = this.lq; + a.jq = this.jq; + a.tq = this.tq; + a.wp.assign(this.wp); + a.oq = this.oq; + a.mq = this.mq; + a.YA = this.YA; + this.jq || (a.Gn = !0) + }; + Je.prototype.copy = function () { + var a = new this.constructor; + this.cloneProtected(a); + return a + }; + Je.prototype.toString = function () { + var a = u.rg(Object.getPrototypeOf(this)), a = a + "("; + null !== this.group && (a += " in " + this.group); + null !== this.g && (a += " for " + this.g); + return a + ")" + }; + u.defineProperty(Je, {g: "diagram"}, function () { + return this.Y + }, function (a) { + null !== a && u.C(a, D, Je, "diagram"); + this.Y = a + }); + u.defineProperty(Je, {group: "group"}, function () { + return this.Px + }, function (a) { + this.Px !== a && (null !== a && u.C(a, V, Je, "group"), this.Px = a, null !== a && (this.Y = a.g)) + }); + u.defineProperty(Je, {gH: "isOngoing"}, function () { + return this.lq + }, function (a) { + this.lq !== a && (u.j(a, "boolean", Je, "isOngoing"), this.lq = a) + }); + u.defineProperty(Je, {dH: "isInitial"}, function () { + return this.jq + }, function (a) { + u.j(a, "boolean", Je, "isInitial"); + this.jq = a; + a || (this.Gn = !0) + }); + u.defineProperty(Je, {jw: "isViewportSized"}, function () { + return this.tq + }, function (a) { + this.tq !== a && (u.j(a, "boolean", Je, "isViewportSized"), (this.tq = a) && this.H()) + }); + u.defineProperty(Je, {Qs: "isRouting"}, function () { + return this.oq + }, function (a) { + this.oq !== a && (u.j(a, "boolean", Je, "isRouting"), this.oq = a) + }); + u.defineProperty(Je, {PD: "isRealtime"}, function () { + return this.mq + }, function (a) { + this.mq !== a && (u.j(a, "boolean", Je, "isRealtime"), this.mq = a) + }); + u.defineProperty(Je, {vf: "isValidLayout"}, function () { + return this.Gn + }, function (a) { + this.Gn !== a && (u.j(a, "boolean", Je, "isValidLayout"), this.Gn = a, a || (a = this.g, null !== a && (a.Ot = !0))) + }); + Je.prototype.invalidateLayout = Je.prototype.H = function () { + if (this.Gn) { + var a = this.g; + if (null !== a && !a.ha.gb) { + var b = a.Lb; + !b.Fn && (b.Vg && b.Mi(), this.gH && a.lf || this.dH && !a.lf) && (this.vf = !1, a.de()) + } + } + }; + u.defineProperty(Je, {network: "network"}, function () { + return this.ky + }, function (a) { + var b = this.ky; + b !== a && (null !== a && u.C(a, xa, Je, "network"), null !== b && (b.Qb = null), this.ky = a, null !== a && (a.Qb = this)) + }); + Je.prototype.createNetwork = function () { + return new xa + }; + Je.prototype.makeNetwork = function (a) { + var b = this.createNetwork(); + b.Qb = this; + a instanceof D ? (b.Gj(a.yg, !0), b.Gj(a.links, !0)) : a instanceof V ? b.Gj(a.Mc) : b.Gj(a.i); + return b + }; + Je.prototype.updateParts = function () { + var a = this.g; + if (null === a && null !== this.network) for (var b = this.network.vertexes.i; b.next();) { + var c = b.value.Cc; + if (null !== c && (a = c.g, null !== a)) break + } + this.vf = !0; + try { + null !== a && a.Wb("Layout"), this.commitLayout() + } finally { + null !== a && a.Wd("Layout") + } + }; + Je.prototype.commitLayout = function () { + for (var a = this.network.vertexes.i; a.next();) a.value.commit(); + if (this.Qs) for (a = this.network.edges.i; a.next();) a.value.commit() + }; + Je.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + var b = new F(G); + a instanceof D ? (Zo(this, b, a.yg, !0, this.Gz, !0, !1, !0), Zo(this, b, a.Sj, !0, this.Gz, !0, !1, !0)) : a instanceof V ? Zo(this, b, a.Mc, !1, this.Gz, !0, !1, !0) : b.Td(a.i); + var c = b.count; + if (0 < c) { + a = this.g; + null !== a && a.Wb("Layout"); + for (var c = Math.ceil(Math.sqrt(c)), d = this.Ud.x, e = d, f = this.Ud.y, h = 0, k = 0, b = b.i; b.next();) { + var l = b.value; + l.pf(); + var m = l.Ba, n = m.width, + m = m.height; + l.moveTo(e, f); + l.jy = !1; + e += Math.max(n, 50) + 20; + k = Math.max(k, Math.max(m, 50)); + h >= c - 1 ? (h = 0, e = d, f += k + 20, k = 0) : h++ + } + null !== a && a.Wd("Layout") + } + this.vf = !0 + }; + Je.prototype.Gz = function (a) { + return !a.location.J() || a instanceof V && a.jy ? !0 : !1 + }; + + function Zo(a, b, c, d, e, f, h, k) { + for (c = c.i; c.next();) { + var l = c.value; + d && !l.Ho || null !== e && !e(l) || !l.canLayout() || (f && l instanceof U ? l.tf || (l instanceof V ? null === l.Qb ? Zo(a, b, l.Mc, !1, e, f, h, k) : b.add(l) : b.add(l)) : h && l instanceof W ? b.add(l) : !k || !l.Fd() || l instanceof U || b.add(l)) + } + } + + Je.prototype.collectParts = function (a) { + var b = new F(G); + a instanceof D ? (Zo(this, b, a.yg, !0, null, !0, !0, !0), Zo(this, b, a.links, !0, null, !0, !0, !0), Zo(this, b, a.Sj, !0, null, !0, !0, !0)) : a instanceof V ? Zo(this, b, a.Mc, !1, null, !0, !0, !0) : Zo(this, b, a.i, !1, null, !0, !0, !0); + return b + }; + u.defineProperty(Je, {Ud: "arrangementOrigin"}, function () { + return this.wp + }, function (a) { + u.C(a, w, Je, "arrangementOrigin"); + this.wp.L(a) || (this.wp.assign(a), this.H()) + }); + Je.prototype.initialOrigin = function (a) { + var b = this.group; + if (null !== b) { + var c = b.position.copy(); + (isNaN(c.x) || isNaN(c.y)) && c.set(a); + b = b.placeholder; + null !== b && (c = b.lb(xb), (isNaN(c.x) || isNaN(c.y)) && c.set(a), c.x += b.padding.left, c.y += b.padding.top); + return c + } + return a + }; + + function xa() { + u.gc(this); + this.Nd = null; + this.clear() + } + + u.fa("LayoutNetwork", xa); + xa.prototype.clear = function () { + if (this.vertexes) for (var a = this.vertexes.i; a.next();) { + var b = a.value; + b.clear(); + b.network = null + } + if (this.edges) for (a = this.edges.i; a.next();) b = a.value, b.clear(), b.network = null; + this.vertexes = new F(ya); + this.edges = new F(Aa); + this.Kz = new la(U, ya); + this.yz = new la(W, Aa) + }; + xa.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = "LayoutNetwork" + (null !== this.Qb ? "(" + this.Qb.toString() + ")" : ""); + if (0 >= a) return b; + b += " vertexes: " + this.vertexes.count + " edges: " + this.edges.count; + if (1 < a) { + for (var c = this.vertexes.i; c.next();) b += "\n " + c.value.toString(a - 1); + for (c = this.edges.i; c.next();) b += "\n " + c.value.toString(a - 1) + } + return b + }; + u.defineProperty(xa, {Qb: "layout"}, function () { + return this.Nd + }, function (a) { + this.Nd = a + }); + xa.prototype.createVertex = function () { + return new ya + }; + xa.prototype.createEdge = function () { + return new Aa + }; + xa.prototype.addParts = xa.prototype.Gj = function (a, b, c) { + if (null !== a) { + void 0 === b && (b = !1); + u.j(b, "boolean", xa, "addParts:toplevelonly"); + void 0 === c && (c = null); + null === c && (c = function (a) { + if (a instanceof U) return !a.tf; + if (a instanceof W) { + var b = a.W; + if (null === b || b.tf) return !1; + a = a.ca; + return null === a || a.tf ? !1 : !0 + } + return !1 + }); + for (a = a.i; a.next();) { + var d = a.value; + if (d instanceof U && (!b || d.Ho) && d.canLayout() && c(d)) if (d instanceof V && null === d.Qb) this.Gj(d.Mc, !1); else if (null === this.Am(d)) { + var e = this.createVertex(); + e.Cc = d; + this.Mk(e) + } + } + for (a.reset(); a.next();) if (d = a.value, d instanceof W && (!b || d.Ho) && d.canLayout() && c(d) && null === this.Uv(d)) { + var f = d.W, e = d.ca; + null !== f && null !== e && f !== e && (f = this.findGroupVertex(f), e = this.findGroupVertex(e), null !== f && null !== e && this.No(f, e, d)) + } + } + }; + xa.prototype.findGroupVertex = function (a) { + if (null === a) return null; + var b = a.findVisibleNode(); + if (null === b) return null; + a = this.Am(b); + if (null !== a) return a; + for (b = b.Ra; null !== b;) { + a = this.Am(b); + if (null !== a) return a; + b = b.Ra + } + return null + }; + xa.prototype.addVertex = xa.prototype.Mk = function (a) { + if (null !== a) { + this.vertexes.add(a); + var b = a.Cc; + null !== b && this.Kz.add(b, a); + a.network = this + } + }; + xa.prototype.addNode = xa.prototype.ds = function (a) { + if (null === a) return null; + var b = this.Am(a); + null === b && (b = this.createVertex(), b.Cc = a, this.Mk(b)); + return b + }; + xa.prototype.deleteVertex = xa.prototype.lD = function (a) { + if (null !== a && $o(this, a)) { + for (var b = a.Ie, c = b.count - 1; 0 <= c; c--) { + var d = b.ja(c); + this.vo(d) + } + b = a.Ce; + for (c = b.count - 1; 0 <= c; c--) d = b.ja(c), this.vo(d) + } + }; + + function $o(a, b) { + if (null === b) return !1; + var c = a.vertexes.remove(b); + c && (a.Kz.remove(b.Cc), b.network = null); + return c + } + + xa.prototype.deleteNode = function (a) { + null !== a && (a = this.Am(a), null !== a && this.lD(a)) + }; + xa.prototype.findVertex = xa.prototype.Am = function (a) { + return null === a ? null : this.Kz.ta(a) + }; + xa.prototype.addEdge = xa.prototype.ko = function (a) { + if (null !== a) { + this.edges.add(a); + var b = a.link; + null !== b && null === this.Uv(b) && this.yz.add(b, a); + b = a.toVertex; + null !== b && b.LC(a); + b = a.fromVertex; + null !== b && b.KC(a); + a.network = this + } + }; + xa.prototype.addLink = function (a) { + if (null === a) return null; + var b = a.W, c = a.ca, d = this.Uv(a); + null === d ? (d = this.createEdge(), d.link = a, null !== b && (d.fromVertex = this.ds(b)), null !== c && (d.toVertex = this.ds(c)), this.ko(d)) : (d.fromVertex = null !== b ? this.ds(b) : null, d.toVertex = null !== c ? this.ds(c) : null); + return d + }; + xa.prototype.deleteEdge = xa.prototype.vo = function (a) { + if (null !== a) { + var b = a.toVertex; + null !== b && b.kD(a); + b = a.fromVertex; + null !== b && b.jD(a); + ap(this, a) + } + }; + + function ap(a, b) { + null !== b && a.edges.remove(b) && (a.yz.remove(b.link), b.network = null) + } + + xa.prototype.deleteLink = function (a) { + null !== a && (a = this.Uv(a), null !== a && this.vo(a)) + }; + xa.prototype.findEdge = xa.prototype.Uv = function (a) { + return null === a ? null : this.yz.ta(a) + }; + xa.prototype.linkVertexes = xa.prototype.No = function (a, b, c) { + if (null === a || null === b) return null; + if (a.network === this && b.network === this) { + var d = this.createEdge(); + d.link = c; + d.fromVertex = a; + d.toVertex = b; + this.ko(d); + return d + } + return null + }; + xa.prototype.reverseEdge = xa.prototype.yw = function (a) { + if (null !== a) { + var b = a.fromVertex, c = a.toVertex; + null !== b && null !== c && (b.jD(a), c.kD(a), a.yw(), b.LC(a), c.KC(a)) + } + }; + xa.prototype.deleteSelfEdges = xa.prototype.Qv = function () { + for (var a = u.eb(), b = this.edges.i; b.next();) { + var c = b.value; + c.fromVertex === c.toVertex && a.push(c) + } + b = a.length; + for (c = 0; c < b; c++) this.vo(a[c]); + u.ra(a) + }; + xa.prototype.deleteArtificialVertexes = function () { + for (var a = u.eb(), b = this.vertexes.i; b.next();) { + var c = b.value; + null === c.Cc && a.push(c) + } + c = a.length; + for (b = 0; b < c; b++) this.lD(a[b]); + c = u.eb(); + for (b = this.edges.i; b.next();) { + var d = b.value; + null === d.link && c.push(d) + } + d = c.length; + for (b = 0; b < d; b++) this.vo(c[b]); + u.ra(a); + u.ra(c) + }; + + function bp(a) { + for (var b = u.eb(), c = a.edges.i; c.next();) { + var d = c.value; + null !== d.fromVertex && null !== d.toVertex || b.push(d) + } + c = b.length; + for (d = 0; d < c; d++) a.vo(b[d]); + u.ra(b) + } + + xa.prototype.splitIntoSubNetworks = xa.prototype.oI = function () { + this.deleteArtificialVertexes(); + bp(this); + this.Qv(); + for (var a = new E(xa), b = !0; b;) for (var b = !1, c = this.vertexes.i; c.next();) { + var d = c.value; + if (0 < d.Ie.count || 0 < d.Ce.count) { + b = this.Qb.createNetwork(); + a.add(b); + cp(this, b, d); + b = !0; + break + } + } + a.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.vertexes.count - a.vertexes.count + }); + return a + }; + + function cp(a, b, c) { + if (null !== c && c.network !== b) { + $o(a, c); + b.Mk(c); + for (var d = c.kc; d.next();) { + var e = d.value; + e.network !== b && (ap(a, e), b.ko(e), cp(a, b, e.fromVertex)) + } + for (d = c.bc; d.next();) c = d.value, c.network !== b && (ap(a, c), b.ko(c), cp(a, b, c.toVertex)) + } + } + + xa.prototype.findAllParts = function () { + for (var a = new F(G), b = this.vertexes.i; b.next();) a.add(b.value.Cc); + for (b = this.edges.i; b.next();) a.add(b.value.link); + return a + }; + + function ya() { + u.gc(this); + this.network = null; + this.aa = (new z(0, 0, 10, 10)).freeze(); + this.M = (new w(5, 5)).freeze(); + this.clear() + } + + u.fa("LayoutVertex", ya); + ya.prototype.clear = function () { + this.kd = this.qh = null; + this.Ie = new E(Aa); + this.Ce = new E(Aa) + }; + ya.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = "LayoutVertex#" + u.Uc(this); + if (0 < a && (b += null !== this.Cc ? "(" + this.Cc.toString() + ")" : "", 1 < a)) { + a = ""; + for (var c = !0, d = this.Ie.i; d.next();) { + var e = d.value; + c ? c = !1 : a += ","; + a += e.toString(0) + } + e = ""; + c = !0; + for (d = this.Ce.i; d.next();) { + var f = d.value; + c ? c = !1 : e += ","; + e += f.toString(0) + } + b += " sources: " + a + " destinations: " + e + } + return b + }; + u.defineProperty(ya, {data: "data"}, function () { + return this.qh + }, function (a) { + this.qh = a; + if (null !== a) { + var b = a.bounds; + a = b.x; + var c = b.y, d = b.width, b = b.height; + this.M.m(d / 2, b / 2); + this.aa.m(a, c, d, b) + } + }); + u.defineProperty(ya, {Cc: "node"}, function () { + return this.kd + }, function (a) { + if (this.kd !== a) { + this.kd = a; + a.pf(); + var b = a.ba, c = b.x, d = b.y, e = b.width, b = b.height; + isNaN(c) && (c = 0); + isNaN(d) && (d = 0); + this.aa.m(c, d, e, b); + if (!(a instanceof V) && (a = a.ec.lb(Ib), a.J())) { + this.M.m(a.x - c, a.y - d); + return + } + this.M.m(e / 2, b / 2) + } + }); + u.defineProperty(ya, {kb: "bounds"}, function () { + return this.aa + }, function (a) { + this.aa.L(a) || this.aa.assign(a) + }); + u.defineProperty(ya, {focus: "focus"}, function () { + return this.M + }, function (a) { + this.M.L(a) || this.M.assign(a) + }); + u.defineProperty(ya, {Ja: "centerX"}, function () { + return this.aa.x + this.M.x + }, function (a) { + var b = this.aa; + b.x + this.M.x !== a && (b.La(), b.x = a - this.M.x, b.freeze()) + }); + u.defineProperty(ya, {Ua: "centerY"}, function () { + return this.aa.y + this.M.y + }, function (a) { + var b = this.aa; + b.y + this.M.y !== a && (b.La(), b.y = a - this.M.y, b.freeze()) + }); + u.defineProperty(ya, {Cs: "focusX"}, function () { + return this.M.x + }, function (a) { + var b = this.M; + b.x !== a && (b.La(), b.x = a, b.freeze()) + }); + u.defineProperty(ya, {Ds: "focusY"}, function () { + return this.M.y + }, function (a) { + var b = this.M; + b.y !== a && (b.La(), b.y = a, b.freeze()) + }); + u.defineProperty(ya, {x: "x"}, function () { + return this.aa.x + }, function (a) { + var b = this.aa; + b.x !== a && (b.La(), b.x = a, b.freeze()) + }); + u.defineProperty(ya, {y: "y"}, function () { + return this.aa.y + }, function (a) { + var b = this.aa; + b.y !== a && (b.La(), b.y = a, b.freeze()) + }); + u.defineProperty(ya, {width: "width"}, function () { + return this.aa.width + }, function (a) { + var b = this.aa; + b.width !== a && (b.La(), b.width = a, b.freeze()) + }); + u.defineProperty(ya, {height: "height"}, function () { + return this.aa.height + }, function (a) { + var b = this.aa; + b.height !== a && (b.La(), b.height = a, b.freeze()) + }); + ya.prototype.commit = function () { + var a = this.qh; + if (null !== a) { + var b = this.kb, c = a.bounds; + u.Sa(c) ? (c.x = b.x, c.y = b.y, c.width = b.width, c.height = b.height) : a.bounds = b.copy() + } else if (a = this.Cc, null !== a) { + b = this.kb; + if (!(a instanceof V)) { + var c = a.ba, d = a.ec.lb(Ib); + if (c.J() && d.J()) { + a.moveTo(b.x + this.Cs - (d.x - c.x), b.y + this.Ds - (d.y - c.y)); + return + } + } + a.moveTo(b.x, b.y) + } + }; + ya.prototype.addSourceEdge = ya.prototype.LC = function (a) { + null !== a && (this.Ie.contains(a) || this.Ie.add(a)) + }; + ya.prototype.deleteSourceEdge = ya.prototype.kD = function (a) { + null !== a && this.Ie.remove(a) + }; + ya.prototype.addDestinationEdge = ya.prototype.KC = function (a) { + null !== a && (this.Ce.contains(a) || this.Ce.add(a)) + }; + ya.prototype.deleteDestinationEdge = ya.prototype.jD = function (a) { + null !== a && this.Ce.remove(a) + }; + u.u(ya, {nI: "sourceVertexes"}, function () { + for (var a = new F(ya), b = this.kc; b.next();) a.add(b.value.fromVertex); + return a.i + }); + u.u(ya, {rG: "destinationVertexes"}, function () { + for (var a = new F(ya), b = this.bc; b.next();) a.add(b.value.toVertex); + return a.i + }); + u.u(ya, {vertexes: "vertexes"}, function () { + for (var a = new F(ya), b = this.kc; b.next();) a.add(b.value.fromVertex); + for (b = this.bc; b.next();) a.add(b.value.toVertex); + return a.i + }); + u.u(ya, {kc: "sourceEdges"}, function () { + return this.Ie.i + }); + u.u(ya, {bc: "destinationEdges"}, function () { + return this.Ce.i + }); + u.u(ya, {edges: "edges"}, function () { + for (var a = new E(Aa), b = this.kc; b.next();) a.add(b.value); + for (b = this.bc; b.next();) a.add(b.value); + return a.i + }); + u.u(ya, {xG: "edgesCount"}, function () { + return this.Ie.count + this.Ce.count + }); + var dp; + ya.standardComparer = dp = function (a, b) { + var c = a.kd, d = b.kd; + return c ? d ? (c = c.text, d = d.text, c < d ? -1 : c > d ? 1 : 0) : 1 : null !== d ? -1 : 0 + }; + ya.smartComparer = function (a, b) { + if (null !== a) { + if (null !== b) { + var c = a.kd, d = b.kd; + if (null !== c) { + if (null !== d) { + for (var c = c.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), d = d.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), e = 0; e < c.length; e++) if ("" !== d[e] && void 0 !== d[e]) { + var f = parseFloat(c[e]), h = parseFloat(d[e]); + if (isNaN(f)) { + if (!isNaN(h)) return 1; + if (0 !== c[e].localeCompare(d[e])) return c[e].localeCompare(d[e]) + } else { + if (isNaN(h)) return -1; + if (0 !== f - h) return f - + h + } + } else if ("" !== c[e]) return 1; + return "" !== d[e] && void 0 !== d[e] ? -1 : 0 + } + return 1 + } + return null !== d ? -1 : 0 + } + return 1 + } + return null !== b ? -1 : 0 + }; + + function Aa() { + u.gc(this); + this.network = null; + this.clear() + } + + u.fa("LayoutEdge", Aa); + Aa.prototype.clear = function () { + this.toVertex = this.fromVertex = this.link = this.data = null + }; + Aa.prototype.toString = function (a) { + void 0 === a && (a = 0); + var b = "LayoutEdge#" + u.Uc(this); + 0 < a && (b += null !== this.link ? "(" + this.link.toString() + ")" : "", 1 < a && (b += " " + (this.fromVertex ? this.fromVertex.toString() : "null") + " --\x3e " + (this.toVertex ? this.toVertex.toString() : "null"))); + return b + }; + Aa.prototype.yw = function () { + var a = this.fromVertex; + this.fromVertex = this.toVertex; + this.toVertex = a + }; + Aa.prototype.commit = function () { + }; + Aa.prototype.getOtherVertex = Aa.prototype.GG = function (a) { + return this.toVertex === a ? this.fromVertex : this.fromVertex === a ? this.toVertex : null + }; + + function Xk() { + 0 < arguments.length && u.Wc(Xk); + Je.call(this); + this.jw = !0; + this.as = this.bs = NaN; + this.Ti = (new ia(NaN, NaN)).freeze(); + this.Gh = (new ia(10, 10)).freeze(); + this.se = em; + this.Yc = cm; + this.Fh = Zl; + this.ph = ep + } + + u.Ga(Xk, Je); + u.fa("GridLayout", Xk); + Xk.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.bs = this.bs; + a.as = this.as; + a.Ti.assign(this.Ti); + a.Gh.assign(this.Gh); + a.se = this.se; + a.Yc = this.Yc; + a.Fh = this.Fh; + a.ph = this.ph + }; + Xk.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + this.Ud = this.initialOrigin(this.Ud); + var b = this.g, c = new F(G); + a instanceof D ? (b = a, Zo(this, c, a.yg, !0, null, !0, !0, !0), Zo(this, c, a.links, !0, null, !0, !0, !0), Zo(this, c, a.Sj, !0, null, !0, !0, !0)) : a instanceof V ? (b = a.g, Zo(this, c, a.Mc, !1, null, !0, !0, !0)) : c.Td(a.i); + for (a = c.copy().i; a.next();) { + var d = a.value; + if (d instanceof W) { + var e = d; + if (null !== e.W || null !== e.ca) { + c.remove(e); + continue + } + } + d.pf(); + if (d instanceof V) for (d = d.Mc; d.next();) c.remove(d.value) + } + e = c.Ke(); + if (0 !== e.length) { + switch (this.sorting) { + case bm: + e.reverse(); + break; + case Zl: + e.sort(this.comparer); + break; + case $l: + e.sort(this.comparer), e.reverse() + } + var f = this.EI; + isNaN(f) && (f = 0); + var h = this.cF, + h = isNaN(h) && null !== b ? Math.max(b.ob.width - b.padding.left - b.padding.right, 0) : Math.max(this.cF, 0); + 0 >= f && 0 >= h && (f = 1); + c = this.spacing.width; + isFinite(c) || (c = 0); + a = this.spacing.height; + isFinite(a) || (a = 0); + null !== b && b.Wb("Layout"); + d = []; + switch (this.alignment) { + case fm: + var k = + c, l = a, m = Math.max(this.qo.width, 1); + if (!isFinite(m)) for (var n = m = 0; n < e.length; n++) var p = e[n], q = p.Ba, m = Math.max(m, q.width); + var m = Math.max(m + k, 1), r = Math.max(this.qo.height, 1); + if (!isFinite(r)) for (n = r = 0; n < e.length; n++) p = e[n], q = p.Ba, r = Math.max(r, q.height); + for (var r = Math.max(r + l, 1), s = this.Gf, t = this.Ud.x, v = t, x = this.Ud.y, B = 0, y = 0, n = 0; n < e.length; n++) { + var p = e[n], q = p.Ba, C = Math.ceil((q.width + k) / m) * m, + I = Math.ceil((q.height + l) / r) * r, H = 0; + switch (s) { + case dm: + H = Math.abs(v - q.width); + break; + default: + H = v + q.width + } + if (0 < f && B > f - 1 || + 0 < h && 0 < B && H > h) d.push(new z(0, x, h + k, y)), B = 0, v = t, x += y, y = 0; + y = Math.max(y, I); + I = 0; + switch (s) { + case dm: + I = -q.width; + break; + default: + I = 0 + } + p.moveTo(v + I, x); + switch (s) { + case dm: + v -= C; + break; + default: + v += C + } + B++ + } + d.push(new z(0, x, h + k, y)); + break; + case em: + k = f; + l = c; + m = a; + n = Math.max(this.qo.width, 1); + p = x = C = 0; + q = u.K(); + for (f = 0; f < e.length; f++) r = e[f], s = r.Ba, t = On(r, r.ec, r.Ze, q), C = Math.max(C, t.x), x = Math.max(x, s.width - t.x), p = Math.max(p, t.y); + v = this.Gf; + switch (v) { + case dm: + C += l; + break; + default: + x += l + } + var n = isFinite(n) ? Math.max(n + l, 1) : Math.max(C + x, 1), + T = x = this.Ud.x, B = this.Ud.y, y = 0; + h >= C && (h -= C); + for (var C = I = 0, H = Math.max(this.qo.height, 1), aa = p = 0, R = !0, N = u.K(), f = 0; f < e.length; f++) { + r = e[f]; + s = r.Ba; + t = On(r, r.ec, r.Ze, q); + if (0 < y) switch (v) { + case dm: + T = Math.floor((T - x - (s.width - t.x)) / n) * n + x; + break; + default: + T = Math.ceil((T - x + t.x) / n) * n + x + } else switch (v) { + case dm: + I = T + t.x + s.width; + break; + default: + I = T - t.x + } + var Z = 0; + switch (v) { + case dm: + Z = -(T + t.x) + I; + break; + default: + Z = T + s.width - t.x - I + } + if (0 < k && y > k - 1 || 0 < h && 0 < y && Z > h) { + d.push(new z(0, R ? B - p : B, h + l, aa + p + m)); + for (T = 0; T < y && f !== y; T++) { + var Z = e[f - y + + T], Ea = On(Z, Z.ec, Z.Ze, N); + Z.moveTo(Z.position.x, Z.position.y + p - Ea.y) + } + aa += m; + B = R ? B + aa : B + (aa + p); + y = aa = p = 0; + T = x; + R = !1 + } + T === x && (C = v === dm ? Math.max(C, s.width - t.x) : Math.min(C, -t.x)); + p = Math.max(p, t.y); + aa = Math.max(aa, s.height - t.y); + isFinite(H) && (aa = Math.max(aa, Math.max(s.height, H) - t.y)); + R ? r.moveTo(T - t.x, B - t.y) : r.moveTo(T - t.x, B); + switch (v) { + case dm: + T -= t.x + l; + break; + default: + T += s.width - t.x + l + } + y++ + } + d.push(new z(0, B, h + l, (R ? aa : aa + p) + m)); + for (T = 0; T < y && f !== y; T++) Z = e[f - y + T], Ea = On(Z, Z.ec, Z.Ze, q), Z.moveTo(Z.position.x, Z.position.y + + p - Ea.y); + u.v(q); + u.v(N); + if (v === dm) for (f = 0; f < d.length; f++) e = d[f], e.width += C, e.x -= C; else for (f = 0; f < d.length; f++) e = d[f], e.x > C && (e.width += e.x - C, e.x = C) + } + for (k = f = h = e = 0; k < d.length; k++) l = d[k], e = Math.min(e, l.x), h = Math.min(h, l.y), f = Math.max(f, l.x + l.width); + this.Gf === dm ? this.commitLayers(d, new w(e + c / 2 - (f + e), h - a / 2)) : this.commitLayers(d, new w(e - c / 2, h - a / 2)); + null !== b && b.Wd("Layout"); + this.vf = !0 + } + }; + Xk.prototype.commitLayers = function () { + }; + u.defineProperty(Xk, {cF: "wrappingWidth"}, function () { + return this.bs + }, function (a) { + this.bs !== a && (u.j(a, "number", Xk, "wrappingWidth"), 0 < a || isNaN(a)) && (this.bs = a, this.jw = isNaN(a), this.H()) + }); + u.defineProperty(Xk, {EI: "wrappingColumn"}, function () { + return this.as + }, function (a) { + this.as !== a && (u.j(a, "number", Xk, "wrappingColumn"), 0 < a || isNaN(a)) && (this.as = a, this.H()) + }); + u.defineProperty(Xk, {qo: "cellSize"}, function () { + return this.Ti + }, function (a) { + u.C(a, ia, Xk, "cellSize"); + this.Ti.L(a) || (this.Ti.assign(a), this.H()) + }); + u.defineProperty(Xk, {spacing: "spacing"}, function () { + return this.Gh + }, function (a) { + u.C(a, ia, Xk, "spacing"); + this.Gh.L(a) || (this.Gh.assign(a), this.H()) + }); + u.defineProperty(Xk, {alignment: "alignment"}, function () { + return this.se + }, function (a) { + this.se !== a && (u.rb(a, Xk, Xk, "alignment"), a === em || a === fm) && (this.se = a, this.H()) + }); + u.defineProperty(Xk, {Gf: "arrangement"}, function () { + return this.Yc + }, function (a) { + this.Yc !== a && (u.rb(a, Xk, Xk, "arrangement"), a === cm || a === dm) && (this.Yc = a, this.H()) + }); + u.defineProperty(Xk, {sorting: "sorting"}, function () { + return this.Fh + }, function (a) { + this.Fh !== a && (u.rb(a, Xk, Xk, "sorting"), a === am || a === bm || a === Zl || a === $l) && (this.Fh = a, this.H()) + }); + u.defineProperty(Xk, {comparer: "comparer"}, function () { + return this.ph + }, function (a) { + this.ph !== a && (u.j(a, "function", Xk, "comparer"), this.ph = a, this.H()) + }); + var ep; + Xk.standardComparer = ep = function (a, b) { + var c = a.text, d = b.text; + return c < d ? -1 : c > d ? 1 : 0 + }; + Xk.smartComparer = function (a, b) { + if (null !== a) { + if (null !== b) { + for (var c = a.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), d = b.text.toLocaleLowerCase().split(/([+\-]?[\.]?\d+(?:\.\d*)?(?:e[+\-]?\d+)?)/), e = 0; e < c.length; e++) if ("" !== d[e] && void 0 !== d[e]) { + var f = parseFloat(c[e]), h = parseFloat(d[e]); + if (isNaN(f)) { + if (!isNaN(h)) return 1; + if (0 !== c[e].localeCompare(d[e])) return c[e].localeCompare(d[e]) + } else { + if (isNaN(h)) return -1; + if (0 !== f - h) return f - h + } + } else if ("" !== c[e]) return 1; + return "" !== + d[e] && void 0 !== d[e] ? -1 : 0 + } + return 1 + } + return null !== b ? -1 : 0 + }; + var fm; + Xk.Position = fm = u.s(Xk, "Position", 0); + var em; + Xk.Location = em = u.s(Xk, "Location", 1); + var cm; + Xk.LeftToRight = cm = u.s(Xk, "LeftToRight", 2); + var dm; + Xk.RightToLeft = dm = u.s(Xk, "RightToLeft", 3); + var am; + Xk.Forward = am = u.s(Xk, "Forward", 4); + var bm; + Xk.Reverse = bm = u.s(Xk, "Reverse", 5); + var Zl; + Xk.Ascending = Zl = u.s(Xk, "Ascending", 6); + var $l; + Xk.Descending = $l = u.s(Xk, "Descending", 7); + + function gm() { + 0 < arguments.length && u.Wc(gm); + Je.call(this); + this.Gx = this.rn = this.td = 0; + this.Sp = 360; + this.Fx = zm; + this.mk = 0; + this.eB = zm; + this.Vt = this.jg = this.yC = 0; + this.uv = new fp; + this.Yt = this.Vl = 0; + this.zF = 600; + this.lr = NaN; + this.yp = 1; + this.Mr = 0; + this.Pr = 360; + this.Yc = zm; + this.la = om; + this.Fh = lm; + this.ph = dp; + this.Gh = 6; + this.Zq = Cm + } + + u.Ga(gm, Je); + u.fa("CircularLayout", gm); + gm.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.lr = this.lr; + a.yp = this.yp; + a.Mr = this.Mr; + a.Pr = this.Pr; + a.Yc = this.Yc; + a.la = this.la; + a.Fh = this.Fh; + a.ph = this.ph; + a.Gh = this.Gh; + a.Zq = this.Zq + }; + gm.prototype.createNetwork = function () { + return new gp + }; + gm.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + a = this.network.vertexes; + if (1 >= a.count) 1 === a.count && (a = a.first(), a.Ja = 0, a.Ua = 0); else { + var b = new E(hp); + b.Td(a.i); + a = new E(hp); + var c = new E(hp), d; + d = this.sort(b); + var e = this.Fx, f = this.eB, h = this.td, k = this.rn, l = this.Gx, m = this.Sp, b = this.mk, n = this.yC, + p = this.jg, q = this.Vt, e = this.Gf, f = this.qw, h = this.OH; + if (!isFinite(h) || + 0 >= h) h = NaN; + k = this.QF; + if (!isFinite(k) || 0 >= k) k = 1; + l = this.Je; + isFinite(l) || (l = 0); + m = this.Qf; + if (!isFinite(m) || 360 < m || 1 > m) m = 360; + b = this.spacing; + isFinite(b) || (b = NaN); + e === Am && f === Bm ? e = zm : e === Am && f !== Bm && (f = Bm, e = this.Gf); + if ((this.direction === mm || this.direction === nm) && this.sorting !== lm) { + for (var r = 0; !(r >= d.length); r += 2) { + a.add(d.ja(r)); + if (r + 1 >= d.length) break; + c.add(d.ja(r + 1)) + } + this.direction === mm ? (this.Gf === Am && a.reverse(), d = new E(hp), d.Td(a), d.Td(c)) : (this.Gf === Am && c.reverse(), d = new E(hp), d.Td(c), d.Td(a)) + } + for (var s = + d.length, t = n = 0, r = 0; r < d.length; r++) { + var p = l + m * t * (this.direction === om ? 1 : -1) / s, v = d.ja(r).diameter; + isNaN(v) && (v = ip(d.ja(r), p)); + 360 > m && (0 === r || r === d.length - 1) && (v /= 2); + n += v; + t++ + } + if (isNaN(h) || e === Am) { + isNaN(b) && (b = 6); + if (e !== zm && e !== Am) { + v = -Infinity; + for (r = 0; r < s; r++) { + var q = d.ja(r), x = d.ja(r === s - 1 ? 0 : r + 1); + isNaN(q.diameter) && ip(q, 0); + isNaN(x.diameter) && ip(x, 0); + v = Math.max(v, (q.diameter + x.diameter) / 2) + } + q = v + b; + e === xm ? (p = 2 * Math.PI / s, h = (v + b) / p) : h = jp(this, q * (360 <= m ? s : s - 1), k, l * Math.PI / 180, m * Math.PI / 180) + } else h = jp(this, n + (360 <= + m ? s : s - 1) * (e !== Am ? b : 1.6 * b), k, l * Math.PI / 180, m * Math.PI / 180); + p = h * k + } else if (p = h * k, t = kp(this, h, p, l * Math.PI / 180, m * Math.PI / 180), isNaN(b)) { + if (e === zm || e === Am) b = (t - n) / (360 <= m ? s : s - 1) + } else if (e === zm || e === Am) r = (t - n) / (360 <= m ? s : s - 1), r < b ? (h = jp(this, n + b * (360 <= m ? s : s - 1), k, l * Math.PI / 180, m * Math.PI / 180), p = h * k) : b = r; else { + v = -Infinity; + for (r = 0; r < s; r++) q = d.ja(r), x = d.ja(r === s - 1 ? 0 : r + 1), isNaN(q.diameter) && ip(q, 0), isNaN(x.diameter) && ip(x, 0), v = Math.max(v, (q.diameter + x.diameter) / 2); + q = v + b; + r = jp(this, q * (360 <= m ? s : s - 1), k, l * Math.PI / 180, + m * Math.PI / 180); + r > h ? (h = r, p = h * k) : q = t / (360 <= m ? s : s - 1) + } + this.Fx = e; + this.eB = f; + this.td = h; + this.rn = k; + this.Gx = l; + this.Sp = m; + this.mk = b; + this.yC = n; + this.jg = p; + this.Vt = q; + b = d; + d = this.Fx; + e = this.td; + f = this.Gx; + k = this.Sp; + l = this.mk; + m = this.jg; + n = this.Vt; + if (this.direction !== mm && this.direction !== nm || d !== Am) if (this.direction === mm || this.direction === nm) { + h = 0; + switch (d) { + case ym: + h = 180 * lp(this, e, m, f, n) / Math.PI; + break; + case zm: + n = b = 0; + h = a.first(); + null !== h && (b = ip(h, Math.PI / 2)); + h = c.first(); + null !== h && (n = ip(h, Math.PI / 2)); + h = 180 * lp(this, e, m, f, l + (b + + n) / 2) / Math.PI; + break; + case xm: + h = k / b.length + } + if (this.direction === mm) { + switch (d) { + case ym: + mp(this, a, f, wm); + break; + case zm: + np(this, a, f, wm); + break; + case xm: + op(this, a, k / 2, f, wm) + } + switch (d) { + case ym: + mp(this, c, f + h, om); + break; + case zm: + np(this, c, f + h, om); + break; + case xm: + op(this, c, k / 2, f + h, om) + } + } else { + switch (d) { + case ym: + mp(this, c, f, wm); + break; + case zm: + np(this, c, f, wm); + break; + case xm: + op(this, c, k / 2, f, wm) + } + switch (d) { + case ym: + mp(this, a, f + h, om); + break; + case zm: + np(this, a, f + h, om); + break; + case xm: + op(this, a, k / 2, f + h, om) + } + } + } else switch (d) { + case ym: + mp(this, + b, f, this.direction); + break; + case zm: + np(this, b, f, this.direction); + break; + case xm: + op(this, b, k, f, this.direction); + break; + case Am: + pp(this, b, k, f, this.direction) + } else pp(this, b, k, f - k / 2, om) + } + this.updateParts(); + this.network = null; + this.vf = !0 + }; + + function op(a, b, c, d, e) { + var f = a.Sp, h = a.td; + a = a.jg; + d = d * Math.PI / 180; + c = c * Math.PI / 180; + for (var k = b.length, l = 0; l < k; l++) { + var m = d + (e === om ? l * c / (360 <= f ? k : k - 1) : -(l * c) / k), n = b.ja(l), + p = h * Math.tan(m) / a, p = Math.sqrt((h * h + a * a * p * p) / (1 + p * p)); + n.Ja = p * Math.cos(m); + n.Ua = p * Math.sin(m); + n.actualAngle = 180 * m / Math.PI + } + } + + function np(a, b, c, d) { + var e = a.td, f = a.jg, h = a.mk; + c = c * Math.PI / 180; + for (var k = b.length, l = 0; l < k; l++) { + var m = b.ja(l), n = b.ja(l === k - 1 ? 0 : l + 1), p = f * Math.sin(c); + m.Ja = e * Math.cos(c); + m.Ua = p; + m.actualAngle = 180 * c / Math.PI; + isNaN(m.diameter) && ip(m, 0); + isNaN(n.diameter) && ip(n, 0); + m = lp(a, e, f, d === om ? c : -c, (m.diameter + n.diameter) / 2 + h); + c += d === om ? m : -m + } + } + + function mp(a, b, c, d) { + var e = a.td, f = a.jg, h = a.Vt; + c = c * Math.PI / 180; + for (var k = b.length, l = 0; l < k; l++) { + var m = b.ja(l); + m.Ja = e * Math.cos(c); + m.Ua = f * Math.sin(c); + m.actualAngle = 180 * c / Math.PI; + m = lp(a, e, f, d === om ? c : -c, h); + c += d === om ? m : -m + } + } + + function pp(a, b, c, d, e) { + var f = a.Yt, f = a.Sp; + a.Vl = 0; + a.uv = new fp; + if (360 > c) { + for (f = d + (e === om ? f : -f); 0 > f;) f += 360; + f %= 360; + 180 < f && (f -= 360); + f *= Math.PI / 180; + a.Yt = f; + qp(a, b, c, d, e) + } else rp(a, b, c, d, e); + a.uv.commit(b) + } + + function rp(a, b, c, d, e) { + var f = a.td, h = a.mk, k = a.rn, l = f * Math.cos(d * Math.PI / 180), m = a.jg * Math.sin(d * Math.PI / 180), + n = b.Ke(); + if (3 === n.length) n[0].Ja = f, n[0].Ua = 0, n[1].Ja = n[0].Ja - n[0].width / 2 - n[1].width / 2 - h, n[1].y = n[0].y, n[2].Ja = (n[0].Ja + n[1].Ja) / 2, n[2].y = n[0].y - n[2].height - h; else if (4 === n.length) n[0].Ja = f, n[0].Ua = 0, n[2].Ja = -n[0].Ja, n[2].Ua = n[0].Ua, n[1].Ja = 0, n[1].y = Math.min(n[0].y, n[2].y) - n[1].height - h, n[3].Ja = 0, n[3].y = Math.max(n[0].y + n[0].height + h, n[2].y + n[2].height + h); else { + for (var f = u.K(), p = 0; p < n.length; p++) { + n[p].Ja = + l; + n[p].Ua = m; + if (p >= n.length - 1) break; + sp(a, l, m, n, p, e, f) || tp(a, l, m, n, p, e, f); + l = f.x; + m = f.y + } + u.v(f); + a.Vl++; + if (!(23 < a.Vl)) { + var l = n[0].Ja, m = n[0].Ua, f = n[n.length - 1].Ja, p = n[n.length - 1].Ua, + q = Math.abs(l - f) - ((n[0].width + n[n.length - 1].width) / 2 + h), + r = Math.abs(m - p) - ((n[0].height + n[n.length - 1].height) / 2 + h), h = 0; + 1 > Math.abs(r) ? Math.abs(l - f) < (n[0].width + n[n.length - 1].width) / 2 && (h = 0) : h = 0 < r ? r : 1 > Math.abs(q) ? 0 : q; + q = !1; + q = Math.abs(f) > Math.abs(p) ? 0 < f !== m > p : 0 < p !== l < f; + if (q = e === om ? q : !q) h = -Math.abs(h), h = Math.min(h, -n[n.length - 1].width), + h = Math.min(h, -n[n.length - 1].height); + a.uv.compare(h, n); + 1 < Math.abs(h) && (a.td = 8 > a.Vl ? a.td - h / (2 * Math.PI) : 5 > n.length && 10 < h ? a.td / 2 : a.td - (0 < h ? 1.7 : -2.3), a.jg = a.td * k, rp(a, b, c, d, e)) + } + } + } + + function qp(a, b, c, d, e) { + for (var f = a.td, h = a.jg, k = a.rn, l = f * Math.cos(d * Math.PI / 180), m = h * Math.sin(d * Math.PI / 180), n = u.K(), p = b.Ke(), q = 0; q < p.length; q++) { + p[q].Ja = l; + p[q].Ua = m; + if (q >= p.length - 1) break; + sp(a, l, m, p, q, e, n) || tp(a, l, m, p, q, e, n); + l = n.x; + m = n.y + } + u.v(n); + a.Vl++; + if (!(23 < a.Vl)) { + l = Math.atan2(m, l); + l = e === om ? a.Yt - l : l - a.Yt; + l = Math.abs(l) < Math.abs(l - 2 * Math.PI) ? l : l - 2 * Math.PI; + f = l * (f + h) / 2; + h = a.uv; + if (Math.abs(f) < Math.abs(h.Ao)) for (h.Ao = f, h.Qm = [], h.lp = [], l = 0; l < p.length; l++) h.Qm[l] = p[l].kb.x, h.lp[l] = p[l].kb.y; + 1 < Math.abs(f) && + (a.td = 8 > a.Vl ? a.td - f / (2 * Math.PI) : a.td - (0 < f ? 1.7 : -2.3), a.jg = a.td * k, qp(a, b, c, d, e)) + } + } + + function sp(a, b, c, d, e, f, h) { + var k = a.td, l = a.jg, m = 0, n = 0; + a = (d[e].width + d[e + 1].width) / 2 + a.mk; + var p = !1; + if (0 <= c !== (f === om)) { + if (m = b + a, m > k) { + m = b - a; + if (m < -k) return h.x = m, h.y = n, !1; + p = !0 + } + } else if (m = b - a, m < -k) { + m = b + a; + if (m > k) return h.x = m, h.y = n, !1; + p = !0 + } + n = Math.sqrt(1 - Math.min(1, m * m / (k * k))) * l; + 0 > c !== p && (n = -n); + if (Math.abs(c - n) > (d[e].height + d[e + 1].height) / 2) return h.x = m, h.y = n, !1; + h.x = m; + h.y = n; + return !0 + } + + function tp(a, b, c, d, e, f, h) { + var k = a.td, l = a.jg, m = 0, n = 0; + a = (d[e].height + d[e + 1].height) / 2 + a.mk; + d = !1; + if (0 <= b !== (f === om)) { + if (n = c - a, n < -l) { + n = c + a; + if (n > l) { + h.x = m; + h.y = n; + return + } + d = !0 + } + } else if (n = c + a, n > l) { + n = c - a; + if (n < -l) { + h.x = m; + h.y = n; + return + } + d = !0 + } + m = Math.sqrt(1 - Math.min(1, n * n / (l * l))) * k; + 0 > b !== d && (m = -m); + h.x = m; + h.y = n + } + + gm.prototype.commitLayout = function () { + this.commitNodes(); + this.Qs && this.commitLinks() + }; + gm.prototype.commitNodes = function () { + for (var a = this.IF, b = this.network.vertexes.i; b.next();) { + var c = b.value; + c.x += a.x; + c.y += a.y; + c.commit() + } + }; + gm.prototype.commitLinks = function () { + for (var a = this.network.edges.i; a.next();) a.value.commit() + }; + + function kp(a, b, c, d, e) { + var f = a.zF; + if (.001 > Math.abs(a.rn - 1)) return void 0 !== d && void 0 !== e ? e * b : 2 * Math.PI * b; + a = b > c ? Math.sqrt(b * b - c * c) / b : Math.sqrt(c * c - b * b) / c; + for (var h = 0, k = 0, k = void 0 !== d && void 0 !== e ? e / (f + 1) : Math.PI / (2 * (f + 1)), l = 0, m = 0; m <= f; m++) l = void 0 !== d && void 0 !== e ? d + m * e / f : m * Math.PI / (2 * f), l = Math.sin(l), h += Math.sqrt(1 - a * a * l * l) * k; + return void 0 !== d && void 0 !== e ? (b > c ? b : c) * h : 4 * (b > c ? b : c) * h + } + + function jp(a, b, c, d, e) { + var f = 0, f = void 0 !== d && void 0 !== e ? kp(a, 1, c, d, e) : kp(a, 1, c); + return b / f + } + + function lp(a, b, c, d, e) { + if (.001 > Math.abs(a.rn - 1)) return e / b; + var f = b > c ? Math.sqrt(b * b - c * c) / b : Math.sqrt(c * c - b * b) / c, h = 0; + a = 2 * Math.PI / (700 * a.network.vertexes.count); + b > c && (d += Math.PI / 2); + for (var k = 0; ; k++) { + var l = Math.sin(d + k * a), h = h + (b > c ? b : c) * Math.sqrt(1 - f * f * l * l) * a; + if (h >= e) return k * a + } + } + + gm.prototype.sort = function (a) { + switch (this.sorting) { + case jm: + break; + case km: + a.reverse(); + break; + case hm: + a.sort(this.comparer); + break; + case im: + a.sort(this.comparer); + a.reverse(); + break; + case lm: + for (var b = [], c = 0; c < a.length; c++) b.push(0); + for (var d = new E(hp), c = 0; c < a.length; c++) { + var e = -1, f = -1; + if (0 === c) for (var h = 0; h < a.length; h++) { + var k = a.ja(h).xG; + k > e && (e = k, f = h) + } else for (h = 0; h < a.length; h++) k = b[h], k > e && (e = k, f = h); + d.add(a.ja(f)); + b[f] = -1; + f = a.ja(f); + e = 0; + for (h = f.kc; h.next();) e = a.indexOf(h.value.fromVertex), 0 > e || 0 <= b[e] && + b[e]++; + for (f = f.bc; f.next();) e = a.indexOf(f.value.toVertex), 0 > e || 0 <= b[e] && b[e]++ + } + a = []; + for (b = 0; b < d.length; b++) { + h = d.ja(b); + a[b] = []; + for (var l = 0, c = h.bc; c.next();) l = d.indexOf(c.value.toVertex), l !== b && 0 > a[b].indexOf(l) && a[b].push(l); + for (c = h.kc; c.next();) l = d.indexOf(c.value.fromVertex), l !== b && 0 > a[b].indexOf(l) && a[b].push(l) + } + h = []; + for (b = 0; b < a.length; b++) h[b] = 0; + for (var c = [], k = [], m = [], e = [], f = new E(hp), n = 0, b = 0; b < a.length; b++) { + var p = a[b].length; + if (1 === p) e.push(b); else if (0 === p) f.add(d.ja(b)); else { + if (0 === n) c.push(b); + else { + for (var q = Infinity, r = Infinity, s = -1, t = [], p = 0; p < c.length; p++) 0 > a[c[p]].indexOf(c[p === c.length - 1 ? 0 : p + 1]) && t.push(p === c.length - 1 ? 0 : p + 1); + if (0 === t.length) for (p = 0; p < c.length; p++) t.push(p); + for (p = 0; p < t.length; p++) { + var v = t[p], x, l = a[b]; + x = k; + for (var B = m, y = h, C = v, I = c, H = 0, T = 0; T < x.length; T++) { + var aa = y[x[T]], R = y[B[T]], N = 0, Z = 0; + aa < R ? (N = aa, Z = R) : (N = R, Z = aa); + if (N < C && C <= Z) for (aa = 0; aa < l.length; aa++) R = l[aa], 0 > I.indexOf(R) || N < y[R] && y[R] < Z || N === y[R] || Z === y[R] || H++; else for (aa = 0; aa < l.length; aa++) R = l[aa], 0 > I.indexOf(R) || N < + y[R] && y[R] < Z && N !== y[R] && Z !== y[R] && H++ + } + x = H; + for (y = B = 0; y < a[b].length; y++) l = c.indexOf(a[b][y]), 0 <= l && (l = Math.abs(v - (l >= v ? l + 1 : l)), B += l < c.length + 1 - l ? l : c.length + 1 - l); + for (y = 0; y < k.length; y++) l = h[k[y]], C = h[m[y]], l >= v && l++, C >= v && C++, l > C && (I = C, C = l, l = I), C - l < (c.length + 2) / 2 === (l < v && v <= C) && B++; + if (x < q || x === q && B < r) q = x, r = B, s = v + } + c.splice(s, 0, b); + for (p = 0; p < c.length; p++) h[c[p]] = p; + for (p = 0; p < a[b].length; p++) q = a[b][p], 0 <= c.indexOf(q) && (k.push(b), m.push(q)) + } + n++ + } + } + k = !1; + for (m = c.length; ;) { + k = !0; + for (h = 0; h < e.length; h++) if (b = e[h], n = + a[b][0], l = c.indexOf(n), 0 <= l) { + for (r = p = 0; r < a[n].length; r++) q = a[n][r], q = c.indexOf(q), 0 > q || q === l || (s = q > l ? q - l : l - q, p += q < l !== s > m - s ? 1 : -1); + c.splice(0 > p ? l : l + 1, 0, b); + e.splice(h, 1); + h-- + } else k = !1; + if (k) break; else c.push(e[0]), e.splice(0, 1) + } + for (b = 0; b < c.length; b++) l = c[b], f.add(d.ja(l)); + return f; + default: + u.k("Invalid sorting type.") + } + return a + }; + u.defineProperty(gm, {OH: "radius"}, function () { + return this.lr + }, function (a) { + this.lr !== a && (u.j(a, "number", gm, "radius"), 0 < a || isNaN(a)) && (this.lr = a, this.H()) + }); + u.defineProperty(gm, {QF: "aspectRatio"}, function () { + return this.yp + }, function (a) { + this.yp !== a && (u.j(a, "number", gm, "aspectRatio"), 0 < a && (this.yp = a, this.H())) + }); + u.defineProperty(gm, {Je: "startAngle"}, function () { + return this.Mr + }, function (a) { + this.Mr !== a && (u.j(a, "number", gm, "startAngle"), this.Mr = a, this.H()) + }); + u.defineProperty(gm, {Qf: "sweepAngle"}, function () { + return this.Pr + }, function (a) { + this.Pr !== a && (u.j(a, "number", gm, "sweepAngle"), this.Pr = 0 < a && 360 >= a ? a : 360, this.H()) + }); + u.defineProperty(gm, {Gf: "arrangement"}, function () { + return this.Yc + }, function (a) { + this.Yc !== a && (u.rb(a, gm, gm, "arrangement"), a === Am || a === zm || a === ym || a === xm) && (this.Yc = a, this.H()) + }); + u.defineProperty(gm, {direction: "direction"}, function () { + return this.la + }, function (a) { + this.la !== a && (u.rb(a, gm, gm, "direction"), a === om || a === wm || a === mm || a === nm) && (this.la = a, this.H()) + }); + u.defineProperty(gm, {sorting: "sorting"}, function () { + return this.Fh + }, function (a) { + this.Fh !== a && (u.rb(a, gm, gm, "sorting"), a === jm || a === km || a === hm || im || a === lm) && (this.Fh = a, this.H()) + }); + u.defineProperty(gm, {comparer: "comparer"}, function () { + return this.ph + }, function (a) { + this.ph !== a && (u.j(a, "function", gm, "comparer"), this.ph = a, this.H()) + }); + u.defineProperty(gm, {spacing: "spacing"}, function () { + return this.Gh + }, function (a) { + this.Gh !== a && (u.j(a, "number", gm, "spacing"), this.Gh = a, this.H()) + }); + u.defineProperty(gm, {qw: "nodeDiameterFormula"}, function () { + return this.Zq + }, function (a) { + this.Zq !== a && (u.rb(a, gm, gm, "nodeDiameterFormula"), a === Cm || a === Bm) && (this.Zq = a, this.H()) + }); + u.u(gm, {JF: "actualXRadius"}, function () { + return this.td + }); + u.u(gm, {KF: "actualYRadius"}, function () { + return this.jg + }); + u.u(gm, {FI: "actualSpacing"}, function () { + return this.mk + }); + u.u(gm, {IF: "actualCenter"}, function () { + return isNaN(this.Ud.x) || isNaN(this.Ud.y) ? new w(0, 0) : new w(this.Ud.x + this.JF, this.Ud.y + this.KF) + }); + var zm; + gm.ConstantSpacing = zm = u.s(gm, "ConstantSpacing", 0); + var ym; + gm.ConstantDistance = ym = u.s(gm, "ConstantDistance", 1); + var xm; + gm.ConstantAngle = xm = u.s(gm, "ConstantAngle", 2); + var Am; + gm.Packed = Am = u.s(gm, "Packed", 3); + var om; + gm.Clockwise = om = u.s(gm, "Clockwise", 4); + var wm; + gm.Counterclockwise = wm = u.s(gm, "Counterclockwise", 5); + var mm; + gm.BidirectionalLeft = mm = u.s(gm, "BidirectionalLeft", 6); + var nm; + gm.BidirectionalRight = nm = u.s(gm, "BidirectionalRight", 7); + var jm; + gm.Forwards = jm = u.s(gm, "Forwards", 8); + var km; + gm.Reverse = km = u.s(gm, "Reverse", 9); + var hm; + gm.Ascending = hm = u.s(gm, "Ascending", 10); + var im; + gm.Descending = im = u.s(gm, "Descending", 11); + var lm; + gm.Optimized = lm = u.s(gm, "Optimized", 12); + var Cm; + gm.Pythagorean = Cm = u.s(gm, "Pythagorean", 13); + var Bm; + gm.Circular = Bm = u.s(gm, "Circular", 14); + + function fp() { + this.Ao = -Infinity; + this.lp = this.Qm = null + } + + fp.prototype.compare = function (a, b) { + if (0 < a && 0 > this.Ao || Math.abs(a) < Math.abs(this.Ao) && !(0 > a && 0 < this.Ao)) { + this.Ao = a; + this.Qm = []; + this.lp = []; + for (var c = 0; c < b.length; c++) this.Qm[c] = b[c].kb.x, this.lp[c] = b[c].kb.y + } + }; + fp.prototype.commit = function (a) { + if (null !== this.Qm && null !== this.lp) for (var b = 0; b < this.Qm.length; b++) { + var c = a.ja(b); + c.x = this.Qm[b]; + c.y = this.lp[b] + } + }; + + function gp() { + xa.call(this) + } + + u.Ga(gp, xa); + u.fa("CircularNetwork", gp); + gp.prototype.createVertex = function () { + return new hp + }; + gp.prototype.createEdge = function () { + return new up + }; + + function hp() { + ya.call(this); + this.actualAngle = this.diameter = NaN + } + + u.Ga(hp, ya); + u.fa("CircularVertex", hp); + + function ip(a, b) { + var c = a.network; + if (null === c) return NaN; + c = c.Qb; + if (null === c) return NaN; + if (c.Gf === Am) if (c.qw === Bm) a.diameter = Math.max(a.width, a.height); else { + var c = Math.abs(Math.sin(b)), d = Math.abs(Math.cos(b)); + if (0 === c) return a.width; + if (0 === d) return a.height; + a.diameter = Math.min(a.height / c, a.width / d) + } else a.diameter = c.qw === Bm ? Math.max(a.width, a.height) : Math.sqrt(a.width * a.width + a.height * a.height); + return a.diameter + } + + function up() { + Aa.call(this) + } + + u.Ga(up, Aa); + u.fa("CircularEdge", up); + + function vp() { + 0 < arguments.length && u.Wc(vp); + Je.call(this); + this.ig = null; + this.vq = 0; + this.Uf = (new ia(100, 100)).freeze(); + this.xp = !1; + this.Eh = !0; + this.oh = !1; + this.On = 100; + this.Up = 1; + this.yh = 1E3; + this.mr = Math; + this.mn = .05; + this.ln = 50; + this.hn = 150; + this.kn = 0; + this.Op = 10; + this.Np = 5 + } + + u.Ga(vp, Je); + u.fa("ForceDirectedLayout", vp); + vp.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.Uf.assign(this.Uf); + a.xp = this.xp; + a.Eh = this.Eh; + a.oh = this.oh; + a.On = this.On; + a.Up = this.Up; + a.yh = this.yh; + a.mr = this.mr; + a.mn = this.mn; + a.ln = this.ln; + a.hn = this.hn; + a.kn = this.kn; + a.Op = this.Op; + a.Np = this.Np + }; + vp.prototype.createNetwork = function () { + return new wp + }; + vp.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + a = this.Az; + if (0 < this.network.vertexes.count) { + this.network.Qv(); + for (var b = this.network.vertexes.i; b.next();) { + var c = b.value; + c.charge = this.electricalCharge(c); + c.mass = this.gravitationalMass(c) + } + for (b = this.network.edges.i; b.next();) c = b.value, c.stiffness = this.springStiffness(c), c.length = this.springLength(c); + this.Ny(); + this.vq = 0; + if (this.needsClusterLayout()) { + b = this.network; + for (c = b.oI().i; c.next();) { + this.network = c.value; + for (var d = this.network.vertexes.i; d.next();) { + var e = d.value; + e.Of = e.vertexes.count; + e.Rj = 1; + e.rm = null; + e.hh = null + } + xp(this, 0, a) + } + this.network = b; + c.reset(); + for (var d = this.QC, f = c.count, h = !0, k = e = 0, l = u.eb(), m = 0; m < f + b.vertexes.count + 2; m++) l[m] = null; + f = 0; + c.reset(); + for (var n = u.Sf(); c.next();) if (m = c.value, this.kg(m, n), h) h = !1, e = n.x + n.width / 2, k = n.y + n.height / 2, l[0] = new w(n.x + n.width + d.width, n.y), l[1] = new w(n.x, + n.y + n.height + d.height), f = 2; else { + var p = yp(l, f, e, k, n.width, n.height, d), q = l[p], r = new w(q.x + n.width + d.width, q.y), + s = new w(q.x, q.y + n.height + d.height); + p + 1 < f && l.splice(p + 1, 0, null); + l[p] = r; + l[p + 1] = s; + f++; + p = q.x - n.x; + q = q.y - n.y; + for (m = m.vertexes.i; m.next();) r = m.value, r.Ja += p, r.Ua += q + } + u.ic(n); + for (m = b.vertexes.i; m.next();) h = m.value, n = h.kb, 2 > f ? (e = n.x + n.width / 2, k = n.y + n.height / 2, l[0] = new w(n.x + n.width + d.width, n.y), l[1] = new w(n.x, n.y + n.height + d.height), f = 2) : (p = yp(l, f, e, k, n.width, n.height, d), q = l[p], r = new w(q.x + n.width + d.width, + q.y), s = new w(q.x, q.y + n.height + d.height), p + 1 < f && l.splice(p + 1, 0, null), l[p] = r, l[p + 1] = s, f++, h.Ja = q.x + h.width / 2, h.Ua = q.y + h.height / 2); + u.ra(l); + for (c.reset(); c.next();) { + d = c.value; + for (e = d.vertexes.i; e.next();) b.Mk(e.value); + for (d = d.edges.i; d.next();) b.ko(d.value) + } + } + zp(this, a); + this.updateParts() + } + this.On = a; + this.network = null; + this.vf = !0 + }; + vp.prototype.needsClusterLayout = function () { + if (3 > this.network.vertexes.count) return !1; + for (var a = 0, b = 0, c = this.network.vertexes.first().kb, d = this.network.vertexes.i; d.next();) { + if (d.value.kb.sg(c) && (a++, 2 < a)) return !0; + if (10 < b) break; + b++ + } + return !1 + }; + vp.prototype.kg = function (a, b) { + for (var c = !0, d = a.vertexes.i; d.next();) { + var e = d.value; + c ? (c = !1, b.set(e.kb)) : b.Sh(e.kb) + } + return b + }; + + function xp(a, b, c) { + if (Ap(a, b)) { + var d = a.yh; + a.yh *= 1 + 1 / (b + 1); + var e = Bp(a, b), f = Math.max(0, Math.max(Math.min(a.network.vertexes.count, c * (b + 1) / 11), 10)); + a.Az += f; + xp(a, b + 1, c); + zp(a, f); + Cp(a, e); + b = a.ig; + null === b ? b = new E(Dp) : b.clear(); + b.Td(e.vertexes); + b.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.Of - a.Of + }); + for (e = b.i; e.next();) Ep(a, e.value); + a.yh = d + } + } + + function Ap(a, b) { + if (10 < b || 3 > a.network.vertexes.count) return !1; + null === a.ig ? a.ig = new E(Dp) : a.ig.clear(); + a.ig.Td(a.network.vertexes); + var c = a.ig; + c.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.Of - a.Of + }); + for (var d = c.count - 1; 0 <= d && 1 >= c.ja(d).Of;) d--; + return 1 < c.count - d + } + + function Bp(a, b) { + for (var c = a.network, d = new wp, e = a.ig.i; e.next();) { + var f = e.value; + if (1 < f.Of) { + d.Mk(f); + var h = new Fp; + h.Sw = f.Of; + h.Vw = f.width; + h.Rw = f.height; + h.qA = f.M.x; + h.rA = f.M.y; + null === f.hh && (f.hh = new E(Fp)); + f.hh.add(h); + f.Yz = f.hh.count - 1 + } else break + } + for (var k = c.edges.i; k.next();) if (e = k.value, e.fromVertex.network === d && e.toVertex.network === d) d.ko(e); else if (e.fromVertex.network === d) { + var l = e.fromVertex.rm; + null === l && (l = new E(Dp), e.fromVertex.rm = l); + l.add(e.toVertex); + e.fromVertex.Of--; + e.fromVertex.Rj += e.toVertex.Rj + } else e.toVertex.network === + d && (l = e.toVertex.rm, null === l && (l = new E(Dp), e.toVertex.rm = l), l.add(e.fromVertex), e.toVertex.Of--, e.toVertex.Rj += e.fromVertex.Rj); + for (e = d.edges.i; e.next();) f = e.value, f.length *= Math.max(1, K.sqrt((f.fromVertex.Rj + f.toVertex.Rj) / (4 * b + 1))); + for (e = d.vertexes.i; e.next();) if (f = e.value, l = f.rm, null !== l && 0 < l.count && (h = f.hh.ja(f.hh.count - 1), h = h.Sw - f.Of, !(0 >= h))) { + for (var m = 0, n = 0, p = l.count - h; p < l.count; p++) { + for (var q = l.ja(p), r = null, k = q.edges.i; k.next();) { + var s = k.value; + if (s.GG(q) === f) { + r = s; + break + } + } + null !== r && (n += r.length, + m += q.width * q.height) + } + l = f.Ja; + k = f.Ua; + p = f.width; + q = f.height; + r = f.M; + s = p * q; + 1 > s && (s = 1); + m = K.sqrt((m + s + n * n * 4 / (h * h)) / s); + h = (m - 1) * p / 2; + m = (m - 1) * q / 2; + f.kb = new z(l - r.x - h, k - r.y - m, p + 2 * h, q + 2 * m); + f.focus = new w(r.x + h, r.y + m) + } + a.network = d; + return c + } + + function Cp(a, b) { + for (var c = a.network.vertexes.i; c.next();) { + var d = c.value; + d.network = b; + if (null !== d.hh) { + var e = d.hh.ja(d.Yz); + d.Of = e.Sw; + var f = e.qA, h = e.rA; + d.kb = new z(d.Ja - f, d.Ua - h, e.Vw, e.Rw); + d.focus = new w(f, h); + d.Yz-- + } + } + for (c = a.network.edges.i; c.next();) c.value.network = b; + a.network = b + } + + function Ep(a, b) { + var c = b.rm; + if (null !== c && 0 !== c.count) { + var d = b.Ja, e = b.Ua, f = b.width, h = b.height; + null !== b.hh && 0 < b.hh.count && (h = b.hh.ja(0), f = h.Vw, h = h.Rw); + for (var f = K.sqrt(f * f + h * h) / 2, k = !1, l = h = 0, m = 0, n = b.vertexes.i; n.next();) { + var p = n.value; + 1 >= p.Of ? l++ : (k = !0, m++, h += Math.atan2(b.Ua - p.Ua, b.Ja - p.Ja)) + } + if (0 !== l) for (0 < m && (h /= m), n = m = 0, m = k ? 2 * Math.PI / (l + 1) : 2 * Math.PI / l, 0 === l % 2 && (n = m / 2), 1 < c.count && c.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : b.width * b.height - a.width * a.height + }), k = 0 === l % 2 ? 0 : 1, c = c.i; c.next();) if (l = + c.value, !(1 < l.Of || a.isFixed(l))) { + for (var p = null, q = l.edges.i; q.next();) { + p = q.value; + break + } + var q = l.width, r = l.height, q = K.sqrt(q * q + r * r) / 2, p = f + p.length + q, + q = h + (m * (k / 2 >> 1) + n) * (0 === k % 2 ? 1 : -1); + l.Ja = d + p * Math.cos(q); + l.Ua = e + p * Math.sin(q); + k++ + } + } + } + + function yp(a, b, c, d, e, f, h) { + var k = 9E19, l = -1, m = 0; + a:for (; m < b; m++) { + var n = a[m], p = n.x - c, q = n.y - d, p = p * p + q * q; + if (p < k) { + for (q = m - 1; 0 <= q; q--) if (a[q].y > n.y && a[q].x - n.x < e + h.width) continue a; + for (q = m + 1; q < b; q++) if (a[q].x > n.x && a[q].y - n.y < f + h.height) continue a; + l = m; + k = p + } + } + return l + } + + vp.prototype.Ny = function () { + if (this.comments) for (var a = this.network.vertexes.i; a.next();) this.addComments(a.value) + }; + vp.prototype.addComments = function (a) { + var b = a.Cc; + if (null !== b) for (b = b.rD(); b.next();) { + var c = b.value; + if ("Comment" === c.Kc && c.Ea()) { + var d = this.network.Am(c); + null === d && (d = this.network.ds(c)); + d.charge = this.lG; + for (var c = null, e = d.bc; e.next();) { + var f = e.value; + if (f.toVertex === a) { + c = f; + break + } + } + if (null === c) for (e = d.kc; e.next();) if (f = e.value, f.fromVertex === a) { + c = f; + break + } + null === c && (c = this.network.No(a, d, null)); + c.length = this.mG + } + } + }; + + function Gp(a, b) { + var c = a.aa, d = c.x, e = c.y, f = c.width, c = c.height, h = b.aa, k = h.x, l = h.y, m = h.width, + h = h.height; + return d + f < k ? e > l + h ? (d = d + f - k, e = e - l - h, K.sqrt(d * d + e * e)) : e + c < l ? (d = d + f - k, e = e + c - l, K.sqrt(d * d + e * e)) : k - (d + f) : d > k + m ? e > l + h ? (d = d - k - m, e = e - l - h, K.sqrt(d * d + e * e)) : e + c < l ? (d = d - k - m, e = e + c - l, K.sqrt(d * d + e * e)) : d - (k + m) : e > l + h ? e - (l + h) : e + c < l ? l - (e + c) : .1 + } + + function zp(a, b) { + a.ig = null; + for (var c = a.vq + b; a.vq < c && (a.vq++, Hp(a));) ; + a.ig = null + } + + function Hp(a) { + null === a.ig && (a.ig = new E(Dp), a.ig.Td(a.network.vertexes)); + var b = a.ig.n; + if (0 >= b.length) return !1; + var c = b[0]; + c.forceX = 0; + c.forceY = 0; + for (var d = c.Ja, e = d, f = c.Ua, h = f, c = 1; c < b.length; c++) { + var k = b[c]; + k.forceX = 0; + k.forceY = 0; + var l = k.Ja, k = k.Ua, d = Math.min(d, l), e = Math.max(e, l), f = Math.min(f, k), h = Math.max(h, k) + } + (f = e - d > h - f) ? b.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : a.Ja - b.Ja + }) : b.sort(function (a, b) { + return null === a || null === b || a === b ? 0 : a.Ua - b.Ua + }); + for (var h = a.yh, m = 0, n = 0, p = 0, c = 0; c < b.length; c++) { + var k = + b[c], l = k.aa, q = k.M, d = l.x + q.x, l = l.y + q.y, n = k.charge * a.electricalFieldX(d, l), + p = k.charge * a.electricalFieldY(d, l), n = n + k.mass * a.gravitationalFieldX(d, l), + p = p + k.mass * a.gravitationalFieldY(d, l); + k.forceX += n; + k.forceY += p; + for (q = c + 1; q < b.length; q++) if (e = b[q], e !== k) { + var r = e.aa, n = e.M, p = r.x + n.x, r = r.y + n.y; + if (d - p > h || p - d > h) { + if (f) break + } else if (l - r > h || r - l > h) { + if (!f) break + } else { + var s = Gp(k, e); + 1 > s ? (n = a.xw, null === n && (a.xw = n = new Ga(0)), m = n.random(), s = n.random(), d > p ? (n = Math.abs(e.aa.right - k.aa.x), n = (1 + n) * m) : d < p ? (n = Math.abs(e.aa.x - + k.aa.right), n = -(1 + n) * m) : (n = Math.max(e.width, k.width), n = (1 + n) * m - n / 2), l > r ? (p = Math.abs(e.aa.bottom - k.aa.y), p = (1 + p) * s) : d < p ? (p = Math.abs(e.aa.y - k.aa.bottom), p = -(1 + p) * s) : (p = Math.max(e.height, k.height), p = (1 + p) * s - p / 2)) : (m = -(k.charge * e.charge) / (s * s), n = (p - d) / s * m, p = (r - l) / s * m); + k.forceX += n; + k.forceY += p; + e.forceX -= n; + e.forceY -= p + } + } + } + for (c = a.network.edges.i; c.next();) f = c.value, k = f.fromVertex, e = f.toVertex, l = k.aa, q = k.M, d = l.x + q.x, l = l.y + q.y, r = e.aa, n = e.M, p = r.x + n.x, r = r.y + n.y, s = Gp(k, e), 1 > s ? (n = a.xw, null === n && (a.xw = n = new Ga(0)), + m = n.random(), s = n.random(), n = (d > p ? 1 : -1) * (1 + (e.width > k.width) ? e.width : k.width) * m, p = (l > r ? 1 : -1) * (1 + (e.height > k.height) ? e.height : k.height) * s) : (m = f.stiffness * (s - f.length), n = (p - d) / s * m, p = (r - l) / s * m), k.forceX += n, k.forceY += p, e.forceX -= n, e.forceY -= p; + c = 0; + d = Math.max(a.yh / 20, 50); + for (e = 0; e < b.length; e++) k = b[e], a.isFixed(k) ? a.moveFixedVertex(k) : (f = k.forceX, h = k.forceY, f < -d ? f = -d : f > d && (f = d), h < -d ? h = -d : h > d && (h = d), k.Ja += f, k.Ua += h, c = Math.max(c, f * f + h * h)); + return c > a.oD * a.oD + } + + vp.prototype.moveFixedVertex = function () { + }; + vp.prototype.commitLayout = function () { + this.cA(); + this.commitNodes(); + this.Qs && this.commitLinks() + }; + vp.prototype.cA = function () { + if (this.fp) for (var a = this.network.edges.i; a.next();) { + var b = a.value.link; + null !== b && (b.vb = uc, b.xb = uc) + } + }; + vp.prototype.commitNodes = function () { + var a = 0, b = 0; + if (this.PF) { + var c = u.Sf(); + this.kg(this.network, c); + b = this.Ud; + a = b.x - c.x; + b = b.y - c.y; + u.ic(c) + } + for (var c = u.Sf(), d = this.network.vertexes.i; d.next();) { + var e = d.value; + if (0 !== a || 0 !== b) c.assign(e.kb), c.x += a, c.y += b, e.kb = c; + e.commit() + } + u.ic(c) + }; + vp.prototype.commitLinks = function () { + for (var a = this.network.edges.i; a.next();) a.value.commit() + }; + vp.prototype.springStiffness = function (a) { + a = a.stiffness; + return isNaN(a) ? this.mn : a + }; + vp.prototype.springLength = function (a) { + a = a.length; + return isNaN(a) ? this.ln : a + }; + vp.prototype.electricalCharge = function (a) { + a = a.charge; + return isNaN(a) ? this.hn : a + }; + vp.prototype.electricalFieldX = function () { + return 0 + }; + vp.prototype.electricalFieldY = function () { + return 0 + }; + vp.prototype.gravitationalMass = function (a) { + a = a.mass; + return isNaN(a) ? this.kn : a + }; + vp.prototype.gravitationalFieldX = function () { + return 0 + }; + vp.prototype.gravitationalFieldY = function () { + return 0 + }; + vp.prototype.isFixed = function (a) { + return a.isFixed + }; + u.u(vp, {gJ: "currentIteration"}, function () { + return this.vq + }); + u.defineProperty(vp, {QC: "arrangementSpacing"}, function () { + return this.Uf + }, function (a) { + u.C(a, ia, vp, "arrangementSpacing"); + this.Uf.L(a) || (this.Uf.assign(a), this.H()) + }); + u.defineProperty(vp, {PF: "arrangesToOrigin"}, function () { + return this.xp + }, function (a) { + this.xp !== a && (u.j(a, "boolean", vp, "arrangesToOrigin"), this.xp = a, this.H()) + }); + u.defineProperty(vp, {fp: "setsPortSpots"}, function () { + return this.Eh + }, function (a) { + this.Eh !== a && (u.j(a, "boolean", vp, "setsPortSpots"), this.Eh = a, this.H()) + }); + u.defineProperty(vp, {comments: "comments"}, function () { + return this.oh + }, function (a) { + this.oh !== a && (u.j(a, "boolean", vp, "comments"), this.oh = a, this.H()) + }); + u.defineProperty(vp, {Az: "maxIterations"}, function () { + return this.On + }, function (a) { + this.On !== a && (u.j(a, "number", vp, "maxIterations"), 0 <= a && (this.On = a, this.H())) + }); + u.defineProperty(vp, {oD: "epsilonDistance"}, function () { + return this.Up + }, function (a) { + this.Up !== a && (u.j(a, "number", vp, "epsilonDistance"), 0 < a && (this.Up = a, this.H())) + }); + u.defineProperty(vp, {AJ: "infinityDistance"}, function () { + return this.yh + }, function (a) { + this.yh !== a && (u.j(a, "number", vp, "infinityDistance"), 1 < a && (this.yh = a, this.H())) + }); + u.defineProperty(vp, {xw: "randomNumberGenerator"}, function () { + return this.mr + }, function (a) { + this.mr !== a && (null !== a && "function" !== typeof a.random && u.k('ForceDirectedLayout.randomNumberGenerator must have a "random()" function on it: ' + a), this.mr = a) + }); + u.defineProperty(vp, {tJ: "defaultSpringStiffness"}, function () { + return this.mn + }, function (a) { + this.mn !== a && (u.j(a, "number", vp, "defaultSpringStiffness"), this.mn = a, this.H()) + }); + u.defineProperty(vp, {sJ: "defaultSpringLength"}, function () { + return this.ln + }, function (a) { + this.ln !== a && (u.j(a, "number", vp, "defaultSpringLength"), this.ln = a, this.H()) + }); + u.defineProperty(vp, {mJ: "defaultElectricalCharge"}, function () { + return this.hn + }, function (a) { + this.hn !== a && (u.j(a, "number", vp, "defaultElectricalCharge"), this.hn = a, this.H()) + }); + u.defineProperty(vp, {nJ: "defaultGravitationalMass"}, function () { + return this.kn + }, function (a) { + this.kn !== a && (u.j(a, "number", vp, "defaultGravitationalMass"), this.kn = a, this.H()) + }); + u.defineProperty(vp, {mG: "defaultCommentSpringLength"}, function () { + return this.Op + }, function (a) { + this.Op !== a && (u.j(a, "number", vp, "defaultCommentSpringLength"), this.Op = a, this.H()) + }); + u.defineProperty(vp, {lG: "defaultCommentElectricalCharge"}, function () { + return this.Np + }, function (a) { + this.Np !== a && (u.j(a, "number", vp, "defaultCommentElectricalCharge"), this.Np = a, this.H()) + }); + + function Fp() { + this.rA = this.qA = this.Rw = this.Vw = this.Sw = 0 + } + + function wp() { + xa.call(this) + } + + u.Ga(wp, xa); + u.fa("ForceDirectedNetwork", wp); + wp.prototype.createVertex = function () { + return new Dp + }; + wp.prototype.createEdge = function () { + return new Ip + }; + + function Dp() { + ya.call(this); + this.isFixed = !1; + this.mass = this.charge = NaN; + this.Rj = this.Of = this.forceY = this.forceX = 0; + this.hh = this.rm = null; + this.Yz = 0 + } + + u.Ga(Dp, ya); + u.fa("ForceDirectedVertex", Dp); + + function Ip() { + Aa.call(this); + this.length = this.stiffness = NaN + } + + u.Ga(Ip, Aa); + u.fa("ForceDirectedEdge", Ip); + + function Yl() { + 0 < arguments.length && u.Wc(Yl); + Je.call(this); + this.sd = this.Ql = 25; + this.la = 0; + this.gn = Op; + this.Mn = Sp; + this.Bn = Tp; + this.Nl = 4; + this.Wm = Up; + this.oi = Vp; + this.Eh = !0; + this.gj = 4; + this.Hb = this.Fu = this.jb = -1; + this.Cf = this.Nq = 0; + this.Kb = this.Bf = this.$f = this.Lg = this.Ld = null; + this.Uq = 0; + this.Tq = this.Sl = null; + this.cg = 0; + this.Vq = null; + this.Ng = []; + this.Ng.length = 100 + } + + u.Ga(Yl, Je); + u.fa("LayeredDigraphLayout", Yl); + Yl.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.Ql = this.Ql; + a.sd = this.sd; + a.la = this.la; + a.gn = this.gn; + a.Mn = this.Mn; + a.Bn = this.Bn; + a.Nl = this.Nl; + a.Wm = this.Wm; + a.oi = this.oi; + a.Eh = this.Eh; + a.gj = this.gj + }; + Yl.prototype.createNetwork = function () { + return new Wp + }; + Yl.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + this.Ud = this.initialOrigin(this.Ud); + this.Fu = -1; + this.Cf = this.Nq = 0; + this.Vq = this.Tq = this.Sl = null; + for (a = 0; a < this.Ng.length; a++) this.Ng[a] = null; + if (0 < this.network.vertexes.count) { + this.network.Qv(); + for (a = this.network.edges.i; a.next();) a.value.rev = !1; + switch (this.gn) { + default: + case Xp: + var b = 0, c = this.network.vertexes.count - + 1; + a = []; + a.length = c + 1; + for (var d = this.network.vertexes.i; d.next();) d.value.valid = !0; + for (; null !== Yp(this.network);) { + for (d = Zp(this.network); null !== d;) a[c] = d, c--, d.valid = !1, d = Zp(this.network); + for (d = $p(this.network); null !== d;) a[b] = d, b++, d.valid = !1, d = $p(this.network); + for (var d = null, e = 0, f = this.network.vertexes.i; f.next();) { + var h = f.value; + if (h.valid) { + for (var k = 0, l = h.bc; l.next();) l.value.toVertex.valid && k++; + for (var l = 0, m = h.kc; m.next();) m.value.fromVertex.valid && l++; + if (null === d || e < k - l) d = h, e = k - l + } + } + null !== d && (a[b] = + d, b++, d.valid = !1) + } + for (b = 0; b < this.network.vertexes.count; b++) a[b].index = b; + for (a = this.network.edges.i; a.next();) b = a.value, b.fromVertex.index > b.toVertex.index && (this.network.yw(b), b.rev = !0); + break; + case Op: + for (b = this.network.vertexes.i; b.next();) a = b.value, a.wo = -1, a.finish = -1; + for (a = this.network.edges.i; a.next();) a.value.forest = !1; + this.Uq = 0; + for (b.reset(); b.next();) c = b.value, 0 === c.kc.count && aq(this, c); + for (b.reset(); b.next();) c = b.value, -1 === c.wo && aq(this, c); + for (a.reset(); a.next();) b = a.value, b.forest || (c = b.fromVertex, + d = c.finish, e = b.toVertex, f = e.finish, e.wo < c.wo && d < f && (this.network.yw(b), b.rev = !0)) + } + for (a = this.network.vertexes.i; a.next();) a.value.layer = -1; + this.jb = -1; + this.assignLayers(); + for (a.reset(); a.next();) this.jb = Math.max(this.jb, a.value.layer); + a = []; + for (c = this.network.edges.i; c.next();) b = c.value, b.valid = !1, a.push(b); + for (c = 0; c < a.length; c++) if (b = a[c], !b.valid && (null !== b.fromVertex.kd && null !== b.toVertex.kd || b.fromVertex.layer !== b.toVertex.layer)) { + l = h = k = f = 0; + e = b.fromVertex; + d = b.toVertex; + if (null !== b.link) { + k = b.link; + if (null === k) continue; + var n = e.kd, f = d.kd; + if (null === n || null === f) continue; + var p = k.W, h = k.ca, q = k.od, l = k.fe; + b.rev && (k = p, m = q, p = h, q = l, h = k, l = m); + var r = e.M, k = b.toVertex.M, s = b.rev ? d.aa : e.aa, m = u.K(); + s.J() ? (On(p, q, Ib, m), m.J() || m.assign(r)) : m.assign(r); + n !== p && s.J() && p.Ea() && (n = e.aa, n.J() && (m.x += s.x - n.x, m.y += s.y - n.y)); + p = b.rev ? e.aa : d.aa; + n = u.K(); + p.J() ? (On(h, l, Ib, n), n.J() || n.assign(k)) : n.assign(k); + f !== h && p.J() && h.Ea() && (f = d.aa, f.J() && (n.x += p.x - f.x, n.y += p.y - f.y)); + 90 === this.la || 270 === this.la ? (f = Math.round((m.x - r.x) / this.sd), + h = m.x, k = Math.round((n.x - k.x) / this.sd), l = n.x) : (f = Math.round((m.y - r.y) / this.sd), h = m.y, k = Math.round((n.y - k.y) / this.sd), l = n.y); + u.v(m); + u.v(n); + b.portFromColOffset = f; + b.portFromPos = h; + b.portToColOffset = k; + b.portToPos = l + } else b.portFromColOffset = 0, b.portFromPos = 0, b.portToColOffset = 0, b.portToPos = 0; + m = e.layer; + r = d.layer; + n = b; + p = 0; + s = n.link; + if (null !== s) { + var t = s.od, v = s.fe; + if (null !== t && null !== v) { + var x = s.W, q = s.ca; + if (null !== x && null !== q) { + var B = t.vb, y = v.xb; + this.fp || (s.vb.Lc() || (B = s.vb), s.xb.Lc() || (y = s.xb)); + if (B.Lc() || B === + vb) B = bq(this, !0); + if (y.Lc() || y === vb) y = bq(this, !1); + var C = s.dc, I = s.getLinkPoint(x, t, B, !0, C, q, v, u.K()), + B = s.getLinkDirection(x, t, I, B, !0, C, q, v); + u.v(I); + B === cq(this, n, !0) ? p += 1 : this.fp && null !== x && 1 === x.ports.count && n.rev && (p += 1); + I = s.getLinkPoint(q, v, y, !1, C, x, t, u.K()); + s = s.getLinkDirection(q, v, I, y, !1, C, x, t); + u.v(I); + s === cq(this, n, !1) ? p += 2 : this.fp && null !== q && 1 === q.ports.count && n.rev && (p += 2) + } + } + } + n = 1 === p || 3 === p ? !0 : !1; + if (p = 2 === p || 3 === p ? !0 : !1) q = this.network.createVertex(), q.kd = null, q.om = 1, q.layer = m, q.near = e, this.network.Mk(q), + e = this.network.No(e, q, b.link), e.valid = !1, e.rev = b.rev, e.portFromColOffset = f, e.portToColOffset = 0, e.portFromPos = h, e.portToPos = 0, e = q; + s = 1; + n && s--; + if (m - r > s && 0 < m) { + b.valid = !1; + q = this.network.createVertex(); + q.kd = null; + q.om = 2; + q.layer = m - 1; + this.network.Mk(q); + e = this.network.No(e, q, b.link); + e.valid = !0; + e.rev = b.rev; + e.portFromColOffset = p ? 0 : f; + e.portToColOffset = 0; + e.portFromPos = p ? 0 : h; + e.portToPos = 0; + e = q; + for (m--; m - r > s && 0 < m;) q = this.network.createVertex(), q.kd = null, q.om = 3, q.layer = m - 1, this.network.Mk(q), e = this.network.No(e, q, + b.link), e.valid = !0, e.rev = b.rev, e.portFromColOffset = 0, e.portToColOffset = 0, e.portFromPos = 0, e.portToPos = 0, e = q, m--; + e = this.network.No(q, d, b.link); + e.valid = !n; + n && (q.near = d); + e.rev = b.rev; + e.portFromColOffset = 0; + e.portToColOffset = k; + e.portFromPos = 0; + e.portToPos = l + } else b.valid = !0 + } + b = this.Ld = []; + for (c = 0; c <= this.jb; c++) b[c] = 0; + for (a = this.network.vertexes.i; a.next();) c = a.value, c.index = -1; + this.initializeIndices(); + this.Fu = -1; + for (c = this.Cf = this.Nq = 0; c <= this.jb; c++) b[c] > b[this.Cf] && (this.Fu = b[c] - 1, this.Cf = c), b[c] < b[this.Nq] && + (this.Nq = c); + this.Vq = []; + for (c = 0; c < b.length; c++) this.Vq[c] = []; + for (a.reset(); a.next();) b = a.value, c = this.Vq[b.layer], c[b.index] = b; + this.Hb = -1; + for (a = 0; a <= this.jb; a++) { + b = dq(this, a); + c = 0; + d = this.Ld[a]; + for (e = 0; e < d; e++) f = b[e], c += this.nodeMinColumnSpace(f, !0), f.column = c, c += 1, c += this.nodeMinColumnSpace(f, !1); + this.Hb = Math.max(this.Hb, c - 1); + eq(this, a, b) + } + this.reduceCrossings(); + this.straightenAndPack(); + this.updateParts() + } + this.network = null; + this.vf = !0 + }; + Yl.prototype.linkMinLength = function (a) { + var b = a.toVertex, c = 0; + for (a = a.fromVertex.bc; a.next();) a.value.toVertex === b && c++; + return 1 < c ? 2 : 1 + }; + + function fq(a) { + var b = a.fromVertex.kd; + a = a.toVertex.kd; + return null === b && null === a ? 8 : null === b || null === a ? 4 : 1 + } + + Yl.prototype.nodeMinLayerSpace = function (a, b) { + return null === a.kd ? 0 : 90 === this.la || 270 === this.la ? b ? a.M.y + 10 : a.aa.height - a.M.y + 10 : b ? a.M.x + 10 : a.aa.width - a.M.x + 10 + }; + Yl.prototype.nodeMinColumnSpace = function (a, b) { + if (null === a.kd) return 0; + var c = b ? a.Iz : a.Hz; + if (null !== c) return c; + c = this.la; + return 90 === c || 270 === c ? b ? a.Iz = a.M.x / this.sd + 1 | 0 : a.Hz = (a.aa.width - a.M.x) / this.sd + 1 | 0 : b ? a.Iz = a.M.y / this.sd + 1 | 0 : a.Hz = (a.aa.height - a.M.y) / this.sd + 1 | 0 + }; + + function gq(a) { + null === a.Sl && (a.Sl = []); + for (var b = 0, c = a.network.vertexes.i; c.next();) { + var d = c.value; + a.Sl[b] = d.layer; + b++; + a.Sl[b] = d.column; + b++; + a.Sl[b] = d.index; + b++ + } + return a.Sl + } + + function hq(a, b) { + for (var c = 0, d = a.network.vertexes.i; d.next();) { + var e = d.value; + e.layer = b[c]; + c++; + e.column = b[c]; + c++; + e.index = b[c]; + c++ + } + } + + function iq(a, b, c) { + var d = dq(a, b), e = a.Ld[b]; + if (null === a.Tq || a.Tq.length < e * e) a.Tq = []; + for (var f = a.Tq, h = 0; h < e; h++) { + var k = 0, l = d[h], m = l.near, n = 0; + if (null !== m && m.layer === l.layer) if (n = m.index, n > h) for (var p = h + 1; p < n; p++) l = d[p], l.near === m && l.om === m.om || k++; else for (p = h - 1; p > n; p--) l = d[p], l.near === m && l.om === m.om || k++; + var m = 0, q, r = q = p = l = 0, s, t = 0, v = 0; + s = 0; + var x; + if (0 <= c) for (n = d[h].Ie, m = 0; m < n.count; m++) if (q = n.n[m], q.valid && q.fromVertex.layer !== b) for (l = q.fromVertex.index, p = q.portToPos, q = q.portFromPos, r = m + 1; r < n.count; r++) s = + n.n[r], s.valid && s.fromVertex.layer !== b && (t = s.fromVertex.index, v = s.portToPos, s = s.portFromPos, p < v && (l > t || l === t && q > s) && k++, v < p && (t > l || t === l && s > q) && k++); + if (0 >= c) for (n = d[h].Ce, m = 0; m < n.count; m++) if (q = n.n[m], q.valid && q.toVertex.layer !== b) for (l = q.toVertex.index, p = q.portToPos, q = q.portFromPos, r = m + 1; r < n.count; r++) s = n.n[r], s.valid && s.toVertex.layer !== b && (t = s.toVertex.index, v = s.portToPos, s = s.portFromPos, q < s && (l > t || l === t && p > v) && k++, s < q && (t > l || t === l && v > p) && k++); + f[h * e + h] = k; + for (n = h + 1; n < e; n++) { + var B = 0, y = 0; + if (0 <= c) for (k = + d[h].Ie, x = d[n].Ie, m = 0; m < k.count; m++) if (q = k.n[m], q.valid && q.fromVertex.layer !== b) for (l = q.fromVertex.index, q = q.portFromPos, r = 0; r < x.count; r++) s = x.n[r], s.valid && s.fromVertex.layer !== b && (t = s.fromVertex.index, s = s.portFromPos, (l < t || l === t && q < s) && y++, (t < l || t === l && s < q) && B++); + if (0 >= c) for (k = d[h].Ce, x = d[n].Ce, m = 0; m < k.count; m++) if (q = k.n[m], q.valid && q.toVertex.layer !== b) for (l = q.toVertex.index, p = q.portToPos, r = 0; r < x.count; r++) s = x.n[r], s.valid && s.toVertex.layer !== b && (t = s.toVertex.index, v = s.portToPos, (l < t || l === t && p < + v) && y++, (t < l || t === l && v < p) && B++); + f[h * e + n] = B; + f[n * e + h] = y + } + } + eq(a, b, d); + return f + } + + Yl.prototype.countCrossings = function () { + for (var a = 0, b = 0; b <= this.jb; b++) for (var c = iq(this, b, 1), d = this.Ld[b], e = 0; e < d; e++) for (var f = e; f < d; f++) a += c[e * d + f]; + return a + }; + + function jq(a) { + for (var b = 0, c = 0; c <= a.jb; c++) { + for (var d = a, e = c, f = dq(d, e), h = d.Ld[e], k = 0, l = 0; l < h; l++) { + var m = null, m = f[l].Ce, n, p = 0, q = 0; + if (null !== m) for (var r = 0; r < m.count; r++) n = m.n[r], n.valid && n.toVertex.layer !== e && (p = n.fromVertex.column + n.portFromColOffset, q = n.toVertex.column + n.portToColOffset, k += (Math.abs(p - q) + 1) * fq(n)) + } + eq(d, e, f); + b += k + } + return b + } + + Yl.prototype.normalize = function () { + var a = Infinity; + this.Hb = -1; + for (var b = this.network.vertexes.i; b.next();) { + var c = b.value, a = Math.min(a, c.column - this.nodeMinColumnSpace(c, !0)); + this.Hb = Math.max(this.Hb, c.column + this.nodeMinColumnSpace(c, !1)) + } + for (b.reset(); b.next();) b.value.column -= a; + this.Hb -= a + }; + + function kq(a, b, c) { + for (var d = dq(a, b), e = a.Ld[b], f = [], h = 0; h < e; h++) { + var k = d[h], l = null; + 0 >= c && (l = k.Ie); + var m = null; + 0 <= c && (m = k.Ce); + var n = 0, p = 0, q = k.near; + null !== q && q.layer === k.layer && (n += q.column - 1, p++); + if (null !== l) for (q = 0; q < l.count; q++) { + var k = l.n[q], r = k.fromVertex; + k.valid && !k.rev && r.layer !== b && (n += r.column + k.portFromColOffset, p++) + } + if (null !== m) for (l = 0; l < m.count; l++) k = m.n[l], q = k.toVertex, k.valid && !k.rev && q.layer !== b && (n += q.column + k.portToColOffset, p++); + f[h] = 0 === p ? -1 : n / p + } + eq(a, b, d); + return f + } + + function lq(a, b, c) { + for (var d = dq(a, b), e = a.Ld[b], f = [], h = 0; h < e; h++) { + var k = d[h], l = null; + 0 >= c && (l = k.Ie); + var m = null; + 0 <= c && (m = k.Ce); + var n = 0, p = [], q = k.near; + null !== q && q.layer === k.layer && (p[n] = q.column - 1, n++); + if (null !== l) for (q = 0; q < l.count; q++) { + var k = l.n[q], r = k.fromVertex; + k.valid && !k.rev && r.layer !== b && (p[n] = r.column + k.portFromColOffset, n++) + } + if (null !== m) for (l = 0; l < m.count; l++) k = m.n[l], q = k.toVertex, k.valid && !k.rev && q.layer !== b && (p[n] = q.column + k.portToColOffset, n++); + 0 === n ? f[h] = -1 : (p.sort(function (a, b) { + return a - b + }), + m = n >> 1, f[h] = n & 1 ? p[m] : p[m - 1] + p[m] >> 1) + } + eq(a, b, d); + return f + } + + function mq(a, b, c, d, e, f) { + if (b.component === d) { + b.component = c; + var h = 0, k = 0; + if (e) for (var l = b.bc; l.next();) { + var k = l.value, m = k.toVertex, h = b.layer - m.layer, k = a.linkMinLength(k); + h === k && mq(a, m, c, d, e, f) + } + if (f) for (l = b.kc; l.next();) k = l.value, m = k.fromVertex, h = m.layer - b.layer, k = a.linkMinLength(k), h === k && mq(a, m, c, d, e, f) + } + } + + function nq(a, b, c, d, e, f) { + if (b.component === d) { + b.component = c; + if (e) for (var h = b.bc; h.next();) nq(a, h.value.toVertex, c, d, e, f); + if (f) for (b = b.kc; b.next();) nq(a, b.value.fromVertex, c, d, e, f) + } + } + + function Yp(a) { + for (a = a.vertexes.i; a.next();) { + var b = a.value; + if (b.valid) return b + } + return null + } + + function Zp(a) { + for (a = a.vertexes.i; a.next();) { + var b = a.value; + if (b.valid) { + for (var c = !0, d = b.bc; d.next();) if (d.value.toVertex.valid) { + c = !1; + break + } + if (c) return b + } + } + return null + } + + function $p(a) { + for (a = a.vertexes.i; a.next();) { + var b = a.value; + if (b.valid) { + for (var c = !0, d = b.kc; d.next();) if (d.value.fromVertex.valid) { + c = !1; + break + } + if (c) return b + } + } + return null + } + + function aq(a, b) { + b.wo = a.Uq; + a.Uq++; + for (var c = b.bc; c.next();) { + var d = c.value, e = d.toVertex; + -1 === e.wo && (d.forest = !0, aq(a, e)) + } + b.finish = a.Uq; + a.Uq++ + } + + Yl.prototype.assignLayers = function () { + switch (this.Mn) { + case oq: + pq(this); + break; + case qq: + for (var a = 0, b = this.network.vertexes.i; b.next();) a = rq(this, b.value), this.jb = Math.max(a, this.jb); + for (b.reset(); b.next();) a = b.value, a.layer = this.jb - a.layer; + break; + default: + case Sp: + pq(this); + for (b = this.network.vertexes.i; b.next();) b.value.valid = !1; + for (b.reset(); b.next();) a = b.value, 0 === a.kc.count && sq(this, a); + a = Infinity; + for (b.reset(); b.next();) a = Math.min(a, b.value.layer); + this.jb = -1; + for (b.reset(); b.next();) { + var c = b.value; + c.layer -= + a; + this.jb = Math.max(this.jb, c.layer) + } + } + }; + + function pq(a) { + for (var b = a.network.vertexes.i; b.next();) { + var c = tq(a, b.value); + a.jb = Math.max(c, a.jb) + } + } + + function tq(a, b) { + var c = 0; + if (-1 === b.layer) { + for (var d = b.bc; d.next();) var e = d.value, f = e.toVertex, e = a.linkMinLength(e), c = Math.max(c, tq(a, f) + e); + b.layer = c + } else c = b.layer; + return c + } + + function rq(a, b) { + var c = 0; + if (-1 === b.layer) { + for (var d = b.kc; d.next();) var e = d.value, f = e.fromVertex, e = a.linkMinLength(e), c = Math.max(c, rq(a, f) + e); + b.layer = c + } else c = b.layer; + return c + } + + function sq(a, b) { + if (!b.valid) { + b.valid = !0; + for (var c = b.bc; c.next();) sq(a, c.value.toVertex); + for (c = a.network.vertexes.i; c.next();) c.value.component = -1; + for (var d = b.Ie.n, e = d.length, f = 0; f < e; f++) { + var h = d[f], k = a.linkMinLength(h); + h.fromVertex.layer - h.toVertex.layer > k && mq(a, h.fromVertex, 0, -1, !0, !1) + } + for (mq(a, b, 1, -1, !0, !0); 0 !== b.component;) { + for (var k = 0, d = Infinity, l = 0, m = null, n = a.network.vertexes.i; n.next();) { + var p = n.value; + if (1 === p.component) { + for (var q = 0, r = !1, s = p.Ie.n, e = s.length, f = 0; f < e; f++) { + var h = s[f], t = h.fromVertex, + q = q + 1; + 1 !== t.component && (k += 1, t = t.layer - p.layer, h = a.linkMinLength(h), d = Math.min(d, t - h)) + } + h = p.Ce.n; + e = h.length; + for (f = 0; f < e; f++) s = h[f].toVertex, q -= 1, 1 !== s.component ? k -= 1 : r = !0; + (null === m || q < l) && !r && (m = p, l = q) + } + } + if (0 < k) { + for (c.reset(); c.next();) e = c.value, 1 === e.component && (e.layer += d); + b.component = 0 + } else m.component = 0 + } + for (c = a.network.vertexes.i; c.next();) c.value.component = -1; + for (mq(a, b, 1, -1, !0, !1); 0 !== b.component;) { + f = 0; + e = Infinity; + d = 0; + k = null; + for (l = a.network.vertexes.i; l.next();) if (m = l.value, 1 === m.component) { + n = + 0; + p = !1; + h = m.Ie.n; + q = h.length; + for (r = 0; r < q; r++) s = h[r].fromVertex, n += 1, 1 !== s.component ? f += 1 : p = !0; + h = m.Ce.n; + q = h.length; + for (r = 0; r < q; r++) s = h[r], t = s.toVertex, n -= 1, 1 !== t.component && (f -= 1, t = m.layer - t.layer, s = a.linkMinLength(s), e = Math.min(e, t - s)); + (null === k || n > d) && !p && (k = m, d = n) + } + if (0 > f) { + for (c.reset(); c.next();) f = c.value, 1 === f.component && (f.layer -= e); + b.component = 0 + } else k.component = 0 + } + } + } + + function cq(a, b, c) { + return 90 === a.la ? c && !b.rev || !c && b.rev ? 270 : 90 : 180 === a.la ? c && !b.rev || !c && b.rev ? 0 : 180 : 270 === a.la ? c && !b.rev || !c && b.rev ? 90 : 270 : c && !b.rev || !c && b.rev ? 180 : 0 + } + + Yl.prototype.initializeIndices = function () { + switch (this.Bn) { + default: + case uq: + for (var a = this.network.vertexes.i; a.next();) { + var b = a.value, c = b.layer; + b.index = this.Ld[c]; + this.Ld[c]++ + } + break; + case Tp: + a = this.network.vertexes.i; + for (b = this.jb; 0 <= b; b--) for (a.reset(); a.next();) c = a.value, c.layer === b && -1 === c.index && vq(this, c); + break; + case wq: + for (a = this.network.vertexes.i, b = 0; b <= this.jb; b++) for (a.reset(); a.next();) c = a.value, c.layer === b && -1 === c.index && xq(this, c) + } + }; + + function vq(a, b) { + var c = b.layer; + b.index = a.Ld[c]; + a.Ld[c]++; + for (var c = b.Ce.Ke(), d = !0; d;) for (var d = !1, e = 0; e < c.length - 1; e++) { + var f = c[e], h = c[e + 1]; + f.portFromColOffset > h.portFromColOffset && (d = !0, c[e] = h, c[e + 1] = f) + } + for (e = 0; e < c.length; e++) d = c[e], d.valid && (d = d.toVertex, -1 === d.index && vq(a, d)) + } + + function xq(a, b) { + var c = b.layer; + b.index = a.Ld[c]; + a.Ld[c]++; + for (var c = b.Ie.Ke(), d = !0, e = 0; d;) for (d = !1, e = 0; e < c.length - 1; e++) { + var f = c[e], h = c[e + 1]; + f.portToColOffset > h.portToColOffset && (d = !0, c[e] = h, c[e + 1] = f) + } + for (e = 0; e < c.length; e++) d = c[e], d.valid && (d = d.fromVertex, -1 === d.index && xq(a, d)) + } + + Yl.prototype.reduceCrossings = function () { + for (var a = this.countCrossings(), b = gq(this), c = 0, d = 0, e = 0, c = 0; c < this.Nl; c++) { + for (d = 0; d <= this.jb; d++) yq(this, d, 1), zq(this, d, 1); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)); + for (d = this.jb; 0 <= d; d--) yq(this, d, -1), zq(this, d, -1); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)) + } + hq(this, b); + for (c = 0; c < this.Nl; c++) { + for (d = 0; d <= this.jb; d++) yq(this, d, 0), zq(this, d, 0); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)); + for (d = this.jb; 0 <= d; d--) yq(this, d, 0), zq(this, d, 0); + e = this.countCrossings(); + e < a && (a = e, b = gq(this)) + } + hq(this, b); + var f = !1, h = c = 0, k = 0, d = 0; + switch (this.Wm) { + case Aq: + break; + case Bq: + for (k = a + 1; (d = this.countCrossings()) < k;) for (k = d, c = this.jb; 0 <= c; c--) for (h = 0; h <= c; h++) { + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, -1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, + d = h; d <= c; d++) f = zq(this, d, -1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)) + } + break; + default: + case Up: + for (c = this.jb, h = 0, k = a + 1; (d = this.countCrossings()) < k;) { + k = d; + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, -1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 1) || f; + e = this.countCrossings(); + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, -1) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = c; d >= h; d--) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)); + for (f = !0; f;) for (f = !1, d = h; d <= c; d++) f = zq(this, d, 0) || f; + e >= a ? hq(this, b) : (a = e, b = gq(this)) + } + } + hq(this, b) + }; + + function yq(a, b, c) { + var d = 0, e = dq(a, b), f = a.Ld[b], h = lq(a, b, c); + c = kq(a, b, c); + for (d = 0; d < f; d++) -1 === c[d] && (c[d] = e[d].column), -1 === h[d] && (h[d] = e[d].column); + for (var k = !0, l; k;) for (k = !1, d = 0; d < f - 1; d++) if (h[d + 1] < h[d] || h[d + 1] === h[d] && c[d + 1] < c[d]) k = !0, l = h[d], h[d] = h[d + 1], h[d + 1] = l, l = c[d], c[d] = c[d + 1], c[d + 1] = l, l = e[d], e[d] = e[d + 1], e[d + 1] = l; + for (d = h = 0; d < f; d++) l = e[d], l.index = d, h += a.nodeMinColumnSpace(l, !0), l.column = h, h += 1, h += a.nodeMinColumnSpace(l, !1); + eq(a, b, e) + } + + function zq(a, b, c) { + var d = dq(a, b), e = a.Ld[b]; + c = iq(a, b, c); + var f = 0, h; + h = []; + for (f = 0; f < e; f++) h[f] = -1; + var k; + k = []; + for (f = 0; f < e; f++) k[f] = -1; + for (var l = !1, m = !0; m;) for (m = !1, f = 0; f < e - 1; f++) { + var n = c[d[f].index * e + d[f + 1].index], p = c[d[f + 1].index * e + d[f].index], q = 0, r = 0, + s = d[f].column, t = d[f + 1].column, v = a.nodeMinColumnSpace(d[f], !0), + x = a.nodeMinColumnSpace(d[f], !1), B = a.nodeMinColumnSpace(d[f + 1], !0), + y = a.nodeMinColumnSpace(d[f + 1], !1), v = s - v + B, x = t - x + y, B = B = 0, C = d[f].kc.i; + for (C.reset(); C.next();) if (y = C.value, y.valid && y.fromVertex.layer === + b) { + y = y.fromVertex; + for (B = 0; d[B] !== y;) B++; + B < f && (q += 2 * (f - B), r += 2 * (f + 1 - B)); + B === f + 1 && (q += 1); + B > f + 1 && (q += 4 * (B - f), r += 4 * (B - (f + 1))) + } + C = d[f].bc.i; + for (C.reset(); C.next();) if (y = C.value, y.valid && y.toVertex.layer === b) { + y = y.toVertex; + for (B = 0; d[B] !== y;) B++; + B === f + 1 && (r += 1) + } + C = d[f + 1].kc.i; + for (C.reset(); C.next();) if (y = C.value, y.valid && y.fromVertex.layer === b) { + y = y.fromVertex; + for (B = 0; d[B] !== y;) B++; + B < f && (q += 2 * (f + 1 - B), r += 2 * (f - B)); + B === f && (r += 1); + B > f + 1 && (q += 4 * (B - (f + 1)), r += 4 * (B - f)) + } + C = d[f + 1].bc.i; + for (C.reset(); C.next();) if (y = C.value, + y.valid && y.toVertex.layer === b) { + y = y.toVertex; + for (B = 0; d[B] !== y;) B++; + B === f && (q += 1) + } + var B = y = 0, C = h[d[f].index], I = k[d[f].index], H = h[d[f + 1].index], T = k[d[f + 1].index]; + -1 !== C && (y += Math.abs(C - s), B += Math.abs(C - x)); + -1 !== I && (y += Math.abs(I - s), B += Math.abs(I - x)); + -1 !== H && (y += Math.abs(H - t), B += Math.abs(H - v)); + -1 !== T && (y += Math.abs(T - t), B += Math.abs(T - v)); + if (r < q - .5 || r === q && p < n - .5 || r === q && p === n && B < y - .5) m = l = !0, d[f].column = x, d[f + 1].column = v, n = d[f], d[f] = d[f + 1], d[f + 1] = n + } + for (f = 0; f < e; f++) d[f].index = f; + eq(a, b, d); + return l + } + + Yl.prototype.straightenAndPack = function () { + var a = 0, b = !1, c = 0 !== (this.oi & Cq), a = this.oi === Vp; + 1E3 < this.network.edges.count && !a && (c = !1); + if (c) { + b = []; + for (a = a = 0; a <= this.jb; a++) b[a] = 0; + for (var d = 0, e = this.network.vertexes.i; e.next();) { + var f = e.value, a = f.layer, d = f.column, f = this.nodeMinColumnSpace(f, !1); + b[a] = Math.max(b[a], d + f) + } + for (e.reset(); e.next();) f = e.value, a = f.layer, d = f.column, f.column = (8 * (this.Hb - b[a]) >> 1) + 8 * d; + this.Hb *= 8 + } + if (0 !== (this.oi & Dq)) for (b = !0; b;) { + b = !1; + for (a = this.Cf + 1; a <= this.jb; a++) b = Eq(this, a, 1) || b; + for (a = this.Cf - 1; 0 <= a; a--) b = Eq(this, a, -1) || b; + b = Eq(this, this.Cf, 0) || b + } + if (0 !== (this.oi & Fq)) { + for (a = this.Cf + 1; a <= this.jb; a++) Gq(this, a, 1); + for (a = this.Cf - 1; 0 <= a; a--) Gq(this, a, -1); + Gq(this, this.Cf, 0) + } + c && (Hq(this, -1), Hq(this, 1)); + if (0 !== (this.oi & Dq)) for (b = !0; b;) { + b = !1; + b = Eq(this, this.Cf, 0) || b; + for (a = this.Cf + 1; a <= this.jb; a++) b = Eq(this, a, 0) || b; + for (a = this.Cf - 1; 0 <= a; a--) b = Eq(this, a, 0) || b + } + }; + + function Eq(a, b, c) { + for (var d = !1; Iq(a, b, c);) d = !0; + return d + } + + function Iq(a, b, c) { + var d = 0, e = dq(a, b), f = a.Ld[b], h = kq(a, b, -1); + if (0 < c) for (d = 0; d < f; d++) h[d] = -1; + var k = kq(a, b, 1); + if (0 > c) for (d = 0; d < f; d++) k[d] = -1; + for (var l = !1, m = !0; m;) for (m = !1, d = 0; d < f; d++) { + var n = e[d].column, p = a.nodeMinColumnSpace(e[d], !0), q = a.nodeMinColumnSpace(e[d], !1), r = 0, + r = 0 > d - 1 || n - e[d - 1].column - 1 > p + a.nodeMinColumnSpace(e[d - 1], !1) ? n - 1 : n, p = 0, + p = d + 1 >= f || e[d + 1].column - n - 1 > q + a.nodeMinColumnSpace(e[d + 1], !0) ? n + 1 : n, + s = q = 0, t = 0, v = 0, x = 0, B = 0; + if (0 >= c) for (var y = e[d].kc.i; y.next();) { + var C = y.value; + C.valid && C.fromVertex.layer !== + b && (v = fq(C), x = C.portFromColOffset, B = C.portToColOffset, C = C.fromVertex.column, q += (Math.abs(n + B - (C + x)) + 1) * v, s += (Math.abs(r + B - (C + x)) + 1) * v, t += (Math.abs(p + B - (C + x)) + 1) * v) + } + if (0 <= c) for (y = e[d].bc.i; y.next();) C = y.value, C.valid && C.toVertex.layer !== b && (v = fq(C), x = C.portFromColOffset, B = C.portToColOffset, C = C.toVertex.column, q += (Math.abs(n + x - (C + B)) + 1) * v, s += (Math.abs(r + x - (C + B)) + 1) * v, t += (Math.abs(p + x - (C + B)) + 1) * v); + B = x = v = 0; + y = h[e[d].index]; + C = k[e[d].index]; + -1 !== y && (v += Math.abs(y - n), x += Math.abs(y - r), B += Math.abs(y - p)); + -1 !== + C && (v += Math.abs(C - n), x += Math.abs(C - r), B += Math.abs(C - p)); + if (s < q || s === q && x < v) m = l = !0, e[d].column = r; + if (t < q || t === q && B < v) m = l = !0, e[d].column = p + } + eq(a, b, e); + a.normalize(); + return l + } + + function Gq(a, b, c) { + var d = 0, e = dq(a, b), f = a.Ld[b], h = lq(a, b, c); + c = []; + for (d = 0; d < f; d++) c[d] = h[d]; + for (h = !0; h;) for (h = !1, d = 0; d < f; d++) { + var k = e[d].column, l = a.nodeMinColumnSpace(e[d], !0), m = a.nodeMinColumnSpace(e[d], !1), n = 0, p = 0, + q = 0, q = p = 0; + -1 === c[d] ? 0 === d && d === f - 1 ? n = k : 0 === d ? (p = e[d + 1].column, n = p - k === m + a.nodeMinColumnSpace(e[d + 1], !0) ? k - 1 : k) : d === f - 1 ? (q = e[d - 1].column, n = k - q === l + a.nodeMinColumnSpace(e[d - 1], !1) ? k + 1 : k) : (q = e[d - 1].column, q = q + a.nodeMinColumnSpace(e[d - 1], !1) + l + 1, p = e[d + 1].column, p = p - a.nodeMinColumnSpace(e[d + + 1], !0) - m - 1, n = (q + p) / 2 | 0) : 0 === d && d === f - 1 ? n = c[d] : 0 === d ? (p = e[d + 1].column, p = p - a.nodeMinColumnSpace(e[d + 1], !0) - m - 1, n = Math.min(c[d], p)) : d === f - 1 ? (q = e[d - 1].column, q = q + a.nodeMinColumnSpace(e[d - 1], !1) + l + 1, n = Math.max(c[d], q)) : (q = e[d - 1].column, q = q + a.nodeMinColumnSpace(e[d - 1], !1) + l + 1, p = e[d + 1].column, p = p - a.nodeMinColumnSpace(e[d + 1], !0) - m - 1, q < c[d] && c[d] < p ? n = c[d] : q >= c[d] ? n = q : p <= c[d] && (n = p)); + n !== k && (h = !0, e[d].column = n) + } + eq(a, b, e); + a.normalize() + } + + function Jq(a, b) { + for (var c = !0, d = a.network.vertexes.i; d.next();) { + var e = d.value, f = a.nodeMinColumnSpace(e, !0), h = a.nodeMinColumnSpace(e, !1); + if (e.column - f <= b && e.column + h >= b) { + c = !1; + break + } + } + e = !1; + if (c) for (d.reset(); d.next();) c = d.value, c.column > b && (c.column -= 1, e = !0); + return e + } + + function Kq(a, b) { + for (var c = b, c = b + 1, d = 0, e = [], f = [], d = 0; d <= a.jb; d++) e[d] = !1, f[d] = !1; + for (var h = a.network.vertexes.i; h.next();) { + var d = h.value, k = d.column - a.nodeMinColumnSpace(d, !0), l = d.column + a.nodeMinColumnSpace(d, !1); + k <= b && l >= b && (e[d.layer] = !0); + k <= c && l >= c && (f[d.layer] = !0) + } + k = !0; + c = !1; + for (d = 0; d <= a.jb; d++) k = k && !(e[d] && f[d]); + if (k) for (h.reset(); h.next();) e = h.value, e.column > b && (e.column -= 1, c = !0); + return c + } + + function Hq(a, b) { + for (var c = 0; c <= a.Hb; c++) for (; Jq(a, c);) ; + a.normalize(); + for (c = 0; c < a.Hb; c++) for (; Kq(a, c);) ; + a.normalize(); + var c = 0, d, e = 0, f = 0, h = 0; + if (0 < b) for (c = 0; c <= a.Hb; c++) for (d = gq(a), e = jq(a), f = e + 1; e < f;) f = e, Lq(a, c, 1), h = jq(a), h > e ? hq(a, d) : h < e && (e = h, d = gq(a)); + if (0 > b) for (c = a.Hb; 0 <= c; c--) for (d = gq(a), e = jq(a), f = e + 1; e < f;) f = e, Lq(a, c, -1), h = jq(a), h > e ? hq(a, d) : h < e && (e = h, d = gq(a)); + a.normalize() + } + + function Lq(a, b, c) { + a.cg = 0; + for (var d = a.network.vertexes.i; d.next();) d.value.component = -1; + if (0 < c) for (d.reset(); d.next();) { + var e = d.value; + e.column - a.nodeMinColumnSpace(e, !0) <= b && (e.component = a.cg) + } + if (0 > c) for (d.reset(); d.next();) e = d.value, e.column + a.nodeMinColumnSpace(e, !1) >= b && (e.component = a.cg); + a.cg++; + for (d.reset(); d.next();) b = d.value, -1 === b.component && (nq(a, b, a.cg, -1, !0, !0), a.cg++); + var f = 0; + b = []; + for (f = 0; f < a.cg * a.cg; f++) b[f] = !1; + e = []; + for (f = 0; f < (a.jb + 1) * (a.Hb + 1); f++) e[f] = -1; + for (d.reset(); d.next();) for (var f = + d.value, h = f.layer, k = Math.max(0, f.column - a.nodeMinColumnSpace(f, !0)), l = Math.min(a.Hb, f.column + a.nodeMinColumnSpace(f, !1)); k <= l; k++) e[h * (a.Hb + 1) + k] = f.component; + for (f = 0; f <= a.jb; f++) { + if (0 < c) for (k = 0; k < a.Hb; k++) -1 !== e[f * (a.Hb + 1) + k] && -1 !== e[f * (a.Hb + 1) + k + 1] && e[f * (a.Hb + 1) + k] !== e[f * (a.Hb + 1) + k + 1] && (b[e[f * (a.Hb + 1) + k] * a.cg + e[f * (a.Hb + 1) + k + 1]] = !0); + if (0 > c) for (k = a.Hb; 0 < k; k--) -1 !== e[f * (a.Hb + 1) + k] && -1 !== e[f * (a.Hb + 1) + k - 1] && e[f * (a.Hb + 1) + k] !== e[f * (a.Hb + 1) + k - 1] && (b[e[f * (a.Hb + 1) + k] * a.cg + e[f * (a.Hb + 1) + k - 1]] = !0) + } + e = []; + for (f = + 0; f < a.cg; f++) e[f] = !0; + h = new E("number"); + h.add(0); + for (l = 0; 0 !== h.count;) if (l = h.n[h.count - 1], h.hd(h.count - 1), e[l]) for (e[l] = !1, f = 0; f < a.cg; f++) b[l * a.cg + f] && h.Yd(0, f); + if (0 < c) for (d.reset(); d.next();) a = d.value, e[a.component] && (a.column -= 1); + if (0 > c) for (d.reset(); d.next();) c = d.value, e[c.component] && (c.column += 1) + } + + Yl.prototype.commitLayout = function () { + if (this.fp) for (var a = bq(this, !0), b = bq(this, !1), c = this.network.edges.i; c.next();) { + var d = c.value.link; + null !== d && (d.vb = a, d.xb = b) + } + this.commitNodes(); + this.Sy(); + this.Qs && this.commitLinks() + }; + + function bq(a, b) { + return 270 === a.la ? b ? vc : Cc : 90 === a.la ? b ? Cc : vc : 180 === a.la ? b ? wc : xc : b ? xc : wc + } + + Yl.prototype.commitNodes = function () { + this.Lg = []; + this.$f = []; + this.Bf = []; + this.Kb = []; + for (var a = 0; a <= this.jb; a++) this.Lg[a] = 0, this.$f[a] = 0, this.Bf[a] = 0, this.Kb[a] = 0; + for (a = this.network.vertexes.i; a.next();) { + var b = a.value, c = b.layer; + this.Lg[c] = Math.max(this.Lg[c], this.nodeMinLayerSpace(b, !0)); + this.$f[c] = Math.max(this.$f[c], this.nodeMinLayerSpace(b, !1)) + } + for (var b = 0, d = this.Ql, c = 0; c <= this.jb; c++) { + var e = d; + 0 >= this.Lg[c] + this.$f[c] && (e = 0); + 0 < c && (b += e / 2); + 90 === this.la || 0 === this.la ? (b += this.$f[c], this.Bf[c] = b, b += this.Lg[c]) : + (b += this.Lg[c], this.Bf[c] = b, b += this.$f[c]); + c < this.jb && (b += e / 2); + this.Kb[c] = b + } + d = b; + b = this.Ud; + for (c = 0; c <= this.jb; c++) 270 === this.la ? this.Bf[c] = b.y + this.Bf[c] : 90 === this.la ? (this.Bf[c] = b.y + d - this.Bf[c], this.Kb[c] = d - this.Kb[c]) : 180 === this.la ? this.Bf[c] = b.x + this.Bf[c] : (this.Bf[c] = b.x + d - this.Bf[c], this.Kb[c] = d - this.Kb[c]); + for (a.reset(); a.next();) { + var c = a.value, d = c.layer, e = c.column | 0, f = 0, h = 0; + 270 === this.la || 90 === this.la ? (f = b.x + this.sd * e, h = this.Bf[d]) : (f = this.Bf[d], h = b.y + this.sd * e); + c.Ja = f; + c.Ua = h; + c.commit() + } + }; + Yl.prototype.Sy = function () { + for (var a = 0, b = this.Ql, c = 0; c <= this.jb; c++) a += this.Lg[c], a += this.$f[c]; + for (var a = a + this.jb * b, b = [], c = this.sd * this.Hb, d = this.uH; 0 <= d; d--) 270 === this.la ? 0 === d ? b.push(new z(0, 0, c, Math.abs(this.Kb[0]))) : b.push(new z(0, this.Kb[d - 1], c, Math.abs(this.Kb[d - 1] - this.Kb[d]))) : 90 === this.la ? 0 === d ? b.push(new z(0, this.Kb[0], c, Math.abs(this.Kb[0] - a))) : b.push(new z(0, this.Kb[d], c, Math.abs(this.Kb[d - 1] - this.Kb[d]))) : 180 === this.la ? 0 === d ? b.push(new z(0, 0, Math.abs(this.Kb[0]), c)) : b.push(new z(this.Kb[d - + 1], 0, Math.abs(this.Kb[d - 1] - this.Kb[d]), c)) : 0 === d ? b.push(new z(this.Kb[0], 0, Math.abs(this.Kb[0] - a), c)) : b.push(new z(this.Kb[d], 0, Math.abs(this.Kb[d - 1] - this.Kb[d]), c)); + this.commitLayers(b, K.Wj) + }; + Yl.prototype.commitLayers = function () { + }; + Yl.prototype.commitLinks = function () { + for (var a = this.network.edges.i, b; a.next();) b = a.value.link, null !== b && (b.rl(), b.so(), b.Bi()); + for (a.reset(); a.next();) b = a.value.link, null !== b && b.updateRoute(); + for (a.reset(); a.next();) { + var c = a.value; + b = c.link; + if (null !== b) { + b.rl(); + var d = b, e = d.W, f = d.ca, h = d.od, k = d.fe; + if (c.valid) { + if (b.Ve === kh && 4 === b.ka) { + if (c.rev) var l = e, e = f, f = l, m = h, h = k, k = m; + if (c.fromVertex.column === c.toVertex.column) { + var n = b.getLinkPoint(e, h, b.computeSpot(!0), !0, !1, f, k), + p = b.getLinkPoint(f, k, b.computeSpot(!1), + !1, !1, e, h); + n.J() || n.set(e.ba.Ok); + p.J() || p.set(f.ba.Ok); + b.so(); + b.Lk(n.x, n.y); + b.Lk((2 * n.x + p.x) / 3, (2 * n.y + p.y) / 3); + b.Lk((n.x + 2 * p.x) / 3, (n.y + 2 * p.y) / 3); + b.Lk(p.x, p.y) + } else { + var q = !1, r = !1; + null !== h && b.computeSpot(!0) === vb && (q = !0); + null !== k && b.computeSpot(!1) === vb && (r = !0); + if (q || r) { + var s = b.l(0).x, t = b.l(0).y, v = b.l(1).x, x = b.l(1).y, B = b.l(2).x, y = b.l(2).y, + C = b.l(3).x, I = b.l(3).y; + if (q) { + 90 === this.la || 270 === this.la ? (v = s, x = (t + I) / 2) : (v = (s + C) / 2, x = t); + b.V(1, v, x); + var H = b.getLinkPoint(e, h, b.computeSpot(!0), !0, !1, f, k); + H.J() || H.set(e.ba.Ok); + b.V(0, H.x, H.y) + } + r && (90 === this.la || 270 === this.la ? (B = C, y = (t + I) / 2) : (B = (s + C) / 2, y = I), b.V(2, B, y), H = b.getLinkPoint(f, k, b.computeSpot(!1), !1, !1, e, h), H.J() || H.set(f.ba.Ok), b.V(3, H.x, H.y)) + } + } + } + b.Bi() + } else if (c.fromVertex.layer === c.toVertex.layer) b.Bi(); else { + var T = !1, aa = !1, R = 0, N = b.Bs + 1; + if (b.dc) aa = !0, R = b.ka, 4 < R && b.points.removeRange(2, R - 3); else if (b.Ve === kh) T = !0, R = b.ka, 4 < R && b.points.removeRange(2, R - 3), N = 2; else { + var R = b.ka, Z = b.computeSpot(!0) === vb, Ea = b.computeSpot(!1) === vb; + 2 < R && Z && Ea ? b.points.removeRange(1, R - 2) : 3 < + R && Z && !Ea ? b.points.removeRange(1, R - 3) : 3 < R && !Z && Ea ? b.points.removeRange(2, R - 2) : 4 < R && !Z && !Ea && b.points.removeRange(2, R - 3) + } + var ua = c.fromVertex, Oa = c.toVertex, na, Ca; + if (c.rev) { + for (var ra = 0; null !== Oa && ua !== Oa;) { + Ca = na = null; + for (var dc = Oa.kc.i; dc.next();) { + var ed = dc.value; + if (ed.link === c.link && (na = ed.fromVertex, Ca = ed.toVertex, null === na.kd)) break + } + na !== ua && (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = na.Ja, za = na.Ua, aa ? 180 === this.la || 0 === this.la ? 2 === N ? (b.w(N++, Ta, db), b.w(N++, Ta, za)) : (jc = null !== Ca ? Ca.Ua : db, jc !== za && (lb = this.Kb[na.layer - + 1], b.w(N++, lb, db), b.w(N++, lb, za))) : 2 === N ? (b.w(N++, Ta, db), b.w(N++, wa, db)) : (ge = null !== Ca ? Ca.Ja : Ta, ge !== wa && (lb = this.Kb[na.layer - 1], b.w(N++, Ta, lb), b.w(N++, wa, lb))) : 2 === N ? T ? (Eb = Math.max(10, this.Lg[Oa.layer]), $a = Math.max(10, this.$f[Oa.layer]), 180 === this.la ? (ra = Oa.aa.x, b.w(N++, ra - Eb, za), b.w(N++, ra, za), b.w(N++, ra + $a, za)) : 90 === this.la ? (ra = Oa.aa.y + Oa.aa.height, b.w(N++, wa, ra + $a), b.w(N++, wa, ra), b.w(N++, wa, ra - Eb)) : 270 === this.la ? (ra = Oa.aa.y, b.w(N++, wa, ra - Eb), b.w(N++, wa, ra), b.w(N++, wa, ra + $a)) : (ra = Oa.aa.x + Oa.aa.width, + b.w(N++, ra + $a, za), b.w(N++, ra, za), b.w(N++, ra - Eb, za))) : (b.w(N++, Ta, db), 180 === this.la || 0 === this.la ? b.w(N++, Ta, za) : b.w(N++, wa, db), b.w(N++, wa, za)) : (Eb = Math.max(10, this.Lg[na.layer]), $a = Math.max(10, this.$f[na.layer]), 180 === this.la ? (T && b.w(N++, wa - Eb, za), b.w(N++, wa, za), T && b.w(N++, wa + $a, za)) : 90 === this.la ? (T && b.w(N++, wa, za + $a), b.w(N++, wa, za), T && b.w(N++, wa, za - Eb)) : 270 === this.la ? (T && b.w(N++, wa, za - Eb), b.w(N++, wa, za), T && b.w(N++, wa, za + $a)) : (T && b.w(N++, wa + $a, za), b.w(N++, wa, za), T && b.w(N++, wa - Eb, za)))); + Oa = na + } + if (null === + k || b.computeSpot(!1) !== vb) if (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = b.l(N).x, za = b.l(N).y, aa) { + var Lf = this.$f[ua.layer], ec = 0; + 180 === this.la || 0 === this.la ? (ec = db, ec >= ua.aa.y && ec <= ua.aa.bottom && (ra = ua.Ja + Lf, ec = ec < ua.aa.y + ua.aa.height / 2 ? ua.aa.y - this.sd / 2 : ua.aa.bottom + this.sd / 2, b.w(N++, ra, db), b.w(N++, ra, ec)), b.w(N++, wa, ec)) : (ec = Ta, ec >= ua.aa.x && ec <= ua.aa.right && (ra = ua.Ua + Lf, ec = ec < ua.aa.x + ua.aa.width / 2 ? ua.aa.x - this.sd / 2 : ua.aa.right + this.sd / 2, b.w(N++, Ta, ra), b.w(N++, ec, ra)), b.w(N++, ec, za)); + b.w(N++, wa, za) + } else T ? (Eb = + Math.max(10, this.Lg[ua.layer]), $a = Math.max(10, this.$f[ua.layer]), 180 === this.la ? (ra = ua.aa.x + ua.aa.width, b.V(N - 2, ra, db), b.V(N - 1, ra + $a, db)) : 90 === this.la ? (ra = ua.aa.y, b.V(N - 2, Ta, ra), b.V(N - 1, Ta, ra - Eb)) : 270 === this.la ? (ra = ua.aa.y + ua.aa.height, b.V(N - 2, Ta, ra), b.V(N - 1, Ta, ra + $a)) : (ra = ua.aa.x, b.V(N - 2, ra, db), b.V(N - 1, ra - Eb, db))) : (180 === this.la || 0 === this.la ? b.w(N++, wa, db) : b.w(N++, Ta, za), b.w(N++, wa, za)) + } else { + for (; null !== ua && ua !== Oa;) { + Ca = na = null; + for (var Ve = ua.bc.i; Ve.next();) { + var Mf = Ve.value; + if (Mf.link === c.link && (na = + Mf.toVertex, Ca = Mf.fromVertex, null !== Ca.kd && (Ca = null), null === na.kd)) break + } + var Ta = 0, db = 0, wa = 0, za = 0, lb = 0, Eb = 0, $a = 0; + if (na !== Oa) if (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = na.Ja, za = na.Ua, aa) if (180 === this.la || 0 === this.la) { + var jc = null !== Ca ? Ca.Ua : db; + jc !== za && (lb = this.Kb[na.layer], 2 === N && (lb = 0 === this.la ? Math.max(lb, Ta) : Math.min(lb, Ta)), b.w(N++, lb, db), b.w(N++, lb, za)) + } else { + var ge = null !== Ca ? Ca.Ja : Ta; + ge !== wa && (lb = this.Kb[na.layer], 2 === N && (lb = 90 === this.la ? Math.max(lb, db) : Math.min(lb, db)), b.w(N++, Ta, lb), b.w(N++, wa, lb)) + } else Eb = + Math.max(10, this.Lg[na.layer]), $a = Math.max(10, this.$f[na.layer]), 180 === this.la ? (b.w(N++, wa + $a, za), T && b.w(N++, wa, za), b.w(N++, wa - Eb, za)) : 90 === this.la ? (b.w(N++, wa, za - Eb), T && b.w(N++, wa, za), b.w(N++, wa, za + $a)) : 270 === this.la ? (b.w(N++, wa, za + $a), T && b.w(N++, wa, za), b.w(N++, wa, za - Eb)) : (b.w(N++, wa - Eb, za), T && b.w(N++, wa, za), b.w(N++, wa + $a, za)); + ua = na + } + aa && (Ta = b.l(N - 1).x, db = b.l(N - 1).y, wa = b.l(N).x, za = b.l(N).y, 180 === this.la || 0 === this.la ? db !== za && (lb = 0 === this.la ? Math.min(Math.max((wa + Ta) / 2, this.Kb[Oa.layer]), wa) : Math.max(Math.min((wa + + Ta) / 2, this.Kb[Oa.layer]), wa), b.w(N++, lb, db), b.w(N++, lb, za)) : Ta !== wa && (lb = 90 === this.la ? Math.min(Math.max((za + db) / 2, this.Kb[Oa.layer]), za) : Math.max(Math.min((za + db) / 2, this.Kb[Oa.layer]), za), b.w(N++, Ta, lb), b.w(N++, wa, lb))) + } + if (null !== d && T) { + if (null !== h) { + if (b.computeSpot(!0) === vb) { + var nc = b.l(0), Od = b.l(2); + nc.L(Od) || b.V(1, (nc.x + Od.x) / 2, (nc.y + Od.y) / 2) + } + H = b.getLinkPoint(e, h, vb, !0, !1, f, k); + H.J() || H.set(e.ba.Ok); + b.V(0, H.x, H.y) + } + null !== k && (b.computeSpot(!1) === vb && (nc = b.l(b.ka - 1), Od = b.l(b.ka - 3), nc.L(Od) || b.V(b.ka - + 2, (nc.x + Od.x) / 2, (nc.y + Od.y) / 2)), H = b.getLinkPoint(f, k, vb, !1, !1, e, h), H.J() || H.set(f.ba.Ok), b.V(b.ka - 1, H.x, H.y)) + } + b.Bi(); + c.commit() + } + } + } + for (var he = new E(W), We = this.network.edges.i; We.next();) { + var pf = We.value.link; + null !== pf && pf.dc && !he.contains(pf) && he.add(pf) + } + if (0 < he.count) if (90 === this.la || 270 === this.la) { + for (var Pd = 0, Fb = new E(Mq), Lb, Ec, Mg = he.i; Mg.next();) { + var Mb = Mg.value; + if (null !== Mb && Mb.dc) for (var yb = 2; yb < Mb.ka - 3; yb++) if (Lb = Mb.l(yb), Ec = Mb.l(yb + 1), this.D(Lb.y, Ec.y) && !this.D(Lb.x, Ec.x)) { + var fc = new Mq; + fc.layer = + Math.floor(Lb.y / 2); + var mb = Mb.l(0), ye = Mb.l(Mb.ka - 1); + fc.first = mb.x * mb.x + mb.y; + fc.Gd = ye.x * ye.x + ye.y; + fc.Be = Math.min(Lb.x, Ec.x); + fc.Vd = Math.max(Lb.x, Ec.x); + fc.index = yb; + fc.link = Mb; + if (yb + 2 < Mb.ka) { + var Qd = Mb.l(yb - 1), og = Mb.l(yb + 2), Nf = 0; + Qd.y < Lb.y ? Nf = og.y < Lb.y ? 3 : Lb.x < Ec.x ? 2 : 1 : Qd.y > Lb.y && (Nf = og.y > Lb.y ? 0 : Ec.x < Lb.x ? 2 : 1); + fc.Rh = Nf + } + Fb.add(fc) + } + } + if (1 < Fb.count) { + Fb.sort(this.AE); + for (var zb = 0; zb < Fb.count;) { + for (var fd = Fb.n[zb].layer, oc = zb + 1; oc < Fb.count && Fb.n[oc].layer === fd;) oc++; + if (1 < oc - zb) for (var wb = zb; wb < oc;) { + for (var Fc = + Fb.n[wb].Vd, Nb = zb + 1; Nb < oc && Fb.n[Nb].Be < Fc;) Fc = Math.max(Fc, Fb.n[Nb].Vd), Nb++; + var Na = Nb - wb; + if (1 < Na) { + Fb.hp(this.Aw, wb, wb + Na); + for (var eb = 1, Ab = Fb.n[wb].Gd, yb = wb; yb < Nb; yb++) { + var gc = Fb.n[yb]; + gc.Gd !== Ab && (eb++, Ab = gc.Gd) + } + Fb.hp(this.zE, wb, wb + Na); + for (var Rd = 1, Ab = Fb.n[wb].first, yb = wb; yb < Nb; yb++) gc = Fb.n[yb], gc.first !== Ab && (Rd++, Ab = gc.first); + var Sd = !0, qf = Rd; + eb < Rd ? (Sd = !1, qf = eb, Ab = Fb.n[wb].Gd, Fb.hp(this.Aw, wb, wb + Na)) : Ab = Fb.n[wb].first; + for (var ze = 0, yb = wb; yb < Nb; yb++) { + gc = Fb.n[yb]; + (Sd ? gc.first : gc.Gd) !== Ab && (ze++, Ab = + Sd ? gc.first : gc.Gd); + Mb = gc.link; + Lb = Mb.l(gc.index); + Ec = Mb.l(gc.index + 1); + var rf = this.ow * (ze - (qf - 1) / 2); + Pd++; + Mb.rl(); + Mb.V(gc.index, Lb.x, Lb.y + rf); + Mb.V(gc.index + 1, Ec.x, Ec.y + rf); + Mb.Bi() + } + } + wb = Nb + } + zb = oc + } + } + } else { + for (var Rb = 0, cb = new E(Mq), pc, Pc, gd = he.i; gd.next();) { + var ab = gd.value; + if (null !== ab && ab.dc) for (var ub = 2; ub < ab.ka - 3; ub++) if (pc = ab.l(ub), Pc = ab.l(ub + 1), this.D(pc.x, Pc.x) && !this.D(pc.y, Pc.y)) { + var kc = new Mq; + kc.layer = Math.floor(pc.x / 2); + var hd = ab.l(0), Ng = ab.l(ab.ka - 1); + kc.first = hd.x + hd.y * hd.y; + kc.Gd = Ng.x + Ng.y * Ng.y; + kc.Be = + Math.min(pc.y, Pc.y); + kc.Vd = Math.max(pc.y, Pc.y); + kc.index = ub; + kc.link = ab; + if (ub + 2 < ab.ka) { + var Og = ab.l(ub - 1), Pg = ab.l(ub + 2), Of = 0; + Og.x < pc.x ? Of = Pg.x < pc.x ? 3 : pc.y < Pc.y ? 2 : 1 : Og.x > pc.x && (Of = Pg.x > pc.x ? 0 : Pc.y < pc.y ? 2 : 1); + kc.Rh = Of + } + cb.add(kc) + } + } + if (1 < cb.count) { + cb.sort(this.AE); + for (var Gc = 0; Gc < cb.count;) { + for (var Qc = cb.n[Gc].layer, Hc = Gc + 1; Hc < cb.count && cb.n[Hc].layer === Qc;) Hc++; + if (1 < Hc - Gc) for (var nb = Gc; nb < Hc;) { + for (var ie = cb.n[nb].Vd, ob = Gc + 1; ob < Hc && cb.n[ob].Be < ie;) ie = Math.max(ie, cb.n[ob].Vd), ob++; + var yc = ob - nb; + if (1 < yc) { + cb.hp(this.Aw, + nb, nb + yc); + for (var Ae = 1, Bb = cb.n[nb].Gd, ub = nb; ub < ob; ub++) { + var Cb = cb.n[ub]; + Cb.Gd !== Bb && (Ae++, Bb = Cb.Gd) + } + cb.hp(this.zE, nb, nb + yc); + for (var id = 1, Bb = cb.n[nb].first, ub = nb; ub < ob; ub++) Cb = cb.n[ub], Cb.first !== Bb && (id++, Bb = Cb.first); + var Rc = !0, Td = id; + Ae < id ? (Rc = !1, Td = Ae, Bb = cb.n[nb].Gd, cb.hp(this.Aw, nb, nb + yc)) : Bb = cb.n[nb].first; + for (var Ud = 0, ub = nb; ub < ob; ub++) { + Cb = cb.n[ub]; + (Rc ? Cb.first : Cb.Gd) !== Bb && (Ud++, Bb = Rc ? Cb.first : Cb.Gd); + ab = Cb.link; + pc = ab.l(Cb.index); + Pc = ab.l(Cb.index + 1); + var Xe = this.ow * (Ud - (Td - 1) / 2); + Rb++; + ab.rl(); + ab.V(Cb.index, + pc.x + Xe, pc.y); + ab.V(Cb.index + 1, Pc.x + Xe, Pc.y); + ab.Bi() + } + } + nb = ob + } + Gc = Hc + } + } + } + }; + Yl.prototype.AE = function (a, b) { + return a instanceof Mq && b instanceof Mq && a !== b ? a.layer < b.layer ? -1 : a.layer > b.layer ? 1 : a.Be < b.Be ? -1 : a.Be > b.Be ? 1 : a.Vd < b.Vd ? -1 : a.Vd > b.Vd ? 1 : 0 : 0 + }; + Yl.prototype.zE = function (a, b) { + return a instanceof Mq && b instanceof Mq && a !== b ? a.first < b.first ? -1 : a.first > b.first || a.Rh < b.Rh ? 1 : a.Rh > b.Rh || a.Be < b.Be ? -1 : a.Be > b.Be ? 1 : a.Vd < b.Vd ? -1 : a.Vd > b.Vd ? 1 : 0 : 0 + }; + Yl.prototype.Aw = function (a, b) { + return a instanceof Mq && b instanceof Mq && a !== b ? a.Gd < b.Gd ? -1 : a.Gd > b.Gd || a.Rh < b.Rh ? 1 : a.Rh > b.Rh || a.Be < b.Be ? -1 : a.Be > b.Be ? 1 : a.Vd < b.Vd ? -1 : a.Vd > b.Vd ? 1 : 0 : 0 + }; + Yl.prototype.D = function (a, b) { + var c = a - b; + return -1 < c && 1 > c + }; + + function dq(a, b) { + var c, d = a.Ld[b]; + if (d >= a.Ng.length) { + c = []; + for (var e = 0; e < a.Ng.length; e++) c[e] = a.Ng[e]; + a.Ng = c + } + void 0 === a.Ng[d] || null === a.Ng[d] ? c = [] : (c = a.Ng[d], a.Ng[d] = null); + d = a.Vq[b]; + for (e = 0; e < d.length; e++) { + var f = d[e]; + c[f.index] = f + } + return c + } + + function eq(a, b, c) { + a.Ng[a.Ld[b]] = c + } + + u.defineProperty(Yl, {layerSpacing: "layerSpacing"}, function () { + return this.Ql + }, function (a) { + this.Ql !== a && (u.j(a, "number", Yl, "layerSpacing"), 0 <= a && (this.Ql = a, this.H())) + }); + u.defineProperty(Yl, {dJ: "columnSpacing"}, function () { + return this.sd + }, function (a) { + this.sd !== a && (u.j(a, "number", Yl, "columnSpacing"), 0 <= a && (this.sd = a, this.H())) + }); + u.defineProperty(Yl, {direction: "direction"}, function () { + return this.la + }, function (a) { + this.la !== a && (u.j(a, "number", Yl, "direction"), this.la = a, this.H()) + }); + u.defineProperty(Yl, {kG: "cycleRemoveOption"}, function () { + return this.gn + }, function (a) { + this.gn !== a && (u.rb(a, Yl, Yl, "cycleRemoveOption"), a === Xp || a === Op) && (this.gn = a, this.H()) + }); + u.defineProperty(Yl, {mH: "layeringOption"}, function () { + return this.Mn + }, function (a) { + this.Mn !== a && (u.rb(a, Yl, Yl, "layeringOption"), a === Sp || a === oq || a === qq) && (this.Mn = a, this.H()) + }); + u.defineProperty(Yl, {WG: "initializeOption"}, function () { + return this.Bn + }, function (a) { + this.Bn !== a && (u.rb(a, Yl, Yl, "initializeOption"), a === Tp || a === wq || a === uq) && (this.Bn = a, this.H()) + }); + u.defineProperty(Yl, {MJ: "iterations"}, function () { + return this.Nl + }, function (a) { + this.Nl !== a && (u.ze(a, Wp, "iterations"), 0 <= a && (this.Nl = a, this.H())) + }); + u.defineProperty(Yl, {NF: "aggressiveOption"}, function () { + return this.Wm + }, function (a) { + this.Wm !== a && (u.rb(a, Yl, Yl, "aggressiveOption"), a === Aq || a === Up || a === Bq) && (this.Wm = a, this.H()) + }); + u.defineProperty(Yl, {kK: "packOption"}, function () { + return this.oi + }, function (a) { + this.oi !== a && (u.j(a, "number", Yl, "packOption"), 0 <= a && 8 > a && (this.oi = a, this.H())) + }); + u.defineProperty(Yl, {fp: "setsPortSpots"}, function () { + return this.Eh + }, function (a) { + this.Eh !== a && (u.j(a, "boolean", Yl, "setsPortSpots"), this.Eh = a, this.H()) + }); + u.defineProperty(Yl, {ow: "linkSpacing"}, function () { + return this.gj + }, function (a) { + this.gj !== a && (u.j(a, "number", Yl, "linkSpacing"), 0 <= a && (this.gj = a, this.H())) + }); + u.u(Yl, {uH: "maxLayer"}, function () { + return this.jb + }); + u.u(Yl, {TJ: "maxIndex"}, function () { + return this.Fu + }); + u.u(Yl, {SJ: "maxColumn"}, function () { + return this.Hb + }); + u.u(Yl, {ZJ: "minIndexLayer"}, function () { + return this.Nq + }); + u.u(Yl, {UJ: "maxIndexLayer"}, function () { + return this.Cf + }); + var Op; + Yl.CycleDepthFirst = Op = u.s(Yl, "CycleDepthFirst", 0); + var Xp; + Yl.CycleGreedy = Xp = u.s(Yl, "CycleGreedy", 1); + var Sp; + Yl.LayerOptimalLinkLength = Sp = u.s(Yl, "LayerOptimalLinkLength", 0); + var oq; + Yl.LayerLongestPathSink = oq = u.s(Yl, "LayerLongestPathSink", 1); + var qq; + Yl.LayerLongestPathSource = qq = u.s(Yl, "LayerLongestPathSource", 2); + var Tp; + Yl.InitDepthFirstOut = Tp = u.s(Yl, "InitDepthFirstOut", 0); + var wq; + Yl.InitDepthFirstIn = wq = u.s(Yl, "InitDepthFirstIn", 1); + var uq; + Yl.InitNaive = uq = u.s(Yl, "InitNaive", 2); + var Aq; + Yl.AggressiveNone = Aq = u.s(Yl, "AggressiveNone", 0); + var Up; + Yl.AggressiveLess = Up = u.s(Yl, "AggressiveLess", 1); + var Bq; + Yl.AggressiveMore = Bq = u.s(Yl, "AggressiveMore", 2); + Yl.PackNone = 0; + var Cq; + Yl.PackExpand = Cq = 1; + var Dq; + Yl.PackStraighten = Dq = 2; + var Fq; + Yl.PackMedian = Fq = 4; + var Vp; + Yl.PackAll = Vp = 7; + + function Mq() { + this.index = this.Vd = this.Be = this.Gd = this.first = this.layer = 0; + this.link = null; + this.Rh = 0 + } + + u.Xd(Mq, {layer: !0, first: !0, Gd: !0, Be: !0, Vd: !0, index: !0, link: !0, Rh: !0}); + + function Wp() { + xa.call(this) + } + + u.Ga(Wp, xa); + u.fa("LayeredDigraphNetwork", Wp); + Wp.prototype.createVertex = function () { + return new Nq + }; + Wp.prototype.createEdge = function () { + return new Oq + }; + + function Nq() { + ya.call(this); + this.index = this.column = this.layer = -1; + this.component = NaN; + this.near = null; + this.valid = !1; + this.finish = this.wo = NaN; + this.om = 0; + this.Hz = this.Iz = null + } + + u.Ga(Nq, ya); + u.fa("LayeredDigraphVertex", Nq); + + function Oq() { + Aa.call(this); + this.forest = this.rev = this.valid = !1; + this.portToPos = this.portFromPos = NaN; + this.portToColOffset = this.portFromColOffset = 0 + } + + u.Ga(Oq, Aa); + u.fa("LayeredDigraphEdge", Oq); + + function Y() { + 0 < arguments.length && u.Wc(Y); + Je.call(this); + this.nd = new F(Object); + this.fr = Pq; + this.Af = Qq; + this.Wr = Rq; + this.Cu = Sq; + this.BA = null; + this.oh = !0; + this.Yc = Tq; + this.Uf = (new ia(10, 10)).freeze(); + this.qa = new Uq; + this.pa = new Uq; + this.By = [] + } + + u.Ga(Y, Je); + u.fa("TreeLayout", Y); + Y.prototype.cloneProtected = function (a) { + Je.prototype.cloneProtected.call(this, a); + a.fr = this.fr; + a.Wr = this.Wr; + a.Cu = this.Cu; + a.oh = this.oh; + a.Yc = this.Yc; + a.Uf.assign(this.Uf); + a.qa.copyInheritedPropertiesFrom(this.qa); + a.pa.copyInheritedPropertiesFrom(this.pa) + }; + Y.prototype.createNetwork = function () { + return new Vq + }; + Y.prototype.makeNetwork = function (a) { + function b(a) { + if (a instanceof U) return !a.tf && "Comment" !== a.Kc; + if (a instanceof W) { + var b = a.W; + if (null === b || b.tf || "Comment" === b.Kc) return !1; + a = a.ca; + return null === a || a.tf || "Comment" === a.Kc ? !1 : !0 + } + return !1 + } + + var c = this.createNetwork(); + c.Qb = this; + a instanceof D ? (c.Gj(a.yg, !0, b), c.Gj(a.links, !0, b)) : a instanceof V ? c.Gj(a.Mc, !1, b) : c.Gj(a.i, !1, b); + return c + }; + Y.prototype.doLayout = function (a) { + null === a && u.k("Layout.doLayout(collection) argument must not be null but a Diagram, a Group, or an Iterable of Parts"); + null === this.network && (this.network = this.makeNetwork(a)); + this.Gf !== Wq && (this.Ud = this.initialOrigin(this.Ud)); + var b = this.g; + null === b && a instanceof D && (b = a); + this.Af = this.path === Pq && null !== b ? b.qd ? Qq : Xq : this.path === Pq ? Qq : this.path; + if (0 < this.network.vertexes.count) { + this.network.Qv(); + for (a = this.network.vertexes.i; a.next();) b = a.value, b.initialized = !1, b.level = + 0, b.parent = null, b.children = []; + if (0 < this.nd.count) { + a = new F(Uq); + for (b = this.nd.i; b.next();) { + var c = b.value; + c instanceof U ? (c = this.network.Am(c), null !== c && a.add(c)) : c instanceof Uq && a.add(c) + } + this.nd = a + } + 0 === this.nd.count && this.findRoots(); + for (a = this.nd.copy().i; a.next();) b = a.value, b.initialized || (b.initialized = !0, Yq(this, b)); + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && Zq(this, b); + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && $q(this, b); + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && + ar(this, b); + this.Ny(); + if (this.wz === br) { + c = []; + for (a = this.network.vertexes.i; a.next();) { + var d = a.value, b = d.parent; + null == b && (b = d); + var b = 0 === b.angle || 180 === b.angle, e = c[d.level]; + void 0 === e && (e = 0); + c[d.level] = Math.max(e, b ? d.width : d.height) + } + for (d = 0; d < c.length; d++) void 0 === c[d] && (c[d] = 0); + this.BA = c; + for (a = this.network.vertexes.i; a.next();) d = a.value, b = d.parent, null === b && (b = d), 0 === b.angle || 180 === b.angle ? (180 === b.angle && (d.Cs += c[d.level] - d.width), d.width = c[d.level]) : (270 === b.angle && (d.Ds += c[d.level] - d.height), d.height = + c[d.level]) + } else if (this.wz === cr) for (a = this.network.vertexes.i; a.next();) { + c = a.value; + b = 0 === c.angle || 180 === c.angle; + e = -1; + for (d = 0; d < c.children.length; d++) var f = c.children[d], e = Math.max(e, b ? f.width : f.height); + if (0 <= e) for (d = 0; d < c.children.length; d++) f = c.children[d], b ? (180 === c.angle && (f.Cs += e - f.width), f.width = e) : (270 === c.angle && (f.Ds += e - f.height), f.height = e) + } + for (a = this.nd.i; a.next();) b = a.value, b instanceof Uq && this.layoutTree(b); + this.arrangeTrees(); + this.updateParts() + } + this.network = null; + this.nd = new F(Object); + this.vf = !0 + }; + Y.prototype.findRoots = function () { + for (var a = this.network.vertexes.i; a.next();) { + var b = a.value; + switch (this.Af) { + case Qq: + 0 === b.kc.count && this.nd.add(b); + break; + case Xq: + 0 === b.bc.count && this.nd.add(b); + break; + default: + u.k("Unhandled path value " + this.Af.toString()) + } + } + if (0 === this.nd.count) { + for (var a = 999999, b = null, c = this.network.vertexes.i; c.next();) { + var d = c.value; + switch (this.Af) { + case Qq: + d.kc.count < a && (a = d.kc.count, b = d); + break; + case Xq: + d.bc.count < a && (a = d.bc.count, b = d); + break; + default: + u.k("Unhandled path value " + this.Af.toString()) + } + } + null !== + b && this.nd.add(b) + } + }; + + function Yq(a, b) { + if (null !== b) { + switch (a.Af) { + case Qq: + if (0 < b.bc.count) { + for (var c = new E(Uq), d = b.rG; d.next();) { + var e = d.value; + dr(a, b, e) && c.add(e) + } + 0 < c.count && (b.children = c.Ke()) + } + break; + case Xq: + if (0 < b.kc.count) { + c = new E(Uq); + for (d = b.nI; d.next();) e = d.value, dr(a, b, e) && c.add(e); + 0 < c.count && (b.children = c.Ke()) + } + break; + default: + u.k("Unhandled path value" + a.Af.toString()) + } + c = b.children; + d = c.length; + for (e = 0; e < d; e++) { + var f = c[e]; + f.initialized = !0; + f.level = b.level + 1; + f.parent = b; + a.nd.remove(f) + } + for (e = 0; e < d; e++) f = c[e], Yq(a, f) + } + } + + function dr(a, b, c) { + if (c.initialized) { + var d; + if (null === b) d = !1; else { + for (d = b.parent; null !== d && d !== c;) d = d.parent; + d = d === c + } + if (d || c.level > b.level) return !1; + a.removeChild(c.parent, c) + } + return !0 + } + + Y.prototype.removeChild = function (a, b) { + if (null !== a && null !== b) { + for (var c = a.children, d = 0, e = 0; e < c.length; e++) c[e] === b && d++; + if (0 < d) { + for (var d = Array(c.length - d), f = 0, e = 0; e < c.length; e++) c[e] !== b && (d[f++] = c[e]); + a.children = d + } + } + }; + + function Zq(a, b) { + if (null !== b) { + a.initializeTreeVertexValues(b); + b.alignment === er && a.sortTreeVertexChildren(b); + for (var c = 0, d = b.qm, e = 0, f = b.children, h = f.length, k = 0; k < h; k++) { + var l = f[k]; + Zq(a, l); + c += l.descendantCount + 1; + d = Math.max(d, l.maxChildrenCount); + e = Math.max(e, l.maxGenerationCount) + } + b.descendantCount = c; + b.maxChildrenCount = d; + b.maxGenerationCount = 0 < d ? e + 1 : 0 + } + } + + function fr(a, b) { + switch (a.Wr) { + default: + case Rq: + return null !== b.parent ? b.parent : a.qa; + case gr: + return null === b.parent ? a.qa : null === b.parent.parent ? a.pa : b.parent; + case hr: + if (null !== b.parent) return null !== b.parent.parent ? b.parent.parent : a.pa; + case ir: + var c = !0; + if (0 === b.qm) c = !1; else for (var d = b.children, e = d.length, f = 0; f < e; f++) if (0 < d[f].qm) { + c = !1; + break + } + return c && null !== b.parent ? a.pa : null !== b.parent ? b.parent : a.qa + } + } + + Y.prototype.initializeTreeVertexValues = function (a) { + var b = fr(this, a); + a.copyInheritedPropertiesFrom(b); + if (null !== a.parent && a.parent.alignment === er) { + for (var b = a.angle, c = a.parent.children, d = 0; d < c.length && a !== c[d];) d++; + 0 === d % 2 ? d !== c.length - 1 && (b = 90 === b ? 180 : 180 === b ? 270 : 270 === b ? 180 : 270) : b = 90 === b ? 0 : 180 === b ? 90 : 270 === b ? 0 : 90; + a.angle = b + } + a.initialized = !0 + }; + + function $q(a, b) { + if (null !== b) { + a.assignTreeVertexValues(b); + for (var c = b.children, d = c.length, e = 0; e < d; e++) $q(a, c[e]) + } + } + + Y.prototype.assignTreeVertexValues = function () { + }; + + function ar(a, b) { + if (null !== b) { + b.alignment !== er && a.sortTreeVertexChildren(b); + for (var c = b.children, d = c.length, e = 0; e < d; e++) ar(a, c[e]) + } + } + + Y.prototype.sortTreeVertexChildren = function (a) { + switch (a.sorting) { + case jr: + break; + case kr: + a.children.reverse(); + break; + case lr: + a.children.sort(a.comparer); + break; + case mr: + a.children.sort(a.comparer); + a.children.reverse(); + break; + default: + u.k("Unhandled sorting value " + a.sorting.toString()) + } + }; + Y.prototype.Ny = function () { + if (this.comments) for (var a = this.network.vertexes.i; a.next();) this.addComments(a.value) + }; + Y.prototype.addComments = function (a) { + var b = a.angle, c = a.parent, d = 0, e = nr, e = !1; + null !== c && (d = c.angle, e = c.alignment, e = or(e)); + var b = 90 === b || 270 === b, d = 90 === d || 270 === d, c = 0 === a.qm, f = 0, h = 0, k = 0, + l = a.commentSpacing; + if (null !== a.Cc) for (var m = a.Cc.rD(); m.next();) { + var n = m.value; + "Comment" === n.Kc && n.Ea() && (null === a.comments && (a.comments = []), a.comments.push(n), n.pf(), n = n.Ba, b && !c || !e && !d && c || e && d && c ? (f = Math.max(f, n.width), h += n.height + Math.abs(k)) : (f += n.width + Math.abs(k), h = Math.max(h, n.height)), k = l) + } + null !== a.comments && + (b && !c || !e && !d && c || e && d && c ? (f += Math.abs(a.commentMargin), h = Math.max(0, h - a.height)) : (h += Math.abs(a.commentMargin), f = Math.max(0, f - a.width)), e = u.Vj(0, 0, a.aa.width + f, a.aa.height + h), a.kb = e, u.ic(e)) + }; + + function or(a) { + return a === pr || a === er || a === qr || a === rr + } + + function sr(a) { + return a === pr || a === er + } + + function tr(a) { + var b = a.parent; + if (null !== b) { + var c = b.alignment; + if (or(c)) { + if (sr(c)) { + b = b.children; + for (c = 0; c < b.length && a !== b[c];) c++; + return 0 === c % 2 + } + if (c === qr) return !0 + } + } + return !1 + } + + Y.prototype.layoutComments = function (a) { + if (null !== a.comments) { + var b = a.Cc.Ba, c = a.parent, d = a.angle, e = 0, f = nr, f = !1; + null !== c && (e = c.angle, f = c.alignment, f = or(f)); + for (var c = 90 === d || 270 === d, d = 90 === e || 270 === e, h = 0 === a.qm, k = tr(a), l = 0, m = a.comments, n = m.length, p = u.K(), q = 0; q < n; q++) { + var r = m[q], s = r.Ba; + if (c && !h || !f && !d && h || f && d && h) { + if (135 < e && !f || d && k) if (0 <= a.commentMargin) for (p.m(a.aa.x - a.commentMargin - s.width, a.aa.y + l), r.move(p), r = r.og(); r.next();) { + var t = r.value; + t.vb = wc; + t.xb = xc + } else for (p.m(a.aa.x + 2 * a.M.x - a.commentMargin, + a.aa.y + l), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = xc, t.xb = wc; else if (0 <= a.commentMargin) for (p.m(a.aa.x + 2 * a.M.x + a.commentMargin, a.aa.y + l), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = xc, t.xb = wc; else for (p.m(a.aa.x + a.commentMargin - s.width, a.aa.y + l), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = wc, t.xb = xc; + l = 0 <= a.commentSpacing ? l + (s.height + a.commentSpacing) : l + (a.commentSpacing - s.height) + } else { + if (135 < e && !f || !d && k) if (0 <= a.commentMargin) for (p.m(a.aa.x + l, a.aa.y - a.commentMargin - s.height), r.move(p), r = r.og(); r.next();) t = + r.value, t.vb = vc, t.xb = Cc; else for (p.m(a.aa.x + l, a.aa.y + 2 * a.M.y - a.commentMargin), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = Cc, t.xb = vc; else if (0 <= a.commentMargin) for (p.m(a.aa.x + l, a.aa.y + 2 * a.M.y + a.commentMargin), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = Cc, t.xb = vc; else for (p.m(a.aa.x + l, a.aa.y + a.commentMargin - s.height), r.move(p), r = r.og(); r.next();) t = r.value, t.vb = vc, t.xb = Cc; + l = 0 <= a.commentSpacing ? l + (s.width + a.commentSpacing) : l + (a.commentSpacing - s.width) + } + } + u.v(p); + b = l - a.commentSpacing - (c ? b.height : b.width); + if (this.Af === Qq) for (e = a.bc; e.next();) a = e.value.link, null === a || a.el || (a.Yk = 0 < b ? b : NaN); else for (e = a.kc; e.next();) a = e.value.link, null === a || a.el || (a.vl = 0 < b ? b : NaN) + } + }; + Y.prototype.layoutTree = function (a) { + if (null !== a) { + for (var b = a.children, c = b.length, d = 0; d < c; d++) this.layoutTree(b[d]); + switch (a.compaction) { + case ur: + vr(this, a); + break; + case wr: + if (a.alignment === er) vr(this, a); else if (0 === a.qm) { + var d = a.parent, b = !1, c = 0, e = nr; + null !== d && (c = d.angle, e = d.alignment, b = or(e)); + d = tr(a); + a.ia.m(0, 0); + a.Ya.m(a.width, a.height); + null === a.parent || null === a.comments || (180 !== c && 270 !== c || b) && !d ? a.Ia.m(0, 0) : 180 === c && !b || (90 === c || 270 === c) && d ? a.Ia.m(a.width - 2 * a.M.x, 0) : a.Ia.m(0, a.height - 2 * a.M.y); + a.Ss = + null; + a.jt = null + } else { + for (var f = xr(a), b = 90 === f || 270 === f, h = 0, k = a.children, l = k.length, m = 0; m < l; m++) var n = k[m], h = Math.max(h, b ? n.Ya.width : n.Ya.height); + var p = a.alignment, d = p === yr, q = p === zr, r = or(p), s = Math.max(0, a.breadthLimit), + c = Ar(a), t = a.nodeSpacing, v = Br(a), x = a.rowSpacing, B = 0; + if (d || q || a.bp || a.cp && 1 === a.maxGenerationCount) B = Math.max(0, a.rowIndent); + var d = a.width, e = a.height, y = 0, C = 0, I = 0, H = null, T = null, aa = 0, R = 0, N = 0, + Z = 0, Ea = 0, ua = 0, Oa = 0, na = 0, n = 0; + r && !sr(p) && 135 < f && k.reverse(); + if (sr(p)) if (1 < l) for (m = 0; m < l; m++) 0 === m % 2 && + m !== l - 1 ? na = Math.max(na, b ? k[m].Ya.width : k[m].Ya.height) : 0 !== m % 2 && (n = Math.max(n, b ? k[m].Ya.width : k[m].Ya.height)); else 1 === l && (na = b ? k[0].Ya.width : k[0].Ya.height); + if (r) { + switch (p) { + case pr: + R = 135 > f ? Cr(a, k, na, y, C) : Dr(a, k, na, y, C); + na = R.x; + y = R.width; + C = R.height; + break; + case qr: + for (m = 0; m < l; m++) { + var n = k[m], Ca = n.Ya, H = 0 === ua ? 0 : x; + b ? (n.ia.m(h - Ca.width, Z + H), y = Math.max(y, Ca.width), C = Math.max(C, Z + H + Ca.height), Z += H + Ca.height) : (n.ia.m(N + H, h - Ca.height), y = Math.max(y, N + H + Ca.width), C = Math.max(C, Ca.height), N += H + Ca.width); + ua++ + } + break; + case rr: + for (m = 0; m < l; m++) n = k[m], Ca = n.Ya, H = 0 === ua ? 0 : x, b ? (n.ia.m(t / 2 + a.M.x, Z + H), y = Math.max(y, Ca.width), C = Math.max(C, Z + H + Ca.height), Z += H + Ca.height) : (n.ia.m(N + H, t / 2 + a.M.y), y = Math.max(y, N + H + Ca.width), C = Math.max(C, Ca.height), N += H + Ca.width), ua++ + } + H = Er(this, 2); + T = Er(this, 2); + b ? (H[0].m(0, 0), H[1].m(0, C), T[0].m(y, 0)) : (H[0].m(0, 0), H[1].m(y, 0), T[0].m(0, C)); + T[1].m(y, C) + } else for (m = 0; m < l; m++) { + n = k[m]; + Ca = n.Ya; + if (b) { + 0 < s && 0 < ua && N + t + Ca.width > s && (N < h && Fr(a, p, h - N, 0, Oa, m - 1), Ea++, ua = 0, Oa = m, I = C, N = 0, Z = 135 < f ? -C - x : C + x); + Gr(this, n, + 0, Z); + var ra = 0; + if (0 === ua) { + if (H = n.Ss, T = n.jt, aa = Ca.width, R = Ca.height, null === H || null === T || f !== xr(n)) H = Er(this, 2), T = Er(this, 2), H[0].m(0, 0), H[1].m(0, R), T[0].m(aa, 0), T[1].m(aa, R) + } else { + var dc = u.eb(), R = Hr(this, a, n, H, T, aa, R, dc), ra = R.x, H = dc[0], + T = dc[1], aa = R.width, R = R.height; + u.ra(dc); + N < Ca.width && 0 > ra && (Ir(a, -ra, 0, Oa, m - 1), Jr(H, -ra, 0), Jr(T, -ra, 0), ra = 0) + } + n.ia.m(ra, Z); + y = Math.max(y, aa); + C = Math.max(C, I + (0 === Ea ? 0 : x) + Ca.height); + N = aa + } else { + 0 < s && 0 < ua && Z + t + Ca.height > s && (Z < h && Fr(a, p, 0, h - Z, Oa, m - 1), Ea++, ua = 0, Oa = m, I = y, Z = 0, N = 135 < + f ? -y - x : y + x); + Gr(this, n, N, 0); + ra = 0; + if (0 === ua) { + if (H = n.Ss, T = n.jt, aa = Ca.width, R = Ca.height, null === H || null === T || f !== xr(n)) H = Er(this, 2), T = Er(this, 2), H[0].m(0, 0), H[1].m(aa, 0), T[0].m(0, R), T[1].m(aa, R) + } else dc = u.eb(), R = Hr(this, a, n, H, T, aa, R, dc), ra = R.x, H = dc[0], T = dc[1], aa = R.width, R = R.height, u.ra(dc), Z < Ca.height && 0 > ra && (Ir(a, 0, -ra, Oa, m - 1), Jr(H, 0, -ra), Jr(T, 0, -ra), ra = 0); + n.ia.m(N, ra); + C = Math.max(C, R); + y = Math.max(y, I + (0 === Ea ? 0 : x) + Ca.width); + Z = R + } + ua++ + } + 0 < Ea && (b ? (C += Math.max(0, c), N < y && Fr(a, p, y - N, 0, Oa, l - 1), 0 < B && (q || Ir(a, B, 0, + 0, l - 1), y += B)) : (y += Math.max(0, c), Z < C && Fr(a, p, 0, C - Z, Oa, l - 1), 0 < B && (q || Ir(a, 0, B, 0, l - 1), C += B))); + q = h = 0; + switch (p) { + case Kr: + b ? h += y / 2 - a.M.x - v / 2 : q += C / 2 - a.M.y - v / 2; + break; + case nr: + 0 < Ea ? b ? h += y / 2 - a.M.x - v / 2 : q += C / 2 - a.M.y - v / 2 : b ? (m = k[0].ia.x + k[0].Ia.x, na = k[l - 1].ia.x + k[l - 1].Ia.x + 2 * k[l - 1].M.x, h += m + (na - m) / 2 - a.M.x - v / 2) : (m = k[0].ia.y + k[0].Ia.y, na = k[l - 1].ia.y + k[l - 1].Ia.y + 2 * k[l - 1].M.y, q += m + (na - m) / 2 - a.M.y - v / 2); + break; + case yr: + b ? (h -= v, y += v) : (q -= v, C += v); + break; + case zr: + b ? (h += y - a.width + v, y += v) : (q += C - a.height + v, C += v); + break; + case pr: + b ? + h = 1 < l ? h + (na + t / 2 - a.M.x) : h + (k[0].M.x - a.M.x + k[0].Ia.x) : q = 1 < l ? q + (na + t / 2 - a.M.y) : q + (k[0].M.y - a.M.y + k[0].Ia.y); + break; + case qr: + b ? h += y + t / 2 - a.M.x : q += C + t / 2 - a.M.y; + break; + case rr: + break; + default: + u.k("Unhandled alignment value " + p.toString()) + } + for (m = 0; m < l; m++) n = k[m], b ? n.ia.m(n.ia.x + n.Ia.x - h, n.ia.y + (135 < f ? (r ? -C : -n.Ya.height) + n.Ia.y - c : e + c + n.Ia.y)) : n.ia.m(n.ia.x + (135 < f ? (r ? -y : -n.Ya.width) + n.Ia.x - c : d + c + n.Ia.x), n.ia.y + n.Ia.y - q); + l = k = 0; + r ? b ? (y = Lr(a, y, h), 0 > h && (h = 0), 135 < f && (q += C + c), C += e + c, p === rr && (k += t / 2 + a.M.x), l += e + c) : (135 < f && + (h += y + c), y += d + c, C = Mr(a, C, q), 0 > q && (q = 0), p === rr && (l += t / 2 + a.M.y), k += d + c) : b ? (null === a.comments ? d > y && (p = Nr(p, d - y, 0), k = p.x, l = p.y, y = d, h = 0) : y = Lr(a, y, h), 0 > h && (k -= h, h = 0), 135 < f && (q += C + c), C = Math.max(Math.max(C, e), C + e + c), l += e + c) : (135 < f && (h += y + c), y = Math.max(Math.max(y, d), y + d + c), null === a.comments ? e > C && (p = Nr(p, 0, e - C), k = p.x, l = p.y, C = e, q = 0) : C = Mr(a, C, q), 0 > q && (l -= q, q = 0), k += d + c); + if (0 < Ea) f = Er(this, 4), p = Er(this, 4), b ? (f[2].m(0, e + c), f[3].m(f[2].x, C), p[2].m(y, f[2].y), p[3].m(p[2].x, f[3].y)) : (f[2].m(d + c, 0), f[3].m(y, f[2].y), p[2].m(f[2].x, + C), p[3].m(f[3].x, p[2].y)); else { + f = Er(this, H.length + 2); + p = Er(this, T.length + 2); + for (m = 0; m < H.length; m++) r = H[m], f[m + 2].m(r.x + k, r.y + l); + for (m = 0; m < T.length; m++) r = T[m], p[m + 2].m(r.x + k, r.y + l) + } + b ? (f[0].m(h, 0), f[1].m(f[0].x, e), f[2].y < f[1].y && (f[2].x > f[0].x ? f[2].assign(f[1]) : f[1].assign(f[2])), f[3].y < f[2].y && (f[3].x > f[0].x ? f[3].assign(f[2]) : f[2].assign(f[3])), p[0].m(h + d, 0), p[1].m(p[0].x, e), p[2].y < p[1].y && (p[2].x < p[0].x ? p[2].assign(p[1]) : p[1].assign(p[2])), p[3].y < p[2].y && (p[3].x < p[0].x ? p[3].assign(p[2]) : p[2].assign(p[3])), + f[2].y -= c / 2, p[2].y -= c / 2) : (f[0].m(0, q), f[1].m(d, f[0].y), f[2].x < f[1].x && (f[2].y > f[0].y ? f[2].assign(f[1]) : f[1].assign(f[2])), f[3].x < f[2].x && (f[3].y > f[0].y ? f[3].assign(f[2]) : f[2].assign(f[3])), p[0].m(0, q + e), p[1].m(d, p[0].y), p[2].x < p[1].x && (p[2].y < p[0].y ? p[2].assign(p[1]) : p[1].assign(p[2])), p[3].x < p[2].x && (p[3].y < p[0].y ? p[3].assign(p[2]) : p[2].assign(p[3])), f[2].x -= c / 2, p[2].x -= c / 2); + Or(this, H); + Or(this, T); + a.Ss = f; + a.jt = p; + a.Ia.m(h, q); + a.Ya.m(y, C) + } + break; + default: + u.k("Unhandled compaction value " + a.compaction.toString()) + } + } + }; + + function vr(a, b) { + if (0 === b.qm) { + var c = !1, d = 0, e = nr; + null !== b.parent && (d = b.parent.angle, e = b.parent.alignment, c = or(e)); + e = tr(b); + b.ia.m(0, 0); + b.Ya.m(b.width, b.height); + null === b.parent || null === b.comments || (180 !== d && 270 !== d || c) && !e ? b.Ia.m(0, 0) : 180 === d && !c || (90 === d || 270 === d) && e ? b.Ia.m(b.width - 2 * b.M.x, 0) : b.Ia.m(0, b.height - 2 * b.M.y) + } else { + for (var c = xr(b), d = 90 === c || 270 === c, f = 0, e = b.children, h = e.length, k = 0; k < h; k++) var l = e[k], f = Math.max(f, d ? l.Ya.width : l.Ya.height); + var m = b.alignment, n = m === yr, p = m === zr, q = or(m), r = Math.max(0, + b.breadthLimit), s = Ar(b), t = b.nodeSpacing, v = Br(b), x = n || p ? 0 : v / 2, B = b.rowSpacing, + y = 0; + if (n || p || b.bp || b.cp && 1 === b.maxGenerationCount) y = Math.max(0, b.rowIndent); + var n = b.width, C = b.height, I = 0, H = 0, T = 0, aa = 0, R = 0, N = 0, Z = 0, Ea = 0, ua = 0, Oa = 0; + q && !sr(m) && 135 < c && e.reverse(); + if (sr(m)) if (1 < h) for (k = 0; k < h; k++) { + var l = e[k], na = l.Ya; + 0 === k % 2 && k !== h - 1 ? ua = Math.max(ua, (d ? na.width : na.height) + Pr(l) - t) : 0 !== k % 2 && (Oa = Math.max(Oa, (d ? na.width : na.height) + Pr(l) - t)) + } else 1 === h && (ua = d ? e[0].Ya.width : e[0].Ya.height); + if (q) switch (m) { + case pr: + case er: + H = + 135 > c ? Cr(b, e, ua, I, H) : Dr(b, e, ua, I, H); + ua = H.x; + I = H.width; + H = H.height; + break; + case qr: + for (k = 0; k < h; k++) l = e[k], na = l.Ya, r = 0 === Z ? 0 : B, d ? (l.ia.m(f - na.width, R + r), I = Math.max(I, na.width), H = Math.max(H, R + r + na.height), R += r + na.height) : (l.ia.m(aa + r, f - na.height), I = Math.max(I, aa + r + na.width), H = Math.max(H, na.height), aa += r + na.width), Z++; + break; + case rr: + for (f = 0; f < h; f++) l = e[f], na = l.Ya, r = 0 === Z ? 0 : B, d ? (l.ia.m(t / 2 + b.M.x, R + r), I = Math.max(I, na.width), H = Math.max(H, R + r + na.height), R += r + na.height) : (l.ia.m(aa + r, t / 2 + b.M.y), I = Math.max(I, aa + + r + na.width), H = Math.max(H, na.height), aa += r + na.width), Z++ + } else for (k = 0; k < h; k++) l = e[k], na = l.Ya, d ? (0 < r && 0 < Z && aa + t + na.width > r && (aa < f && Fr(b, m, f - aa, 0, Ea, k - 1), N++, Z = 0, Ea = k, T = H, aa = 0, R = 135 < c ? -H - B : H + B), Oa = 0 === Z ? x : t, Gr(a, l, 0, R), l.ia.m(aa + Oa, R), I = Math.max(I, aa + Oa + na.width), H = Math.max(H, T + (0 === N ? 0 : B) + na.height), aa += Oa + na.width) : (0 < r && 0 < Z && R + t + na.height > r && (R < f && Fr(b, m, 0, f - R, Ea, k - 1), N++, Z = 0, Ea = k, T = I, R = 0, aa = 135 < c ? -I - B : I + B), Oa = 0 === Z ? x : t, Gr(a, l, aa, 0), l.ia.m(aa, R + Oa), H = Math.max(H, R + Oa + na.height), I = Math.max(I, T + (0 === + N ? 0 : B) + na.width), R += Oa + na.height), Z++; + 0 < N && (d ? (H += Math.max(0, s), aa < I && Fr(b, m, I - aa, 0, Ea, h - 1), 0 < y && (p || Ir(b, y, 0, 0, h - 1), I += y)) : (I += Math.max(0, s), R < H && Fr(b, m, 0, H - R, Ea, h - 1), 0 < y && (p || Ir(b, 0, y, 0, h - 1), H += y))); + y = p = 0; + switch (m) { + case Kr: + d ? p += I / 2 - b.M.x - v / 2 : y += H / 2 - b.M.y - v / 2; + break; + case nr: + 0 < N ? d ? p += I / 2 - b.M.x - v / 2 : y += H / 2 - b.M.y - v / 2 : d ? (m = e[0].ia.x + e[0].Ia.x, t = e[h - 1].ia.x + e[h - 1].Ia.x + 2 * e[h - 1].M.x, p += m + (t - m) / 2 - b.M.x - v / 2) : (m = e[0].ia.y + e[0].Ia.y, t = e[h - 1].ia.y + e[h - 1].Ia.y + 2 * e[h - 1].M.y, y += m + (t - m) / 2 - b.M.y - v / 2); + break; + case yr: + d ? + (p -= v, I += v) : (y -= v, H += v); + break; + case zr: + d ? (p += I - b.width + v, I += v) : (y += H - b.height + v, H += v); + break; + case pr: + case er: + d ? p = 1 < h ? p + (ua + t / 2 - b.M.x) : p + (e[0].M.x - b.M.x + e[0].Ia.x) : y = 1 < h ? y + (ua + t / 2 - b.M.y) : y + (e[0].M.y - b.M.y + e[0].Ia.y); + break; + case qr: + d ? p += I + t / 2 - b.M.x : y += H + t / 2 - b.M.y; + break; + case rr: + break; + default: + u.k("Unhandled alignment value " + m.toString()) + } + for (k = 0; k < h; k++) l = e[k], d ? l.ia.m(l.ia.x + l.Ia.x - p, l.ia.y + (135 < c ? (q ? -H : -l.Ya.height) + l.Ia.y - s : C + s + l.Ia.y)) : l.ia.m(l.ia.x + (135 < c ? (q ? -I : -l.Ya.width) + l.Ia.x - s : n + s + l.Ia.x), l.ia.y + + l.Ia.y - y); + d ? (I = Lr(b, I, p), 0 > p && (p = 0), 135 < c && (y += H + s), H += C + s) : (135 < c && (p += I + s), I += n + s, H = Mr(b, H, y), 0 > y && (y = 0)); + b.Ia.m(p, y); + b.Ya.m(I, H) + } + } + + function Cr(a, b, c, d, e) { + var f = b.length; + if (0 === f) return new z(c, 0, d, e); + if (1 === f) { + var h = b[0]; + d = h.Ya.width; + e = h.Ya.height; + return new z(c, 0, d, e) + } + for (var k = a.nodeSpacing, l = a.rowSpacing, m = 90 === xr(a), n = 0, p = 0, q = 0, r = 0; r < f; r++) if (!(0 !== r % 2 || 1 < f && r === f - 1)) { + var h = b[r], s = h.Ya, t = 0 === n ? 0 : l; + if (m) { + var v = Pr(h) - k; + h.ia.m(c - (s.width + v), q + t); + d = Math.max(d, s.width + v); + e = Math.max(e, q + t + s.height); + q += t + s.height + } else v = Pr(h) - k, h.ia.m(p + t, c - (s.height + v)), e = Math.max(e, s.height + v), d = Math.max(d, p + t + s.width), p += t + s.width; + n++ + } + var n = + 0, x = p, B = q; + m ? (p = c + k, q = 0) : (p = 0, q = c + k); + for (r = 0; r < f; r++) 0 !== r % 2 && (h = b[r], s = h.Ya, t = 0 === n ? 0 : l, m ? (v = Pr(h) - k, h.ia.m(p + v, q + t), d = Math.max(d, p + s.width + v), e = Math.max(e, q + t + s.height), q += t + s.height) : (v = Pr(h) - k, h.ia.m(p + t, q + v), d = Math.max(d, p + t + s.width), e = Math.max(e, q + s.height + v), p += t + s.width), n++); + 1 < f && 1 === f % 2 && (h = b[f - 1], s = h.Ya, b = Qr(h, m ? Math.max(Math.abs(B), Math.abs(q)) : Math.max(Math.abs(x), Math.abs(p))), m ? (h.ia.m(c + k / 2 - h.M.x - h.Ia.x, e + b), m = c + k / 2 - h.M.x - h.Ia.x, d = Math.max(d, m + s.width), 0 > m && (d -= m), e = Math.max(e, Math.max(B, + q) + b + s.height), 0 > h.ia.x && (c = Wr(a, h.ia.x, !1, c, k))) : (h.ia.m(d + b, c + k / 2 - h.M.y - h.Ia.y), d = Math.max(d, Math.max(x, p) + b + s.width), m = c + k / 2 - h.M.y - h.Ia.y, e = Math.max(e, m + s.height), 0 > m && (e -= m), 0 > h.ia.y && (c = Wr(a, h.ia.y, !0, c, k)))); + return new z(c, 0, d, e) + } + + function Dr(a, b, c, d, e) { + var f = b.length; + if (0 === f) return new z(c, 0, d, e); + if (1 === f) { + var h = b[0]; + d = h.Ya.width; + e = h.Ya.height; + return new z(c, 0, d, e) + } + for (var k = a.nodeSpacing, l = a.rowSpacing, m = 270 === xr(a), n = 0, p = 0, q = 0, r = 0; r < f; r++) if (!(0 !== r % 2 || 1 < f && r === f - 1)) { + var h = b[r], s = h.Ya, t = 0 === n ? 0 : l; + if (m) { + var v = Pr(h) - k, q = q - (t + s.height); + h.ia.m(c - (s.width + v), q); + d = Math.max(d, s.width + v); + e = Math.max(e, Math.abs(q)) + } else v = Pr(h) - k, p -= t + s.width, h.ia.m(p, c - (s.height + v)), e = Math.max(e, s.height + v), d = Math.max(d, Math.abs(p)); + n++ + } + var n = 0, + x = p, B = q; + m ? (p = c + k, q = 0) : (p = 0, q = c + k); + for (r = 0; r < f; r++) 0 !== r % 2 && (h = b[r], s = h.Ya, t = 0 === n ? 0 : l, m ? (v = Pr(h) - k, q -= t + s.height, h.ia.m(p + v, q), d = Math.max(d, p + s.width + v), e = Math.max(e, Math.abs(q))) : (v = Pr(h) - k, p -= t + s.width, h.ia.m(p, q + v), e = Math.max(e, q + s.height + v), d = Math.max(d, Math.abs(p))), n++); + 1 < f && 1 === f % 2 && (h = b[f - 1], s = h.Ya, l = Qr(h, m ? Math.max(Math.abs(B), Math.abs(q)) : Math.max(Math.abs(x), Math.abs(p))), m ? (h.ia.m(c + k / 2 - h.M.x - h.Ia.x, -e - s.height - l), p = c + k / 2 - h.M.x - h.Ia.x, d = Math.max(d, p + s.width), 0 > p && (d -= p), e = Math.max(e, Math.abs(Math.min(B, + q)) + l + s.height), 0 > h.ia.x && (c = Wr(a, h.ia.x, !1, c, k))) : (h.ia.m(-d - s.width - l, c + k / 2 - h.M.y - h.Ia.y), d = Math.max(d, Math.abs(Math.min(x, p)) + l + s.width), p = c + k / 2 - h.M.y - h.Ia.y, e = Math.max(e, p + s.height), 0 > p && (e -= p), 0 > h.ia.y && (c = Wr(a, h.ia.y, !0, c, k)))); + for (r = 0; r < f; r++) h = b[r], m ? h.ia.m(h.ia.x, h.ia.y + e) : h.ia.m(h.ia.x + d, h.ia.y); + return new z(c, 0, d, e) + } + + function Pr(a) { + return null === a.parent ? 0 : a.parent.nodeSpacing + } + + function Qr(a) { + return null === a.parent ? 0 : a.parent.rowSpacing + } + + function Wr(a, b, c, d, e) { + a = a.children; + for (var f = a.length, h = 0; h < f; h++) c ? a[h].ia.m(a[h].ia.x, a[h].ia.y - b) : a[h].ia.m(a[h].ia.x - b, a[h].ia.y); + b = a[f - 1]; + return Math.max(d, c ? b.Ia.y + b.M.y - e / 2 : b.Ia.x + b.M.x - e / 2) + } + + function Lr(a, b, c) { + switch (a.alignment) { + case nr: + case Kr: + var d = b; + c + a.width > d && (d = c + a.width); + 0 > c && (d -= c); + return d; + case yr: + return a.width > b ? a.width : b; + case zr: + return 2 * a.M.x > b ? a.width : b + a.width - 2 * a.M.x; + case pr: + case er: + return d = Math.min(0, c), c = Math.max(b, c + a.width), Math.max(a.width, c - d); + case qr: + return a.width - a.M.x + a.nodeSpacing / 2 + b; + case rr: + return Math.max(a.width, a.M.x + a.nodeSpacing / 2 + b); + default: + return b + } + } + + function Mr(a, b, c) { + switch (a.alignment) { + case nr: + case Kr: + var d = b; + c + a.height > d && (d = c + a.height); + 0 > c && (d -= c); + return d; + case yr: + return a.height > b ? a.height : b; + case zr: + return 2 * a.M.y > b ? a.height : b + a.height - 2 * a.M.y; + case pr: + case er: + return d = Math.min(0, c), c = Math.max(b, c + a.height), Math.max(a.height, c - d); + case qr: + return a.height - a.M.y + a.nodeSpacing / 2 + b; + case rr: + return Math.max(a.height, a.M.y + a.nodeSpacing / 2 + b); + default: + return b + } + } + + function Nr(a, b, c) { + switch (a) { + case Kr: + b /= 2; + c /= 2; + break; + case nr: + b /= 2; + c /= 2; + break; + case yr: + c = b = 0; + break; + case zr: + break; + default: + u.k("Unhandled alignment value " + a.toString()) + } + return new w(b, c) + } + + function Fr(a, b, c, d, e, f) { + b = Nr(b, c, d); + Ir(a, b.x, b.y, e, f) + } + + function Ir(a, b, c, d, e) { + if (0 !== b || 0 !== c) for (a = a.children; d <= e; d++) { + var f = a[d].ia; + f.x += b; + f.y += c + } + } + + function Gr(a, b, c, d) { + var e = b.parent; + switch (a.Af) { + case Qq: + for (a = b.kc; a.next();) b = a.value, b.fromVertex === e && b.nr.m(c, d); + break; + case Xq: + for (a = b.bc; a.next();) b = a.value, b.toVertex === e && b.nr.m(c, d); + break; + default: + u.k("Unhandled path value " + a.Af.toString()) + } + } + + function Jr(a, b, c) { + for (var d = 0; d < a.length; d++) { + var e = a[d]; + e.x += b; + e.y += c + } + } + + function Hr(a, b, c, d, e, f, h, k) { + var l = xr(b), m = 90 === l || 270 === l, n = b.nodeSpacing; + b = d; + var p = e; + d = f; + e = h; + var q = c.Ss, r = c.jt; + h = c.Ya; + var s = m ? Math.max(e, h.height) : Math.max(d, h.width); + if (null === q || l !== xr(c)) q = Er(a, 2), r = Er(a, 2), m ? (q[0].m(0, 0), q[1].m(0, h.height), r[0].m(h.width, 0), r[1].m(r[0].x, q[1].y)) : (q[0].m(0, 0), q[1].m(h.width, 0), r[0].m(0, h.height), r[1].m(q[1].x, r[0].y)); + if (m) { + c = d; + d = 9999999; + if (!(null === p || 2 > p.length || null === q || 2 > q.length)) for (m = l = 0; l < p.length && m < q.length;) { + e = p[l]; + var t = q[m]; + f = t.x; + var v = t.y; + f += + c; + var x = e; + l + 1 < p.length && (x = p[l + 1]); + var B = t, t = B.x, B = B.y; + m + 1 < q.length && (B = q[m + 1], t = B.x, B = B.y, t += c); + var y = d; + e.y === v ? y = f - e.x : e.y > v && e.y < B ? y = f + (e.y - v) / (B - v) * (t - f) - e.x : v > e.y && v < x.y && (y = f - (e.x + (v - e.y) / (x.y - e.y) * (x.x - e.x))); + y < d && (d = y); + x.y <= e.y ? l++ : B <= v ? m++ : (x.y <= B && l++, B <= x.y && m++) + } + c -= d; + c += n; + l = q; + m = c; + if (null === b || 2 > b.length || null === l || 2 > l.length) d = null; else { + n = Er(a, b.length + l.length); + for (d = f = e = 0; f < l.length && l[f].y < b[0].y;) v = l[f++], n[d++].m(v.x + m, v.y); + for (; e < b.length;) v = b[e++], n[d++].m(v.x, v.y); + for (e = b[b.length - + 1].y; f < l.length && l[f].y <= e;) f++; + for (; f < l.length && l[f].y > e;) v = l[f++], n[d++].m(v.x + m, v.y); + l = Er(a, d); + for (e = 0; e < d; e++) l[e].assign(n[e]); + Or(a, n); + d = l + } + f = r; + v = c; + if (null === p || 2 > p.length || null === f || 2 > f.length) e = null; else { + n = Er(a, p.length + f.length); + for (m = x = l = 0; l < p.length && p[l].y < f[0].y;) e = p[l++], n[m++].m(e.x, e.y); + for (; x < f.length;) e = f[x++], n[m++].m(e.x + v, e.y); + for (f = f[f.length - 1].y; l < p.length && p[l].y <= f;) l++; + for (; l < p.length && p[l].y > f;) e = p[l++], n[m++].m(e.x, e.y); + e = Er(a, m); + for (l = 0; l < m; l++) e[l].assign(n[l]); + Or(a, n) + } + f = + Math.max(0, c) + h.width; + h = s + } else { + c = e; + d = 9999999; + if (!(null === p || 2 > p.length || null === q || 2 > q.length)) for (m = l = 0; l < p.length && m < q.length;) e = p[l], t = q[m], f = t.x, v = t.y, v += c, x = e, l + 1 < p.length && (x = p[l + 1]), B = t, t = B.x, B = B.y, m + 1 < q.length && (B = q[m + 1], t = B.x, B = B.y, B += c), y = d, e.x === f ? y = v - e.y : e.x > f && e.x < t ? y = v + (e.x - f) / (t - f) * (B - v) - e.y : f > e.x && f < x.x && (y = v - (e.y + (f - e.x) / (x.x - e.x) * (x.y - e.y))), y < d && (d = y), x.x <= e.x ? l++ : t <= f ? m++ : (x.x <= t && l++, t <= x.x && m++); + c -= d; + c += n; + l = q; + m = c; + if (null === b || 2 > b.length || null === l || 2 > l.length) d = null; else { + n = Er(a, + b.length + l.length); + for (d = f = e = 0; f < l.length && l[f].x < b[0].x;) v = l[f++], n[d++].m(v.x, v.y + m); + for (; e < b.length;) v = b[e++], n[d++].m(v.x, v.y); + for (e = b[b.length - 1].x; f < l.length && l[f].x <= e;) f++; + for (; f < l.length && l[f].x > e;) v = l[f++], n[d++].m(v.x, v.y + m); + l = Er(a, d); + for (e = 0; e < d; e++) l[e].assign(n[e]); + Or(a, n); + d = l + } + f = r; + v = c; + if (null === p || 2 > p.length || null === f || 2 > f.length) e = null; else { + n = Er(a, p.length + f.length); + for (m = x = l = 0; l < p.length && p[l].x < f[0].x;) e = p[l++], n[m++].m(e.x, e.y); + for (; x < f.length;) e = f[x++], n[m++].m(e.x, e.y + v); + for (f = + f[f.length - 1].x; l < p.length && p[l].x <= f;) l++; + for (; l < p.length && p[l].x > f;) e = p[l++], n[m++].m(e.x, e.y); + e = Er(a, m); + for (l = 0; l < m; l++) e[l].assign(n[l]); + Or(a, n) + } + f = s; + h = Math.max(0, c) + h.height + } + Or(a, b); + Or(a, q); + Or(a, p); + Or(a, r); + k[0] = d; + k[1] = e; + return new z(c, 0, f, h) + } + + function Er(a, b) { + var c = a.By[b]; + if (void 0 !== c && (c = c.pop(), void 0 !== c)) return c; + for (var c = [], d = 0; d < b; d++) c[d] = new w; + return c + } + + function Or(a, b) { + var c = b.length, d = a.By[c]; + void 0 === d && (d = [], a.By[c] = d); + d.push(b) + } + + Y.prototype.arrangeTrees = function () { + if (this.Yc === Wq) for (var a = this.nd.i; a.next();) { + var b = a.value; + if (b instanceof Uq) { + var c = b.Cc; + if (null !== c) { + var d = c.position, c = d.x, d = d.y; + isFinite(c) || (c = 0); + isFinite(d) || (d = 0); + Xr(this, b, c, d) + } + } + } else for (a = this.Ud, b = a.x, c = a.y, a = this.nd.i; a.next();) if (d = a.value, d instanceof Uq) switch (Xr(this, d, b + d.Ia.x, c + d.Ia.y), this.Yc) { + case Tq: + c += d.Ya.height + this.Uf.height; + break; + case Yr: + b += d.Ya.width + this.Uf.width; + break; + default: + u.k("Unhandled arrangement value " + this.Yc.toString()) + } + }; + + function Xr(a, b, c, d) { + if (null !== b) { + b.x = c; + b.y = d; + b = b.children; + for (var e = b.length, f = 0; f < e; f++) { + var h = b[f]; + Xr(a, h, c + h.ia.x, d + h.ia.y) + } + } + } + + Y.prototype.commitLayout = function () { + this.cA(); + this.commitNodes(); + this.Sy(); + this.Qs && this.commitLinks() + }; + Y.prototype.commitNodes = function () { + for (var a = this.network.vertexes.i; a.next();) a.value.commit(); + for (a.reset(); a.next();) this.layoutComments(a.value) + }; + Y.prototype.Sy = function () { + if (this.wz === br) { + for (var a = this.BA, b = [], c = null, d = this.network.vertexes.i; d.next();) { + var e = d.value; + null === c ? c = e.kb.copy() : c.Sh(e.kb); + var f = b[e.level], f = void 0 === f ? Ar(e) : Math.max(f, Ar(e)); + b[e.level] = f + } + for (d = 0; d < b.length; d++) void 0 === b[d] && (b[d] = 0); + 90 === this.angle || 270 === this.angle ? (c.Jf(this.nodeSpacing / 2, this.layerSpacing), e = new w(-this.nodeSpacing / 2, -this.layerSpacing / 2)) : (c.Jf(this.layerSpacing, this.nodeSpacing / 2), e = new w(-this.layerSpacing / 2, -this.nodeSpacing / 2)); + var f = + [], c = 90 === this.angle || 270 === this.angle ? c.width : c.height, h = 0; + if (180 === this.angle || 270 === this.angle) for (d = 0; d < a.length; d++) h += a[d] + b[d]; + for (d = 0; d < a.length; d++) { + var k = a[d] + b[d]; + 270 === this.angle ? (h -= k, f.push(new z(0, h, c, k))) : 90 === this.angle ? (f.push(new z(0, h, c, k)), h += k) : 180 === this.angle ? (h -= k, f.push(new z(h, 0, k, c))) : (f.push(new z(h, 0, k, c)), h += k) + } + this.commitLayers(f, e) + } + }; + Y.prototype.commitLayers = function () { + }; + Y.prototype.commitLinks = function () { + for (var a = this.network.edges.i; a.next();) a.value.commit() + }; + Y.prototype.cA = function () { + for (var a = this.nd.i; a.next();) { + var b = a.value; + b instanceof Uq && Zr(this, b) + } + }; + + function Zr(a, b) { + if (null !== b) { + a.setPortSpots(b); + for (var c = b.children, d = c.length, e = 0; e < d; e++) Zr(a, c[e]) + } + } + + Y.prototype.setPortSpots = function (a) { + var b = a.alignment; + if (or(b)) { + var c = this.Af === Qq, d = xr(a), e; + switch (d) { + case 0: + e = xc; + break; + case 90: + e = Cc; + break; + case 180: + e = wc; + break; + default: + e = vc + } + var f = a.children, h = f.length; + switch (b) { + case pr: + case er: + for (b = 0; b < h; b++) { + var k = f[b], k = (c ? k.kc : k.bc).first(); + if (null !== k && (k = k.link, null !== k)) { + var l = 90 === d || 270 === d ? wc : vc; + if (1 === h || b === h - 1 && 1 === h % 2) switch (d) { + case 0: + l = wc; + break; + case 90: + l = vc; + break; + case 180: + l = xc; + break; + default: + l = Cc + } else 0 === b % 2 && (l = 90 === d || 270 === d ? xc : Cc); + c ? (a.setsPortSpot && + (k.vb = e), a.setsChildPortSpot && (k.xb = l)) : (a.setsPortSpot && (k.vb = l), a.setsChildPortSpot && (k.xb = e)) + } + } + break; + case qr: + l = 90 === d || 270 === d ? xc : Cc; + for (d = c ? a.bc : a.kc; d.next();) k = d.value.link, null !== k && (c ? (a.setsPortSpot && (k.vb = e), a.setsChildPortSpot && (k.xb = l)) : (a.setsPortSpot && (k.vb = l), a.setsChildPortSpot && (k.xb = e))); + break; + case rr: + for (l = 90 === d || 270 === d ? wc : vc, d = c ? a.bc : a.kc; d.next();) k = d.value.link, null !== k && (c ? (a.setsPortSpot && (k.vb = e), a.setsChildPortSpot && (k.xb = l)) : (a.setsPortSpot && (k.vb = l), a.setsChildPortSpot && + (k.xb = e))) + } + } else if (c = xr(a), this.Af === Qq) for (e = a.bc; e.next();) { + if (d = e.value.link, null !== d) { + if (a.setsPortSpot) if (a.portSpot.Lc()) switch (c) { + case 0: + d.vb = xc; + break; + case 90: + d.vb = Cc; + break; + case 180: + d.vb = wc; + break; + default: + d.vb = vc + } else d.vb = a.portSpot; + if (a.setsChildPortSpot) if (a.childPortSpot.Lc()) switch (c) { + case 0: + d.xb = wc; + break; + case 90: + d.xb = vc; + break; + case 180: + d.xb = xc; + break; + default: + d.xb = Cc + } else d.xb = a.childPortSpot + } + } else for (e = a.kc; e.next();) if (d = e.value.link, null !== d) { + if (a.setsPortSpot) if (a.portSpot.Lc()) switch (c) { + case 0: + d.xb = + xc; + break; + case 90: + d.xb = Cc; + break; + case 180: + d.xb = wc; + break; + default: + d.xb = vc + } else d.xb = a.portSpot; + if (a.setsChildPortSpot) if (a.childPortSpot.Lc()) switch (c) { + case 0: + d.vb = wc; + break; + case 90: + d.vb = vc; + break; + case 180: + d.vb = xc; + break; + default: + d.vb = Cc + } else d.vb = a.childPortSpot + } + }; + + function xr(a) { + a = a.angle; + return 45 >= a ? 0 : 135 >= a ? 90 : 225 >= a ? 180 : 315 >= a ? 270 : 0 + } + + function Ar(a) { + var b = xr(a), b = 90 === b || 270 === b, c = a.layerSpacing; + if (0 < a.layerSpacingParentOverlap) var d = Math.min(1, a.layerSpacingParentOverlap), + c = c - (b ? a.height * d : a.width * d); + c < (b ? -a.height : -a.width) && (c = b ? -a.height : -a.width); + return c + } + + function Br(a) { + var b = xr(a), b = 90 === b || 270 === b, c = a.nodeIndent; + if (0 < a.nodeIndentPastParent) var d = Math.min(1, a.nodeIndentPastParent), + c = c + (b ? a.width * d : a.height * d); + return c = Math.max(0, c) + } + + u.defineProperty(Y, {rK: "roots"}, function () { + return this.nd + }, function (a) { + this.nd !== a && (u.C(a, F, Y, "roots"), this.nd = a, this.H()) + }); + u.defineProperty(Y, {path: "path"}, function () { + return this.fr + }, function (a) { + this.fr !== a && (u.rb(a, Y, Y, "path"), this.fr = a, this.H()) + }); + u.defineProperty(Y, {AI: "treeStyle"}, function () { + return this.Wr + }, function (a) { + this.Yc !== a && (u.rb(a, Y, Y, "treeStyle"), a === Rq || a === hr || a === ir || a === gr) && (this.Wr = a, this.H()) + }); + u.defineProperty(Y, {wz: "layerStyle"}, function () { + return this.Cu + }, function (a) { + this.Yc !== a && (u.rb(a, Y, Y, "layerStyle"), a === Sq || a === cr || a === br) && (this.Cu = a, this.H()) + }); + u.defineProperty(Y, {comments: "comments"}, function () { + return this.oh + }, function (a) { + this.oh !== a && (u.j(a, "boolean", Y, "comments"), this.oh = a, this.H()) + }); + u.defineProperty(Y, {Gf: "arrangement"}, function () { + return this.Yc + }, function (a) { + this.Yc !== a && (u.rb(a, Y, Y, "arrangement"), a === Tq || a === Yr || a === Wq) && (this.Yc = a, this.H()) + }); + u.defineProperty(Y, {QC: "arrangementSpacing"}, function () { + return this.Uf + }, function (a) { + u.C(a, ia, Y, "arrangementSpacing"); + this.Uf.L(a) || (this.Uf.assign(a), this.H()) + }); + u.defineProperty(Y, {qK: "rootDefaults"}, function () { + return this.qa + }, function (a) { + this.qa !== a && (u.C(a, Uq, Y, "rootDefaults"), this.qa = a, this.H()) + }); + u.defineProperty(Y, {OI: "alternateDefaults"}, function () { + return this.pa + }, function (a) { + this.pa !== a && (u.C(a, Uq, Y, "alternateDefaults"), this.pa = a, this.H()) + }); + u.defineProperty(Y, {sorting: "sorting"}, function () { + return this.qa.sorting + }, function (a) { + this.qa.sorting !== a && (u.rb(a, Y, Y, "sorting"), a === jr || a === kr || a === lr || mr) && (this.qa.sorting = a, this.H()) + }); + u.defineProperty(Y, {comparer: "comparer"}, function () { + return this.qa.comparer + }, function (a) { + this.qa.comparer !== a && (u.j(a, "function", Y, "comparer"), this.qa.comparer = a, this.H()) + }); + u.defineProperty(Y, {angle: "angle"}, function () { + return this.qa.angle + }, function (a) { + this.qa.angle !== a && (u.j(a, "number", Y, "angle"), 0 === a || 90 === a || 180 === a || 270 === a) && (this.qa.angle = a, this.H()) + }); + u.defineProperty(Y, {alignment: "alignment"}, function () { + return this.qa.alignment + }, function (a) { + this.qa.alignment !== a && (u.rb(a, Y, Y, "alignment"), this.qa.alignment = a, this.H()) + }); + u.defineProperty(Y, {nodeIndent: "nodeIndent"}, function () { + return this.qa.nodeIndent + }, function (a) { + this.qa.nodeIndent !== a && (u.j(a, "number", Y, "nodeIndent"), 0 <= a && (this.qa.nodeIndent = a, this.H())) + }); + u.defineProperty(Y, {nodeIndentPastParent: "nodeIndentPastParent"}, function () { + return this.qa.nodeIndentPastParent + }, function (a) { + this.qa.nodeIndentPastParent !== a && (u.j(a, "number", Y, "nodeIndentPastParent"), 0 <= a && 1 >= a && (this.qa.nodeIndentPastParent = a, this.H())) + }); + u.defineProperty(Y, {nodeSpacing: "nodeSpacing"}, function () { + return this.qa.nodeSpacing + }, function (a) { + this.qa.nodeSpacing !== a && (u.j(a, "number", Y, "nodeSpacing"), this.qa.nodeSpacing = a, this.H()) + }); + u.defineProperty(Y, {layerSpacing: "layerSpacing"}, function () { + return this.qa.layerSpacing + }, function (a) { + this.qa.layerSpacing !== a && (u.j(a, "number", Y, "layerSpacing"), this.qa.layerSpacing = a, this.H()) + }); + u.defineProperty(Y, {layerSpacingParentOverlap: "layerSpacingParentOverlap"}, function () { + return this.qa.layerSpacingParentOverlap + }, function (a) { + this.qa.layerSpacingParentOverlap !== a && (u.j(a, "number", Y, "layerSpacingParentOverlap"), 0 <= a && 1 >= a && (this.qa.layerSpacingParentOverlap = a, this.H())) + }); + u.defineProperty(Y, {compaction: "compaction"}, function () { + return this.qa.compaction + }, function (a) { + this.qa.compaction !== a && (u.rb(a, Y, Y, "compaction"), a === ur || a === wr) && (this.qa.compaction = a, this.H()) + }); + u.defineProperty(Y, {breadthLimit: "breadthLimit"}, function () { + return this.qa.breadthLimit + }, function (a) { + this.qa.breadthLimit !== a && (u.j(a, "number", Y, "breadthLimit"), 0 <= a && (this.qa.breadthLimit = a, this.H())) + }); + u.defineProperty(Y, {rowSpacing: "rowSpacing"}, function () { + return this.qa.rowSpacing + }, function (a) { + this.qa.rowSpacing !== a && (u.j(a, "number", Y, "rowSpacing"), this.qa.rowSpacing = a, this.H()) + }); + u.defineProperty(Y, {rowIndent: "rowIndent"}, function () { + return this.qa.rowIndent + }, function (a) { + this.qa.rowIndent !== a && (u.j(a, "number", Y, "rowIndent"), 0 <= a && (this.qa.rowIndent = a, this.H())) + }); + u.defineProperty(Y, {commentSpacing: "commentSpacing"}, function () { + return this.qa.commentSpacing + }, function (a) { + this.qa.commentSpacing !== a && (u.j(a, "number", Y, "commentSpacing"), this.qa.commentSpacing = a, this.H()) + }); + u.defineProperty(Y, {commentMargin: "commentMargin"}, function () { + return this.qa.commentMargin + }, function (a) { + this.qa.commentMargin !== a && (u.j(a, "number", Y, "commentMargin"), this.qa.commentMargin = a, this.H()) + }); + u.defineProperty(Y, {setsPortSpot: "setsPortSpot"}, function () { + return this.qa.setsPortSpot + }, function (a) { + this.qa.setsPortSpot !== a && (u.j(a, "boolean", Y, "setsPortSpot"), this.qa.setsPortSpot = a, this.H()) + }); + u.defineProperty(Y, {portSpot: "portSpot"}, function () { + return this.qa.portSpot + }, function (a) { + u.C(a, L, Y, "portSpot"); + this.qa.portSpot.L(a) || (this.qa.portSpot = a, this.H()) + }); + u.defineProperty(Y, {setsChildPortSpot: "setsChildPortSpot"}, function () { + return this.qa.setsChildPortSpot + }, function (a) { + this.qa.setsChildPortSpot !== a && (u.j(a, "boolean", Y, "setsChildPortSpot"), this.qa.setsChildPortSpot = a, this.H()) + }); + u.defineProperty(Y, {childPortSpot: "childPortSpot"}, function () { + return this.qa.childPortSpot + }, function (a) { + u.C(a, L, Y, "childPortSpot"); + this.qa.childPortSpot.L(a) || (this.qa.childPortSpot = a, this.H()) + }); + u.defineProperty(Y, {$I: "alternateSorting"}, function () { + return this.pa.sorting + }, function (a) { + this.pa.sorting !== a && (u.rb(a, Y, Y, "alternateSorting"), a === jr || a === kr || a === lr || mr) && (this.pa.sorting = a, this.H()) + }); + u.defineProperty(Y, {NI: "alternateComparer"}, function () { + return this.pa.comparer + }, function (a) { + this.pa.comparer !== a && (u.j(a, "function", Y, "alternateComparer"), this.pa.comparer = a, this.H()) + }); + u.defineProperty(Y, {HI: "alternateAngle"}, function () { + return this.pa.angle + }, function (a) { + this.pa.angle !== a && (u.j(a, "number", Y, "alternateAngle"), 0 === a || 90 === a || 180 === a || 270 === a) && (this.pa.angle = a, this.H()) + }); + u.defineProperty(Y, {GI: "alternateAlignment"}, function () { + return this.pa.alignment + }, function (a) { + this.pa.alignment !== a && (u.rb(a, Y, Y, "alternateAlignment"), this.pa.alignment = a, this.H()) + }); + u.defineProperty(Y, {SI: "alternateNodeIndent"}, function () { + return this.pa.nodeIndent + }, function (a) { + this.pa.nodeIndent !== a && (u.j(a, "number", Y, "alternateNodeIndent"), 0 <= a && (this.pa.nodeIndent = a, this.H())) + }); + u.defineProperty(Y, {TI: "alternateNodeIndentPastParent"}, function () { + return this.pa.nodeIndentPastParent + }, function (a) { + this.pa.nodeIndentPastParent !== a && (u.j(a, "number", Y, "alternateNodeIndentPastParent"), 0 <= a && 1 >= a && (this.pa.nodeIndentPastParent = a, this.H())) + }); + u.defineProperty(Y, {UI: "alternateNodeSpacing"}, function () { + return this.pa.nodeSpacing + }, function (a) { + this.pa.nodeSpacing !== a && (u.j(a, "number", Y, "alternateNodeSpacing"), this.pa.nodeSpacing = a, this.H()) + }); + u.defineProperty(Y, {QI: "alternateLayerSpacing"}, function () { + return this.pa.layerSpacing + }, function (a) { + this.pa.layerSpacing !== a && (u.j(a, "number", Y, "alternateLayerSpacing"), this.pa.layerSpacing = a, this.H()) + }); + u.defineProperty(Y, {RI: "alternateLayerSpacingParentOverlap"}, function () { + return this.pa.layerSpacingParentOverlap + }, function (a) { + this.pa.layerSpacingParentOverlap !== a && (u.j(a, "number", Y, "alternateLayerSpacingParentOverlap"), 0 <= a && 1 >= a && (this.pa.layerSpacingParentOverlap = a, this.H())) + }); + u.defineProperty(Y, {MI: "alternateCompaction"}, function () { + return this.pa.compaction + }, function (a) { + this.pa.compaction !== a && (u.rb(a, Y, Y, "alternateCompaction"), a === ur || a === wr) && (this.pa.compaction = a, this.H()) + }); + u.defineProperty(Y, {II: "alternateBreadthLimit"}, function () { + return this.pa.breadthLimit + }, function (a) { + this.pa.breadthLimit !== a && (u.j(a, "number", Y, "alternateBreadthLimit"), 0 <= a && (this.pa.breadthLimit = a, this.H())) + }); + u.defineProperty(Y, {XI: "alternateRowSpacing"}, function () { + return this.pa.rowSpacing + }, function (a) { + this.pa.rowSpacing !== a && (u.j(a, "number", Y, "alternateRowSpacing"), this.pa.rowSpacing = a, this.H()) + }); + u.defineProperty(Y, {WI: "alternateRowIndent"}, function () { + return this.pa.rowIndent + }, function (a) { + this.pa.rowIndent !== a && (u.j(a, "number", Y, "alternateRowIndent"), 0 <= a && (this.pa.rowIndent = a, this.H())) + }); + u.defineProperty(Y, {LI: "alternateCommentSpacing"}, function () { + return this.pa.commentSpacing + }, function (a) { + this.pa.commentSpacing !== a && (u.j(a, "number", Y, "alternateCommentSpacing"), this.pa.commentSpacing = a, this.H()) + }); + u.defineProperty(Y, {KI: "alternateCommentMargin"}, function () { + return this.pa.commentMargin + }, function (a) { + this.pa.commentMargin !== a && (u.j(a, "number", Y, "alternateCommentMargin"), this.pa.commentMargin = a, this.H()) + }); + u.defineProperty(Y, {ZI: "alternateSetsPortSpot"}, function () { + return this.pa.setsPortSpot + }, function (a) { + this.pa.setsPortSpot !== a && (u.j(a, "boolean", Y, "alternateSetsPortSpot"), this.pa.setsPortSpot = a, this.H()) + }); + u.defineProperty(Y, {VI: "alternatePortSpot"}, function () { + return this.pa.portSpot + }, function (a) { + u.C(a, L, Y, "alternatePortSpot"); + this.pa.portSpot.L(a) || (this.pa.portSpot = a, this.H()) + }); + u.defineProperty(Y, {YI: "alternateSetsChildPortSpot"}, function () { + return this.pa.setsChildPortSpot + }, function (a) { + this.pa.setsChildPortSpot !== a && (u.j(a, "boolean", Y, "alternateSetsChildPortSpot"), this.pa.setsChildPortSpot = a, this.H()) + }); + u.defineProperty(Y, {JI: "alternateChildPortSpot"}, function () { + return this.pa.childPortSpot + }, function (a) { + u.C(a, L, Y, "alternateChildPortSpot"); + this.pa.childPortSpot.L(a) || (this.pa.childPortSpot = a, this.H()) + }); + var Pq; + Y.PathDefault = Pq = u.s(Y, "PathDefault", -1); + var Qq; + Y.PathDestination = Qq = u.s(Y, "PathDestination", 0); + var Xq; + Y.PathSource = Xq = u.s(Y, "PathSource", 1); + var jr; + Y.SortingForwards = jr = u.s(Y, "SortingForwards", 10); + var kr; + Y.SortingReverse = kr = u.s(Y, "SortingReverse", 11); + var lr; + Y.SortingAscending = lr = u.s(Y, "SortingAscending", 12); + var mr; + Y.SortingDescending = mr = u.s(Y, "SortingDescending", 13); + var Kr; + Y.AlignmentCenterSubtrees = Kr = u.s(Y, "AlignmentCenterSubtrees", 20); + var nr; + Y.AlignmentCenterChildren = nr = u.s(Y, "AlignmentCenterChildren", 21); + var yr; + Y.AlignmentStart = yr = u.s(Y, "AlignmentStart", 22); + var zr; + Y.AlignmentEnd = zr = u.s(Y, "AlignmentEnd", 23); + var pr; + Y.AlignmentBus = pr = u.s(Y, "AlignmentBus", 24); + var er; + Y.AlignmentBusBranching = er = u.s(Y, "AlignmentBusBranching", 25); + var qr; + Y.AlignmentTopLeftBus = qr = u.s(Y, "AlignmentTopLeftBus", 26); + var rr; + Y.AlignmentBottomRightBus = rr = u.s(Y, "AlignmentBottomRightBus", 27); + var ur; + Y.CompactionNone = ur = u.s(Y, "CompactionNone", 30); + var wr; + Y.CompactionBlock = wr = u.s(Y, "CompactionBlock", 31); + var Rq; + Y.StyleLayered = Rq = u.s(Y, "StyleLayered", 40); + var ir; + Y.StyleLastParents = ir = u.s(Y, "StyleLastParents", 41); + var hr; + Y.StyleAlternating = hr = u.s(Y, "StyleAlternating", 42); + var gr; + Y.StyleRootOnly = gr = u.s(Y, "StyleRootOnly", 43); + var Tq; + Y.ArrangementVertical = Tq = u.s(Y, "ArrangementVertical", 50); + var Yr; + Y.ArrangementHorizontal = Yr = u.s(Y, "ArrangementHorizontal", 51); + var Wq; + Y.ArrangementFixedRoots = Wq = u.s(Y, "ArrangementFixedRoots", 52); + var Sq; + Y.LayerIndividual = Sq = u.s(Y, "LayerIndividual", 60); + var cr; + Y.LayerSiblings = cr = u.s(Y, "LayerSiblings", 61); + var br; + Y.LayerUniform = br = u.s(Y, "LayerUniform", 62); + + function Vq() { + xa.call(this) + } + + u.Ga(Vq, xa); + u.fa("TreeNetwork", Vq); + Vq.prototype.createVertex = function () { + return new Uq + }; + Vq.prototype.createEdge = function () { + return new $r + }; + + function Uq() { + ya.call(this); + this.initialized = !1; + this.parent = null; + this.children = []; + this.maxGenerationCount = this.maxChildrenCount = this.descendantCount = this.level = 0; + this.comments = null; + this.ia = new w(0, 0); + this.Ya = new ia(0, 0); + this.Ia = new w(0, 0); + this.cp = this.bp = this.aI = !1; + this.jt = this.Ss = null; + this.sorting = jr; + this.comparer = dp; + this.angle = 0; + this.alignment = nr; + this.nodeIndentPastParent = this.nodeIndent = 0; + this.nodeSpacing = 20; + this.layerSpacing = 50; + this.layerSpacingParentOverlap = 0; + this.compaction = wr; + this.breadthLimit = + 0; + this.rowSpacing = 25; + this.commentSpacing = this.rowIndent = 10; + this.commentMargin = 20; + this.setsPortSpot = !0; + this.portSpot = uc; + this.setsChildPortSpot = !0; + this.childPortSpot = uc + } + + u.Ga(Uq, ya); + u.fa("TreeVertex", Uq); + Uq.prototype.copyInheritedPropertiesFrom = function (a) { + null !== a && (this.sorting = a.sorting, this.comparer = a.comparer, this.angle = a.angle, this.alignment = a.alignment, this.nodeIndent = a.nodeIndent, this.nodeIndentPastParent = a.nodeIndentPastParent, this.nodeSpacing = a.nodeSpacing, this.layerSpacing = a.layerSpacing, this.layerSpacingParentOverlap = a.layerSpacingParentOverlap, this.compaction = a.compaction, this.breadthLimit = a.breadthLimit, this.rowSpacing = a.rowSpacing, this.rowIndent = a.rowIndent, this.commentSpacing = a.commentSpacing, + this.commentMargin = a.commentMargin, this.setsPortSpot = a.setsPortSpot, this.portSpot = a.portSpot, this.setsChildPortSpot = a.setsChildPortSpot, this.childPortSpot = a.childPortSpot) + }; + u.u(Uq, {qm: "childrenCount"}, function () { + return this.children.length + }); + u.defineProperty(Uq, {pK: "relativePosition"}, function () { + return this.ia + }, function (a) { + this.ia.set(a) + }); + u.defineProperty(Uq, {zK: "subtreeSize"}, function () { + return this.Ya + }, function (a) { + this.Ya.set(a) + }); + u.defineProperty(Uq, {yK: "subtreeOffset"}, function () { + return this.Ia + }, function (a) { + this.Ia.set(a) + }); + + function $r() { + Aa.call(this); + this.nr = new w(0, 0) + } + + u.Ga($r, Aa); + u.fa("TreeEdge", $r); + $r.prototype.commit = function () { + var a = this.link; + if (null !== a && !a.el) { + var b = this.network.Qb, c = null, d = null; + switch (b.Af) { + case Qq: + c = this.fromVertex; + d = this.toVertex; + break; + case Xq: + c = this.toVertex; + d = this.fromVertex; + break; + default: + u.k("Unhandled path value " + b.Af.toString()) + } + if (null !== c && null !== d) if (b = this.nr, 0 !== b.x || 0 !== b.y || c.aI) { + var d = c.kb, e = xr(c), f = Ar(c), h = c.rowSpacing; + a.updateRoute(); + var k = a.Ve === kh, l = a.dc, m = 0, n, p; + a.rl(); + if (l || k) { + for (m = 2; 4 < a.ka;) a.nE(2); + n = a.l(1); + p = a.l(2) + } else { + for (m = 1; 3 < a.ka;) a.nE(1); + n = + a.l(0); + p = a.l(a.ka - 1) + } + var q = a.l(a.ka - 1), r = 0; + 0 === e ? (c.alignment === zr ? (r = d.bottom + b.y, 0 === b.y && n.y > q.y + c.rowIndent && (r = Math.min(r, Math.max(n.y, r - Br(c))))) : c.alignment === yr ? (r = d.top + b.y, 0 === b.y && n.y < q.y - c.rowIndent && (r = Math.max(r, Math.min(n.y, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.top - c.Ia.y + b.y : d.y + d.height / 2 + b.y, k ? (a.w(m, n.x, r), m++, a.w(m, d.right + f, r), m++, a.w(m, d.right + f + (b.x - h) / 3, r), m++, a.w(m, d.right + f + 2 * (b.x - h) / 3, r), m++, a.w(m, d.right + f + (b.x - h), r), m++, a.w(m, p.x, r)) : (l && (a.w(m, d.right + + f / 2, n.y), m++), a.w(m, d.right + f / 2, r), m++, a.w(m, d.right + f + b.x - (l ? h / 2 : h), r), m++, l && a.w(m, a.l(m - 1).x, p.y))) : 90 === e ? (c.alignment === zr ? (r = d.right + b.x, 0 === b.x && n.x > q.x + c.rowIndent && (r = Math.min(r, Math.max(n.x, r - Br(c))))) : c.alignment === yr ? (r = d.left + b.x, 0 === b.x && n.x < q.x - c.rowIndent && (r = Math.max(r, Math.min(n.x, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.left - c.Ia.x + b.x : d.x + d.width / 2 + b.x, k ? (a.w(m, r, n.y), m++, a.w(m, r, d.bottom + f), m++, a.w(m, r, d.bottom + f + (b.y - h) / 3), m++, a.w(m, r, d.bottom + f + 2 * (b.y - h) / 3), m++, + a.w(m, r, d.bottom + f + (b.y - h)), m++, a.w(m, r, p.y)) : (l && (a.w(m, n.x, d.bottom + f / 2), m++), a.w(m, r, d.bottom + f / 2), m++, a.w(m, r, d.bottom + f + b.y - (l ? h / 2 : h)), m++, l && a.w(m, p.x, a.l(m - 1).y))) : 180 === e ? (c.alignment === zr ? (r = d.bottom + b.y, 0 === b.y && n.y > q.y + c.rowIndent && (r = Math.min(r, Math.max(n.y, r - Br(c))))) : c.alignment === yr ? (r = d.top + b.y, 0 === b.y && n.y < q.y - c.rowIndent && (r = Math.max(r, Math.min(n.y, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.top - c.Ia.y + b.y : d.y + d.height / 2 + b.y, k ? (a.w(m, n.x, r), m++, a.w(m, d.left - f, r), m++, a.w(m, + d.left - f + (b.x + h) / 3, r), m++, a.w(m, d.left - f + 2 * (b.x + h) / 3, r), m++, a.w(m, d.left - f + (b.x + h), r), m++, a.w(m, p.x, r)) : (l && (a.w(m, d.left - f / 2, n.y), m++), a.w(m, d.left - f / 2, r), m++, a.w(m, d.left - f + b.x + (l ? h / 2 : h), r), m++, l && a.w(m, a.l(m - 1).x, p.y))) : 270 === e ? (c.alignment === zr ? (r = d.right + b.x, 0 === b.x && n.x > q.x + c.rowIndent && (r = Math.min(r, Math.max(n.x, r - Br(c))))) : c.alignment === yr ? (r = d.left + b.x, 0 === b.x && n.x < q.x - c.rowIndent && (r = Math.max(r, Math.min(n.x, r + Br(c))))) : r = c.bp || c.cp && 1 === c.maxGenerationCount ? d.left - c.Ia.x + b.x : d.x + d.width / + 2 + b.x, k ? (a.w(m, r, n.y), m++, a.w(m, r, d.top - f), m++, a.w(m, r, d.top - f + (b.y + h) / 3), m++, a.w(m, r, d.top - f + 2 * (b.y + h) / 3), m++, a.w(m, r, d.top - f + (b.y + h)), m++, a.w(m, r, p.y)) : (l && (a.w(m, n.x, d.top - f / 2), m++), a.w(m, r, d.top - f / 2), m++, a.w(m, r, d.top - f + b.y + (l ? h / 2 : h)), m++, l && a.w(m, p.x, a.l(m - 1).y))) : u.k("Invalid angle " + e); + a.Bi() + } else e = c, f = d, a = this.link, c = xr(e), c !== xr(f) && (b = Ar(e), d = e.kb, e = f.kb, 0 === c && e.left - d.right < b + 1 || 90 === c && e.top - d.bottom < b + 1 || 180 === c && d.left - e.right < b + 1 || 270 === c && d.top - e.bottom < b + 1 || (a.updateRoute(), e = a.Ve === + kh, f = a.dc, h = or(this.fromVertex.alignment), a.rl(), 0 === c ? (c = d.right + b / 2, e ? 4 === a.ka && (b = a.l(3).y, a.V(1, c - 20, a.l(1).y), a.w(2, c - 20, b), a.w(3, c, b), a.w(4, c + 20, b), a.V(5, a.l(5).x, b)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, c, a.l(2).y), a.V(3, c, a.l(3).y)) : 4 === a.ka ? a.w(2, c, a.l(2).y) : 3 === a.ka ? a.V(1, c, a.l(2).y) : 2 === a.ka && a.w(1, c, a.l(1).y)) : 90 === c ? (b = d.bottom + b / 2, e ? 4 === a.ka && (c = a.l(3).x, a.V(1, a.l(1).x, b - 20), a.w(2, c, b - 20), a.w(3, c, b), a.w(4, c, b + 20), a.V(5, c, a.l(5).y)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, + a.l(2).x, b), a.V(3, a.l(3).x, b)) : 4 === a.ka ? a.w(2, a.l(2).x, b) : 3 === a.ka ? a.V(1, a.l(2).x, b) : 2 === a.ka && a.w(1, a.l(1).x, b)) : 180 === c ? (c = d.left - b / 2, e ? 4 === a.ka && (b = a.l(3).y, a.V(1, c + 20, a.l(1).y), a.w(2, c + 20, b), a.w(3, c, b), a.w(4, c - 20, b), a.V(5, a.l(5).x, b)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, c, a.l(2).y), a.V(3, c, a.l(3).y)) : 4 === a.ka ? a.w(2, c, a.l(2).y) : 3 === a.ka ? a.V(1, c, a.l(2).y) : 2 === a.ka && a.w(1, c, a.l(1).y)) : 270 === c && (b = d.top - b / 2, e ? 4 === a.ka && (c = a.l(3).x, a.V(1, a.l(1).x, b + 20), a.w(2, c, b + 20), a.w(3, c, b), a.w(4, c, b - + 20), a.V(5, c, a.l(5).y)) : f ? h ? a.V(3, a.l(2).x, a.l(4).y) : 6 === a.ka && (a.V(2, a.l(2).x, b), a.V(3, a.l(3).x, b)) : 4 === a.ka ? a.w(2, a.l(2).x, b) : 3 === a.ka ? a.V(1, a.l(2).x, b) : 2 === a.ka && a.w(1, a.l(1).x, b)), a.Bi())) + } + }; + u.defineProperty($r, {oK: "relativePoint"}, function () { + return this.nr + }, function (a) { + this.nr.set(a) + }); + + function as() { + this.xn = [] + } + + function Ql(a) { + var b = new as, c = null; + "string" === typeof a ? c = (new DOMParser).parseFromString(a, "text/xml") : a instanceof Document && (c = a.implementation.createDocument("http://www.w3.org/2000/svg", "svg", null), c.appendChild(c.importNode(a.documentElement, !0))); + if (null === c) return null; + a = c.getElementsByTagName("svg"); + if (0 === a.length) return null; + var d = a[0], e = c.getElementsByTagName("linearGradient"), f = c.getElementsByTagName("radialGradient"); + for (a = 0; a < e.length; a++) { + for (var h = e[a], k = Rl(ga, ue, {start: Dc, end: Kc}), + l = h.childNodes, m = 0; m < l.length; m++) if ("stop" === l[m].tagName) { + var n = bs(b, l[m], "stop-color"); + if (null !== n && "" !== n) { + var p = bs(b, l[m], "offset"); + if (null === p || "" === p) p = "0"; + var q = parseFloat(p); + isNaN(q) && (q = 0); + k.addColorStop((-1 !== p.indexOf("%") ? .01 : 1) * q, n) + } + } + h = h.getAttribute("id"); + "string" === typeof h && (b["_brush" + h] = k) + } + for (a = 0; a < f.length; a++) { + h = f[a]; + k = Rl(ga, ve, {start: Ib, end: Ib}); + l = h.childNodes; + for (m = 0; m < l.length; m++) if ("stop" === l[m].tagName && (n = bs(b, l[m], "stop-color"), null !== n && "" !== n)) { + p = bs(b, l[m], "offset"); + if (null === p || "" === p) p = "0"; + q = parseFloat(p); + isNaN(q) && (q = 0); + k.addColorStop((-1 !== p.indexOf("%") ? .01 : 1) * q, n) + } + h = h.getAttribute("id"); + "string" === typeof h && (b["_brush" + h] = k) + } + for (e = !0; e;) for (e = !1, f = c.getElementsByTagName("use"), a = 0; a < f.length; a++) k = f[a], 0 === k.childNodes.length && (h = k.href, void 0 !== h && (h = c.getElementById(h.baseVal.substring(1)), null !== h && (h = h.cloneNode(!0), h.removeAttribute("id"), l = parseFloat(k.getAttribute("x")), isNaN(l) && (l = 0), m = parseFloat(k.getAttribute("y")), isNaN(m) && (m = 0), n = k.getAttribute("transform"), + null === n && (n = ""), k.setAttribute("transform", n + " translate(" + l + "," + m + ")"), k.appendChild(h), "use" === h.tagName && (e = !0)))); + cs(b, d, null); + c = new A; + if (0 === b.xn.length) return c; + if (1 === b.xn.length) return b.xn[0]; + for (a = 0; a < b.xn.length; a++) c.add(b.xn[a]); + return c + } + + function ds(a, b) { + var c = a.getAttribute(b); + "string" !== typeof c && a.style && (c = a.style[b]); + return "string" !== typeof c ? null : c + } + + function bs(a, b, c) { + var d = b.getAttribute(c); + "string" !== typeof d && b.style && (d = b.style[c]); + return "string" !== typeof d || "" === d || "inherit" === d ? (b = b.parentNode, "g" === b.tagName || "use" === b.tagName ? bs(a, b, c) : null) : d + } + + function cs(a, b, c) { + var d = b.tagName; + if (("g" === d || "svg" === d || "use" === d || "symbol" === d) && "none" !== bs(a, b, "display")) { + for (var d = b.childNodes, e = 0; e < d.length; e++) { + var f = d[e], h = null; + if (void 0 !== f.getAttribute) { + var k = f.getAttribute("transform"); + switch (f.tagName) { + case "g": + null === k ? cs(a, f, null) : (h = new A, cs(a, f, h)); + break; + case "use": + null === k ? cs(a, f, null) : (h = new A, cs(a, f, h)); + break; + case "symbol": + if ("use" !== b.tagName) break; + h = new A; + cs(a, f, h); + var l = h, m = a, n = f; + bs(m, n, "preserveAspectRatio"); + bs(m, n, "viewBox"); + l.scale = + 1; + break; + case "path": + l = f; + h = new X; + l = l.getAttribute("d"); + "string" === typeof l && (h.EG = rd(l)); + break; + case "line": + var p = f, h = new X, l = parseFloat(p.getAttribute("x1")); + isNaN(l) && (l = 0); + m = parseFloat(p.getAttribute("y1")); + isNaN(m) && (m = 0); + n = parseFloat(p.getAttribute("x2")); + isNaN(n) && (n = 0); + p = parseFloat(p.getAttribute("y2")); + isNaN(p) && (p = 0); + var q = new $c(dd); + h.position = new w(Math.min(l, n), Math.min(m, p)); + 0 < (n - l) / (p - m) ? (q.ua = 0, q.va = 0, q.F = Math.abs(n - l), q.G = Math.abs(p - m)) : (q.ua = 0, q.va = Math.abs(p - m), q.F = Math.abs(n - l), q.G = + 0); + h.dd = q; + break; + case "circle": + n = f; + h = new X; + l = parseFloat(n.getAttribute("r")); + isNaN(l) || 0 > l ? h = null : (m = parseFloat(n.getAttribute("cx")), isNaN(m) && (m = 0), n = parseFloat(n.getAttribute("cy")), isNaN(n) && (n = 0), p = new $c(nd), p.ua = 0, p.va = 0, p.F = 2 * l, p.G = 2 * l, h.position = new w(m - l, n - l), h.dd = p); + break; + case "ellipse": + p = f; + h = new X; + l = parseFloat(p.getAttribute("rx")); + isNaN(l) || 0 > l ? h = null : (m = parseFloat(p.getAttribute("ry")), isNaN(m) || 0 > m ? h = null : (n = parseFloat(p.getAttribute("cx")), isNaN(n) && (n = 0), p = parseFloat(p.getAttribute("cy")), + isNaN(p) && (p = 0), q = new $c(nd), q.ua = 0, q.va = 0, q.F = 2 * l, q.G = 2 * m, h.position = new w(n - l, p - m), h.dd = q)); + break; + case "rect": + q = f; + h = new X; + l = parseFloat(q.getAttribute("width")); + if (isNaN(l) || 0 > l) h = null; else if (m = parseFloat(q.getAttribute("height")), isNaN(m) || 0 > m) h = null; else { + n = parseFloat(q.getAttribute("x")); + isNaN(n) && (n = 0); + p = parseFloat(q.getAttribute("y")); + isNaN(p) && (p = 0); + var r = q.getAttribute("rx"), s = q.getAttribute("ry"), q = parseFloat(r); + if (isNaN(q) || 0 > q) q = 0; + var t = parseFloat(s); + if (isNaN(t) || 0 > t) t = 0; + null !== r && "" !== + r || null === s || "" === s ? null === r || "" === r || null !== s && "" !== s || (t = q) : q = t; + q = Math.min(q, l / 2); + t = Math.min(t, m / 2); + s = void 0; + 0 === q && 0 === t ? (s = new $c(md), s.ua = 0, s.va = 0, s.F = l, s.G = m) : (s = K.sa / 2, r = u.p(), M(r, q, 0, !0), r.lineTo(l - q, 0), O(r, l - q * s, 0, l, t * s, l, t), r.lineTo(l, m - t), O(r, l, m - t * s, l - q * s, m, l - q, m), r.lineTo(q, m), O(r, q * s, m, 0, m - t * s, 0, m - t), r.lineTo(0, t), O(r, 0, t * s, q * s, 0, q, 0), P(r), s = r.o, u.q(r)); + h.position = new w(n, p); + h.dd = s + } + break; + case "polygon": + h = es(f); + break; + case "polyline": + h = es(f) + } + if (null !== h) { + if (h instanceof X) { + m = h; + l = bs(a, + f, "fill"); + null !== l && -1 !== l.indexOf("url") ? (l = l.substring(l.indexOf("#") + 1, l.length - 1), l = a["_brush" + l], m.fill = l instanceof ga ? l : "black") : m.fill = null === l ? "black" : "none" === l ? null : l; + l = bs(a, f, "stroke"); + null !== l && -1 !== l.indexOf("url") ? (l = l.substring(l.indexOf("#") + 1, l.length - 1), l = a["_brush" + l], m.stroke = l instanceof ga ? l : "black") : m.stroke = "none" === l ? null : l; + l = parseFloat(bs(a, f, "stroke-width")); + isNaN(l) || (m.hb = l); + l = bs(a, f, "stroke-linecap"); + null !== l && (m.qI = l); + l = bs(a, f, "stroke-dasharray"); + if (null !== l && "" !== + l) { + n = l.split(","); + p = []; + for (l = 0; l < n.length; l++) q = parseFloat(n[l]), !isNaN(q) && 0 < q && p.push(q); + m.gA = p + } + f = bs(a, f, "stroke-dashoffset"); + null !== f && "" !== f && (f = parseFloat(f), isNaN(f) || (m.rI = f)); + m.rz = !0 + } + if (null !== k) { + k = k.split(")"); + f = !0; + for (l = 0; l < k.length; l++) /\(.*[^0-9\.,\s-]/.test(k[l]) && (f = !1), /\(.*[0-9]-[0-9]/.test(k[l]) && (f = !1); + if (f) for (l = k.length - 1; 0 <= l; l--) if (m = k[l], "" !== m) switch (n = m.indexOf("("), f = m.substring(0, n).replace(/\s*/, ""), n = m.substring(n + 1).split(/\s*[\s,]\s*/), f) { + case "rotate": + fs(a, h, n); + break; + case "translate": + f = h; + m = parseFloat(n[0]); + isNaN(m) && (m = 0); + n = parseFloat(n[1]); + isNaN(n) && (n = 0); + if (0 !== m || 0 !== n) p = f.position.copy(), isNaN(p.x) && (p.x = 0), isNaN(p.y) && (p.y = 0), f.position = new w(m + p.x, n + p.y); + break; + case "scale": + gs(a, h, n); + break; + case "skewX": + hs(a, h, n); + break; + case "skewY": + is(a, h, n); + break; + case "matrix": + js(a, h, n) + } + } + if (h instanceof A) { + k = h; + l = f = 0; + m = k.position.copy(); + isNaN(m.x) && (m.x = 0); + isNaN(m.y) && (m.y = 0); + for (n = k.elements.i; n.next();) p = n.value.position.copy(), isNaN(p.x) && (p.x = 0), isNaN(p.y) && (p.y = 0), p.x < + f && (f = p.x), p.y < l && (l = p.y); + m.x += f; + m.y += l; + k.position = m + } + null === c ? a.xn.push(h) : c.add(h) + } + } + } + if (null !== h) { + a = ds(b, "visibility"); + if ("hidden" === a || "collapse" === a) h.visible = !1; + b = ds(b, "opacity"); + null !== b && "" !== b && (b = parseFloat(b), isNaN(b) || (h.opacity = b)) + } + } + } + + function js(a, b, c) { + var d = parseFloat(c[0]), e = parseFloat(c[1]), f = parseFloat(c[2]), h = parseFloat(c[3]), + k = parseFloat(c[4]), l = parseFloat(c[5]); + if (!isNaN(d + e + f + h + k + l)) { + var m = b.position.copy(); + isNaN(m.x) && (m.x = 0); + isNaN(m.y) && (m.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + if (c.type === md) c = a.Xr(c); else if (c.type === nd) c = ks(c); else if (c.type === dd) { + c.type = ad; + a = new bd(c.ua, c.va); + var n = new Jd(pd, c.F, c.G); + a.Fa.add(n); + c.ub.add(a) + } + c.offset(m.x, m.y); + c.transform(d, e, f, h, k - m.x, l - m.y); + a = c.normalize(); + b.dd = c; + m.x -= a.x; + m.y -= a.y; + b.position = m + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) e = b.value, d = e.position.copy(), d.x += m.x, d.y += m.y, e.position = d; + for (b.reset(); b.next();) js(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= m.x, d.y -= m.y, a.position = d + } + } + } + + function fs(a, b, c) { + var d = parseFloat(c[0]); + isNaN(d) && (d = 0); + var e = parseFloat(c[1]); + isNaN(e) && (e = 0); + var f = parseFloat(c[2]); + isNaN(f) && (f = 0); + if (0 !== d) { + var h = d * Math.PI / 180, k = b.position.copy(); + isNaN(k.x) && (k.x = 0); + isNaN(k.y) && (k.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + c.type === nd ? c = ks(c) : c.type === md && (c = a.Xr(c)); + if (c.type === ad) c.rotate(d, e - k.x, f - k.y), f = c.normalize(), b.dd = c, k.x -= f.x, k.y -= f.y, b.position = k; else { + var d = c.ua - e + k.x, l = c.va - f + k.y, m = c.F - e + k.x, n = c.G - f + k.y; + a = d * Math.cos(h) - l * Math.sin(h) + e - k.x; + d = l * Math.cos(h) + + d * Math.sin(h) + f - k.y; + e = m * Math.cos(h) - n * Math.sin(h) + e - k.x; + f = n * Math.cos(h) + m * Math.sin(h) + f - k.y; + m = Math.min(a, e); + n = Math.min(d, f); + c.ua = a - m; + c.va = d - n; + c.F = e - m; + c.G = f - n; + k.x += m; + k.y += n; + b.position = k; + b.dd = c + } + b.fill instanceof ga && (k = b.fill.copy(), c = Math.atan((.5 - k.start.y) / (.5 - k.start.x)), isNaN(c) || (c += h, k.start = new L((1 - Math.cos(c)) / 2, (1 - Math.sin(c)) / 2), k.end = new L((1 + Math.cos(c)) / 2, (1 + Math.sin(c)) / 2)), b.fill = k); + b.stroke instanceof ga && (k = b.stroke.copy(), c = Math.atan((.5 - k.start.y) / (.5 - k.start.x)), isNaN(c) || (c += + h, k.start = new L((1 - Math.cos(c)) / 2, (1 - Math.sin(c)) / 2), k.end = new L((1 + Math.cos(c)) / 2, (1 + Math.sin(c)) / 2)), b.stroke = k) + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) f = b.value, h = f.position.copy(), h.x += k.x, h.y += k.y, f.position = h; + for (b.reset(); b.next();) fs(a, b.value, c); + for (b.reset(); b.next();) c = b.value, h = c.position.copy(), h.x -= k.x, h.y -= k.y, c.position = h + } + } + } + + function gs(a, b, c) { + var d = parseFloat(c[0]); + isNaN(d) && (d = 1); + var e = parseFloat(c[1]); + isNaN(e) && (e = d); + if (1 !== d || 1 !== e) { + var f = b.position.copy(); + isNaN(f.x) && (f.x = 0); + isNaN(f.y) && (f.y = 0); + if (b instanceof X) a = b.dd.copy(), f.x *= d, f.y *= e, b.position = f, a.scale(d, e), b.dd = a; else if (b instanceof A) { + for (b = b.elements.i; b.next();) e = b.value, d = e.position.copy(), d.x += f.x, d.y += f.y, e.position = d; + for (b.reset(); b.next();) gs(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= f.x, d.y -= f.y, a.position = d + } + } + } + + function hs(a, b, c) { + var d = parseFloat(c[0]); + if (!isNaN(d)) { + var d = d * Math.PI / 180, e = b.position.copy(); + isNaN(e.x) && (e.x = 0); + isNaN(e.y) && (e.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + if (c.type === md) c = a.Xr(c); else if (c.type === nd) c = ks(c); else if (c.type === dd) { + c.type = ad; + a = new bd(c.ua, c.va); + var f = new Jd(pd, c.F, c.G); + a.Fa.add(f); + c.ub.add(a) + } + c.offset(e.x, e.y); + c.transform(1, 0, Math.tan(d), 1, -e.x, -e.y); + a = c.normalize(); + b.dd = c; + e.x -= a.x; + e.y -= a.y; + b.position = e + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) d = b.value.position.copy(), + d.x += e.x, d.y += e.y, b.value.position = d; + for (b.reset(); b.next();) hs(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= e.x, d.y -= e.y, a.position = d + } + } + } + + function is(a, b, c) { + var d = parseFloat(c[0]); + if (!isNaN(d)) { + var d = d * Math.PI / 180, e = b.position.copy(); + isNaN(e.x) && (e.x = 0); + isNaN(e.y) && (e.y = 0); + if (b instanceof X) { + c = b.dd.copy(); + if (c.type === md) c = a.Xr(c); else if (c.type === nd) c = ks(c); else if (c.type === dd) { + c.type = ad; + a = new bd(c.ua, c.va); + var f = new Jd(pd, c.F, c.G); + a.Fa.add(f); + c.ub.add(a) + } + c.offset(e.x, e.y); + c.transform(1, Math.tan(d), 0, 1, -e.x, -e.y); + a = c.normalize(); + b.dd = c; + e.x -= a.x; + e.y -= a.y; + b.position = e + } else if (b instanceof A) { + for (b = b.elements.i; b.next();) f = b.value, d = f.position.copy(), + d.x += e.x, d.y += e.y, f.position = d; + for (b.reset(); b.next();) is(a, b.value, c); + for (b.reset(); b.next();) a = b.value, d = a.position.copy(), d.x -= e.x, d.y -= e.y, a.position = d + } + } + } + + function es(a) { + var b = !1; + if ("polygon" === a.tagName) b = !0; else if ("polyline" !== a.tagName) return null; + var c = new X, d = a.getAttribute("points"); + a = new $c; + var e = new E(bd), f = d.split(/\s*[\s,]\s*/); + if (4 > f.length) return null; + for (var d = null, h = new E(Jd), k = 1; k < f.length; k += 2) { + var l = parseFloat(f[k - 1]), m = parseFloat(f[k]); + if ("number" !== typeof l || isNaN(l) || "number" !== typeof m || isNaN(m)) return null; + 1 === k ? d = new bd(l, m) : h.add(new Jd(pd, l, m)) + } + b && (b = new Jd(pd, d.ua, d.va), b.close(), h.add(b)); + d.Fa = h; + e.add(d); + a.ub = e; + b = a.normalize(); + c.position = new w(-b.x, -b.y); + c.dd = a; + return c + } + + function ks(a) { + var b = a.ua, c = a.va, d = a.F, e = a.G, f = Math.abs(d - b) / 2, h = Math.abs(e - c) / 2, + b = Math.min(b, d) + f, c = Math.min(c, e) + h, e = new bd(b, c - h), d = new Jd(zd); + d.Rb = b + K.sa * f; + d.jc = c - h; + d.df = b + f; + d.ef = c - K.sa * h; + d.F = b + f; + d.G = c; + e.Fa.add(d); + d = new Jd(zd); + d.Rb = b + f; + d.jc = c + K.sa * h; + d.df = b + K.sa * f; + d.ef = c + h; + d.F = b; + d.G = c + h; + e.Fa.add(d); + d = new Jd(zd); + d.Rb = b - K.sa * f; + d.jc = c + h; + d.df = b - f; + d.ef = c + K.sa * h; + d.F = b - f; + d.G = c; + e.Fa.add(d); + d = new Jd(zd); + d.Rb = b - f; + d.jc = c - K.sa * h; + d.df = b - K.sa * f; + d.ef = c - h; + d.F = b; + d.G = c - h; + e.Fa.add(d); + a.type = ad; + a.ub.add(e); + return a + } + + as.prototype.Xr = function (a) { + var b = a.ua, c = a.va, d = a.F, e = a.G, f = Math.min(b, d), h = Math.min(c, e), b = Math.abs(d - b), + c = Math.abs(e - c), e = new bd(f, h); + e.Fa.add(new Jd(pd, f + b, h)); + e.Fa.add(new Jd(pd, f + b, h + c)); + e.Fa.add((new Jd(pd, f, h + c)).close()); + a.type = ad; + a.ub.add(e); + return a + }; + + function Vm() { + S.call(this); + this.Me = null + } + + u.Ga(Vm, S); + Vm.prototype.cloneProtected = function (a) { + S.prototype.cloneProtected.call(this, a); + a.element = this.Me.cloneNode(!0) + }; + Vm.prototype.toString = function () { + return "HTMLHost(" + this.Me.toString() + ")#" + u.Uc(this) + }; + Vm.prototype.Mj = function (a, b) { + var c = this.Me; + if (null !== c) { + var d = this.lb(Ib); + d.x -= this.ba.width / 2; + d.y -= this.ba.height / 2; + d.x -= this.ba.x; + d.y -= this.ba.y; + var d = b.VE(d), e = b.Vk; + null === e || e.contains(c) || e.appendChild(c); + e = this.transform; + c.style.transform = "matrix(" + e.m11 + "," + e.m12 + "," + e.m21 + "," + e.m22 + "," + e.dx + "," + e.dy + ")"; + c.style.transformOrigin = "0 0"; + e = d.y; + c.style.left = d.x + "px"; + c.style.top = e + "px" + } + }; + Vm.prototype.Oo = function (a, b, c, d) { + var e = this.xa; + isFinite(e.width) && (a = e.width); + isFinite(e.height) && (b = e.height); + var e = this.af, f = this.vg; + c = Math.max(c, f.width); + d = Math.max(d, f.height); + a = Math.min(e.width, a); + b = Math.min(e.height, b); + a = Math.max(c, a); + b = Math.max(d, b); + c = this.Me; + null !== c && (b = c.getBoundingClientRect(), a = b.width, b = b.height); + bb(this.Hc, a, b); + ml(this, 0, 0, a, b) + }; + Vm.prototype.xi = function (a, b, c, d) { + ql(this, a, b, c, d) + }; + u.u(Vm, {Ha: "naturalBounds"}, function () { + return this.Hc + }); + u.defineProperty(Vm, {element: "element"}, function () { + return this.Me + }, function (a) { + var b = this.Me; + b !== a && (a instanceof HTMLElement || u.k("HTMLHost.element must be an instance of HTMLElement."), this.Me = a, a.className = "HTMLHost", this.h("element", b, a), this.ma()) + }); + da.version = "1.5.9"; + window && (window.module && "object" === typeof window.module && "object" === typeof window.module.exports ? window.module.exports = da : window.define && "function" === typeof window.define && window.define.amd ? (window.go = da, window.define(da)) : window.go = da); +})(window); diff --git a/daliuge-translator/dlg/dropmake/web/jquery.min.map b/daliuge-translator/dlg/dropmake/web/jquery.min.map index 1528143c0..25beb38aa 100644 --- a/daliuge-translator/dlg/dropmake/web/jquery.min.map +++ b/daliuge-translator/dlg/dropmake/web/jquery.min.map @@ -1 +1,1211 @@ -{"version":3,"file":"jquery.min.js","sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","deletedIds","slice","concat","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","support","version","jQuery","selector","context","fn","init","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","toUpperCase","prototype","jquery","constructor","length","toArray","call","get","num","pushStack","elems","ret","merge","prevObject","each","callback","args","map","elem","i","apply","arguments","first","eq","last","len","j","end","sort","splice","extend","src","copyIsArray","copy","name","options","clone","target","deep","isFunction","isPlainObject","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","obj","type","Array","isWindow","isNumeric","parseFloat","isEmptyObject","key","nodeType","e","ownLast","globalEval","data","trim","execScript","camelCase","string","nodeName","toLowerCase","value","isArraylike","text","makeArray","arr","results","Object","inArray","max","second","grep","invert","callbackInverse","matches","callbackExpect","arg","guid","proxy","tmp","now","Date","split","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","sortOrder","a","b","MAX_NEGATIVE","pop","push_native","list","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rwhitespace","RegExp","rcomma","rcombinators","rattributeQuotes","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","rquickExpr","rsibling","rescape","runescape","funescape","_","escaped","escapedWhitespace","high","String","fromCharCode","unloadHandler","childNodes","els","seed","match","m","groups","old","nid","newContext","newSelector","ownerDocument","exec","getElementById","parentNode","id","getElementsByTagName","getElementsByClassName","qsa","test","getAttribute","setAttribute","toSelector","testContext","join","querySelectorAll","qsaError","removeAttribute","keys","cache","cacheLength","shift","markFunction","assert","div","createElement","removeChild","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","documentElement","node","hasCompare","parent","doc","defaultView","top","addEventListener","attachEvent","className","appendChild","createComment","getById","getElementsByName","find","filter","attrId","getAttributeNode","tag","innerHTML","input","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","val","specified","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">","dir"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","simple","forward","ofType","xml","outerCache","nodeIndex","start","useCache","lastChild","pseudo","setFilters","idx","matched","not","matcher","unmatched","has","innerText","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","disabled","checked","selected","selectedIndex","empty","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","submit","reset","filters","parseOnly","tokens","soFar","preFilters","cached","addCombinator","combinator","base","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","multipleContexts","contexts","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","div1","defaultValue","unique","isXMLDoc","rneedsContext","rsingleTag","risSimple","winnow","qualifier","self","is","rootjQuery","charAt","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","next","prev","until","sibling","n","r","targets","closest","l","pos","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","contentDocument","contentWindow","reverse","rnotwhite","optionsCache","createOptions","object","flag","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","stack","once","fire","stopOnFalse","disable","remove","lock","locked","fireWith","Deferred","func","tuples","state","promise","always","deferred","fail","then","fns","newDefer","tuple","returned","resolve","reject","progress","notify","pipe","stateString","when","subordinate","resolveValues","remaining","updateFunc","values","progressValues","notifyWith","resolveWith","progressContexts","resolveContexts","readyList","readyWait","holdReady","hold","wait","body","setTimeout","triggerHandler","off","detach","removeEventListener","completed","detachEvent","event","readyState","frameElement","doScroll","doScrollCheck","strundefined","inlineBlockNeedsLayout","container","style","cssText","zoom","offsetWidth","deleteExpando","acceptData","noData","rbrace","rmultiDash","dataAttr","parseJSON","isEmptyDataObject","internalData","pvt","thisCache","internalKey","isNode","toJSON","internalRemoveData","cleanData","applet ","embed ","object ","hasData","removeData","_data","_removeData","queue","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","cssExpand","isHidden","el","css","access","chainable","emptyGet","raw","bulk","rcheckableType","fragment","createDocumentFragment","leadingWhitespace","tbody","htmlSerialize","html5Clone","cloneNode","outerHTML","appendChecked","noCloneChecked","checkClone","noCloneEvent","click","eventName","change","focusin","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","returnTrue","returnFalse","safeActiveElement","err","types","events","t","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","handle","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","trigger","onlyHandlers","ontype","bubbleType","eventPath","Event","isTrigger","namespace_re","noBubble","parentWindow","isPropagationStopped","preventDefault","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","stopPropagation","postDispatch","sel","prop","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","props","srcElement","metaKey","original","which","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","scrollTop","clientTop","relatedTarget","toElement","load","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","timeStamp","cancelBubble","stopImmediatePropagation","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","submitBubbles","form","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","on","one","origFn","createSafeFragment","nodeNames","safeFrag","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","rchecked","rscriptType","rscriptTypeMasked","rcleanScript","wrapMap","option","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","getAll","found","fixDefaultChecked","defaultChecked","manipulationTarget","content","disableScript","restoreScript","setGlobalEval","refElements","cloneCopyEvent","dest","oldData","curData","fixCloneNodeIssues","defaultSelected","dataAndEvents","deepDataAndEvents","destElements","srcElements","inPage","buildFragment","scripts","selection","wrap","safe","nodes","createTextNode","append","domManip","prepend","insertBefore","before","after","keepData","html","replaceWith","replaceChild","hasScripts","set","iNoClone","_evalUrl","appendTo","prependTo","insertAfter","replaceAll","insert","iframe","elemdisplay","actualDisplay","display","getDefaultComputedStyle","defaultDisplay","write","close","shrinkWrapBlocksVal","shrinkWrapBlocks","width","rmargin","rnumnonpx","getStyles","curCSS","rposition","getComputedStyle","opener","computed","minWidth","maxWidth","getPropertyValue","currentStyle","left","rs","rsLeft","runtimeStyle","pixelLeft","addGetHookIf","conditionFn","hookFn","condition","pixelPositionVal","boxSizingReliableVal","reliableHiddenOffsetsVal","reliableMarginRightVal","opacity","cssFloat","backgroundClip","clearCloneStyle","boxSizing","MozBoxSizing","WebkitBoxSizing","reliableHiddenOffsets","computeStyleTests","boxSizingReliable","pixelPosition","reliableMarginRight","marginRight","offsetHeight","swap","ralpha","ropacity","rdisplayswap","rnumsplit","rrelNum","cssShow","position","visibility","cssNormalTransform","letterSpacing","fontWeight","cssPrefixes","vendorPropName","capName","origName","showHide","show","hidden","setPositiveNumber","subtract","augmentWidthOrHeight","extra","isBorderBox","styles","getWidthOrHeight","valueIsBorderBox","cssHooks","cssNumber","columnCount","fillOpacity","flexGrow","flexShrink","lineHeight","order","orphans","widows","zIndex","cssProps","float","$1","margin","padding","border","prefix","suffix","expand","expanded","parts","hide","toggle","Tween","easing","unit","propHooks","run","percent","eased","duration","step","tween","fx","linear","p","swing","cos","PI","fxNow","timerId","rfxtypes","rfxnum","rrun","animationPrefilters","defaultPrefilter","tweeners","*","createTween","scale","maxIterations","createFxNow","genFx","includeWidth","height","animation","collection","opts","oldfire","checkDisplay","anim","dataShow","unqueued","overflow","overflowX","overflowY","propFilter","specialEasing","Animation","properties","stopped","tick","currentTime","startTime","tweens","originalProperties","originalOptions","gotoEnd","rejectWith","timer","complete","tweener","prefilter","speed","opt","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","time","timeout","clearTimeout","getSetAttribute","hrefNormalized","checkOn","optSelected","enctype","optDisabled","radioValue","rreturn","valHooks","optionSet","scrollHeight","nodeHook","boolHook","ruseDefault","getSetInput","removeAttr","nType","attrHooks","propName","attrNames","propFix","getter","setAttributeNode","createAttribute","coords","contenteditable","rfocusable","rclickable","removeProp","for","class","notxml","tabindex","parseInt","rclass","addClass","classes","clazz","finalValue","proceed","removeClass","toggleClass","stateVal","classNames","hasClass","hover","fnOver","fnOut","bind","unbind","delegate","undelegate","nonce","rquery","rvalidtokens","JSON","parse","requireNonComma","depth","str","comma","open","Function","parseXML","DOMParser","parseFromString","ActiveXObject","async","loadXML","ajaxLocParts","ajaxLocation","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","transports","allTypes","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","ajaxHandleResponses","s","responses","firstDataType","ct","finalDataType","mimeType","getResponseHeader","converters","ajaxConvert","response","isSuccess","conv2","current","conv","responseFields","dataFilter","active","lastModified","etag","url","isLocal","processData","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","cacheURL","responseHeadersString","timeoutTimer","fireGlobals","transport","responseHeaders","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getAllResponseHeaders","setRequestHeader","lname","overrideMimeType","code","status","abort","statusText","finalText","success","method","crossDomain","traditional","hasContent","ifModified","headers","beforeSend","send","nativeStatusText","modified","getJSON","getScript","throws","wrapAll","wrapInner","unwrap","visible","r20","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","v","encodeURIComponent","serialize","serializeArray","xhr","createStandardXHR","createActiveXHR","xhrId","xhrCallbacks","xhrSupported","cors","username","xhrFields","isAbort","onreadystatechange","responseText","XMLHttpRequest","script","text script","head","scriptCharset","charset","onload","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","getWindow","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","defaultExtra","funcName","size","andSelf","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAcC,SAAUA,EAAQC,GAEK,gBAAXC,SAAiD,gBAAnBA,QAAOC,QAQhDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,KAAM,IAAIE,OAAO,2CAElB,OAAOL,GAASI,IAGlBJ,EAASD,IAIS,mBAAXO,QAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAQnE,GAAIC,MAEAC,EAAQD,EAAWC,MAEnBC,EAASF,EAAWE,OAEpBC,EAAOH,EAAWG,KAElBC,EAAUJ,EAAWI,QAErBC,KAEAC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,KAKHC,EAAU,SAGVC,EAAS,SAAUC,EAAUC,GAG5B,MAAO,IAAIF,GAAOG,GAAGC,KAAMH,EAAUC,IAKtCG,EAAQ,qCAGRC,EAAY,QACZC,EAAa,eAGbC,EAAa,SAAUC,EAAKC,GAC3B,MAAOA,GAAOC,cAGhBX,GAAOG,GAAKH,EAAOY,WAElBC,OAAQd,EAERe,YAAad,EAGbC,SAAU,GAGVc,OAAQ,EAERC,QAAS,WACR,MAAO1B,GAAM2B,KAAM9B,OAKpB+B,IAAK,SAAUC,GACd,MAAc,OAAPA,EAGE,EAANA,EAAUhC,KAAMgC,EAAMhC,KAAK4B,QAAW5B,KAAMgC,GAG9C7B,EAAM2B,KAAM9B,OAKdiC,UAAW,SAAUC,GAGpB,GAAIC,GAAMtB,EAAOuB,MAAOpC,KAAK2B,cAAeO,EAO5C,OAJAC,GAAIE,WAAarC,KACjBmC,EAAIpB,QAAUf,KAAKe,QAGZoB,GAMRG,KAAM,SAAUC,EAAUC,GACzB,MAAO3B,GAAOyB,KAAMtC,KAAMuC,EAAUC,IAGrCC,IAAK,SAAUF,GACd,MAAOvC,MAAKiC,UAAWpB,EAAO4B,IAAIzC,KAAM,SAAU0C,EAAMC,GACvD,MAAOJ,GAAST,KAAMY,EAAMC,EAAGD,OAIjCvC,MAAO,WACN,MAAOH,MAAKiC,UAAW9B,EAAMyC,MAAO5C,KAAM6C,aAG3CC,MAAO,WACN,MAAO9C,MAAK+C,GAAI,IAGjBC,KAAM,WACL,MAAOhD,MAAK+C,GAAI,KAGjBA,GAAI,SAAUJ,GACb,GAAIM,GAAMjD,KAAK4B,OACdsB,GAAKP,GAAU,EAAJA,EAAQM,EAAM,EAC1B,OAAOjD,MAAKiC,UAAWiB,GAAK,GAASD,EAAJC,GAAYlD,KAAKkD,SAGnDC,IAAK,WACJ,MAAOnD,MAAKqC,YAAcrC,KAAK2B,YAAY,OAK5CtB,KAAMA,EACN+C,KAAMlD,EAAWkD,KACjBC,OAAQnD,EAAWmD,QAGpBxC,EAAOyC,OAASzC,EAAOG,GAAGsC,OAAS,WAClC,GAAIC,GAAKC,EAAaC,EAAMC,EAAMC,EAASC,EAC1CC,EAAShB,UAAU,OACnBF,EAAI,EACJf,EAASiB,UAAUjB,OACnBkC,GAAO,CAsBR,KAnBuB,iBAAXD,KACXC,EAAOD,EAGPA,EAAShB,UAAWF,OACpBA,KAIsB,gBAAXkB,IAAwBhD,EAAOkD,WAAWF,KACrDA,MAIIlB,IAAMf,IACViC,EAAS7D,KACT2C,KAGWf,EAAJe,EAAYA,IAEnB,GAAmC,OAA7BgB,EAAUd,UAAWF,IAE1B,IAAMe,IAAQC,GACbJ,EAAMM,EAAQH,GACdD,EAAOE,EAASD,GAGXG,IAAWJ,IAKXK,GAAQL,IAAU5C,EAAOmD,cAAcP,KAAUD,EAAc3C,EAAOoD,QAAQR,MAC7ED,GACJA,GAAc,EACdI,EAAQL,GAAO1C,EAAOoD,QAAQV,GAAOA,MAGrCK,EAAQL,GAAO1C,EAAOmD,cAAcT,GAAOA,KAI5CM,EAAQH,GAAS7C,EAAOyC,OAAQQ,EAAMF,EAAOH,IAGzBS,SAATT,IACXI,EAAQH,GAASD,GAOrB,OAAOI,IAGRhD,EAAOyC,QAENa,QAAS,UAAavD,EAAUwD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,KAAM,IAAI3E,OAAO2E,IAGlBC,KAAM,aAKNX,WAAY,SAAUY,GACrB,MAA4B,aAArB9D,EAAO+D,KAAKD,IAGpBV,QAASY,MAAMZ,SAAW,SAAUU,GACnC,MAA4B,UAArB9D,EAAO+D,KAAKD,IAGpBG,SAAU,SAAUH,GAEnB,MAAc,OAAPA,GAAeA,GAAOA,EAAI5E,QAGlCgF,UAAW,SAAUJ,GAKpB,OAAQ9D,EAAOoD,QAASU,IAAUA,EAAMK,WAAYL,GAAQ,GAAM,GAGnEM,cAAe,SAAUN,GACxB,GAAIjB,EACJ,KAAMA,IAAQiB,GACb,OAAO,CAER,QAAO,GAGRX,cAAe,SAAUW,GACxB,GAAIO,EAKJ,KAAMP,GAA4B,WAArB9D,EAAO+D,KAAKD,IAAqBA,EAAIQ,UAAYtE,EAAOiE,SAAUH,GAC9E,OAAO,CAGR,KAEC,GAAKA,EAAIhD,cACPlB,EAAOqB,KAAK6C,EAAK,iBACjBlE,EAAOqB,KAAK6C,EAAIhD,YAAYF,UAAW,iBACxC,OAAO,EAEP,MAAQ2D,GAET,OAAO,EAKR,GAAKzE,EAAQ0E,QACZ,IAAMH,IAAOP,GACZ,MAAOlE,GAAOqB,KAAM6C,EAAKO,EAM3B,KAAMA,IAAOP,IAEb,MAAeT,UAARgB,GAAqBzE,EAAOqB,KAAM6C,EAAKO,IAG/CN,KAAM,SAAUD,GACf,MAAY,OAAPA,EACGA,EAAM,GAEQ,gBAARA,IAAmC,kBAARA,GACxCpE,EAAYC,EAASsB,KAAK6C,KAAU,eAC7BA,IAMTW,WAAY,SAAUC,GAChBA,GAAQ1E,EAAO2E,KAAMD,KAIvBxF,EAAO0F,YAAc,SAAUF,GAChCxF,EAAe,KAAE+B,KAAM/B,EAAQwF,KAC3BA,IAMPG,UAAW,SAAUC,GACpB,MAAOA,GAAOrB,QAASnD,EAAW,OAAQmD,QAASlD,EAAYC,IAGhEuE,SAAU,SAAUlD,EAAMgB,GACzB,MAAOhB,GAAKkD,UAAYlD,EAAKkD,SAASC,gBAAkBnC,EAAKmC,eAI9DvD,KAAM,SAAUqC,EAAKpC,EAAUC,GAC9B,GAAIsD,GACHnD,EAAI,EACJf,EAAS+C,EAAI/C,OACbqC,EAAU8B,EAAapB,EAExB,IAAKnC,GACJ,GAAKyB,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAmD,EAAQvD,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7BsD,KAAU,EACd,UAIF,KAAMnD,IAAKgC,GAGV,GAFAmB,EAAQvD,EAASK,MAAO+B,EAAKhC,GAAKH,GAE7BsD,KAAU,EACd,UAOH,IAAK7B,GACJ,KAAYrC,EAAJe,EAAYA,IAGnB,GAFAmD,EAAQvD,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCmD,KAAU,EACd,UAIF,KAAMnD,IAAKgC,GAGV,GAFAmB,EAAQvD,EAAST,KAAM6C,EAAKhC,GAAKA,EAAGgC,EAAKhC,IAEpCmD,KAAU,EACd,KAMJ,OAAOnB,IAIRa,KAAM,SAAUQ,GACf,MAAe,OAARA,EACN,IACEA,EAAO,IAAK1B,QAASpD,EAAO,KAIhC+E,UAAW,SAAUC,EAAKC,GACzB,GAAIhE,GAAMgE,KAaV,OAXY,OAAPD,IACCH,EAAaK,OAAOF,IACxBrF,EAAOuB,MAAOD,EACE,gBAAR+D,IACLA,GAAQA,GAGX7F,EAAKyB,KAAMK,EAAK+D,IAIX/D,GAGRkE,QAAS,SAAU3D,EAAMwD,EAAKvD,GAC7B,GAAIM,EAEJ,IAAKiD,EAAM,CACV,GAAK5F,EACJ,MAAOA,GAAQwB,KAAMoE,EAAKxD,EAAMC,EAMjC,KAHAM,EAAMiD,EAAItE,OACVe,EAAIA,EAAQ,EAAJA,EAAQyB,KAAKkC,IAAK,EAAGrD,EAAMN,GAAMA,EAAI,EAEjCM,EAAJN,EAASA,IAEhB,GAAKA,IAAKuD,IAAOA,EAAKvD,KAAQD,EAC7B,MAAOC,GAKV,MAAO,IAGRP,MAAO,SAAUU,EAAOyD,GACvB,GAAItD,IAAOsD,EAAO3E,OACjBsB,EAAI,EACJP,EAAIG,EAAMlB,MAEX,OAAYqB,EAAJC,EACPJ,EAAOH,KAAQ4D,EAAQrD,IAKxB,IAAKD,IAAQA,EACZ,MAAsBiB,SAAdqC,EAAOrD,GACdJ,EAAOH,KAAQ4D,EAAQrD,IAMzB,OAFAJ,GAAMlB,OAASe,EAERG,GAGR0D,KAAM,SAAUtE,EAAOK,EAAUkE,GAShC,IARA,GAAIC,GACHC,KACAhE,EAAI,EACJf,EAASM,EAAMN,OACfgF,GAAkBH,EAIP7E,EAAJe,EAAYA,IACnB+D,GAAmBnE,EAAUL,EAAOS,GAAKA,GACpC+D,IAAoBE,GACxBD,EAAQtG,KAAM6B,EAAOS,GAIvB,OAAOgE,IAIRlE,IAAK,SAAUP,EAAOK,EAAUsE,GAC/B,GAAIf,GACHnD,EAAI,EACJf,EAASM,EAAMN,OACfqC,EAAU8B,EAAa7D,GACvBC,IAGD,IAAK8B,EACJ,KAAYrC,EAAJe,EAAYA,IACnBmD,EAAQvD,EAAUL,EAAOS,GAAKA,EAAGkE,GAEnB,MAATf,GACJ3D,EAAI9B,KAAMyF,OAMZ,KAAMnD,IAAKT,GACV4D,EAAQvD,EAAUL,EAAOS,GAAKA,EAAGkE,GAEnB,MAATf,GACJ3D,EAAI9B,KAAMyF,EAMb,OAAO1F,GAAOwC,SAAWT,IAI1B2E,KAAM,EAINC,MAAO,SAAU/F,EAAID,GACpB,GAAIyB,GAAMuE,EAAOC,CAUjB,OARwB,gBAAZjG,KACXiG,EAAMhG,EAAID,GACVA,EAAUC,EACVA,EAAKgG,GAKAnG,EAAOkD,WAAY/C,IAKzBwB,EAAOrC,EAAM2B,KAAMe,UAAW,GAC9BkE,EAAQ,WACP,MAAO/F,GAAG4B,MAAO7B,GAAWf,KAAMwC,EAAKpC,OAAQD,EAAM2B,KAAMe,cAI5DkE,EAAMD,KAAO9F,EAAG8F,KAAO9F,EAAG8F,MAAQjG,EAAOiG,OAElCC,GAZC7C,QAeT+C,IAAK,WACJ,OAAQ,GAAMC,OAKfvG,QAASA,IAIVE,EAAOyB,KAAK,gEAAgE6E,MAAM,KAAM,SAASxE,EAAGe,GACnGnD,EAAY,WAAamD,EAAO,KAAQA,EAAKmC,eAG9C,SAASE,GAAapB,GAMrB,GAAI/C,GAAS,UAAY+C,IAAOA,EAAI/C,OACnCgD,EAAO/D,EAAO+D,KAAMD,EAErB,OAAc,aAATC,GAAuB/D,EAAOiE,SAAUH,IACrC,EAGc,IAAjBA,EAAIQ,UAAkBvD,GACnB,EAGQ,UAATgD,GAA+B,IAAXhD,GACR,gBAAXA,IAAuBA,EAAS,GAAOA,EAAS,IAAO+C,GAEhE,GAAIyC,GAWJ,SAAWrH,GAEX,GAAI4C,GACHhC,EACA0G,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAlI,EACAmI,EACAC,EACAC,EACAC,EACAvB,EACAwB,EAGAhE,EAAU,SAAW,EAAI,GAAI+C,MAC7BkB,EAAerI,EAAOH,SACtByI,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAY,SAAUC,EAAGC,GAIxB,MAHKD,KAAMC,IACVhB,GAAe,GAET,GAIRiB,EAAe,GAAK,GAGpBrI,KAAcC,eACdwF,KACA6C,EAAM7C,EAAI6C,IACVC,EAAc9C,EAAI7F,KAClBA,EAAO6F,EAAI7F,KACXF,EAAQ+F,EAAI/F,MAGZG,EAAU,SAAU2I,EAAMvG,GAGzB,IAFA,GAAIC,GAAI,EACPM,EAAMgG,EAAKrH,OACAqB,EAAJN,EAASA,IAChB,GAAKsG,EAAKtG,KAAOD,EAChB,MAAOC,EAGT,OAAO,IAGRuG,EAAW,6HAKXC,EAAa,sBAEbC,EAAoB,mCAKpBC,EAAaD,EAAkB9E,QAAS,IAAK,MAG7CgF,EAAa,MAAQH,EAAa,KAAOC,EAAoB,OAASD,EAErE,gBAAkBA,EAElB,2DAA6DE,EAAa,OAASF,EACnF,OAEDI,EAAU,KAAOH,EAAoB,wFAKPE,EAAa,eAM3CE,EAAc,GAAIC,QAAQN,EAAa,IAAK,KAC5CjI,EAAQ,GAAIuI,QAAQ,IAAMN,EAAa,8BAAgCA,EAAa,KAAM,KAE1FO,EAAS,GAAID,QAAQ,IAAMN,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,GAAIF,QAAQ,IAAMN,EAAa,WAAaA,EAAa,IAAMA,EAAa,KAE3FS,EAAmB,GAAIH,QAAQ,IAAMN,EAAa,iBAAmBA,EAAa,OAAQ,KAE1FU,EAAU,GAAIJ,QAAQF,GACtBO,EAAc,GAAIL,QAAQ,IAAMJ,EAAa,KAE7CU,GACCC,GAAM,GAAIP,QAAQ,MAAQL,EAAoB,KAC9Ca,MAAS,GAAIR,QAAQ,QAAUL,EAAoB,KACnDc,IAAO,GAAIT,QAAQ,KAAOL,EAAkB9E,QAAS,IAAK,MAAS,KACnE6F,KAAQ,GAAIV,QAAQ,IAAMH,GAC1Bc,OAAU,GAAIX,QAAQ,IAAMF,GAC5Bc,MAAS,GAAIZ,QAAQ,yDAA2DN,EAC/E,+BAAiCA,EAAa,cAAgBA,EAC9D,aAAeA,EAAa,SAAU,KACvCmB,KAAQ,GAAIb,QAAQ,OAASP,EAAW,KAAM,KAG9CqB,aAAgB,GAAId,QAAQ,IAAMN,EAAa,mDAC9CA,EAAa,mBAAqBA,EAAa,mBAAoB,MAGrEqB,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OACXC,GAAU,QAGVC,GAAY,GAAIrB,QAAQ,qBAAuBN,EAAa,MAAQA,EAAa,OAAQ,MACzF4B,GAAY,SAAUC,EAAGC,EAASC,GACjC,GAAIC,GAAO,KAAOF,EAAU,KAI5B,OAAOE,KAASA,GAAQD,EACvBD,EACO,EAAPE,EAECC,OAAOC,aAAcF,EAAO,OAE5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,QAO5DG,GAAgB,WACfxD,IAIF,KACCzH,EAAKuC,MACHsD,EAAM/F,EAAM2B,KAAMsG,EAAamD,YAChCnD,EAAamD,YAIdrF,EAAKkC,EAAamD,WAAW3J,QAASuD,SACrC,MAAQC,IACT/E,GAASuC,MAAOsD,EAAItE,OAGnB,SAAUiC,EAAQ2H,GACjBxC,EAAYpG,MAAOiB,EAAQ1D,EAAM2B,KAAK0J,KAKvC,SAAU3H,EAAQ2H,GACjB,GAAItI,GAAIW,EAAOjC,OACde,EAAI,CAEL,OAASkB,EAAOX,KAAOsI,EAAI7I,MAC3BkB,EAAOjC,OAASsB,EAAI,IAKvB,QAASkE,IAAQtG,EAAUC,EAASoF,EAASsF,GAC5C,GAAIC,GAAOhJ,EAAMiJ,EAAGxG,EAEnBxC,EAAGiJ,EAAQC,EAAKC,EAAKC,EAAYC,CAUlC,KAROjL,EAAUA,EAAQkL,eAAiBlL,EAAUqH,KAAmBxI,GACtEkI,EAAa/G,GAGdA,EAAUA,GAAWnB,EACrBuG,EAAUA,MACVhB,EAAWpE,EAAQoE,SAEM,gBAAbrE,KAA0BA,GACxB,IAAbqE,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,MAAOgB,EAGR,KAAMsF,GAAQzD,EAAiB,CAG9B,GAAkB,KAAb7C,IAAoBuG,EAAQf,EAAWuB,KAAMpL,IAEjD,GAAM6K,EAAID,EAAM,IACf,GAAkB,IAAbvG,EAAiB,CAIrB,GAHAzC,EAAO3B,EAAQoL,eAAgBR,IAG1BjJ,IAAQA,EAAK0J,WAQjB,MAAOjG,EALP,IAAKzD,EAAK2J,KAAOV,EAEhB,MADAxF,GAAQ9F,KAAMqC,GACPyD,MAOT,IAAKpF,EAAQkL,gBAAkBvJ,EAAO3B,EAAQkL,cAAcE,eAAgBR,KAC3ExD,EAAUpH,EAAS2B,IAAUA,EAAK2J,KAAOV,EAEzC,MADAxF,GAAQ9F,KAAMqC,GACPyD,MAKH,CAAA,GAAKuF,EAAM,GAEjB,MADArL,GAAKuC,MAAOuD,EAASpF,EAAQuL,qBAAsBxL,IAC5CqF,CAGD,KAAMwF,EAAID,EAAM,KAAO/K,EAAQ4L,uBAErC,MADAlM,GAAKuC,MAAOuD,EAASpF,EAAQwL,uBAAwBZ,IAC9CxF,EAKT,GAAKxF,EAAQ6L,OAASvE,IAAcA,EAAUwE,KAAM3L,IAAc,CASjE,GARAgL,EAAMD,EAAM1H,EACZ4H,EAAahL,EACbiL,EAA2B,IAAb7G,GAAkBrE,EAMd,IAAbqE,GAAqD,WAAnCpE,EAAQ6E,SAASC,cAA6B,CACpE+F,EAASpE,EAAU1G,IAEb+K,EAAM9K,EAAQ2L,aAAa,OAChCZ,EAAMD,EAAIvH,QAASuG,GAAS,QAE5B9J,EAAQ4L,aAAc,KAAMb,GAE7BA,EAAM,QAAUA,EAAM,MAEtBnJ,EAAIiJ,EAAOhK,MACX,OAAQe,IACPiJ,EAAOjJ,GAAKmJ,EAAMc,GAAYhB,EAAOjJ,GAEtCoJ,GAAanB,GAAS6B,KAAM3L,IAAc+L,GAAa9L,EAAQqL,aAAgBrL,EAC/EiL,EAAcJ,EAAOkB,KAAK,KAG3B,GAAKd,EACJ,IAIC,MAHA3L,GAAKuC,MAAOuD,EACX4F,EAAWgB,iBAAkBf,IAEvB7F,EACN,MAAM6G,IACN,QACKnB,GACL9K,EAAQkM,gBAAgB,QAQ7B,MAAOvF,GAAQ5G,EAASwD,QAASpD,EAAO,MAAQH,EAASoF,EAASsF,GASnE,QAASjD,MACR,GAAI0E,KAEJ,SAASC,GAAOjI,EAAKY,GAMpB,MAJKoH,GAAK7M,KAAM6E,EAAM,KAAQmC,EAAK+F,mBAE3BD,GAAOD,EAAKG,SAEZF,EAAOjI,EAAM,KAAQY,EAE9B,MAAOqH,GAOR,QAASG,IAActM,GAEtB,MADAA,GAAImD,IAAY,EACTnD,EAOR,QAASuM,IAAQvM,GAChB,GAAIwM,GAAM5N,EAAS6N,cAAc,MAEjC,KACC,QAASzM,EAAIwM,GACZ,MAAOpI,GACR,OAAO,EACN,QAEIoI,EAAIpB,YACRoB,EAAIpB,WAAWsB,YAAaF,GAG7BA,EAAM,MASR,QAASG,IAAWC,EAAOC,GAC1B,GAAI3H,GAAM0H,EAAMzG,MAAM,KACrBxE,EAAIiL,EAAMhM,MAEX,OAAQe,IACP0E,EAAKyG,WAAY5H,EAAIvD,IAAOkL,EAU9B,QAASE,IAAcnF,EAAGC,GACzB,GAAImF,GAAMnF,GAAKD,EACdqF,EAAOD,GAAsB,IAAfpF,EAAEzD,UAAiC,IAAf0D,EAAE1D,YAChC0D,EAAEqF,aAAepF,KACjBF,EAAEsF,aAAepF,EAGtB,IAAKmF,EACJ,MAAOA,EAIR,IAAKD,EACJ,MAASA,EAAMA,EAAIG,YAClB,GAAKH,IAAQnF,EACZ,MAAO,EAKV,OAAOD,GAAI,EAAI,GAOhB,QAASwF,IAAmBxJ,GAC3B,MAAO,UAAUlC,GAChB,GAAIgB,GAAOhB,EAAKkD,SAASC,aACzB,OAAgB,UAATnC,GAAoBhB,EAAKkC,OAASA,GAQ3C,QAASyJ,IAAoBzJ,GAC5B,MAAO,UAAUlC,GAChB,GAAIgB,GAAOhB,EAAKkD,SAASC,aACzB,QAAiB,UAATnC,GAA6B,WAATA,IAAsBhB,EAAKkC,OAASA,GAQlE,QAAS0J,IAAwBtN,GAChC,MAAOsM,IAAa,SAAUiB,GAE7B,MADAA,IAAYA,EACLjB,GAAa,SAAU7B,EAAM9E,GACnC,GAAIzD,GACHsL,EAAexN,KAAQyK,EAAK7J,OAAQ2M,GACpC5L,EAAI6L,EAAa5M,MAGlB,OAAQe,IACF8I,EAAOvI,EAAIsL,EAAa7L,MAC5B8I,EAAKvI,KAAOyD,EAAQzD,GAAKuI,EAAKvI,SAYnC,QAAS2J,IAAa9L,GACrB,MAAOA,IAAmD,mBAAjCA,GAAQuL,sBAAwCvL,EAI1EJ,EAAUyG,GAAOzG,WAOjB4G,EAAQH,GAAOG,MAAQ,SAAU7E,GAGhC,GAAI+L,GAAkB/L,IAASA,EAAKuJ,eAAiBvJ,GAAM+L,eAC3D,OAAOA,GAA+C,SAA7BA,EAAgB7I,UAAsB,GAQhEkC,EAAcV,GAAOU,YAAc,SAAU4G,GAC5C,GAAIC,GAAYC,EACfC,EAAMH,EAAOA,EAAKzC,eAAiByC,EAAOtG,CAG3C,OAAKyG,KAAQjP,GAA6B,IAAjBiP,EAAI1J,UAAmB0J,EAAIJ,iBAKpD7O,EAAWiP,EACX9G,EAAU8G,EAAIJ,gBACdG,EAASC,EAAIC,YAMRF,GAAUA,IAAWA,EAAOG,MAE3BH,EAAOI,iBACXJ,EAAOI,iBAAkB,SAAU1D,IAAe,GACvCsD,EAAOK,aAClBL,EAAOK,YAAa,WAAY3D,KAMlCtD,GAAkBT,EAAOsH,GAQzBlO,EAAQ2I,WAAaiE,GAAO,SAAUC,GAErC,MADAA,GAAI0B,UAAY,KACR1B,EAAId,aAAa,eAO1B/L,EAAQ2L,qBAAuBiB,GAAO,SAAUC,GAE/C,MADAA,GAAI2B,YAAaN,EAAIO,cAAc,MAC3B5B,EAAIlB,qBAAqB,KAAK1K,SAIvCjB,EAAQ4L,uBAAyB7B,EAAQ+B,KAAMoC,EAAItC,wBAMnD5L,EAAQ0O,QAAU9B,GAAO,SAAUC,GAElC,MADAzF,GAAQoH,YAAa3B,GAAMnB,GAAKlI,GACxB0K,EAAIS,oBAAsBT,EAAIS,kBAAmBnL,GAAUvC,SAI/DjB,EAAQ0O,SACZhI,EAAKkI,KAAS,GAAI,SAAUlD,EAAItL,GAC/B,GAAuC,mBAA3BA,GAAQoL,gBAAkCnE,EAAiB,CACtE,GAAI2D,GAAI5K,EAAQoL,eAAgBE,EAGhC,OAAOV,IAAKA,EAAES,YAAeT,QAG/BtE,EAAKmI,OAAW,GAAI,SAAUnD,GAC7B,GAAIoD,GAASpD,EAAG/H,QAASwG,GAAWC,GACpC,OAAO,UAAUrI,GAChB,MAAOA,GAAKgK,aAAa,QAAU+C,YAM9BpI,GAAKkI,KAAS,GAErBlI,EAAKmI,OAAW,GAAK,SAAUnD,GAC9B,GAAIoD,GAASpD,EAAG/H,QAASwG,GAAWC,GACpC,OAAO,UAAUrI,GAChB,GAAIgM,GAAwC,mBAA1BhM,GAAKgN,kBAAoChN,EAAKgN,iBAAiB,KACjF,OAAOhB,IAAQA,EAAK5I,QAAU2J,KAMjCpI,EAAKkI,KAAU,IAAI5O,EAAQ2L,qBAC1B,SAAUqD,EAAK5O,GACd,MAA6C,mBAAjCA,GAAQuL,qBACZvL,EAAQuL,qBAAsBqD,GAG1BhP,EAAQ6L,IACZzL,EAAQgM,iBAAkB4C,GAD3B,QAKR,SAAUA,EAAK5O,GACd,GAAI2B,GACHsE,KACArE,EAAI,EAEJwD,EAAUpF,EAAQuL,qBAAsBqD,EAGzC,IAAa,MAARA,EAAc,CAClB,MAASjN,EAAOyD,EAAQxD,KACA,IAAlBD,EAAKyC,UACT6B,EAAI3G,KAAMqC,EAIZ,OAAOsE,GAER,MAAOb,IAITkB,EAAKkI,KAAY,MAAI5O,EAAQ4L,wBAA0B,SAAU2C,EAAWnO,GAC3E,MAAKiH,GACGjH,EAAQwL,uBAAwB2C,GADxC,QAWDhH,KAOAD,MAEMtH,EAAQ6L,IAAM9B,EAAQ+B,KAAMoC,EAAI9B,qBAGrCQ,GAAO,SAAUC,GAMhBzF,EAAQoH,YAAa3B,GAAMoC,UAAY,UAAYzL,EAAU,qBAC3CA,EAAU,iEAOvBqJ,EAAIT,iBAAiB,wBAAwBnL,QACjDqG,EAAU5H,KAAM,SAAW8I,EAAa,gBAKnCqE,EAAIT,iBAAiB,cAAcnL,QACxCqG,EAAU5H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1DsE,EAAIT,iBAAkB,QAAU5I,EAAU,MAAOvC,QACtDqG,EAAU5H,KAAK,MAMVmN,EAAIT,iBAAiB,YAAYnL,QACtCqG,EAAU5H,KAAK,YAMVmN,EAAIT,iBAAkB,KAAO5I,EAAU,MAAOvC,QACnDqG,EAAU5H,KAAK,cAIjBkN,GAAO,SAAUC,GAGhB,GAAIqC,GAAQhB,EAAIpB,cAAc,QAC9BoC,GAAMlD,aAAc,OAAQ,UAC5Ba,EAAI2B,YAAaU,GAAQlD,aAAc,OAAQ,KAI1Ca,EAAIT,iBAAiB,YAAYnL,QACrCqG,EAAU5H,KAAM,OAAS8I,EAAa,eAKjCqE,EAAIT,iBAAiB,YAAYnL,QACtCqG,EAAU5H,KAAM,WAAY,aAI7BmN,EAAIT,iBAAiB,QACrB9E,EAAU5H,KAAK,YAIXM,EAAQmP,gBAAkBpF,EAAQ+B,KAAO9F,EAAUoB,EAAQpB,SAChEoB,EAAQgI,uBACRhI,EAAQiI,oBACRjI,EAAQkI,kBACRlI,EAAQmI,qBAER3C,GAAO,SAAUC,GAGhB7M,EAAQwP,kBAAoBxJ,EAAQ7E,KAAM0L,EAAK,OAI/C7G,EAAQ7E,KAAM0L,EAAK,aACnBtF,EAAc7H,KAAM,KAAMkJ,KAI5BtB,EAAYA,EAAUrG,QAAU,GAAI6H,QAAQxB,EAAU6E,KAAK,MAC3D5E,EAAgBA,EAActG,QAAU,GAAI6H,QAAQvB,EAAc4E,KAAK,MAIvE6B,EAAajE,EAAQ+B,KAAM1E,EAAQqI,yBAKnCjI,EAAWwG,GAAcjE,EAAQ+B,KAAM1E,EAAQI,UAC9C,SAAUS,EAAGC,GACZ,GAAIwH,GAAuB,IAAfzH,EAAEzD,SAAiByD,EAAE6F,gBAAkB7F,EAClD0H,EAAMzH,GAAKA,EAAEuD,UACd,OAAOxD,KAAM0H,MAAWA,GAAwB,IAAjBA,EAAInL,YAClCkL,EAAMlI,SACLkI,EAAMlI,SAAUmI,GAChB1H,EAAEwH,yBAA8D,GAAnCxH,EAAEwH,wBAAyBE,MAG3D,SAAU1H,EAAGC,GACZ,GAAKA,EACJ,MAASA,EAAIA,EAAEuD,WACd,GAAKvD,IAAMD,EACV,OAAO,CAIV,QAAO,GAOTD,EAAYgG,EACZ,SAAU/F,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAIR,IAAI0I,IAAW3H,EAAEwH,yBAA2BvH,EAAEuH,uBAC9C,OAAKG,GACGA,GAIRA,GAAY3H,EAAEqD,eAAiBrD,MAAUC,EAAEoD,eAAiBpD,GAC3DD,EAAEwH,wBAAyBvH,GAG3B,EAGc,EAAV0H,IACF5P,EAAQ6P,cAAgB3H,EAAEuH,wBAAyBxH,KAAQ2H,EAGxD3H,IAAMiG,GAAOjG,EAAEqD,gBAAkB7D,GAAgBD,EAASC,EAAcQ,GACrE,GAEHC,IAAMgG,GAAOhG,EAAEoD,gBAAkB7D,GAAgBD,EAASC,EAAcS,GACrE,EAIDjB,EACJtH,EAASsH,EAAWgB,GAAMtI,EAASsH,EAAWiB,GAChD,EAGe,EAAV0H,EAAc,GAAK,IAE3B,SAAU3H,EAAGC,GAEZ,GAAKD,IAAMC,EAEV,MADAhB,IAAe,EACR,CAGR,IAAImG,GACHrL,EAAI,EACJ8N,EAAM7H,EAAEwD,WACRkE,EAAMzH,EAAEuD,WACRsE,GAAO9H,GACP+H,GAAO9H,EAGR,KAAM4H,IAAQH,EACb,MAAO1H,KAAMiG,EAAM,GAClBhG,IAAMgG,EAAM,EACZ4B,EAAM,GACNH,EAAM,EACN1I,EACEtH,EAASsH,EAAWgB,GAAMtI,EAASsH,EAAWiB,GAChD,CAGK,IAAK4H,IAAQH,EACnB,MAAOvC,IAAcnF,EAAGC,EAIzBmF,GAAMpF,CACN,OAASoF,EAAMA,EAAI5B,WAClBsE,EAAGE,QAAS5C,EAEbA,GAAMnF,CACN,OAASmF,EAAMA,EAAI5B,WAClBuE,EAAGC,QAAS5C,EAIb,OAAQ0C,EAAG/N,KAAOgO,EAAGhO,GACpBA,GAGD,OAAOA,GAENoL,GAAc2C,EAAG/N,GAAIgO,EAAGhO,IAGxB+N,EAAG/N,KAAOyF,EAAe,GACzBuI,EAAGhO,KAAOyF,EAAe,EACzB,GAGKyG,GA1WCjP,GA6WTwH,GAAOT,QAAU,SAAUkK,EAAMC,GAChC,MAAO1J,IAAQyJ,EAAM,KAAM,KAAMC,IAGlC1J,GAAO0I,gBAAkB,SAAUpN,EAAMmO,GASxC,IAPOnO,EAAKuJ,eAAiBvJ,KAAW9C,GACvCkI,EAAapF,GAIdmO,EAAOA,EAAKvM,QAASsF,EAAkB,aAElCjJ,EAAQmP,kBAAmB9H,GAC5BE,GAAkBA,EAAcuE,KAAMoE,IACtC5I,GAAkBA,EAAUwE,KAAMoE,IAErC,IACC,GAAI1O,GAAMwE,EAAQ7E,KAAMY,EAAMmO,EAG9B,IAAK1O,GAAOxB,EAAQwP,mBAGlBzN,EAAK9C,UAAuC,KAA3B8C,EAAK9C,SAASuF,SAChC,MAAOhD,GAEP,MAAOiD,IAGV,MAAOgC,IAAQyJ,EAAMjR,EAAU,MAAQ8C,IAASd,OAAS,GAG1DwF,GAAOe,SAAW,SAAUpH,EAAS2B,GAKpC,OAHO3B,EAAQkL,eAAiBlL,KAAcnB,GAC7CkI,EAAa/G,GAEPoH,EAAUpH,EAAS2B,IAG3B0E,GAAO2J,KAAO,SAAUrO,EAAMgB,IAEtBhB,EAAKuJ,eAAiBvJ,KAAW9C,GACvCkI,EAAapF,EAGd,IAAI1B,GAAKqG,EAAKyG,WAAYpK,EAAKmC,eAE9BmL,EAAMhQ,GAAMP,EAAOqB,KAAMuF,EAAKyG,WAAYpK,EAAKmC,eAC9C7E,EAAI0B,EAAMgB,GAAOsE,GACjB9D,MAEF,OAAeA,UAAR8M,EACNA,EACArQ,EAAQ2I,aAAetB,EACtBtF,EAAKgK,aAAchJ,IAClBsN,EAAMtO,EAAKgN,iBAAiBhM,KAAUsN,EAAIC,UAC1CD,EAAIlL,MACJ,MAGJsB,GAAO5C,MAAQ,SAAUC,GACxB,KAAM,IAAI3E,OAAO,0CAA4C2E,IAO9D2C,GAAO8J,WAAa,SAAU/K,GAC7B,GAAIzD,GACHyO,KACAjO,EAAI,EACJP,EAAI,CAOL,IAJAkF,GAAgBlH,EAAQyQ,iBACxBxJ,GAAajH,EAAQ0Q,YAAclL,EAAQhG,MAAO,GAClDgG,EAAQ/C,KAAMuF,GAETd,EAAe,CACnB,MAASnF,EAAOyD,EAAQxD,KAClBD,IAASyD,EAASxD,KACtBO,EAAIiO,EAAW9Q,KAAMsC,GAGvB,OAAQO,IACPiD,EAAQ9C,OAAQ8N,EAAYjO,GAAK,GAQnC,MAFA0E,GAAY,KAELzB,GAORmB,EAAUF,GAAOE,QAAU,SAAU5E,GACpC,GAAIgM,GACHvM,EAAM,GACNQ,EAAI,EACJwC,EAAWzC,EAAKyC,QAEjB,IAAMA,GAMC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAGjE,GAAiC,gBAArBzC,GAAK4O,YAChB,MAAO5O,GAAK4O,WAGZ,KAAM5O,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAKyL,YAC/ChM,GAAOmF,EAAS5E,OAGZ,IAAkB,IAAbyC,GAA+B,IAAbA,EAC7B,MAAOzC,GAAK8O,cAhBZ,OAAS9C,EAAOhM,EAAKC,KAEpBR,GAAOmF,EAASoH,EAkBlB,OAAOvM,IAGRkF,EAAOD,GAAOqK,WAGbrE,YAAa,GAEbsE,aAAcpE,GAEd5B,MAAO3B,EAEP+D,cAEAyB,QAEAoC,UACCC,KAAOC,IAAK,aAAc/O,OAAO,GACjCgP,KAAOD,IAAK,cACZE,KAAOF,IAAK,kBAAmB/O,OAAO,GACtCkP,KAAOH,IAAK,oBAGbI,WACC9H,KAAQ,SAAUuB,GAUjB,MATAA,GAAM,GAAKA,EAAM,GAAGpH,QAASwG,GAAWC,IAGxCW,EAAM,IAAOA,EAAM,IAAMA,EAAM,IAAMA,EAAM,IAAM,IAAKpH,QAASwG,GAAWC,IAExD,OAAbW,EAAM,KACVA,EAAM,GAAK,IAAMA,EAAM,GAAK,KAGtBA,EAAMvL,MAAO,EAAG,IAGxBkK,MAAS,SAAUqB,GA6BlB,MAlBAA,GAAM,GAAKA,EAAM,GAAG7F,cAEY,QAA3B6F,EAAM,GAAGvL,MAAO,EAAG,IAEjBuL,EAAM,IACXtE,GAAO5C,MAAOkH,EAAM,IAKrBA,EAAM,KAAQA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAAK,GAAmB,SAAbA,EAAM,IAA8B,QAAbA,EAAM,KACzFA,EAAM,KAAUA,EAAM,GAAKA,EAAM,IAAqB,QAAbA,EAAM,KAGpCA,EAAM,IACjBtE,GAAO5C,MAAOkH,EAAM,IAGdA,GAGRtB,OAAU,SAAUsB,GACnB,GAAIwG,GACHC,GAAYzG,EAAM,IAAMA,EAAM,EAE/B,OAAK3B,GAAiB,MAAE0C,KAAMf,EAAM,IAC5B,MAIHA,EAAM,GACVA,EAAM,GAAKA,EAAM,IAAMA,EAAM,IAAM,GAGxByG,GAAYtI,EAAQ4C,KAAM0F,KAEpCD,EAAS1K,EAAU2K,GAAU,MAE7BD,EAASC,EAAS7R,QAAS,IAAK6R,EAASvQ,OAASsQ,GAAWC,EAASvQ,UAGvE8J,EAAM,GAAKA,EAAM,GAAGvL,MAAO,EAAG+R,GAC9BxG,EAAM,GAAKyG,EAAShS,MAAO,EAAG+R,IAIxBxG,EAAMvL,MAAO,EAAG,MAIzBqP,QAECtF,IAAO,SAAUkI,GAChB,GAAIxM,GAAWwM,EAAiB9N,QAASwG,GAAWC,IAAYlF,aAChE,OAA4B,MAArBuM,EACN,WAAa,OAAO,GACpB,SAAU1P,GACT,MAAOA,GAAKkD,UAAYlD,EAAKkD,SAASC,gBAAkBD,IAI3DqE,MAAS,SAAUiF,GAClB,GAAImD,GAAU9J,EAAY2G,EAAY,IAEtC,OAAOmD,KACLA,EAAU,GAAI5I,QAAQ,MAAQN,EAAa,IAAM+F,EAAY,IAAM/F,EAAa,SACjFZ,EAAY2G,EAAW,SAAUxM,GAChC,MAAO2P,GAAQ5F,KAAgC,gBAAnB/J,GAAKwM,WAA0BxM,EAAKwM,WAA0C,mBAAtBxM,GAAKgK,cAAgChK,EAAKgK,aAAa,UAAY,OAI1JvC,KAAQ,SAAUzG,EAAM4O,EAAUC,GACjC,MAAO,UAAU7P,GAChB,GAAI8P,GAASpL,GAAO2J,KAAMrO,EAAMgB,EAEhC,OAAe,OAAV8O,EACgB,OAAbF,EAEFA,GAINE,GAAU,GAEU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOlS,QAASiS,GAChC,OAAbD,EAAoBC,GAASC,EAAOlS,QAASiS,GAAU,GAC1C,OAAbD,EAAoBC,GAASC,EAAOrS,OAAQoS,EAAM3Q,UAAa2Q,EAClD,OAAbD,GAAsB,IAAME,EAAOlO,QAASkF,EAAa,KAAQ,KAAMlJ,QAASiS,GAAU,GAC7E,OAAbD,EAAoBE,IAAWD,GAASC,EAAOrS,MAAO,EAAGoS,EAAM3Q,OAAS,KAAQ2Q,EAAQ,KACxF,IAZO,IAgBVlI,MAAS,SAAUzF,EAAM6N,EAAMlE,EAAUzL,EAAOE,GAC/C,GAAI0P,GAAgC,QAAvB9N,EAAKzE,MAAO,EAAG,GAC3BwS,EAA+B,SAArB/N,EAAKzE,MAAO,IACtByS,EAAkB,YAATH,CAEV,OAAiB,KAAV3P,GAAwB,IAATE,EAGrB,SAAUN,GACT,QAASA,EAAK0J,YAGf,SAAU1J,EAAM3B,EAAS8R,GACxB,GAAI1F,GAAO2F,EAAYpE,EAAMT,EAAM8E,EAAWC,EAC7CnB,EAAMa,IAAWC,EAAU,cAAgB,kBAC3C/D,EAASlM,EAAK0J,WACd1I,EAAOkP,GAAUlQ,EAAKkD,SAASC,cAC/BoN,GAAYJ,IAAQD,CAErB,IAAKhE,EAAS,CAGb,GAAK8D,EAAS,CACb,MAAQb,EAAM,CACbnD,EAAOhM,CACP,OAASgM,EAAOA,EAAMmD,GACrB,GAAKe,EAASlE,EAAK9I,SAASC,gBAAkBnC,EAAyB,IAAlBgL,EAAKvJ,SACzD,OAAO,CAIT6N,GAAQnB,EAAe,SAATjN,IAAoBoO,GAAS,cAE5C,OAAO,EAMR,GAHAA,GAAUL,EAAU/D,EAAO2C,WAAa3C,EAAOsE,WAG1CP,GAAWM,EAAW,CAE1BH,EAAalE,EAAQzK,KAAcyK,EAAQzK,OAC3CgJ,EAAQ2F,EAAYlO,OACpBmO,EAAY5F,EAAM,KAAO9E,GAAW8E,EAAM,GAC1Cc,EAAOd,EAAM,KAAO9E,GAAW8E,EAAM,GACrCuB,EAAOqE,GAAanE,EAAOrD,WAAYwH,EAEvC,OAASrE,IAASqE,GAAarE,GAAQA,EAAMmD,KAG3C5D,EAAO8E,EAAY,IAAMC,EAAMjK,MAGhC,GAAuB,IAAlB2F,EAAKvJ,YAAoB8I,GAAQS,IAAShM,EAAO,CACrDoQ,EAAYlO,IAAWyD,EAAS0K,EAAW9E,EAC3C,YAKI,IAAKgF,IAAa9F,GAASzK,EAAMyB,KAAczB,EAAMyB,QAAkBS,KAAWuI,EAAM,KAAO9E,EACrG4F,EAAOd,EAAM,OAKb,OAASuB,IAASqE,GAAarE,GAAQA,EAAMmD,KAC3C5D,EAAO8E,EAAY,IAAMC,EAAMjK,MAEhC,IAAO6J,EAASlE,EAAK9I,SAASC,gBAAkBnC,EAAyB,IAAlBgL,EAAKvJ,aAAsB8I,IAE5EgF,KACHvE,EAAMvK,KAAcuK,EAAMvK,QAAkBS,IAAWyD,EAAS4F,IAG7DS,IAAShM,GACb,KAQJ,OADAuL,IAAQjL,EACDiL,IAASnL,GAAWmL,EAAOnL,IAAU,GAAKmL,EAAOnL,GAAS,KAKrEsH,OAAU,SAAU+I,EAAQ5E,GAK3B,GAAI/L,GACHxB,EAAKqG,EAAKkC,QAAS4J,IAAY9L,EAAK+L,WAAYD,EAAOtN,gBACtDuB,GAAO5C,MAAO,uBAAyB2O,EAKzC,OAAKnS,GAAImD,GACDnD,EAAIuN,GAIPvN,EAAGY,OAAS,GAChBY,GAAS2Q,EAAQA,EAAQ,GAAI5E,GACtBlH,EAAK+L,WAAW1S,eAAgByS,EAAOtN,eAC7CyH,GAAa,SAAU7B,EAAM9E,GAC5B,GAAI0M,GACHC,EAAUtS,EAAIyK,EAAM8C,GACpB5L,EAAI2Q,EAAQ1R,MACb,OAAQe,IACP0Q,EAAM/S,EAASmL,EAAM6H,EAAQ3Q,IAC7B8I,EAAM4H,KAAW1M,EAAS0M,GAAQC,EAAQ3Q,MAG5C,SAAUD,GACT,MAAO1B,GAAI0B,EAAM,EAAGF,KAIhBxB,IAITuI,SAECgK,IAAOjG,GAAa,SAAUxM,GAI7B,GAAI+O,MACH1J,KACAqN,EAAU/L,EAAS3G,EAASwD,QAASpD,EAAO,MAE7C,OAAOsS,GAASrP,GACfmJ,GAAa,SAAU7B,EAAM9E,EAAS5F,EAAS8R,GAC9C,GAAInQ,GACH+Q,EAAYD,EAAS/H,EAAM,KAAMoH,MACjClQ,EAAI8I,EAAK7J,MAGV,OAAQe,KACDD,EAAO+Q,EAAU9Q,MACtB8I,EAAK9I,KAAOgE,EAAQhE,GAAKD,MAI5B,SAAUA,EAAM3B,EAAS8R,GAKxB,MAJAhD,GAAM,GAAKnN,EACX8Q,EAAS3D,EAAO,KAAMgD,EAAK1M,GAE3B0J,EAAM,GAAK,MACH1J,EAAQ4C,SAInB2K,IAAOpG,GAAa,SAAUxM,GAC7B,MAAO,UAAU4B,GAChB,MAAO0E,IAAQtG,EAAU4B,GAAOd,OAAS,KAI3CuG,SAAYmF,GAAa,SAAUtH,GAElC,MADAA,GAAOA,EAAK1B,QAASwG,GAAWC,IACzB,SAAUrI,GAChB,OAASA,EAAK4O,aAAe5O,EAAKiR,WAAarM,EAAS5E,IAASpC,QAAS0F,GAAS,MAWrF4N,KAAQtG,GAAc,SAAUsG,GAM/B,MAJM9J,GAAY2C,KAAKmH,GAAQ,KAC9BxM,GAAO5C,MAAO,qBAAuBoP,GAEtCA,EAAOA,EAAKtP,QAASwG,GAAWC,IAAYlF,cACrC,SAAUnD,GAChB,GAAImR,EACJ,GACC,IAAMA,EAAW7L,EAChBtF,EAAKkR,KACLlR,EAAKgK,aAAa,aAAehK,EAAKgK,aAAa,QAGnD,MADAmH,GAAWA,EAAShO,cACbgO,IAAaD,GAA2C,IAAnCC,EAASvT,QAASsT,EAAO,YAE5ClR,EAAOA,EAAK0J,aAAiC,IAAlB1J,EAAKyC,SAC3C,QAAO,KAKTtB,OAAU,SAAUnB,GACnB,GAAIoR,GAAO/T,EAAOgU,UAAYhU,EAAOgU,SAASD,IAC9C,OAAOA,IAAQA,EAAK3T,MAAO,KAAQuC,EAAK2J,IAGzC2H,KAAQ,SAAUtR,GACjB,MAAOA,KAASqF,GAGjBkM,MAAS,SAAUvR,GAClB,MAAOA,KAAS9C,EAASsU,iBAAmBtU,EAASuU,UAAYvU,EAASuU,gBAAkBzR,EAAKkC,MAAQlC,EAAK0R,OAAS1R,EAAK2R,WAI7HC,QAAW,SAAU5R,GACpB,MAAOA,GAAK6R,YAAa,GAG1BA,SAAY,SAAU7R,GACrB,MAAOA,GAAK6R,YAAa,GAG1BC,QAAW,SAAU9R,GAGpB,GAAIkD,GAAWlD,EAAKkD,SAASC,aAC7B,OAAqB,UAAbD,KAA0BlD,EAAK8R,SAA0B,WAAb5O,KAA2BlD,EAAK+R,UAGrFA,SAAY,SAAU/R,GAOrB,MAJKA,GAAK0J,YACT1J,EAAK0J,WAAWsI,cAGVhS,EAAK+R,YAAa,GAI1BE,MAAS,SAAUjS,GAKlB,IAAMA,EAAOA,EAAK6O,WAAY7O,EAAMA,EAAOA,EAAKyL,YAC/C,GAAKzL,EAAKyC,SAAW,EACpB,OAAO,CAGT,QAAO,GAGRyJ,OAAU,SAAUlM,GACnB,OAAQ2E,EAAKkC,QAAe,MAAG7G,IAIhCkS,OAAU,SAAUlS,GACnB,MAAO+H,GAAQgC,KAAM/J,EAAKkD,WAG3BiK,MAAS,SAAUnN,GAClB,MAAO8H,GAAQiC,KAAM/J,EAAKkD,WAG3BiP,OAAU,SAAUnS,GACnB,GAAIgB,GAAOhB,EAAKkD,SAASC,aACzB,OAAgB,UAATnC,GAAkC,WAAdhB,EAAKkC,MAA8B,WAATlB,GAGtDsC,KAAQ,SAAUtD,GACjB,GAAIqO,EACJ,OAAuC,UAAhCrO,EAAKkD,SAASC,eACN,SAAdnD,EAAKkC,OAImC,OAArCmM,EAAOrO,EAAKgK,aAAa,UAA2C,SAAvBqE,EAAKlL,gBAIvD/C,MAASwL,GAAuB,WAC/B,OAAS,KAGVtL,KAAQsL,GAAuB,SAAUE,EAAc5M,GACtD,OAASA,EAAS,KAGnBmB,GAAMuL,GAAuB,SAAUE,EAAc5M,EAAQ2M,GAC5D,OAAoB,EAAXA,EAAeA,EAAW3M,EAAS2M,KAG7CuG,KAAQxG,GAAuB,SAAUE,EAAc5M,GAEtD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB6L,EAAanO,KAAMsC,EAEpB,OAAO6L,KAGRuG,IAAOzG,GAAuB,SAAUE,EAAc5M,GAErD,IADA,GAAIe,GAAI,EACIf,EAAJe,EAAYA,GAAK,EACxB6L,EAAanO,KAAMsC,EAEpB,OAAO6L,KAGRwG,GAAM1G,GAAuB,SAAUE,EAAc5M,EAAQ2M,GAE5D,IADA,GAAI5L,GAAe,EAAX4L,EAAeA,EAAW3M,EAAS2M,IACjC5L,GAAK,GACd6L,EAAanO,KAAMsC,EAEpB,OAAO6L,KAGRyG,GAAM3G,GAAuB,SAAUE,EAAc5M,EAAQ2M,GAE5D,IADA,GAAI5L,GAAe,EAAX4L,EAAeA,EAAW3M,EAAS2M,IACjC5L,EAAIf,GACb4M,EAAanO,KAAMsC,EAEpB,OAAO6L,OAKVnH,EAAKkC,QAAa,IAAIlC,EAAKkC,QAAY,EAGvC,KAAM5G,KAAOuS,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5EjO,EAAKkC,QAAS5G,GAAMyL,GAAmBzL,EAExC,KAAMA,KAAO4S,QAAQ,EAAMC,OAAO,GACjCnO,EAAKkC,QAAS5G,GAAM0L,GAAoB1L,EAIzC,SAASyQ,OACTA,GAAW3R,UAAY4F,EAAKoO,QAAUpO,EAAKkC,QAC3ClC,EAAK+L,WAAa,GAAIA,IAEtB5L,EAAWJ,GAAOI,SAAW,SAAU1G,EAAU4U,GAChD,GAAIpC,GAAS5H,EAAOiK,EAAQ/Q,EAC3BgR,EAAOhK,EAAQiK,EACfC,EAASrN,EAAY3H,EAAW,IAEjC,IAAKgV,EACJ,MAAOJ,GAAY,EAAII,EAAO3V,MAAO,EAGtCyV,GAAQ9U,EACR8K,KACAiK,EAAaxO,EAAK4K,SAElB,OAAQ2D,EAAQ,GAGTtC,IAAY5H,EAAQhC,EAAOwC,KAAM0J,OACjClK,IAEJkK,EAAQA,EAAMzV,MAAOuL,EAAM,GAAG9J,SAAYgU,GAE3ChK,EAAOvL,KAAOsV,OAGfrC,GAAU,GAGJ5H,EAAQ/B,EAAauC,KAAM0J,MAChCtC,EAAU5H,EAAM2B,QAChBsI,EAAOtV,MACNyF,MAAOwN,EAEP1O,KAAM8G,EAAM,GAAGpH,QAASpD,EAAO,OAEhC0U,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI9B,KAAMgD,IAAQyC,GAAKmI,SACZ9D,EAAQ3B,EAAWnF,GAAOsH,KAAM0J,KAAcC,EAAYjR,MAC9D8G,EAAQmK,EAAYjR,GAAQ8G,MAC7B4H,EAAU5H,EAAM2B,QAChBsI,EAAOtV,MACNyF,MAAOwN,EACP1O,KAAMA,EACN+B,QAAS+E,IAEVkK,EAAQA,EAAMzV,MAAOmT,EAAQ1R,QAI/B,KAAM0R,EACL,MAOF,MAAOoC,GACNE,EAAMhU,OACNgU,EACCxO,GAAO5C,MAAO1D,GAEd2H,EAAY3H,EAAU8K,GAASzL,MAAO,GAGzC,SAASyM,IAAY+I,GAIpB,IAHA,GAAIhT,GAAI,EACPM,EAAM0S,EAAO/T,OACbd,EAAW,GACAmC,EAAJN,EAASA,IAChB7B,GAAY6U,EAAOhT,GAAGmD,KAEvB,OAAOhF,GAGR,QAASiV,IAAevC,EAASwC,EAAYC,GAC5C,GAAIpE,GAAMmE,EAAWnE,IACpBqE,EAAmBD,GAAgB,eAARpE,EAC3BsE,EAAW7N,GAEZ,OAAO0N,GAAWlT,MAEjB,SAAUJ,EAAM3B,EAAS8R,GACxB,MAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKyC,UAAkB+Q,EAC3B,MAAO1C,GAAS9Q,EAAM3B,EAAS8R,IAMlC,SAAUnQ,EAAM3B,EAAS8R,GACxB,GAAIuD,GAAUtD,EACbuD,GAAahO,EAAS8N,EAGvB,IAAKtD,GACJ,MAASnQ,EAAOA,EAAMmP,GACrB,IAAuB,IAAlBnP,EAAKyC,UAAkB+Q,IACtB1C,EAAS9Q,EAAM3B,EAAS8R,GAC5B,OAAO,MAKV,OAASnQ,EAAOA,EAAMmP,GACrB,GAAuB,IAAlBnP,EAAKyC,UAAkB+Q,EAAmB,CAE9C,GADApD,EAAapQ,EAAMyB,KAAczB,EAAMyB,QACjCiS,EAAWtD,EAAYjB,KAC5BuE,EAAU,KAAQ/N,GAAW+N,EAAU,KAAQD,EAG/C,MAAQE,GAAU,GAAMD,EAAU,EAMlC,IAHAtD,EAAYjB,GAAQwE,EAGdA,EAAU,GAAM7C,EAAS9Q,EAAM3B,EAAS8R,GAC7C,OAAO,IASf,QAASyD,IAAgBC,GACxB,MAAOA,GAAS3U,OAAS,EACxB,SAAUc,EAAM3B,EAAS8R,GACxB,GAAIlQ,GAAI4T,EAAS3U,MACjB,OAAQe,IACP,IAAM4T,EAAS5T,GAAID,EAAM3B,EAAS8R,GACjC,OAAO,CAGT,QAAO,GAER0D,EAAS,GAGX,QAASC,IAAkB1V,EAAU2V,EAAUtQ,GAG9C,IAFA,GAAIxD,GAAI,EACPM,EAAMwT,EAAS7U,OACJqB,EAAJN,EAASA,IAChByE,GAAQtG,EAAU2V,EAAS9T,GAAIwD,EAEhC,OAAOA,GAGR,QAASuQ,IAAUjD,EAAWhR,EAAK+M,EAAQzO,EAAS8R,GAOnD,IANA,GAAInQ,GACHiU,KACAhU,EAAI,EACJM,EAAMwQ,EAAU7R,OAChBgV,EAAgB,MAAPnU,EAEEQ,EAAJN,EAASA,KACVD,EAAO+Q,EAAU9Q,OAChB6M,GAAUA,EAAQ9M,EAAM3B,EAAS8R,MACtC8D,EAAatW,KAAMqC,GACdkU,GACJnU,EAAIpC,KAAMsC,GAMd,OAAOgU,GAGR,QAASE,IAAY5E,EAAWnR,EAAU0S,EAASsD,EAAYC,EAAYC,GAO1E,MANKF,KAAeA,EAAY3S,KAC/B2S,EAAaD,GAAYC,IAErBC,IAAeA,EAAY5S,KAC/B4S,EAAaF,GAAYE,EAAYC,IAE/B1J,GAAa,SAAU7B,EAAMtF,EAASpF,EAAS8R,GACrD,GAAIoE,GAAMtU,EAAGD,EACZwU,KACAC,KACAC,EAAcjR,EAAQvE,OAGtBM,EAAQuJ,GAAQ+K,GAAkB1V,GAAY,IAAKC,EAAQoE,UAAapE,GAAYA,MAGpFsW,GAAYpF,IAAexG,GAAS3K,EAEnCoB,EADAwU,GAAUxU,EAAOgV,EAAQjF,EAAWlR,EAAS8R,GAG9CyE,EAAa9D,EAEZuD,IAAgBtL,EAAOwG,EAAYmF,GAAeN,MAMjD3Q,EACDkR,CAQF,IALK7D,GACJA,EAAS6D,EAAWC,EAAYvW,EAAS8R,GAIrCiE,EAAa,CACjBG,EAAOP,GAAUY,EAAYH,GAC7BL,EAAYG,KAAUlW,EAAS8R,GAG/BlQ,EAAIsU,EAAKrV,MACT,OAAQe,KACDD,EAAOuU,EAAKtU,MACjB2U,EAAYH,EAAQxU,MAAS0U,EAAWF,EAAQxU,IAAOD,IAK1D,GAAK+I,GACJ,GAAKsL,GAAc9E,EAAY,CAC9B,GAAK8E,EAAa,CAEjBE,KACAtU,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,KAEvBsU,EAAK5W,KAAOgX,EAAU1U,GAAKD,EAG7BqU,GAAY,KAAOO,KAAkBL,EAAMpE,GAI5ClQ,EAAI2U,EAAW1V,MACf,OAAQe,KACDD,EAAO4U,EAAW3U,MACtBsU,EAAOF,EAAazW,EAASmL,EAAM/I,GAASwU,EAAOvU,IAAM,KAE1D8I,EAAKwL,KAAU9Q,EAAQ8Q,GAAQvU,SAOlC4U,GAAaZ,GACZY,IAAenR,EACdmR,EAAWjU,OAAQ+T,EAAaE,EAAW1V,QAC3C0V,GAEGP,EACJA,EAAY,KAAM5Q,EAASmR,EAAYzE,GAEvCxS,EAAKuC,MAAOuD,EAASmR,KAMzB,QAASC,IAAmB5B,GAwB3B,IAvBA,GAAI6B,GAAchE,EAAStQ,EAC1BD,EAAM0S,EAAO/T,OACb6V,EAAkBpQ,EAAKsK,SAAUgE,EAAO,GAAG/Q,MAC3C8S,EAAmBD,GAAmBpQ,EAAKsK,SAAS,KACpDhP,EAAI8U,EAAkB,EAAI,EAG1BE,EAAe5B,GAAe,SAAUrT,GACvC,MAAOA,KAAS8U,GACdE,GAAkB,GACrBE,EAAkB7B,GAAe,SAAUrT,GAC1C,MAAOpC,GAASkX,EAAc9U,GAAS,IACrCgV,GAAkB,GACrBnB,GAAa,SAAU7T,EAAM3B,EAAS8R,GACrC,GAAI1Q,IAASsV,IAAqB5E,GAAO9R,IAAY4G,MACnD6P,EAAezW,GAASoE,SACxBwS,EAAcjV,EAAM3B,EAAS8R,GAC7B+E,EAAiBlV,EAAM3B,EAAS8R,GAGlC,OADA2E,GAAe,KACRrV,IAGGc,EAAJN,EAASA,IAChB,GAAM6Q,EAAUnM,EAAKsK,SAAUgE,EAAOhT,GAAGiC,MACxC2R,GAAaR,GAAcO,GAAgBC,GAAY/C,QACjD,CAIN,GAHAA,EAAUnM,EAAKmI,OAAQmG,EAAOhT,GAAGiC,MAAOhC,MAAO,KAAM+S,EAAOhT,GAAGgE,SAG1D6M,EAASrP,GAAY,CAGzB,IADAjB,IAAMP,EACMM,EAAJC,EAASA,IAChB,GAAKmE,EAAKsK,SAAUgE,EAAOzS,GAAG0B,MAC7B,KAGF,OAAOiS,IACNlU,EAAI,GAAK2T,GAAgBC,GACzB5T,EAAI,GAAKiK,GAER+I,EAAOxV,MAAO,EAAGwC,EAAI,GAAIvC,QAAS0F,MAAgC,MAAzB6P,EAAQhT,EAAI,GAAIiC,KAAe,IAAM,MAC7EN,QAASpD,EAAO,MAClBsS,EACItQ,EAAJP,GAAS4U,GAAmB5B,EAAOxV,MAAOwC,EAAGO,IACzCD,EAAJC,GAAWqU,GAAoB5B,EAASA,EAAOxV,MAAO+C,IAClDD,EAAJC,GAAW0J,GAAY+I,IAGzBY,EAASlW,KAAMmT,GAIjB,MAAO8C,IAAgBC,GAGxB,QAASsB,IAA0BC,EAAiBC,GACnD,GAAIC,GAAQD,EAAYnW,OAAS,EAChCqW,EAAYH,EAAgBlW,OAAS,EACrCsW,EAAe,SAAUzM,EAAM1K,EAAS8R,EAAK1M,EAASgS,GACrD,GAAIzV,GAAMQ,EAAGsQ,EACZ4E,EAAe,EACfzV,EAAI,IACJ8Q,EAAYhI,MACZ4M,KACAC,EAAgB3Q,EAEhBzF,EAAQuJ,GAAQwM,GAAa5Q,EAAKkI,KAAU,IAAG,IAAK4I,GAEpDI,EAAiBlQ,GAA4B,MAAjBiQ,EAAwB,EAAIlU,KAAKC,UAAY,GACzEpB,EAAMf,EAAMN,MAUb,KARKuW,IACJxQ,EAAmB5G,IAAYnB,GAAYmB,GAOpC4B,IAAMM,GAA4B,OAApBP,EAAOR,EAAMS,IAAaA,IAAM,CACrD,GAAKsV,GAAavV,EAAO,CACxBQ,EAAI,CACJ,OAASsQ,EAAUsE,EAAgB5U,KAClC,GAAKsQ,EAAS9Q,EAAM3B,EAAS8R,GAAQ,CACpC1M,EAAQ9F,KAAMqC,EACd,OAGGyV,IACJ9P,EAAUkQ,GAKPP,KAEEtV,GAAQ8Q,GAAW9Q,IACxB0V,IAII3M,GACJgI,EAAUpT,KAAMqC,IAOnB,GADA0V,GAAgBzV,EACXqV,GAASrV,IAAMyV,EAAe,CAClClV,EAAI,CACJ,OAASsQ,EAAUuE,EAAY7U,KAC9BsQ,EAASC,EAAW4E,EAAYtX,EAAS8R,EAG1C,IAAKpH,EAAO,CAEX,GAAK2M,EAAe,EACnB,MAAQzV,IACA8Q,EAAU9Q,IAAM0V,EAAW1V,KACjC0V,EAAW1V,GAAKoG,EAAIjH,KAAMqE,GAM7BkS,GAAa3B,GAAU2B,GAIxBhY,EAAKuC,MAAOuD,EAASkS,GAGhBF,IAAc1M,GAAQ4M,EAAWzW,OAAS,GAC5CwW,EAAeL,EAAYnW,OAAW,GAExCwF,GAAO8J,WAAY/K,GAUrB,MALKgS,KACJ9P,EAAUkQ,EACV5Q,EAAmB2Q,GAGb7E,EAGT,OAAOuE,GACN1K,GAAc4K,GACdA,EA+KF,MA5KAzQ,GAAUL,GAAOK,QAAU,SAAU3G,EAAU4K,GAC9C,GAAI/I,GACHoV,KACAD,KACAhC,EAASpN,EAAe5H,EAAW,IAEpC,KAAMgV,EAAS,CAERpK,IACLA,EAAQlE,EAAU1G,IAEnB6B,EAAI+I,EAAM9J,MACV,OAAQe,IACPmT,EAASyB,GAAmB7L,EAAM/I,IAC7BmT,EAAQ3R,GACZ4T,EAAY1X,KAAMyV,GAElBgC,EAAgBzX,KAAMyV,EAKxBA,GAASpN,EAAe5H,EAAU+W,GAA0BC,EAAiBC,IAG7EjC,EAAOhV,SAAWA,EAEnB,MAAOgV,IAYRpO,EAASN,GAAOM,OAAS,SAAU5G,EAAUC,EAASoF,EAASsF,GAC9D,GAAI9I,GAAGgT,EAAQ6C,EAAO5T,EAAM2K,EAC3BkJ,EAA+B,kBAAb3X,IAA2BA,EAC7C4K,GAASD,GAAQjE,EAAW1G,EAAW2X,EAAS3X,UAAYA,EAK7D,IAHAqF,EAAUA,MAGY,IAAjBuF,EAAM9J,OAAe,CAIzB,GADA+T,EAASjK,EAAM,GAAKA,EAAM,GAAGvL,MAAO,GAC/BwV,EAAO/T,OAAS,GAAkC,QAA5B4W,EAAQ7C,EAAO,IAAI/Q,MAC5CjE,EAAQ0O,SAAgC,IAArBtO,EAAQoE,UAAkB6C,GAC7CX,EAAKsK,SAAUgE,EAAO,GAAG/Q,MAAS,CAGnC,GADA7D,GAAYsG,EAAKkI,KAAS,GAAGiJ,EAAM7R,QAAQ,GAAGrC,QAAQwG,GAAWC,IAAYhK,QAAkB,IACzFA,EACL,MAAOoF,EAGIsS,KACX1X,EAAUA,EAAQqL,YAGnBtL,EAAWA,EAASX,MAAOwV,EAAOtI,QAAQvH,MAAMlE,QAIjDe,EAAIoH,EAAwB,aAAE0C,KAAM3L,GAAa,EAAI6U,EAAO/T,MAC5D,OAAQe,IAAM,CAIb,GAHA6V,EAAQ7C,EAAOhT,GAGV0E,EAAKsK,SAAW/M,EAAO4T,EAAM5T,MACjC,KAED,KAAM2K,EAAOlI,EAAKkI,KAAM3K,MAEjB6G,EAAO8D,EACZiJ,EAAM7R,QAAQ,GAAGrC,QAASwG,GAAWC,IACrCH,GAAS6B,KAAMkJ,EAAO,GAAG/Q,OAAUiI,GAAa9L,EAAQqL,aAAgBrL,IACpE,CAKJ,GAFA4U,EAAOtS,OAAQV,EAAG,GAClB7B,EAAW2K,EAAK7J,QAAUgL,GAAY+I,IAChC7U,EAEL,MADAT,GAAKuC,MAAOuD,EAASsF,GACdtF,CAGR,SAeJ,OAPEsS,GAAYhR,EAAS3G,EAAU4K,IAChCD,EACA1K,GACCiH,EACD7B,EACAyE,GAAS6B,KAAM3L,IAAc+L,GAAa9L,EAAQqL,aAAgBrL,GAE5DoF,GAMRxF,EAAQ0Q,WAAalN,EAAQgD,MAAM,IAAI/D,KAAMuF,GAAYmE,KAAK,MAAQ3I,EAItExD,EAAQyQ,mBAAqBvJ,EAG7BC,IAIAnH,EAAQ6P,aAAejD,GAAO,SAAUmL,GAEvC,MAAuE,GAAhEA,EAAKtI,wBAAyBxQ,EAAS6N,cAAc,UAMvDF,GAAO,SAAUC,GAEtB,MADAA,GAAIoC,UAAY,mBAC+B,MAAxCpC,EAAI+D,WAAW7E,aAAa,WAEnCiB,GAAW,yBAA0B,SAAUjL,EAAMgB,EAAM6D,GAC1D,MAAMA,GAAN,OACQ7E,EAAKgK,aAAchJ,EAA6B,SAAvBA,EAAKmC,cAA2B,EAAI,KAOjElF,EAAQ2I,YAAeiE,GAAO,SAAUC,GAG7C,MAFAA,GAAIoC,UAAY,WAChBpC,EAAI+D,WAAW5E,aAAc,QAAS,IACY,KAA3Ca,EAAI+D,WAAW7E,aAAc,YAEpCiB,GAAW,QAAS,SAAUjL,EAAMgB,EAAM6D,GACzC,MAAMA,IAAyC,UAAhC7E,EAAKkD,SAASC,cAA7B,OACQnD,EAAKiW,eAOTpL,GAAO,SAAUC,GACtB,MAAuC,OAAhCA,EAAId,aAAa,eAExBiB,GAAWzE,EAAU,SAAUxG,EAAMgB,EAAM6D,GAC1C,GAAIyJ,EACJ,OAAMzJ,GAAN,OACQ7E,EAAMgB,MAAW,EAAOA,EAAKmC,eACjCmL,EAAMtO,EAAKgN,iBAAkBhM,KAAWsN,EAAIC,UAC7CD,EAAIlL,MACL,OAKGsB,IAEHrH,EAIJc,GAAO0O,KAAOnI,EACdvG,EAAOgQ,KAAOzJ,EAAOqK,UACrB5Q,EAAOgQ,KAAK,KAAOhQ,EAAOgQ,KAAKtH,QAC/B1I,EAAO+X,OAASxR,EAAO8J,WACvBrQ,EAAOmF,KAAOoB,EAAOE,QACrBzG,EAAOgY,SAAWzR,EAAOG,MACzB1G,EAAOsH,SAAWf,EAAOe,QAIzB,IAAI2Q,GAAgBjY,EAAOgQ,KAAKnF,MAAMnB,aAElCwO,EAAa,6BAIbC,EAAY,gBAGhB,SAASC,GAAQnI,EAAUoI,EAAW3F,GACrC,GAAK1S,EAAOkD,WAAYmV,GACvB,MAAOrY,GAAO2F,KAAMsK,EAAU,SAAUpO,EAAMC,GAE7C,QAASuW,EAAUpX,KAAMY,EAAMC,EAAGD,KAAW6Q,GAK/C,IAAK2F,EAAU/T,SACd,MAAOtE,GAAO2F,KAAMsK,EAAU,SAAUpO,GACvC,MAASA,KAASwW,IAAgB3F,GAKpC,IAA0B,gBAAd2F,GAAyB,CACpC,GAAKF,EAAUvM,KAAMyM,GACpB,MAAOrY,GAAO2O,OAAQ0J,EAAWpI,EAAUyC,EAG5C2F,GAAYrY,EAAO2O,OAAQ0J,EAAWpI,GAGvC,MAAOjQ,GAAO2F,KAAMsK,EAAU,SAAUpO,GACvC,MAAS7B,GAAOwF,QAAS3D,EAAMwW,IAAe,IAAQ3F,IAIxD1S,EAAO2O,OAAS,SAAUqB,EAAM3O,EAAOqR,GACtC,GAAI7Q,GAAOR,EAAO,EAMlB,OAJKqR,KACJ1C,EAAO,QAAUA,EAAO,KAGD,IAAjB3O,EAAMN,QAAkC,IAAlBc,EAAKyC,SACjCtE,EAAO0O,KAAKO,gBAAiBpN,EAAMmO,IAAWnO,MAC9C7B,EAAO0O,KAAK5I,QAASkK,EAAMhQ,EAAO2F,KAAMtE,EAAO,SAAUQ,GACxD,MAAyB,KAAlBA,EAAKyC,aAIftE,EAAOG,GAAGsC,QACTiM,KAAM,SAAUzO,GACf,GAAI6B,GACHR,KACAgX,EAAOnZ,KACPiD,EAAMkW,EAAKvX,MAEZ,IAAyB,gBAAbd,GACX,MAAOd,MAAKiC,UAAWpB,EAAQC,GAAW0O,OAAO,WAChD,IAAM7M,EAAI,EAAOM,EAAJN,EAASA,IACrB,GAAK9B,EAAOsH,SAAUgR,EAAMxW,GAAK3C,MAChC,OAAO,IAMX,KAAM2C,EAAI,EAAOM,EAAJN,EAASA,IACrB9B,EAAO0O,KAAMzO,EAAUqY,EAAMxW,GAAKR,EAMnC,OAFAA,GAAMnC,KAAKiC,UAAWgB,EAAM,EAAIpC,EAAO+X,OAAQzW,GAAQA,GACvDA,EAAIrB,SAAWd,KAAKc,SAAWd,KAAKc,SAAW,IAAMA,EAAWA,EACzDqB,GAERqN,OAAQ,SAAU1O,GACjB,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDyS,IAAK,SAAUzS,GACd,MAAOd,MAAKiC,UAAWgX,EAAOjZ,KAAMc,OAAgB,KAErDsY,GAAI,SAAUtY,GACb,QAASmY,EACRjZ,KAIoB,gBAAbc,IAAyBgY,EAAcrM,KAAM3L,GACnDD,EAAQC,GACRA,OACD,GACCc,SASJ,IAAIyX,GAGHzZ,EAAWG,EAAOH,SAKlB+K,EAAa,sCAEb1J,EAAOJ,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,GAC3C,GAAI2K,GAAOhJ,CAGX,KAAM5B,EACL,MAAOd,KAIR,IAAyB,gBAAbc,GAAwB,CAUnC,GAPC4K,EAF2B,MAAvB5K,EAASwY,OAAO,IAAyD,MAA3CxY,EAASwY,OAAQxY,EAASc,OAAS,IAAed,EAASc,QAAU,GAE7F,KAAMd,EAAU,MAGlB6J,EAAWuB,KAAMpL,IAIrB4K,IAAUA,EAAM,IAAO3K,EAsDrB,OAAMA,GAAWA,EAAQW,QACtBX,GAAWsY,GAAa9J,KAAMzO,GAKhCd,KAAK2B,YAAaZ,GAAUwO,KAAMzO,EAzDzC,IAAK4K,EAAM,GAAK,CAYf,GAXA3K,EAAUA,YAAmBF,GAASE,EAAQ,GAAKA,EAInDF,EAAOuB,MAAOpC,KAAMa,EAAO0Y,UAC1B7N,EAAM,GACN3K,GAAWA,EAAQoE,SAAWpE,EAAQkL,eAAiBlL,EAAUnB,GACjE,IAIImZ,EAAWtM,KAAMf,EAAM,KAAQ7K,EAAOmD,cAAejD,GACzD,IAAM2K,IAAS3K,GAETF,EAAOkD,WAAY/D,KAAM0L,IAC7B1L,KAAM0L,GAAS3K,EAAS2K,IAIxB1L,KAAK+Q,KAAMrF,EAAO3K,EAAS2K,GAK9B,OAAO1L,MAQP,GAJA0C,EAAO9C,EAASuM,eAAgBT,EAAM,IAIjChJ,GAAQA,EAAK0J,WAAa,CAG9B,GAAK1J,EAAK2J,KAAOX,EAAM,GACtB,MAAO2N,GAAW9J,KAAMzO,EAIzBd,MAAK4B,OAAS,EACd5B,KAAK,GAAK0C,EAKX,MAFA1C,MAAKe,QAAUnB,EACfI,KAAKc,SAAWA,EACTd,KAcH,MAAKc,GAASqE,UACpBnF,KAAKe,QAAUf,KAAK,GAAKc,EACzBd,KAAK4B,OAAS,EACP5B,MAIIa,EAAOkD,WAAYjD,GACK,mBAArBuY,GAAWG,MACxBH,EAAWG,MAAO1Y,GAElBA,EAAUD,IAGeqD,SAAtBpD,EAASA,WACbd,KAAKc,SAAWA,EAASA,SACzBd,KAAKe,QAAUD,EAASC,SAGlBF,EAAOoF,UAAWnF,EAAUd,OAIrCiB,GAAKQ,UAAYZ,EAAOG,GAGxBqY,EAAaxY,EAAQjB,EAGrB,IAAI6Z,GAAe,iCAElBC,GACCC,UAAU,EACVC,UAAU,EACVC,MAAM,EACNC,MAAM,EAGRjZ,GAAOyC,QACNuO,IAAK,SAAUnP,EAAMmP,EAAKkI,GACzB,GAAIzG,MACHtF,EAAMtL,EAAMmP,EAEb,OAAQ7D,GAAwB,IAAjBA,EAAI7I,WAA6BjB,SAAV6V,GAAwC,IAAjB/L,EAAI7I,WAAmBtE,EAAQmN,GAAMoL,GAAIW,IAC/E,IAAjB/L,EAAI7I,UACRmO,EAAQjT,KAAM2N,GAEfA,EAAMA,EAAI6D,EAEX,OAAOyB,IAGR0G,QAAS,SAAUC,EAAGvX,GAGrB,IAFA,GAAIwX,MAEID,EAAGA,EAAIA,EAAE9L,YACI,IAAf8L,EAAE9U,UAAkB8U,IAAMvX,GAC9BwX,EAAE7Z,KAAM4Z,EAIV,OAAOC,MAITrZ,EAAOG,GAAGsC,QACToQ,IAAK,SAAU7P,GACd,GAAIlB,GACHwX,EAAUtZ,EAAQgD,EAAQ7D,MAC1BiD,EAAMkX,EAAQvY,MAEf,OAAO5B,MAAKwP,OAAO,WAClB,IAAM7M,EAAI,EAAOM,EAAJN,EAASA,IACrB,GAAK9B,EAAOsH,SAAUnI,KAAMma,EAAQxX,IACnC,OAAO,KAMXyX,QAAS,SAAU3I,EAAW1Q,GAS7B,IARA,GAAIiN,GACHrL,EAAI,EACJ0X,EAAIra,KAAK4B,OACT0R,KACAgH,EAAMxB,EAAcrM,KAAMgF,IAAoC,gBAAdA,GAC/C5Q,EAAQ4Q,EAAW1Q,GAAWf,KAAKe,SACnC,EAEUsZ,EAAJ1X,EAAOA,IACd,IAAMqL,EAAMhO,KAAK2C,GAAIqL,GAAOA,IAAQjN,EAASiN,EAAMA,EAAI5B,WAEtD,GAAK4B,EAAI7I,SAAW,KAAOmV,EAC1BA,EAAIC,MAAMvM,GAAO,GAGA,IAAjBA,EAAI7I,UACHtE,EAAO0O,KAAKO,gBAAgB9B,EAAKyD,IAAc,CAEhD6B,EAAQjT,KAAM2N,EACd,OAKH,MAAOhO,MAAKiC,UAAWqR,EAAQ1R,OAAS,EAAIf,EAAO+X,OAAQtF,GAAYA,IAKxEiH,MAAO,SAAU7X,GAGhB,MAAMA,GAKe,gBAATA,GACJ7B,EAAOwF,QAASrG,KAAK,GAAIa,EAAQ6B,IAIlC7B,EAAOwF,QAEb3D,EAAKhB,OAASgB,EAAK,GAAKA,EAAM1C,MAXrBA,KAAK,IAAMA,KAAK,GAAGoM,WAAepM,KAAK8C,QAAQ0X,UAAU5Y,OAAS,IAc7E6Y,IAAK,SAAU3Z,EAAUC,GACxB,MAAOf,MAAKiC,UACXpB,EAAO+X,OACN/X,EAAOuB,MAAOpC,KAAK+B,MAAOlB,EAAQC,EAAUC,OAK/C2Z,QAAS,SAAU5Z,GAClB,MAAOd,MAAKya,IAAiB,MAAZ3Z,EAChBd,KAAKqC,WAAarC,KAAKqC,WAAWmN,OAAO1O,MAK5C,SAASkZ,GAAShM,EAAK6D,GACtB,EACC7D,GAAMA,EAAK6D,SACF7D,GAAwB,IAAjBA,EAAI7I,SAErB,OAAO6I,GAGRnN,EAAOyB,MACNsM,OAAQ,SAAUlM,GACjB,GAAIkM,GAASlM,EAAK0J,UAClB,OAAOwC,IAA8B,KAApBA,EAAOzJ,SAAkByJ,EAAS,MAEpD+L,QAAS,SAAUjY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,eAE1BkY,aAAc,SAAUlY,EAAMC,EAAGoX,GAChC,MAAOlZ,GAAOgR,IAAKnP,EAAM,aAAcqX,IAExCF,KAAM,SAAUnX,GACf,MAAOsX,GAAStX,EAAM,gBAEvBoX,KAAM,SAAUpX,GACf,MAAOsX,GAAStX,EAAM,oBAEvBmY,QAAS,SAAUnY,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,gBAE1B8X,QAAS,SAAU9X,GAClB,MAAO7B,GAAOgR,IAAKnP,EAAM,oBAE1BoY,UAAW,SAAUpY,EAAMC,EAAGoX,GAC7B,MAAOlZ,GAAOgR,IAAKnP,EAAM,cAAeqX,IAEzCgB,UAAW,SAAUrY,EAAMC,EAAGoX,GAC7B,MAAOlZ,GAAOgR,IAAKnP,EAAM,kBAAmBqX,IAE7CiB,SAAU,SAAUtY,GACnB,MAAO7B,GAAOmZ,SAAWtX,EAAK0J,gBAAmBmF,WAAY7O,IAE9DiX,SAAU,SAAUjX,GACnB,MAAO7B,GAAOmZ,QAAStX,EAAK6O,aAE7BqI,SAAU,SAAUlX,GACnB,MAAO7B,GAAO+E,SAAUlD,EAAM,UAC7BA,EAAKuY,iBAAmBvY,EAAKwY,cAActb,SAC3CiB,EAAOuB,SAAWM,EAAK6I,cAEvB,SAAU7H,EAAM1C,GAClBH,EAAOG,GAAI0C,GAAS,SAAUqW,EAAOjZ,GACpC,GAAIqB,GAAMtB,EAAO4B,IAAKzC,KAAMgB,EAAI+Y,EAsBhC,OApB0B,UAArBrW,EAAKvD,MAAO,MAChBW,EAAWiZ,GAGPjZ,GAAgC,gBAAbA,KACvBqB,EAAMtB,EAAO2O,OAAQ1O,EAAUqB,IAG3BnC,KAAK4B,OAAS,IAEZ8X,EAAkBhW,KACvBvB,EAAMtB,EAAO+X,OAAQzW,IAIjBsX,EAAahN,KAAM/I,KACvBvB,EAAMA,EAAIgZ,YAILnb,KAAKiC,UAAWE,KAGzB,IAAIiZ,GAAY,OAKZC,IAGJ,SAASC,GAAe3X,GACvB,GAAI4X,GAASF,EAAc1X,KAI3B,OAHA9C,GAAOyB,KAAMqB,EAAQ+H,MAAO0P,OAAmB,SAAUpQ,EAAGwQ,GAC3DD,EAAQC,IAAS,IAEXD,EAyBR1a,EAAO4a,UAAY,SAAU9X,GAI5BA,EAA6B,gBAAZA,GACd0X,EAAc1X,IAAa2X,EAAe3X,GAC5C9C,EAAOyC,UAAYK,EAEpB,IACC+X,GAEAC,EAEAC,EAEAC,EAEAC,EAEAC,EAEA9S,KAEA+S,GAASrY,EAAQsY,SAEjBC,EAAO,SAAU3W,GAOhB,IANAoW,EAAShY,EAAQgY,QAAUpW,EAC3BqW,GAAQ,EACRE,EAAcC,GAAe,EAC7BA,EAAc,EACdF,EAAe5S,EAAKrH,OACpB8Z,GAAS,EACDzS,GAAsB4S,EAAdC,EAA4BA,IAC3C,GAAK7S,EAAM6S,GAAclZ,MAAO2C,EAAM,GAAKA,EAAM,OAAU,GAAS5B,EAAQwY,YAAc,CACzFR,GAAS,CACT,OAGFD,GAAS,EACJzS,IACC+S,EACCA,EAAMpa,QACVsa,EAAMF,EAAM3O,SAEFsO,EACX1S,KAEAkQ,EAAKiD,YAKRjD,GAECsB,IAAK,WACJ,GAAKxR,EAAO,CAEX,GAAI+J,GAAQ/J,EAAKrH,QACjB,QAAU6Y,GAAKjY,GACd3B,EAAOyB,KAAME,EAAM,SAAUwI,EAAGnE,GAC/B,GAAIjC,GAAO/D,EAAO+D,KAAMiC,EACV,cAATjC,EACEjB,EAAQiV,QAAWO,EAAKzF,IAAK7M,IAClCoC,EAAK5I,KAAMwG,GAEDA,GAAOA,EAAIjF,QAAmB,WAATgD,GAEhC6V,EAAK5T,MAGJhE,WAGC6Y,EACJG,EAAe5S,EAAKrH,OAGT+Z,IACXI,EAAc/I,EACdkJ,EAAMP,IAGR,MAAO3b,OAGRqc,OAAQ,WAkBP,MAjBKpT,IACJpI,EAAOyB,KAAMO,UAAW,SAAUmI,EAAGnE,GACpC,GAAI0T,EACJ,QAAUA,EAAQ1Z,EAAOwF,QAASQ,EAAKoC,EAAMsR,IAAY,GACxDtR,EAAK5F,OAAQkX,EAAO,GAEfmB,IACUG,GAATtB,GACJsB,IAEaC,GAATvB,GACJuB,OAME9b,MAIR0T,IAAK,SAAU1S,GACd,MAAOA,GAAKH,EAAOwF,QAASrF,EAAIiI,GAAS,MAASA,IAAQA,EAAKrH,SAGhE+S,MAAO,WAGN,MAFA1L,MACA4S,EAAe,EACR7b,MAGRoc,QAAS,WAER,MADAnT,GAAO+S,EAAQL,EAASzX,OACjBlE,MAGRuU,SAAU,WACT,OAAQtL,GAGTqT,KAAM,WAKL,MAJAN,GAAQ9X,OACFyX,GACLxC,EAAKiD,UAECpc,MAGRuc,OAAQ,WACP,OAAQP,GAGTQ,SAAU,SAAUzb,EAASyB,GAU5B,OATKyG,GAAW2S,IAASI,IACxBxZ,EAAOA,MACPA,GAASzB,EAASyB,EAAKrC,MAAQqC,EAAKrC,QAAUqC,GACzCkZ,EACJM,EAAM3b,KAAMmC,GAEZ0Z,EAAM1Z,IAGDxC,MAGRkc,KAAM,WAEL,MADA/C,GAAKqD,SAAUxc,KAAM6C,WACd7C,MAGR4b,MAAO,WACN,QAASA,GAIZ,OAAOzC,IAIRtY,EAAOyC,QAENmZ,SAAU,SAAUC,GACnB,GAAIC,KAEA,UAAW,OAAQ9b,EAAO4a,UAAU,eAAgB,aACpD,SAAU,OAAQ5a,EAAO4a,UAAU,eAAgB,aACnD,SAAU,WAAY5a,EAAO4a,UAAU,YAE1CmB,EAAQ,UACRC,GACCD,MAAO,WACN,MAAOA,IAERE,OAAQ,WAEP,MADAC,GAASzU,KAAMzF,WAAYma,KAAMna,WAC1B7C,MAERid,KAAM,WACL,GAAIC,GAAMra,SACV,OAAOhC,GAAO4b,SAAS,SAAUU,GAChCtc,EAAOyB,KAAMqa,EAAQ,SAAUha,EAAGya,GACjC,GAAIpc,GAAKH,EAAOkD,WAAYmZ,EAAKva,KAASua,EAAKva,EAE/Coa,GAAUK,EAAM,IAAK,WACpB,GAAIC,GAAWrc,GAAMA,EAAG4B,MAAO5C,KAAM6C,UAChCwa,IAAYxc,EAAOkD,WAAYsZ,EAASR,SAC5CQ,EAASR,UACPvU,KAAM6U,EAASG,SACfN,KAAMG,EAASI,QACfC,SAAUL,EAASM,QAErBN,EAAUC,EAAO,GAAM,QAAUpd,OAAS6c,EAAUM,EAASN,UAAY7c,KAAMgB,GAAOqc,GAAaxa,eAItGqa,EAAM,OACJL,WAIJA,QAAS,SAAUlY,GAClB,MAAc,OAAPA,EAAc9D,EAAOyC,OAAQqB,EAAKkY,GAAYA,IAGvDE,IAwCD,OArCAF,GAAQa,KAAOb,EAAQI,KAGvBpc,EAAOyB,KAAMqa,EAAQ,SAAUha,EAAGya,GACjC,GAAInU,GAAOmU,EAAO,GACjBO,EAAcP,EAAO,EAGtBP,GAASO,EAAM,IAAOnU,EAAKwR,IAGtBkD,GACJ1U,EAAKwR,IAAI,WAERmC,EAAQe,GAGNhB,EAAY,EAAJha,GAAS,GAAIyZ,QAASO,EAAQ,GAAK,GAAIL,MAInDS,EAAUK,EAAM,IAAO,WAEtB,MADAL,GAAUK,EAAM,GAAK,QAAUpd,OAAS+c,EAAWF,EAAU7c,KAAM6C,WAC5D7C,MAER+c,EAAUK,EAAM,GAAK,QAAWnU,EAAKuT,WAItCK,EAAQA,QAASE,GAGZL,GACJA,EAAK5a,KAAMib,EAAUA,GAIfA,GAIRa,KAAM,SAAUC,GACf,GAAIlb,GAAI,EACPmb,EAAgB3d,EAAM2B,KAAMe,WAC5BjB,EAASkc,EAAclc,OAGvBmc,EAAuB,IAAXnc,GAAkBic,GAAehd,EAAOkD,WAAY8Z,EAAYhB,SAAcjb,EAAS,EAGnGmb,EAAyB,IAAdgB,EAAkBF,EAAchd,EAAO4b,WAGlDuB,EAAa,SAAUrb,EAAG8T,EAAUwH,GACnC,MAAO,UAAUnY,GAChB2Q,EAAU9T,GAAM3C,KAChBie,EAAQtb,GAAME,UAAUjB,OAAS,EAAIzB,EAAM2B,KAAMe,WAAciD,EAC1DmY,IAAWC,EACfnB,EAASoB,WAAY1H,EAAUwH,KAEhBF,GACfhB,EAASqB,YAAa3H,EAAUwH,KAKnCC,EAAgBG,EAAkBC,CAGnC,IAAK1c,EAAS,EAIb,IAHAsc,EAAiB,GAAIrZ,OAAOjD,GAC5Byc,EAAmB,GAAIxZ,OAAOjD,GAC9B0c,EAAkB,GAAIzZ,OAAOjD,GACjBA,EAAJe,EAAYA,IACdmb,EAAenb,IAAO9B,EAAOkD,WAAY+Z,EAAenb,GAAIka,SAChEiB,EAAenb,GAAIka,UACjBvU,KAAM0V,EAAYrb,EAAG2b,EAAiBR,IACtCd,KAAMD,EAASQ,QACfC,SAAUQ,EAAYrb,EAAG0b,EAAkBH,MAE3CH,CAUL,OAJMA,IACLhB,EAASqB,YAAaE,EAAiBR,GAGjCf,EAASF,YAMlB,IAAI0B,EAEJ1d,GAAOG,GAAGwY,MAAQ,SAAUxY,GAI3B,MAFAH,GAAO2Y,MAAMqD,UAAUvU,KAAMtH,GAEtBhB,MAGRa,EAAOyC,QAENiB,SAAS,EAITia,UAAW,EAGXC,UAAW,SAAUC,GACfA,EACJ7d,EAAO2d,YAEP3d,EAAO2Y,OAAO,IAKhBA,MAAO,SAAUmF,GAGhB,GAAKA,KAAS,KAAS9d,EAAO2d,WAAY3d,EAAO0D,QAAjD,CAKA,IAAM3E,EAASgf,KACd,MAAOC,YAAYhe,EAAO2Y,MAI3B3Y,GAAO0D,SAAU,EAGZoa,KAAS,KAAU9d,EAAO2d,UAAY,IAK3CD,EAAUH,YAAaxe,GAAYiB,IAG9BA,EAAOG,GAAG8d,iBACdje,EAAQjB,GAAWkf,eAAgB,SACnCje,EAAQjB,GAAWmf,IAAK,cAQ3B,SAASC,KACHpf,EAASoP,kBACbpP,EAASqf,oBAAqB,mBAAoBC,GAAW,GAC7Dnf,EAAOkf,oBAAqB,OAAQC,GAAW,KAG/Ctf,EAASuf,YAAa,qBAAsBD,GAC5Cnf,EAAOof,YAAa,SAAUD,IAOhC,QAASA,MAEHtf,EAASoP,kBAAmC,SAAfoQ,MAAMxa,MAA2C,aAAxBhF,EAASyf,cACnEL,IACAne,EAAO2Y,SAIT3Y,EAAO2Y,MAAMqD,QAAU,SAAUlY,GAChC,IAAM4Z,EAOL,GALAA,EAAY1d,EAAO4b,WAKU,aAAxB7c,EAASyf,WAEbR,WAAYhe,EAAO2Y,WAGb,IAAK5Z,EAASoP,iBAEpBpP,EAASoP,iBAAkB,mBAAoBkQ,GAAW,GAG1Dnf,EAAOiP,iBAAkB,OAAQkQ,GAAW,OAGtC,CAENtf,EAASqP,YAAa,qBAAsBiQ,GAG5Cnf,EAAOkP,YAAa,SAAUiQ,EAI9B,IAAInQ,IAAM,CAEV,KACCA,EAA6B,MAAvBhP,EAAOuf,cAAwB1f,EAAS6O,gBAC7C,MAAMrJ,IAEH2J,GAAOA,EAAIwQ,WACf,QAAUC,KACT,IAAM3e,EAAO0D,QAAU,CAEtB,IAGCwK,EAAIwQ,SAAS,QACZ,MAAMna,GACP,MAAOyZ,YAAYW,EAAe,IAInCR,IAGAne,EAAO2Y,YAMZ,MAAO+E,GAAU1B,QAASlY,GAI3B,IAAI8a,GAAe,YAMf9c,CACJ,KAAMA,IAAK9B,GAAQF,GAClB,KAEDA,GAAQ0E,QAAgB,MAAN1C,EAIlBhC,EAAQ+e,wBAAyB,EAGjC7e,EAAO,WAEN,GAAImQ,GAAKxD,EAAKoR,EAAMe,CAEpBf,GAAOhf,EAAS0M,qBAAsB,QAAU,GAC1CsS,GAASA,EAAKgB,QAMpBpS,EAAM5N,EAAS6N,cAAe,OAC9BkS,EAAY/f,EAAS6N,cAAe,OACpCkS,EAAUC,MAAMC,QAAU,iEAC1BjB,EAAKzP,YAAawQ,GAAYxQ,YAAa3B,SAE/BA,GAAIoS,MAAME,OAASL,IAK9BjS,EAAIoS,MAAMC,QAAU,gEAEpBlf,EAAQ+e,uBAAyB1O,EAA0B,IAApBxD,EAAIuS,YACtC/O,IAIJ4N,EAAKgB,MAAME,KAAO,IAIpBlB,EAAKlR,YAAaiS,MAMnB,WACC,GAAInS,GAAM5N,EAAS6N,cAAe,MAGlC,IAA6B,MAAzB9M,EAAQqf,cAAuB,CAElCrf,EAAQqf,eAAgB,CACxB,WACQxS,GAAIf,KACV,MAAOrH,GACRzE,EAAQqf,eAAgB,GAK1BxS,EAAM,QAOP3M,EAAOof,WAAa,SAAUvd,GAC7B,GAAIwd,GAASrf,EAAOqf,QAASxd,EAAKkD,SAAW,KAAKC,eACjDV,GAAYzC,EAAKyC,UAAY,CAG9B,OAAoB,KAAbA,GAA+B,IAAbA,GACxB,GAGC+a,GAAUA,KAAW,GAAQxd,EAAKgK,aAAa,aAAewT,EAIjE,IAAIC,GAAS,gCACZC,EAAa,UAEd,SAASC,GAAU3d,EAAMwC,EAAKK,GAG7B,GAAcrB,SAATqB,GAAwC,IAAlB7C,EAAKyC,SAAiB,CAEhD,GAAIzB,GAAO,QAAUwB,EAAIZ,QAAS8b,EAAY,OAAQva,aAItD,IAFAN,EAAO7C,EAAKgK,aAAchJ,GAEL,gBAAT6B,GAAoB,CAC/B,IACCA,EAAgB,SAATA,GAAkB,EACf,UAATA,GAAmB,EACV,SAATA,EAAkB,MAEjBA,EAAO,KAAOA,GAAQA,EACvB4a,EAAO1T,KAAMlH,GAAS1E,EAAOyf,UAAW/a,GACxCA,EACA,MAAOH,IAGTvE,EAAO0E,KAAM7C,EAAMwC,EAAKK,OAGxBA,GAAOrB,OAIT,MAAOqB,GAIR,QAASgb,GAAmB5b,GAC3B,GAAIjB,EACJ,KAAMA,IAAQiB,GAGb,IAAc,SAATjB,IAAmB7C,EAAOoE,cAAeN,EAAIjB,MAGpC,WAATA,EACJ,OAAO;;AAIT,OAAO,EAGR,QAAS8c,GAAc9d,EAAMgB,EAAM6B,EAAMkb,GACxC,GAAM5f,EAAOof,WAAYvd,GAAzB,CAIA,GAAIP,GAAKue,EACRC,EAAc9f,EAAOsD,QAIrByc,EAASle,EAAKyC,SAIdgI,EAAQyT,EAAS/f,EAAOsM,MAAQzK,EAIhC2J,EAAKuU,EAASle,EAAMie,GAAgBje,EAAMie,IAAiBA,CAI5D,IAAOtU,GAAOc,EAAMd,KAASoU,GAAQtT,EAAMd,GAAI9G,OAAmBrB,SAATqB,GAAsC,gBAAT7B,GAgEtF,MA5DM2I,KAIJA,EADIuU,EACCle,EAAMie,GAAgBzgB,EAAW6I,OAASlI,EAAOiG,OAEjD6Z,GAIDxT,EAAOd,KAGZc,EAAOd,GAAOuU,MAAgBC,OAAQhgB,EAAO6D,QAKzB,gBAAThB,IAAqC,kBAATA,MAClC+c,EACJtT,EAAOd,GAAOxL,EAAOyC,OAAQ6J,EAAOd,GAAM3I,GAE1CyJ,EAAOd,GAAK9G,KAAO1E,EAAOyC,OAAQ6J,EAAOd,GAAK9G,KAAM7B,IAItDgd,EAAYvT,EAAOd,GAKboU,IACCC,EAAUnb,OACfmb,EAAUnb,SAGXmb,EAAYA,EAAUnb,MAGTrB,SAATqB,IACJmb,EAAW7f,EAAO6E,UAAWhC,IAAW6B,GAKpB,gBAAT7B,IAGXvB,EAAMue,EAAWhd,GAGL,MAAPvB,IAGJA,EAAMue,EAAW7f,EAAO6E,UAAWhC,MAGpCvB,EAAMue,EAGAve,GAGR,QAAS2e,GAAoBpe,EAAMgB,EAAM+c,GACxC,GAAM5f,EAAOof,WAAYvd,GAAzB,CAIA,GAAIge,GAAW/d,EACdie,EAASle,EAAKyC,SAGdgI,EAAQyT,EAAS/f,EAAOsM,MAAQzK,EAChC2J,EAAKuU,EAASle,EAAM7B,EAAOsD,SAAYtD,EAAOsD,OAI/C,IAAMgJ,EAAOd,GAAb,CAIA,GAAK3I,IAEJgd,EAAYD,EAAMtT,EAAOd,GAAOc,EAAOd,GAAK9G,MAE3B,CAGV1E,EAAOoD,QAASP,GAsBrBA,EAAOA,EAAKtD,OAAQS,EAAO4B,IAAKiB,EAAM7C,EAAO6E,YAnBxChC,IAAQgd,GACZhd,GAASA,IAITA,EAAO7C,EAAO6E,UAAWhC,GAExBA,EADIA,IAAQgd,IACHhd,GAEFA,EAAKyD,MAAM,MAarBxE,EAAIe,EAAK9B,MACT,OAAQe,UACA+d,GAAWhd,EAAKf,GAKxB,IAAK8d,GAAOF,EAAkBG,IAAc7f,EAAOoE,cAAcyb,GAChE,QAMGD,UACEtT,GAAOd,GAAK9G,KAIbgb,EAAmBpT,EAAOd,QAM5BuU,EACJ/f,EAAOkgB,WAAare,IAAQ,GAIjB/B,EAAQqf,eAAiB7S,GAASA,EAAMpN,aAE5CoN,GAAOd,GAIdc,EAAOd,GAAO,QAIhBxL,EAAOyC,QACN6J,SAIA+S,QACCc,WAAW,EACXC,UAAU,EAEVC,UAAW,8CAGZC,QAAS,SAAUze,GAElB,MADAA,GAAOA,EAAKyC,SAAWtE,EAAOsM,MAAOzK,EAAK7B,EAAOsD,UAAazB,EAAM7B,EAAOsD,WAClEzB,IAAS6d,EAAmB7d,IAGtC6C,KAAM,SAAU7C,EAAMgB,EAAM6B,GAC3B,MAAOib,GAAc9d,EAAMgB,EAAM6B,IAGlC6b,WAAY,SAAU1e,EAAMgB,GAC3B,MAAOod,GAAoBpe,EAAMgB,IAIlC2d,MAAO,SAAU3e,EAAMgB,EAAM6B,GAC5B,MAAOib,GAAc9d,EAAMgB,EAAM6B,GAAM,IAGxC+b,YAAa,SAAU5e,EAAMgB,GAC5B,MAAOod,GAAoBpe,EAAMgB,GAAM,MAIzC7C,EAAOG,GAAGsC,QACTiC,KAAM,SAAUL,EAAKY,GACpB,GAAInD,GAAGe,EAAM6B,EACZ7C,EAAO1C,KAAK,GACZ4N,EAAQlL,GAAQA,EAAK4G,UAMtB,IAAapF,SAARgB,EAAoB,CACxB,GAAKlF,KAAK4B,SACT2D,EAAO1E,EAAO0E,KAAM7C,GAEG,IAAlBA,EAAKyC,WAAmBtE,EAAOwgB,MAAO3e,EAAM,gBAAkB,CAClEC,EAAIiL,EAAMhM,MACV,OAAQe,IAIFiL,EAAOjL,KACXe,EAAOkK,EAAOjL,GAAIe,KACe,IAA5BA,EAAKpD,QAAS,WAClBoD,EAAO7C,EAAO6E,UAAWhC,EAAKvD,MAAM,IACpCkgB,EAAU3d,EAAMgB,EAAM6B,EAAM7B,KAI/B7C,GAAOwgB,MAAO3e,EAAM,eAAe,GAIrC,MAAO6C,GAIR,MAAoB,gBAARL,GACJlF,KAAKsC,KAAK,WAChBzB,EAAO0E,KAAMvF,KAAMkF,KAIdrC,UAAUjB,OAAS,EAGzB5B,KAAKsC,KAAK,WACTzB,EAAO0E,KAAMvF,KAAMkF,EAAKY,KAKzBpD,EAAO2d,EAAU3d,EAAMwC,EAAKrE,EAAO0E,KAAM7C,EAAMwC,IAAUhB,QAG3Dkd,WAAY,SAAUlc,GACrB,MAAOlF,MAAKsC,KAAK,WAChBzB,EAAOugB,WAAYphB,KAAMkF,QAM5BrE,EAAOyC,QACNie,MAAO,SAAU7e,EAAMkC,EAAMW,GAC5B,GAAIgc,EAEJ,OAAK7e,IACJkC,GAASA,GAAQ,MAAS,QAC1B2c,EAAQ1gB,EAAOwgB,MAAO3e,EAAMkC,GAGvBW,KACEgc,GAAS1gB,EAAOoD,QAAQsB,GAC7Bgc,EAAQ1gB,EAAOwgB,MAAO3e,EAAMkC,EAAM/D,EAAOoF,UAAUV,IAEnDgc,EAAMlhB,KAAMkF,IAGPgc,OAZR,QAgBDC,QAAS,SAAU9e,EAAMkC,GACxBA,EAAOA,GAAQ,IAEf,IAAI2c,GAAQ1gB,EAAO0gB,MAAO7e,EAAMkC,GAC/B6c,EAAcF,EAAM3f,OACpBZ,EAAKugB,EAAMlU,QACXqU,EAAQ7gB,EAAO8gB,YAAajf,EAAMkC,GAClCiV,EAAO,WACNhZ,EAAO2gB,QAAS9e,EAAMkC,GAIZ,gBAAP5D,IACJA,EAAKugB,EAAMlU,QACXoU,KAGIzgB,IAIU,OAAT4D,GACJ2c,EAAM3Q,QAAS,oBAIT8Q,GAAME,KACb5gB,EAAGc,KAAMY,EAAMmX,EAAM6H,KAGhBD,GAAeC,GACpBA,EAAM/M,MAAMuH,QAKdyF,YAAa,SAAUjf,EAAMkC,GAC5B,GAAIM,GAAMN,EAAO,YACjB,OAAO/D,GAAOwgB,MAAO3e,EAAMwC,IAASrE,EAAOwgB,MAAO3e,EAAMwC,GACvDyP,MAAO9T,EAAO4a,UAAU,eAAehB,IAAI,WAC1C5Z,EAAOygB,YAAa5e,EAAMkC,EAAO,SACjC/D,EAAOygB,YAAa5e,EAAMwC,UAM9BrE,EAAOG,GAAGsC,QACTie,MAAO,SAAU3c,EAAMW,GACtB,GAAIsc,GAAS,CAQb,OANqB,gBAATjd,KACXW,EAAOX,EACPA,EAAO,KACPid,KAGIhf,UAAUjB,OAASigB,EAChBhhB,EAAO0gB,MAAOvhB,KAAK,GAAI4E,GAGfV,SAATqB,EACNvF,KACAA,KAAKsC,KAAK,WACT,GAAIif,GAAQ1gB,EAAO0gB,MAAOvhB,KAAM4E,EAAMW,EAGtC1E,GAAO8gB,YAAa3hB,KAAM4E,GAEZ,OAATA,GAA8B,eAAb2c,EAAM,IAC3B1gB,EAAO2gB,QAASxhB,KAAM4E,MAI1B4c,QAAS,SAAU5c,GAClB,MAAO5E,MAAKsC,KAAK,WAChBzB,EAAO2gB,QAASxhB,KAAM4E,MAGxBkd,WAAY,SAAUld,GACrB,MAAO5E,MAAKuhB,MAAO3c,GAAQ,UAI5BiY,QAAS,SAAUjY,EAAMD,GACxB,GAAIqC,GACH+a,EAAQ,EACRC,EAAQnhB,EAAO4b,WACf3L,EAAW9Q,KACX2C,EAAI3C,KAAK4B,OACT0b,EAAU,aACCyE,GACTC,EAAM5D,YAAatN,GAAYA,IAIb,iBAATlM,KACXD,EAAMC,EACNA,EAAOV,QAERU,EAAOA,GAAQ,IAEf,OAAQjC,IACPqE,EAAMnG,EAAOwgB,MAAOvQ,EAAUnO,GAAKiC,EAAO,cACrCoC,GAAOA,EAAI2N,QACfoN,IACA/a,EAAI2N,MAAM8F,IAAK6C,GAIjB,OADAA,KACO0E,EAAMnF,QAASlY,KAGxB,IAAIsd,GAAO,sCAAwCC,OAE/CC,GAAc,MAAO,QAAS,SAAU,QAExCC,EAAW,SAAU1f,EAAM2f,GAI7B,MADA3f,GAAO2f,GAAM3f,EAC4B,SAAlC7B,EAAOyhB,IAAK5f,EAAM,aAA2B7B,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,IAOvF6f,EAAS1hB,EAAO0hB,OAAS,SAAUrgB,EAAOlB,EAAIkE,EAAKY,EAAO0c,EAAWC,EAAUC,GAClF,GAAI/f,GAAI,EACPf,EAASM,EAAMN,OACf+gB,EAAc,MAAPzd,CAGR,IAA4B,WAAvBrE,EAAO+D,KAAMM,GAAqB,CACtCsd,GAAY,CACZ,KAAM7f,IAAKuC,GACVrE,EAAO0hB,OAAQrgB,EAAOlB,EAAI2B,EAAGuC,EAAIvC,IAAI,EAAM8f,EAAUC,OAIhD,IAAexe,SAAV4B,IACX0c,GAAY,EAEN3hB,EAAOkD,WAAY+B,KACxB4c,GAAM,GAGFC,IAECD,GACJ1hB,EAAGc,KAAMI,EAAO4D,GAChB9E,EAAK,OAIL2hB,EAAO3hB,EACPA,EAAK,SAAU0B,EAAMwC,EAAKY,GACzB,MAAO6c,GAAK7gB,KAAMjB,EAAQ6B,GAAQoD,MAKhC9E,GACJ,KAAYY,EAAJe,EAAYA,IACnB3B,EAAIkB,EAAMS,GAAIuC,EAAKwd,EAAM5c,EAAQA,EAAMhE,KAAMI,EAAMS,GAAIA,EAAG3B,EAAIkB,EAAMS,GAAIuC,IAK3E,OAAOsd,GACNtgB,EAGAygB,EACC3hB,EAAGc,KAAMI,GACTN,EAASZ,EAAIkB,EAAM,GAAIgD,GAAQud,GAE9BG,EAAiB,yBAIrB,WAEC,GAAI/S,GAAQjQ,EAAS6N,cAAe,SACnCD,EAAM5N,EAAS6N,cAAe,OAC9BoV,EAAWjjB,EAASkjB,wBAsDrB,IAnDAtV,EAAIoC,UAAY,qEAGhBjP,EAAQoiB,kBAAgD,IAA5BvV,EAAI+D,WAAWpM,SAI3CxE,EAAQqiB,OAASxV,EAAIlB,qBAAsB,SAAU1K,OAIrDjB,EAAQsiB,gBAAkBzV,EAAIlB,qBAAsB,QAAS1K,OAI7DjB,EAAQuiB,WACyD,kBAAhEtjB,EAAS6N,cAAe,OAAQ0V,WAAW,GAAOC,UAInDvT,EAAMjL,KAAO,WACbiL,EAAM2E,SAAU,EAChBqO,EAAS1T,YAAaU,GACtBlP,EAAQ0iB,cAAgBxT,EAAM2E,QAI9BhH,EAAIoC,UAAY,yBAChBjP,EAAQ2iB,iBAAmB9V,EAAI2V,WAAW,GAAOjQ,UAAUyF,aAG3DkK,EAAS1T,YAAa3B,GACtBA,EAAIoC,UAAY,mDAIhBjP,EAAQ4iB,WAAa/V,EAAI2V,WAAW,GAAOA,WAAW,GAAOjQ,UAAUsB,QAKvE7T,EAAQ6iB,cAAe,EAClBhW,EAAIyB,cACRzB,EAAIyB,YAAa,UAAW,WAC3BtO,EAAQ6iB,cAAe,IAGxBhW,EAAI2V,WAAW,GAAOM,SAIM,MAAzB9iB,EAAQqf,cAAuB,CAElCrf,EAAQqf,eAAgB,CACxB,WACQxS,GAAIf,KACV,MAAOrH,GACRzE,EAAQqf,eAAgB,OAM3B,WACC,GAAIrd,GAAG+gB,EACNlW,EAAM5N,EAAS6N,cAAe,MAG/B,KAAM9K,KAAO4S,QAAQ,EAAMoO,QAAQ,EAAMC,SAAS,GACjDF,EAAY,KAAO/gB,GAEZhC,EAASgC,EAAI,WAAc+gB,IAAa3jB,MAE9CyN,EAAIb,aAAc+W,EAAW,KAC7B/iB,EAASgC,EAAI,WAAc6K,EAAIlE,WAAYoa,GAAYvf,WAAY,EAKrEqJ,GAAM,OAIP,IAAIqW,GAAa,+BAChBC,EAAY,OACZC,EAAc,uCACdC,EAAc,kCACdC,EAAiB,sBAElB,SAASC,MACR,OAAO,EAGR,QAASC,MACR,OAAO,EAGR,QAASC,MACR,IACC,MAAOxkB,GAASsU,cACf,MAAQmQ,KAOXxjB,EAAOue,OAEN5f,UAEAib,IAAK,SAAU/X,EAAM4hB,EAAOzW,EAAStI,EAAMzE,GAC1C,GAAIkG,GAAKud,EAAQC,EAAGC,EACnBC,EAASC,EAAaC,EACtBC,EAAUjgB,EAAMkgB,EAAYC,EAC5BC,EAAWnkB,EAAOwgB,MAAO3e,EAG1B,IAAMsiB,EAAN,CAKKnX,EAAQA,UACZ4W,EAAc5W,EACdA,EAAU4W,EAAY5W,QACtB/M,EAAW2jB,EAAY3jB,UAIlB+M,EAAQ/G,OACb+G,EAAQ/G,KAAOjG,EAAOiG,SAIhByd,EAASS,EAAST,UACxBA,EAASS,EAAST,YAEZI,EAAcK,EAASC,UAC7BN,EAAcK,EAASC,OAAS,SAAU7f,GAGzC,aAAcvE,KAAW4e,GAAkBra,GAAKvE,EAAOue,MAAM8F,YAAc9f,EAAER,KAE5EV,OADArD,EAAOue,MAAM+F,SAASviB,MAAO+hB,EAAYjiB,KAAMG,YAIjD8hB,EAAYjiB,KAAOA,GAIpB4hB,GAAUA,GAAS,IAAK5Y,MAAO0P,KAAiB,IAChDoJ,EAAIF,EAAM1iB,MACV,OAAQ4iB,IACPxd,EAAMid,EAAe/X,KAAMoY,EAAME,QACjC5f,EAAOmgB,EAAW/d,EAAI,GACtB8d,GAAe9d,EAAI,IAAM,IAAKG,MAAO,KAAM/D,OAGrCwB,IAKN8f,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAGhCA,GAAS9D,EAAW4jB,EAAQU,aAAeV,EAAQW,WAAczgB,EAGjE8f,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAGhCggB,EAAY/jB,EAAOyC,QAClBsB,KAAMA,EACNmgB,SAAUA,EACVxf,KAAMA,EACNsI,QAASA,EACT/G,KAAM+G,EAAQ/G,KACdhG,SAAUA,EACVyJ,aAAczJ,GAAYD,EAAOgQ,KAAKnF,MAAMnB,aAAakC,KAAM3L,GAC/DwkB,UAAWR,EAAWhY,KAAK,MACzB2X,IAGII,EAAWN,EAAQ3f,MACzBigB,EAAWN,EAAQ3f,MACnBigB,EAASU,cAAgB,EAGnBb,EAAQc,OAASd,EAAQc,MAAM1jB,KAAMY,EAAM6C,EAAMuf,EAAYH,MAAkB,IAE/EjiB,EAAKsM,iBACTtM,EAAKsM,iBAAkBpK,EAAM+f,GAAa,GAE/BjiB,EAAKuM,aAChBvM,EAAKuM,YAAa,KAAOrK,EAAM+f,KAK7BD,EAAQjK,MACZiK,EAAQjK,IAAI3Y,KAAMY,EAAMkiB,GAElBA,EAAU/W,QAAQ/G,OACvB8d,EAAU/W,QAAQ/G,KAAO+G,EAAQ/G,OAK9BhG,EACJ+jB,EAASxhB,OAAQwhB,EAASU,gBAAiB,EAAGX,GAE9CC,EAASxkB,KAAMukB,GAIhB/jB,EAAOue,MAAM5f,OAAQoF,IAAS,EAI/BlC,GAAO,OAIR2Z,OAAQ,SAAU3Z,EAAM4hB,EAAOzW,EAAS/M,EAAU2kB,GACjD,GAAIviB,GAAG0hB,EAAW5d,EACjB0e,EAAWlB,EAAGD,EACdG,EAASG,EAAUjgB,EACnBkgB,EAAYC,EACZC,EAAWnkB,EAAOsgB,QAASze,IAAU7B,EAAOwgB,MAAO3e,EAEpD,IAAMsiB,IAAcT,EAASS,EAAST,QAAtC,CAKAD,GAAUA,GAAS,IAAK5Y,MAAO0P,KAAiB,IAChDoJ,EAAIF,EAAM1iB,MACV,OAAQ4iB,IAMP,GALAxd,EAAMid,EAAe/X,KAAMoY,EAAME,QACjC5f,EAAOmgB,EAAW/d,EAAI,GACtB8d,GAAe9d,EAAI,IAAM,IAAKG,MAAO,KAAM/D,OAGrCwB,EAAN,CAOA8f,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAChCA,GAAS9D,EAAW4jB,EAAQU,aAAeV,EAAQW,WAAczgB,EACjEigB,EAAWN,EAAQ3f,OACnBoC,EAAMA,EAAI,IAAM,GAAIyC,QAAQ,UAAYqb,EAAWhY,KAAK,iBAAmB,WAG3E4Y,EAAYxiB,EAAI2hB,EAASjjB,MACzB,OAAQsB,IACP0hB,EAAYC,EAAU3hB,IAEfuiB,GAAeV,IAAaH,EAAUG,UACzClX,GAAWA,EAAQ/G,OAAS8d,EAAU9d,MACtCE,IAAOA,EAAIyF,KAAMmY,EAAUU,YAC3BxkB,GAAYA,IAAa8jB,EAAU9jB,WAAyB,OAAbA,IAAqB8jB,EAAU9jB,YACjF+jB,EAASxhB,OAAQH,EAAG,GAEf0hB,EAAU9jB,UACd+jB,EAASU,gBAELb,EAAQrI,QACZqI,EAAQrI,OAAOva,KAAMY,EAAMkiB,GAOzBc,KAAcb,EAASjjB,SACrB8iB,EAAQiB,UAAYjB,EAAQiB,SAAS7jB,KAAMY,EAAMoiB,EAAYE,EAASC,WAAa,GACxFpkB,EAAO+kB,YAAaljB,EAAMkC,EAAMogB,EAASC,cAGnCV,GAAQ3f,QAtCf,KAAMA,IAAQ2f,GACb1jB,EAAOue,MAAM/C,OAAQ3Z,EAAMkC,EAAO0f,EAAOE,GAAK3W,EAAS/M,GAAU,EA0C/DD,GAAOoE,cAAesf,WACnBS,GAASC,OAIhBpkB,EAAOygB,YAAa5e,EAAM,aAI5BmjB,QAAS,SAAUzG,EAAO7Z,EAAM7C,EAAMojB,GACrC,GAAIb,GAAQc,EAAQ/X,EACnBgY,EAAYtB,EAAS1d,EAAKrE,EAC1BsjB,GAAcvjB,GAAQ9C,GACtBgF,EAAOnE,EAAOqB,KAAMsd,EAAO,QAAWA,EAAMxa,KAAOwa,EACnD0F,EAAarkB,EAAOqB,KAAMsd,EAAO,aAAgBA,EAAMkG,UAAUne,MAAM,OAKxE,IAHA6G,EAAMhH,EAAMtE,EAAOA,GAAQ9C,EAGJ,IAAlB8C,EAAKyC,UAAoC,IAAlBzC,EAAKyC,WAK5B6e,EAAYvX,KAAM7H,EAAO/D,EAAOue,MAAM8F,aAItCtgB,EAAKtE,QAAQ,MAAQ,IAEzBwkB,EAAalgB,EAAKuC,MAAM,KACxBvC,EAAOkgB,EAAWzX,QAClByX,EAAW1hB,QAEZ2iB,EAASnhB,EAAKtE,QAAQ,KAAO,GAAK,KAAOsE,EAGzCwa,EAAQA,EAAOve,EAAOsD,SACrBib,EACA,GAAIve,GAAOqlB,MAAOthB,EAAuB,gBAAVwa,IAAsBA,GAGtDA,EAAM+G,UAAYL,EAAe,EAAI,EACrC1G,EAAMkG,UAAYR,EAAWhY,KAAK,KAClCsS,EAAMgH,aAAehH,EAAMkG,UAC1B,GAAI7b,QAAQ,UAAYqb,EAAWhY,KAAK,iBAAmB,WAC3D,KAGDsS,EAAM5M,OAAStO,OACTkb,EAAMvb,SACXub,EAAMvb,OAASnB,GAIhB6C,EAAe,MAARA,GACJ6Z,GACFve,EAAOoF,UAAWV,GAAQ6Z,IAG3BsF,EAAU7jB,EAAOue,MAAMsF,QAAS9f,OAC1BkhB,IAAgBpB,EAAQmB,SAAWnB,EAAQmB,QAAQjjB,MAAOF,EAAM6C,MAAW,GAAjF,CAMA,IAAMugB,IAAiBpB,EAAQ2B,WAAaxlB,EAAOiE,SAAUpC,GAAS,CAMrE,IAJAsjB,EAAatB,EAAQU,cAAgBxgB,EAC/Bof,EAAYvX,KAAMuZ,EAAaphB,KACpCoJ,EAAMA,EAAI5B,YAEH4B,EAAKA,EAAMA,EAAI5B,WACtB6Z,EAAU5lB,KAAM2N,GAChBhH,EAAMgH,CAIFhH,MAAStE,EAAKuJ,eAAiBrM,IACnCqmB,EAAU5lB,KAAM2G,EAAI8H,aAAe9H,EAAIsf,cAAgBvmB,GAKzD4C,EAAI,CACJ,QAASqL,EAAMiY,EAAUtjB,QAAUyc,EAAMmH,uBAExCnH,EAAMxa,KAAOjC,EAAI,EAChBqjB,EACAtB,EAAQW,UAAYzgB,EAGrBqgB,GAAWpkB,EAAOwgB,MAAOrT,EAAK,eAAoBoR,EAAMxa,OAAU/D,EAAOwgB,MAAOrT,EAAK,UAChFiX,GACJA,EAAOriB,MAAOoL,EAAKzI,GAIpB0f,EAASc,GAAU/X,EAAK+X,GACnBd,GAAUA,EAAOriB,OAAS/B,EAAOof,WAAYjS,KACjDoR,EAAM5M,OAASyS,EAAOriB,MAAOoL,EAAKzI,GAC7B6Z,EAAM5M,UAAW,GACrB4M,EAAMoH,iBAOT,IAHApH,EAAMxa,KAAOA,GAGPkhB,IAAiB1G,EAAMqH,wBAErB/B,EAAQgC,UAAYhC,EAAQgC,SAAS9jB,MAAOqjB,EAAUld,MAAOxD,MAAW,IAC9E1E,EAAOof,WAAYvd,IAKdqjB,GAAUrjB,EAAMkC,KAAW/D,EAAOiE,SAAUpC,GAAS,CAGzDsE,EAAMtE,EAAMqjB,GAEP/e,IACJtE,EAAMqjB,GAAW,MAIlBllB,EAAOue,MAAM8F,UAAYtgB,CACzB,KACClC,EAAMkC,KACL,MAAQQ,IAIVvE,EAAOue,MAAM8F,UAAYhhB,OAEpB8C,IACJtE,EAAMqjB,GAAW/e,GAMrB,MAAOoY,GAAM5M,SAGd2S,SAAU,SAAU/F,GAGnBA,EAAQve,EAAOue,MAAMuH,IAAKvH,EAE1B,IAAIzc,GAAGR,EAAKyiB,EAAWtR,EAASpQ,EAC/B0jB,KACApkB,EAAOrC,EAAM2B,KAAMe,WACnBgiB,GAAahkB,EAAOwgB,MAAOrhB,KAAM,eAAoBof,EAAMxa,UAC3D8f,EAAU7jB,EAAOue,MAAMsF,QAAStF,EAAMxa,SAOvC,IAJApC,EAAK,GAAK4c,EACVA,EAAMyH,eAAiB7mB,MAGlB0kB,EAAQoC,aAAepC,EAAQoC,YAAYhlB,KAAM9B,KAAMof,MAAY,EAAxE,CAKAwH,EAAe/lB,EAAOue,MAAMyF,SAAS/iB,KAAM9B,KAAMof,EAAOyF,GAGxDliB,EAAI,CACJ,QAAS2Q,EAAUsT,EAAcjkB,QAAWyc,EAAMmH,uBAAyB,CAC1EnH,EAAM2H,cAAgBzT,EAAQ5Q,KAE9BQ,EAAI,CACJ,QAAS0hB,EAAYtR,EAAQuR,SAAU3hB,QAAWkc,EAAM4H,kCAIjD5H,EAAMgH,cAAgBhH,EAAMgH,aAAa3Z,KAAMmY,EAAUU,cAE9DlG,EAAMwF,UAAYA,EAClBxF,EAAM7Z,KAAOqf,EAAUrf,KAEvBpD,IAAStB,EAAOue,MAAMsF,QAASE,EAAUG,eAAkBE,QAAUL,EAAU/W,SAC5EjL,MAAO0Q,EAAQ5Q,KAAMF,GAEX0B,SAAR/B,IACEid,EAAM5M,OAASrQ,MAAS,IAC7Bid,EAAMoH,iBACNpH,EAAM6H,oBAYX,MAJKvC,GAAQwC,cACZxC,EAAQwC,aAAaplB,KAAM9B,KAAMof,GAG3BA,EAAM5M,SAGdqS,SAAU,SAAUzF,EAAOyF,GAC1B,GAAIsC,GAAKvC,EAAWje,EAAShE,EAC5BikB,KACArB,EAAgBV,EAASU,cACzBvX,EAAMoR,EAAMvb,MAKb,IAAK0hB,GAAiBvX,EAAI7I,YAAcia,EAAMvK,QAAyB,UAAfuK,EAAMxa,MAG7D,KAAQoJ,GAAOhO,KAAMgO,EAAMA,EAAI5B,YAAcpM,KAK5C,GAAsB,IAAjBgO,EAAI7I,WAAmB6I,EAAIuG,YAAa,GAAuB,UAAf6K,EAAMxa,MAAoB,CAE9E,IADA+B,KACMhE,EAAI,EAAO4iB,EAAJ5iB,EAAmBA,IAC/BiiB,EAAYC,EAAUliB,GAGtBwkB,EAAMvC,EAAU9jB,SAAW,IAEHoD,SAAnByC,EAASwgB,KACbxgB,EAASwgB,GAAQvC,EAAUra,aAC1B1J,EAAQsmB,EAAKnnB,MAAOua,MAAOvM,IAAS,EACpCnN,EAAO0O,KAAM4X,EAAKnnB,KAAM,MAAQgO,IAAQpM,QAErC+E,EAASwgB,IACbxgB,EAAQtG,KAAMukB,EAGXje,GAAQ/E,QACZglB,EAAavmB,MAAOqC,KAAMsL,EAAK6W,SAAUle,IAW7C,MAJK4e,GAAgBV,EAASjjB,QAC7BglB,EAAavmB,MAAOqC,KAAM1C,KAAM6kB,SAAUA,EAAS1kB,MAAOolB,KAGpDqB,GAGRD,IAAK,SAAUvH,GACd,GAAKA,EAAOve,EAAOsD,SAClB,MAAOib,EAIR,IAAIzc,GAAGykB,EAAM3jB,EACZmB,EAAOwa,EAAMxa,KACbyiB,EAAgBjI,EAChBkI,EAAUtnB,KAAKunB,SAAU3iB,EAEpB0iB,KACLtnB,KAAKunB,SAAU3iB,GAAS0iB,EACvBvD,EAAYtX,KAAM7H,GAAS5E,KAAKwnB,WAChC1D,EAAUrX,KAAM7H,GAAS5E,KAAKynB,aAGhChkB,EAAO6jB,EAAQI,MAAQ1nB,KAAK0nB,MAAMtnB,OAAQknB,EAAQI,OAAU1nB,KAAK0nB,MAEjEtI,EAAQ,GAAIve,GAAOqlB,MAAOmB,GAE1B1kB,EAAIc,EAAK7B,MACT,OAAQe,IACPykB,EAAO3jB,EAAMd,GACbyc,EAAOgI,GAASC,EAAeD,EAmBhC,OAdMhI,GAAMvb,SACXub,EAAMvb,OAASwjB,EAAcM,YAAc/nB,GAKb,IAA1Bwf,EAAMvb,OAAOsB,WACjBia,EAAMvb,OAASub,EAAMvb,OAAOuI,YAK7BgT,EAAMwI,UAAYxI,EAAMwI,QAEjBN,EAAQ9X,OAAS8X,EAAQ9X,OAAQ4P,EAAOiI,GAAkBjI,GAIlEsI,MAAO,wHAAwHvgB,MAAM,KAErIogB,YAEAE,UACCC,MAAO,4BAA4BvgB,MAAM,KACzCqI,OAAQ,SAAU4P,EAAOyI,GAOxB,MAJoB,OAAfzI,EAAM0I,QACV1I,EAAM0I,MAA6B,MAArBD,EAASE,SAAmBF,EAASE,SAAWF,EAASG,SAGjE5I,IAIToI,YACCE,MAAO,mGAAmGvgB,MAAM,KAChHqI,OAAQ,SAAU4P,EAAOyI,GACxB,GAAIjJ,GAAMqJ,EAAUpZ,EACnBgG,EAASgT,EAAShT,OAClBqT,EAAcL,EAASK,WAuBxB,OApBoB,OAAf9I,EAAM+I,OAAqC,MAApBN,EAASO,UACpCH,EAAW7I,EAAMvb,OAAOoI,eAAiBrM,EACzCiP,EAAMoZ,EAASxZ,gBACfmQ,EAAOqJ,EAASrJ,KAEhBQ,EAAM+I,MAAQN,EAASO,SAAYvZ,GAAOA,EAAIwZ,YAAczJ,GAAQA,EAAKyJ,YAAc,IAAQxZ,GAAOA,EAAIyZ,YAAc1J,GAAQA,EAAK0J,YAAc,GACnJlJ,EAAMmJ,MAAQV,EAASW,SAAY3Z,GAAOA,EAAI4Z,WAAc7J,GAAQA,EAAK6J,WAAc,IAAQ5Z,GAAOA,EAAI6Z,WAAc9J,GAAQA,EAAK8J,WAAc,KAI9ItJ,EAAMuJ,eAAiBT,IAC5B9I,EAAMuJ,cAAgBT,IAAgB9I,EAAMvb,OAASgkB,EAASe,UAAYV,GAKrE9I,EAAM0I,OAAoB5jB,SAAX2Q,IACpBuK,EAAM0I,MAAmB,EAATjT,EAAa,EAAe,EAATA,EAAa,EAAe,EAATA,EAAa,EAAI,GAGjEuK,IAITsF,SACCmE,MAECxC,UAAU,GAEXpS,OAEC4R,QAAS,WACR,GAAK7lB,OAASokB,MAAuBpkB,KAAKiU,MACzC,IAEC,MADAjU,MAAKiU,SACE,EACN,MAAQ7O,MAOZggB,aAAc,WAEf0D,MACCjD,QAAS,WACR,MAAK7lB,QAASokB,MAAuBpkB,KAAK8oB,MACzC9oB,KAAK8oB,QACE,GAFR,QAKD1D,aAAc,YAEf3B,OAECoC,QAAS,WACR,MAAKhlB,GAAO+E,SAAU5F,KAAM,UAA2B,aAAdA,KAAK4E,MAAuB5E,KAAKyjB,OACzEzjB,KAAKyjB,SACE,GAFR,QAODiD,SAAU,SAAUtH,GACnB,MAAOve,GAAO+E,SAAUwZ,EAAMvb,OAAQ,OAIxCklB,cACC7B,aAAc,SAAU9H,GAIDlb,SAAjBkb,EAAM5M,QAAwB4M,EAAMiI,gBACxCjI,EAAMiI,cAAc2B,YAAc5J,EAAM5M,WAM5CyW,SAAU,SAAUrkB,EAAMlC,EAAM0c,EAAO8J,GAItC,GAAI9jB,GAAIvE,EAAOyC,OACd,GAAIzC,GAAOqlB,MACX9G,GAECxa,KAAMA,EACNukB,aAAa,EACb9B,kBAGG6B,GACJroB,EAAOue,MAAMyG,QAASzgB,EAAG,KAAM1C,GAE/B7B,EAAOue,MAAM+F,SAASrjB,KAAMY,EAAM0C,GAE9BA,EAAEqhB,sBACNrH,EAAMoH,mBAKT3lB,EAAO+kB,YAAchmB,EAASqf,oBAC7B,SAAUvc,EAAMkC,EAAMqgB,GAChBviB,EAAKuc,qBACTvc,EAAKuc,oBAAqBra,EAAMqgB,GAAQ,IAG1C,SAAUviB,EAAMkC,EAAMqgB,GACrB,GAAIvhB,GAAO,KAAOkB,CAEblC,GAAKyc,oBAIGzc,GAAMgB,KAAW+b,IAC5B/c,EAAMgB,GAAS,MAGhBhB,EAAKyc,YAAazb,EAAMuhB,KAI3BpkB,EAAOqlB,MAAQ,SAAU3iB,EAAKmkB,GAE7B,MAAO1nB,gBAAgBa,GAAOqlB,OAKzB3iB,GAAOA,EAAIqB,MACf5E,KAAKqnB,cAAgB9jB,EACrBvD,KAAK4E,KAAOrB,EAAIqB,KAIhB5E,KAAKymB,mBAAqBljB,EAAI6lB,kBACHllB,SAAzBX,EAAI6lB,kBAEJ7lB,EAAIylB,eAAgB,EACrB9E,GACAC,IAIDnkB,KAAK4E,KAAOrB,EAIRmkB,GACJ7mB,EAAOyC,OAAQtD,KAAM0nB,GAItB1nB,KAAKqpB,UAAY9lB,GAAOA,EAAI8lB,WAAaxoB,EAAOoG,WAGhDjH,KAAMa,EAAOsD,UAAY,IA/BjB,GAAItD,GAAOqlB,MAAO3iB,EAAKmkB,IAoChC7mB,EAAOqlB,MAAMzkB,WACZglB,mBAAoBtC,GACpBoC,qBAAsBpC,GACtB6C,8BAA+B7C,GAE/BqC,eAAgB,WACf,GAAIphB,GAAIpF,KAAKqnB,aAEbrnB,MAAKymB,mBAAqBvC,GACpB9e,IAKDA,EAAEohB,eACNphB,EAAEohB,iBAKFphB,EAAE4jB,aAAc,IAGlB/B,gBAAiB,WAChB,GAAI7hB,GAAIpF,KAAKqnB,aAEbrnB,MAAKumB,qBAAuBrC,GACtB9e,IAIDA,EAAE6hB,iBACN7hB,EAAE6hB,kBAKH7hB,EAAEkkB,cAAe,IAElBC,yBAA0B,WACzB,GAAInkB,GAAIpF,KAAKqnB,aAEbrnB,MAAKgnB,8BAAgC9C,GAEhC9e,GAAKA,EAAEmkB,0BACXnkB,EAAEmkB,2BAGHvpB,KAAKinB,oBAKPpmB,EAAOyB,MACNknB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAMjD,GAClB9lB,EAAOue,MAAMsF,QAASkF,IACrBxE,aAAcuB,EACdtB,SAAUsB,EAEV1B,OAAQ,SAAU7F,GACjB,GAAIjd,GACH0B,EAAS7D,KACT6pB,EAAUzK,EAAMuJ,cAChB/D,EAAYxF,EAAMwF,SASnB,SALMiF,GAAYA,IAAYhmB,IAAWhD,EAAOsH,SAAUtE,EAAQgmB,MACjEzK,EAAMxa,KAAOggB,EAAUG,SACvB5iB,EAAMyiB,EAAU/W,QAAQjL,MAAO5C,KAAM6C,WACrCuc,EAAMxa,KAAO+hB,GAEPxkB,MAMJxB,EAAQmpB,gBAEbjpB,EAAOue,MAAMsF,QAAQnP,QACpBiQ,MAAO,WAEN,MAAK3kB,GAAO+E,SAAU5F,KAAM,SACpB,MAIRa,GAAOue,MAAM3E,IAAKza,KAAM,iCAAkC,SAAUoF,GAEnE,GAAI1C,GAAO0C,EAAEvB,OACZkmB,EAAOlpB,EAAO+E,SAAUlD,EAAM,UAAa7B,EAAO+E,SAAUlD,EAAM,UAAaA,EAAKqnB,KAAO7lB,MACvF6lB,KAASlpB,EAAOwgB,MAAO0I,EAAM,mBACjClpB,EAAOue,MAAM3E,IAAKsP,EAAM,iBAAkB,SAAU3K,GACnDA,EAAM4K,gBAAiB,IAExBnpB,EAAOwgB,MAAO0I,EAAM,iBAAiB,OAMxC7C,aAAc,SAAU9H,GAElBA,EAAM4K,uBACH5K,GAAM4K,eACRhqB,KAAKoM,aAAegT,EAAM+G,WAC9BtlB,EAAOue,MAAM6J,SAAU,SAAUjpB,KAAKoM,WAAYgT,GAAO,KAK5DuG,SAAU,WAET,MAAK9kB,GAAO+E,SAAU5F,KAAM,SACpB,MAIRa,GAAOue,MAAM/C,OAAQrc,KAAM,eAMxBW,EAAQspB,gBAEbppB,EAAOue,MAAMsF,QAAQf,QAEpB6B,MAAO,WAEN,MAAK3B,GAAWpX,KAAMzM,KAAK4F,YAIP,aAAd5F,KAAK4E,MAAqC,UAAd5E,KAAK4E,QACrC/D,EAAOue,MAAM3E,IAAKza,KAAM,yBAA0B,SAAUof,GACjB,YAArCA,EAAMiI,cAAc6C,eACxBlqB,KAAKmqB,eAAgB,KAGvBtpB,EAAOue,MAAM3E,IAAKza,KAAM,gBAAiB,SAAUof,GAC7Cpf,KAAKmqB,gBAAkB/K,EAAM+G,YACjCnmB,KAAKmqB,eAAgB,GAGtBtpB,EAAOue,MAAM6J,SAAU,SAAUjpB,KAAMof,GAAO,OAGzC,OAGRve,GAAOue,MAAM3E,IAAKza,KAAM,yBAA0B,SAAUoF,GAC3D,GAAI1C,GAAO0C,EAAEvB,MAERggB,GAAWpX,KAAM/J,EAAKkD,YAAe/E,EAAOwgB,MAAO3e,EAAM,mBAC7D7B,EAAOue,MAAM3E,IAAK/X,EAAM,iBAAkB,SAAU0c,IAC9Cpf,KAAKoM,YAAegT,EAAM+J,aAAgB/J,EAAM+G,WACpDtlB,EAAOue,MAAM6J,SAAU,SAAUjpB,KAAKoM,WAAYgT,GAAO,KAG3Dve,EAAOwgB,MAAO3e,EAAM,iBAAiB,OAKxCuiB,OAAQ,SAAU7F,GACjB,GAAI1c,GAAO0c,EAAMvb,MAGjB,OAAK7D,QAAS0C,GAAQ0c,EAAM+J,aAAe/J,EAAM+G,WAA4B,UAAdzjB,EAAKkC,MAAkC,aAAdlC,EAAKkC,KACrFwa,EAAMwF,UAAU/W,QAAQjL,MAAO5C,KAAM6C,WAD7C,QAKD8iB,SAAU,WAGT,MAFA9kB,GAAOue,MAAM/C,OAAQrc,KAAM,aAEnB6jB,EAAWpX,KAAMzM,KAAK4F,aAM3BjF,EAAQypB,gBACbvpB,EAAOyB,MAAO2R,MAAO,UAAW6U,KAAM,YAAc,SAAUc,EAAMjD,GAGnE,GAAI9Y,GAAU,SAAUuR,GACtBve,EAAOue,MAAM6J,SAAUtC,EAAKvH,EAAMvb,OAAQhD,EAAOue,MAAMuH,IAAKvH,IAAS,GAGvEve,GAAOue,MAAMsF,QAASiC,IACrBnB,MAAO,WACN,GAAI3W,GAAM7O,KAAKiM,eAAiBjM,KAC/BqqB,EAAWxpB,EAAOwgB,MAAOxS,EAAK8X,EAEzB0D,IACLxb,EAAIG,iBAAkB4a,EAAM/b,GAAS,GAEtChN,EAAOwgB,MAAOxS,EAAK8X,GAAO0D,GAAY,GAAM,IAE7C1E,SAAU,WACT,GAAI9W,GAAM7O,KAAKiM,eAAiBjM,KAC/BqqB,EAAWxpB,EAAOwgB,MAAOxS,EAAK8X,GAAQ,CAEjC0D,GAILxpB,EAAOwgB,MAAOxS,EAAK8X,EAAK0D,IAHxBxb,EAAIoQ,oBAAqB2K,EAAM/b,GAAS,GACxChN,EAAOygB,YAAazS,EAAK8X,QAS9B9lB,EAAOG,GAAGsC,QAETgnB,GAAI,SAAUhG,EAAOxjB,EAAUyE,EAAMvE,EAAiBupB,GACrD,GAAI3lB,GAAM4lB,CAGV,IAAsB,gBAAVlG,GAAqB,CAEP,gBAAbxjB,KAEXyE,EAAOA,GAAQzE,EACfA,EAAWoD,OAEZ,KAAMU,IAAQ0f,GACbtkB,KAAKsqB,GAAI1lB,EAAM9D,EAAUyE,EAAM+e,EAAO1f,GAAQ2lB,EAE/C,OAAOvqB,MAmBR,GAhBa,MAARuF,GAAsB,MAANvE,GAEpBA,EAAKF,EACLyE,EAAOzE,EAAWoD,QACD,MAANlD,IACc,gBAAbF,IAEXE,EAAKuE,EACLA,EAAOrB,SAGPlD,EAAKuE,EACLA,EAAOzE,EACPA,EAAWoD,SAGRlD,KAAO,EACXA,EAAKmjB,OACC,KAAMnjB,EACZ,MAAOhB,KAaR,OAVa,KAARuqB,IACJC,EAASxpB,EACTA,EAAK,SAAUoe,GAGd,MADAve,KAASke,IAAKK,GACPoL,EAAO5nB,MAAO5C,KAAM6C,YAG5B7B,EAAG8F,KAAO0jB,EAAO1jB,OAAU0jB,EAAO1jB,KAAOjG,EAAOiG,SAE1C9G,KAAKsC,KAAM,WACjBzB,EAAOue,MAAM3E,IAAKza,KAAMskB,EAAOtjB,EAAIuE,EAAMzE,MAG3CypB,IAAK,SAAUjG,EAAOxjB,EAAUyE,EAAMvE,GACrC,MAAOhB,MAAKsqB,GAAIhG,EAAOxjB,EAAUyE,EAAMvE,EAAI,IAE5C+d,IAAK,SAAUuF,EAAOxjB,EAAUE,GAC/B,GAAI4jB,GAAWhgB,CACf,IAAK0f,GAASA,EAAMkC,gBAAkBlC,EAAMM,UAQ3C,MANAA,GAAYN,EAAMM,UAClB/jB,EAAQyjB,EAAMuC,gBAAiB9H,IAC9B6F,EAAUU,UAAYV,EAAUG,SAAW,IAAMH,EAAUU,UAAYV,EAAUG,SACjFH,EAAU9jB,SACV8jB,EAAU/W,SAEJ7N,IAER,IAAsB,gBAAVskB,GAAqB,CAEhC,IAAM1f,IAAQ0f,GACbtkB,KAAK+e,IAAKna,EAAM9D,EAAUwjB,EAAO1f,GAElC,OAAO5E,MAUR,OARKc,KAAa,GAA6B,kBAAbA,MAEjCE,EAAKF,EACLA,EAAWoD,QAEPlD,KAAO,IACXA,EAAKmjB,IAECnkB,KAAKsC,KAAK,WAChBzB,EAAOue,MAAM/C,OAAQrc,KAAMskB,EAAOtjB,EAAIF,MAIxC+kB,QAAS,SAAUjhB,EAAMW,GACxB,MAAOvF,MAAKsC,KAAK,WAChBzB,EAAOue,MAAMyG,QAASjhB,EAAMW,EAAMvF,SAGpC8e,eAAgB,SAAUla,EAAMW,GAC/B,GAAI7C,GAAO1C,KAAK,EAChB,OAAK0C,GACG7B,EAAOue,MAAMyG,QAASjhB,EAAMW,EAAM7C,GAAM,GADhD,SAOF,SAAS+nB,IAAoB7qB,GAC5B,GAAIqJ,GAAOyhB,GAAUvjB,MAAO,KAC3BwjB,EAAW/qB,EAASkjB,wBAErB,IAAK6H,EAASld,cACb,MAAQxE,EAAKrH,OACZ+oB,EAASld,cACRxE,EAAKF,MAIR,OAAO4hB,GAGR,GAAID,IAAY,6JAEfE,GAAgB,6BAChBC,GAAe,GAAIphB,QAAO,OAASihB,GAAY,WAAY,KAC3DI,GAAqB,OACrBC,GAAY,0EACZC,GAAW,YACXC,GAAS,UACTC,GAAQ,YACRC,GAAe,0BAEfC,GAAW,oCACXC,GAAc,4BACdC,GAAoB,cACpBC,GAAe,2CAGfC,IACCC,QAAU,EAAG,+BAAgC,aAC7CC,QAAU,EAAG,aAAc,eAC3BC,MAAQ,EAAG,QAAS,UACpBC,OAAS,EAAG,WAAY,aACxBC,OAAS,EAAG,UAAW,YACvBC,IAAM,EAAG,iBAAkB,oBAC3BC,KAAO,EAAG,mCAAoC,uBAC9CC,IAAM,EAAG,qBAAsB,yBAI/BtF,SAAU/lB,EAAQsiB,eAAkB,EAAG,GAAI,KAAS,EAAG,SAAU,WAElEgJ,GAAexB,GAAoB7qB,GACnCssB,GAAcD,GAAa9c,YAAavP,EAAS6N,cAAc,OAEhE+d,IAAQW,SAAWX,GAAQC,OAC3BD,GAAQxI,MAAQwI,GAAQY,MAAQZ,GAAQa,SAAWb,GAAQc,QAAUd,GAAQK,MAC7EL,GAAQe,GAAKf,GAAQQ,EAErB,SAASQ,IAAQzrB,EAAS4O,GACzB,GAAIzN,GAAOQ,EACVC,EAAI,EACJ8pB,QAAe1rB,GAAQuL,uBAAyBmT,EAAe1e,EAAQuL,qBAAsBqD,GAAO,WAC5F5O,GAAQgM,mBAAqB0S,EAAe1e,EAAQgM,iBAAkB4C,GAAO,KACpFzL,MAEF,KAAMuoB,EACL,IAAMA,KAAYvqB,EAAQnB,EAAQwK,YAAcxK,EAA8B,OAApB2B,EAAOR,EAAMS,IAAaA,KAC7EgN,GAAO9O,EAAO+E,SAAUlD,EAAMiN,GACnC8c,EAAMpsB,KAAMqC,GAEZ7B,EAAOuB,MAAOqqB,EAAOD,GAAQ9pB,EAAMiN,GAKtC,OAAezL,UAARyL,GAAqBA,GAAO9O,EAAO+E,SAAU7E,EAAS4O,GAC5D9O,EAAOuB,OAASrB,GAAW0rB,GAC3BA,EAIF,QAASC,IAAmBhqB,GACtBkgB,EAAenW,KAAM/J,EAAKkC,QAC9BlC,EAAKiqB,eAAiBjqB,EAAK8R,SAM7B,QAASoY,IAAoBlqB,EAAMmqB,GAClC,MAAOhsB,GAAO+E,SAAUlD,EAAM,UAC7B7B,EAAO+E,SAA+B,KAArBinB,EAAQ1nB,SAAkB0nB,EAAUA,EAAQtb,WAAY,MAEzE7O,EAAK4J,qBAAqB,SAAS,IAClC5J,EAAKyM,YAAazM,EAAKuJ,cAAcwB,cAAc,UACpD/K,EAIF,QAASoqB,IAAepqB,GAEvB,MADAA,GAAKkC,MAA6C,OAArC/D,EAAO0O,KAAKwB,KAAMrO,EAAM,SAAqB,IAAMA,EAAKkC,KAC9DlC,EAER,QAASqqB,IAAerqB,GACvB,GAAIgJ,GAAQ4f,GAAkBpf,KAAMxJ,EAAKkC,KAMzC,OALK8G,GACJhJ,EAAKkC,KAAO8G,EAAM,GAElBhJ,EAAKuK,gBAAgB,QAEfvK,EAIR,QAASsqB,IAAe9qB,EAAO+qB,GAG9B,IAFA,GAAIvqB,GACHC,EAAI,EACwB,OAApBD,EAAOR,EAAMS,IAAaA,IAClC9B,EAAOwgB,MAAO3e,EAAM,cAAeuqB,GAAepsB,EAAOwgB,MAAO4L,EAAYtqB,GAAI,eAIlF,QAASuqB,IAAgB3pB,EAAK4pB,GAE7B,GAAuB,IAAlBA,EAAKhoB,UAAmBtE,EAAOsgB,QAAS5d,GAA7C,CAIA,GAAIqB,GAAMjC,EAAG0X,EACZ+S,EAAUvsB,EAAOwgB,MAAO9d,GACxB8pB,EAAUxsB,EAAOwgB,MAAO8L,EAAMC,GAC9B7I,EAAS6I,EAAQ7I,MAElB,IAAKA,EAAS,OACN8I,GAAQpI,OACfoI,EAAQ9I,SAER,KAAM3f,IAAQ2f,GACb,IAAM5hB,EAAI,EAAG0X,EAAIkK,EAAQ3f,GAAOhD,OAAYyY,EAAJ1X,EAAOA,IAC9C9B,EAAOue,MAAM3E,IAAK0S,EAAMvoB,EAAM2f,EAAQ3f,GAAQjC,IAM5C0qB,EAAQ9nB,OACZ8nB,EAAQ9nB,KAAO1E,EAAOyC,UAAY+pB,EAAQ9nB,QAI5C,QAAS+nB,IAAoB/pB,EAAK4pB,GACjC,GAAIvnB,GAAUR,EAAGG,CAGjB,IAAuB,IAAlB4nB,EAAKhoB,SAAV,CAOA,GAHAS,EAAWunB,EAAKvnB,SAASC,eAGnBlF,EAAQ6iB,cAAgB2J,EAAMtsB,EAAOsD,SAAY,CACtDoB,EAAO1E,EAAOwgB,MAAO8L,EAErB,KAAM/nB,IAAKG,GAAKgf,OACf1jB,EAAO+kB,YAAauH,EAAM/nB,EAAGG,EAAK0f,OAInCkI,GAAKlgB,gBAAiBpM,EAAOsD,SAIZ,WAAbyB,GAAyBunB,EAAKnnB,OAASzC,EAAIyC,MAC/C8mB,GAAeK,GAAOnnB,KAAOzC,EAAIyC,KACjC+mB,GAAeI,IAIS,WAAbvnB,GACNunB,EAAK/gB,aACT+gB,EAAK/J,UAAY7f,EAAI6f,WAOjBziB,EAAQuiB,YAAgB3f,EAAIqM,YAAc/O,EAAO2E,KAAK2nB,EAAKvd,aAC/Dud,EAAKvd,UAAYrM,EAAIqM,YAGE,UAAbhK,GAAwBgd,EAAenW,KAAMlJ,EAAIqB,OAK5DuoB,EAAKR,eAAiBQ,EAAK3Y,QAAUjR,EAAIiR,QAIpC2Y,EAAKrnB,QAAUvC,EAAIuC,QACvBqnB,EAAKrnB,MAAQvC,EAAIuC,QAKM,WAAbF,EACXunB,EAAKI,gBAAkBJ,EAAK1Y,SAAWlR,EAAIgqB,iBAInB,UAAb3nB,GAAqC,aAAbA,KACnCunB,EAAKxU,aAAepV,EAAIoV,eAI1B9X,EAAOyC,QACNM,MAAO,SAAUlB,EAAM8qB,EAAeC,GACrC,GAAIC,GAAchf,EAAM9K,EAAOjB,EAAGgrB,EACjCC,EAAS/sB,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,EAW/C,IATK/B,EAAQuiB,YAAcriB,EAAOgY,SAASnW,KAAUmoB,GAAape,KAAM,IAAM/J,EAAKkD,SAAW,KAC7FhC,EAAQlB,EAAKygB,WAAW,IAIxB+I,GAAYtc,UAAYlN,EAAK0gB,UAC7B8I,GAAYxe,YAAa9J,EAAQsoB,GAAY3a,eAGvC5Q,EAAQ6iB,cAAiB7iB,EAAQ2iB,gBACnB,IAAlB5gB,EAAKyC,UAAoC,KAAlBzC,EAAKyC,UAAqBtE,EAAOgY,SAASnW,IAOnE,IAJAgrB,EAAelB,GAAQ5oB,GACvB+pB,EAAcnB,GAAQ9pB,GAGhBC,EAAI,EAA8B,OAA1B+L,EAAOif,EAAYhrB,MAAeA,EAE1C+qB,EAAa/qB,IACjB2qB,GAAoB5e,EAAMgf,EAAa/qB,GAM1C,IAAK6qB,EACJ,GAAKC,EAIJ,IAHAE,EAAcA,GAAenB,GAAQ9pB,GACrCgrB,EAAeA,GAAgBlB,GAAQ5oB,GAEjCjB,EAAI,EAA8B,OAA1B+L,EAAOif,EAAYhrB,IAAaA,IAC7CuqB,GAAgBxe,EAAMgf,EAAa/qB,QAGpCuqB,IAAgBxqB,EAAMkB,EAaxB,OARA8pB,GAAelB,GAAQ5oB,EAAO,UACzB8pB,EAAa9rB,OAAS,GAC1BorB,GAAeU,GAAeE,GAAUpB,GAAQ9pB,EAAM,WAGvDgrB,EAAeC,EAAcjf,EAAO,KAG7B9K,GAGRiqB,cAAe,SAAU3rB,EAAOnB,EAAS+sB,EAASC,GAWjD,IAVA,GAAI7qB,GAAGR,EAAMyF,EACZnB,EAAK2I,EAAKqT,EAAOgL,EACjB3T,EAAInY,EAAMN,OAGVqsB,EAAOxD,GAAoB1pB,GAE3BmtB,KACAvrB,EAAI,EAEO0X,EAAJ1X,EAAOA,IAGd,GAFAD,EAAOR,EAAOS,GAETD,GAAiB,IAATA,EAGZ,GAA6B,WAAxB7B,EAAO+D,KAAMlC,GACjB7B,EAAOuB,MAAO8rB,EAAOxrB,EAAKyC,UAAazC,GAASA,OAG1C,IAAMwoB,GAAMze,KAAM/J,GAIlB,CACNsE,EAAMA,GAAOinB,EAAK9e,YAAapO,EAAQ0M,cAAc,QAGrDkC,GAAOqb,GAAS9e,KAAMxJ,KAAY,GAAI,KAAO,GAAImD,cACjDmoB,EAAOxC,GAAS7b,IAAS6b,GAAQ9E,SAEjC1f,EAAI4I,UAAYoe,EAAK,GAAKtrB,EAAK4B,QAASymB,GAAW,aAAgBiD,EAAK,GAGxE9qB,EAAI8qB,EAAK,EACT,OAAQ9qB,IACP8D,EAAMA,EAAIkM,SASX,KALMvS,EAAQoiB,mBAAqB+H,GAAmBre,KAAM/J,IAC3DwrB,EAAM7tB,KAAMU,EAAQotB,eAAgBrD,GAAmB5e,KAAMxJ,GAAO,MAI/D/B,EAAQqiB,MAAQ,CAGrBtgB,EAAe,UAARiN,GAAoBsb,GAAOxe,KAAM/J,GAI3B,YAAZsrB,EAAK,IAAqB/C,GAAOxe,KAAM/J,GAEtC,EADAsE,EAJDA,EAAIuK,WAOLrO,EAAIR,GAAQA,EAAK6I,WAAW3J,MAC5B,OAAQsB,IACFrC,EAAO+E,SAAWod,EAAQtgB,EAAK6I,WAAWrI,GAAK,WAAc8f,EAAMzX,WAAW3J,QAClFc,EAAKgL,YAAasV,GAKrBniB,EAAOuB,MAAO8rB,EAAOlnB,EAAIuE,YAGzBvE,EAAIsK,YAAc,EAGlB,OAAQtK,EAAIuK,WACXvK,EAAI0G,YAAa1G,EAAIuK,WAItBvK,GAAMinB,EAAK/a,cAtDXgb,GAAM7tB,KAAMU,EAAQotB,eAAgBzrB,GA4DlCsE,IACJinB,EAAKvgB,YAAa1G,GAKbrG,EAAQ0iB,eACbxiB,EAAO2F,KAAMgmB,GAAQ0B,EAAO,SAAWxB,IAGxC/pB,EAAI,CACJ,OAASD,EAAOwrB,EAAOvrB,KAItB,KAAKorB,GAAmD,KAAtCltB,EAAOwF,QAAS3D,EAAMqrB,MAIxC5lB,EAAWtH,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,GAGhDsE,EAAMwlB,GAAQyB,EAAK9e,YAAazM,GAAQ,UAGnCyF,GACJ6kB,GAAehmB,GAIX8mB,GAAU,CACd5qB,EAAI,CACJ,OAASR,EAAOsE,EAAK9D,KACfmoB,GAAY5e,KAAM/J,EAAKkC,MAAQ,KACnCkpB,EAAQztB,KAAMqC,GAQlB,MAFAsE,GAAM,KAECinB,GAGRlN,UAAW,SAAU7e,EAAsB+d,GAQ1C,IAPA,GAAIvd,GAAMkC,EAAMyH,EAAI9G,EACnB5C,EAAI,EACJge,EAAc9f,EAAOsD,QACrBgJ,EAAQtM,EAAOsM,MACf6S,EAAgBrf,EAAQqf,cACxB0E,EAAU7jB,EAAOue,MAAMsF,QAEK,OAApBhiB,EAAOR,EAAMS,IAAaA,IAClC,IAAKsd,GAAcpf,EAAOof,WAAYvd,MAErC2J,EAAK3J,EAAMie,GACXpb,EAAO8G,GAAMc,EAAOd,IAER,CACX,GAAK9G,EAAKgf,OACT,IAAM3f,IAAQW,GAAKgf,OACbG,EAAS9f,GACb/D,EAAOue,MAAM/C,OAAQ3Z,EAAMkC,GAI3B/D,EAAO+kB,YAAaljB,EAAMkC,EAAMW,EAAK0f,OAMnC9X,GAAOd,WAEJc,GAAOd,GAKT2T,QACGtd,GAAMie,SAEKje,GAAKuK,kBAAoBwS,EAC3C/c,EAAKuK,gBAAiB0T,GAGtBje,EAAMie,GAAgB,KAGvBzgB,EAAWG,KAAMgM,QAQvBxL,EAAOG,GAAGsC,QACT0C,KAAM,SAAUF,GACf,MAAOyc,GAAQviB,KAAM,SAAU8F,GAC9B,MAAiB5B,UAAV4B,EACNjF,EAAOmF,KAAMhG,MACbA,KAAK2U,QAAQyZ,QAAUpuB,KAAK,IAAMA,KAAK,GAAGiM,eAAiBrM,GAAWuuB,eAAgBroB,KACrF,KAAMA,EAAOjD,UAAUjB,SAG3BwsB,OAAQ,WACP,MAAOpuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKmF,UAAoC,KAAlBnF,KAAKmF,UAAqC,IAAlBnF,KAAKmF,SAAiB,CACzE,GAAItB,GAAS+oB,GAAoB5sB,KAAM0C,EACvCmB,GAAOsL,YAAazM,OAKvB4rB,QAAS,WACR,MAAOtuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GAC1C,GAAuB,IAAlB1C,KAAKmF,UAAoC,KAAlBnF,KAAKmF,UAAqC,IAAlBnF,KAAKmF,SAAiB,CACzE,GAAItB,GAAS+oB,GAAoB5sB,KAAM0C,EACvCmB,GAAO0qB,aAAc7rB,EAAMmB,EAAO0N,gBAKrCid,OAAQ,WACP,MAAOxuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GACrC1C,KAAKoM,YACTpM,KAAKoM,WAAWmiB,aAAc7rB,EAAM1C,SAKvCyuB,MAAO,WACN,MAAOzuB,MAAKquB,SAAUxrB,UAAW,SAAUH,GACrC1C,KAAKoM,YACTpM,KAAKoM,WAAWmiB,aAAc7rB,EAAM1C,KAAKmO,gBAK5CkO,OAAQ,SAAUvb,EAAU4tB,GAK3B,IAJA,GAAIhsB,GACHR,EAAQpB,EAAWD,EAAO2O,OAAQ1O,EAAUd,MAASA,KACrD2C,EAAI,EAEwB,OAApBD,EAAOR,EAAMS,IAAaA,IAE5B+rB,GAA8B,IAAlBhsB,EAAKyC,UACtBtE,EAAOkgB,UAAWyL,GAAQ9pB,IAGtBA,EAAK0J,aACJsiB,GAAY7tB,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,IACrDsqB,GAAeR,GAAQ9pB,EAAM,WAE9BA,EAAK0J,WAAWsB,YAAahL,GAI/B,OAAO1C,OAGR2U,MAAO,WAIN,IAHA,GAAIjS,GACHC,EAAI,EAEuB,OAAnBD,EAAO1C,KAAK2C,IAAaA,IAAM,CAEhB,IAAlBD,EAAKyC,UACTtE,EAAOkgB,UAAWyL,GAAQ9pB,GAAM,GAIjC,OAAQA,EAAK6O,WACZ7O,EAAKgL,YAAahL,EAAK6O,WAKnB7O,GAAKiB,SAAW9C,EAAO+E,SAAUlD,EAAM,YAC3CA,EAAKiB,QAAQ/B,OAAS,GAIxB,MAAO5B,OAGR4D,MAAO,SAAU4pB,EAAeC,GAI/B,MAHAD,GAAiC,MAAjBA,GAAwB,EAAQA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzDztB,KAAKyC,IAAI,WACf,MAAO5B,GAAO+C,MAAO5D,KAAMwtB,EAAeC,MAI5CkB,KAAM,SAAU7oB,GACf,MAAOyc,GAAQviB,KAAM,SAAU8F,GAC9B,GAAIpD,GAAO1C,KAAM,OAChB2C,EAAI,EACJ0X,EAAIra,KAAK4B,MAEV,IAAesC,SAAV4B,EACJ,MAAyB,KAAlBpD,EAAKyC,SACXzC,EAAKkN,UAAUtL,QAASsmB,GAAe,IACvC1mB,MAIF,MAAsB,gBAAV4B,IAAuBqlB,GAAa1e,KAAM3G,KACnDnF,EAAQsiB,eAAkB4H,GAAape,KAAM3G,KAC7CnF,EAAQoiB,mBAAsB+H,GAAmBre,KAAM3G,IACxD0lB,IAAUR,GAAS9e,KAAMpG,KAAa,GAAI,KAAO,GAAID,gBAAkB,CAExEC,EAAQA,EAAMxB,QAASymB,GAAW,YAElC,KACC,KAAW1Q,EAAJ1X,EAAOA,IAEbD,EAAO1C,KAAK2C,OACW,IAAlBD,EAAKyC,WACTtE,EAAOkgB,UAAWyL,GAAQ9pB,GAAM,IAChCA,EAAKkN,UAAY9J,EAInBpD,GAAO,EAGN,MAAM0C,KAGJ1C,GACJ1C,KAAK2U,QAAQyZ,OAAQtoB,IAEpB,KAAMA,EAAOjD,UAAUjB,SAG3BgtB,YAAa,WACZ,GAAI/nB,GAAMhE,UAAW,EAcrB,OAXA7C,MAAKquB,SAAUxrB,UAAW,SAAUH,GACnCmE,EAAM7G,KAAKoM,WAEXvL,EAAOkgB,UAAWyL,GAAQxsB,OAErB6G,GACJA,EAAIgoB,aAAcnsB,EAAM1C,QAKnB6G,IAAQA,EAAIjF,QAAUiF,EAAI1B,UAAYnF,KAAOA,KAAKqc,UAG1D2C,OAAQ,SAAUle,GACjB,MAAOd,MAAKqc,OAAQvb,GAAU,IAG/ButB,SAAU,SAAU7rB,EAAMD,GAGzBC,EAAOpC,EAAOwC,SAAWJ,EAEzB,IAAIM,GAAO4L,EAAMogB,EAChBhB,EAASjf,EAAKgU,EACdlgB,EAAI,EACJ0X,EAAIra,KAAK4B,OACTmtB,EAAM/uB,KACNgvB,EAAW3U,EAAI,EACfvU,EAAQtD,EAAK,GACbuB,EAAalD,EAAOkD,WAAY+B,EAGjC,IAAK/B,GACDsW,EAAI,GAAsB,gBAAVvU,KAChBnF,EAAQ4iB,YAAc6H,GAAS3e,KAAM3G,GACxC,MAAO9F,MAAKsC,KAAK,SAAUiY,GAC1B,GAAIpB,GAAO4V,EAAIhsB,GAAIwX,EACdxW,KACJvB,EAAK,GAAKsD,EAAMhE,KAAM9B,KAAMua,EAAOpB,EAAKwV,SAEzCxV,EAAKkV,SAAU7rB,EAAMD,IAIvB,IAAK8X,IACJwI,EAAWhiB,EAAOgtB,cAAerrB,EAAMxC,KAAM,GAAIiM,eAAe,EAAOjM,MACvE8C,EAAQ+f,EAAStR,WAEmB,IAA/BsR,EAAStX,WAAW3J,SACxBihB,EAAW/f,GAGPA,GAAQ,CAMZ,IALAgrB,EAAUjtB,EAAO4B,IAAK+pB,GAAQ3J,EAAU,UAAYiK,IACpDgC,EAAahB,EAAQlsB,OAITyY,EAAJ1X,EAAOA,IACd+L,EAAOmU,EAEFlgB,IAAMqsB,IACVtgB,EAAO7N,EAAO+C,MAAO8K,GAAM,GAAM,GAG5BogB,GACJjuB,EAAOuB,MAAO0rB,EAAStB,GAAQ9d,EAAM,YAIvCnM,EAAST,KAAM9B,KAAK2C,GAAI+L,EAAM/L,EAG/B,IAAKmsB,EAOJ,IANAjgB,EAAMif,EAASA,EAAQlsB,OAAS,GAAIqK,cAGpCpL,EAAO4B,IAAKqrB,EAASf,IAGfpqB,EAAI,EAAOmsB,EAAJnsB,EAAgBA,IAC5B+L,EAAOof,EAASnrB,GACX0oB,GAAY5e,KAAMiC,EAAK9J,MAAQ,MAClC/D,EAAOwgB,MAAO3S,EAAM,eAAkB7N,EAAOsH,SAAU0G,EAAKH,KAExDA,EAAKnL,IAEJ1C,EAAOouB,UACXpuB,EAAOouB,SAAUvgB,EAAKnL,KAGvB1C,EAAOyE,YAAcoJ,EAAK1I,MAAQ0I,EAAK4C,aAAe5C,EAAKkB,WAAa,IAAKtL,QAASinB,GAAc,KAOxG1I,GAAW/f,EAAQ,KAIrB,MAAO9C,SAITa,EAAOyB,MACN4sB,SAAU,SACVC,UAAW,UACXZ,aAAc,SACda,YAAa,QACbC,WAAY,eACV,SAAU3rB,EAAMmkB,GAClBhnB,EAAOG,GAAI0C,GAAS,SAAU5C,GAO7B,IANA,GAAIoB,GACHS,EAAI,EACJR,KACAmtB,EAASzuB,EAAQC,GACjBkC,EAAOssB,EAAO1tB,OAAS,EAEXoB,GAALL,EAAWA,IAClBT,EAAQS,IAAMK,EAAOhD,KAAOA,KAAK4D,OAAM,GACvC/C,EAAQyuB,EAAO3sB,IAAMklB,GAAY3lB,GAGjC7B,EAAKuC,MAAOT,EAAKD,EAAMH,MAGxB,OAAO/B,MAAKiC,UAAWE,KAKzB,IAAIotB,IACHC,KAQD,SAASC,IAAe/rB,EAAMmL,GAC7B,GAAI+Q,GACHld,EAAO7B,EAAQgO,EAAIpB,cAAe/J,IAASwrB,SAAUrgB,EAAI+P,MAGzD8Q,EAAU3vB,EAAO4vB,0BAA6B/P,EAAQ7f,EAAO4vB,wBAAyBjtB,EAAM,KAI3Fkd,EAAM8P,QAAU7uB,EAAOyhB,IAAK5f,EAAM,GAAK,UAMzC,OAFAA,GAAKsc,SAEE0Q,EAOR,QAASE,IAAgBhqB,GACxB,GAAIiJ,GAAMjP,EACT8vB,EAAUF,GAAa5pB,EA0BxB,OAxBM8pB,KACLA,EAAUD,GAAe7pB,EAAUiJ,GAGlB,SAAZ6gB,GAAuBA,IAG3BH,IAAUA,IAAU1uB,EAAQ,mDAAoDquB,SAAUrgB,EAAIJ,iBAG9FI,GAAQ0gB,GAAQ,GAAIrU,eAAiBqU,GAAQ,GAAItU,iBAAkBrb,SAGnEiP,EAAIghB,QACJhhB,EAAIihB,QAEJJ,EAAUD,GAAe7pB,EAAUiJ,GACnC0gB,GAAOvQ,UAIRwQ,GAAa5pB,GAAa8pB,GAGpBA,GAIR,WACC,GAAIK,EAEJpvB,GAAQqvB,iBAAmB,WAC1B,GAA4B,MAAvBD,EACJ,MAAOA,EAIRA,IAAsB,CAGtB,IAAIviB,GAAKoR,EAAMe,CAGf,OADAf,GAAOhf,EAAS0M,qBAAsB,QAAU,GAC1CsS,GAASA,EAAKgB,OAMpBpS,EAAM5N,EAAS6N,cAAe,OAC9BkS,EAAY/f,EAAS6N,cAAe,OACpCkS,EAAUC,MAAMC,QAAU,iEAC1BjB,EAAKzP,YAAawQ,GAAYxQ,YAAa3B,SAI/BA,GAAIoS,MAAME,OAASL,IAE9BjS,EAAIoS,MAAMC,QAGT,iJAGDrS,EAAI2B,YAAavP,EAAS6N,cAAe,QAAUmS,MAAMqQ,MAAQ,MACjEF,EAA0C,IAApBviB,EAAIuS,aAG3BnB,EAAKlR,YAAaiS,GAEXoQ,GA3BP,UA+BF,IAAIG,IAAU,UAEVC,GAAY,GAAI1mB,QAAQ,KAAOwY,EAAO,kBAAmB,KAIzDmO,GAAWC,GACdC,GAAY,2BAERvwB,GAAOwwB,kBACXH,GAAY,SAAU1tB,GAIrB,MAAKA,GAAKuJ,cAAc6C,YAAY0hB,OAC5B9tB,EAAKuJ,cAAc6C,YAAYyhB,iBAAkB7tB,EAAM,MAGxD3C,EAAOwwB,iBAAkB7tB,EAAM,OAGvC2tB,GAAS,SAAU3tB,EAAMgB,EAAM+sB,GAC9B,GAAIR,GAAOS,EAAUC,EAAUxuB,EAC9Byd,EAAQld,EAAKkd,KAqCd,OAnCA6Q,GAAWA,GAAYL,GAAW1tB,GAGlCP,EAAMsuB,EAAWA,EAASG,iBAAkBltB,IAAU+sB,EAAU/sB,GAASQ,OAEpEusB,IAES,KAARtuB,GAAetB,EAAOsH,SAAUzF,EAAKuJ,cAAevJ,KACxDP,EAAMtB,EAAO+e,MAAOld,EAAMgB,IAOtBysB,GAAU1jB,KAAMtK,IAAS+tB,GAAQzjB,KAAM/I,KAG3CusB,EAAQrQ,EAAMqQ,MACdS,EAAW9Q,EAAM8Q,SACjBC,EAAW/Q,EAAM+Q,SAGjB/Q,EAAM8Q,SAAW9Q,EAAM+Q,SAAW/Q,EAAMqQ,MAAQ9tB,EAChDA,EAAMsuB,EAASR,MAGfrQ,EAAMqQ,MAAQA,EACdrQ,EAAM8Q,SAAWA,EACjB9Q,EAAM+Q,SAAWA,IAMJzsB,SAAR/B,EACNA,EACAA,EAAM,KAEGvC,EAAS6O,gBAAgBoiB,eACpCT,GAAY,SAAU1tB,GACrB,MAAOA,GAAKmuB,cAGbR,GAAS,SAAU3tB,EAAMgB,EAAM+sB,GAC9B,GAAIK,GAAMC,EAAIC,EAAQ7uB,EACrByd,EAAQld,EAAKkd,KAyCd,OAvCA6Q,GAAWA,GAAYL,GAAW1tB,GAClCP,EAAMsuB,EAAWA,EAAU/sB,GAASQ,OAIxB,MAAP/B,GAAeyd,GAASA,EAAOlc,KACnCvB,EAAMyd,EAAOlc,IAUTysB,GAAU1jB,KAAMtK,KAAUmuB,GAAU7jB,KAAM/I,KAG9CotB,EAAOlR,EAAMkR,KACbC,EAAKruB,EAAKuuB,aACVD,EAASD,GAAMA,EAAGD,KAGbE,IACJD,EAAGD,KAAOpuB,EAAKmuB,aAAaC,MAE7BlR,EAAMkR,KAAgB,aAATptB,EAAsB,MAAQvB,EAC3CA,EAAMyd,EAAMsR,UAAY,KAGxBtR,EAAMkR,KAAOA,EACRE,IACJD,EAAGD,KAAOE,IAMG9sB,SAAR/B,EACNA,EACAA,EAAM,IAAM,QAOf,SAASgvB,IAAcC,EAAaC,GAEnC,OACCtvB,IAAK,WACJ,GAAIuvB,GAAYF,GAEhB,IAAkB,MAAbE,EAML,MAAKA,cAIGtxB,MAAK+B,KAML/B,KAAK+B,IAAMsvB,GAAQzuB,MAAO5C,KAAM6C,cAM3C,WAEC,GAAI2K,GAAKoS,EAAOhX,EAAG2oB,EAAkBC,EACpCC,EAA0BC,CAS3B,IANAlkB,EAAM5N,EAAS6N,cAAe,OAC9BD,EAAIoC,UAAY,qEAChBhH,EAAI4E,EAAIlB,qBAAsB,KAAO,GACrCsT,EAAQhX,GAAKA,EAAEgX,MAGf,CAIAA,EAAMC,QAAU,wBAIhBlf,EAAQgxB,QAA4B,QAAlB/R,EAAM+R,QAIxBhxB,EAAQixB,WAAahS,EAAMgS,SAE3BpkB,EAAIoS,MAAMiS,eAAiB,cAC3BrkB,EAAI2V,WAAW,GAAOvD,MAAMiS,eAAiB,GAC7ClxB,EAAQmxB,gBAA+C,gBAA7BtkB,EAAIoS,MAAMiS,eAIpClxB,EAAQoxB,UAAgC,KAApBnS,EAAMmS,WAA2C,KAAvBnS,EAAMoS,cACzB,KAA1BpS,EAAMqS,gBAEPpxB,EAAOyC,OAAO3C,GACbuxB,sBAAuB,WAItB,MAHiC,OAA5BT,GACJU,IAEMV,GAGRW,kBAAmB,WAIlB,MAH6B,OAAxBZ,GACJW,IAEMX,GAGRa,cAAe,WAId,MAHyB,OAApBd,GACJY,IAEMZ,GAIRe,oBAAqB,WAIpB,MAH+B,OAA1BZ,GACJS,IAEMT,IAIT,SAASS,KAER,GAAI3kB,GAAKoR,EAAMe,EAAW/F,CAE1BgF,GAAOhf,EAAS0M,qBAAsB,QAAU,GAC1CsS,GAASA,EAAKgB,QAMpBpS,EAAM5N,EAAS6N,cAAe,OAC9BkS,EAAY/f,EAAS6N,cAAe,OACpCkS,EAAUC,MAAMC,QAAU,iEAC1BjB,EAAKzP,YAAawQ,GAAYxQ,YAAa3B,GAE3CA,EAAIoS,MAAMC,QAGT,uKAMD0R,EAAmBC,GAAuB,EAC1CE,GAAyB,EAGpB3xB,EAAOwwB,mBACXgB,EAA0E,QAArDxxB,EAAOwwB,iBAAkB/iB,EAAK,WAAeuB,IAClEyiB,EACwE,SAArEzxB,EAAOwwB,iBAAkB/iB,EAAK,QAAYyiB,MAAO,QAAUA,MAM9DrW,EAAWpM,EAAI2B,YAAavP,EAAS6N,cAAe,QAGpDmM,EAASgG,MAAMC,QAAUrS,EAAIoS,MAAMC,QAGlC,8HAEDjG,EAASgG,MAAM2S,YAAc3Y,EAASgG,MAAMqQ,MAAQ,IACpDziB,EAAIoS,MAAMqQ,MAAQ,MAElByB,GACE1sB,YAAcjF,EAAOwwB,iBAAkB3W,EAAU,WAAe2Y,aAElE/kB,EAAIE,YAAakM,IAUlBpM,EAAIoC,UAAY,8CAChBgK,EAAWpM,EAAIlB,qBAAsB,MACrCsN,EAAU,GAAIgG,MAAMC,QAAU,2CAC9B4R,EAA0D,IAA/B7X,EAAU,GAAI4Y,aACpCf,IACJ7X,EAAU,GAAIgG,MAAM8P,QAAU,GAC9B9V,EAAU,GAAIgG,MAAM8P,QAAU,OAC9B+B,EAA0D,IAA/B7X,EAAU,GAAI4Y,cAG1C5T,EAAKlR,YAAaiS,SAOpB9e,EAAO4xB,KAAO,SAAU/vB,EAAMiB,EAASpB,EAAUC,GAChD,GAAIL,GAAKuB,EACRmI,IAGD,KAAMnI,IAAQC,GACbkI,EAAKnI,GAAShB,EAAKkd,MAAOlc,GAC1BhB,EAAKkd,MAAOlc,GAASC,EAASD,EAG/BvB,GAAMI,EAASK,MAAOF,EAAMF,MAG5B,KAAMkB,IAAQC,GACbjB,EAAKkd,MAAOlc,GAASmI,EAAKnI,EAG3B,OAAOvB,GAIR,IACEuwB,IAAS,kBACVC,GAAW,wBAIXC,GAAe,4BACfC,GAAY,GAAIppB,QAAQ,KAAOwY,EAAO,SAAU,KAChD6Q,GAAU,GAAIrpB,QAAQ,YAAcwY,EAAO,IAAK,KAEhD8Q,IAAYC,SAAU,WAAYC,WAAY,SAAUvD,QAAS,SACjEwD,IACCC,cAAe,IACfC,WAAY,OAGbC,IAAgB,SAAU,IAAK,MAAO,KAIvC,SAASC,IAAgB1T,EAAOlc,GAG/B,GAAKA,IAAQkc,GACZ,MAAOlc,EAIR,IAAI6vB,GAAU7vB,EAAK4V,OAAO,GAAG9X,cAAgBkC,EAAKvD,MAAM,GACvDqzB,EAAW9vB,EACXf,EAAI0wB,GAAYzxB,MAEjB,OAAQe,IAEP,GADAe,EAAO2vB,GAAa1wB,GAAM4wB,EACrB7vB,IAAQkc,GACZ,MAAOlc,EAIT,OAAO8vB,GAGR,QAASC,IAAU3iB,EAAU4iB,GAM5B,IALA,GAAIhE,GAAShtB,EAAMixB,EAClB1V,KACA1D,EAAQ,EACR3Y,EAASkP,EAASlP,OAEHA,EAAR2Y,EAAgBA,IACvB7X,EAAOoO,EAAUyJ,GACX7X,EAAKkd,QAIX3B,EAAQ1D,GAAU1Z,EAAOwgB,MAAO3e,EAAM,cACtCgtB,EAAUhtB,EAAKkd,MAAM8P,QAChBgE,GAGEzV,EAAQ1D,IAAuB,SAAZmV,IACxBhtB,EAAKkd,MAAM8P,QAAU,IAMM,KAAvBhtB,EAAKkd,MAAM8P,SAAkBtN,EAAU1f,KAC3Cub,EAAQ1D,GAAU1Z,EAAOwgB,MAAO3e,EAAM,aAAcktB,GAAeltB,EAAKkD,cAGzE+tB,EAASvR,EAAU1f,IAEdgtB,GAAuB,SAAZA,IAAuBiE,IACtC9yB,EAAOwgB,MAAO3e,EAAM,aAAcixB,EAASjE,EAAU7uB,EAAOyhB,IAAK5f,EAAM,aAO1E,KAAM6X,EAAQ,EAAW3Y,EAAR2Y,EAAgBA,IAChC7X,EAAOoO,EAAUyJ,GACX7X,EAAKkd,QAGL8T,GAA+B,SAAvBhxB,EAAKkd,MAAM8P,SAA6C,KAAvBhtB,EAAKkd,MAAM8P,UACzDhtB,EAAKkd,MAAM8P,QAAUgE,EAAOzV,EAAQ1D,IAAW,GAAK,QAItD,OAAOzJ,GAGR,QAAS8iB,IAAmBlxB,EAAMoD,EAAO+tB,GACxC,GAAIltB,GAAUksB,GAAU3mB,KAAMpG,EAC9B,OAAOa,GAENvC,KAAKkC,IAAK,EAAGK,EAAS,IAAQktB,GAAY,KAAUltB,EAAS,IAAO,MACpEb,EAGF,QAASguB,IAAsBpxB,EAAMgB,EAAMqwB,EAAOC,EAAaC,GAS9D,IARA,GAAItxB,GAAIoxB,KAAYC,EAAc,SAAW,WAE5C,EAES,UAATtwB,EAAmB,EAAI,EAEvBsN,EAAM,EAEK,EAAJrO,EAAOA,GAAK,EAEJ,WAAVoxB,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAMqxB,EAAQ5R,EAAWxf,IAAK,EAAMsxB,IAGnDD,GAEW,YAAVD,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,UAAYyf,EAAWxf,IAAK,EAAMsxB,IAI7C,WAAVF,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,SAAWyf,EAAWxf,GAAM,SAAS,EAAMsxB,MAIrEjjB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,UAAYyf,EAAWxf,IAAK,EAAMsxB,GAG5C,YAAVF,IACJ/iB,GAAOnQ,EAAOyhB,IAAK5f,EAAM,SAAWyf,EAAWxf,GAAM,SAAS,EAAMsxB,IAKvE,OAAOjjB,GAGR,QAASkjB,IAAkBxxB,EAAMgB,EAAMqwB,GAGtC,GAAII,IAAmB,EACtBnjB,EAAe,UAATtN,EAAmBhB,EAAKqd,YAAcrd,EAAK8vB,aACjDyB,EAAS7D,GAAW1tB,GACpBsxB,EAAcrzB,EAAQoxB,WAAgE,eAAnDlxB,EAAOyhB,IAAK5f,EAAM,aAAa,EAAOuxB,EAK1E,IAAY,GAAPjjB,GAAmB,MAAPA,EAAc,CAQ9B,GANAA,EAAMqf,GAAQ3tB,EAAMgB,EAAMuwB,IACf,EAANjjB,GAAkB,MAAPA,KACfA,EAAMtO,EAAKkd,MAAOlc,IAIdysB,GAAU1jB,KAAKuE,GACnB,MAAOA,EAKRmjB,GAAmBH,IAAiBrzB,EAAQyxB,qBAAuBphB,IAAQtO,EAAKkd,MAAOlc,IAGvFsN,EAAMhM,WAAYgM,IAAS,EAI5B,MAASA,GACR8iB,GACCpxB,EACAgB,EACAqwB,IAAWC,EAAc,SAAW,WACpCG,EACAF,GAEE,KAGLpzB,EAAOyC,QAGN8wB,UACCzC,SACC5vB,IAAK,SAAUW,EAAM+tB,GACpB,GAAKA,EAAW,CAEf,GAAItuB,GAAMkuB,GAAQ3tB,EAAM,UACxB,OAAe,KAARP,EAAa,IAAMA,MAO9BkyB,WACCC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdrB,YAAc,EACdsB,YAAc,EACd/C,SAAW,EACXgD,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVhV,MAAQ,GAKTiV,UAECC,QAASr0B,EAAQixB,SAAW,WAAa,cAI1ChS,MAAO,SAAUld,EAAMgB,EAAMoC,EAAOiuB,GAEnC,GAAMrxB,GAA0B,IAAlBA,EAAKyC,UAAoC,IAAlBzC,EAAKyC,UAAmBzC,EAAKkd,MAAlE,CAKA,GAAIzd,GAAKyC,EAAM8c,EACd8R,EAAW3yB,EAAO6E,UAAWhC,GAC7Bkc,EAAQld,EAAKkd,KASd,IAPAlc,EAAO7C,EAAOk0B,SAAUvB,KAAgB3yB,EAAOk0B,SAAUvB,GAAaF,GAAgB1T,EAAO4T,IAI7F9R,EAAQ7gB,EAAOuzB,SAAU1wB,IAAU7C,EAAOuzB,SAAUZ,GAGrCtvB,SAAV4B,EAsCJ,MAAK4b,IAAS,OAASA,IAAqDxd,UAA3C/B,EAAMuf,EAAM3f,IAAKW,GAAM,EAAOqxB,IACvD5xB,EAIDyd,EAAOlc,EAhCd,IAVAkB,QAAckB,GAGA,WAATlB,IAAsBzC,EAAM2wB,GAAQ5mB,KAAMpG,MAC9CA,GAAU3D,EAAI,GAAK,GAAMA,EAAI,GAAK6C,WAAYnE,EAAOyhB,IAAK5f,EAAMgB,IAEhEkB,EAAO,UAIM,MAATkB,GAAiBA,IAAUA,IAKlB,WAATlB,GAAsB/D,EAAOwzB,UAAWb,KAC5C1tB,GAAS,MAKJnF,EAAQmxB,iBAA6B,KAAVhsB,GAA+C,IAA/BpC,EAAKpD,QAAQ,gBAC7Dsf,EAAOlc,GAAS,aAIXge,GAAW,OAASA,IAAwDxd,UAA7C4B,EAAQ4b,EAAMqN,IAAKrsB,EAAMoD,EAAOiuB,MAIpE,IACCnU,EAAOlc,GAASoC,EACf,MAAMV,OAcXkd,IAAK,SAAU5f,EAAMgB,EAAMqwB,EAAOE,GACjC,GAAIjyB,GAAKgP,EAAK0Q,EACb8R,EAAW3yB,EAAO6E,UAAWhC,EAyB9B,OAtBAA,GAAO7C,EAAOk0B,SAAUvB,KAAgB3yB,EAAOk0B,SAAUvB,GAAaF,GAAgB5wB,EAAKkd,MAAO4T,IAIlG9R,EAAQ7gB,EAAOuzB,SAAU1wB,IAAU7C,EAAOuzB,SAAUZ,GAG/C9R,GAAS,OAASA,KACtB1Q,EAAM0Q,EAAM3f,IAAKW,GAAM,EAAMqxB,IAIjB7vB,SAAR8M,IACJA,EAAMqf,GAAQ3tB,EAAMgB,EAAMuwB,IAId,WAARjjB,GAAoBtN,IAAQwvB,MAChCliB,EAAMkiB,GAAoBxvB,IAIZ,KAAVqwB,GAAgBA,GACpB/xB,EAAMgD,WAAYgM,GACX+iB,KAAU,GAAQlzB,EAAOkE,UAAW/C,GAAQA,GAAO,EAAIgP,GAExDA,KAITnQ,EAAOyB,MAAO,SAAU,SAAW,SAAUK,EAAGe,GAC/C7C,EAAOuzB,SAAU1wB,IAChB3B,IAAK,SAAUW,EAAM+tB,EAAUsD,GAC9B,MAAKtD,GAGGmC,GAAanmB,KAAM5L,EAAOyhB,IAAK5f,EAAM,aAAsC,IAArBA,EAAKqd,YACjElf,EAAO4xB,KAAM/vB,EAAMqwB,GAAS,WAC3B,MAAOmB,IAAkBxxB,EAAMgB,EAAMqwB,KAEtCG,GAAkBxxB,EAAMgB,EAAMqwB,GAPhC,QAWDhF,IAAK,SAAUrsB,EAAMoD,EAAOiuB,GAC3B,GAAIE,GAASF,GAAS3D,GAAW1tB,EACjC,OAAOkxB,IAAmBlxB,EAAMoD,EAAOiuB,EACtCD,GACCpxB,EACAgB,EACAqwB,EACApzB,EAAQoxB,WAAgE,eAAnDlxB,EAAOyhB,IAAK5f,EAAM,aAAa,EAAOuxB,GAC3DA,GACG,OAMFtzB,EAAQgxB,UACb9wB,EAAOuzB,SAASzC,SACf5vB,IAAK,SAAUW,EAAM+tB,GAEpB,MAAOkC,IAASlmB,MAAOgkB,GAAY/tB,EAAKmuB,aAAenuB,EAAKmuB,aAAarhB,OAAS9M,EAAKkd,MAAMpQ,SAAW,IACrG,IAAOxK,WAAYyE,OAAOwrB,IAAS,GACrCxE,EAAW,IAAM,IAGnB1B,IAAK,SAAUrsB,EAAMoD,GACpB,GAAI8Z,GAAQld,EAAKkd,MAChBiR,EAAenuB,EAAKmuB,aACpBc,EAAU9wB,EAAOkE,UAAWe,GAAU,iBAA2B,IAARA,EAAc,IAAM,GAC7E0J,EAASqhB,GAAgBA,EAAarhB,QAAUoQ,EAAMpQ,QAAU,EAIjEoQ,GAAME,KAAO,GAINha,GAAS,GAAe,KAAVA,IAC6B,KAAhDjF,EAAO2E,KAAMgK,EAAOlL,QAASouB,GAAQ,MACrC9S,EAAM3S,kBAKP2S,EAAM3S,gBAAiB,UAGR,KAAVnH,GAAgB+qB,IAAiBA,EAAarhB,UAMpDoQ,EAAMpQ,OAASkjB,GAAOjmB,KAAM+C,GAC3BA,EAAOlL,QAASouB,GAAQf,GACxBniB,EAAS,IAAMmiB,MAKnB9wB,EAAOuzB,SAAS7B,YAAcpB,GAAcxwB,EAAQ2xB,oBACnD,SAAU5vB,EAAM+tB,GACf,MAAKA,GAGG5vB,EAAO4xB,KAAM/vB,GAAQgtB,QAAW,gBACtCW,IAAU3tB,EAAM,gBAJlB,SAUF7B,EAAOyB,MACN4yB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBz0B,EAAOuzB,SAAUiB,EAASC,IACzBC,OAAQ,SAAUzvB,GAOjB,IANA,GAAInD,GAAI,EACP6yB,KAGAC,EAAyB,gBAAV3vB,GAAqBA,EAAMqB,MAAM,MAASrB,GAE9C,EAAJnD,EAAOA,IACd6yB,EAAUH,EAASlT,EAAWxf,GAAM2yB,GACnCG,EAAO9yB,IAAO8yB,EAAO9yB,EAAI,IAAO8yB,EAAO,EAGzC,OAAOD,KAIHtF,GAAQzjB,KAAM4oB,KACnBx0B,EAAOuzB,SAAUiB,EAASC,GAASvG,IAAM6E,MAI3C/yB,EAAOG,GAAGsC,QACTgf,IAAK,SAAU5e,EAAMoC,GACpB,MAAOyc,GAAQviB,KAAM,SAAU0C,EAAMgB,EAAMoC,GAC1C,GAAImuB,GAAQhxB,EACXR,KACAE,EAAI,CAEL,IAAK9B,EAAOoD,QAASP,GAAS,CAI7B,IAHAuwB,EAAS7D,GAAW1tB,GACpBO,EAAMS,EAAK9B,OAECqB,EAAJN,EAASA,IAChBF,EAAKiB,EAAMf,IAAQ9B,EAAOyhB,IAAK5f,EAAMgB,EAAMf,IAAK,EAAOsxB,EAGxD,OAAOxxB,GAGR,MAAiByB,UAAV4B,EACNjF,EAAO+e,MAAOld,EAAMgB,EAAMoC,GAC1BjF,EAAOyhB,IAAK5f,EAAMgB,IACjBA,EAAMoC,EAAOjD,UAAUjB,OAAS,IAEpC8xB,KAAM,WACL,MAAOD,IAAUzzB,MAAM,IAExB01B,KAAM,WACL,MAAOjC,IAAUzzB,OAElB21B,OAAQ,SAAU/Y,GACjB,MAAsB,iBAAVA,GACJA,EAAQ5c,KAAK0zB,OAAS1zB,KAAK01B,OAG5B11B,KAAKsC,KAAK,WACX8f,EAAUpiB,MACda,EAAQb,MAAO0zB,OAEf7yB,EAAQb,MAAO01B,WAOnB,SAASE,IAAOlzB,EAAMiB,EAASyjB,EAAMjkB,EAAK0yB;AACzC,MAAO,IAAID,IAAMn0B,UAAUR,KAAMyB,EAAMiB,EAASyjB,EAAMjkB,EAAK0yB,GAE5Dh1B,EAAO+0B,MAAQA,GAEfA,GAAMn0B,WACLE,YAAai0B,GACb30B,KAAM,SAAUyB,EAAMiB,EAASyjB,EAAMjkB,EAAK0yB,EAAQC,GACjD91B,KAAK0C,KAAOA,EACZ1C,KAAKonB,KAAOA,EACZpnB,KAAK61B,OAASA,GAAU,QACxB71B,KAAK2D,QAAUA,EACf3D,KAAKgT,MAAQhT,KAAKiH,IAAMjH,KAAKgO,MAC7BhO,KAAKmD,IAAMA,EACXnD,KAAK81B,KAAOA,IAAUj1B,EAAOwzB,UAAWjN,GAAS,GAAK,OAEvDpZ,IAAK,WACJ,GAAI0T,GAAQkU,GAAMG,UAAW/1B,KAAKonB,KAElC,OAAO1F,IAASA,EAAM3f,IACrB2f,EAAM3f,IAAK/B,MACX41B,GAAMG,UAAUrP,SAAS3kB,IAAK/B,OAEhCg2B,IAAK,SAAUC,GACd,GAAIC,GACHxU,EAAQkU,GAAMG,UAAW/1B,KAAKonB,KAoB/B,OAlBKpnB,MAAK2D,QAAQwyB,SACjBn2B,KAAKsa,IAAM4b,EAAQr1B,EAAOg1B,OAAQ71B,KAAK61B,QACtCI,EAASj2B,KAAK2D,QAAQwyB,SAAWF,EAAS,EAAG,EAAGj2B,KAAK2D,QAAQwyB,UAG9Dn2B,KAAKsa,IAAM4b,EAAQD,EAEpBj2B,KAAKiH,KAAQjH,KAAKmD,IAAMnD,KAAKgT,OAAUkjB,EAAQl2B,KAAKgT,MAE/ChT,KAAK2D,QAAQyyB,MACjBp2B,KAAK2D,QAAQyyB,KAAKt0B,KAAM9B,KAAK0C,KAAM1C,KAAKiH,IAAKjH,MAGzC0hB,GAASA,EAAMqN,IACnBrN,EAAMqN,IAAK/uB,MAEX41B,GAAMG,UAAUrP,SAASqI,IAAK/uB,MAExBA,OAIT41B,GAAMn0B,UAAUR,KAAKQ,UAAYm0B,GAAMn0B,UAEvCm0B,GAAMG,WACLrP,UACC3kB,IAAK,SAAUs0B,GACd,GAAI7jB,EAEJ,OAAiC,OAA5B6jB,EAAM3zB,KAAM2zB,EAAMjP,OACpBiP,EAAM3zB,KAAKkd,OAA2C,MAAlCyW,EAAM3zB,KAAKkd,MAAOyW,EAAMjP,OAQ/C5U,EAAS3R,EAAOyhB,IAAK+T,EAAM3zB,KAAM2zB,EAAMjP,KAAM,IAErC5U,GAAqB,SAAXA,EAAwBA,EAAJ,GAT9B6jB,EAAM3zB,KAAM2zB,EAAMjP,OAW3B2H,IAAK,SAAUsH,GAGTx1B,EAAOy1B,GAAGF,KAAMC,EAAMjP,MAC1BvmB,EAAOy1B,GAAGF,KAAMC,EAAMjP,MAAQiP,GACnBA,EAAM3zB,KAAKkd,QAAgE,MAArDyW,EAAM3zB,KAAKkd,MAAO/e,EAAOk0B,SAAUsB,EAAMjP,QAAoBvmB,EAAOuzB,SAAUiC,EAAMjP,OACrHvmB,EAAO+e,MAAOyW,EAAM3zB,KAAM2zB,EAAMjP,KAAMiP,EAAMpvB,IAAMovB,EAAMP,MAExDO,EAAM3zB,KAAM2zB,EAAMjP,MAASiP,EAAMpvB,OASrC2uB,GAAMG,UAAUtN,UAAYmN,GAAMG,UAAU1N,YAC3C0G,IAAK,SAAUsH,GACTA,EAAM3zB,KAAKyC,UAAYkxB,EAAM3zB,KAAK0J,aACtCiqB,EAAM3zB,KAAM2zB,EAAMjP,MAASiP,EAAMpvB,OAKpCpG,EAAOg1B,QACNU,OAAQ,SAAUC,GACjB,MAAOA,IAERC,MAAO,SAAUD,GAChB,MAAO,GAAMpyB,KAAKsyB,IAAKF,EAAIpyB,KAAKuyB,IAAO,IAIzC91B,EAAOy1B,GAAKV,GAAMn0B,UAAUR,KAG5BJ,EAAOy1B,GAAGF,OAKV,IACCQ,IAAOC,GACPC,GAAW,yBACXC,GAAS,GAAIttB,QAAQ,iBAAmBwY,EAAO,cAAe,KAC9D+U,GAAO,cACPC,IAAwBC,IACxBC,IACCC,KAAO,SAAUhQ,EAAMthB,GACtB,GAAIuwB,GAAQr2B,KAAKq3B,YAAajQ,EAAMthB,GACnCjC,EAASwyB,EAAMroB,MACfynB,EAAQsB,GAAO7qB,KAAMpG,GACrBgwB,EAAOL,GAASA,EAAO,KAAS50B,EAAOwzB,UAAWjN,GAAS,GAAK,MAGhEpU,GAAUnS,EAAOwzB,UAAWjN,IAAmB,OAAT0O,IAAkBjyB,IACvDkzB,GAAO7qB,KAAMrL,EAAOyhB,IAAK+T,EAAM3zB,KAAM0kB,IACtCkQ,EAAQ,EACRC,EAAgB,EAEjB,IAAKvkB,GAASA,EAAO,KAAQ8iB,EAAO,CAEnCA,EAAOA,GAAQ9iB,EAAO,GAGtByiB,EAAQA,MAGRziB,GAASnP,GAAU,CAEnB,GAGCyzB,GAAQA,GAAS,KAGjBtkB,GAAgBskB,EAChBz2B,EAAO+e,MAAOyW,EAAM3zB,KAAM0kB,EAAMpU,EAAQ8iB,SAI/BwB,KAAWA,EAAQjB,EAAMroB,MAAQnK,IAAqB,IAAVyzB,KAAiBC,GAaxE,MATK9B,KACJziB,EAAQqjB,EAAMrjB,OAASA,IAAUnP,GAAU,EAC3CwyB,EAAMP,KAAOA,EAEbO,EAAMlzB,IAAMsyB,EAAO,GAClBziB,GAAUyiB,EAAO,GAAM,GAAMA,EAAO,IACnCA,EAAO,IAGHY,IAKV,SAASmB,MAIR,MAHA3Y,YAAW,WACV+X,GAAQ1yB,SAEA0yB,GAAQ/1B,EAAOoG,MAIzB,QAASwwB,IAAO7yB,EAAM8yB,GACrB,GAAI5P,GACHla,GAAU+pB,OAAQ/yB,GAClBjC,EAAI,CAKL,KADA+0B,EAAeA,EAAe,EAAI,EACtB,EAAJ/0B,EAAQA,GAAK,EAAI+0B,EACxB5P,EAAQ3F,EAAWxf,GACnBiL,EAAO,SAAWka,GAAUla,EAAO,UAAYka,GAAUljB,CAO1D,OAJK8yB,KACJ9pB,EAAM+jB,QAAU/jB,EAAMqiB,MAAQrrB,GAGxBgJ,EAGR,QAASypB,IAAavxB,EAAOshB,EAAMwQ,GAKlC,IAJA,GAAIvB,GACHwB,GAAeV,GAAU/P,QAAehnB,OAAQ+2B,GAAU,MAC1D5c,EAAQ,EACR3Y,EAASi2B,EAAWj2B,OACLA,EAAR2Y,EAAgBA,IACvB,GAAM8b,EAAQwB,EAAYtd,GAAQzY,KAAM81B,EAAWxQ,EAAMthB,GAGxD,MAAOuwB,GAKV,QAASa,IAAkBx0B,EAAMglB,EAAOoQ,GAEvC,GAAI1Q,GAAMthB,EAAO6vB,EAAQU,EAAO3U,EAAOqW,EAASrI,EAASsI,EACxDC,EAAOj4B,KACP4pB,KACAhK,EAAQld,EAAKkd,MACb+T,EAASjxB,EAAKyC,UAAYid,EAAU1f,GACpCw1B,EAAWr3B,EAAOwgB,MAAO3e,EAAM,SAG1Bo1B,GAAKvW,QACVG,EAAQ7gB,EAAO8gB,YAAajf,EAAM,MACX,MAAlBgf,EAAMyW,WACVzW,EAAMyW,SAAW,EACjBJ,EAAUrW,EAAM/M,MAAMuH,KACtBwF,EAAM/M,MAAMuH,KAAO,WACZwF,EAAMyW,UACXJ,MAIHrW,EAAMyW,WAENF,EAAKnb,OAAO,WAGXmb,EAAKnb,OAAO,WACX4E,EAAMyW,WACAt3B,EAAO0gB,MAAO7e,EAAM,MAAOd,QAChC8f,EAAM/M,MAAMuH,YAOO,IAAlBxZ,EAAKyC,WAAoB,UAAYuiB,IAAS,SAAWA,MAK7DoQ,EAAKM,UAAaxY,EAAMwY,SAAUxY,EAAMyY,UAAWzY,EAAM0Y,WAIzD5I,EAAU7uB,EAAOyhB,IAAK5f,EAAM,WAG5Bs1B,EAA2B,SAAZtI,EACd7uB,EAAOwgB,MAAO3e,EAAM,eAAkBktB,GAAgBltB,EAAKkD,UAAa8pB,EAEnD,WAAjBsI,GAA6D,SAAhCn3B,EAAOyhB,IAAK5f,EAAM,WAI7C/B,EAAQ+e,wBAA8D,WAApCkQ,GAAgBltB,EAAKkD,UAG5Dga,EAAME,KAAO,EAFbF,EAAM8P,QAAU,iBAOdoI,EAAKM,WACTxY,EAAMwY,SAAW,SACXz3B,EAAQqvB,oBACbiI,EAAKnb,OAAO,WACX8C,EAAMwY,SAAWN,EAAKM,SAAU,GAChCxY,EAAMyY,UAAYP,EAAKM,SAAU,GACjCxY,EAAM0Y,UAAYR,EAAKM,SAAU,KAMpC,KAAMhR,IAAQM,GAEb,GADA5hB,EAAQ4hB,EAAON,GACV0P,GAAS5qB,KAAMpG,GAAU,CAG7B,SAFO4hB,GAAON,GACduO,EAASA,GAAoB,WAAV7vB,EACdA,KAAY6tB,EAAS,OAAS,QAAW,CAG7C,GAAe,SAAV7tB,IAAoBoyB,GAAiCh0B,SAArBg0B,EAAU9Q,GAG9C,QAFAuM,IAAS,EAKX/J,EAAMxC,GAAS8Q,GAAYA,EAAU9Q,IAAUvmB,EAAO+e,MAAOld,EAAM0kB,OAInEsI,GAAUxrB,MAIZ,IAAMrD,EAAOoE,cAAe2kB,GAwCqD,YAAxD,SAAZ8F,EAAqBE,GAAgBltB,EAAKkD,UAAa8pB,KACnE9P,EAAM8P,QAAUA,OAzCoB,CAC/BwI,EACC,UAAYA,KAChBvE,EAASuE,EAASvE,QAGnBuE,EAAWr3B,EAAOwgB,MAAO3e,EAAM,aAI3BizB,IACJuC,EAASvE,QAAUA,GAEfA,EACJ9yB,EAAQ6B,GAAOgxB,OAEfuE,EAAK3vB,KAAK,WACTzH,EAAQ6B,GAAOgzB,SAGjBuC,EAAK3vB,KAAK,WACT,GAAI8e,EACJvmB,GAAOygB,YAAa5e,EAAM,SAC1B,KAAM0kB,IAAQwC,GACb/oB,EAAO+e,MAAOld,EAAM0kB,EAAMwC,EAAMxC,KAGlC,KAAMA,IAAQwC,GACbyM,EAAQgB,GAAa1D,EAASuE,EAAU9Q,GAAS,EAAGA,EAAM6Q,GAElD7Q,IAAQ8Q,KACfA,EAAU9Q,GAASiP,EAAMrjB,MACpB2gB,IACJ0C,EAAMlzB,IAAMkzB,EAAMrjB,MAClBqjB,EAAMrjB,MAAiB,UAAToU,GAA6B,WAATA,EAAoB,EAAI,KAW/D,QAASmR,IAAY7Q,EAAO8Q,GAC3B,GAAIje,GAAO7W,EAAMmyB,EAAQ/vB,EAAO4b,CAGhC,KAAMnH,IAASmN,GAed,GAdAhkB,EAAO7C,EAAO6E,UAAW6U,GACzBsb,EAAS2C,EAAe90B,GACxBoC,EAAQ4hB,EAAOnN,GACV1Z,EAAOoD,QAAS6B,KACpB+vB,EAAS/vB,EAAO,GAChBA,EAAQ4hB,EAAOnN,GAAUzU,EAAO,IAG5ByU,IAAU7W,IACdgkB,EAAOhkB,GAASoC,QACT4hB,GAAOnN,IAGfmH,EAAQ7gB,EAAOuzB,SAAU1wB,GACpBge,GAAS,UAAYA,GAAQ,CACjC5b,EAAQ4b,EAAM6T,OAAQzvB,SACf4hB,GAAOhkB,EAId,KAAM6W,IAASzU,GACNyU,IAASmN,KAChBA,EAAOnN,GAAUzU,EAAOyU,GACxBie,EAAeje,GAAUsb,OAI3B2C,GAAe90B,GAASmyB,EAK3B,QAAS4C,IAAW/1B,EAAMg2B,EAAY/0B,GACrC,GAAI6O,GACHmmB,EACApe,EAAQ,EACR3Y,EAASq1B,GAAoBr1B,OAC7Bmb,EAAWlc,EAAO4b,WAAWK,OAAQ,iBAE7B8b,GAAKl2B,OAEbk2B,EAAO,WACN,GAAKD,EACJ,OAAO,CAUR,KARA,GAAIE,GAAcjC,IAASY,KAC1BzZ,EAAY3Z,KAAKkC,IAAK,EAAGsxB,EAAUkB,UAAYlB,EAAUzB,SAAW0C,GAEpE5hB,EAAO8G,EAAY6Z,EAAUzB,UAAY,EACzCF,EAAU,EAAIhf,EACdsD,EAAQ,EACR3Y,EAASg2B,EAAUmB,OAAOn3B,OAEXA,EAAR2Y,EAAiBA,IACxBqd,EAAUmB,OAAQxe,GAAQyb,IAAKC,EAKhC,OAFAlZ,GAASoB,WAAYzb,GAAQk1B,EAAW3B,EAASlY,IAElC,EAAVkY,GAAer0B,EACZmc,GAEPhB,EAASqB,YAAa1b,GAAQk1B,KACvB,IAGTA,EAAY7a,EAASF,SACpBna,KAAMA,EACNglB,MAAO7mB,EAAOyC,UAAYo1B,GAC1BZ,KAAMj3B,EAAOyC,QAAQ,GAAQk1B,kBAAqB70B,GAClDq1B,mBAAoBN,EACpBO,gBAAiBt1B,EACjBm1B,UAAWlC,IAASY,KACpBrB,SAAUxyB,EAAQwyB,SAClB4C,UACA1B,YAAa,SAAUjQ,EAAMjkB,GAC5B,GAAIkzB,GAAQx1B,EAAO+0B,MAAOlzB,EAAMk1B,EAAUE,KAAM1Q,EAAMjkB,EACpDy0B,EAAUE,KAAKU,cAAepR,IAAUwQ,EAAUE,KAAKjC,OAEzD,OADA+B,GAAUmB,OAAO14B,KAAMg2B,GAChBA,GAERzU,KAAM,SAAUsX,GACf,GAAI3e,GAAQ,EAGX3Y,EAASs3B,EAAUtB,EAAUmB,OAAOn3B,OAAS,CAC9C,IAAK+2B,EACJ,MAAO34B,KAGR,KADA24B,GAAU,EACM/2B,EAAR2Y,EAAiBA,IACxBqd,EAAUmB,OAAQxe,GAAQyb,IAAK,EAUhC,OALKkD,GACJnc,EAASqB,YAAa1b,GAAQk1B,EAAWsB,IAEzCnc,EAASoc,WAAYz2B,GAAQk1B,EAAWsB,IAElCl5B,QAGT0nB,EAAQkQ,EAAUlQ,KAInB,KAFA6Q,GAAY7Q,EAAOkQ,EAAUE,KAAKU,eAElB52B,EAAR2Y,EAAiBA,IAExB,GADA/H,EAASykB,GAAqB1c,GAAQzY,KAAM81B,EAAWl1B,EAAMglB,EAAOkQ,EAAUE,MAE7E,MAAOtlB,EAmBT,OAfA3R,GAAO4B,IAAKilB,EAAO2P,GAAaO,GAE3B/2B,EAAOkD,WAAY6zB,EAAUE,KAAK9kB,QACtC4kB,EAAUE,KAAK9kB,MAAMlR,KAAMY,EAAMk1B,GAGlC/2B,EAAOy1B,GAAG8C,MACTv4B,EAAOyC,OAAQs1B,GACdl2B,KAAMA,EACNu1B,KAAML,EACNrW,MAAOqW,EAAUE,KAAKvW,SAKjBqW,EAAUpa,SAAUoa,EAAUE,KAAKta,UACxClV,KAAMsvB,EAAUE,KAAKxvB,KAAMsvB,EAAUE,KAAKuB,UAC1Crc,KAAM4a,EAAUE,KAAK9a,MACrBF,OAAQ8a,EAAUE,KAAKhb,QAG1Bjc,EAAO43B,UAAY53B,EAAOyC,OAAQm1B,IACjCa,QAAS,SAAU5R,EAAOnlB,GACpB1B,EAAOkD,WAAY2jB,IACvBnlB,EAAWmlB,EACXA,GAAU,MAEVA,EAAQA,EAAMvgB,MAAM,IAOrB,KAJA,GAAIigB,GACH7M,EAAQ,EACR3Y,EAAS8lB,EAAM9lB,OAEAA,EAAR2Y,EAAiBA,IACxB6M,EAAOM,EAAOnN,GACd4c,GAAU/P,GAAS+P,GAAU/P,OAC7B+P,GAAU/P,GAAOxW,QAASrO,IAI5Bg3B,UAAW,SAAUh3B,EAAU+rB,GACzBA,EACJ2I,GAAoBrmB,QAASrO,GAE7B00B,GAAoB52B,KAAMkC,MAK7B1B,EAAO24B,MAAQ,SAAUA,EAAO3D,EAAQ70B,GACvC,GAAIy4B,GAAMD,GAA0B,gBAAVA,GAAqB34B,EAAOyC,UAAYk2B,IACjEH,SAAUr4B,IAAOA,GAAM60B,GACtBh1B,EAAOkD,WAAYy1B,IAAWA,EAC/BrD,SAAUqD,EACV3D,OAAQ70B,GAAM60B,GAAUA,IAAWh1B,EAAOkD,WAAY8xB,IAAYA,EAwBnE,OArBA4D,GAAItD,SAAWt1B,EAAOy1B,GAAGvX,IAAM,EAA4B,gBAAjB0a,GAAItD,SAAwBsD,EAAItD,SACzEsD,EAAItD,WAAYt1B,GAAOy1B,GAAGoD,OAAS74B,EAAOy1B,GAAGoD,OAAQD,EAAItD,UAAat1B,EAAOy1B,GAAGoD,OAAOhT,UAGtE,MAAb+S,EAAIlY,OAAiBkY,EAAIlY,SAAU,KACvCkY,EAAIlY,MAAQ,MAIbkY,EAAI5tB,IAAM4tB,EAAIJ,SAEdI,EAAIJ,SAAW,WACTx4B,EAAOkD,WAAY01B,EAAI5tB,MAC3B4tB,EAAI5tB,IAAI/J,KAAM9B,MAGVy5B,EAAIlY,OACR1gB,EAAO2gB,QAASxhB,KAAMy5B,EAAIlY,QAIrBkY,GAGR54B,EAAOG,GAAGsC,QACTq2B,OAAQ,SAAUH,EAAOI,EAAI/D,EAAQtzB,GAGpC,MAAOvC,MAAKwP,OAAQ4S,GAAWE,IAAK,UAAW,GAAIoR,OAGjDvwB,MAAM02B,SAAUlI,QAASiI,GAAMJ,EAAO3D,EAAQtzB,IAEjDs3B,QAAS,SAAUzS,EAAMoS,EAAO3D,EAAQtzB,GACvC,GAAIoS,GAAQ9T,EAAOoE,cAAemiB,GACjC0S,EAASj5B,EAAO24B,MAAOA,EAAO3D,EAAQtzB,GACtCw3B,EAAc,WAEb,GAAI9B,GAAOQ,GAAWz4B,KAAMa,EAAOyC,UAAY8jB,GAAQ0S,IAGlDnlB,GAAS9T,EAAOwgB,MAAOrhB,KAAM,YACjCi4B,EAAKrW,MAAM,GAKd,OAFCmY,GAAYC,OAASD,EAEfplB,GAASmlB,EAAOvY,SAAU,EAChCvhB,KAAKsC,KAAMy3B,GACX/5B,KAAKuhB,MAAOuY,EAAOvY,MAAOwY,IAE5BnY,KAAM,SAAUhd,EAAMkd,EAAYoX,GACjC,GAAIe,GAAY,SAAUvY,GACzB,GAAIE,GAAOF,EAAME,WACVF,GAAME,KACbA,EAAMsX,GAYP,OATqB,gBAATt0B,KACXs0B,EAAUpX,EACVA,EAAald,EACbA,EAAOV,QAEH4d,GAAcld,KAAS,GAC3B5E,KAAKuhB,MAAO3c,GAAQ,SAGd5E,KAAKsC,KAAK,WAChB,GAAIkf,IAAU,EACbjH,EAAgB,MAAR3V,GAAgBA,EAAO,aAC/Bs1B,EAASr5B,EAAOq5B,OAChB30B,EAAO1E,EAAOwgB,MAAOrhB,KAEtB,IAAKua,EACChV,EAAMgV,IAAWhV,EAAMgV,GAAQqH,MACnCqY,EAAW10B,EAAMgV,QAGlB,KAAMA,IAAShV,GACTA,EAAMgV,IAAWhV,EAAMgV,GAAQqH,MAAQoV,GAAKvqB,KAAM8N,IACtD0f,EAAW10B,EAAMgV,GAKpB,KAAMA,EAAQ2f,EAAOt4B,OAAQ2Y,KACvB2f,EAAQ3f,GAAQ7X,OAAS1C,MAAiB,MAAR4E,GAAgBs1B,EAAQ3f,GAAQgH,QAAU3c,IAChFs1B,EAAQ3f,GAAQ0d,KAAKrW,KAAMsX,GAC3B1X,GAAU,EACV0Y,EAAO72B,OAAQkX,EAAO,KAOnBiH,IAAY0X,IAChBr4B,EAAO2gB,QAASxhB,KAAM4E,MAIzBo1B,OAAQ,SAAUp1B,GAIjB,MAHKA,MAAS,IACbA,EAAOA,GAAQ,MAET5E,KAAKsC,KAAK,WAChB,GAAIiY,GACHhV,EAAO1E,EAAOwgB,MAAOrhB,MACrBuhB,EAAQhc,EAAMX,EAAO,SACrB8c,EAAQnc,EAAMX,EAAO,cACrBs1B,EAASr5B,EAAOq5B,OAChBt4B,EAAS2f,EAAQA,EAAM3f,OAAS,CAajC,KAVA2D,EAAKy0B,QAAS,EAGdn5B,EAAO0gB,MAAOvhB,KAAM4E,MAEf8c,GAASA,EAAME,MACnBF,EAAME,KAAK9f,KAAM9B,MAAM,GAIlBua,EAAQ2f,EAAOt4B,OAAQ2Y,KACvB2f,EAAQ3f,GAAQ7X,OAAS1C,MAAQk6B,EAAQ3f,GAAQgH,QAAU3c,IAC/Ds1B,EAAQ3f,GAAQ0d,KAAKrW,MAAM,GAC3BsY,EAAO72B,OAAQkX,EAAO,GAKxB,KAAMA,EAAQ,EAAW3Y,EAAR2Y,EAAgBA,IAC3BgH,EAAOhH,IAAWgH,EAAOhH,GAAQyf,QACrCzY,EAAOhH,GAAQyf,OAAOl4B,KAAM9B,YAKvBuF,GAAKy0B,YAKfn5B,EAAOyB,MAAO,SAAU,OAAQ,QAAU,SAAUK,EAAGe,GACtD,GAAIy2B,GAAQt5B,EAAOG,GAAI0C,EACvB7C,GAAOG,GAAI0C,GAAS,SAAU81B,EAAO3D,EAAQtzB,GAC5C,MAAgB,OAATi3B,GAAkC,iBAAVA,GAC9BW,EAAMv3B,MAAO5C,KAAM6C,WACnB7C,KAAK65B,QAASpC,GAAO/zB,GAAM,GAAQ81B,EAAO3D,EAAQtzB,MAKrD1B,EAAOyB,MACN83B,UAAW3C,GAAM,QACjB4C,QAAS5C,GAAM,QACf6C,YAAa7C,GAAM,UACnB8C,QAAU5I,QAAS,QACnB6I,SAAW7I,QAAS,QACpB8I,YAAc9I,QAAS,WACrB,SAAUjuB,EAAMgkB,GAClB7mB,EAAOG,GAAI0C,GAAS,SAAU81B,EAAO3D,EAAQtzB,GAC5C,MAAOvC,MAAK65B,QAASnS,EAAO8R,EAAO3D,EAAQtzB,MAI7C1B,EAAOq5B,UACPr5B,EAAOy1B,GAAGsC,KAAO,WAChB,GAAIQ,GACHc,EAASr5B,EAAOq5B,OAChBv3B,EAAI,CAIL,KAFAi0B,GAAQ/1B,EAAOoG,MAEPtE,EAAIu3B,EAAOt4B,OAAQe,IAC1By2B,EAAQc,EAAQv3B,GAEVy2B,KAAWc,EAAQv3B,KAAQy2B,GAChCc,EAAO72B,OAAQV,IAAK,EAIhBu3B,GAAOt4B,QACZf,EAAOy1B,GAAG1U,OAEXgV,GAAQ1yB,QAGTrD,EAAOy1B,GAAG8C,MAAQ,SAAUA,GAC3Bv4B,EAAOq5B,OAAO75B,KAAM+4B,GACfA,IACJv4B,EAAOy1B,GAAGtjB,QAEVnS,EAAOq5B,OAAOnxB,OAIhBlI,EAAOy1B,GAAGoE,SAAW,GAErB75B,EAAOy1B,GAAGtjB,MAAQ,WACX6jB,KACLA,GAAU8D,YAAa95B,EAAOy1B,GAAGsC,KAAM/3B,EAAOy1B,GAAGoE,YAInD75B,EAAOy1B,GAAG1U,KAAO,WAChBgZ,cAAe/D,IACfA,GAAU,MAGXh2B,EAAOy1B,GAAGoD,QACTmB,KAAM,IACNC,KAAM,IAENpU,SAAU,KAMX7lB,EAAOG,GAAG+5B,MAAQ,SAAUC,EAAMp2B,GAIjC,MAHAo2B,GAAOn6B,EAAOy1B,GAAKz1B,EAAOy1B,GAAGoD,OAAQsB,IAAUA,EAAOA,EACtDp2B,EAAOA,GAAQ,KAER5E,KAAKuhB,MAAO3c,EAAM,SAAUiV,EAAM6H,GACxC,GAAIuZ,GAAUpc,WAAYhF,EAAMmhB,EAChCtZ,GAAME,KAAO,WACZsZ,aAAcD,OAMjB,WAEC,GAAIprB,GAAOrC,EAAK9F,EAAQkB,EAAG6wB,CAG3BjsB,GAAM5N,EAAS6N,cAAe,OAC9BD,EAAIb,aAAc,YAAa,KAC/Ba,EAAIoC,UAAY,qEAChBhH,EAAI4E,EAAIlB,qBAAqB,KAAM,GAGnC5E,EAAS9H,EAAS6N,cAAc,UAChCgsB,EAAM/xB,EAAOyH,YAAavP,EAAS6N,cAAc,WACjDoC,EAAQrC,EAAIlB,qBAAqB,SAAU,GAE3C1D,EAAEgX,MAAMC,QAAU,UAGlBlf,EAAQw6B,gBAAoC,MAAlB3tB,EAAI0B,UAI9BvO,EAAQif,MAAQ,MAAMnT,KAAM7D,EAAE8D,aAAa,UAI3C/L,EAAQy6B,eAA4C,OAA3BxyB,EAAE8D,aAAa,QAGxC/L,EAAQ06B,UAAYxrB,EAAM/J,MAI1BnF,EAAQ26B,YAAc7B,EAAIhlB,SAG1B9T,EAAQ46B,UAAY37B,EAAS6N,cAAc,QAAQ8tB,QAInD7zB,EAAO6M,UAAW,EAClB5T,EAAQ66B,aAAe/B,EAAIllB,SAI3B1E,EAAQjQ,EAAS6N,cAAe,SAChCoC,EAAMlD,aAAc,QAAS,IAC7BhM,EAAQkP,MAA0C,KAAlCA,EAAMnD,aAAc,SAGpCmD,EAAM/J,MAAQ,IACd+J,EAAMlD,aAAc,OAAQ,SAC5BhM,EAAQ86B,WAA6B,MAAhB5rB,EAAM/J,QAI5B,IAAI41B,IAAU,KAEd76B,GAAOG,GAAGsC,QACT0N,IAAK,SAAUlL,GACd,GAAI4b,GAAOvf,EAAK4B,EACfrB,EAAO1C,KAAK,EAEb,EAAA,GAAM6C,UAAUjB,OAsBhB,MAFAmC,GAAalD,EAAOkD,WAAY+B,GAEzB9F,KAAKsC,KAAK,SAAUK,GAC1B,GAAIqO,EAEmB,KAAlBhR,KAAKmF,WAKT6L,EADIjN,EACE+B,EAAMhE,KAAM9B,KAAM2C,EAAG9B,EAAQb,MAAOgR,OAEpClL,EAIK,MAAPkL,EACJA,EAAM,GACoB,gBAARA,GAClBA,GAAO,GACInQ,EAAOoD,QAAS+M,KAC3BA,EAAMnQ,EAAO4B,IAAKuO,EAAK,SAAUlL,GAChC,MAAgB,OAATA,EAAgB,GAAKA,EAAQ,MAItC4b,EAAQ7gB,EAAO86B,SAAU37B,KAAK4E,OAAU/D,EAAO86B,SAAU37B,KAAK4F,SAASC,eAGjE6b,GAAW,OAASA,IAA8Cxd,SAApCwd,EAAMqN,IAAK/uB,KAAMgR,EAAK,WACzDhR,KAAK8F,MAAQkL,KAjDd,IAAKtO,EAGJ,MAFAgf,GAAQ7gB,EAAO86B,SAAUj5B,EAAKkC,OAAU/D,EAAO86B,SAAUj5B,EAAKkD,SAASC,eAElE6b,GAAS,OAASA,IAAgDxd,UAAtC/B,EAAMuf,EAAM3f,IAAKW,EAAM,UAChDP,GAGRA,EAAMO,EAAKoD,MAEW,gBAAR3D,GAEbA,EAAImC,QAAQo3B,GAAS,IAEd,MAAPv5B,EAAc,GAAKA,OA0CxBtB,EAAOyC,QACNq4B,UACClQ,QACC1pB,IAAK,SAAUW,GACd,GAAIsO,GAAMnQ,EAAO0O,KAAKwB,KAAMrO,EAAM,QAClC,OAAc,OAAPsO,EACNA,EAGAnQ,EAAO2E,KAAM3E,EAAOmF,KAAMtD,MAG7BgF,QACC3F,IAAK,SAAUW,GAYd,IAXA,GAAIoD,GAAO2lB,EACV9nB,EAAUjB,EAAKiB,QACf4W,EAAQ7X,EAAKgS,cACb6V,EAAoB,eAAd7nB,EAAKkC,MAAiC,EAAR2V,EACpC0D,EAASsM,EAAM,QACfjkB,EAAMikB,EAAMhQ,EAAQ,EAAI5W,EAAQ/B,OAChCe,EAAY,EAAR4X,EACHjU,EACAikB,EAAMhQ,EAAQ,EAGJjU,EAAJ3D,EAASA,IAIhB,GAHA8oB,EAAS9nB,EAAShB,MAGX8oB,EAAOhX,UAAY9R,IAAM4X,IAE5B5Z,EAAQ66B,YAAe/P,EAAOlX,SAA+C,OAApCkX,EAAO/e,aAAa,cAC5D+e,EAAOrf,WAAWmI,UAAa1T,EAAO+E,SAAU6lB,EAAOrf,WAAY,aAAiB,CAMxF,GAHAtG,EAAQjF,EAAQ4qB,GAASza,MAGpBuZ,EACJ,MAAOzkB,EAIRmY,GAAO5d,KAAMyF,GAIf,MAAOmY,IAGR8Q,IAAK,SAAUrsB,EAAMoD,GACpB,GAAI81B,GAAWnQ,EACd9nB,EAAUjB,EAAKiB,QACfsa,EAASpd,EAAOoF,UAAWH,GAC3BnD,EAAIgB,EAAQ/B,MAEb,OAAQe,IAGP,GAFA8oB,EAAS9nB,EAAShB,GAEb9B,EAAOwF,QAASxF,EAAO86B,SAASlQ,OAAO1pB,IAAK0pB,GAAUxN,IAAY,EAMtE,IACCwN,EAAOhX,SAAWmnB,GAAY,EAE7B,MAAQ5wB,GAGTygB,EAAOoQ,iBAIRpQ,GAAOhX,UAAW,CASpB,OAJMmnB,KACLl5B,EAAKgS,cAAgB,IAGf/Q,OAOX9C,EAAOyB,MAAO,QAAS,YAAc,WACpCzB,EAAO86B,SAAU37B,OAChB+uB,IAAK,SAAUrsB,EAAMoD,GACpB,MAAKjF,GAAOoD,QAAS6B,GACXpD,EAAK8R,QAAU3T,EAAOwF,QAASxF,EAAO6B,GAAMsO,MAAOlL,IAAW,EADxE,SAKInF,EAAQ06B,UACbx6B,EAAO86B,SAAU37B,MAAO+B,IAAM,SAAUW,GAGvC,MAAsC,QAA/BA,EAAKgK,aAAa,SAAoB,KAAOhK,EAAKoD,SAQ5D,IAAIg2B,IAAUC,GACbjuB,GAAajN,EAAOgQ,KAAK/C,WACzBkuB,GAAc,0BACdb,GAAkBx6B,EAAQw6B,gBAC1Bc,GAAct7B,EAAQkP,KAEvBhP,GAAOG,GAAGsC,QACTyN,KAAM,SAAUrN,EAAMoC,GACrB,MAAOyc,GAAQviB,KAAMa,EAAOkQ,KAAMrN,EAAMoC,EAAOjD,UAAUjB,OAAS,IAGnEs6B,WAAY,SAAUx4B,GACrB,MAAO1D,MAAKsC,KAAK,WAChBzB,EAAOq7B,WAAYl8B,KAAM0D,QAK5B7C,EAAOyC,QACNyN,KAAM,SAAUrO,EAAMgB,EAAMoC,GAC3B,GAAI4b,GAAOvf,EACVg6B,EAAQz5B,EAAKyC,QAGd,IAAMzC,GAAkB,IAAVy5B,GAAyB,IAAVA,GAAyB,IAAVA,EAK5C,aAAYz5B,GAAKgK,eAAiB+S,EAC1B5e,EAAOumB,KAAM1kB,EAAMgB,EAAMoC,IAKlB,IAAVq2B,GAAgBt7B,EAAOgY,SAAUnW,KACrCgB,EAAOA,EAAKmC,cACZ6b,EAAQ7gB,EAAOu7B,UAAW14B,KACvB7C,EAAOgQ,KAAKnF,MAAMpB,KAAKmC,KAAM/I,GAASq4B,GAAWD,KAGtC53B,SAAV4B,EAaO4b,GAAS,OAASA,IAA6C,QAAnCvf,EAAMuf,EAAM3f,IAAKW,EAAMgB,IACvDvB,GAGPA,EAAMtB,EAAO0O,KAAKwB,KAAMrO,EAAMgB,GAGhB,MAAPvB,EACN+B,OACA/B,GApBc,OAAV2D,EAGO4b,GAAS,OAASA,IAAoDxd,UAA1C/B,EAAMuf,EAAMqN,IAAKrsB,EAAMoD,EAAOpC,IAC9DvB,GAGPO,EAAKiK,aAAcjJ,EAAMoC,EAAQ,IAC1BA,OAPPjF,GAAOq7B,WAAYx5B,EAAMgB,KAuB5Bw4B,WAAY,SAAUx5B,EAAMoD,GAC3B,GAAIpC,GAAM24B,EACT15B,EAAI,EACJ25B,EAAYx2B,GAASA,EAAM4F,MAAO0P,EAEnC,IAAKkhB,GAA+B,IAAlB55B,EAAKyC,SACtB,MAASzB,EAAO44B,EAAU35B,KACzB05B,EAAWx7B,EAAO07B,QAAS74B,IAAUA,EAGhC7C,EAAOgQ,KAAKnF,MAAMpB,KAAKmC,KAAM/I,GAE5Bu4B,IAAed,KAAoBa,GAAYvvB,KAAM/I,GACzDhB,EAAM25B,IAAa,EAInB35B,EAAM7B,EAAO6E,UAAW,WAAahC,IACpChB,EAAM25B,IAAa,EAKrBx7B,EAAOkQ,KAAMrO,EAAMgB,EAAM,IAG1BhB,EAAKuK,gBAAiBkuB,GAAkBz3B,EAAO24B,IAKlDD,WACCx3B,MACCmqB,IAAK,SAAUrsB,EAAMoD,GACpB,IAAMnF,EAAQ86B,YAAwB,UAAV31B,GAAqBjF,EAAO+E,SAASlD,EAAM,SAAW,CAGjF,GAAIsO,GAAMtO,EAAKoD,KAKf,OAJApD,GAAKiK,aAAc,OAAQ7G,GACtBkL,IACJtO,EAAKoD,MAAQkL,GAEPlL,QAQZi2B,IACChN,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAa3B,MAZKoC,MAAU,EAEdjF,EAAOq7B,WAAYx5B,EAAMgB,GACdu4B,IAAed,KAAoBa,GAAYvvB,KAAM/I,GAEhEhB,EAAKiK,cAAewuB,IAAmBt6B,EAAO07B,QAAS74B,IAAUA,EAAMA,GAIvEhB,EAAM7B,EAAO6E,UAAW,WAAahC,IAAWhB,EAAMgB,IAAS,EAGzDA,IAKT7C,EAAOyB,KAAMzB,EAAOgQ,KAAKnF,MAAMpB,KAAK4X,OAAOxW,MAAO,QAAU,SAAU/I,EAAGe,GAExE,GAAI84B,GAAS1uB,GAAYpK,IAAU7C,EAAO0O,KAAKwB,IAE/CjD,IAAYpK,GAASu4B,IAAed,KAAoBa,GAAYvvB,KAAM/I,GACzE,SAAUhB,EAAMgB,EAAM6D,GACrB,GAAIpF,GAAK8iB,CAUT,OATM1d,KAEL0d,EAASnX,GAAYpK,GACrBoK,GAAYpK,GAASvB,EACrBA,EAAqC,MAA/Bq6B,EAAQ95B,EAAMgB,EAAM6D,GACzB7D,EAAKmC,cACL,KACDiI,GAAYpK,GAASuhB,GAEf9iB,GAER,SAAUO,EAAMgB,EAAM6D,GACrB,MAAMA,GAAN,OACQ7E,EAAM7B,EAAO6E,UAAW,WAAahC,IAC3CA,EAAKmC,cACL,QAMCo2B,IAAgBd,KACrBt6B,EAAOu7B,UAAUt2B,OAChBipB,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAC3B,MAAK7C,GAAO+E,SAAUlD,EAAM,cAE3BA,EAAKiW,aAAe7S,GAGbg2B,IAAYA,GAAS/M,IAAKrsB,EAAMoD,EAAOpC,MAO5Cy3B,KAILW,IACC/M,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAE3B,GAAIvB,GAAMO,EAAKgN,iBAAkBhM,EAUjC,OATMvB,IACLO,EAAK+5B,iBACHt6B,EAAMO,EAAKuJ,cAAcywB,gBAAiBh5B,IAI7CvB,EAAI2D,MAAQA,GAAS,GAGP,UAATpC,GAAoBoC,IAAUpD,EAAKgK,aAAchJ,GAC9CoC,EADR,SAOFgI,GAAWzB,GAAKyB,GAAWpK,KAAOoK,GAAW6uB,OAC5C,SAAUj6B,EAAMgB,EAAM6D,GACrB,GAAIpF,EACJ,OAAMoF,GAAN,QACSpF,EAAMO,EAAKgN,iBAAkBhM,KAAyB,KAAdvB,EAAI2D,MACnD3D,EAAI2D,MACJ,MAKJjF,EAAO86B,SAAS9mB,QACf9S,IAAK,SAAUW,EAAMgB,GACpB,GAAIvB,GAAMO,EAAKgN,iBAAkBhM,EACjC,OAAKvB,IAAOA,EAAI8O,UACR9O,EAAI2D,MADZ,QAIDipB,IAAK+M,GAAS/M,KAKfluB,EAAOu7B,UAAUQ,iBAChB7N,IAAK,SAAUrsB,EAAMoD,EAAOpC,GAC3Bo4B,GAAS/M,IAAKrsB,EAAgB,KAAVoD,GAAe,EAAQA,EAAOpC,KAMpD7C,EAAOyB,MAAO,QAAS,UAAY,SAAUK,EAAGe,GAC/C7C,EAAOu7B,UAAW14B,IACjBqrB,IAAK,SAAUrsB,EAAMoD,GACpB,MAAe,KAAVA,GACJpD,EAAKiK,aAAcjJ,EAAM,QAClBoC,GAFR,YASEnF,EAAQif,QACb/e,EAAOu7B,UAAUxc,OAChB7d,IAAK,SAAUW,GAId,MAAOA,GAAKkd,MAAMC,SAAW3b,QAE9B6qB,IAAK,SAAUrsB,EAAMoD,GACpB,MAASpD,GAAKkd,MAAMC,QAAU/Z,EAAQ,KAQzC,IAAI+2B,IAAa,6CAChBC,GAAa,eAEdj8B,GAAOG,GAAGsC,QACT8jB,KAAM,SAAU1jB,EAAMoC,GACrB,MAAOyc,GAAQviB,KAAMa,EAAOumB,KAAM1jB,EAAMoC,EAAOjD,UAAUjB,OAAS,IAGnEm7B,WAAY,SAAUr5B,GAErB,MADAA,GAAO7C,EAAO07B,QAAS74B,IAAUA,EAC1B1D,KAAKsC,KAAK,WAEhB,IACCtC,KAAM0D,GAASQ,aACRlE,MAAM0D,GACZ,MAAO0B,UAKZvE,EAAOyC,QACNi5B,SACCS,MAAO,UACPC,QAAS,aAGV7V,KAAM,SAAU1kB,EAAMgB,EAAMoC,GAC3B,GAAI3D,GAAKuf,EAAOwb,EACff,EAAQz5B,EAAKyC,QAGd,IAAMzC,GAAkB,IAAVy5B,GAAyB,IAAVA,GAAyB,IAAVA,EAY5C,MARAe,GAAmB,IAAVf,IAAgBt7B,EAAOgY,SAAUnW,GAErCw6B,IAEJx5B,EAAO7C,EAAO07B,QAAS74B,IAAUA,EACjCge,EAAQ7gB,EAAOk1B,UAAWryB,IAGZQ,SAAV4B,EACG4b,GAAS,OAASA,IAAoDxd,UAA1C/B,EAAMuf,EAAMqN,IAAKrsB,EAAMoD,EAAOpC,IAChEvB,EACEO,EAAMgB,GAASoC,EAGX4b,GAAS,OAASA,IAA6C,QAAnCvf,EAAMuf,EAAM3f,IAAKW,EAAMgB,IACzDvB,EACAO,EAAMgB,IAITqyB,WACC1hB,UACCtS,IAAK,SAAUW,GAId,GAAIy6B,GAAWt8B,EAAO0O,KAAKwB,KAAMrO,EAAM,WAEvC,OAAOy6B,GACNC,SAAUD,EAAU,IACpBN,GAAWpwB,KAAM/J,EAAKkD,WAAck3B,GAAWrwB,KAAM/J,EAAKkD,WAAclD,EAAK0R,KAC5E,EACA,QAQAzT,EAAQy6B,gBAEbv6B,EAAOyB,MAAO,OAAQ,OAAS,SAAUK,EAAGe,GAC3C7C,EAAOk1B,UAAWryB,IACjB3B,IAAK,SAAUW,GACd,MAAOA,GAAKgK,aAAchJ,EAAM,OAS9B/C,EAAQ26B,cACbz6B,EAAOk1B,UAAUthB,UAChB1S,IAAK,SAAUW,GACd,GAAIkM,GAASlM,EAAK0J,UAUlB,OARKwC,KACJA,EAAO8F,cAGF9F,EAAOxC,YACXwC,EAAOxC,WAAWsI,eAGb,QAKV7T,EAAOyB,MACN,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFzB,EAAO07B,QAASv8B,KAAK6F,eAAkB7F,OAIlCW,EAAQ46B,UACb16B,EAAO07B,QAAQhB,QAAU,WAM1B,IAAI8B,IAAS,aAEbx8B,GAAOG,GAAGsC,QACTg6B,SAAU,SAAUx3B,GACnB,GAAIy3B,GAAS76B,EAAMsL,EAAKwvB,EAAOt6B,EAAGu6B,EACjC96B,EAAI,EACJM,EAAMjD,KAAK4B,OACX87B,EAA2B,gBAAV53B,IAAsBA,CAExC,IAAKjF,EAAOkD,WAAY+B,GACvB,MAAO9F,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAOs9B,SAAUx3B,EAAMhE,KAAM9B,KAAMkD,EAAGlD,KAAKkP,aAIrD,IAAKwuB,EAIJ,IAFAH,GAAYz3B,GAAS,IAAK4F,MAAO0P,OAErBnY,EAAJN,EAASA,IAOhB,GANAD,EAAO1C,KAAM2C,GACbqL,EAAwB,IAAlBtL,EAAKyC,WAAoBzC,EAAKwM,WACjC,IAAMxM,EAAKwM,UAAY,KAAM5K,QAAS+4B,GAAQ,KAChD,KAGU,CACVn6B,EAAI,CACJ,OAASs6B,EAAQD,EAAQr6B,KACnB8K,EAAI1N,QAAS,IAAMk9B,EAAQ,KAAQ,IACvCxvB,GAAOwvB,EAAQ,IAKjBC,GAAa58B,EAAO2E,KAAMwI,GACrBtL,EAAKwM,YAAcuuB,IACvB/6B,EAAKwM,UAAYuuB,GAMrB,MAAOz9B,OAGR29B,YAAa,SAAU73B,GACtB,GAAIy3B,GAAS76B,EAAMsL,EAAKwvB,EAAOt6B,EAAGu6B,EACjC96B,EAAI,EACJM,EAAMjD,KAAK4B,OACX87B,EAA+B,IAArB76B,UAAUjB,QAAiC,gBAAVkE,IAAsBA,CAElE,IAAKjF,EAAOkD,WAAY+B,GACvB,MAAO9F,MAAKsC,KAAK,SAAUY,GAC1BrC,EAAQb,MAAO29B,YAAa73B,EAAMhE,KAAM9B,KAAMkD,EAAGlD,KAAKkP,aAGxD,IAAKwuB,EAGJ,IAFAH,GAAYz3B,GAAS,IAAK4F,MAAO0P,OAErBnY,EAAJN,EAASA,IAQhB,GAPAD,EAAO1C,KAAM2C,GAEbqL,EAAwB,IAAlBtL,EAAKyC,WAAoBzC,EAAKwM,WACjC,IAAMxM,EAAKwM,UAAY,KAAM5K,QAAS+4B,GAAQ,KAChD,IAGU,CACVn6B,EAAI,CACJ,OAASs6B,EAAQD,EAAQr6B,KAExB,MAAQ8K,EAAI1N,QAAS,IAAMk9B,EAAQ,MAAS,EAC3CxvB,EAAMA,EAAI1J,QAAS,IAAMk5B,EAAQ,IAAK,IAKxCC,GAAa33B,EAAQjF,EAAO2E,KAAMwI,GAAQ,GACrCtL,EAAKwM,YAAcuuB,IACvB/6B,EAAKwM,UAAYuuB,GAMrB,MAAOz9B,OAGR49B,YAAa,SAAU93B,EAAO+3B,GAC7B,GAAIj5B,SAAckB,EAElB,OAAyB,iBAAb+3B,IAAmC,WAATj5B,EAC9Bi5B,EAAW79B,KAAKs9B,SAAUx3B,GAAU9F,KAAK29B,YAAa73B,GAItD9F,KAAKsC,KADRzB,EAAOkD,WAAY+B,GACN,SAAUnD,GAC1B9B,EAAQb,MAAO49B,YAAa93B,EAAMhE,KAAK9B,KAAM2C,EAAG3C,KAAKkP,UAAW2uB,GAAWA,IAI5D,WAChB,GAAc,WAATj5B,EAAoB,CAExB,GAAIsK,GACHvM,EAAI,EACJwW,EAAOtY,EAAQb,MACf89B,EAAah4B,EAAM4F,MAAO0P,MAE3B,OAASlM,EAAY4uB,EAAYn7B,KAE3BwW,EAAK4kB,SAAU7uB,GACnBiK,EAAKwkB,YAAazuB,GAElBiK,EAAKmkB,SAAUpuB,QAKNtK,IAAS6a,GAAyB,YAAT7a,KAC/B5E,KAAKkP,WAETrO,EAAOwgB,MAAOrhB,KAAM,gBAAiBA,KAAKkP,WAO3ClP,KAAKkP,UAAYlP,KAAKkP,WAAapJ,KAAU,EAAQ,GAAKjF,EAAOwgB,MAAOrhB,KAAM,kBAAqB,OAKtG+9B,SAAU,SAAUj9B,GAInB,IAHA,GAAIoO,GAAY,IAAMpO,EAAW,IAChC6B,EAAI,EACJ0X,EAAIra,KAAK4B,OACEyY,EAAJ1X,EAAOA,IACd,GAA0B,IAArB3C,KAAK2C,GAAGwC,WAAmB,IAAMnF,KAAK2C,GAAGuM,UAAY,KAAK5K,QAAQ+4B,GAAQ,KAAK/8B,QAAS4O,IAAe,EAC3G,OAAO,CAIT,QAAO,KAUTrO,EAAOyB,KAAM,0MAEqD6E,MAAM,KAAM,SAAUxE,EAAGe,GAG1F7C,EAAOG,GAAI0C,GAAS,SAAU6B,EAAMvE,GACnC,MAAO6B,WAAUjB,OAAS,EACzB5B,KAAKsqB,GAAI5mB,EAAM,KAAM6B,EAAMvE,GAC3BhB,KAAK6lB,QAASniB,MAIjB7C,EAAOG,GAAGsC,QACT06B,MAAO,SAAUC,EAAQC,GACxB,MAAOl+B,MAAKwpB,WAAYyU,GAASxU,WAAYyU,GAASD,IAGvDE,KAAM,SAAU7Z,EAAO/e,EAAMvE,GAC5B,MAAOhB,MAAKsqB,GAAIhG,EAAO,KAAM/e,EAAMvE,IAEpCo9B,OAAQ,SAAU9Z,EAAOtjB,GACxB,MAAOhB,MAAK+e,IAAKuF,EAAO,KAAMtjB,IAG/Bq9B,SAAU,SAAUv9B,EAAUwjB,EAAO/e,EAAMvE,GAC1C,MAAOhB,MAAKsqB,GAAIhG,EAAOxjB,EAAUyE,EAAMvE,IAExCs9B,WAAY,SAAUx9B,EAAUwjB,EAAOtjB,GAEtC,MAA4B,KAArB6B,UAAUjB,OAAe5B,KAAK+e,IAAKje,EAAU,MAASd,KAAK+e,IAAKuF,EAAOxjB,GAAY,KAAME,KAKlG,IAAIu9B,IAAQ19B,EAAOoG,MAEfu3B,GAAS,KAITC,GAAe,kIAEnB59B,GAAOyf,UAAY,SAAU/a,GAE5B,GAAKxF,EAAO2+B,MAAQ3+B,EAAO2+B,KAAKC,MAG/B,MAAO5+B,GAAO2+B,KAAKC,MAAOp5B,EAAO,GAGlC,IAAIq5B,GACHC,EAAQ,KACRC,EAAMj+B,EAAO2E,KAAMD,EAAO,GAI3B,OAAOu5B,KAAQj+B,EAAO2E,KAAMs5B,EAAIx6B,QAASm6B,GAAc,SAAUjmB,EAAOumB,EAAOC,EAAMlP,GAQpF,MALK8O,IAAmBG,IACvBF,EAAQ,GAIM,IAAVA,EACGrmB,GAIRomB,EAAkBI,GAAQD,EAM1BF,IAAU/O,GAASkP,EAGZ,OAELC,SAAU,UAAYH,KACxBj+B,EAAO2D,MAAO,iBAAmBe,IAKnC1E,EAAOq+B,SAAW,SAAU35B,GAC3B,GAAIsN,GAAK7L,CACT,KAAMzB,GAAwB,gBAATA,GACpB,MAAO,KAER,KACMxF,EAAOo/B,WACXn4B,EAAM,GAAIm4B,WACVtsB,EAAM7L,EAAIo4B,gBAAiB75B,EAAM,cAEjCsN,EAAM,GAAIwsB,eAAe,oBACzBxsB,EAAIysB,MAAQ,QACZzsB,EAAI0sB,QAASh6B,IAEb,MAAOH,GACRyN,EAAM3O,OAKP,MAHM2O,IAAQA,EAAIpE,kBAAmBoE,EAAIvG,qBAAsB,eAAgB1K,QAC9Ef,EAAO2D,MAAO,gBAAkBe,GAE1BsN,EAIR,IAEC2sB,IACAC,GAEAC,GAAQ,OACRC,GAAM,gBACNC,GAAW,gCAEXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QACZC,GAAO,4DAWPC,MAOAC,MAGAC,GAAW,KAAK//B,OAAO,IAIxB,KACCq/B,GAAe1rB,SAASK,KACvB,MAAOhP,IAGRq6B,GAAe7/B,EAAS6N,cAAe,KACvCgyB,GAAarrB,KAAO,GACpBqrB,GAAeA,GAAarrB,KAI7BorB,GAAeQ,GAAK9zB,KAAMuzB,GAAa55B,kBAGvC,SAASu6B,IAA6BC,GAGrC,MAAO,UAAUC,EAAoB5jB,GAED,gBAAvB4jB,KACX5jB,EAAO4jB,EACPA,EAAqB,IAGtB,IAAIC,GACH59B,EAAI,EACJ69B,EAAYF,EAAmBz6B,cAAc6F,MAAO0P,MAErD,IAAKva,EAAOkD,WAAY2Y,GAEvB,MAAS6jB,EAAWC,EAAU79B,KAEC,MAAzB49B,EAASjnB,OAAQ,IACrBinB,EAAWA,EAASpgC,MAAO,IAAO,KACjCkgC,EAAWE,GAAaF,EAAWE,QAAkB3vB,QAAS8L,KAI9D2jB,EAAWE,GAAaF,EAAWE,QAAkBlgC,KAAMqc,IAQjE,QAAS+jB,IAA+BJ,EAAW18B,EAASs1B,EAAiByH,GAE5E,GAAIC,MACHC,EAAqBP,IAAcH,EAEpC,SAASW,GAASN,GACjB,GAAI9rB,EAYJ,OAXAksB,GAAWJ,IAAa,EACxB1/B,EAAOyB,KAAM+9B,EAAWE,OAAkB,SAAUv1B,EAAG81B,GACtD,GAAIC,GAAsBD,EAAoBn9B,EAASs1B,EAAiByH,EACxE,OAAoC,gBAAxBK,IAAqCH,GAAqBD,EAAWI,GAIrEH,IACDnsB,EAAWssB,GADf,QAHNp9B,EAAQ68B,UAAU5vB,QAASmwB,GAC3BF,EAASE,IACF,KAKFtsB,EAGR,MAAOosB,GAASl9B,EAAQ68B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,QAASG,IAAYn9B,EAAQN,GAC5B,GAAIO,GAAMoB,EACT+7B,EAAcpgC,EAAOqgC,aAAaD,eAEnC,KAAM/7B,IAAO3B,GACQW,SAAfX,EAAK2B,MACP+7B,EAAa/7B,GAAQrB,EAAWC,IAASA,OAAgBoB,GAAQ3B,EAAK2B,GAO1E,OAJKpB,IACJjD,EAAOyC,QAAQ,EAAMO,EAAQC,GAGvBD,EAOR,QAASs9B,IAAqBC,EAAGV,EAAOW,GACvC,GAAIC,GAAeC,EAAIC,EAAe58B,EACrCgV,EAAWwnB,EAAExnB,SACb4mB,EAAYY,EAAEZ,SAGf,OAA2B,MAAnBA,EAAW,GAClBA,EAAUnzB,QACEnJ,SAAPq9B,IACJA,EAAKH,EAAEK,UAAYf,EAAMgB,kBAAkB,gBAK7C,IAAKH,EACJ,IAAM38B,IAAQgV,GACb,GAAKA,EAAUhV,IAAUgV,EAAUhV,GAAO6H,KAAM80B,GAAO,CACtDf,EAAU5vB,QAAShM,EACnB,OAMH,GAAK47B,EAAW,IAAOa,GACtBG,EAAgBhB,EAAW,OACrB,CAEN,IAAM57B,IAAQy8B,GAAY,CACzB,IAAMb,EAAW,IAAOY,EAAEO,WAAY/8B,EAAO,IAAM47B,EAAU,IAAO,CACnEgB,EAAgB58B,CAChB,OAEK08B,IACLA,EAAgB18B,GAIlB48B,EAAgBA,GAAiBF,EAMlC,MAAKE,IACCA,IAAkBhB,EAAW,IACjCA,EAAU5vB,QAAS4wB,GAEbH,EAAWG,IAJnB,OAWD,QAASI,IAAaR,EAAGS,EAAUnB,EAAOoB,GACzC,GAAIC,GAAOC,EAASC,EAAMj7B,EAAK8S,EAC9B6nB,KAEAnB,EAAYY,EAAEZ,UAAUrgC,OAGzB,IAAKqgC,EAAW,GACf,IAAMyB,IAAQb,GAAEO,WACfA,EAAYM,EAAKp8B,eAAkBu7B,EAAEO,WAAYM,EAInDD,GAAUxB,EAAUnzB,OAGpB,OAAQ20B,EAcP,GAZKZ,EAAEc,eAAgBF,KACtBtB,EAAOU,EAAEc,eAAgBF,IAAcH,IAIlC/nB,GAAQgoB,GAAaV,EAAEe,aAC5BN,EAAWT,EAAEe,WAAYN,EAAUT,EAAEb,WAGtCzmB,EAAOkoB,EACPA,EAAUxB,EAAUnzB,QAKnB,GAAiB,MAAZ20B,EAEJA,EAAUloB,MAGJ,IAAc,MAATA,GAAgBA,IAASkoB,EAAU,CAM9C,GAHAC,EAAON,EAAY7nB,EAAO,IAAMkoB,IAAaL,EAAY,KAAOK,IAG1DC,EACL,IAAMF,IAASJ,GAId,GADA36B,EAAM+6B,EAAM56B,MAAO,KACdH,EAAK,KAAQg7B,IAGjBC,EAAON,EAAY7nB,EAAO,IAAM9S,EAAK,KACpC26B,EAAY,KAAO36B,EAAK,KACb,CAENi7B,KAAS,EACbA,EAAON,EAAYI,GAGRJ,EAAYI,MAAY,IACnCC,EAAUh7B,EAAK,GACfw5B,EAAU5vB,QAAS5J,EAAK,IAEzB,OAOJ,GAAKi7B,KAAS,EAGb,GAAKA,GAAQb,EAAG,UACfS,EAAWI,EAAMJ,OAEjB,KACCA,EAAWI,EAAMJ,GAChB,MAAQz8B,GACT,OAASwX,MAAO,cAAepY,MAAOy9B,EAAO78B,EAAI,sBAAwB0U,EAAO,OAASkoB,IAQ/F,OAASplB,MAAO,UAAWrX,KAAMs8B,GAGlChhC,EAAOyC,QAGN8+B,OAAQ,EAGRC,gBACAC,QAEApB,cACCqB,IAAK9C,GACL76B,KAAM,MACN49B,QAAS3C,GAAepzB,KAAM+yB,GAAc,IAC5ChgC,QAAQ,EACRijC,aAAa,EACbnD,OAAO,EACPoD,YAAa,mDAabC,SACCvL,IAAK+I,GACLn6B,KAAM,aACN2oB,KAAM,YACN9b,IAAK,4BACL+vB,KAAM,qCAGPhpB,UACC/G,IAAK,MACL8b,KAAM,OACNiU,KAAM,QAGPV,gBACCrvB,IAAK,cACL7M,KAAM,eACN48B,KAAM,gBAKPjB,YAGCkB,SAAUz3B,OAGV03B,aAAa,EAGbC,YAAaliC,EAAOyf,UAGpB0iB,WAAYniC,EAAOq+B,UAOpB+B,aACCsB,KAAK,EACLxhC,SAAS,IAOXkiC,UAAW,SAAUp/B,EAAQq/B,GAC5B,MAAOA,GAGNlC,GAAYA,GAAYn9B,EAAQhD,EAAOqgC,cAAgBgC,GAGvDlC,GAAYngC,EAAOqgC,aAAcr9B,IAGnCs/B,cAAe/C,GAA6BH,IAC5CmD,cAAehD,GAA6BF,IAG5CmD,KAAM,SAAUd,EAAK5+B,GAGA,gBAAR4+B,KACX5+B,EAAU4+B,EACVA,EAAMr+B,QAIPP,EAAUA,KAEV,IACC8xB,GAEA9yB,EAEA2gC,EAEAC,EAEAC,EAGAC,EAEAC,EAEAC,EAEAvC,EAAIvgC,EAAOoiC,aAAet/B,GAE1BigC,EAAkBxC,EAAErgC,SAAWqgC,EAE/ByC,EAAqBzC,EAAErgC,UAAa6iC,EAAgBz+B,UAAYy+B,EAAgBliC,QAC/Eb,EAAQ+iC,GACR/iC,EAAOue,MAERrC,EAAWlc,EAAO4b,WAClBqnB,EAAmBjjC,EAAO4a,UAAU,eAEpCsoB,EAAa3C,EAAE2C,eAEfC,KACAC,KAEArnB,EAAQ,EAERsnB,EAAW,WAEXxD,GACCrhB,WAAY,EAGZqiB,kBAAmB,SAAUx8B,GAC5B,GAAIwG,EACJ,IAAe,IAAVkR,EAAc,CAClB,IAAM+mB,EAAkB,CACvBA,IACA,OAASj4B,EAAQk0B,GAAS1zB,KAAMq3B,GAC/BI,EAAiBj4B,EAAM,GAAG7F,eAAkB6F,EAAO,GAGrDA,EAAQi4B,EAAiBz+B,EAAIW,eAE9B,MAAgB,OAAT6F,EAAgB,KAAOA,GAI/By4B,sBAAuB,WACtB,MAAiB,KAAVvnB,EAAc2mB,EAAwB,MAI9Ca,iBAAkB,SAAU1gC,EAAMoC,GACjC,GAAIu+B,GAAQ3gC,EAAKmC,aAKjB,OAJM+W,KACLlZ,EAAOugC,EAAqBI,GAAUJ,EAAqBI,IAAW3gC,EACtEsgC,EAAgBtgC,GAASoC,GAEnB9F,MAIRskC,iBAAkB,SAAU1/B,GAI3B,MAHMgY,KACLwkB,EAAEK,SAAW78B,GAEP5E,MAIR+jC,WAAY,SAAUthC,GACrB,GAAI8hC,EACJ,IAAK9hC,EACJ,GAAa,EAARma,EACJ,IAAM2nB,IAAQ9hC,GAEbshC,EAAYQ,IAAWR,EAAYQ,GAAQ9hC,EAAK8hC,QAIjD7D,GAAM5jB,OAAQra,EAAKi+B,EAAM8D,QAG3B,OAAOxkC,OAIRykC,MAAO,SAAUC,GAChB,GAAIC,GAAYD,GAAcR,CAK9B,OAJKR,IACJA,EAAUe,MAAOE,GAElBr8B,EAAM,EAAGq8B,GACF3kC,MAwCV,IAnCA+c,EAASF,QAAS6jB,GAAQrH,SAAWyK,EAAiBrpB,IACtDimB,EAAMkE,QAAUlE,EAAMp4B,KACtBo4B,EAAMl8B,MAAQk8B,EAAM1jB,KAMpBokB,EAAEmB,MAAUA,GAAOnB,EAAEmB,KAAO9C,IAAiB,IAAKn7B,QAASo7B,GAAO,IAAKp7B,QAASy7B,GAAWP,GAAc,GAAM,MAG/G4B,EAAEx8B,KAAOjB,EAAQkhC,QAAUlhC,EAAQiB,MAAQw8B,EAAEyD,QAAUzD,EAAEx8B,KAGzDw8B,EAAEZ,UAAY3/B,EAAO2E,KAAM47B,EAAEb,UAAY,KAAM16B,cAAc6F,MAAO0P,KAAiB,IAG/D,MAAjBgmB,EAAE0D,cACNrP,EAAQuK,GAAK9zB,KAAMk1B,EAAEmB,IAAI18B,eACzBu7B,EAAE0D,eAAkBrP,GACjBA,EAAO,KAAQ+J,GAAc,IAAO/J,EAAO,KAAQ+J,GAAc,KAChE/J,EAAO,KAAwB,UAAfA,EAAO,GAAkB,KAAO,WAC/C+J,GAAc,KAA+B,UAAtBA,GAAc,GAAkB,KAAO,UAK/D4B,EAAE77B,MAAQ67B,EAAEqB,aAAiC,gBAAXrB,GAAE77B,OACxC67B,EAAE77B,KAAO1E,EAAO+qB,MAAOwV,EAAE77B,KAAM67B,EAAE2D,cAIlCtE,GAA+BR,GAAYmB,EAAGz9B,EAAS+8B,GAGxC,IAAV9jB,EACJ,MAAO8jB,EAKR+C,GAAc5iC,EAAOue,OAASgiB,EAAE5hC,OAG3BikC,GAAmC,IAApB5iC,EAAOuhC,UAC1BvhC,EAAOue,MAAMyG,QAAQ,aAItBub,EAAEx8B,KAAOw8B,EAAEx8B,KAAKpD,cAGhB4/B,EAAE4D,YAAclF,GAAWrzB,KAAM20B,EAAEx8B,MAInC0+B,EAAWlC,EAAEmB,IAGPnB,EAAE4D,aAGF5D,EAAE77B,OACN+9B,EAAalC,EAAEmB,MAAS/D,GAAO/xB,KAAM62B,GAAa,IAAM,KAAQlC,EAAE77B,WAE3D67B,GAAE77B,MAIL67B,EAAEj0B,SAAU,IAChBi0B,EAAEmB,IAAM5C,GAAIlzB,KAAM62B,GAGjBA,EAASh/B,QAASq7B,GAAK,OAASpB,MAGhC+E,GAAa9E,GAAO/xB,KAAM62B,GAAa,IAAM,KAAQ,KAAO/E,OAK1D6C,EAAE6D,aACDpkC,EAAOwhC,aAAciB,IACzB5C,EAAM0D,iBAAkB,oBAAqBvjC,EAAOwhC,aAAciB,IAE9DziC,EAAOyhC,KAAMgB,IACjB5C,EAAM0D,iBAAkB,gBAAiBvjC,EAAOyhC,KAAMgB,MAKnDlC,EAAE77B,MAAQ67B,EAAE4D,YAAc5D,EAAEsB,eAAgB,GAAS/+B,EAAQ++B,cACjEhC,EAAM0D,iBAAkB,eAAgBhD,EAAEsB,aAI3ChC,EAAM0D,iBACL,SACAhD,EAAEZ,UAAW,IAAOY,EAAEuB,QAASvB,EAAEZ,UAAU,IAC1CY,EAAEuB,QAASvB,EAAEZ,UAAU,KAA8B,MAArBY,EAAEZ,UAAW,GAAc,KAAOL,GAAW,WAAa,IAC1FiB,EAAEuB,QAAS,KAIb,KAAMhgC,IAAKy+B,GAAE8D,QACZxE,EAAM0D,iBAAkBzhC,EAAGy+B,EAAE8D,QAASviC,GAIvC,IAAKy+B,EAAE+D,aAAgB/D,EAAE+D,WAAWrjC,KAAM8hC,EAAiBlD,EAAOU,MAAQ,GAAmB,IAAVxkB,GAElF,MAAO8jB,GAAM+D,OAIdP,GAAW,OAGX,KAAMvhC,KAAOiiC,QAAS,EAAGpgC,MAAO,EAAG60B,SAAU,GAC5CqH,EAAO/9B,GAAKy+B,EAAGz+B,GAOhB,IAHA+gC,EAAYjD,GAA+BP,GAAYkB,EAAGz9B,EAAS+8B,GAK5D,CACNA,EAAMrhB,WAAa,EAGdokB,GACJI,EAAmBhe,QAAS,YAAc6a,EAAOU,IAG7CA,EAAE9B,OAAS8B,EAAEnG,QAAU,IAC3BuI,EAAe3kB,WAAW,WACzB6hB,EAAM+D,MAAM,YACVrD,EAAEnG,SAGN,KACCre,EAAQ,EACR8mB,EAAU0B,KAAMpB,EAAgB17B,GAC/B,MAAQlD,GAET,KAAa,EAARwX,GAIJ,KAAMxX,EAHNkD,GAAM,GAAIlD,QArBZkD,GAAM,GAAI,eA8BX,SAASA,GAAMk8B,EAAQa,EAAkBhE,EAAW6D,GACnD,GAAIpD,GAAW8C,EAASpgC,EAAOq9B,EAAUyD,EACxCZ,EAAaW,CAGC,KAAVzoB,IAKLA,EAAQ,EAGH4mB,GACJtI,aAAcsI,GAKfE,EAAYx/B,OAGZq/B,EAAwB2B,GAAW,GAGnCxE,EAAMrhB,WAAamlB,EAAS,EAAI,EAAI,EAGpC1C,EAAY0C,GAAU,KAAgB,IAATA,GAA2B,MAAXA,EAGxCnD,IACJQ,EAAWV,GAAqBC,EAAGV,EAAOW,IAI3CQ,EAAWD,GAAaR,EAAGS,EAAUnB,EAAOoB,GAGvCA,GAGCV,EAAE6D,aACNK,EAAW5E,EAAMgB,kBAAkB,iBAC9B4D,IACJzkC,EAAOwhC,aAAciB,GAAagC,GAEnCA,EAAW5E,EAAMgB,kBAAkB,QAC9B4D,IACJzkC,EAAOyhC,KAAMgB,GAAagC,IAKZ,MAAXd,GAA6B,SAAXpD,EAAEx8B,KACxB8/B,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAa7C,EAASjlB,MACtBgoB,EAAU/C,EAASt8B,KACnBf,EAAQq9B,EAASr9B,MACjBs9B,GAAat9B,KAKdA,EAAQkgC,GACHF,IAAWE,KACfA,EAAa,QACC,EAATF,IACJA,EAAS,KAMZ9D,EAAM8D,OAASA,EACf9D,EAAMgE,YAAeW,GAAoBX,GAAe,GAGnD5C,EACJ/kB,EAASqB,YAAawlB,GAAmBgB,EAASF,EAAYhE,IAE9D3jB,EAASoc,WAAYyK,GAAmBlD,EAAOgE,EAAYlgC,IAI5Dk8B,EAAMqD,WAAYA,GAClBA,EAAa7/B,OAERu/B,GACJI,EAAmBhe,QAASic,EAAY,cAAgB,aACrDpB,EAAOU,EAAGU,EAAY8C,EAAUpgC,IAIpCs/B,EAAiBtnB,SAAUonB,GAAmBlD,EAAOgE,IAEhDjB,IACJI,EAAmBhe,QAAS,gBAAkB6a,EAAOU,MAE3CvgC,EAAOuhC,QAChBvhC,EAAOue,MAAMyG,QAAQ,cAKxB,MAAO6a,IAGR6E,QAAS,SAAUhD,EAAKh9B,EAAMhD,GAC7B,MAAO1B,GAAOkB,IAAKwgC,EAAKh9B,EAAMhD,EAAU,SAGzCijC,UAAW,SAAUjD,EAAKhgC,GACzB,MAAO1B,GAAOkB,IAAKwgC,EAAKr+B,OAAW3B,EAAU,aAI/C1B,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGkiC,GAC5ChkC,EAAQgkC,GAAW,SAAUtC,EAAKh9B,EAAMhD,EAAUqC,GAQjD,MANK/D,GAAOkD,WAAYwB,KACvBX,EAAOA,GAAQrC,EACfA,EAAWgD,EACXA,EAAOrB,QAGDrD,EAAOwiC,MACbd,IAAKA,EACL39B,KAAMigC,EACNtE,SAAU37B,EACVW,KAAMA,EACNq/B,QAASriC,OAMZ1B,EAAOouB,SAAW,SAAUsT,GAC3B,MAAO1hC,GAAOwiC,MACbd,IAAKA,EACL39B,KAAM,MACN27B,SAAU,SACVjB,OAAO,EACP9/B,QAAQ,EACRimC,UAAU,KAKZ5kC,EAAOG,GAAGsC,QACToiC,QAAS,SAAU/W,GAClB,GAAK9tB,EAAOkD,WAAY4qB,GACvB,MAAO3uB,MAAKsC,KAAK,SAASK,GACzB9B,EAAOb,MAAM0lC,QAAS/W,EAAK7sB,KAAK9B,KAAM2C,KAIxC,IAAK3C,KAAK,GAAK,CAEd,GAAIguB,GAAOntB,EAAQ8tB,EAAM3uB,KAAK,GAAGiM,eAAgBlJ,GAAG,GAAGa,OAAM,EAExD5D,MAAK,GAAGoM,YACZ4hB,EAAKO,aAAcvuB,KAAK,IAGzBguB,EAAKvrB,IAAI,WACR,GAAIC,GAAO1C,IAEX,OAAQ0C,EAAK6O,YAA2C,IAA7B7O,EAAK6O,WAAWpM,SAC1CzC,EAAOA,EAAK6O,UAGb,OAAO7O,KACL0rB,OAAQpuB,MAGZ,MAAOA,OAGR2lC,UAAW,SAAUhX,GACpB,MACQ3uB,MAAKsC,KADRzB,EAAOkD,WAAY4qB,GACN,SAAShsB,GACzB9B,EAAOb,MAAM2lC,UAAWhX,EAAK7sB,KAAK9B,KAAM2C,KAIzB,WAChB,GAAIwW,GAAOtY,EAAQb,MAClB4Z,EAAWT,EAAKS,UAEZA,GAAShY,OACbgY,EAAS8rB,QAAS/W,GAGlBxV,EAAKiV,OAAQO,MAKhBX,KAAM,SAAUW,GACf,GAAI5qB,GAAalD,EAAOkD,WAAY4qB,EAEpC,OAAO3uB,MAAKsC,KAAK,SAASK,GACzB9B,EAAQb,MAAO0lC,QAAS3hC,EAAa4qB,EAAK7sB,KAAK9B,KAAM2C,GAAKgsB,MAI5DiX,OAAQ,WACP,MAAO5lC,MAAK4O,SAAStM,KAAK,WACnBzB,EAAO+E,SAAU5F,KAAM,SAC5Ba,EAAQb,MAAO4uB,YAAa5uB,KAAKuL,cAEhCpI,SAKLtC,EAAOgQ,KAAK4E,QAAQke,OAAS,SAAUjxB,GAGtC,MAAOA,GAAKqd,aAAe,GAAKrd,EAAK8vB,cAAgB,IAClD7xB,EAAQuxB,yBACiE,UAAxExvB,EAAKkd,OAASld,EAAKkd,MAAM8P,SAAY7uB,EAAOyhB,IAAK5f,EAAM,aAG5D7B,EAAOgQ,KAAK4E,QAAQowB,QAAU,SAAUnjC,GACvC,OAAQ7B,EAAOgQ,KAAK4E,QAAQke,OAAQjxB,GAMrC,IAAIojC,IAAM,OACTC,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,oCAEhB,SAASC,IAAa9Q,EAAQ1wB,EAAKogC,EAAatqB,GAC/C,GAAI/W,EAEJ,IAAK7C,EAAOoD,QAASU,GAEpB9D,EAAOyB,KAAMqC,EAAK,SAAUhC,EAAGyjC,GACzBrB,GAAegB,GAASt5B,KAAM4oB,GAElC5a,EAAK4a,EAAQ+Q,GAIbD,GAAa9Q,EAAS,KAAqB,gBAAN+Q,GAAiBzjC,EAAI,IAAO,IAAKyjC,EAAGrB,EAAatqB,SAIlF,IAAMsqB,GAAsC,WAAvBlkC,EAAO+D,KAAMD,GAQxC8V,EAAK4a,EAAQ1wB,OANb,KAAMjB,IAAQiB,GACbwhC,GAAa9Q,EAAS,IAAM3xB,EAAO,IAAKiB,EAAKjB,GAAQqhC,EAAatqB,GAWrE5Z,EAAO+qB,MAAQ,SAAUhjB,EAAGm8B,GAC3B,GAAI1P,GACH+L,KACA3mB,EAAM,SAAUvV,EAAKY,GAEpBA,EAAQjF,EAAOkD,WAAY+B,GAAUA,IAAqB,MAATA,EAAgB,GAAKA,EACtEs7B,EAAGA,EAAEx/B,QAAWykC,mBAAoBnhC,GAAQ,IAAMmhC,mBAAoBvgC,GASxE,IALqB5B,SAAhB6gC,IACJA,EAAclkC,EAAOqgC,cAAgBrgC,EAAOqgC,aAAa6D,aAIrDlkC,EAAOoD,QAAS2E,IAASA,EAAElH,SAAWb,EAAOmD,cAAe4E,GAEhE/H,EAAOyB,KAAMsG,EAAG,WACf6R,EAAKza,KAAK0D,KAAM1D,KAAK8F,aAMtB,KAAMuvB,IAAUzsB,GACfu9B,GAAa9Q,EAAQzsB,EAAGysB,GAAU0P,EAAatqB,EAKjD,OAAO2mB,GAAEt0B,KAAM,KAAMxI,QAASwhC,GAAK,MAGpCjlC,EAAOG,GAAGsC,QACTgjC,UAAW,WACV,MAAOzlC,GAAO+qB,MAAO5rB,KAAKumC,mBAE3BA,eAAgB,WACf,MAAOvmC,MAAKyC,IAAI,WAEf,GAAIqO,GAAWjQ,EAAOumB,KAAMpnB,KAAM,WAClC,OAAO8Q,GAAWjQ,EAAOoF,UAAW6K,GAAa9Q,OAEjDwP,OAAO,WACP,GAAI5K,GAAO5E,KAAK4E,IAEhB,OAAO5E,MAAK0D,OAAS7C,EAAQb,MAAOoZ,GAAI,cACvC8sB,GAAaz5B,KAAMzM,KAAK4F,YAAeqgC,GAAgBx5B,KAAM7H,KAC3D5E,KAAKwU,UAAYoO,EAAenW,KAAM7H,MAEzCnC,IAAI,SAAUE,EAAGD,GACjB,GAAIsO,GAAMnQ,EAAQb,MAAOgR,KAEzB,OAAc,OAAPA,EACN,KACAnQ,EAAOoD,QAAS+M,GACfnQ,EAAO4B,IAAKuO,EAAK,SAAUA,GAC1B,OAAStN,KAAMhB,EAAKgB,KAAMoC,MAAOkL,EAAI1M,QAAS0hC,GAAO,YAEpDtiC,KAAMhB,EAAKgB,KAAMoC,MAAOkL,EAAI1M,QAAS0hC,GAAO,WAC9CjkC,SAOLlB,EAAOqgC,aAAasF,IAA+BtiC,SAAzBnE,EAAOs/B,cAEhC,WAGC,OAAQr/B,KAAKwiC,SAQZ,wCAAwC/1B,KAAMzM,KAAK4E,OAEnD6hC,MAAuBC,MAGzBD,EAED,IAAIE,IAAQ,EACXC,MACAC,GAAehmC,EAAOqgC,aAAasF,KAK/BzmC,GAAOkP,aACXlP,EAAOkP,YAAa,WAAY,WAC/B,IAAM,GAAI/J,KAAO0hC,IAChBA,GAAc1hC,GAAOhB,QAAW,KAMnCvD,EAAQmmC,OAASD,IAAkB,mBAAqBA,IACxDA,GAAelmC,EAAQ0iC,OAASwD,GAG3BA,IAEJhmC,EAAOuiC,cAAc,SAAUz/B,GAE9B,IAAMA,EAAQmhC,aAAenkC,EAAQmmC,KAAO,CAE3C,GAAIvkC,EAEJ,QACC6iC,KAAM,SAAUF,EAAS7L,GACxB,GAAI12B,GACH6jC,EAAM7iC,EAAQ6iC,MACdn6B,IAAOs6B,EAMR,IAHAH,EAAIxH,KAAMr7B,EAAQiB,KAAMjB,EAAQ4+B,IAAK5+B,EAAQ27B,MAAO37B,EAAQojC,SAAUpjC,EAAQ0R,UAGzE1R,EAAQqjC,UACZ,IAAMrkC,IAAKgB,GAAQqjC,UAClBR,EAAK7jC,GAAMgB,EAAQqjC,UAAWrkC,EAK3BgB,GAAQ89B,UAAY+E,EAAIlC,kBAC5BkC,EAAIlC,iBAAkB3gC,EAAQ89B,UAQzB99B,EAAQmhC,aAAgBI,EAAQ,sBACrCA,EAAQ,oBAAsB,iBAI/B,KAAMviC,IAAKuiC,GAOYhhC,SAAjBghC,EAASviC,IACb6jC,EAAIpC,iBAAkBzhC,EAAGuiC,EAASviC,GAAM,GAO1C6jC,GAAIpB,KAAQzhC,EAAQqhC,YAAcrhC,EAAQ4B,MAAU,MAGpDhD,EAAW,SAAUyI,EAAGi8B,GACvB,GAAIzC,GAAQE,EAAYrD,CAGxB,IAAK9+B,IAAc0kC,GAA8B,IAAnBT,EAAInnB,YAOjC,SALOunB,IAAcv6B,GACrB9J,EAAW2B,OACXsiC,EAAIU,mBAAqBrmC,EAAO6D,KAG3BuiC,EACoB,IAAnBT,EAAInnB,YACRmnB,EAAI/B,YAEC,CACNpD,KACAmD,EAASgC,EAAIhC,OAKoB,gBAArBgC,GAAIW,eACf9F,EAAUr7B,KAAOwgC,EAAIW,aAKtB,KACCzC,EAAa8B,EAAI9B,WAChB,MAAOt/B,GAERs/B,EAAa,GAQRF,IAAU7gC,EAAQ6+B,SAAY7+B,EAAQmhC,YAGrB,OAAXN,IACXA,EAAS,KAHTA,EAASnD,EAAUr7B,KAAO,IAAM,IAS9Bq7B,GACJhI,EAAUmL,EAAQE,EAAYrD,EAAWmF,EAAIrC,0BAIzCxgC,EAAQ27B,MAGiB,IAAnBkH,EAAInnB,WAGfR,WAAYtc,GAGZikC,EAAIU,mBAAqBN,GAAcv6B,GAAO9J,EAP9CA,KAWFkiC,MAAO,WACDliC,GACJA,EAAU2B,QAAW,OAS3B,SAASuiC,MACR,IACC,MAAO,IAAI1mC,GAAOqnC,eACjB,MAAOhiC,KAGV,QAASshC,MACR,IACC,MAAO,IAAI3mC,GAAOs/B,cAAe,qBAChC,MAAOj6B,KAOVvE,EAAOoiC,WACNN,SACC0E,OAAQ,6FAETztB,UACCytB,OAAQ,uBAET1F,YACC2F,cAAe,SAAUthC,GAExB,MADAnF,GAAOyE,WAAYU,GACZA,MAMVnF,EAAOsiC,cAAe,SAAU,SAAU/B,GACxBl9B,SAAZk9B,EAAEj0B,QACNi0B,EAAEj0B,OAAQ,GAENi0B,EAAE0D,cACN1D,EAAEx8B,KAAO,MACTw8B,EAAE5hC,QAAS,KAKbqB,EAAOuiC,cAAe,SAAU,SAAShC,GAGxC,GAAKA,EAAE0D,YAAc,CAEpB,GAAIuC,GACHE,EAAO3nC,EAAS2nC,MAAQ1mC,EAAO,QAAQ,IAAMjB,EAAS6O,eAEvD,QAEC22B,KAAM,SAAUp6B,EAAGzI,GAElB8kC,EAASznC,EAAS6N,cAAc,UAEhC45B,EAAO/H,OAAQ,EAEV8B,EAAEoG,gBACNH,EAAOI,QAAUrG,EAAEoG,eAGpBH,EAAO9jC,IAAM69B,EAAEmB,IAGf8E,EAAOK,OAASL,EAAOH,mBAAqB,SAAUl8B,EAAGi8B,IAEnDA,IAAYI,EAAOhoB,YAAc,kBAAkB5S,KAAM46B,EAAOhoB,eAGpEgoB,EAAOK,OAASL,EAAOH,mBAAqB,KAGvCG,EAAOj7B,YACXi7B,EAAOj7B,WAAWsB,YAAa25B,GAIhCA,EAAS,KAGHJ,GACL1kC,EAAU,IAAK,aAOlBglC,EAAKhZ,aAAc8Y,EAAQE,EAAKh2B,aAGjCkzB,MAAO,WACD4C,GACJA,EAAOK,OAAQxjC,QAAW,OAU/B,IAAIyjC,OACHC,GAAS,mBAGV/mC,GAAOoiC,WACN4E,MAAO,WACPC,cAAe,WACd,GAAIvlC,GAAWolC,GAAa5+B,OAAWlI,EAAOsD,QAAU,IAAQo6B,IAEhE,OADAv+B,MAAMuC,IAAa,EACZA,KAKT1B,EAAOsiC,cAAe,aAAc,SAAU/B,EAAG2G,EAAkBrH,GAElE,GAAIsH,GAAcC,EAAaC,EAC9BC,EAAW/G,EAAEyG,SAAU,IAAWD,GAAOn7B,KAAM20B,EAAEmB,KAChD,MACkB,gBAAXnB,GAAE77B,QAAwB67B,EAAEsB,aAAe,IAAKpiC,QAAQ,sCAAwCsnC,GAAOn7B,KAAM20B,EAAE77B,OAAU,OAIlI,OAAK4iC,IAAiC,UAArB/G,EAAEZ,UAAW,IAG7BwH,EAAe5G,EAAE0G,cAAgBjnC,EAAOkD,WAAYq9B,EAAE0G,eACrD1G,EAAE0G,gBACF1G,EAAE0G,cAGEK,EACJ/G,EAAG+G,GAAa/G,EAAG+G,GAAW7jC,QAASsjC,GAAQ,KAAOI,GAC3C5G,EAAEyG,SAAU,IACvBzG,EAAEmB,MAAS/D,GAAO/xB,KAAM20B,EAAEmB,KAAQ,IAAM,KAAQnB,EAAEyG,MAAQ,IAAMG,GAIjE5G,EAAEO,WAAW,eAAiB,WAI7B,MAHMuG,IACLrnC,EAAO2D,MAAOwjC,EAAe,mBAEvBE,EAAmB,IAI3B9G,EAAEZ,UAAW,GAAM,OAGnByH,EAAcloC,EAAQioC,GACtBjoC,EAAQioC,GAAiB,WACxBE,EAAoBrlC,WAIrB69B,EAAM5jB,OAAO,WAEZ/c,EAAQioC,GAAiBC,EAGpB7G,EAAG4G,KAEP5G,EAAE0G,cAAgBC,EAAiBD,cAGnCH,GAAatnC,KAAM2nC,IAIfE,GAAqBrnC,EAAOkD,WAAYkkC,IAC5CA,EAAaC,EAAmB,IAGjCA,EAAoBD,EAAc/jC,SAI5B,UAtDR,SAgEDrD,EAAO0Y,UAAY,SAAUhU,EAAMxE,EAASqnC,GAC3C,IAAM7iC,GAAwB,gBAATA,GACpB,MAAO,KAEgB,kBAAZxE,KACXqnC,EAAcrnC,EACdA,GAAU,GAEXA,EAAUA,GAAWnB,CAErB,IAAIyoC,GAAStvB,EAAW7M,KAAM3G,GAC7BuoB,GAAWsa,KAGZ,OAAKC,IACKtnC,EAAQ0M,cAAe46B,EAAO,MAGxCA,EAASxnC,EAAOgtB,eAAiBtoB,GAAQxE,EAAS+sB,GAE7CA,GAAWA,EAAQlsB,QACvBf,EAAQitB,GAAUzR,SAGZxb,EAAOuB,SAAWimC,EAAO98B,aAKjC,IAAI+8B,IAAQznC,EAAOG,GAAG6nB,IAKtBhoB,GAAOG,GAAG6nB,KAAO,SAAU0Z,EAAKgG,EAAQhmC,GACvC,GAAoB,gBAARggC,IAAoB+F,GAC/B,MAAOA,IAAM1lC,MAAO5C,KAAM6C,UAG3B,IAAI/B,GAAU+gC,EAAUj9B,EACvBuU,EAAOnZ,KACP+e,EAAMwjB,EAAIjiC,QAAQ,IA+CnB,OA7CKye,IAAO,IACXje,EAAWD,EAAO2E,KAAM+8B,EAAIpiC,MAAO4e,EAAKwjB,EAAI3gC,SAC5C2gC,EAAMA,EAAIpiC,MAAO,EAAG4e,IAIhBle,EAAOkD,WAAYwkC,IAGvBhmC,EAAWgmC,EACXA,EAASrkC,QAGEqkC,GAA4B,gBAAXA,KAC5B3jC,EAAO,QAIHuU,EAAKvX,OAAS,GAClBf,EAAOwiC,MACNd,IAAKA,EAGL39B,KAAMA,EACN27B,SAAU,OACVh7B,KAAMgjC,IACJjgC,KAAK,SAAU6+B,GAGjBtF,EAAWh/B,UAEXsW,EAAKwV,KAAM7tB,EAIVD,EAAO,SAASutB,OAAQvtB,EAAO0Y,UAAW4tB,IAAiB53B,KAAMzO,GAGjEqmC,KAEC9N,SAAU92B,GAAY,SAAUm+B,EAAO8D,GACzCrrB,EAAK7W,KAAMC,EAAUs/B,IAAcnB,EAAMyG,aAAc3C,EAAQ9D,MAI1D1gC,MAORa,EAAOyB,MAAQ,YAAa,WAAY,eAAgB,YAAa,cAAe,YAAc,SAAUK,EAAGiC,GAC9G/D,EAAOG,GAAI4D,GAAS,SAAU5D,GAC7B,MAAOhB,MAAKsqB,GAAI1lB,EAAM5D,MAOxBH,EAAOgQ,KAAK4E,QAAQ+yB,SAAW,SAAU9lC,GACxC,MAAO7B,GAAO2F,KAAK3F,EAAOq5B,OAAQ,SAAUl5B,GAC3C,MAAO0B,KAAS1B,EAAG0B,OACjBd,OAOJ,IAAImG,IAAUhI,EAAOH,SAAS6O,eAK9B,SAASg6B,IAAW/lC,GACnB,MAAO7B,GAAOiE,SAAUpC,GACvBA,EACkB,IAAlBA,EAAKyC,SACJzC,EAAKoM,aAAepM,EAAK4jB,cACzB,EAGHzlB,EAAO6nC,QACNC,UAAW,SAAUjmC,EAAMiB,EAAShB,GACnC,GAAIimC,GAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnElW,EAAWnyB,EAAOyhB,IAAK5f,EAAM,YAC7BymC,EAAUtoC,EAAQ6B,GAClBglB,IAGiB,YAAbsL,IACJtwB,EAAKkd,MAAMoT,SAAW,YAGvBgW,EAAYG,EAAQT,SACpBI,EAAYjoC,EAAOyhB,IAAK5f,EAAM,OAC9BumC,EAAapoC,EAAOyhB,IAAK5f,EAAM,QAC/BwmC,GAAmC,aAAblW,GAAwC,UAAbA,IAChDnyB,EAAOwF,QAAQ,QAAUyiC,EAAWG,IAAiB,GAGjDC,GACJN,EAAcO,EAAQnW,WACtB+V,EAASH,EAAY75B,IACrB85B,EAAUD,EAAY9X,OAEtBiY,EAAS/jC,WAAY8jC,IAAe,EACpCD,EAAU7jC,WAAYikC,IAAgB,GAGlCpoC,EAAOkD,WAAYJ,KACvBA,EAAUA,EAAQ7B,KAAMY,EAAMC,EAAGqmC,IAGd,MAAfrlC,EAAQoL,MACZ2Y,EAAM3Y,IAAQpL,EAAQoL,IAAMi6B,EAAUj6B,IAAQg6B,GAE1B,MAAhBplC,EAAQmtB,OACZpJ,EAAMoJ,KAASntB,EAAQmtB,KAAOkY,EAAUlY,KAAS+X,GAG7C,SAAWllC,GACfA,EAAQylC,MAAMtnC,KAAMY,EAAMglB,GAE1ByhB,EAAQ7mB,IAAKoF,KAKhB7mB,EAAOG,GAAGsC,QACTolC,OAAQ,SAAU/kC,GACjB,GAAKd,UAAUjB,OACd,MAAmBsC,UAAZP,EACN3D,KACAA,KAAKsC,KAAK,SAAUK,GACnB9B,EAAO6nC,OAAOC,UAAW3oC,KAAM2D,EAAShB,IAI3C,IAAIoF,GAASshC,EACZC,GAAQv6B,IAAK,EAAG+hB,KAAM,GACtBpuB,EAAO1C,KAAM,GACb6O,EAAMnM,GAAQA,EAAKuJ,aAEpB,IAAM4C,EAON,MAHA9G,GAAU8G,EAAIJ,gBAGR5N,EAAOsH,SAAUJ,EAASrF,UAMpBA,GAAK6mC,wBAA0B9pB,IAC1C6pB,EAAM5mC,EAAK6mC,yBAEZF,EAAMZ,GAAW55B,IAEhBE,IAAKu6B,EAAIv6B,KAASs6B,EAAIG,aAAezhC,EAAQ0gB,YAAiB1gB,EAAQ2gB,WAAc,GACpFoI,KAAMwY,EAAIxY,MAASuY,EAAII,aAAe1hC,EAAQsgB,aAAiBtgB,EAAQugB,YAAc,KAX9EghB,GAeTtW,SAAU,WACT,GAAMhzB,KAAM,GAAZ,CAIA,GAAI0pC,GAAchB,EACjBiB,GAAiB56B,IAAK,EAAG+hB,KAAM,GAC/BpuB,EAAO1C,KAAM,EAwBd,OArBwC,UAAnCa,EAAOyhB,IAAK5f,EAAM,YAEtBgmC,EAAShmC,EAAK6mC,yBAGdG,EAAe1pC,KAAK0pC,eAGpBhB,EAAS1oC,KAAK0oC,SACR7nC,EAAO+E,SAAU8jC,EAAc,GAAK,UACzCC,EAAeD,EAAahB,UAI7BiB,EAAa56B,KAAQlO,EAAOyhB,IAAKonB,EAAc,GAAK,kBAAkB,GACtEC,EAAa7Y,MAAQjwB,EAAOyhB,IAAKonB,EAAc,GAAK,mBAAmB,KAOvE36B,IAAM25B,EAAO35B,IAAO46B,EAAa56B,IAAMlO,EAAOyhB,IAAK5f,EAAM,aAAa,GACtEouB,KAAM4X,EAAO5X,KAAO6Y,EAAa7Y,KAAOjwB,EAAOyhB,IAAK5f,EAAM,cAAc,MAI1EgnC,aAAc,WACb,MAAO1pC,MAAKyC,IAAI,WACf,GAAIinC,GAAe1pC,KAAK0pC,cAAgB3hC,EAExC,OAAQ2hC,IAAmB7oC,EAAO+E,SAAU8jC,EAAc,SAAuD,WAA3C7oC,EAAOyhB,IAAKonB,EAAc,YAC/FA,EAAeA,EAAaA,YAE7B,OAAOA,IAAgB3hC,QAM1BlH,EAAOyB,MAAQ+lB,WAAY,cAAeI,UAAW,eAAiB,SAAUoc,EAAQzd,GACvF,GAAIrY,GAAM,IAAItC,KAAM2a,EAEpBvmB,GAAOG,GAAI6jC,GAAW,SAAU7zB,GAC/B,MAAOuR,GAAQviB,KAAM,SAAU0C,EAAMmiC,EAAQ7zB,GAC5C,GAAIq4B,GAAMZ,GAAW/lC,EAErB,OAAawB,UAAR8M,EACGq4B,EAAOjiB,IAAQiiB,GAAOA,EAAKjiB,GACjCiiB,EAAIzpC,SAAS6O,gBAAiBo2B,GAC9BniC,EAAMmiC,QAGHwE,EACJA,EAAIO,SACF76B,EAAYlO,EAAQwoC,GAAMhhB,aAApBrX,EACPjC,EAAMiC,EAAMnQ,EAAQwoC,GAAM5gB,aAI3B/lB,EAAMmiC,GAAW7zB,IAEhB6zB,EAAQ7zB,EAAKnO,UAAUjB,OAAQ,SAQpCf,EAAOyB,MAAQ,MAAO,QAAU,SAAUK,EAAGykB,GAC5CvmB,EAAOuzB,SAAUhN,GAAS+J,GAAcxwB,EAAQ0xB,cAC/C,SAAU3vB,EAAM+tB,GACf,MAAKA,IACJA,EAAWJ,GAAQ3tB,EAAM0kB,GAElB+I,GAAU1jB,KAAMgkB,GACtB5vB,EAAQ6B,GAAOswB,WAAY5L,GAAS,KACpCqJ,GALF,WAaH5vB,EAAOyB,MAAQunC,OAAQ,SAAUC,MAAO,SAAW,SAAUpmC,EAAMkB,GAClE/D,EAAOyB,MAAQ6yB,QAAS,QAAUzxB,EAAMmpB,QAASjoB,EAAM,GAAI,QAAUlB,GAAQ,SAAUqmC,EAAcC,GAEpGnpC,EAAOG,GAAIgpC,GAAa,SAAU9U,EAAQpvB,GACzC,GAAI0c,GAAY3f,UAAUjB,SAAYmoC,GAAkC,iBAAX7U,IAC5DnB,EAAQgW,IAAkB7U,KAAW,GAAQpvB,KAAU,EAAO,SAAW,SAE1E,OAAOyc,GAAQviB,KAAM,SAAU0C,EAAMkC,EAAMkB,GAC1C,GAAI+I,EAEJ,OAAKhO,GAAOiE,SAAUpC,GAIdA,EAAK9C,SAAS6O,gBAAiB,SAAW/K,GAI3B,IAAlBhB,EAAKyC,UACT0J,EAAMnM,EAAK+L,gBAIJrK,KAAKkC,IACX5D,EAAKkc,KAAM,SAAWlb,GAAQmL,EAAK,SAAWnL,GAC9ChB,EAAKkc,KAAM,SAAWlb,GAAQmL,EAAK,SAAWnL,GAC9CmL,EAAK,SAAWnL,KAIDQ,SAAV4B,EAENjF,EAAOyhB,IAAK5f,EAAMkC,EAAMmvB,GAGxBlzB,EAAO+e,MAAOld,EAAMkC,EAAMkB,EAAOiuB,IAChCnvB,EAAM4d,EAAY0S,EAAShxB,OAAWse,EAAW,WAOvD3hB,EAAOG,GAAGipC,KAAO,WAChB,MAAOjqC,MAAK4B,QAGbf,EAAOG,GAAGkpC,QAAUrpC,EAAOG,GAAG0Z,QAkBP,kBAAXyvB,SAAyBA,OAAOC,KAC3CD,OAAQ,YAAc,WACrB,MAAOtpC,IAOT,IAECwpC,IAAUtqC,EAAOc,OAGjBypC,GAAKvqC,EAAOwqC,CAwBb,OAtBA1pC,GAAO2pC,WAAa,SAAU1mC,GAS7B,MARK/D,GAAOwqC,IAAM1pC,IACjBd,EAAOwqC,EAAID,IAGPxmC,GAAQ/D,EAAOc,SAAWA,IAC9Bd,EAAOc,OAASwpC,IAGVxpC,SAMIZ,KAAawf,IACxB1f,EAAOc,OAASd,EAAOwqC,EAAI1pC,GAMrBA"} \ No newline at end of file +{ + "version": 3, + "file": "jquery.min.js", + "sources": [ + "jquery.js" + ], + "names": [ + "global", + "factory", + "module", + "exports", + "document", + "w", + "Error", + "window", + "this", + "noGlobal", + "deletedIds", + "slice", + "concat", + "push", + "indexOf", + "class2type", + "toString", + "hasOwn", + "hasOwnProperty", + "support", + "version", + "jQuery", + "selector", + "context", + "fn", + "init", + "rtrim", + "rmsPrefix", + "rdashAlpha", + "fcamelCase", + "all", + "letter", + "toUpperCase", + "prototype", + "jquery", + "constructor", + "length", + "toArray", + "call", + "get", + "num", + "pushStack", + "elems", + "ret", + "merge", + "prevObject", + "each", + "callback", + "args", + "map", + "elem", + "i", + "apply", + "arguments", + "first", + "eq", + "last", + "len", + "j", + "end", + "sort", + "splice", + "extend", + "src", + "copyIsArray", + "copy", + "name", + "options", + "clone", + "target", + "deep", + "isFunction", + "isPlainObject", + "isArray", + "undefined", + "expando", + "Math", + "random", + "replace", + "isReady", + "error", + "msg", + "noop", + "obj", + "type", + "Array", + "isWindow", + "isNumeric", + "parseFloat", + "isEmptyObject", + "key", + "nodeType", + "e", + "ownLast", + "globalEval", + "data", + "trim", + "execScript", + "camelCase", + "string", + "nodeName", + "toLowerCase", + "value", + "isArraylike", + "text", + "makeArray", + "arr", + "results", + "Object", + "inArray", + "max", + "second", + "grep", + "invert", + "callbackInverse", + "matches", + "callbackExpect", + "arg", + "guid", + "proxy", + "tmp", + "now", + "Date", + "split", + "Sizzle", + "Expr", + "getText", + "isXML", + "tokenize", + "compile", + "select", + "outermostContext", + "sortInput", + "hasDuplicate", + "setDocument", + "docElem", + "documentIsHTML", + "rbuggyQSA", + "rbuggyMatches", + "contains", + "preferredDoc", + "dirruns", + "done", + "classCache", + "createCache", + "tokenCache", + "compilerCache", + "sortOrder", + "a", + "b", + "MAX_NEGATIVE", + "pop", + "push_native", + "list", + "booleans", + "whitespace", + "characterEncoding", + "identifier", + "attributes", + "pseudos", + "rwhitespace", + "RegExp", + "rcomma", + "rcombinators", + "rattributeQuotes", + "rpseudo", + "ridentifier", + "matchExpr", + "ID", + "CLASS", + "TAG", + "ATTR", + "PSEUDO", + "CHILD", + "bool", + "needsContext", + "rinputs", + "rheader", + "rnative", + "rquickExpr", + "rsibling", + "rescape", + "runescape", + "funescape", + "_", + "escaped", + "escapedWhitespace", + "high", + "String", + "fromCharCode", + "unloadHandler", + "childNodes", + "els", + "seed", + "match", + "m", + "groups", + "old", + "nid", + "newContext", + "newSelector", + "ownerDocument", + "exec", + "getElementById", + "parentNode", + "id", + "getElementsByTagName", + "getElementsByClassName", + "qsa", + "test", + "getAttribute", + "setAttribute", + "toSelector", + "testContext", + "join", + "querySelectorAll", + "qsaError", + "removeAttribute", + "keys", + "cache", + "cacheLength", + "shift", + "markFunction", + "assert", + "div", + "createElement", + "removeChild", + "addHandle", + "attrs", + "handler", + "attrHandle", + "siblingCheck", + "cur", + "diff", + "sourceIndex", + "nextSibling", + "createInputPseudo", + "createButtonPseudo", + "createPositionalPseudo", + "argument", + "matchIndexes", + "documentElement", + "node", + "hasCompare", + "parent", + "doc", + "defaultView", + "top", + "addEventListener", + "attachEvent", + "className", + "appendChild", + "createComment", + "getById", + "getElementsByName", + "find", + "filter", + "attrId", + "getAttributeNode", + "tag", + "innerHTML", + "input", + "matchesSelector", + "webkitMatchesSelector", + "mozMatchesSelector", + "oMatchesSelector", + "msMatchesSelector", + "disconnectedMatch", + "compareDocumentPosition", + "adown", + "bup", + "compare", + "sortDetached", + "aup", + "ap", + "bp", + "unshift", + "expr", + "elements", + "attr", + "val", + "specified", + "uniqueSort", + "duplicates", + "detectDuplicates", + "sortStable", + "textContent", + "firstChild", + "nodeValue", + "selectors", + "createPseudo", + "relative", + ">", + "dir", + " ", + "+", + "~", + "preFilter", + "excess", + "unquoted", + "nodeNameSelector", + "pattern", + "operator", + "check", + "result", + "what", + "simple", + "forward", + "ofType", + "xml", + "outerCache", + "nodeIndex", + "start", + "useCache", + "lastChild", + "pseudo", + "setFilters", + "idx", + "matched", + "not", + "matcher", + "unmatched", + "has", + "innerText", + "lang", + "elemLang", + "hash", + "location", + "root", + "focus", + "activeElement", + "hasFocus", + "href", + "tabIndex", + "enabled", + "disabled", + "checked", + "selected", + "selectedIndex", + "empty", + "header", + "button", + "even", + "odd", + "lt", + "gt", + "radio", + "checkbox", + "file", + "password", + "image", + "submit", + "reset", + "filters", + "parseOnly", + "tokens", + "soFar", + "preFilters", + "cached", + "addCombinator", + "combinator", + "base", + "checkNonElements", + "doneName", + "oldCache", + "newCache", + "elementMatcher", + "matchers", + "multipleContexts", + "contexts", + "condense", + "newUnmatched", + "mapped", + "setMatcher", + "postFilter", + "postFinder", + "postSelector", + "temp", + "preMap", + "postMap", + "preexisting", + "matcherIn", + "matcherOut", + "matcherFromTokens", + "checkContext", + "leadingRelative", + "implicitRelative", + "matchContext", + "matchAnyContext", + "matcherFromGroupMatchers", + "elementMatchers", + "setMatchers", + "bySet", + "byElement", + "superMatcher", + "outermost", + "matchedCount", + "setMatched", + "contextBackup", + "dirrunsUnique", + "token", + "compiled", + "div1", + "defaultValue", + "unique", + "isXMLDoc", + "rneedsContext", + "rsingleTag", + "risSimple", + "winnow", + "qualifier", + "self", + "is", + "rootjQuery", + "charAt", + "parseHTML", + "ready", + "rparentsprev", + "guaranteedUnique", + "children", + "contents", + "next", + "prev", + "until", + "sibling", + "n", + "r", + "targets", + "closest", + "l", + "pos", + "index", + "prevAll", + "add", + "addBack", + "parents", + "parentsUntil", + "nextAll", + "nextUntil", + "prevUntil", + "siblings", + "contentDocument", + "contentWindow", + "reverse", + "rnotwhite", + "optionsCache", + "createOptions", + "object", + "flag", + "Callbacks", + "firing", + "memory", + "fired", + "firingLength", + "firingIndex", + "firingStart", + "stack", + "once", + "fire", + "stopOnFalse", + "disable", + "remove", + "lock", + "locked", + "fireWith", + "Deferred", + "func", + "tuples", + "state", + "promise", + "always", + "deferred", + "fail", + "then", + "fns", + "newDefer", + "tuple", + "returned", + "resolve", + "reject", + "progress", + "notify", + "pipe", + "stateString", + "when", + "subordinate", + "resolveValues", + "remaining", + "updateFunc", + "values", + "progressValues", + "notifyWith", + "resolveWith", + "progressContexts", + "resolveContexts", + "readyList", + "readyWait", + "holdReady", + "hold", + "wait", + "body", + "setTimeout", + "triggerHandler", + "off", + "detach", + "removeEventListener", + "completed", + "detachEvent", + "event", + "readyState", + "frameElement", + "doScroll", + "doScrollCheck", + "strundefined", + "inlineBlockNeedsLayout", + "container", + "style", + "cssText", + "zoom", + "offsetWidth", + "deleteExpando", + "acceptData", + "noData", + "rbrace", + "rmultiDash", + "dataAttr", + "parseJSON", + "isEmptyDataObject", + "internalData", + "pvt", + "thisCache", + "internalKey", + "isNode", + "toJSON", + "internalRemoveData", + "cleanData", + "applet ", + "embed ", + "object ", + "hasData", + "removeData", + "_data", + "_removeData", + "queue", + "dequeue", + "startLength", + "hooks", + "_queueHooks", + "stop", + "setter", + "clearQueue", + "count", + "defer", + "pnum", + "source", + "cssExpand", + "isHidden", + "el", + "css", + "access", + "chainable", + "emptyGet", + "raw", + "bulk", + "rcheckableType", + "fragment", + "createDocumentFragment", + "leadingWhitespace", + "tbody", + "htmlSerialize", + "html5Clone", + "cloneNode", + "outerHTML", + "appendChecked", + "noCloneChecked", + "checkClone", + "noCloneEvent", + "click", + "eventName", + "change", + "focusin", + "rformElems", + "rkeyEvent", + "rmouseEvent", + "rfocusMorph", + "rtypenamespace", + "returnTrue", + "returnFalse", + "safeActiveElement", + "err", + "types", + "events", + "t", + "handleObjIn", + "special", + "eventHandle", + "handleObj", + "handlers", + "namespaces", + "origType", + "elemData", + "handle", + "triggered", + "dispatch", + "delegateType", + "bindType", + "namespace", + "delegateCount", + "setup", + "mappedTypes", + "origCount", + "teardown", + "removeEvent", + "trigger", + "onlyHandlers", + "ontype", + "bubbleType", + "eventPath", + "Event", + "isTrigger", + "namespace_re", + "noBubble", + "parentWindow", + "isPropagationStopped", + "preventDefault", + "isDefaultPrevented", + "_default", + "fix", + "handlerQueue", + "delegateTarget", + "preDispatch", + "currentTarget", + "isImmediatePropagationStopped", + "stopPropagation", + "postDispatch", + "sel", + "prop", + "originalEvent", + "fixHook", + "fixHooks", + "mouseHooks", + "keyHooks", + "props", + "srcElement", + "metaKey", + "original", + "which", + "charCode", + "keyCode", + "eventDoc", + "fromElement", + "pageX", + "clientX", + "scrollLeft", + "clientLeft", + "pageY", + "clientY", + "scrollTop", + "clientTop", + "relatedTarget", + "toElement", + "load", + "blur", + "beforeunload", + "returnValue", + "simulate", + "bubble", + "isSimulated", + "defaultPrevented", + "timeStamp", + "cancelBubble", + "stopImmediatePropagation", + "mouseenter", + "mouseleave", + "pointerenter", + "pointerleave", + "orig", + "related", + "submitBubbles", + "form", + "_submit_bubble", + "changeBubbles", + "propertyName", + "_just_changed", + "focusinBubbles", + "attaches", + "on", + "one", + "origFn", + "createSafeFragment", + "nodeNames", + "safeFrag", + "rinlinejQuery", + "rnoshimcache", + "rleadingWhitespace", + "rxhtmlTag", + "rtagName", + "rtbody", + "rhtml", + "rnoInnerhtml", + "rchecked", + "rscriptType", + "rscriptTypeMasked", + "rcleanScript", + "wrapMap", + "option", + "legend", + "area", + "param", + "thead", + "tr", + "col", + "td", + "safeFragment", + "fragmentDiv", + "optgroup", + "tfoot", + "colgroup", + "caption", + "th", + "getAll", + "found", + "fixDefaultChecked", + "defaultChecked", + "manipulationTarget", + "content", + "disableScript", + "restoreScript", + "setGlobalEval", + "refElements", + "cloneCopyEvent", + "dest", + "oldData", + "curData", + "fixCloneNodeIssues", + "defaultSelected", + "dataAndEvents", + "deepDataAndEvents", + "destElements", + "srcElements", + "inPage", + "buildFragment", + "scripts", + "selection", + "wrap", + "safe", + "nodes", + "createTextNode", + "append", + "domManip", + "prepend", + "insertBefore", + "before", + "after", + "keepData", + "html", + "replaceWith", + "replaceChild", + "hasScripts", + "set", + "iNoClone", + "_evalUrl", + "appendTo", + "prependTo", + "insertAfter", + "replaceAll", + "insert", + "iframe", + "elemdisplay", + "actualDisplay", + "display", + "getDefaultComputedStyle", + "defaultDisplay", + "write", + "close", + "shrinkWrapBlocksVal", + "shrinkWrapBlocks", + "width", + "rmargin", + "rnumnonpx", + "getStyles", + "curCSS", + "rposition", + "getComputedStyle", + "opener", + "computed", + "minWidth", + "maxWidth", + "getPropertyValue", + "currentStyle", + "left", + "rs", + "rsLeft", + "runtimeStyle", + "pixelLeft", + "addGetHookIf", + "conditionFn", + "hookFn", + "condition", + "pixelPositionVal", + "boxSizingReliableVal", + "reliableHiddenOffsetsVal", + "reliableMarginRightVal", + "opacity", + "cssFloat", + "backgroundClip", + "clearCloneStyle", + "boxSizing", + "MozBoxSizing", + "WebkitBoxSizing", + "reliableHiddenOffsets", + "computeStyleTests", + "boxSizingReliable", + "pixelPosition", + "reliableMarginRight", + "marginRight", + "offsetHeight", + "swap", + "ralpha", + "ropacity", + "rdisplayswap", + "rnumsplit", + "rrelNum", + "cssShow", + "position", + "visibility", + "cssNormalTransform", + "letterSpacing", + "fontWeight", + "cssPrefixes", + "vendorPropName", + "capName", + "origName", + "showHide", + "show", + "hidden", + "setPositiveNumber", + "subtract", + "augmentWidthOrHeight", + "extra", + "isBorderBox", + "styles", + "getWidthOrHeight", + "valueIsBorderBox", + "cssHooks", + "cssNumber", + "columnCount", + "fillOpacity", + "flexGrow", + "flexShrink", + "lineHeight", + "order", + "orphans", + "widows", + "zIndex", + "cssProps", + "float", + "$1", + "margin", + "padding", + "border", + "prefix", + "suffix", + "expand", + "expanded", + "parts", + "hide", + "toggle", + "Tween", + "easing", + "unit", + "propHooks", + "run", + "percent", + "eased", + "duration", + "step", + "tween", + "fx", + "linear", + "p", + "swing", + "cos", + "PI", + "fxNow", + "timerId", + "rfxtypes", + "rfxnum", + "rrun", + "animationPrefilters", + "defaultPrefilter", + "tweeners", + "*", + "createTween", + "scale", + "maxIterations", + "createFxNow", + "genFx", + "includeWidth", + "height", + "animation", + "collection", + "opts", + "oldfire", + "checkDisplay", + "anim", + "dataShow", + "unqueued", + "overflow", + "overflowX", + "overflowY", + "propFilter", + "specialEasing", + "Animation", + "properties", + "stopped", + "tick", + "currentTime", + "startTime", + "tweens", + "originalProperties", + "originalOptions", + "gotoEnd", + "rejectWith", + "timer", + "complete", + "tweener", + "prefilter", + "speed", + "opt", + "speeds", + "fadeTo", + "to", + "animate", + "optall", + "doAnimation", + "finish", + "stopQueue", + "timers", + "cssFn", + "slideDown", + "slideUp", + "slideToggle", + "fadeIn", + "fadeOut", + "fadeToggle", + "interval", + "setInterval", + "clearInterval", + "slow", + "fast", + "delay", + "time", + "timeout", + "clearTimeout", + "getSetAttribute", + "hrefNormalized", + "checkOn", + "optSelected", + "enctype", + "optDisabled", + "radioValue", + "rreturn", + "valHooks", + "optionSet", + "scrollHeight", + "nodeHook", + "boolHook", + "ruseDefault", + "getSetInput", + "removeAttr", + "nType", + "attrHooks", + "propName", + "attrNames", + "propFix", + "getter", + "setAttributeNode", + "createAttribute", + "coords", + "contenteditable", + "rfocusable", + "rclickable", + "removeProp", + "for", + "class", + "notxml", + "tabindex", + "parseInt", + "rclass", + "addClass", + "classes", + "clazz", + "finalValue", + "proceed", + "removeClass", + "toggleClass", + "stateVal", + "classNames", + "hasClass", + "hover", + "fnOver", + "fnOut", + "bind", + "unbind", + "delegate", + "undelegate", + "nonce", + "rquery", + "rvalidtokens", + "JSON", + "parse", + "requireNonComma", + "depth", + "str", + "comma", + "open", + "Function", + "parseXML", + "DOMParser", + "parseFromString", + "ActiveXObject", + "async", + "loadXML", + "ajaxLocParts", + "ajaxLocation", + "rhash", + "rts", + "rheaders", + "rlocalProtocol", + "rnoContent", + "rprotocol", + "rurl", + "prefilters", + "transports", + "allTypes", + "addToPrefiltersOrTransports", + "structure", + "dataTypeExpression", + "dataType", + "dataTypes", + "inspectPrefiltersOrTransports", + "jqXHR", + "inspected", + "seekingTransport", + "inspect", + "prefilterOrFactory", + "dataTypeOrTransport", + "ajaxExtend", + "flatOptions", + "ajaxSettings", + "ajaxHandleResponses", + "s", + "responses", + "firstDataType", + "ct", + "finalDataType", + "mimeType", + "getResponseHeader", + "converters", + "ajaxConvert", + "response", + "isSuccess", + "conv2", + "current", + "conv", + "responseFields", + "dataFilter", + "active", + "lastModified", + "etag", + "url", + "isLocal", + "processData", + "contentType", + "accepts", + "json", + "* text", + "text html", + "text json", + "text xml", + "ajaxSetup", + "settings", + "ajaxPrefilter", + "ajaxTransport", + "ajax", + "cacheURL", + "responseHeadersString", + "timeoutTimer", + "fireGlobals", + "transport", + "responseHeaders", + "callbackContext", + "globalEventContext", + "completeDeferred", + "statusCode", + "requestHeaders", + "requestHeadersNames", + "strAbort", + "getAllResponseHeaders", + "setRequestHeader", + "lname", + "overrideMimeType", + "code", + "status", + "abort", + "statusText", + "finalText", + "success", + "method", + "crossDomain", + "traditional", + "hasContent", + "ifModified", + "headers", + "beforeSend", + "send", + "nativeStatusText", + "modified", + "getJSON", + "getScript", + "throws", + "wrapAll", + "wrapInner", + "unwrap", + "visible", + "r20", + "rbracket", + "rCRLF", + "rsubmitterTypes", + "rsubmittable", + "buildParams", + "v", + "encodeURIComponent", + "serialize", + "serializeArray", + "xhr", + "createStandardXHR", + "createActiveXHR", + "xhrId", + "xhrCallbacks", + "xhrSupported", + "cors", + "username", + "xhrFields", + "isAbort", + "onreadystatechange", + "responseText", + "XMLHttpRequest", + "script", + "text script", + "head", + "scriptCharset", + "charset", + "onload", + "oldCallbacks", + "rjsonp", + "jsonp", + "jsonpCallback", + "originalSettings", + "callbackName", + "overwritten", + "responseContainer", + "jsonProp", + "keepScripts", + "parsed", + "_load", + "params", + "animated", + "getWindow", + "offset", + "setOffset", + "curPosition", + "curLeft", + "curCSSTop", + "curTop", + "curOffset", + "curCSSLeft", + "calculatePosition", + "curElem", + "using", + "win", + "box", + "getBoundingClientRect", + "pageYOffset", + "pageXOffset", + "offsetParent", + "parentOffset", + "scrollTo", + "Height", + "Width", + "defaultExtra", + "funcName", + "size", + "andSelf", + "define", + "amd", + "_jQuery", + "_$", + "$", + "noConflict" + ], + "mappings": "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" +} \ No newline at end of file diff --git a/daliuge-translator/dlg/dropmake/web/jsoneditor.map b/daliuge-translator/dlg/dropmake/web/jsoneditor.map index d62ead153..19f2ab855 100644 --- a/daliuge-translator/dlg/dropmake/web/jsoneditor.map +++ b/daliuge-translator/dlg/dropmake/web/jsoneditor.map @@ -1 +1,3226 @@ -{"version":3,"file":"jsoneditor.map","sources":["./dist/jsoneditor.js"],"names":["root","factory","exports","module","define","amd","this","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","JSONEditor","container","options","json","Error","ieVersion","util","getInternetExplorerVersion","arguments","length","_create","treemode","textmode","modes","prototype","mode","setMode","_delete","set","get","setText","jsonText","parse","getText","JSON","stringify","setName","name","getName","data","extend","config","asText","clear","mixin","create","load","err","_onError","onError","log","error","registerMode","i","prop","isArray","reserved","Highlighter","History","SearchBox","Node","modeswitcher","dom","highlighter","selection","undefined","_setOptions","history","_createFrame","_createTable","frame","parentNode","removeChild","search","hasOwnProperty","focusNode","domFocus","Function","content","table","params","field","value","node","_setRoot","recurse","expand","appendChild","blur","getValue","updateField","focus","input","querySelector","menu","collapse","tbody","getDom","text","results","expandAll","collapseAll","_onAction","action","add","change","startAutoScroll","mouseY","me","top","getAbsoluteTop","height","clientHeight","bottom","margin","interval","scrollTop","autoScrollStep","scrollHeight","autoScrollTimer","setInterval","stopAutoScroll","clearTimeout","setSelection","range","setSelectionOffset","getSelection","getSelectionOffset","scrollTo","callback","editor","animateTimeout","animateCallback","finalScrollTop","Math","min","max","animate","diff","abs","setTimeout","onEvent","event","_onEvent","document","createElement","className","onclick","target","nodeName","preventDefault","oninput","onchange","onkeydown","onkeyup","oncut","onpaste","onmousedown","onmouseup","onmouseover","onmouseout","addEventListener","onfocusin","onfocusout","title","undo","_onUndo","redo","_onRedo","onChange","disabled","canUndo","canRedo","modeBox","searchBox","type","_onKeyDown","getNodeFromTarget","keynum","which","keyCode","ctrlKey","shiftKey","handled","selectContentEditable","select","previous","next","stopPropagation","contentOuter","col","colgroupContent","width","ace","indentation","Number","_ace","theme","textarea","clientWidth","buttonFormat","format","buttonCompact","compact","editorDom","style","edit","setTheme","setShowPrintMargin","setFontSize","getSession","setTabSize","setUseSoftTabs","setUseWrapMode","poweredBy","createTextNode","href","window","open","on","spellcheck","resize","force","sanitize","setValue","jsonlint","jsonString","validate","jsString","curr","charAt","prev","prevIsBrace","ii","cc","skipComment","parseString","quote","chars","push","parseKey","specialValues","key","regexp","test","indexOf","match","join","a","b","args","console","apply","object","String","Boolean","RegExp","isUrlRegex","isUrl","obj","Object","toString","getAbsoluteLeft","elem","rect","getBoundingClientRect","left","pageXOffset","scrollLeft","pageYOffset","addClassName","classes","split","removeClassName","index","splice","stripFormatting","divElement","childs","childNodes","iMax","child","removeAttribute","attributes","j","attribute","specified","setEndOfContentEditable","contentEditableElement","createRange","selectNodeContents","removeAllRanges","addRange","sel","getRangeAt","rangeCount","startContainer","endContainer","startOffset","endOffset","setStart","firstChild","setEnd","getInnerText","element","buffer","first","flush","nodeValue","hasChildNodes","innerText","prevChild","prevName","_ieVersion","rv","navigator","appName","ua","userAgent","re","exec","parseFloat","$1","isFirefox","listener","useCapture","attachEvent","f","removeEventListener","detachEvent","locked","highlight","setHighlight","_cancelUnhighlight","unhighlight","unhighlightTimer","lock","unlock","actions","editField","oldValue","newValue","editValue","updateValue","appendNode","parent","insertBeforeNode","insertBefore","beforeNode","insertAfterNode","insertAfter","afterNode","removeNode","append","duplicateNode","clone","changeType","oldType","newType","moveNode","startParent","moveTo","startIndex","endParent","endIndex","sort","hideChilds","oldSort","oldChilds","showChilds","newSort","newChilds","timestamp","Date","oldSelection","newSelection","timeout","delay","lastText","tr","td","divInput","tableInput","tbodySearch","refreshSearch","_onDelayedSearch","_onSearch","_onKeyUp","searchNext","searchPrevious","resultIndex","_setActiveResult","activeResult","prevNode","prevElem","searchFieldActive","searchValueActive","updateDom","_clearDelay","forceSearch","resultCount","innerHTML","expanded","setField","fieldEditable","ContextMenu","appendNodeFactory","_updateEditability","editable","path","unshift","setParent","getField","_getDomField","childValue","_getType","childField","arr","forEach","_getDomValue","getLevel","fieldInnerText","valueInnerText","cloneChilds","childClone","getAppend","nextTr","nextSibling","hide","_hasChilds","newTr","appendTr","updateIndexes","moveBefore","trTemp","AppendNode","currentIndex","toLowerCase","searchField","searchValue","_updateDomField","childResults","concat","_updateDomValue","offsetTop","focusElement","elementName","drag","editableDiv","_duplicate","containsNode","_move","clearDom","removedNode","_remove","lastTr","_stringCast","silent","_unescapeHTML","str","domValue","v","t","color","isEmpty","count","domField","oldField","tdDrag","domDrag","tdMenu","tdField","tree","_createDomTree","_onDragStart","mousemove","_onDrag","mouseup","_onDragEnd","oldCursor","body","cursor","mouseX","pageX","level","trThis","trPrev","trNext","trFirst","trLast","trRoot","nodePrev","nodeNext","topThis","topPrev","topFirst","heightThis","bottomNext","heightNext","pageY","moved","offsetHeight","previousSibling","diffX","diffLevel","round","levelNext","_isChildOf","n","_createDomField","domTree","marginLeft","contentEditable","_escapeHTML","_updateDomIndexes","_createDomValue","_createDomExpandButton","borderCollapse","tdExpand","tdSeparator","tdValue","srcElement","expandable","showContextMenu","_onExpand","offsetX","onKeyDown","nextNode","nextDom","nextDom2","altKey","_onDuplicate","_onRemove","_onInsertBefore","_onInsertAfter","lastNode","_lastNode","_getElementName","firstNode","_firstNode","prevElement","_previousElement","appendDom","nextNode2","_previousNode","nextElement","_nextElement","prevDom","isVisible","_nextNode","newNode","_onAppend","_onChangeType","_onSort","direction","order","firstDom","lastDom","lastChild","TYPE_TITLES","auto","array","string","anchor","onClose","titles","items","submenu","click","submenuTitle","close","show","Array","lower","num","numFloat","isNaN","htmlEscaped","replace","substring","escapedText","_escapeJSON","escaped","createModeSwitcher","current","switchMode","availableModes","code","form","view","item","currentMode","currentTitle","box","createMenuItems","list","domItems","separator","li","domItem","button","divIcon","buttonSubmenu","buttonExpand","divExpand","_onExpandItem","domSubItems","subItems","ul","eventListeners","visibleSubmenu","focusButton","overflow","maxHeight","_getVisibleButtons","buttons","expandedItem","subItem","visibleMenu","windowHeight","innerHeight","windowScroll","windowBottom","anchorHeight","menuHeight","mousedown","mousewheel","keydown","fn","alreadyVisible","padding","display","targetIndex","prevButton","nextButton","e","trAppend","tdAppend","domText","paddingLeft","parser","trace","yy","symbols_","JSONString","STRING","JSONNumber","NUMBER","JSONNullLiteral","NULL","JSONBooleanLiteral","TRUE","FALSE","JSONText","JSONValue","EOF","JSONObject","JSONArray","{","}","JSONMemberList","JSONMember",":",",","[","]","JSONElementList","$accept","$end","terminals_",2,4,6,8,10,11,14,17,18,21,22,23,24,"productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$",3,5,7,9,12,13,15,16,1,19,20,25,"defaultActions","parseError","hash","popStack","stack","vstack","lstack","lex","token","self","lexer","recovering","TERROR","setInput","yylloc","yyloc","symbol","preErrorSymbol","state","r","len","newState","expected","yyval","errStr","showPosition","line","loc","first_line","last_line","first_column","last_column","slice","_input","_more","_less","done","matched","conditionStack","ch","lines","unput","more","less","pastInput","past","substr","upcomingInput","pre","tempMatch","rules","_currentRules","flex","begin","condition","popState","pop","conditions","topState","pushState","yy_","$avoiding_name_collisions","YY_START","INITIAL","inclusive","bind","acequire","isDark","cssClass","cssText","importCssString","exportAce","ns","_acequire","global","packaged","_define","original","ACE_NAMESPACE","acequirejs","deps","payload","payloads","parentId","l","dep","lookup","normalizeModule","moduleName","chunks","base","mod","uri","req","returnValue","getNativeFlags","regex","ignoreCase","multiline","extended","sticky","from","real","compliantExecNpcg","compliantLastIndexIncrement","x","lastIndex","r2","source","_xregexp","captureNames","Empty","doesDefinePropertyWork","defineProperty","exception","toInteger","floor","that","TypeError","bound","result","defineGetter","defineSetter","lookupGetter","lookupSetter","supportsAccessors","prototypeOfArray","prototypeOfObject","_toString","owns","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__","makeArray","lengthBefore","array_splice","start","deleteCount","pos","removeCount","removed","insert","remove","tailOldPos","tailNewPos","tailCount","lengthAfterRemove","boxedString","splitString","fun","toObject","thisp","map","filter","every","some","reduce","reduceRight","sought","lastIndexOf","getPrototypeOf","__proto__","constructor","getOwnPropertyDescriptor","ERR_NON_OBJECT","property","descriptor","getter","setter","enumerable","configurable","getOwnPropertyNames","keys","createEmpty","empty","propertyIsEnumerable","isPrototypeOf","toLocaleString","valueOf","properties","Type","defineProperties","definePropertyWorksOnObject","definePropertyWorksOnDom","definePropertyFallback","ERR_NON_OBJECT_DESCRIPTOR","ERR_NON_OBJECT_TARGET","ERR_ACCESSORS_NOT_SUPPORTED","seal","freeze","freezeObject","preventExtensions","isSealed","isFrozen","isExtensible","hasDontEnumBug","dontEnums","dontEnumsLength","dontEnum","now","getTime","ws","trim","trimBeginRegexp","trimEndRegexp","o","XHTML_NS","getDocumentHead","doc","head","getElementsByTagName","documentElement","tag","createElementNS","hasCssClass","el","addCssClass","removeCssClass","toggleCssClass","setCssClass","include","hasCssString","sheets","createStyleSheet","styleSheets","owningElement","importCssStylsheet","link","rel","getInnerWidth","parseInt","computedStyle","getInnerHeight","getPageScrollTop","getPageScrollLeft","getComputedStyle","currentStyle","scrollbarWidth","inner","minWidth","outer","position","noScrollbar","offsetWidth","withScrollbar","setInnerHtml","innerHtml","cloneNode","replaceChild","setInnerText","textContent","getParentWindow","defaultView","parentWindow","inherits","ctor","superCtor","super_","writable","implement","proto","oop","Keys","ret","MODIFIER_KEYS",224,"KEY_MODS","ctrl","alt","option","shift","super","meta","command","cmd","FUNCTION_KEYS",27,32,33,34,35,36,37,38,39,40,44,45,46,96,97,98,99,100,101,102,103,104,105,"-13",112,113,114,115,116,117,118,119,120,121,122,123,144,145,"PRINTABLE_KEYS",48,49,50,51,52,53,54,55,56,57,59,61,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,107,109,110,187,188,189,190,191,192,219,220,221,222,"enter","escape","esc","del","mods","pow","keyCodeToString","keyString","fromCharCode","OS","LINUX","MAC","WINDOWS","getOS","isMac","isLinux","os","platform","isWin","isIE","isOldIE","isGecko","isMozilla","Controllers","controllers","product","isOldGecko","isOpera","opera","isWebKit","isChrome","isAIR","isIPad","isTouchPad","isChromeOS","normalizeCommandKeys","hashId","getModifierHash","useragent","pressedKeys","altGr","location","keyLocation","ts","timeStamp","dt","defaultPrevented","addListener","wrapper","_wrapper","removeListener","stopEvent","cancelBubble","getButton","capture","eventHandler","releaseCaptureHandler","onMouseUp","addMouseWheelListener","factor","wheelDeltaX","wheelX","wheelY","wheelDeltaY","wheelDelta","deltaMode","DOM_DELTA_PIXEL","deltaX","deltaY","DOM_DELTA_LINE","DOM_DELTA_PAGE","axis","HORIZONTAL_AXIS","detail","addMultiMouseDownListener","timeouts","callbackName","startX","startY","timer","clicks","eventNames","isNewClick","clientX","clientY","_clicks","metaKey","getModifierString","addCommandKeyListener","lastKeyDownKeyCode","lastDefaultPrevented","postMessage","postMessageId","nextTick","win","messageName","nextFrame","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","oRequestAnimationFrame","last","stringReverse","reverse","stringRepeat","stringTrimLeft","stringTrimRight","copyObject","copy","copyArray","deepCopy","cons","arrayToMap","createMap","props","arrayRemove","escapeRegExp","escapeHTML","getMatchOffsets","regExp","matches","offset","deferredCall","fcn","deferred","cancel","schedule","isPending","delayedCall","defaultTimeout","_self","lang","BROKEN_SETDATA","USE_IE_MIME_TYPE","TextInput","host","resetSelection","inComposition","inputHandler","selectionStart","selectionEnd","setSelectionRange","resetValue","PLACEHOLDER","syncValue","onContextMenuClose","closeTimeout","tempStyle","renderer","$keepTextAreaAtCursor","$moveTextAreaToCursor","setAttribute","wrap","autocorrect","autocapitalize","opacity","copied","pasted","isSelectionEmpty","isFocused","activeElement","onBlur","onFocus","syncSelection","isAllSelected","createTextRange","moveStart","moveEnd","ownerDocument","parentElement","inPropertyChange","onPropertyChange","syncProperty","sendText","keytable","onCompositionEnd","charCodeAt","onCompositionUpdate","onCompositionStart","onSelect","selectAll","setInputHandler","cb","getInputHandler","afterContextMenu","onPaste","execCommand","onTextInput","onInput","handleClipboardData","clipboardData","mime","setData","getData","doCopy","isCut","getCopyText","onCut","onCopy","onCommandKey","$readOnly","session","markUndoGroup","clearSelection","val","lastValue","getRange","setRange","syncComposition","getElement","setReadOnly","readOnly","onContextMenu","_emit","domEvent","moveToMouse","bringToFront","borderTopWidth","borderLeftWidth","maxTop","move","textInput","scroller","DefaultHandlers","mouseHandler","$clickSelection","setDefaultHandler","onMouseDown","onDoubleClick","onTripleClick","onQuadClick","onMouseWheel","selectByLines","extendSelectionBy","selectByWords","calcDistance","ax","ay","bx","by","sqrt","calcRangeOrientation","row","end","cmp","column","DRAG_OFFSET","ev","inSelection","getDocumentPosition","mousedownEvent","selectionRange","getSelectionRange","selectionEmpty","moveToPosition","time","$focusTimout","inMultiSelectMode","captureMouse","startSelect","setState","waitForClickSelection","screenToTextCoordinates","y","getShiftKey","selectToPosition","setCapture","setStyle","comparePoint","orientedRange","setSelectionAnchor","scrollCursorIntoView","unitName","cmpStart","cmpEnd","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","unsetStyle","releaseCapture","focusWait","distance","getBracketRange","getWordRange","isMultiLine","contains","getLineRange","getAccelKey","$lastScrollTime","isScrolable","isScrollableBy","speed","scrollBy","stop","Tooltip","isOpen","$element","$parentNode","$init","setHtml","html","setPosition","setClassName","getHeight","getWidth","GutterHandler","showTooltip","mouseEvent","annotation","gutter","$annotations","hideTooltip","maxRow","getLength","screenRow","pixelToScreenCoordinates","$pos","documentToScreenRow","tooltipAnnotation","tooltip","$tooltipFollowsMouse","moveTooltip","gutterElement","$cells","right","tooltipTimeout","$gutterLayer","GutterTooltip","gutterRegion","getRegion","selectTo","isMousePressed","$gutter","windowWidth","innerWidth","MouseEvent","$inSelection","propagationStopped","DragdropHandler","prevCursor","vMovement","hMovement","cursorMovedTime","$blockScrolling","moveCursorToPosition","cursorPointOnCaretMoved","SCROLL_CURSOR_HYSTERESIS","SCROLL_CURSOR_DELAY","autoScroll","lineHeight","layerConfig","characterWidth","editorRect","offsets","nearestXOffset","nearestYOffset","scrollCursor","vScroll","hScroll","autoScrollStartTime","AUTOSCROLL_DELAY","onDragInterval","dragCursor","addDragMarker","toOrientedRange","dragSelectionMarker","addMarker","getSelectionStyle","$cursorLayer","setBlinking","clearInterval","timerId","counter","onMouseMove","clearDragMarker","removeMarker","fromOrientedRange","isInternal","getReadOnly","onMouseMoveTimer","canAccept","dataTransfer","types","getDropEffect","copyAllowed","moveAllowed","copyModifierState","effectAllowed","dropEffect","blankImage","src","dragOperation","mouseTarget","onDragStart","cancelDrag","draggable","setDragImage","clearData","getTextRange","onDragEnd","setCursorStyle","onDragEnter","onDragOver","onDragLeave","onDrop","moveText","dropData","dragWait","getDragDelay","startDrag","dragWaitEnd","dragReadyEnd","cursorStyle","onMouseDrag","dragDrop","$dragEnabled","clickCount","eventTarget","unselectable","url","xhr","XMLHttpRequest","onreadystatechange","readyState","responseText","send","loadScript","s","onload","_","isAbort","qualifyURL","EventEmitter","_dispatchEvent","eventName","_eventRegistry","_defaultHandlers","listeners","defaultHandler","_signal","once","newCallback","handlers","_disabled_","old","removeDefaultHandler","capturing","off","removeAllListeners","init","scriptOptions","scriptUrl","currentScript","_currentScript","currentDocument","scripts","script","getAttribute","attr","deHyphenate","basePath","workerPath","modePath","themePath","m1","toUpperCase","net","suffix","$moduleUrls","all","moduleUrl","component","parts","sep","setModuleUrl","subst","$loading","loadModule","onLoad","moduleType","afterLoad","optionsProvider","setOptions","optList","setOption","getOptions","optionNames","$options","getOption","opt","warn","forwardTo","handlesSet","defaultOptions","defineOptions","initialValue","resetOptions","setDefaultValue","opts","setDefaultValues","optionHash","DefaultGutterHandler","MouseHandler","focusEditor","getMouseEventTarget","onMouseEvent","scrollBarV","scrollBarH","gutterEl","$dragDelay","char","insideStart","$scrollSpeed","mouseMoveHandler","releaseMouse","$mouseMoved","onCaptureEnd","onCaptureInterval","$onCaptureMouseMove","cancelContextMenu","scrollSpeed","dragDelay","dragEnabled","focusTimout","tooltipFollowsMouse","FoldHandler","fold","getFoldAt","removeFold","expandFold","foldWidgets","onFoldWidgetClick","getParentFoldRangeData","firstRange","getLine","addFold","keyUtil","KeyBinding","$editor","$data","$handlers","commands","kb","removeKeyboardHandler","$defaultHandler","addKeyboardHandler","setKeyboardHandler","h","handleKeyboard","attach","detach","getKeyboardHandler","getStatusText","$callKeyboardHandlers","toExecute","success","passEvent","comparePoints","p1","p2","Range","startRow","startColumn","endRow","endColumn","isEqual","compare","compareRange","containsRange","intersects","isEnd","isStart","inside","insideEnd","compareStart","compareEnd","compareInside","clipRows","firstRow","lastRow","fromPoints","collapseRows","toScreenRange","screenPosStart","documentToScreenPosition","screenPosEnd","moveBy","Selection","getDocument","lead","selectionLead","createAnchor","selectionAnchor","$isEmpty","$keepDesiredColumnOnChange","$desiredColumn","getCursor","getPosition","getSelectionAnchor","getSelectionLead","shiftSelection","columns","moveCursorTo","isBackwards","$moveSelection","mover","selectUp","moveCursorUp","selectDown","moveCursorDown","selectRight","moveCursorRight","selectLeft","moveCursorLeft","selectLineStart","moveCursorLineStart","selectLineEnd","moveCursorLineEnd","selectFileEnd","moveCursorFileEnd","selectFileStart","moveCursorFileStart","selectWordRight","moveCursorWordRight","selectWordLeft","moveCursorWordLeft","selectWord","selectAWord","getAWordRange","excludeLastChar","rowEnd","rowStart","foldLine","getFoldLine","selectLine","moveCursorBy","tabSize","getTabSize","isTabStop","firstColumnPosition","screenToDocumentPosition","beforeCursor","getDisplayLine","leadingSpace","$useEmacsStyleLineStart","lineEnd","getDocumentLastRowColumnPosition","textEnd","moveCursorLongWordRight","rightOfCursor","nonTokenRe","tokenRe","moveCursorLongWordLeft","getFoldStringAt","leftOfCursor","$shortWordEndIndex","whitespaceRe","moveCursorShortWordRight","moveCursorShortWordLeft","$selectLongWords","rows","screenPos","docPos","lineWidgets","keepDesiredColumn","moveCursorToScreen","desiredColumn","getRangeOfMovements","func","toJSON","ranges","r1","fromJSON","rangeList","toSingleRange","MAX_TOKEN_COUNT","Tokenizer","states","regExps","matchMappings","ruleRegExps","matchTotal","mapping","defaultToken","flag","splitterRurles","rule","caseInsensitive","adjustedregex","matchcount","reportError","groupCount","tokenArray","onMatch","$arrayTokens","$applyToken","digit","removeCapturingGroups","splitRegex","createSplitterRegexp","$setMaxTokenCount","values","tokens","inChClass","lastCapture","parenOpen","parenClose","square","getLineTokens","startState","currentState","matchAttempts","skipped","merge","msg","TextHighlightRules","$rules","addRules","prefix","nextState","getRules","embedRules","HighlightRules","escapeRules","$embeds","getEmbeds","normalizeRules","processState","processed","stateName","includeName","toInsert","noEscape","keywordMap","createKeywordMapper","splitChar","keywords","$keywordList","getKeywords","$keywords","Behaviour","$behaviours","addBehaviours","behaviours","inherit","getBehaviours","addUnicodePackage","pack","codePoint","packages","L","Ll","Lu","Lt","Lm","Lo","M","Mn","Mc","Me","N","Nd","Nl","No","P","Pd","Ps","Pe","Pi","Pf","Pc","Po","S","Sm","Sc","Sk","So","Z","Zs","Zl","Zp","C","Cc","Cf","Co","Cs","Cn","TokenIterator","initialRow","initialColumn","$session","$row","$rowTokens","getTokens","getTokenAt","$tokenIndex","stepBackward","stepForward","rowCount","getCurrentToken","getCurrentTokenRow","getCurrentTokenColumn","rowTokens","tokenIndex","unicode","Mode","$behaviour","getTokenizer","$tokenizer","$highlightRules","lineCommentStart","blockComment","toggleCommentLines","iter","ignoreBlankLines","shouldRemove","minIndent","Infinity","insertAtTabStop","regexpStart","getUseSoftTabs","uncomment","shouldInsertSpace","removeInLine","commentWithSpace","comment","insertInLine","testRemove","before","after","spaces","lineCommentEnd","regexpEnd","minEmptyLength","indent","toggleBlockComment","colDiff","iterator","initialRange","startRange","endRange","getNextLineIndent","tab","$getIndent","checkOutdent","autoOutdent","createWorker","createModeDelegates","$modes","delegations","scope","functionName","$delegator","method","transformAction","param","completionKeywords","ruleItr","aLength","$createKeywordList","getCompletions","word","score","$id","Anchor","$onChange","$clipPositionToDocument","$insertRight","delta","noClip","Document","$lines","_insertLines","getAllLines","getNewLineCharacter","$split","$detectNewLine","$autoNewLine","$newLineMode","setNewLineMode","newLineMode","getNewLineMode","isNewLine","getLines","$clipPosition","firstLine","lastLine","insertNewLine","insertLines","firstFullRow","lastFullRow","_removeLines","removeNewLine","newLine","removeLines","nl","secondLine","applyDeltas","deltas","revertDeltas","indexToPosition","newlineLength","positionToIndex","BackgroundTokenizer","tokenizer","running","currentLine","$worker","workerStart","endLine","startLine","processedLines","$tokenizeRow","fireUpdateEvent","setTokenizer","setDocument","scheduleStart","$updateOnChange","getState","SearchHighlight","clazz","setRegexp","MAX_RANGES","cache","update","markerLayer","drawSingleLineMarker","FoldLine","foldData","folds","setFoldLine","shiftRow","sameRow","containsRow","walk","lastEnd","isNewRow","placeholder","getNextFoldTo","kind","addRemoveChars","foldBefore","newFoldLine","foldLineNext","idxToPosition","idx","lastFoldEndColumn","RangeList","pointIndex","excludeEdges","addList","substractPoint","containsPoint","rangeAtPoint","clipped","removeAll","changeRange","lineDif","consumePoint","point","consumeRange","restorePoint","restoreRange","Fold","subFolds","subFold","collapseChildren","addSubFold","afterStart","Folding","side","getFoldsInRange","foldLines","$foldData","foundFolds","getFoldsInRangeList","getAllFolds","lastFold","docRow","startFoldLine","getNextFoldLine","getFoldedRowCount","$addFoldLine","added","$clipRangeToDocument","startFold","endFold","removeFolds","$useWrapMode","$updateWrapData","$updateRowLengthCache","$modified","addFolds","$updating","cloneFolds","foldAll","expandFolds","unfold","expandInner","isRowFolded","startFoldRow","getRowFoldEnd","getRowFoldStart","getFoldDisplayLine","textLine","lastColumn","$cloneFoldData","fd","toggleFold","tryToUnfold","bracketPos","findMatchingBracket","getCommentFoldRange","dir","depth","getFoldWidget","getFoldWidgetRange","$foldStyles","manual","markbegin","markbeginend","$foldStyle","setFoldStyle","$foldMode","$setFolding","foldMode","$updateFoldWidgets","updateFoldWidgets","ignoreCurrent","fw","children","siblings","$toggleFoldWidget","toggleFoldWidget","toggleParent","BracketMatch","chr","charBeforeCursor","$findClosingBracket","$findOpeningBracket","$brackets",")","(","bracket","typeRe","openBracket","valueIndex","closingBracket","valueLength","TextMode","EditSession","$breakpoints","$decorations","$frontMarkers","$backMarkers","$markerId","$undoSelect","onChangeFold","isFullWidth","bgTokenizer","resetCaches","$resetRowCache","$docRowCache","$screenRowCache","$getRowCacheIndex","cacheArray","low","hi","mid","$wrapData","$rowLengthCache","removedFolds","$updateInternalDataOnChange","$fromUndo","$undoManager","ignore","$deltasDoc","$deltasFold","$informUndoManager","$deltas","setUndoManager","getUndoManager","reset","undoManager","$syncInformUndoManager","group","execute","mergeUndoDeltas","$defaultUndoManager","getTabString","$useSoftTabs","$mode","$indentWithTabs","$tabSize","$overwrite","setOverwrite","overwrite","getOverwrite","toggleOverwrite","addGutterDecoration","removeGutterDecoration","getBreakpoints","setBreakpoints","clearBreakpoints","setBreakpoint","clearBreakpoint","inFront","marker","addDynamicMarker","markerId","markers","getMarkers","$searchHighlight","highlightLines","setAnnotations","annotations","getAnnotations","clearAnnotations","inToken","wordRange","setUseWorker","useWorker","getUseWorker","$useWorker","onReloadTokenizer","$modeId","$onChangeMode","$isPlaceholder","$stopWorker","$startWorker","attachToSession","wrapMethod","$wrapMethod","foldingRules","terminate","getMode","$scrollTop","setScrollTop","getScrollTop","$scrollLeft","setScrollLeft","getScrollLeft","getScreenWidth","$computeWidth","getLineWidgetMaxWidth","screenWidth","lineWidgetsWidth","w","lineWidgetWidth","$wrapLimit","longestScreenLine","foldIndex","foldStart","$getStringScreenWidth","undoChanges","dontSelect","lastUndoRange","$getUndoSelection","foldDelta","redoChanges","setUndoSelect","enable","isUndo","isInsert","lastDeltaIsInsert","fromRange","toPosition","toRange","rowDiff","collDiff","oldStart","newStart","indentRows","indentString","outdentRows","rowRange","deleteRange","size","$moveLines","$clipRowToDocument","MAX_VALUE","moveLinesUp","moveLinesDown","duplicateLines","$clipColumnToRow","$wrapLimitRange","useWrapMode","getUseWrapMode","setWrapLimitRange","adjustWrapLimit","desiredLimit","$printMargin","limits","wrapLimit","$constrainWrapLimit","getWrapLimit","setWrapLimit","limit","getWrapLimitRange","foldLineBefore","wrapData","walkTokens","$getDisplayTokens","PLACEHOLDER_START","PLACEHOLDER_BODY","$computeWrapSplits","CHAR","CHAR_EXT","PUNCTUATION","SPACE","TAB","TAB_SPACE","addSplit","displayed","lastSplit","lastDocSplit","splits","displayLength","isCode","$wrapAsCode","minSplit","getScreenTabSize","maxScreenColumn","screenColumn","getRowLength","getRowLineCount","getScreenLastRowColumn","documentToScreenColumn","getDocumentLastRowColumn","docColumn","getRowSplitData","screenToDocumentRow","screenToDocumentColumn","rowLength","rowCache","doCache","splitIndex","foldStartRow","wrapRow","screenRowOffset","getScreenLength","screenRows","$getWidgetScreenLength","$setFontMetrics","fm","destroy","$wrap","firstLineNumber","useSoftTabs","Search","find","$matchIterator","findAll","needle","$assembleRegExp","$isMultiLine","prevRange","replacement","preserveCase","backwards","matchIterator","_callback","$lineIterator","$disableFakeMultiline","wholeWord","modifier","caseSensitive","$assembleMultilineRegExp","skipCurrent","HashHandler","commandKeyBinding","addCommands","$singleCommand","MultiHashHandler","addCommand","removeCommand","bindKey","_buildKeyHash","keepCommand","ckb","keyId","cmdGroup","asDefault","keyPart","chain","binding","parseKeys","_addCommandToBinding","isDefault","removeCommands","bindKeys","keyList","findKeyCommand","$keyChain","CommandManager","byName","toggleRecording","$inReplay","recording","macro","$addCommandToMacro","oldMacro","replay","trimMacro","mac","showSettingsMenu","showErrorMarker","scrollIntoView","centerSelection","prompt","gotoLine","getAllRanges","findNext","multiSelectAction","findPrevious","aceCommandGroup","navigateFileStart","navigateUp","times","navigateFileEnd","navigateDown","navigateWordLeft","navigateLineStart","navigateLeft","navigateWordRight","navigateLineEnd","navigateRight","selectPageDown","scrollPageDown","gotoPageDown","selectPageUp","scrollPageUp","gotoPageUp","jumpToMatching","duplicateSelection","sortLines","modifyNumber","copyLinesUp","copyLinesDown","removeToLineStart","removeToLineEnd","removeWordLeft","removeWordRight","blockOutdent","blockIndent","splitLine","transposeLetters","transposeSelections","firstLineEndCol","selectedText","selectedCount","insertLine","curLine","endCol","newRanges","exitMultiSelectMode","defaultCommands","Editor","getContainerElement","getTextAreaContainer","keyBinding","$mouseHandler","$search","$historyTracker","$initOperationListeners","_$emitInputEvent","setSession","selections","startOperation","endOperation","$opResetTimer","curOp","docChanged","selectionChanged","prevOp","commadEvent","previousCommand","scrollSelectionIntoView","animateScrolling","$mergeableCommands","$mergeUndoDeltas","mergeableCommands","shouldMerge","mergeNextCommand","sequenceStartTime","keyboardHandler","$keybindingId","handler","oldSession","$onDocumentChange","$onTokenizerUpdate","$onChangeTabSize","$onChangeWrapLimit","$onChangeWrapMode","$onChangeFold","$onChangeFrontMarker","$onChangeBackMarker","$onChangeBreakpoint","$onChangeAnnotation","$onCursorChange","$onScrollTopChange","$onScrollLeftChange","$onSelectionChange","onDocumentChange","onChangeMode","onTokenizerUpdate","onChangeTabSize","onChangeWrapLimit","onChangeWrapMode","onChangeFrontMarker","onChangeBackMarker","onChangeBreakpoint","onChangeAnnotation","onCursorChange","onScrollTopChange","onScrollLeftChange","onSelectionChange","updateFull","oldEditor","cursorPos","onResize","getTheme","getFontSize","$highlightBrackets","$bracketHighlight","$highlightPending","getCursorPosition","getMatching","$highlightTags","$highlightTagPending","$tagHighlight","prevToken","$isFocused","showCursor","visualizeFocus","hideCursor","visualizeBlur","$cursorChange","updateCursor","updateLines","$updateHighlightActiveLine","scrollToY","scrollToX","$highlightActiveLine","$selectionStyle","$maxLines","$minLines","$highlightLineMarker","$selectionMarker","$highlightSelectedWord","$getSelectionHighLightRegexp","startOuter","endOuter","lineCols","updateFrontMarkers","updateBackMarkers","updateBreakpoints","updateText","getSelectedText","getBehavioursEnabled","transform","$mergeNextCommand","d","lineState","shouldOutdent","lineIndent","setScrollSpeed","getScrollSpeed","setDragDelay","setSelectionStyle","setHighlightActiveLine","shouldHighlight","getHighlightActiveLine","setHighlightGutterLine","getHighlightGutterLine","setHighlightSelectedWord","getHighlightSelectedWord","setAnimatedScroll","shouldAnimate","getAnimatedScroll","setShowInvisibles","showInvisibles","getShowInvisibles","setDisplayIndentGuides","getDisplayIndentGuides","showPrintMargin","getShowPrintMargin","setPrintMarginColumn","getPrintMarginColumn","setBehavioursEnabled","enabled","setWrapBehavioursEnabled","getWrapBehavioursEnabled","setShowFoldWidgets","getShowFoldWidgets","setFadeFoldWidgets","fade","getFadeFoldWidgets","new_range","swap","originalRange","$getSelectedRows","getNumberAt","_numberRx","number","amount","charRange","isFinite","nr","fp","decimals","nnr","toFixed","replaceRange","endPoint","inVirtualSelectionMode","linesMoved","rangeIndex","showComposition","setCompositionText","hideComposition","getFirstVisibleRow","getLastVisibleRow","isRowVisible","isRowFullyVisible","getFirstFullyVisibleRow","getLastFullyVisibleRow","$getVisibleRowCount","getScrollBottomRow","getScrollTopRow","$moveByPage","scrollToRow","scrollToLine","center","alignCursor","getCursorPositionScreen","matchType","bracketType","found","brackets","lineNumber","navigateTo","replaced","$tryReplace","replaceAll","getLastSearchOptions","newRange","preventScroll","revealRange","setAutoScrollEditorIntoView","shouldScroll","$scrollAnchor","scrollAnchor","onChangeSelection","onBeforeRender","onAfterRender","$pixelPos","$resetCursorStyle","$cursorStyle","cursorLayer","setSmoothBlinking","isBlinking","selectionStyle","highlightActiveLine","highlightSelectedWord","behavioursEnabled","wrapBehavioursEnabled","autoScrollEditorIntoView","hScrollBarAlwaysVisible","vScrollBarAlwaysVisible","highlightGutterLine","animatedScroll","printMarginColumn","printMargin","fadeFoldWidgets","showFoldWidgets","showLineNumbers","showGutter","displayIndentGuides","fontSize","fontFamily","maxLines","minLines","scrollPastEnd","fixedWidthGutter","foldStyle","UndoManager","$doc","hasUndo","dirtyCounter","$undoStack","$redoStack","NaN","undoSelectionRange","redoSelectionRange","hasRedo","markClean","isClean","Gutter","parentEl","$showFoldWidgets","gutterWidth","$updateAnnotations","rowInfo","annoText","gutterOffset","breakpoints","decorations","$firstLineNumber","lastLineNumber","gutterRenderer","$renderer","cell","textNode","foldWidget","minHeight","$fixedWidth","$padding","$computePadding","ceil","$showLineNumbers","setShowLineNumbers","getShowLineNumbers","paddingRight","Marker","setPadding","setMarkers","$getTop","drawFullLineMarker","drawScreenLineMarker","drawTextMarker","drawMultiLineMarker","firstRowScreen","stringBuilder","extraStyle","lineRange","extraLength","Text","$updateEolChar","EOF_CHAR","EOL_CHAR_LF","EOL_CHAR_CRLF","EOL_CHAR","TAB_CHAR","SPACE_CHAR","getLineHeight","$fontMetrics","$characterSize","getCharacterWidth","measure","$pollSizeChanges","checkForSizeChanges","$pollSizeChangesTimer","$computeTabString","$tabStrings","tabStr","$indentGuideRe","spaceClass","tabClass","spaceContent","tabContent","scrollLines","lineElements","lineElementsIdx","lineElement","$renderLine","$useLineGroups","oldConfig","fragment","$renderLinesFragment","createDocumentFragment","$textToken","rparen","lparen","$renderToken","replaceReg","replaceFunc","tabIdx","idx4","classToUse","space","output","renderIndentGuide","cols","$renderWrappedLine","onlyContents","splitChars","$renderSimpleLine","$getFoldLineTokens","addTokens","to","renderTokens","$measureNode","IE8","Cursor","blinkInterval","smoothBlinking","cursors","addCursor","$updateCursors","$updateVisibility","visibility","$updateOpacity","blinking","restartTimer","setBlinkInterval","removeCursor","intervalId","timeoutId","blink","getPixelPosition","onScreen","cursorLeft","cursorTop","$selectionMarkers","cursorIndex","pixelPos","$setOverwrite","ScrollBar","classSuffix","setVisible","skipEvent","onScroll","VScrollBar","$scrollbarWidth","setHeight","setInnerHeight","setScrollHeight","HScrollBar","setWidth","setInnerWidth","setScrollWidth","ScrollBarV","ScrollBarH","RenderLoop","onRender","pending","changes","CHAR_COUNT","FontMetrics","$setMeasureNodeStyles","$main","$testFractionalRect","isRoot","whiteSpace","font","$measureSizes","fontWeight","boldSize","charSizes","allowBoldFonts","setPolling","$measureCharWidth","GutterLayer","MarkerLayer","TextLayer","CursorLayer","editorCss","VirtualRenderer","onGutterResize","$markerBack","textLayer","$textLayer","canvas","$markerFront","$horizScroll","$vScroll","scrollBar","$scrollAnimation","scrollMargin","updateCharacterSize","$size","scrollerHeight","scrollerWidth","$dirty","$loop","$renderChanges","CHANGE_FULL","CHANGE_CURSOR","CHANGE_MARKER","CHANGE_GUTTER","CHANGE_SCROLL","CHANGE_LINES","CHANGE_TEXT","CHANGE_SIZE","CHANGE_MARKER_BACK","CHANGE_MARKER_FRONT","CHANGE_H_SCROLL","$allowBoldFonts","$updatePrintMargin","onChangeNewLineMode","$changedLines","updateFontSize","$changes","$updateSizeAsync","resizing","scrollWidth","$updateCachedSize","$extraHeight","oldSize","$showGutter","$computeLayerConfig","availableWidth","$showPrintMargin","$printMarginColumn","$animatedScroll","getShowGutter","setShowGutter","$updateGutterLineHighlight","$gutterLineHighlight","$printMarginEl","containerEl","posTop","posLeft","$composition","flint","setScrollMargin","sm","getHScrollBarAlwaysVisible","$hScrollBarAlwaysVisible","setHScrollBarAlwaysVisible","alwaysVisible","getVScrollBarAlwaysVisible","setVScrollBarAlwaysVisible","$updateScrollBarV","$scrollPastEnd","$updateScrollBarH","$frozen","unfreeze","st","marginTop","$highlightGutterLine","$updateLines","$autosize","desiredHeight","$gutterWidth","hideScrollbars","screenLines","longestLine","$getLongestLine","horizScroll","hScrollChanged","$vScrollBarAlwaysVisible","vScrollChanged","firstRowHeight","lineCount","charCount","$viewMargin","topMargin","bottomMargin","alignment","STEPS","$calcSteps","fromValue","toValue","steps","x_min","dx","initialScroll","oldSteps","$timer","canvasPos","textToScreenCoordinates","keepTextAreaAtCursor","$themeId","$theme","setMouseCursor","WorkerClient","topLevelNamespaces","classname","workerUrl","$sendDeltaQueue","changeListener","onMessage","nameToUrl","toUrl","normalizePath","$normalizePath","tlns","workerSrc","Blob","blob","blobUrl","URL","webkitURL","createObjectURL","Worker","DOMException","$workerBlob","blobURL","revokeObjectURL","callbackId","callbacks","onmessage","deltaQueue","emit","ex","attachToDocument","q","BlobBuilder","WebKitBlobBuilder","MozBlobBuilder","blobBuilder","getBlob","UIWorkerClient","messageBuffer","main","emitSync","sender","processNext","setEmitSync","Main","PlaceHolder","others","mainClass","othersClass","$onUpdate","onUpdate","$others","undoStack","$undostack","$undoStackDepth","setup","selectionBefore","other","showOtherMarkers","othersActive","hideOtherMarkers","lengthDiff","distanceFromStart","otherPos","newPos","undosRequired","isSamePoint","accel","selectionMode","isMultiSelect","onMouseSelection","screenAnchor","screenCursor","$enableJumpToDef","addSelectionMarker","oldRange","removeSelectionMarker","tmpSel","rectSel","blockSelect","newCursor","removeSelectionMarkers","rectangularRangeBlock","updateSelectionMarkers","onMouseSelectionEnd","onSelectionInterval","selectMoreLines","readonly","selectMore","multiSelect","splitIntoLines","alignCursors","multiSelectCommands","isAvailable","MultiSelect","$multiselectOnSessionChange","$onAddRange","$onRemoveRange","$onMultiSelect","$onSingleSelect","onSessionChange","$checkMultiselectChange","addAltCursorListeners","altCursor","getSelectionMarkers","$blockChangeEvents","mergeOverlappingRanges","lastRange","$initRangeList","toggleBlockSelection","includeEmptyLines","xBackwards","yBackwards","docEnd","selectionMarkerCount","markerList","$onMultiSelectExec","inVirtualMode","forEachSelection","keepOrder","$byLines","reg","cmdResult","anim","buf","additive","skip","screenLead","toRemove","tmp","words","stopAtFirst","sameRowRanges","maxCol","minSpace","spaceOffsets","spaceOffset","fr","lr","guessRange","$reAlignText","forceLeft","alignLeft","startW","textW","endW","alignRight","unAlign","isLeftAligned","isRightAligned","enableMultiselect","FoldMode","foldingStartMarker","foldingStopMarker","indentationBlock","startLevel","openingBracketBlock","closingBracketBlock","LineWidgets","widgetManager","updateOnChange","renderWidgets","measureWidgets","_changedWidgets","$onChangeEditor","_inDocument","removeLineWidget","$updateRows","noWidgets","addLineWidget","zIndex","coverGutter","pixelHeight","onWidgetChanged","changedWidgets","fixedWidth","coverLine","binarySearch","comparator","findAnnotations","oldWidget","gutterAnno","sc","arrow","Renderer","_id","getElementById","env","tagName","oldNode","createEditSession","JsonHighlightRules","MatchingBraceOutdent","openBracePos","context","SAFE_INSERT_IN_TOKENS","SAFE_INSERT_BEFORE_TOKENS","contextCache","initContext","autoInsertedBrackets","autoInsertedRow","autoInsertedLineEnd","maybeInsertedBrackets","maybeInsertedRow","maybeInsertedLineStart","maybeInsertedLineEnd","CstyleBehaviour","selected","isSaneInsertion","recordAutoInsert","recordMaybeInsert","rightChar","matching","isAutoInsertedClosing","popAutoInsertedClosing","closing","isMaybeInsertedClosing","clearMaybeInsertedClosing","next_indent","leftChar","quotepos","$matchTokenType","iterator2","BaseFoldMode","commentRegex","forceMultiline","getSectionRange","startIndent","subRange","CStyleFoldMode","$outdent","worker","searchboxCss","showReplaceForm","div","setEditor","$initElements","sb","replaceBox","searchOptions","regExpOption","caseSensitiveOption","wholeWordOption","searchInput","replaceInput","_this","activeInput","$searchBarKb","$closeSearchBarKb","Ctrl-f|Command-f|Ctrl-H|Command-Option-F","isReplace","Ctrl-G|Command-G","Ctrl-Shift-G|Command-Shift-G","findPrev","Return","Shift-Return","Alt-Return","Tab","checked","$syncOptions","noMatch","replaceAndFindNext","get_blob","Builder","MSBlobBuilder","bag","builder","endings"],"mappings":"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"} \ No newline at end of file +{ + "version": 3, + "file": "jsoneditor.map", + "sources": [ + "./dist/jsoneditor.js" + ], + "names": [ + "root", + "factory", + "exports", + "module", + "define", + "amd", + "this", + "modules", + "__webpack_require__", + "moduleId", + "installedModules", + "id", + "loaded", + "call", + "m", + "c", + "p", + "JSONEditor", + "container", + "options", + "json", + "Error", + "ieVersion", + "util", + "getInternetExplorerVersion", + "arguments", + "length", + "_create", + "treemode", + "textmode", + "modes", + "prototype", + "mode", + "setMode", + "_delete", + "set", + "get", + "setText", + "jsonText", + "parse", + "getText", + "JSON", + "stringify", + "setName", + "name", + "getName", + "data", + "extend", + "config", + "asText", + "clear", + "mixin", + "create", + "load", + "err", + "_onError", + "onError", + "log", + "error", + "registerMode", + "i", + "prop", + "isArray", + "reserved", + "Highlighter", + "History", + "SearchBox", + "Node", + "modeswitcher", + "dom", + "highlighter", + "selection", + "undefined", + "_setOptions", + "history", + "_createFrame", + "_createTable", + "frame", + "parentNode", + "removeChild", + "search", + "hasOwnProperty", + "focusNode", + "domFocus", + "Function", + "content", + "table", + "params", + "field", + "value", + "node", + "_setRoot", + "recurse", + "expand", + "appendChild", + "blur", + "getValue", + "updateField", + "focus", + "input", + "querySelector", + "menu", + "collapse", + "tbody", + "getDom", + "text", + "results", + "expandAll", + "collapseAll", + "_onAction", + "action", + "add", + "change", + "startAutoScroll", + "mouseY", + "me", + "top", + "getAbsoluteTop", + "height", + "clientHeight", + "bottom", + "margin", + "interval", + "scrollTop", + "autoScrollStep", + "scrollHeight", + "autoScrollTimer", + "setInterval", + "stopAutoScroll", + "clearTimeout", + "setSelection", + "range", + "setSelectionOffset", + "getSelection", + "getSelectionOffset", + "scrollTo", + "callback", + "editor", + "animateTimeout", + "animateCallback", + "finalScrollTop", + "Math", + "min", + "max", + "animate", + "diff", + "abs", + "setTimeout", + "onEvent", + "event", + "_onEvent", + "document", + "createElement", + "className", + "onclick", + "target", + "nodeName", + "preventDefault", + "oninput", + "onchange", + "onkeydown", + "onkeyup", + "oncut", + "onpaste", + "onmousedown", + "onmouseup", + "onmouseover", + "onmouseout", + "addEventListener", + "onfocusin", + "onfocusout", + "title", + "undo", + "_onUndo", + "redo", + "_onRedo", + "onChange", + "disabled", + "canUndo", + "canRedo", + "modeBox", + "searchBox", + "type", + "_onKeyDown", + "getNodeFromTarget", + "keynum", + "which", + "keyCode", + "ctrlKey", + "shiftKey", + "handled", + "selectContentEditable", + "select", + "previous", + "next", + "stopPropagation", + "contentOuter", + "col", + "colgroupContent", + "width", + "ace", + "indentation", + "Number", + "_ace", + "theme", + "textarea", + "clientWidth", + "buttonFormat", + "format", + "buttonCompact", + "compact", + "editorDom", + "style", + "edit", + "setTheme", + "setShowPrintMargin", + "setFontSize", + "getSession", + "setTabSize", + "setUseSoftTabs", + "setUseWrapMode", + "poweredBy", + "createTextNode", + "href", + "window", + "open", + "on", + "spellcheck", + "resize", + "force", + "sanitize", + "setValue", + "jsonlint", + "jsonString", + "validate", + "jsString", + "curr", + "charAt", + "prev", + "prevIsBrace", + "ii", + "cc", + "skipComment", + "parseString", + "quote", + "chars", + "push", + "parseKey", + "specialValues", + "key", + "regexp", + "test", + "indexOf", + "match", + "join", + "a", + "b", + "args", + "console", + "apply", + "object", + "String", + "Boolean", + "RegExp", + "isUrlRegex", + "isUrl", + "obj", + "Object", + "toString", + "getAbsoluteLeft", + "elem", + "rect", + "getBoundingClientRect", + "left", + "pageXOffset", + "scrollLeft", + "pageYOffset", + "addClassName", + "classes", + "split", + "removeClassName", + "index", + "splice", + "stripFormatting", + "divElement", + "childs", + "childNodes", + "iMax", + "child", + "removeAttribute", + "attributes", + "j", + "attribute", + "specified", + "setEndOfContentEditable", + "contentEditableElement", + "createRange", + "selectNodeContents", + "removeAllRanges", + "addRange", + "sel", + "getRangeAt", + "rangeCount", + "startContainer", + "endContainer", + "startOffset", + "endOffset", + "setStart", + "firstChild", + "setEnd", + "getInnerText", + "element", + "buffer", + "first", + "flush", + "nodeValue", + "hasChildNodes", + "innerText", + "prevChild", + "prevName", + "_ieVersion", + "rv", + "navigator", + "appName", + "ua", + "userAgent", + "re", + "exec", + "parseFloat", + "$1", + "isFirefox", + "listener", + "useCapture", + "attachEvent", + "f", + "removeEventListener", + "detachEvent", + "locked", + "highlight", + "setHighlight", + "_cancelUnhighlight", + "unhighlight", + "unhighlightTimer", + "lock", + "unlock", + "actions", + "editField", + "oldValue", + "newValue", + "editValue", + "updateValue", + "appendNode", + "parent", + "insertBeforeNode", + "insertBefore", + "beforeNode", + "insertAfterNode", + "insertAfter", + "afterNode", + "removeNode", + "append", + "duplicateNode", + "clone", + "changeType", + "oldType", + "newType", + "moveNode", + "startParent", + "moveTo", + "startIndex", + "endParent", + "endIndex", + "sort", + "hideChilds", + "oldSort", + "oldChilds", + "showChilds", + "newSort", + "newChilds", + "timestamp", + "Date", + "oldSelection", + "newSelection", + "timeout", + "delay", + "lastText", + "tr", + "td", + "divInput", + "tableInput", + "tbodySearch", + "refreshSearch", + "_onDelayedSearch", + "_onSearch", + "_onKeyUp", + "searchNext", + "searchPrevious", + "resultIndex", + "_setActiveResult", + "activeResult", + "prevNode", + "prevElem", + "searchFieldActive", + "searchValueActive", + "updateDom", + "_clearDelay", + "forceSearch", + "resultCount", + "innerHTML", + "expanded", + "setField", + "fieldEditable", + "ContextMenu", + "appendNodeFactory", + "_updateEditability", + "editable", + "path", + "unshift", + "setParent", + "getField", + "_getDomField", + "childValue", + "_getType", + "childField", + "arr", + "forEach", + "_getDomValue", + "getLevel", + "fieldInnerText", + "valueInnerText", + "cloneChilds", + "childClone", + "getAppend", + "nextTr", + "nextSibling", + "hide", + "_hasChilds", + "newTr", + "appendTr", + "updateIndexes", + "moveBefore", + "trTemp", + "AppendNode", + "currentIndex", + "toLowerCase", + "searchField", + "searchValue", + "_updateDomField", + "childResults", + "concat", + "_updateDomValue", + "offsetTop", + "focusElement", + "elementName", + "drag", + "editableDiv", + "_duplicate", + "containsNode", + "_move", + "clearDom", + "removedNode", + "_remove", + "lastTr", + "_stringCast", + "silent", + "_unescapeHTML", + "str", + "domValue", + "v", + "t", + "color", + "isEmpty", + "count", + "domField", + "oldField", + "tdDrag", + "domDrag", + "tdMenu", + "tdField", + "tree", + "_createDomTree", + "_onDragStart", + "mousemove", + "_onDrag", + "mouseup", + "_onDragEnd", + "oldCursor", + "body", + "cursor", + "mouseX", + "pageX", + "level", + "trThis", + "trPrev", + "trNext", + "trFirst", + "trLast", + "trRoot", + "nodePrev", + "nodeNext", + "topThis", + "topPrev", + "topFirst", + "heightThis", + "bottomNext", + "heightNext", + "pageY", + "moved", + "offsetHeight", + "previousSibling", + "diffX", + "diffLevel", + "round", + "levelNext", + "_isChildOf", + "n", + "_createDomField", + "domTree", + "marginLeft", + "contentEditable", + "_escapeHTML", + "_updateDomIndexes", + "_createDomValue", + "_createDomExpandButton", + "borderCollapse", + "tdExpand", + "tdSeparator", + "tdValue", + "srcElement", + "expandable", + "showContextMenu", + "_onExpand", + "offsetX", + "onKeyDown", + "nextNode", + "nextDom", + "nextDom2", + "altKey", + "_onDuplicate", + "_onRemove", + "_onInsertBefore", + "_onInsertAfter", + "lastNode", + "_lastNode", + "_getElementName", + "firstNode", + "_firstNode", + "prevElement", + "_previousElement", + "appendDom", + "nextNode2", + "_previousNode", + "nextElement", + "_nextElement", + "prevDom", + "isVisible", + "_nextNode", + "newNode", + "_onAppend", + "_onChangeType", + "_onSort", + "direction", + "order", + "firstDom", + "lastDom", + "lastChild", + "TYPE_TITLES", + "auto", + "array", + "string", + "anchor", + "onClose", + "titles", + "items", + "submenu", + "click", + "submenuTitle", + "close", + "show", + "Array", + "lower", + "num", + "numFloat", + "isNaN", + "htmlEscaped", + "replace", + "substring", + "escapedText", + "_escapeJSON", + "escaped", + "createModeSwitcher", + "current", + "switchMode", + "availableModes", + "code", + "form", + "view", + "item", + "currentMode", + "currentTitle", + "box", + "createMenuItems", + "list", + "domItems", + "separator", + "li", + "domItem", + "button", + "divIcon", + "buttonSubmenu", + "buttonExpand", + "divExpand", + "_onExpandItem", + "domSubItems", + "subItems", + "ul", + "eventListeners", + "visibleSubmenu", + "focusButton", + "overflow", + "maxHeight", + "_getVisibleButtons", + "buttons", + "expandedItem", + "subItem", + "visibleMenu", + "windowHeight", + "innerHeight", + "windowScroll", + "windowBottom", + "anchorHeight", + "menuHeight", + "mousedown", + "mousewheel", + "keydown", + "fn", + "alreadyVisible", + "padding", + "display", + "targetIndex", + "prevButton", + "nextButton", + "e", + "trAppend", + "tdAppend", + "domText", + "paddingLeft", + "parser", + "trace", + "yy", + "symbols_", + "JSONString", + "STRING", + "JSONNumber", + "NUMBER", + "JSONNullLiteral", + "NULL", + "JSONBooleanLiteral", + "TRUE", + "FALSE", + "JSONText", + "JSONValue", + "EOF", + "JSONObject", + "JSONArray", + "{", + "}", + "JSONMemberList", + "JSONMember", + ":", + ",", + "[", + "]", + "JSONElementList", + "$accept", + "$end", + "terminals_", + 2, + 4, + 6, + 8, + 10, + 11, + 14, + 17, + 18, + 21, + 22, + 23, + 24, + "productions_", + "performAction", + "yytext", + "yyleng", + "yylineno", + "yystate", + "$$", + "_$", + "$0", + "$", + 3, + 5, + 7, + 9, + 12, + 13, + 15, + 16, + 1, + 19, + 20, + 25, + "defaultActions", + "parseError", + "hash", + "popStack", + "stack", + "vstack", + "lstack", + "lex", + "token", + "self", + "lexer", + "recovering", + "TERROR", + "setInput", + "yylloc", + "yyloc", + "symbol", + "preErrorSymbol", + "state", + "r", + "len", + "newState", + "expected", + "yyval", + "errStr", + "showPosition", + "line", + "loc", + "first_line", + "last_line", + "first_column", + "last_column", + "slice", + "_input", + "_more", + "_less", + "done", + "matched", + "conditionStack", + "ch", + "lines", + "unput", + "more", + "less", + "pastInput", + "past", + "substr", + "upcomingInput", + "pre", + "tempMatch", + "rules", + "_currentRules", + "flex", + "begin", + "condition", + "popState", + "pop", + "conditions", + "topState", + "pushState", + "yy_", + "$avoiding_name_collisions", + "YY_START", + "INITIAL", + "inclusive", + "bind", + "acequire", + "isDark", + "cssClass", + "cssText", + "importCssString", + "exportAce", + "ns", + "_acequire", + "global", + "packaged", + "_define", + "original", + "ACE_NAMESPACE", + "acequirejs", + "deps", + "payload", + "payloads", + "parentId", + "l", + "dep", + "lookup", + "normalizeModule", + "moduleName", + "chunks", + "base", + "mod", + "uri", + "req", + "returnValue", + "getNativeFlags", + "regex", + "ignoreCase", + "multiline", + "extended", + "sticky", + "from", + "real", + "compliantExecNpcg", + "compliantLastIndexIncrement", + "x", + "lastIndex", + "r2", + "source", + "_xregexp", + "captureNames", + "Empty", + "doesDefinePropertyWork", + "defineProperty", + "exception", + "toInteger", + "floor", + "that", + "TypeError", + "bound", + "result", + "defineGetter", + "defineSetter", + "lookupGetter", + "lookupSetter", + "supportsAccessors", + "prototypeOfArray", + "prototypeOfObject", + "_toString", + "owns", + "__defineGetter__", + "__defineSetter__", + "__lookupGetter__", + "__lookupSetter__", + "makeArray", + "lengthBefore", + "array_splice", + "start", + "deleteCount", + "pos", + "removeCount", + "removed", + "insert", + "remove", + "tailOldPos", + "tailNewPos", + "tailCount", + "lengthAfterRemove", + "boxedString", + "splitString", + "fun", + "toObject", + "thisp", + "map", + "filter", + "every", + "some", + "reduce", + "reduceRight", + "sought", + "lastIndexOf", + "getPrototypeOf", + "__proto__", + "constructor", + "getOwnPropertyDescriptor", + "ERR_NON_OBJECT", + "property", + "descriptor", + "getter", + "setter", + "enumerable", + "configurable", + "getOwnPropertyNames", + "keys", + "createEmpty", + "empty", + "propertyIsEnumerable", + "isPrototypeOf", + "toLocaleString", + "valueOf", + "properties", + "Type", + "defineProperties", + "definePropertyWorksOnObject", + "definePropertyWorksOnDom", + "definePropertyFallback", + "ERR_NON_OBJECT_DESCRIPTOR", + "ERR_NON_OBJECT_TARGET", + "ERR_ACCESSORS_NOT_SUPPORTED", + "seal", + "freeze", + "freezeObject", + "preventExtensions", + "isSealed", + "isFrozen", + "isExtensible", + "hasDontEnumBug", + "dontEnums", + "dontEnumsLength", + "dontEnum", + "now", + "getTime", + "ws", + "trim", + "trimBeginRegexp", + "trimEndRegexp", + "o", + "XHTML_NS", + "getDocumentHead", + "doc", + "head", + "getElementsByTagName", + "documentElement", + "tag", + "createElementNS", + "hasCssClass", + "el", + "addCssClass", + "removeCssClass", + "toggleCssClass", + "setCssClass", + "include", + "hasCssString", + "sheets", + "createStyleSheet", + "styleSheets", + "owningElement", + "importCssStylsheet", + "link", + "rel", + "getInnerWidth", + "parseInt", + "computedStyle", + "getInnerHeight", + "getPageScrollTop", + "getPageScrollLeft", + "getComputedStyle", + "currentStyle", + "scrollbarWidth", + "inner", + "minWidth", + "outer", + "position", + "noScrollbar", + "offsetWidth", + "withScrollbar", + "setInnerHtml", + "innerHtml", + "cloneNode", + "replaceChild", + "setInnerText", + "textContent", + "getParentWindow", + "defaultView", + "parentWindow", + "inherits", + "ctor", + "superCtor", + "super_", + "writable", + "implement", + "proto", + "oop", + "Keys", + "ret", + "MODIFIER_KEYS", + 224, + "KEY_MODS", + "ctrl", + "alt", + "option", + "shift", + "super", + "meta", + "command", + "cmd", + "FUNCTION_KEYS", + 27, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 44, + 45, + 46, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + "-13", + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 144, + 145, + "PRINTABLE_KEYS", + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 59, + 61, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 107, + 109, + 110, + 187, + 188, + 189, + 190, + 191, + 192, + 219, + 220, + 221, + 222, + "enter", + "escape", + "esc", + "del", + "mods", + "pow", + "keyCodeToString", + "keyString", + "fromCharCode", + "OS", + "LINUX", + "MAC", + "WINDOWS", + "getOS", + "isMac", + "isLinux", + "os", + "platform", + "isWin", + "isIE", + "isOldIE", + "isGecko", + "isMozilla", + "Controllers", + "controllers", + "product", + "isOldGecko", + "isOpera", + "opera", + "isWebKit", + "isChrome", + "isAIR", + "isIPad", + "isTouchPad", + "isChromeOS", + "normalizeCommandKeys", + "hashId", + "getModifierHash", + "useragent", + "pressedKeys", + "altGr", + "location", + "keyLocation", + "ts", + "timeStamp", + "dt", + "defaultPrevented", + "addListener", + "wrapper", + "_wrapper", + "removeListener", + "stopEvent", + "cancelBubble", + "getButton", + "capture", + "eventHandler", + "releaseCaptureHandler", + "onMouseUp", + "addMouseWheelListener", + "factor", + "wheelDeltaX", + "wheelX", + "wheelY", + "wheelDeltaY", + "wheelDelta", + "deltaMode", + "DOM_DELTA_PIXEL", + "deltaX", + "deltaY", + "DOM_DELTA_LINE", + "DOM_DELTA_PAGE", + "axis", + "HORIZONTAL_AXIS", + "detail", + "addMultiMouseDownListener", + "timeouts", + "callbackName", + "startX", + "startY", + "timer", + "clicks", + "eventNames", + "isNewClick", + "clientX", + "clientY", + "_clicks", + "metaKey", + "getModifierString", + "addCommandKeyListener", + "lastKeyDownKeyCode", + "lastDefaultPrevented", + "postMessage", + "postMessageId", + "nextTick", + "win", + "messageName", + "nextFrame", + "requestAnimationFrame", + "mozRequestAnimationFrame", + "webkitRequestAnimationFrame", + "msRequestAnimationFrame", + "oRequestAnimationFrame", + "last", + "stringReverse", + "reverse", + "stringRepeat", + "stringTrimLeft", + "stringTrimRight", + "copyObject", + "copy", + "copyArray", + "deepCopy", + "cons", + "arrayToMap", + "createMap", + "props", + "arrayRemove", + "escapeRegExp", + "escapeHTML", + "getMatchOffsets", + "regExp", + "matches", + "offset", + "deferredCall", + "fcn", + "deferred", + "cancel", + "schedule", + "isPending", + "delayedCall", + "defaultTimeout", + "_self", + "lang", + "BROKEN_SETDATA", + "USE_IE_MIME_TYPE", + "TextInput", + "host", + "resetSelection", + "inComposition", + "inputHandler", + "selectionStart", + "selectionEnd", + "setSelectionRange", + "resetValue", + "PLACEHOLDER", + "syncValue", + "onContextMenuClose", + "closeTimeout", + "tempStyle", + "renderer", + "$keepTextAreaAtCursor", + "$moveTextAreaToCursor", + "setAttribute", + "wrap", + "autocorrect", + "autocapitalize", + "opacity", + "copied", + "pasted", + "isSelectionEmpty", + "isFocused", + "activeElement", + "onBlur", + "onFocus", + "syncSelection", + "isAllSelected", + "createTextRange", + "moveStart", + "moveEnd", + "ownerDocument", + "parentElement", + "inPropertyChange", + "onPropertyChange", + "syncProperty", + "sendText", + "keytable", + "onCompositionEnd", + "charCodeAt", + "onCompositionUpdate", + "onCompositionStart", + "onSelect", + "selectAll", + "setInputHandler", + "cb", + "getInputHandler", + "afterContextMenu", + "onPaste", + "execCommand", + "onTextInput", + "onInput", + "handleClipboardData", + "clipboardData", + "mime", + "setData", + "getData", + "doCopy", + "isCut", + "getCopyText", + "onCut", + "onCopy", + "onCommandKey", + "$readOnly", + "session", + "markUndoGroup", + "clearSelection", + "val", + "lastValue", + "getRange", + "setRange", + "syncComposition", + "getElement", + "setReadOnly", + "readOnly", + "onContextMenu", + "_emit", + "domEvent", + "moveToMouse", + "bringToFront", + "borderTopWidth", + "borderLeftWidth", + "maxTop", + "move", + "textInput", + "scroller", + "DefaultHandlers", + "mouseHandler", + "$clickSelection", + "setDefaultHandler", + "onMouseDown", + "onDoubleClick", + "onTripleClick", + "onQuadClick", + "onMouseWheel", + "selectByLines", + "extendSelectionBy", + "selectByWords", + "calcDistance", + "ax", + "ay", + "bx", + "by", + "sqrt", + "calcRangeOrientation", + "row", + "end", + "cmp", + "column", + "DRAG_OFFSET", + "ev", + "inSelection", + "getDocumentPosition", + "mousedownEvent", + "selectionRange", + "getSelectionRange", + "selectionEmpty", + "moveToPosition", + "time", + "$focusTimout", + "inMultiSelectMode", + "captureMouse", + "startSelect", + "setState", + "waitForClickSelection", + "screenToTextCoordinates", + "y", + "getShiftKey", + "selectToPosition", + "setCapture", + "setStyle", + "comparePoint", + "orientedRange", + "setSelectionAnchor", + "scrollCursorIntoView", + "unitName", + "cmpStart", + "cmpEnd", + "selectEnd", + "selectAllEnd", + "selectByWordsEnd", + "selectByLinesEnd", + "unsetStyle", + "releaseCapture", + "focusWait", + "distance", + "getBracketRange", + "getWordRange", + "isMultiLine", + "contains", + "getLineRange", + "getAccelKey", + "$lastScrollTime", + "isScrolable", + "isScrollableBy", + "speed", + "scrollBy", + "stop", + "Tooltip", + "isOpen", + "$element", + "$parentNode", + "$init", + "setHtml", + "html", + "setPosition", + "setClassName", + "getHeight", + "getWidth", + "GutterHandler", + "showTooltip", + "mouseEvent", + "annotation", + "gutter", + "$annotations", + "hideTooltip", + "maxRow", + "getLength", + "screenRow", + "pixelToScreenCoordinates", + "$pos", + "documentToScreenRow", + "tooltipAnnotation", + "tooltip", + "$tooltipFollowsMouse", + "moveTooltip", + "gutterElement", + "$cells", + "right", + "tooltipTimeout", + "$gutterLayer", + "GutterTooltip", + "gutterRegion", + "getRegion", + "selectTo", + "isMousePressed", + "$gutter", + "windowWidth", + "innerWidth", + "MouseEvent", + "$inSelection", + "propagationStopped", + "DragdropHandler", + "prevCursor", + "vMovement", + "hMovement", + "cursorMovedTime", + "$blockScrolling", + "moveCursorToPosition", + "cursorPointOnCaretMoved", + "SCROLL_CURSOR_HYSTERESIS", + "SCROLL_CURSOR_DELAY", + "autoScroll", + "lineHeight", + "layerConfig", + "characterWidth", + "editorRect", + "offsets", + "nearestXOffset", + "nearestYOffset", + "scrollCursor", + "vScroll", + "hScroll", + "autoScrollStartTime", + "AUTOSCROLL_DELAY", + "onDragInterval", + "dragCursor", + "addDragMarker", + "toOrientedRange", + "dragSelectionMarker", + "addMarker", + "getSelectionStyle", + "$cursorLayer", + "setBlinking", + "clearInterval", + "timerId", + "counter", + "onMouseMove", + "clearDragMarker", + "removeMarker", + "fromOrientedRange", + "isInternal", + "getReadOnly", + "onMouseMoveTimer", + "canAccept", + "dataTransfer", + "types", + "getDropEffect", + "copyAllowed", + "moveAllowed", + "copyModifierState", + "effectAllowed", + "dropEffect", + "blankImage", + "src", + "dragOperation", + "mouseTarget", + "onDragStart", + "cancelDrag", + "draggable", + "setDragImage", + "clearData", + "getTextRange", + "onDragEnd", + "setCursorStyle", + "onDragEnter", + "onDragOver", + "onDragLeave", + "onDrop", + "moveText", + "dropData", + "dragWait", + "getDragDelay", + "startDrag", + "dragWaitEnd", + "dragReadyEnd", + "cursorStyle", + "onMouseDrag", + "dragDrop", + "$dragEnabled", + "clickCount", + "eventTarget", + "unselectable", + "url", + "xhr", + "XMLHttpRequest", + "onreadystatechange", + "readyState", + "responseText", + "send", + "loadScript", + "s", + "onload", + "_", + "isAbort", + "qualifyURL", + "EventEmitter", + "_dispatchEvent", + "eventName", + "_eventRegistry", + "_defaultHandlers", + "listeners", + "defaultHandler", + "_signal", + "once", + "newCallback", + "handlers", + "_disabled_", + "old", + "removeDefaultHandler", + "capturing", + "off", + "removeAllListeners", + "init", + "scriptOptions", + "scriptUrl", + "currentScript", + "_currentScript", + "currentDocument", + "scripts", + "script", + "getAttribute", + "attr", + "deHyphenate", + "basePath", + "workerPath", + "modePath", + "themePath", + "m1", + "toUpperCase", + "net", + "suffix", + "$moduleUrls", + "all", + "moduleUrl", + "component", + "parts", + "sep", + "setModuleUrl", + "subst", + "$loading", + "loadModule", + "onLoad", + "moduleType", + "afterLoad", + "optionsProvider", + "setOptions", + "optList", + "setOption", + "getOptions", + "optionNames", + "$options", + "getOption", + "opt", + "warn", + "forwardTo", + "handlesSet", + "defaultOptions", + "defineOptions", + "initialValue", + "resetOptions", + "setDefaultValue", + "opts", + "setDefaultValues", + "optionHash", + "DefaultGutterHandler", + "MouseHandler", + "focusEditor", + "getMouseEventTarget", + "onMouseEvent", + "scrollBarV", + "scrollBarH", + "gutterEl", + "$dragDelay", + "char", + "insideStart", + "$scrollSpeed", + "mouseMoveHandler", + "releaseMouse", + "$mouseMoved", + "onCaptureEnd", + "onCaptureInterval", + "$onCaptureMouseMove", + "cancelContextMenu", + "scrollSpeed", + "dragDelay", + "dragEnabled", + "focusTimout", + "tooltipFollowsMouse", + "FoldHandler", + "fold", + "getFoldAt", + "removeFold", + "expandFold", + "foldWidgets", + "onFoldWidgetClick", + "getParentFoldRangeData", + "firstRange", + "getLine", + "addFold", + "keyUtil", + "KeyBinding", + "$editor", + "$data", + "$handlers", + "commands", + "kb", + "removeKeyboardHandler", + "$defaultHandler", + "addKeyboardHandler", + "setKeyboardHandler", + "h", + "handleKeyboard", + "attach", + "detach", + "getKeyboardHandler", + "getStatusText", + "$callKeyboardHandlers", + "toExecute", + "success", + "passEvent", + "comparePoints", + "p1", + "p2", + "Range", + "startRow", + "startColumn", + "endRow", + "endColumn", + "isEqual", + "compare", + "compareRange", + "containsRange", + "intersects", + "isEnd", + "isStart", + "inside", + "insideEnd", + "compareStart", + "compareEnd", + "compareInside", + "clipRows", + "firstRow", + "lastRow", + "fromPoints", + "collapseRows", + "toScreenRange", + "screenPosStart", + "documentToScreenPosition", + "screenPosEnd", + "moveBy", + "Selection", + "getDocument", + "lead", + "selectionLead", + "createAnchor", + "selectionAnchor", + "$isEmpty", + "$keepDesiredColumnOnChange", + "$desiredColumn", + "getCursor", + "getPosition", + "getSelectionAnchor", + "getSelectionLead", + "shiftSelection", + "columns", + "moveCursorTo", + "isBackwards", + "$moveSelection", + "mover", + "selectUp", + "moveCursorUp", + "selectDown", + "moveCursorDown", + "selectRight", + "moveCursorRight", + "selectLeft", + "moveCursorLeft", + "selectLineStart", + "moveCursorLineStart", + "selectLineEnd", + "moveCursorLineEnd", + "selectFileEnd", + "moveCursorFileEnd", + "selectFileStart", + "moveCursorFileStart", + "selectWordRight", + "moveCursorWordRight", + "selectWordLeft", + "moveCursorWordLeft", + "selectWord", + "selectAWord", + "getAWordRange", + "excludeLastChar", + "rowEnd", + "rowStart", + "foldLine", + "getFoldLine", + "selectLine", + "moveCursorBy", + "tabSize", + "getTabSize", + "isTabStop", + "firstColumnPosition", + "screenToDocumentPosition", + "beforeCursor", + "getDisplayLine", + "leadingSpace", + "$useEmacsStyleLineStart", + "lineEnd", + "getDocumentLastRowColumnPosition", + "textEnd", + "moveCursorLongWordRight", + "rightOfCursor", + "nonTokenRe", + "tokenRe", + "moveCursorLongWordLeft", + "getFoldStringAt", + "leftOfCursor", + "$shortWordEndIndex", + "whitespaceRe", + "moveCursorShortWordRight", + "moveCursorShortWordLeft", + "$selectLongWords", + "rows", + "screenPos", + "docPos", + "lineWidgets", + "keepDesiredColumn", + "moveCursorToScreen", + "desiredColumn", + "getRangeOfMovements", + "func", + "toJSON", + "ranges", + "r1", + "fromJSON", + "rangeList", + "toSingleRange", + "MAX_TOKEN_COUNT", + "Tokenizer", + "states", + "regExps", + "matchMappings", + "ruleRegExps", + "matchTotal", + "mapping", + "defaultToken", + "flag", + "splitterRurles", + "rule", + "caseInsensitive", + "adjustedregex", + "matchcount", + "reportError", + "groupCount", + "tokenArray", + "onMatch", + "$arrayTokens", + "$applyToken", + "digit", + "removeCapturingGroups", + "splitRegex", + "createSplitterRegexp", + "$setMaxTokenCount", + "values", + "tokens", + "inChClass", + "lastCapture", + "parenOpen", + "parenClose", + "square", + "getLineTokens", + "startState", + "currentState", + "matchAttempts", + "skipped", + "merge", + "msg", + "TextHighlightRules", + "$rules", + "addRules", + "prefix", + "nextState", + "getRules", + "embedRules", + "HighlightRules", + "escapeRules", + "$embeds", + "getEmbeds", + "normalizeRules", + "processState", + "processed", + "stateName", + "includeName", + "toInsert", + "noEscape", + "keywordMap", + "createKeywordMapper", + "splitChar", + "keywords", + "$keywordList", + "getKeywords", + "$keywords", + "Behaviour", + "$behaviours", + "addBehaviours", + "behaviours", + "inherit", + "getBehaviours", + "addUnicodePackage", + "pack", + "codePoint", + "packages", + "L", + "Ll", + "Lu", + "Lt", + "Lm", + "Lo", + "M", + "Mn", + "Mc", + "Me", + "N", + "Nd", + "Nl", + "No", + "P", + "Pd", + "Ps", + "Pe", + "Pi", + "Pf", + "Pc", + "Po", + "S", + "Sm", + "Sc", + "Sk", + "So", + "Z", + "Zs", + "Zl", + "Zp", + "C", + "Cc", + "Cf", + "Co", + "Cs", + "Cn", + "TokenIterator", + "initialRow", + "initialColumn", + "$session", + "$row", + "$rowTokens", + "getTokens", + "getTokenAt", + "$tokenIndex", + "stepBackward", + "stepForward", + "rowCount", + "getCurrentToken", + "getCurrentTokenRow", + "getCurrentTokenColumn", + "rowTokens", + "tokenIndex", + "unicode", + "Mode", + "$behaviour", + "getTokenizer", + "$tokenizer", + "$highlightRules", + "lineCommentStart", + "blockComment", + "toggleCommentLines", + "iter", + "ignoreBlankLines", + "shouldRemove", + "minIndent", + "Infinity", + "insertAtTabStop", + "regexpStart", + "getUseSoftTabs", + "uncomment", + "shouldInsertSpace", + "removeInLine", + "commentWithSpace", + "comment", + "insertInLine", + "testRemove", + "before", + "after", + "spaces", + "lineCommentEnd", + "regexpEnd", + "minEmptyLength", + "indent", + "toggleBlockComment", + "colDiff", + "iterator", + "initialRange", + "startRange", + "endRange", + "getNextLineIndent", + "tab", + "$getIndent", + "checkOutdent", + "autoOutdent", + "createWorker", + "createModeDelegates", + "$modes", + "delegations", + "scope", + "functionName", + "$delegator", + "method", + "transformAction", + "param", + "completionKeywords", + "ruleItr", + "aLength", + "$createKeywordList", + "getCompletions", + "word", + "score", + "$id", + "Anchor", + "$onChange", + "$clipPositionToDocument", + "$insertRight", + "delta", + "noClip", + "Document", + "$lines", + "_insertLines", + "getAllLines", + "getNewLineCharacter", + "$split", + "$detectNewLine", + "$autoNewLine", + "$newLineMode", + "setNewLineMode", + "newLineMode", + "getNewLineMode", + "isNewLine", + "getLines", + "$clipPosition", + "firstLine", + "lastLine", + "insertNewLine", + "insertLines", + "firstFullRow", + "lastFullRow", + "_removeLines", + "removeNewLine", + "newLine", + "removeLines", + "nl", + "secondLine", + "applyDeltas", + "deltas", + "revertDeltas", + "indexToPosition", + "newlineLength", + "positionToIndex", + "BackgroundTokenizer", + "tokenizer", + "running", + "currentLine", + "$worker", + "workerStart", + "endLine", + "startLine", + "processedLines", + "$tokenizeRow", + "fireUpdateEvent", + "setTokenizer", + "setDocument", + "scheduleStart", + "$updateOnChange", + "getState", + "SearchHighlight", + "clazz", + "setRegexp", + "MAX_RANGES", + "cache", + "update", + "markerLayer", + "drawSingleLineMarker", + "FoldLine", + "foldData", + "folds", + "setFoldLine", + "shiftRow", + "sameRow", + "containsRow", + "walk", + "lastEnd", + "isNewRow", + "placeholder", + "getNextFoldTo", + "kind", + "addRemoveChars", + "foldBefore", + "newFoldLine", + "foldLineNext", + "idxToPosition", + "idx", + "lastFoldEndColumn", + "RangeList", + "pointIndex", + "excludeEdges", + "addList", + "substractPoint", + "containsPoint", + "rangeAtPoint", + "clipped", + "removeAll", + "changeRange", + "lineDif", + "consumePoint", + "point", + "consumeRange", + "restorePoint", + "restoreRange", + "Fold", + "subFolds", + "subFold", + "collapseChildren", + "addSubFold", + "afterStart", + "Folding", + "side", + "getFoldsInRange", + "foldLines", + "$foldData", + "foundFolds", + "getFoldsInRangeList", + "getAllFolds", + "lastFold", + "docRow", + "startFoldLine", + "getNextFoldLine", + "getFoldedRowCount", + "$addFoldLine", + "added", + "$clipRangeToDocument", + "startFold", + "endFold", + "removeFolds", + "$useWrapMode", + "$updateWrapData", + "$updateRowLengthCache", + "$modified", + "addFolds", + "$updating", + "cloneFolds", + "foldAll", + "expandFolds", + "unfold", + "expandInner", + "isRowFolded", + "startFoldRow", + "getRowFoldEnd", + "getRowFoldStart", + "getFoldDisplayLine", + "textLine", + "lastColumn", + "$cloneFoldData", + "fd", + "toggleFold", + "tryToUnfold", + "bracketPos", + "findMatchingBracket", + "getCommentFoldRange", + "dir", + "depth", + "getFoldWidget", + "getFoldWidgetRange", + "$foldStyles", + "manual", + "markbegin", + "markbeginend", + "$foldStyle", + "setFoldStyle", + "$foldMode", + "$setFolding", + "foldMode", + "$updateFoldWidgets", + "updateFoldWidgets", + "ignoreCurrent", + "fw", + "children", + "siblings", + "$toggleFoldWidget", + "toggleFoldWidget", + "toggleParent", + "BracketMatch", + "chr", + "charBeforeCursor", + "$findClosingBracket", + "$findOpeningBracket", + "$brackets", + ")", + "(", + "bracket", + "typeRe", + "openBracket", + "valueIndex", + "closingBracket", + "valueLength", + "TextMode", + "EditSession", + "$breakpoints", + "$decorations", + "$frontMarkers", + "$backMarkers", + "$markerId", + "$undoSelect", + "onChangeFold", + "isFullWidth", + "bgTokenizer", + "resetCaches", + "$resetRowCache", + "$docRowCache", + "$screenRowCache", + "$getRowCacheIndex", + "cacheArray", + "low", + "hi", + "mid", + "$wrapData", + "$rowLengthCache", + "removedFolds", + "$updateInternalDataOnChange", + "$fromUndo", + "$undoManager", + "ignore", + "$deltasDoc", + "$deltasFold", + "$informUndoManager", + "$deltas", + "setUndoManager", + "getUndoManager", + "reset", + "undoManager", + "$syncInformUndoManager", + "group", + "execute", + "mergeUndoDeltas", + "$defaultUndoManager", + "getTabString", + "$useSoftTabs", + "$mode", + "$indentWithTabs", + "$tabSize", + "$overwrite", + "setOverwrite", + "overwrite", + "getOverwrite", + "toggleOverwrite", + "addGutterDecoration", + "removeGutterDecoration", + "getBreakpoints", + "setBreakpoints", + "clearBreakpoints", + "setBreakpoint", + "clearBreakpoint", + "inFront", + "marker", + "addDynamicMarker", + "markerId", + "markers", + "getMarkers", + "$searchHighlight", + "highlightLines", + "setAnnotations", + "annotations", + "getAnnotations", + "clearAnnotations", + "inToken", + "wordRange", + "setUseWorker", + "useWorker", + "getUseWorker", + "$useWorker", + "onReloadTokenizer", + "$modeId", + "$onChangeMode", + "$isPlaceholder", + "$stopWorker", + "$startWorker", + "attachToSession", + "wrapMethod", + "$wrapMethod", + "foldingRules", + "terminate", + "getMode", + "$scrollTop", + "setScrollTop", + "getScrollTop", + "$scrollLeft", + "setScrollLeft", + "getScrollLeft", + "getScreenWidth", + "$computeWidth", + "getLineWidgetMaxWidth", + "screenWidth", + "lineWidgetsWidth", + "w", + "lineWidgetWidth", + "$wrapLimit", + "longestScreenLine", + "foldIndex", + "foldStart", + "$getStringScreenWidth", + "undoChanges", + "dontSelect", + "lastUndoRange", + "$getUndoSelection", + "foldDelta", + "redoChanges", + "setUndoSelect", + "enable", + "isUndo", + "isInsert", + "lastDeltaIsInsert", + "fromRange", + "toPosition", + "toRange", + "rowDiff", + "collDiff", + "oldStart", + "newStart", + "indentRows", + "indentString", + "outdentRows", + "rowRange", + "deleteRange", + "size", + "$moveLines", + "$clipRowToDocument", + "MAX_VALUE", + "moveLinesUp", + "moveLinesDown", + "duplicateLines", + "$clipColumnToRow", + "$wrapLimitRange", + "useWrapMode", + "getUseWrapMode", + "setWrapLimitRange", + "adjustWrapLimit", + "desiredLimit", + "$printMargin", + "limits", + "wrapLimit", + "$constrainWrapLimit", + "getWrapLimit", + "setWrapLimit", + "limit", + "getWrapLimitRange", + "foldLineBefore", + "wrapData", + "walkTokens", + "$getDisplayTokens", + "PLACEHOLDER_START", + "PLACEHOLDER_BODY", + "$computeWrapSplits", + "CHAR", + "CHAR_EXT", + "PUNCTUATION", + "SPACE", + "TAB", + "TAB_SPACE", + "addSplit", + "displayed", + "lastSplit", + "lastDocSplit", + "splits", + "displayLength", + "isCode", + "$wrapAsCode", + "minSplit", + "getScreenTabSize", + "maxScreenColumn", + "screenColumn", + "getRowLength", + "getRowLineCount", + "getScreenLastRowColumn", + "documentToScreenColumn", + "getDocumentLastRowColumn", + "docColumn", + "getRowSplitData", + "screenToDocumentRow", + "screenToDocumentColumn", + "rowLength", + "rowCache", + "doCache", + "splitIndex", + "foldStartRow", + "wrapRow", + "screenRowOffset", + "getScreenLength", + "screenRows", + "$getWidgetScreenLength", + "$setFontMetrics", + "fm", + "destroy", + "$wrap", + "firstLineNumber", + "useSoftTabs", + "Search", + "find", + "$matchIterator", + "findAll", + "needle", + "$assembleRegExp", + "$isMultiLine", + "prevRange", + "replacement", + "preserveCase", + "backwards", + "matchIterator", + "_callback", + "$lineIterator", + "$disableFakeMultiline", + "wholeWord", + "modifier", + "caseSensitive", + "$assembleMultilineRegExp", + "skipCurrent", + "HashHandler", + "commandKeyBinding", + "addCommands", + "$singleCommand", + "MultiHashHandler", + "addCommand", + "removeCommand", + "bindKey", + "_buildKeyHash", + "keepCommand", + "ckb", + "keyId", + "cmdGroup", + "asDefault", + "keyPart", + "chain", + "binding", + "parseKeys", + "_addCommandToBinding", + "isDefault", + "removeCommands", + "bindKeys", + "keyList", + "findKeyCommand", + "$keyChain", + "CommandManager", + "byName", + "toggleRecording", + "$inReplay", + "recording", + "macro", + "$addCommandToMacro", + "oldMacro", + "replay", + "trimMacro", + "mac", + "showSettingsMenu", + "showErrorMarker", + "scrollIntoView", + "centerSelection", + "prompt", + "gotoLine", + "getAllRanges", + "findNext", + "multiSelectAction", + "findPrevious", + "aceCommandGroup", + "navigateFileStart", + "navigateUp", + "times", + "navigateFileEnd", + "navigateDown", + "navigateWordLeft", + "navigateLineStart", + "navigateLeft", + "navigateWordRight", + "navigateLineEnd", + "navigateRight", + "selectPageDown", + "scrollPageDown", + "gotoPageDown", + "selectPageUp", + "scrollPageUp", + "gotoPageUp", + "jumpToMatching", + "duplicateSelection", + "sortLines", + "modifyNumber", + "copyLinesUp", + "copyLinesDown", + "removeToLineStart", + "removeToLineEnd", + "removeWordLeft", + "removeWordRight", + "blockOutdent", + "blockIndent", + "splitLine", + "transposeLetters", + "transposeSelections", + "firstLineEndCol", + "selectedText", + "selectedCount", + "insertLine", + "curLine", + "endCol", + "newRanges", + "exitMultiSelectMode", + "defaultCommands", + "Editor", + "getContainerElement", + "getTextAreaContainer", + "keyBinding", + "$mouseHandler", + "$search", + "$historyTracker", + "$initOperationListeners", + "_$emitInputEvent", + "setSession", + "selections", + "startOperation", + "endOperation", + "$opResetTimer", + "curOp", + "docChanged", + "selectionChanged", + "prevOp", + "commadEvent", + "previousCommand", + "scrollSelectionIntoView", + "animateScrolling", + "$mergeableCommands", + "$mergeUndoDeltas", + "mergeableCommands", + "shouldMerge", + "mergeNextCommand", + "sequenceStartTime", + "keyboardHandler", + "$keybindingId", + "handler", + "oldSession", + "$onDocumentChange", + "$onTokenizerUpdate", + "$onChangeTabSize", + "$onChangeWrapLimit", + "$onChangeWrapMode", + "$onChangeFold", + "$onChangeFrontMarker", + "$onChangeBackMarker", + "$onChangeBreakpoint", + "$onChangeAnnotation", + "$onCursorChange", + "$onScrollTopChange", + "$onScrollLeftChange", + "$onSelectionChange", + "onDocumentChange", + "onChangeMode", + "onTokenizerUpdate", + "onChangeTabSize", + "onChangeWrapLimit", + "onChangeWrapMode", + "onChangeFrontMarker", + "onChangeBackMarker", + "onChangeBreakpoint", + "onChangeAnnotation", + "onCursorChange", + "onScrollTopChange", + "onScrollLeftChange", + "onSelectionChange", + "updateFull", + "oldEditor", + "cursorPos", + "onResize", + "getTheme", + "getFontSize", + "$highlightBrackets", + "$bracketHighlight", + "$highlightPending", + "getCursorPosition", + "getMatching", + "$highlightTags", + "$highlightTagPending", + "$tagHighlight", + "prevToken", + "$isFocused", + "showCursor", + "visualizeFocus", + "hideCursor", + "visualizeBlur", + "$cursorChange", + "updateCursor", + "updateLines", + "$updateHighlightActiveLine", + "scrollToY", + "scrollToX", + "$highlightActiveLine", + "$selectionStyle", + "$maxLines", + "$minLines", + "$highlightLineMarker", + "$selectionMarker", + "$highlightSelectedWord", + "$getSelectionHighLightRegexp", + "startOuter", + "endOuter", + "lineCols", + "updateFrontMarkers", + "updateBackMarkers", + "updateBreakpoints", + "updateText", + "getSelectedText", + "getBehavioursEnabled", + "transform", + "$mergeNextCommand", + "d", + "lineState", + "shouldOutdent", + "lineIndent", + "setScrollSpeed", + "getScrollSpeed", + "setDragDelay", + "setSelectionStyle", + "setHighlightActiveLine", + "shouldHighlight", + "getHighlightActiveLine", + "setHighlightGutterLine", + "getHighlightGutterLine", + "setHighlightSelectedWord", + "getHighlightSelectedWord", + "setAnimatedScroll", + "shouldAnimate", + "getAnimatedScroll", + "setShowInvisibles", + "showInvisibles", + "getShowInvisibles", + "setDisplayIndentGuides", + "getDisplayIndentGuides", + "showPrintMargin", + "getShowPrintMargin", + "setPrintMarginColumn", + "getPrintMarginColumn", + "setBehavioursEnabled", + "enabled", + "setWrapBehavioursEnabled", + "getWrapBehavioursEnabled", + "setShowFoldWidgets", + "getShowFoldWidgets", + "setFadeFoldWidgets", + "fade", + "getFadeFoldWidgets", + "new_range", + "swap", + "originalRange", + "$getSelectedRows", + "getNumberAt", + "_numberRx", + "number", + "amount", + "charRange", + "isFinite", + "nr", + "fp", + "decimals", + "nnr", + "toFixed", + "replaceRange", + "endPoint", + "inVirtualSelectionMode", + "linesMoved", + "rangeIndex", + "showComposition", + "setCompositionText", + "hideComposition", + "getFirstVisibleRow", + "getLastVisibleRow", + "isRowVisible", + "isRowFullyVisible", + "getFirstFullyVisibleRow", + "getLastFullyVisibleRow", + "$getVisibleRowCount", + "getScrollBottomRow", + "getScrollTopRow", + "$moveByPage", + "scrollToRow", + "scrollToLine", + "center", + "alignCursor", + "getCursorPositionScreen", + "matchType", + "bracketType", + "found", + "brackets", + "lineNumber", + "navigateTo", + "replaced", + "$tryReplace", + "replaceAll", + "getLastSearchOptions", + "newRange", + "preventScroll", + "revealRange", + "setAutoScrollEditorIntoView", + "shouldScroll", + "$scrollAnchor", + "scrollAnchor", + "onChangeSelection", + "onBeforeRender", + "onAfterRender", + "$pixelPos", + "$resetCursorStyle", + "$cursorStyle", + "cursorLayer", + "setSmoothBlinking", + "isBlinking", + "selectionStyle", + "highlightActiveLine", + "highlightSelectedWord", + "behavioursEnabled", + "wrapBehavioursEnabled", + "autoScrollEditorIntoView", + "hScrollBarAlwaysVisible", + "vScrollBarAlwaysVisible", + "highlightGutterLine", + "animatedScroll", + "printMarginColumn", + "printMargin", + "fadeFoldWidgets", + "showFoldWidgets", + "showLineNumbers", + "showGutter", + "displayIndentGuides", + "fontSize", + "fontFamily", + "maxLines", + "minLines", + "scrollPastEnd", + "fixedWidthGutter", + "foldStyle", + "UndoManager", + "$doc", + "hasUndo", + "dirtyCounter", + "$undoStack", + "$redoStack", + "NaN", + "undoSelectionRange", + "redoSelectionRange", + "hasRedo", + "markClean", + "isClean", + "Gutter", + "parentEl", + "$showFoldWidgets", + "gutterWidth", + "$updateAnnotations", + "rowInfo", + "annoText", + "gutterOffset", + "breakpoints", + "decorations", + "$firstLineNumber", + "lastLineNumber", + "gutterRenderer", + "$renderer", + "cell", + "textNode", + "foldWidget", + "minHeight", + "$fixedWidth", + "$padding", + "$computePadding", + "ceil", + "$showLineNumbers", + "setShowLineNumbers", + "getShowLineNumbers", + "paddingRight", + "Marker", + "setPadding", + "setMarkers", + "$getTop", + "drawFullLineMarker", + "drawScreenLineMarker", + "drawTextMarker", + "drawMultiLineMarker", + "firstRowScreen", + "stringBuilder", + "extraStyle", + "lineRange", + "extraLength", + "Text", + "$updateEolChar", + "EOF_CHAR", + "EOL_CHAR_LF", + "EOL_CHAR_CRLF", + "EOL_CHAR", + "TAB_CHAR", + "SPACE_CHAR", + "getLineHeight", + "$fontMetrics", + "$characterSize", + "getCharacterWidth", + "measure", + "$pollSizeChanges", + "checkForSizeChanges", + "$pollSizeChangesTimer", + "$computeTabString", + "$tabStrings", + "tabStr", + "$indentGuideRe", + "spaceClass", + "tabClass", + "spaceContent", + "tabContent", + "scrollLines", + "lineElements", + "lineElementsIdx", + "lineElement", + "$renderLine", + "$useLineGroups", + "oldConfig", + "fragment", + "$renderLinesFragment", + "createDocumentFragment", + "$textToken", + "rparen", + "lparen", + "$renderToken", + "replaceReg", + "replaceFunc", + "tabIdx", + "idx4", + "classToUse", + "space", + "output", + "renderIndentGuide", + "cols", + "$renderWrappedLine", + "onlyContents", + "splitChars", + "$renderSimpleLine", + "$getFoldLineTokens", + "addTokens", + "to", + "renderTokens", + "$measureNode", + "IE8", + "Cursor", + "blinkInterval", + "smoothBlinking", + "cursors", + "addCursor", + "$updateCursors", + "$updateVisibility", + "visibility", + "$updateOpacity", + "blinking", + "restartTimer", + "setBlinkInterval", + "removeCursor", + "intervalId", + "timeoutId", + "blink", + "getPixelPosition", + "onScreen", + "cursorLeft", + "cursorTop", + "$selectionMarkers", + "cursorIndex", + "pixelPos", + "$setOverwrite", + "ScrollBar", + "classSuffix", + "setVisible", + "skipEvent", + "onScroll", + "VScrollBar", + "$scrollbarWidth", + "setHeight", + "setInnerHeight", + "setScrollHeight", + "HScrollBar", + "setWidth", + "setInnerWidth", + "setScrollWidth", + "ScrollBarV", + "ScrollBarH", + "RenderLoop", + "onRender", + "pending", + "changes", + "CHAR_COUNT", + "FontMetrics", + "$setMeasureNodeStyles", + "$main", + "$testFractionalRect", + "isRoot", + "whiteSpace", + "font", + "$measureSizes", + "fontWeight", + "boldSize", + "charSizes", + "allowBoldFonts", + "setPolling", + "$measureCharWidth", + "GutterLayer", + "MarkerLayer", + "TextLayer", + "CursorLayer", + "editorCss", + "VirtualRenderer", + "onGutterResize", + "$markerBack", + "textLayer", + "$textLayer", + "canvas", + "$markerFront", + "$horizScroll", + "$vScroll", + "scrollBar", + "$scrollAnimation", + "scrollMargin", + "updateCharacterSize", + "$size", + "scrollerHeight", + "scrollerWidth", + "$dirty", + "$loop", + "$renderChanges", + "CHANGE_FULL", + "CHANGE_CURSOR", + "CHANGE_MARKER", + "CHANGE_GUTTER", + "CHANGE_SCROLL", + "CHANGE_LINES", + "CHANGE_TEXT", + "CHANGE_SIZE", + "CHANGE_MARKER_BACK", + "CHANGE_MARKER_FRONT", + "CHANGE_H_SCROLL", + "$allowBoldFonts", + "$updatePrintMargin", + "onChangeNewLineMode", + "$changedLines", + "updateFontSize", + "$changes", + "$updateSizeAsync", + "resizing", + "scrollWidth", + "$updateCachedSize", + "$extraHeight", + "oldSize", + "$showGutter", + "$computeLayerConfig", + "availableWidth", + "$showPrintMargin", + "$printMarginColumn", + "$animatedScroll", + "getShowGutter", + "setShowGutter", + "$updateGutterLineHighlight", + "$gutterLineHighlight", + "$printMarginEl", + "containerEl", + "posTop", + "posLeft", + "$composition", + "flint", + "setScrollMargin", + "sm", + "getHScrollBarAlwaysVisible", + "$hScrollBarAlwaysVisible", + "setHScrollBarAlwaysVisible", + "alwaysVisible", + "getVScrollBarAlwaysVisible", + "setVScrollBarAlwaysVisible", + "$updateScrollBarV", + "$scrollPastEnd", + "$updateScrollBarH", + "$frozen", + "unfreeze", + "st", + "marginTop", + "$highlightGutterLine", + "$updateLines", + "$autosize", + "desiredHeight", + "$gutterWidth", + "hideScrollbars", + "screenLines", + "longestLine", + "$getLongestLine", + "horizScroll", + "hScrollChanged", + "$vScrollBarAlwaysVisible", + "vScrollChanged", + "firstRowHeight", + "lineCount", + "charCount", + "$viewMargin", + "topMargin", + "bottomMargin", + "alignment", + "STEPS", + "$calcSteps", + "fromValue", + "toValue", + "steps", + "x_min", + "dx", + "initialScroll", + "oldSteps", + "$timer", + "canvasPos", + "textToScreenCoordinates", + "keepTextAreaAtCursor", + "$themeId", + "$theme", + "setMouseCursor", + "WorkerClient", + "topLevelNamespaces", + "classname", + "workerUrl", + "$sendDeltaQueue", + "changeListener", + "onMessage", + "nameToUrl", + "toUrl", + "normalizePath", + "$normalizePath", + "tlns", + "workerSrc", + "Blob", + "blob", + "blobUrl", + "URL", + "webkitURL", + "createObjectURL", + "Worker", + "DOMException", + "$workerBlob", + "blobURL", + "revokeObjectURL", + "callbackId", + "callbacks", + "onmessage", + "deltaQueue", + "emit", + "ex", + "attachToDocument", + "q", + "BlobBuilder", + "WebKitBlobBuilder", + "MozBlobBuilder", + "blobBuilder", + "getBlob", + "UIWorkerClient", + "messageBuffer", + "main", + "emitSync", + "sender", + "processNext", + "setEmitSync", + "Main", + "PlaceHolder", + "others", + "mainClass", + "othersClass", + "$onUpdate", + "onUpdate", + "$others", + "undoStack", + "$undostack", + "$undoStackDepth", + "setup", + "selectionBefore", + "other", + "showOtherMarkers", + "othersActive", + "hideOtherMarkers", + "lengthDiff", + "distanceFromStart", + "otherPos", + "newPos", + "undosRequired", + "isSamePoint", + "accel", + "selectionMode", + "isMultiSelect", + "onMouseSelection", + "screenAnchor", + "screenCursor", + "$enableJumpToDef", + "addSelectionMarker", + "oldRange", + "removeSelectionMarker", + "tmpSel", + "rectSel", + "blockSelect", + "newCursor", + "removeSelectionMarkers", + "rectangularRangeBlock", + "updateSelectionMarkers", + "onMouseSelectionEnd", + "onSelectionInterval", + "selectMoreLines", + "readonly", + "selectMore", + "multiSelect", + "splitIntoLines", + "alignCursors", + "multiSelectCommands", + "isAvailable", + "MultiSelect", + "$multiselectOnSessionChange", + "$onAddRange", + "$onRemoveRange", + "$onMultiSelect", + "$onSingleSelect", + "onSessionChange", + "$checkMultiselectChange", + "addAltCursorListeners", + "altCursor", + "getSelectionMarkers", + "$blockChangeEvents", + "mergeOverlappingRanges", + "lastRange", + "$initRangeList", + "toggleBlockSelection", + "includeEmptyLines", + "xBackwards", + "yBackwards", + "docEnd", + "selectionMarkerCount", + "markerList", + "$onMultiSelectExec", + "inVirtualMode", + "forEachSelection", + "keepOrder", + "$byLines", + "reg", + "cmdResult", + "anim", + "buf", + "additive", + "skip", + "screenLead", + "toRemove", + "tmp", + "words", + "stopAtFirst", + "sameRowRanges", + "maxCol", + "minSpace", + "spaceOffsets", + "spaceOffset", + "fr", + "lr", + "guessRange", + "$reAlignText", + "forceLeft", + "alignLeft", + "startW", + "textW", + "endW", + "alignRight", + "unAlign", + "isLeftAligned", + "isRightAligned", + "enableMultiselect", + "FoldMode", + "foldingStartMarker", + "foldingStopMarker", + "indentationBlock", + "startLevel", + "openingBracketBlock", + "closingBracketBlock", + "LineWidgets", + "widgetManager", + "updateOnChange", + "renderWidgets", + "measureWidgets", + "_changedWidgets", + "$onChangeEditor", + "_inDocument", + "removeLineWidget", + "$updateRows", + "noWidgets", + "addLineWidget", + "zIndex", + "coverGutter", + "pixelHeight", + "onWidgetChanged", + "changedWidgets", + "fixedWidth", + "coverLine", + "binarySearch", + "comparator", + "findAnnotations", + "oldWidget", + "gutterAnno", + "sc", + "arrow", + "Renderer", + "_id", + "getElementById", + "env", + "tagName", + "oldNode", + "createEditSession", + "JsonHighlightRules", + "MatchingBraceOutdent", + "openBracePos", + "context", + "SAFE_INSERT_IN_TOKENS", + "SAFE_INSERT_BEFORE_TOKENS", + "contextCache", + "initContext", + "autoInsertedBrackets", + "autoInsertedRow", + "autoInsertedLineEnd", + "maybeInsertedBrackets", + "maybeInsertedRow", + "maybeInsertedLineStart", + "maybeInsertedLineEnd", + "CstyleBehaviour", + "selected", + "isSaneInsertion", + "recordAutoInsert", + "recordMaybeInsert", + "rightChar", + "matching", + "isAutoInsertedClosing", + "popAutoInsertedClosing", + "closing", + "isMaybeInsertedClosing", + "clearMaybeInsertedClosing", + "next_indent", + "leftChar", + "quotepos", + "$matchTokenType", + "iterator2", + "BaseFoldMode", + "commentRegex", + "forceMultiline", + "getSectionRange", + "startIndent", + "subRange", + "CStyleFoldMode", + "$outdent", + "worker", + "searchboxCss", + "showReplaceForm", + "div", + "setEditor", + "$initElements", + "sb", + "replaceBox", + "searchOptions", + "regExpOption", + "caseSensitiveOption", + "wholeWordOption", + "searchInput", + "replaceInput", + "_this", + "activeInput", + "$searchBarKb", + "$closeSearchBarKb", + "Ctrl-f|Command-f|Ctrl-H|Command-Option-F", + "isReplace", + "Ctrl-G|Command-G", + "Ctrl-Shift-G|Command-Shift-G", + "findPrev", + "Return", + "Shift-Return", + "Alt-Return", + "Tab", + "checked", + "$syncOptions", + "noMatch", + "replaceAndFindNext", + "get_blob", + "Builder", + "MSBlobBuilder", + "bag", + "builder", + "endings" + ], + "mappings": "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" +} \ No newline at end of file diff --git a/daliuge-translator/dlg/dropmake/web/lg_editor.html b/daliuge-translator/dlg/dropmake/web/lg_editor.html index 7572cec19..9807f915b 100644 --- a/daliuge-translator/dlg/dropmake/web/lg_editor.html +++ b/daliuge-translator/dlg/dropmake/web/lg_editor.html @@ -1,1632 +1,1726 @@  -Logical Graph Editor - - - - - - - - - - - - - - - + + + + + + + + + function loadFromRemoteJson(lgName, node) { + //given a logical graph name, get its JSON from the server + //alert("Previous lg name = " + window.curr_lg_name); + //alert("Requesting " + lgName.toString()); + $.ajax({ + url: "/jsonbody?lg_name=" + lgName.toString(), + type: 'get', + error: function (XMLHttpRequest, textStatus, errorThrown) { + if (404 == XMLHttpRequest.status) { + alert('Server cannot locate logical graph file ' + lgName.toString()) + } else { + alert('status:' + XMLHttpRequest.status + ', status text: ' + XMLHttpRequest.statusText); + } + }, + success: function (data) { + //console.log(data); + myDiagram.model = go.Model.fromJson(data); + save(); + window.curr_lg_name = lgName; + window.curr_lg_node = node; + //console.log(window.curr_lg_name); + //var loadButton = document.getElementById("LoadButton"); + if (window.load_button) { + window.load_button.disabled = true; + } + } + }); + } + + // add an SVG rendering of the diagram at the end of this page + function makeSVG() { + var svg = myDiagram.makeSvg({ + scale: 1.0 + }); + svg.style.border = "1px solid black"; + obj = document.getElementById("SVGArea"); + obj.appendChild(svg); + if (obj.children.length > 0) { + obj.replaceChild(svg, obj.children[0]); + } + } + + function makePNG() { + var svg = myDiagram.makeImage({ + scale: 1.0, + background: "White", + details: 1.0 + }); + svg.style.border = "1px solid black"; + obj = document.getElementById("SVGArea"); + obj.appendChild(svg); + if (obj.children.length > 0) { + obj.replaceChild(svg, obj.children[0]); + } + } + + function setButtonStatus(obj) { + btt = document.getElementById("pngButton"); + if ("PNG" == obj.innerHTML) { + btt.disabled = false; + } else { + btt.disabled = true; + } + } + + function makeInspector() { + //alert("inspector is called"); + var alist = ["location", "clean"]; + var inspector = new Inspector('myInspector', myDiagram, + { + acceptButton: true, + resetButton: true, + + + /* + propertyNames: { + "Node": alist + }, + */ + + + + + // example predicate, only show data objects: + inspectPredicate: function (value) { + return !(value instanceof go.GraphObject) + } + + + }); + + + window.inspector = inspector; + } + +
        -
        +

        Palette

        - +
        -
        +
        - +
        -
        +
        - +
        -
        +
        - +
        -
        +
        @@ -1673,16 +1767,16 @@ - + @@ -1694,58 +1788,58 @@ - + - + - - - + + --> - + - + - - + + @@ -1758,147 +1852,148 @@ - - + + - - - + + +
        - +
        Minimise data movement and balance loads given the number of nodes
        # of nodes # of nodes
        Node label - +
        + Edge cut + Total Communication Volume +
        Load balancing%Load balancing%
        - - - + + + - +
        Minimise execution time and resources given node capacitiesMinimise execution time and resources given node capacities
        Node label - +
        CPUs per node -   +  
        Memory per node -  Megabytes +  Megabytes
        - - + + - - + +
        @@ -1910,72 +2005,78 @@
        - +

        Logical Graphs

        -
          +
            -
            +
            -
            - - - - - - - Mouse-over a Node to view its ports. - Drag from these ports to create new Links. - Selecting a Node and then clicking its TextBlock will allow - you to edit text (except on the Start and End Nodes).
            Any issues please email chen DOT wu AT icrar DOT org - - - - +
            + + + + + + + Mouse-over a Node to view its ports. + Drag from these ports to create new Links. + Selecting a Node and then clicking its TextBlock will allow + you to edit text (except on the Start and End Nodes).
            Any issues please email chen DOT wu AT icrar DOT org + + + +
            diff --git a/daliuge-translator/dlg/dropmake/web/lg_web.py b/daliuge-translator/dlg/dropmake/web/lg_web.py index 41e86b9d7..f9fdb82d9 100644 --- a/daliuge-translator/dlg/dropmake/web/lg_web.py +++ b/daliuge-translator/dlg/dropmake/web/lg_web.py @@ -26,13 +26,15 @@ import logging import optparse import os -import traceback import signal import sys import threading import time +import traceback import warnings +import bottle +import pkg_resources from bottle import ( route, request, @@ -43,14 +45,12 @@ response, HTTPResponse, ) -import bottle -import pkg_resources -from ... import common, restutils -from ...clients import CompositeManagerClient from ..pg_generator import unroll, partition, GraphException from ..pg_manager import PGManager from ..scheduler import SchedulerException +from ... import common, restutils +from ...clients import CompositeManagerClient def file_as_string(fname, enc="utf8"): @@ -376,7 +376,7 @@ def gen_pgt(): pgt_view_json_name=pgt_id, partition_info=part_info, title="Physical Graph Template%s" - % ("" if num_partitions == 0 else "Partitioning"), + % ("" if num_partitions == 0 else "Partitioning"), ) except GraphException as ge: response.status = 500 @@ -584,6 +584,7 @@ def format_epilog(self, formatter): # Simple and easy def handler(*_args): raise KeyboardInterrupt + signal.signal(signal.SIGTERM, handler) signal.signal(signal.SIGINT, handler) diff --git a/daliuge-translator/dlg/dropmake/web/matrix_vis.html b/daliuge-translator/dlg/dropmake/web/matrix_vis.html index 1f12d03df..6d7f3ca48 100644 --- a/daliuge-translator/dlg/dropmake/web/matrix_vis.html +++ b/daliuge-translator/dlg/dropmake/web/matrix_vis.html @@ -1,192 +1,203 @@ - - - - + + + - - - diff --git a/daliuge-translator/dlg/dropmake/web/pg_viewer.html b/daliuge-translator/dlg/dropmake/web/pg_viewer.html index 553b77d4c..1de0b3fca 100644 --- a/daliuge-translator/dlg/dropmake/web/pg_viewer.html +++ b/daliuge-translator/dlg/dropmake/web/pg_viewer.html @@ -1,575 +1,586 @@ -Physical Graph Template Viewer - - - - - - - + + + + function rebuildGraph() { + var minNodes = document.getElementById("minNodes").value; + minNodes = parseInt(minNodes, 10); + + var maxNodes = document.getElementById("maxNodes").value; + maxNodes = parseInt(maxNodes, 10); + + generateDigraph(minNodes, maxNodes); + } + + function generateDigraph(minNodes, maxNodes) { + myDiagram.startTransaction("generateDigraph"); + // replace the diagram's model's nodeDataArray + generateNodes(minNodes, maxNodes); + // replace the diagram's model's linkDataArray + generateLinks(); + // force a diagram layout + layout(); + myDiagram.commitTransaction("generateDigraph"); + } + + // Creates a random number of randomly colored nodes. + function generateNodes(minNodes, maxNodes) { + var nodeArray = []; + // get the values from the fields and create a random number of nodes within the range + var min = parseInt(minNodes, 10); + var max = parseInt(maxNodes, 10); + if (isNaN(min)) min = 0; + if (isNaN(max) || max < min) max = min; + var numNodes = Math.floor(Math.random() * (max - min + 1)) + min; + var i; + for (i = 0; i < numNodes; i++) { + var cat; + if (i % 2 == 0) { + cat = "Data" + } else { + cat = "Component" + } + nodeArray.push({ + key: i, + text: i.toString(), + //fill: go.Brush.randomColor(), + category: cat + }); + } + + // randomize the node data + for (i = 0; i < nodeArray.length; i++) { + var swap = Math.floor(Math.random() * nodeArray.length); + var temp = nodeArray[swap]; + nodeArray[swap] = nodeArray[i]; + nodeArray[i] = temp; + } + + // set the nodeDataArray to this array of objects + myDiagram.model.nodeDataArray = nodeArray; + } + + // Create some link data + function generateLinks() { + if (myDiagram.nodes.count < 2) return; + var linkArray = []; + var nit = myDiagram.nodes; + var nodes = new go.List(go.Node); + nodes.addAll(nit); + for (var i = 0; i < nodes.count - 1; i++) { + var from = nodes.elt(i); + var numto = Math.floor(1 + (Math.random() * 3) / 2); + for (var j = 0; j < numto; j++) { + var idx = Math.floor(i + 5 + Math.random() * 10); + if (idx >= nodes.count) idx = i + (Math.random() * (nodes.count - i)) | 0; + var to = nodes.elt(idx); + linkArray.push({from: from.data.key, to: to.data.key}); + } + } + myDiagram.model.linkDataArray = linkArray; + } + + function layout() { + myDiagram.startTransaction("change Layout"); + var lay = myDiagram.layout; + + var direction = getRadioValue("direction"); + direction = parseFloat(direction, 10); + lay.direction = direction; + + //var layerSpacing = document.getElementById("layerSpacing").value; + var layerSpacing = 25; //parseFloat(layerSpacing, 10); + lay.layerSpacing = layerSpacing; + + //var columnSpacing = document.getElementById("columnSpacing").value; + var columnSpacing = 25; //parseFloat(columnSpacing, 10); + lay.columnSpacing = columnSpacing; + + /* + var cycleRemove = getRadioValue("cycleRemove"); + if (cycleRemove === "CycleDepthFirst") lay.cycleRemoveOption = go.LayeredDigraphLayout.CycleDepthFirst; + else if (cycleRemove === "CycleGreedy") lay.cycleRemoveOption = go.LayeredDigraphLayout.CycleGreedy; + */ + lay.cycleRemoveOption = go.LayeredDigraphLayout.CycleDepthFirst; + + /* + var layering = getRadioValue("layering"); + if (layering === "LayerOptimalLinkLength") lay.layeringOption = go.LayeredDigraphLayout.LayerOptimalLinkLength; + else if (layering === "LayerLongestPathSource") lay.layeringOption = go.LayeredDigraphLayout.LayerLongestPathSource; + else if (layering === "LayerLongestPathSink") lay.layeringOption = go.LayeredDigraphLayout.LayerLongestPathSink; + */ + lay.layeringOption = go.LayeredDigraphLayout.LayerOptimalLinkLength; + + /* + var initialize = getRadioValue("initialize"); + if (initialize === "InitDepthFirstOut") lay.initializeOption = go.LayeredDigraphLayout.InitDepthFirstOut; + else if (initialize === "InitDepthFirstIn") lay.initializeOption = go.LayeredDigraphLayout.InitDepthFirstIn; + else if (initialize === "InitNaive") lay.initializeOption = go.LayeredDigraphLayout.InitNaive; + */ + lay.initializeOption = go.LayeredDigraphLayout.InitDepthFirstIn; + + /* + var aggressive = getRadioValue("aggressive"); + if (aggressive === "AggressiveLess") lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveLess; + else if (aggressive === "AggressiveNone") lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveNone; + else if (aggressive === "AggressiveMore") lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveMore; + */ + lay.aggressiveOption = go.LayeredDigraphLayout.AggressiveLess; + + //TODO implement pack option + var pack = document.getElementsByName("pack"); + var packing = 0; + for (var i = 0; i < pack.length; i++) { + if (pack[i].checked) packing = packing | parseInt(pack[i].value, 10); + } + lay.packOption = packing; + + /* + var setsPortSpots = document.getElementById("setsPortSpots"); + lay.setsPortSpots = setsPortSpots.checked; + */ + lay.setsPortSpots = true; + + myDiagram.commitTransaction("change Layout"); + } + + function getRadioValue(name) { + var radio = document.getElementsByName(name); + for (var i = 0; i < radio.length; i++) + if (radio[i].checked) return radio[i].value; + } + + function genGanttChart() { + url = "/show_gantt_chart?pgt_id={{pgt_view_json_name}}" + window.open(url) + } + + function genScheduleChart() { + url = "/show_schedule_mat?pgt_id={{pgt_view_json_name}}" + window.open(url) + } + + function makePNG() { + //zoomToFit(); + + //var svg = myDiagram.makeSvg({ + var rect_w = myDiagram.viewportBounds.width; + var rect_h = myDiagram.viewportBounds.height; + var img_w = myDiagram.documentBounds.width; + var img_h = myDiagram.documentBounds.height; + + w_ratio = rect_w / img_w; + h_ratio = rect_h / img_h; + + var scale_f = Math.min(1.0, Math.min(w_ratio, h_ratio)); + + var svg = myDiagram.makeImage({ + scale: scale_f, + background: "White", + details: 1.0 + }); + svg.style.border = "1px solid black"; + obj = document.getElementById("SVGArea"); + obj.appendChild(svg); + if (obj.children.length > 0) { + obj.replaceChild(svg, obj.children[0]); + } + } + + function zoomToFit() { + myDiagram.zoomToFit() + // console.log(myDiagram.viewportBounds.width.toString()); + // console.log('\n'); + // console.log(myDiagram.viewportBounds.height.toString()); + // console.log('\n -----'); + // console.log(myDiagram.documentBounds.width.toString()); + // console.log('\n'); + // console.log(myDiagram.documentBounds.height.toString()); + } + +
            -
            +
            - {{title}}
            {{partition_info}}
            - + {{title}}
            {{partition_info}}
            +
            - + Rotate: - Right (0) - Down (90) - Left (180) - Up (270)
            - + Right (0) + Down (90) + Left (180) + Up (270)
            + Pack: - PackMedian - PackStraighten - PackExpand
            - + PackMedian + PackStraighten + PackExpand
            +
            -
            -
            -
            - -
            -
            - - - - -
            +
            +
            +
            + +
            +
            + + + + +
            -
            +
            -
            +


            -
            - - DALiuGE Manager host: - - DALiuGE Manager port: -
            - - + + + DALiuGE Manager host: + + DALiuGE Manager port: +
            + +
            -
            +
            diff --git a/daliuge-translator/dlg/translator/__init__.py b/daliuge-translator/dlg/translator/__init__.py index b6940c8bf..e7c6fa8b8 100644 --- a/daliuge-translator/dlg/translator/__init__.py +++ b/daliuge-translator/dlg/translator/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 76b33bb62..f98369e58 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -56,8 +56,8 @@ def unroll(lg_path, oid_prefix, zerorun=False, app=None): _param_types = {'min_goal': int, 'ptype': int, 'max_load_imb': int, - 'max_cpu': int, 'time_greedy': float, 'deadline': int, - 'topk': int, 'swarm_size': int, 'max_mem': int} + 'max_cpu': int, 'time_greedy': float, 'deadline': int, + 'topk': int, 'swarm_size': int, 'max_mem': int} def parse_partition_algo_params(algo_params): @@ -72,13 +72,12 @@ def parse_partition_algo_params(algo_params): def partition(pgt, opts): - from ..dropmake import pg_generator algo_params = parse_partition_algo_params(opts.algo_params or []) pg = pg_generator.partition(pgt, algo=opts.algo, num_partitions=opts.partitions, - num_islands=opts.islands, partition_label='partition', - **algo_params) + num_islands=opts.islands, partition_label='partition', + **algo_params) logger.info("PG spec is calculated!") return pg @@ -104,6 +103,7 @@ def _setup_output(opts): def dump(obj): with _open_o(opts.output) as f: json.dump(obj, f, indent=None if opts.format is None else 2) + return dump @@ -151,9 +151,12 @@ def _add_unroll_options(parser): parser.add_option('-p', '--oid-prefix', action="store", dest='oid_prefix', type="string", help='Prefix to use for generated OIDs', default='1') parser.add_option("-z", "--zerorun", action="store_true", - dest="zerorun", help="Generate a Physical Graph Template that takes no time to run", default=False) + dest="zerorun", help="Generate a Physical Graph Template that takes no time to run", + default=False) parser.add_option("--app", action="store", type="int", - dest="app", help="Force an app to be used in the Physical Graph. 0=Don't force, 1=SleepApp, 2=SleepAndCopy", default=0) + dest="app", + help="Force an app to be used in the Physical Graph. 0=Don't force, 1=SleepApp, 2=SleepAndCopy", + default=0) apps = ( None, 'dlg.apps.simple.SleepApp', @@ -163,7 +166,6 @@ def _add_unroll_options(parser): def dlg_unroll(parser, args): - # Unroll Logical Graph tool.add_logging_options(parser) _add_output_options(parser) @@ -176,7 +178,6 @@ def dlg_unroll(parser, args): def _add_partition_options(parser): - from ..dropmake import pg_generator parser.add_option("-N", "--partitions", action="store", type="int", dest="partitions", help="Number of partitions to generate", default=1) @@ -189,7 +190,6 @@ def _add_partition_options(parser): def dlg_partition(parser, args): - tool.add_logging_options(parser) _add_output_options(parser) _add_partition_options(parser) @@ -206,7 +206,6 @@ def dlg_partition(parser, args): def dlg_unroll_and_partition(parser, args): - tool.add_logging_options(parser) _add_output_options(parser) apps = _add_unroll_options(parser) @@ -220,7 +219,6 @@ def dlg_unroll_and_partition(parser, args): def dlg_map(parser, args): - from .. import constants tool.add_logging_options(parser) @@ -228,11 +226,13 @@ def dlg_map(parser, args): parser.add_option('-H', '--host', action='store', dest='host', help='The host we connect to to deploy the graph', default='localhost') parser.add_option("-p", "--port", action="store", type="int", - dest='port', help='The port we connect to to deploy the graph', default=constants.ISLAND_DEFAULT_REST_PORT) + dest='port', help='The port we connect to to deploy the graph', + default=constants.ISLAND_DEFAULT_REST_PORT) parser.add_option('-P', '--physical-graph-template', action='store', dest='pgt_path', type='string', help='Path to the Physical Graph to submit (default: stdin)', default='-') parser.add_option("-N", "--nodes", action="store", - dest="nodes", help="The nodes where the Physical Graph will be distributed, comma-separated", default=None) + dest="nodes", help="The nodes where the Physical Graph will be distributed, comma-separated", + default=None) parser.add_option("-i", "--islands", action="store", type="int", dest="islands", help="Number of islands to use during the partitioning", default=1) (opts, args) = parser.parse_args(args) @@ -259,7 +259,6 @@ def dlg_map(parser, args): def dlg_submit(parser, args): - from ..manager import constants # Submit Physical Graph @@ -267,7 +266,8 @@ def dlg_submit(parser, args): parser.add_option('-H', '--host', action='store', dest='host', help='The host we connect to to deploy the graph', default='localhost') parser.add_option("-p", "--port", action="store", type="int", - dest='port', help='The port we connect to to deploy the graph', default=constants.ISLAND_DEFAULT_REST_PORT) + dest='port', help='The port we connect to to deploy the graph', + default=constants.ISLAND_DEFAULT_REST_PORT) parser.add_option('-P', '--physical-graph', action='store', dest='pg_path', type='string', help='Path to the Physical Graph to submit (default: stdin)', default='-') parser.add_option('-s', '--session-id', action='store', dest='session_id', type='string', @@ -284,6 +284,7 @@ def dlg_submit(parser, args): with _open_i(opts.pg_path) as f: submit(json.load(f), opts) + def register_commands(): tool.cmdwrap('lgweb', 'A Web server for the Logical Graph Editor', 'dlg.dropmake.web.lg_web:run') tool.cmdwrap('submit', 'Submits a Physical Graph to a Drop Manager', dlg_submit) @@ -291,4 +292,4 @@ def register_commands(): tool.cmdwrap('unroll', 'Unrolls a Logical Graph into a Physical Graph Template', dlg_unroll) tool.cmdwrap('partition', 'Divides a Physical Graph Template into N logical partitions', dlg_partition) tool.cmdwrap('unroll-and-partition', 'unroll + partition', dlg_unroll_and_partition) - tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', fill) \ No newline at end of file + tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', fill) diff --git a/daliuge-translator/setup.py b/daliuge-translator/setup.py index 71ee88c39..e0b574e32 100644 --- a/daliuge-translator/setup.py +++ b/daliuge-translator/setup.py @@ -107,7 +107,7 @@ def write_version_info(): license="LGPLv2+", install_requires=install_requires, packages=find_packages(), - entry_points = { + entry_points={ 'dlg.tool_commands': ['translator=dlg.translator.tool_commands'] }, test_suite="test", diff --git a/daliuge-translator/test/__init__.py b/daliuge-translator/test/__init__.py index c5c2f0ace..6a270caa5 100644 --- a/daliuge-translator/test/__init__.py +++ b/daliuge-translator/test/__init__.py @@ -21,7 +21,6 @@ # def __setupTestLogging(): - import os import logging @@ -34,5 +33,6 @@ def __setupTestLogging(): else: logging.root.addHandler(logging.NullHandler()) + __setupTestLogging() -del __setupTestLogging \ No newline at end of file +del __setupTestLogging diff --git a/daliuge-translator/test/dropmake/__init__.py b/daliuge-translator/test/dropmake/__init__.py index ffd5442f9..7a76cffec 100644 --- a/daliuge-translator/test/dropmake/__init__.py +++ b/daliuge-translator/test/dropmake/__init__.py @@ -18,4 +18,4 @@ # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -# \ No newline at end of file +# diff --git a/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json b/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json index 774fba021..c863efce4 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json +++ b/daliuge-translator/test/dropmake/logical_graphs/chiles_simple.json @@ -1,58 +1,822 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Start", "text":"Start", "key":-14, "loc":"-679.999999999993 -276.0000000000005"}, -{"category":"Comment", "text":"Chiles Simple LG:\ndata partition is explicit ", "key":-10, "loc":"266.7812500000001 -548"}, -{"category":"Comment", "text":"Split by freq", "key":-23, "loc":"-182.21874999999972 -582.0000000000006"}, -{"category":"memory", "text":"Day1", "data_volume":100, "key":-25, "loc":"-507.328125 -539"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-26, "loc":"-316.328125 -539"}, -{"category":"memory", "text":"Day1-Split1", "data_volume":5, "key":-27, "loc":"-76.328125 -539"}, -{"category":"memory", "text":"Data", "data_volume":30, "key":-3, "loc":"295.671875 -266"}, -{"category":"Component", "text":"CLEAN", "execution_time":100, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"148.671875 -261"}, -{"category":"memory", "text":"Day2", "data_volume":100, "key":-11, "loc":"-514.328125 -401"}, -{"category":"memory", "text":"Day3", "data_volume":100, "key":-12, "loc":"-516.328125 -292"}, -{"category":"memory", "text":"Day4", "data_volume":100, "key":-13, "loc":"-521.328125 -176"}, -{"category":"memory", "text":"Day5", "data_volume":100, "key":-15, "loc":"-514.328125 -92"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-16, "loc":"-319.328125 -397"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-17, "loc":"-326.328125 -300"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-18, "loc":"-321.328125 -189"}, -{"category":"Component", "text":"MST", "execution_time":20, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-19, "loc":"-333.328125 -90"}, -{"category":"memory", "text":"Day2-Split1", "data_volume":5, "key":-20, "loc":"-73.328125 -386"}, -{"category":"memory", "text":"Day3-Split1", "data_volume":5, "key":-21, "loc":"-70.328125 -281"}, -{"category":"memory", "text":"Day4-Split1", "data_volume":5, "key":-22, "loc":"-79.328125 -182"}, -{"category":"memory", "text":"Day5-Split1", "data_volume":5, "key":-24, "loc":"-81.328125 -87"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%{param1}", "key":-28, "loc":"-628.328125 -603"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%param2", "key":-29, "loc":"-626.328125 -488"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%{param1.param2}", "key":-30, "loc":"-624.328125 -374"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"%{param4.what}", "key":-31, "loc":"-606.328125 -258"}, -{"category":"Component", "text":"Copy", "execution_time":15, "group_start":0, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-32, "loc":"-608.328125 -153"} - ], - "linkDataArray": [ -{"from":-25, "to":-26, "fromPort":"R", "toPort":"L", "points":[-474.9240474700928,-539,-464.9240474700928,-539,-407.61230754852295,-539,-407.61230754852295,-539,-350.3005676269531,-539,-340.3005676269531,-539]}, -{"from":-26, "to":-27, "fromPort":"R", "toPort":"L", "points":[-292.3556823730469,-539,-282.3556823730469,-539,-214.5426845550537,-539,-214.5426845550537,-539,-146.72968673706055,-539,-136.72968673706055,-539]}, -{"from":-2, "to":-3, "fromPort":"R", "toPort":"L", "points":[181.61353302001953,-261,191.61353302001953,-261,223.46294689178467,-261,223.46294689178467,-266,255.3123607635498,-266,265.3123607635498,-266]}, -{"from":-27, "to":-2, "fromPort":"R", "toPort":"T", "points":[-15.926563262939453,-539,-5.926563262939453,-539,148.671875,-539,148.671875,-413.21886215209963,148.671875,-287.4377243041992,148.671875,-277.4377243041992]}, -{"from":-11, "to":-16, "fromPort":"R", "toPort":"L", "points":[-481.9240474700928,-401,-471.9240474700928,-401,-412.61230754852295,-401,-412.61230754852295,-397,-353.3005676269531,-397,-343.3005676269531,-397]}, -{"from":-12, "to":-17, "fromPort":"R", "toPort":"L", "points":[-483.9240474700928,-292,-473.9240474700928,-292,-417.11230754852295,-292,-417.11230754852295,-300,-360.3005676269531,-300,-350.3005676269531,-300]}, -{"from":-13, "to":-18, "fromPort":"R", "toPort":"L", "points":[-488.9240474700928,-176,-478.9240474700928,-176,-417.11230754852295,-176,-417.11230754852295,-189,-355.3005676269531,-189,-345.3005676269531,-189]}, -{"from":-15, "to":-19, "fromPort":"R", "toPort":"L", "points":[-481.9240474700928,-92,-471.9240474700928,-92,-419.61230754852295,-92,-419.61230754852295,-90,-367.3005676269531,-90,-357.3005676269531,-90]}, -{"from":-16, "to":-20, "fromPort":"R", "toPort":"L", "points":[-295.3556823730469,-397,-285.3556823730469,-397,-214.5426845550537,-397,-214.5426845550537,-386,-143.72968673706055,-386,-133.72968673706055,-386]}, -{"from":-17, "to":-21, "fromPort":"R", "toPort":"L", "points":[-302.3556823730469,-300,-292.3556823730469,-300,-216.5426845550537,-300,-216.5426845550537,-281,-140.72968673706055,-281,-130.72968673706055,-281]}, -{"from":-18, "to":-22, "fromPort":"R", "toPort":"L", "points":[-297.3556823730469,-189,-287.3556823730469,-189,-218.5426845550537,-189,-218.5426845550537,-182,-149.72968673706055,-182,-139.72968673706055,-182]}, -{"from":-19, "to":-24, "fromPort":"R", "toPort":"L", "points":[-309.3556823730469,-90,-299.3556823730469,-90,-225.5426845550537,-90,-225.5426845550537,-87,-151.72968673706055,-87,-141.72968673706055,-87]}, -{"from":-20, "to":-2, "fromPort":"R", "toPort":"L", "points":[-12.926563262939453,-386,-2.926563262939453,-386,51.40182685852051,-386,51.40182685852051,-261,105.73021697998047,-261,115.73021697998047,-261]}, -{"from":-21, "to":-2, "fromPort":"R", "toPort":"L", "points":[-9.926563262939453,-281,0.07343673706054688,-281,52.90182685852051,-281,52.90182685852051,-261,105.73021697998047,-261,115.73021697998047,-261]}, -{"from":-22, "to":-2, "fromPort":"R", "toPort":"B", "points":[-18.926563262939453,-182,-8.926563262939453,-182,148.671875,-182,148.671875,-208.28113784790037,148.671875,-234.56227569580076,148.671875,-244.56227569580076]}, -{"from":-24, "to":-2, "fromPort":"R", "toPort":"B", "points":[-20.926563262939453,-87,-10.926563262939453,-87,148.671875,-87,148.671875,-160.78113784790037,148.671875,-234.56227569580076,148.671875,-244.56227569580076]}, -{"from":-14, "to":-28, "fromPort":"T", "toPort":"L", "points":[-679.999999999993,-296.0000000000005,-679.999999999993,-306.0000000000005,-679.999999999993,-603,-671.9698944091762,-603,-663.9397888183594,-603,-653.9397888183594,-603]}, -{"from":-28, "to":-25, "fromPort":"R", "toPort":"T", "points":[-602.7164611816406,-603,-592.7164611816406,-603,-507.328125,-603,-507.328125,-584.2188621520996,-507.328125,-565.4377243041993,-507.328125,-555.4377243041993]}, -{"from":-14, "to":-29, "fromPort":"T", "toPort":"L", "points":[-679.999999999993,-296.0000000000005,-679.999999999993,-306.0000000000005,-679.999999999993,-488.00000000000006,-670.9698944091762,-488.00000000000006,-661.9397888183594,-488.00000000000006,-651.9397888183594,-488.00000000000006]}, -{"from":-14, "to":-30, "fromPort":"T", "toPort":"L", "points":[-679.999999999993,-296.0000000000005,-679.999999999993,-306.0000000000005,-679.999999999993,-374.00000000000006,-669.9698944091762,-374.00000000000006,-659.9397888183594,-374.00000000000006,-649.9397888183594,-374.00000000000006]}, -{"from":-14, "to":-31, "fromPort":"R", "toPort":"L", "points":[-646.0998840331961,-276.0000000000005,-636.0998840331961,-276.0000000000005,-636.0998840331961,-267.0000000000003,-641.9397888183594,-267.0000000000003,-641.9397888183594,-258.00000000000006,-631.9397888183594,-258.00000000000006]}, -{"from":-14, "to":-32, "fromPort":"B", "toPort":"L", "points":[-679.999999999993,-256.0000000000005,-679.999999999993,-246.0000000000005,-679.999999999993,-153.00000000000006,-661.9698944091762,-153.00000000000006,-643.9397888183594,-153.00000000000006,-633.9397888183594,-153.00000000000006]}, -{"from":-31, "to":-13, "fromPort":"R", "toPort":"L", "points":[-580.7164611816406,-258.00000000000006,-570.7164611816406,-258.00000000000006,-567.2243318557739,-258.00000000000006,-567.2243318557739,-176,-563.7322025299072,-176,-553.7322025299072,-176]}, -{"from":-29, "to":-11, "fromPort":"R", "toPort":"L", "points":[-600.7164611816406,-488.00000000000006,-590.7164611816406,-488.00000000000006,-573.7243318557739,-488.00000000000006,-573.7243318557739,-401,-556.7322025299072,-401,-546.7322025299072,-401]}, -{"from":-30, "to":-12, "fromPort":"R", "toPort":"L", "points":[-598.7164611816406,-374.00000000000006,-588.7164611816406,-374.00000000000006,-573.7243318557739,-374.00000000000006,-573.7243318557739,-292,-558.7322025299072,-292,-548.7322025299072,-292]}, -{"from":-32, "to":-15, "fromPort":"R", "toPort":"L", "points":[-582.7164611816406,-153.00000000000006,-572.7164611816406,-153.00000000000006,-564.7243318557739,-153.00000000000006,-564.7243318557739,-92,-556.7322025299072,-92,-546.7322025299072,-92]} - ]} + "nodeDataArray": [ + { + "category": "Start", + "text": "Start", + "key": -14, + "loc": "-679.999999999993 -276.0000000000005" + }, + { + "category": "Comment", + "text": "Chiles Simple LG:\ndata partition is explicit ", + "key": -10, + "loc": "266.7812500000001 -548" + }, + { + "category": "Comment", + "text": "Split by freq", + "key": -23, + "loc": "-182.21874999999972 -582.0000000000006" + }, + { + "category": "memory", + "text": "Day1", + "data_volume": 100, + "key": -25, + "loc": "-507.328125 -539" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -26, + "loc": "-316.328125 -539" + }, + { + "category": "memory", + "text": "Day1-Split1", + "data_volume": 5, + "key": -27, + "loc": "-76.328125 -539" + }, + { + "category": "memory", + "text": "Data", + "data_volume": 30, + "key": -3, + "loc": "295.671875 -266" + }, + { + "category": "Component", + "text": "CLEAN", + "execution_time": 100, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "148.671875 -261" + }, + { + "category": "memory", + "text": "Day2", + "data_volume": 100, + "key": -11, + "loc": "-514.328125 -401" + }, + { + "category": "memory", + "text": "Day3", + "data_volume": 100, + "key": -12, + "loc": "-516.328125 -292" + }, + { + "category": "memory", + "text": "Day4", + "data_volume": 100, + "key": -13, + "loc": "-521.328125 -176" + }, + { + "category": "memory", + "text": "Day5", + "data_volume": 100, + "key": -15, + "loc": "-514.328125 -92" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -16, + "loc": "-319.328125 -397" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -17, + "loc": "-326.328125 -300" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -18, + "loc": "-321.328125 -189" + }, + { + "category": "Component", + "text": "MST", + "execution_time": 20, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -19, + "loc": "-333.328125 -90" + }, + { + "category": "memory", + "text": "Day2-Split1", + "data_volume": 5, + "key": -20, + "loc": "-73.328125 -386" + }, + { + "category": "memory", + "text": "Day3-Split1", + "data_volume": 5, + "key": -21, + "loc": "-70.328125 -281" + }, + { + "category": "memory", + "text": "Day4-Split1", + "data_volume": 5, + "key": -22, + "loc": "-79.328125 -182" + }, + { + "category": "memory", + "text": "Day5-Split1", + "data_volume": 5, + "key": -24, + "loc": "-81.328125 -87" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%{param1}", + "key": -28, + "loc": "-628.328125 -603" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%param2", + "key": -29, + "loc": "-626.328125 -488" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%{param1.param2}", + "key": -30, + "loc": "-624.328125 -374" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "%{param4.what}", + "key": -31, + "loc": "-606.328125 -258" + }, + { + "category": "Component", + "text": "Copy", + "execution_time": 15, + "group_start": 0, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -32, + "loc": "-608.328125 -153" + } + ], + "linkDataArray": [ + { + "from": -25, + "to": -26, + "fromPort": "R", + "toPort": "L", + "points": [ + -474.9240474700928, + -539, + -464.9240474700928, + -539, + -407.61230754852295, + -539, + -407.61230754852295, + -539, + -350.3005676269531, + -539, + -340.3005676269531, + -539 + ] + }, + { + "from": -26, + "to": -27, + "fromPort": "R", + "toPort": "L", + "points": [ + -292.3556823730469, + -539, + -282.3556823730469, + -539, + -214.5426845550537, + -539, + -214.5426845550537, + -539, + -146.72968673706055, + -539, + -136.72968673706055, + -539 + ] + }, + { + "from": -2, + "to": -3, + "fromPort": "R", + "toPort": "L", + "points": [ + 181.61353302001953, + -261, + 191.61353302001953, + -261, + 223.46294689178467, + -261, + 223.46294689178467, + -266, + 255.3123607635498, + -266, + 265.3123607635498, + -266 + ] + }, + { + "from": -27, + "to": -2, + "fromPort": "R", + "toPort": "T", + "points": [ + -15.926563262939453, + -539, + -5.926563262939453, + -539, + 148.671875, + -539, + 148.671875, + -413.21886215209963, + 148.671875, + -287.4377243041992, + 148.671875, + -277.4377243041992 + ] + }, + { + "from": -11, + "to": -16, + "fromPort": "R", + "toPort": "L", + "points": [ + -481.9240474700928, + -401, + -471.9240474700928, + -401, + -412.61230754852295, + -401, + -412.61230754852295, + -397, + -353.3005676269531, + -397, + -343.3005676269531, + -397 + ] + }, + { + "from": -12, + "to": -17, + "fromPort": "R", + "toPort": "L", + "points": [ + -483.9240474700928, + -292, + -473.9240474700928, + -292, + -417.11230754852295, + -292, + -417.11230754852295, + -300, + -360.3005676269531, + -300, + -350.3005676269531, + -300 + ] + }, + { + "from": -13, + "to": -18, + "fromPort": "R", + "toPort": "L", + "points": [ + -488.9240474700928, + -176, + -478.9240474700928, + -176, + -417.11230754852295, + -176, + -417.11230754852295, + -189, + -355.3005676269531, + -189, + -345.3005676269531, + -189 + ] + }, + { + "from": -15, + "to": -19, + "fromPort": "R", + "toPort": "L", + "points": [ + -481.9240474700928, + -92, + -471.9240474700928, + -92, + -419.61230754852295, + -92, + -419.61230754852295, + -90, + -367.3005676269531, + -90, + -357.3005676269531, + -90 + ] + }, + { + "from": -16, + "to": -20, + "fromPort": "R", + "toPort": "L", + "points": [ + -295.3556823730469, + -397, + -285.3556823730469, + -397, + -214.5426845550537, + -397, + -214.5426845550537, + -386, + -143.72968673706055, + -386, + -133.72968673706055, + -386 + ] + }, + { + "from": -17, + "to": -21, + "fromPort": "R", + "toPort": "L", + "points": [ + -302.3556823730469, + -300, + -292.3556823730469, + -300, + -216.5426845550537, + -300, + -216.5426845550537, + -281, + -140.72968673706055, + -281, + -130.72968673706055, + -281 + ] + }, + { + "from": -18, + "to": -22, + "fromPort": "R", + "toPort": "L", + "points": [ + -297.3556823730469, + -189, + -287.3556823730469, + -189, + -218.5426845550537, + -189, + -218.5426845550537, + -182, + -149.72968673706055, + -182, + -139.72968673706055, + -182 + ] + }, + { + "from": -19, + "to": -24, + "fromPort": "R", + "toPort": "L", + "points": [ + -309.3556823730469, + -90, + -299.3556823730469, + -90, + -225.5426845550537, + -90, + -225.5426845550537, + -87, + -151.72968673706055, + -87, + -141.72968673706055, + -87 + ] + }, + { + "from": -20, + "to": -2, + "fromPort": "R", + "toPort": "L", + "points": [ + -12.926563262939453, + -386, + -2.926563262939453, + -386, + 51.40182685852051, + -386, + 51.40182685852051, + -261, + 105.73021697998047, + -261, + 115.73021697998047, + -261 + ] + }, + { + "from": -21, + "to": -2, + "fromPort": "R", + "toPort": "L", + "points": [ + -9.926563262939453, + -281, + 0.07343673706054688, + -281, + 52.90182685852051, + -281, + 52.90182685852051, + -261, + 105.73021697998047, + -261, + 115.73021697998047, + -261 + ] + }, + { + "from": -22, + "to": -2, + "fromPort": "R", + "toPort": "B", + "points": [ + -18.926563262939453, + -182, + -8.926563262939453, + -182, + 148.671875, + -182, + 148.671875, + -208.28113784790037, + 148.671875, + -234.56227569580076, + 148.671875, + -244.56227569580076 + ] + }, + { + "from": -24, + "to": -2, + "fromPort": "R", + "toPort": "B", + "points": [ + -20.926563262939453, + -87, + -10.926563262939453, + -87, + 148.671875, + -87, + 148.671875, + -160.78113784790037, + 148.671875, + -234.56227569580076, + 148.671875, + -244.56227569580076 + ] + }, + { + "from": -14, + "to": -28, + "fromPort": "T", + "toPort": "L", + "points": [ + -679.999999999993, + -296.0000000000005, + -679.999999999993, + -306.0000000000005, + -679.999999999993, + -603, + -671.9698944091762, + -603, + -663.9397888183594, + -603, + -653.9397888183594, + -603 + ] + }, + { + "from": -28, + "to": -25, + "fromPort": "R", + "toPort": "T", + "points": [ + -602.7164611816406, + -603, + -592.7164611816406, + -603, + -507.328125, + -603, + -507.328125, + -584.2188621520996, + -507.328125, + -565.4377243041993, + -507.328125, + -555.4377243041993 + ] + }, + { + "from": -14, + "to": -29, + "fromPort": "T", + "toPort": "L", + "points": [ + -679.999999999993, + -296.0000000000005, + -679.999999999993, + -306.0000000000005, + -679.999999999993, + -488.00000000000006, + -670.9698944091762, + -488.00000000000006, + -661.9397888183594, + -488.00000000000006, + -651.9397888183594, + -488.00000000000006 + ] + }, + { + "from": -14, + "to": -30, + "fromPort": "T", + "toPort": "L", + "points": [ + -679.999999999993, + -296.0000000000005, + -679.999999999993, + -306.0000000000005, + -679.999999999993, + -374.00000000000006, + -669.9698944091762, + -374.00000000000006, + -659.9397888183594, + -374.00000000000006, + -649.9397888183594, + -374.00000000000006 + ] + }, + { + "from": -14, + "to": -31, + "fromPort": "R", + "toPort": "L", + "points": [ + -646.0998840331961, + -276.0000000000005, + -636.0998840331961, + -276.0000000000005, + -636.0998840331961, + -267.0000000000003, + -641.9397888183594, + -267.0000000000003, + -641.9397888183594, + -258.00000000000006, + -631.9397888183594, + -258.00000000000006 + ] + }, + { + "from": -14, + "to": -32, + "fromPort": "B", + "toPort": "L", + "points": [ + -679.999999999993, + -256.0000000000005, + -679.999999999993, + -246.0000000000005, + -679.999999999993, + -153.00000000000006, + -661.9698944091762, + -153.00000000000006, + -643.9397888183594, + -153.00000000000006, + -633.9397888183594, + -153.00000000000006 + ] + }, + { + "from": -31, + "to": -13, + "fromPort": "R", + "toPort": "L", + "points": [ + -580.7164611816406, + -258.00000000000006, + -570.7164611816406, + -258.00000000000006, + -567.2243318557739, + -258.00000000000006, + -567.2243318557739, + -176, + -563.7322025299072, + -176, + -553.7322025299072, + -176 + ] + }, + { + "from": -29, + "to": -11, + "fromPort": "R", + "toPort": "L", + "points": [ + -600.7164611816406, + -488.00000000000006, + -590.7164611816406, + -488.00000000000006, + -573.7243318557739, + -488.00000000000006, + -573.7243318557739, + -401, + -556.7322025299072, + -401, + -546.7322025299072, + -401 + ] + }, + { + "from": -30, + "to": -12, + "fromPort": "R", + "toPort": "L", + "points": [ + -598.7164611816406, + -374.00000000000006, + -588.7164611816406, + -374.00000000000006, + -573.7243318557739, + -374.00000000000006, + -573.7243318557739, + -292, + -558.7322025299072, + -292, + -548.7322025299072, + -292 + ] + }, + { + "from": -32, + "to": -15, + "fromPort": "R", + "toPort": "L", + "points": [ + -582.7164611816406, + -153.00000000000006, + -572.7164611816406, + -153.00000000000006, + -564.7243318557739, + -153.00000000000006, + -564.7243318557739, + -92, + -556.7322025299072, + -92, + -546.7322025299072, + -92 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/logical_graphs/cont_img.json b/daliuge-translator/test/dropmake/logical_graphs/cont_img.json index 11ef68203..5b8f7cf5e 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/cont_img.json +++ b/daliuge-translator/test/dropmake/logical_graphs/cont_img.json @@ -1,102 +1,1335 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Comment", "loc":"315.0000000000002 -102", "text":"Continuum Imaging Pipeline", "key":-13, "clean_para":"eeww"}, -{"category":"Branch", "text":"Self-Cal\nConverge?", "key":-6, "loc":"-372.99999999999994 214", "group":-57}, -{"category":"Component", "text":"Update GSM", "key":-15, "loc":"-355.00000000000006 95.00000000000018", "group":-57}, -{"category":"Component", "text":"Update LSM", "key":-17, "loc":"-329.9999999999997 372.99999999999983", "group":-57}, -{"category":"Component", "text":"Cal. Source\nFinding", "key":-18, "loc":"-316 457.00000000000006", "group":-57}, -{"category":"Component", "text":"Image Plane\nSpectral Averaging", "key":-19, "loc":"-300.0000000000001 564.0000000000001", "group":-57}, -{"category":"Component", "text":"Predict 01", "key":-12, "loc":"-213 112.00000000000011", "group":-57}, -{"category":"Component", "text":"Solve", "key":-16, "loc":"-32 222.99999999999997", "group":-57}, -{"category":"Component", "text":"Correct", "key":-20, "loc":"95.00000000000003 180.00000000000009", "group":-57}, -{"category":"Component", "text":"Subtract", "key":-21, "loc":"245.9999999999999 241.0000000000001", "group":-57}, -{"category":"Component", "text":"Flag", "key":-22, "loc":"375.0000000000001 34", "group":-57}, -{"category":"Component", "text":"iFFT", "key":-23, "loc":"-167.00000000000023 523.9999999999999", "group":-46}, -{"category":"Component", "text":"deGrid", "key":-24, "loc":"-93.00000000000001 392.00000000000006", "group":-46}, -{"category":"Component", "text":"Subtract", "key":-25, "loc":"102.00000000000023 420.0000000000003", "group":-46}, -{"category":"Component", "text":"Flag", "key":-26, "loc":"143.00000000000065 353.99999999999955", "group":-46}, -{"category":"Component", "text":"FFT", "key":-28, "loc":"381.9999999999999 473.99999999999983", "group":-46}, -{"category":"Component", "text":"Subtract \ncompnt frm\nimg plane", "key":-32, "loc":"61.01612472534181 524.4822916666666", "group":-43}, -{"category":"End", "text":"End", "key":-29, "loc":"63.999999999999915 -103.99999999999999"}, -{"category":"memory", "text":"Calibration\nParameters", "data_volume":5, "key":-35, "loc":"-160.32812500000006 222.9999999999999", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-36, "loc":"-444.3281249999999 428.0000000000001", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-37, "loc":"-440.32812500000006 525.0000000000002", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-38, "loc":"-87.328125 111.99999999999994", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-39, "loc":"24.671874999999986 115", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-40, "loc":"159.67187500000003 118.99999999999997", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-41, "loc":"292.6718749999999 34.000000000000085", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-42, "loc":"375.67187499999994 250", "group":-57}, -{"category":"Loop", "text":"Minor Cycle", "isGroup":true, "num_of_iter":3, "key":-43, "loc":"106.88589859008792 524.4822916666666", "group":-46}, -{"category":"Component", "text":"Identify\nComponent", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"260.67187500000006 521.9999999999998", "group":-43}, -{"category":"memory", "text":"Model", "data_volume":5, "group_end":1, "key":-44, "loc":"-56.32812500000003 524.9999999999999", "group":-43}, -{"category":"memory", "text":"Image", "data_volume":5, "group_end":1, "key":-45, "loc":"381.67187500000006 533.9999999999998", "group":-46}, -{"category":"Loop", "text":"Major Cycle", "isGroup":true, "num_of_iter":2, "key":-46, "loc":"155.19133663177493 434.53887812296546", "group":-57}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-47, "loc":"-167.32812499999997 420.9999999999998", "group":-46}, -{"category":"memory", "text":"Model Vis", "data_volume":5, "group_end":0, "key":-48, "loc":"-8.328125000000014 420.0000000000001", "group":-46}, -{"category":"memory", "text":"Residul Vis", "data_volume":5, "group_end":0, "key":-49, "loc":"215.67187499999991 417.9999999999999", "group":-46}, -{"category":"memory", "text":"FRV", "data_volume":5, "group_end":1, "key":-50, "loc":"283.67187499999983 356.00000000000006", "group":-46}, -{"category":"memory", "text":"Data", "data_volume":5, "group_end":0, "key":-51, "loc":"381.671875 413.00000000000006", "group":-46}, -{"category":"Component", "text":"Grid", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-52, "loc":"381.6718750000001 357.9999999999999", "group":-46}, -{"category":"memory", "text":"CC", "data_volume":5, "group_end":0, "key":-53, "loc":"157.671875 523.0000000000001", "group":-43}, -{"category":"memory", "text":"GSM", "data_volume":5, "group_end":0, "key":-54, "loc":"-337.32812500000017 -4.999999999999986", "group":-57}, -{"category":"memory", "text":"Raw Vis", "data_volume":5, "group_end":0, "key":-56, "loc":"102.671875 236", "group":-57}, -{"category":"Loop", "text":"Self-Cal Cycle", "isGroup":true, "num_of_iter":2, "key":-57, "loc":"-29.341320037841797 283.46886215209963"}, -{"category":"memory", "text":"LSM", "data_volume":5, "group_end":1, "key":-3, "loc":"-500.328125 331", "group":-57}, -{"category":"Component", "text":"Check Conv", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-58, "loc":"-524.328125 44", "group":-57}, -{"category":"memory", "text":"result", "data_volume":5, "group_end":0, "key":-59, "loc":"-467.328125 147", "group":-57}, -{"category":"memory", "text":"Start Data ", "data_volume":5, "group_end":0, "key":-55, "loc":"-315.328125 -124"}, -{"category":"Start", "text":"Start", "key":-1, "loc":"-314.328125 -193"}, -{"category":"Component", "text":"Predict 02", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-60, "loc":"121.671875 35", "group":-57}, -{"category":"Comment", "text":"Cycle Entry 2", "key":-61, "loc":"84.671875 -2", "group":-57}, -{"category":"Comment", "text":"Cycle Entry 1", "key":-62, "loc":"-457.328125 -1", "group":-57}, -{"category":"Comment", "text":"Cycle End ", "key":-63, "loc":"-491.328125 286", "group":-57}, -{"category":"Comment", "text":"Cycle End ", "key":-64, "loc":"242.671875 325", "group":-46}, -{"category":"Comment", "text":"Cycle Entry", "key":-65, "loc":"461.671875 356", "group":-46} - ], - "linkDataArray": [ -{"from":-15, "to":-54, "fromPort":"T", "toPort":"B", "points":[-355.0000000000002,78.56227569580095,-355.0000000000002,68.56227569580095,-355.0000000000002,45.000000000000085,-337.328125,45.000000000000085,-337.328125,21.43772430419923,-337.328125,11.437724304199229]}, -{"from":-18, "to":-36, "fromPort":"L", "toPort":"B", "points":[-362.7963333129884,457,-372.7963333129884,457,-444.328125,457,-444.328125,455.71886215209963,-444.328125,454.4377243041992,-444.328125,444.4377243041992]}, -{"from":-60, "to":-21, "fromPort":"R", "toPort":"T", "points":[163.17472076416016,35,173.17472076416016,35,245.9999999999999,35,245.9999999999999,124.78113784790047,245.9999999999999,214.56227569580093,245.9999999999999,224.56227569580093]}, -{"from":-23, "to":-47, "fromPort":"T", "toPort":"B", "points":[-167.00000000000017,507.56227569580074,-167.00000000000017,497.56227569580074,-167.00000000000017,472.5,-167.328125,472.5,-167.328125,447.4377243041992,-167.328125,437.4377243041992]}, -{"from":-25, "to":-49, "fromPort":"R", "toPort":"L", "points":[137.79776763916033,420.0000000000003,147.79776763916033,420.0000000000003,147.79776763916033,419.0000000000001,145.7803192138671,419.0000000000001,145.7803192138671,417.9999999999999,155.7803192138671,417.9999999999999]}, -{"from":-26, "to":-50, "fromPort":"R", "toPort":"L", "points":[165.75912475586,353.9999999999999,175.75912475586,353.9999999999999,178,353.9999999999999,178,356.00000000000006,244.84688949584944,356.00000000000006,254.84688949584944,356.00000000000006]}, -{"from":-22, "to":-42, "fromPort":"B", "toPort":"T", "points":[374.9999999999999,50.43772430419914,374.9999999999999,60.43772430419914,374.9999999999999,141.99999999999997,375.671875,141.99999999999997,375.671875,223.5622756958008,375.671875,233.5622756958008]}, -{"from":-6, "to":-15, "fromPort":"T", "toPort":"B", "visible":true, "points":[-373,177.74910278320306,-373,167.74910278320306,-373,144.59341354370122,-355.0000000000002,144.59341354370122,-355.0000000000002,121.43772430419938,-355.0000000000002,111.43772430419938]}, -{"from":-6, "to":-12, "fromPort":"R", "toPort":"L", "visible":true, "points":[-296.7820587158203,213.99999999999994,-286.7820587158203,213.99999999999994,-275.64245223999023,213.99999999999994,-275.64245223999023,112.00000000000013,-264.50284576416016,112.00000000000013,-254.50284576416016,112.00000000000013], "text":"No"}, -{"from":-56, "to":-25, "fromPort":"B", "toPort":"T", "points":[102.671875,252.4377243041992,102.671875,262.4377243041992,102.671875,328.0000000000001,102.00000000000023,328.0000000000001,102.00000000000023,393.5622756958011,102.00000000000023,403.5622756958011]}, -{"from":-16, "to":-35, "fromPort":"L", "toPort":"R", "points":[-58.83570861816406,222.9999999999999,-68.83570861816406,222.9999999999999,-79.37219047546387,222.9999999999999,-79.37219047546387,222.9999999999998,-89.90867233276367,222.9999999999998,-99.90867233276367,222.9999999999998]}, -{"from":-35, "to":-24, "fromPort":"B", "toPort":"T", "points":[-160.328125,247.37544860839824,-160.328125,257.37544860839824,-160.328125,260,-93,260,-93,365.56227569580113,-93,375.56227569580113]}, -{"from":-36, "to":-17, "fromPort":"T", "toPort":"L", "points":[-444.328125,411.5622756958008,-444.328125,401.5622756958008,-444.328125,372.99999999999983,-416.7862854003905,372.99999999999983,-389.2444458007811,372.99999999999983,-379.2444458007811,372.99999999999983]}, -{"from":-19, "to":-37, "fromPort":"L", "toPort":"B", "points":[-370.43267822265625,563.9999999999999,-380.43267822265625,563.9999999999999,-440.328125,563.9999999999999,-440.328125,557.7188621520995,-440.328125,551.4377243041992,-440.328125,541.4377243041992]}, -{"from":-37, "to":-18, "fromPort":"R", "toPort":"B", "points":[-409.9686107635498,525,-399.9686107635498,525,-316.0000000000001,525,-316.0000000000001,508.18772430419926,-316.0000000000001,491.37544860839853,-316.0000000000001,481.3754486083985]}, -{"from":-12, "to":-38, "fromPort":"R", "toPort":"L", "points":[-171.49715423583984,112.00000000000013,-161.49715423583984,112.00000000000013,-144.59239673614502,112.00000000000013,-144.59239673614502,112.00000000000001,-127.6876392364502,112.00000000000001,-117.6876392364502,112.00000000000001]}, -{"from":-38, "to":-16, "fromPort":"R", "toPort":"T", "points":[-56.968610763549805,112.00000000000001,-46.968610763549805,112.00000000000001,-32,112.00000000000001,-32,154.28113784790034,-32,196.56227569580068,-32,206.56227569580068]}, -{"from":-16, "to":-39, "fromPort":"R", "toPort":"B", "points":[-5.1642913818359375,222.9999999999999,4.8357086181640625,222.9999999999999,24.671875,222.9999999999999,24.671875,182.21886215209958,24.671875,141.43772430419924,24.671875,131.43772430419924]}, -{"from":-39, "to":-20, "fromPort":"R", "toPort":"T", "points":[55.031389236450195,115.00000000000001,65.0313892364502,115.00000000000001,95,115.00000000000001,95,134.28113784790045,95,153.5622756958009,95,163.5622756958009]}, -{"from":-20, "to":-40, "fromPort":"R", "toPort":"B", "points":[127.5300521850586,180.0000000000001,137.5300521850586,180.0000000000001,159.671875,180.0000000000001,159.671875,162.7188621520997,159.671875,145.43772430419924,159.671875,135.43772430419924]}, -{"from":-40, "to":-21, "fromPort":"R", "toPort":"L", "points":[190.0313892364502,119.00000000000001,200.0313892364502,119.00000000000001,200.11681079864496,119.00000000000001,200.11681079864496,241.00000000000014,200.20223236083973,241.00000000000014,210.20223236083973,241.00000000000014]}, -{"from":-21, "to":-41, "fromPort":"R", "toPort":"B", "points":[281.79776763916004,241.00000000000014,291.79776763916004,241.00000000000014,292.671875,241.00000000000014,292.671875,150.7188621520997,292.671875,60.43772430419923,292.671875,50.43772430419923]}, -{"from":-41, "to":-22, "fromPort":"R", "toPort":"L", "points":[323.0313892364502,34.000000000000014,333.0313892364502,34.000000000000014,337.63613224029535,34.000000000000014,337.63613224029535,33.99999999999993,342.2408752441405,33.99999999999993,352.2408752441405,33.99999999999993]}, -{"from":-2, "to":-53, "fromPort":"L", "toPort":"R", "points":[214.27639007568365,521.9999999999998,204.27639007568365,521.9999999999998,197.84099197387698,521.9999999999998,197.84099197387698,523.0000000000001,191.4055938720703,523.0000000000001,181.4055938720703,523.0000000000001]}, -{"from":-32, "to":-44, "fromPort":"L", "toPort":"R", "points":[15.859012603759766,524.4822916666668,5.859012603759766,524.4822916666668,-1.7508373260498047,524.4822916666668,-1.7508373260498047,525,-9.360687255859375,525,-19.360687255859375,525]}, -{"from":-28, "to":-45, "fromPort":"B", "toPort":"T", "points":[381.9999999999999,490.4377243041992,381.9999999999999,500.4377243041992,381.9999999999999,504,381.671875,504,381.671875,507.56227569580074,381.671875,517.5622756958007]}, -{"from":-45, "to":-2, "fromPort":"L", "toPort":"R", "points":[344.69101905822754,534,334.69101905822754,534,325.879189491272,534,325.879189491272,522,317.0673599243164,522,307.0673599243164,522]}, -{"from":-44, "to":-23, "fromPort":"L", "toPort":"R", "points":[-93.29556274414062,525,-103.29556274414062,525,-118.36735534667977,525,-118.36735534667977,524,-133.43914794921892,524,-143.43914794921892,524]}, -{"from":-45, "to":-19, "fromPort":"B", "toPort":"R", "points":[381.671875,550.4377243041992,381.671875,560.4377243041992,381.671875,572,381.671875,572,381.671875,580,-212,580,-212,563.9999999999999,-219.56732177734375,563.9999999999999,-229.56732177734375,563.9999999999999]}, -{"from":-47, "to":-24, "fromPort":"T", "toPort":"L", "points":[-167.328125,404.5622756958008,-167.328125,394.5622756958008,-167.328125,392.00000000000034,-150.4144172668457,392.00000000000034,-133.5007095336914,392.00000000000034,-123.5007095336914,392.00000000000034]}, -{"from":-48, "to":-25, "fromPort":"R", "toPort":"L", "points":[44.93762588500975,420.0000000000001,54.93762588500975,420.0000000000001,55.56992912292489,420.0000000000001,55.56992912292489,420.0000000000003,56.202232360840014,420.0000000000003,66.20223236084001,420.0000000000003]}, -{"from":-49, "to":-26, "fromPort":"T", "toPort":"B", "points":[215.67187499999991,401.5622756958007,215.67187499999991,391.5622756958007,215.67187499999991,385.9999999999999,143.00000000000063,385.9999999999999,143.00000000000063,380.4377243041991,143.00000000000063,370.4377243041991]}, -{"from":-51, "to":-28, "fromPort":"B", "toPort":"T", "points":[381.671875,429.4377243041992,381.671875,439.4377243041992,381.671875,443.5,381.9999999999999,443.5,381.9999999999999,447.5622756958008,381.9999999999999,457.5622756958008]}, -{"from":-42, "to":-52, "fromPort":"B", "toPort":"T", "points":[375.671875,266.4377243041992,375.671875,276.4377243041992,375.671875,304,381.671875,304,381.671875,331.5622756958008,381.671875,341.5622756958008]}, -{"from":-52, "to":-51, "fromPort":"B", "toPort":"T", "points":[381.671875,374.4377243041992,381.671875,384.4377243041992,381.671875,385.5,381.671875,385.5,381.671875,386.5622756958008,381.671875,396.5622756958008]}, -{"from":-53, "to":-32, "fromPort":"L", "toPort":"R", "points":[133.9381561279297,523.0000000000001,123.93815612792969,523.0000000000001,120.05569648742676,523.0000000000001,120.05569648742676,524.4822916666666,116.17323684692384,524.4822916666666,106.17323684692384,524.4822916666666]}, -{"from":-54, "to":-29, "fromPort":"R", "toPort":"L", "points":[-305.95750617980957,-4.999999999999989,-295.95750617980957,-4.999999999999989,-134.04723086180513,-4.999999999999989,-134.04723086180513,-103.99999999999999,27.863044456199333,-103.99999999999999,37.86304445619933,-103.99999999999999]}, -{"from":-24, "to":-48, "fromPort":"R", "toPort":"T", "points":[-62.499290466308594,392.00000000000034,-52.499290466308594,392.00000000000034,-8.328125000000014,392.00000000000034,-8.328125000000014,392.7811378479006,-8.328125000000014,393.5622756958009,-8.328125000000014,403.5622756958009]}, -{"from":-17, "to":-3, "fromPort":"T", "toPort":"R", "points":[-329.99999999999983,356.5622756958006,-329.99999999999983,346.5622756958006,-329.99999999999983,331,-395.2437858581542,331,-460.4875717163086,331,-470.4875717163086,331]}, -{"from":-58, "to":-59, "fromPort":"B", "toPort":"L", "points":[-524.328125,60.43772430419922,-524.328125,70.43772430419922,-524.328125,147,-518.5535154342651,147,-512.7789058685303,147,-502.7789058685303,147]}, -{"from":-59, "to":-6, "fromPort":"B", "toPort":"L", "points":[-467.328125,163.43772430419924,-467.328125,173.43772430419924,-467.328125,213.99999999999994,-463.27303314208984,213.99999999999994,-459.2179412841797,213.99999999999994,-449.2179412841797,213.99999999999994]}, -{"from":-55, "to":-58, "fromPort":"L", "toPort":"T", "points":[-369.1083450317383,-123.99999999999999,-379.1083450317383,-123.99999999999999,-380,-123.99999999999999,-380,-123.99999999999999,-524.328125,-123.99999999999999,-524.328125,17.562275695800782,-524.328125,27.562275695800782]}, -{"from":-1, "to":-55, "fromPort":"B", "toPort":"T", "points":[-314.328125,-173,-314.328125,-163,-314.328125,-156.7188621520996,-315.328125,-156.7188621520996,-315.328125,-150.4377243041992,-315.328125,-140.4377243041992]} - ]} + "nodeDataArray": [ + { + "category": "Comment", + "loc": "315.0000000000002 -102", + "text": "Continuum Imaging Pipeline", + "key": -13, + "clean_para": "eeww" + }, + { + "category": "Branch", + "text": "Self-Cal\nConverge?", + "key": -6, + "loc": "-372.99999999999994 214", + "group": -57 + }, + { + "category": "Component", + "text": "Update GSM", + "key": -15, + "loc": "-355.00000000000006 95.00000000000018", + "group": -57 + }, + { + "category": "Component", + "text": "Update LSM", + "key": -17, + "loc": "-329.9999999999997 372.99999999999983", + "group": -57 + }, + { + "category": "Component", + "text": "Cal. Source\nFinding", + "key": -18, + "loc": "-316 457.00000000000006", + "group": -57 + }, + { + "category": "Component", + "text": "Image Plane\nSpectral Averaging", + "key": -19, + "loc": "-300.0000000000001 564.0000000000001", + "group": -57 + }, + { + "category": "Component", + "text": "Predict 01", + "key": -12, + "loc": "-213 112.00000000000011", + "group": -57 + }, + { + "category": "Component", + "text": "Solve", + "key": -16, + "loc": "-32 222.99999999999997", + "group": -57 + }, + { + "category": "Component", + "text": "Correct", + "key": -20, + "loc": "95.00000000000003 180.00000000000009", + "group": -57 + }, + { + "category": "Component", + "text": "Subtract", + "key": -21, + "loc": "245.9999999999999 241.0000000000001", + "group": -57 + }, + { + "category": "Component", + "text": "Flag", + "key": -22, + "loc": "375.0000000000001 34", + "group": -57 + }, + { + "category": "Component", + "text": "iFFT", + "key": -23, + "loc": "-167.00000000000023 523.9999999999999", + "group": -46 + }, + { + "category": "Component", + "text": "deGrid", + "key": -24, + "loc": "-93.00000000000001 392.00000000000006", + "group": -46 + }, + { + "category": "Component", + "text": "Subtract", + "key": -25, + "loc": "102.00000000000023 420.0000000000003", + "group": -46 + }, + { + "category": "Component", + "text": "Flag", + "key": -26, + "loc": "143.00000000000065 353.99999999999955", + "group": -46 + }, + { + "category": "Component", + "text": "FFT", + "key": -28, + "loc": "381.9999999999999 473.99999999999983", + "group": -46 + }, + { + "category": "Component", + "text": "Subtract \ncompnt frm\nimg plane", + "key": -32, + "loc": "61.01612472534181 524.4822916666666", + "group": -43 + }, + { + "category": "End", + "text": "End", + "key": -29, + "loc": "63.999999999999915 -103.99999999999999" + }, + { + "category": "memory", + "text": "Calibration\nParameters", + "data_volume": 5, + "key": -35, + "loc": "-160.32812500000006 222.9999999999999", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -36, + "loc": "-444.3281249999999 428.0000000000001", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -37, + "loc": "-440.32812500000006 525.0000000000002", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -38, + "loc": "-87.328125 111.99999999999994", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -39, + "loc": "24.671874999999986 115", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -40, + "loc": "159.67187500000003 118.99999999999997", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -41, + "loc": "292.6718749999999 34.000000000000085", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -42, + "loc": "375.67187499999994 250", + "group": -57 + }, + { + "category": "Loop", + "text": "Minor Cycle", + "isGroup": true, + "num_of_iter": 3, + "key": -43, + "loc": "106.88589859008792 524.4822916666666", + "group": -46 + }, + { + "category": "Component", + "text": "Identify\nComponent", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "260.67187500000006 521.9999999999998", + "group": -43 + }, + { + "category": "memory", + "text": "Model", + "data_volume": 5, + "group_end": 1, + "key": -44, + "loc": "-56.32812500000003 524.9999999999999", + "group": -43 + }, + { + "category": "memory", + "text": "Image", + "data_volume": 5, + "group_end": 1, + "key": -45, + "loc": "381.67187500000006 533.9999999999998", + "group": -46 + }, + { + "category": "Loop", + "text": "Major Cycle", + "isGroup": true, + "num_of_iter": 2, + "key": -46, + "loc": "155.19133663177493 434.53887812296546", + "group": -57 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -47, + "loc": "-167.32812499999997 420.9999999999998", + "group": -46 + }, + { + "category": "memory", + "text": "Model Vis", + "data_volume": 5, + "group_end": 0, + "key": -48, + "loc": "-8.328125000000014 420.0000000000001", + "group": -46 + }, + { + "category": "memory", + "text": "Residul Vis", + "data_volume": 5, + "group_end": 0, + "key": -49, + "loc": "215.67187499999991 417.9999999999999", + "group": -46 + }, + { + "category": "memory", + "text": "FRV", + "data_volume": 5, + "group_end": 1, + "key": -50, + "loc": "283.67187499999983 356.00000000000006", + "group": -46 + }, + { + "category": "memory", + "text": "Data", + "data_volume": 5, + "group_end": 0, + "key": -51, + "loc": "381.671875 413.00000000000006", + "group": -46 + }, + { + "category": "Component", + "text": "Grid", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -52, + "loc": "381.6718750000001 357.9999999999999", + "group": -46 + }, + { + "category": "memory", + "text": "CC", + "data_volume": 5, + "group_end": 0, + "key": -53, + "loc": "157.671875 523.0000000000001", + "group": -43 + }, + { + "category": "memory", + "text": "GSM", + "data_volume": 5, + "group_end": 0, + "key": -54, + "loc": "-337.32812500000017 -4.999999999999986", + "group": -57 + }, + { + "category": "memory", + "text": "Raw Vis", + "data_volume": 5, + "group_end": 0, + "key": -56, + "loc": "102.671875 236", + "group": -57 + }, + { + "category": "Loop", + "text": "Self-Cal Cycle", + "isGroup": true, + "num_of_iter": 2, + "key": -57, + "loc": "-29.341320037841797 283.46886215209963" + }, + { + "category": "memory", + "text": "LSM", + "data_volume": 5, + "group_end": 1, + "key": -3, + "loc": "-500.328125 331", + "group": -57 + }, + { + "category": "Component", + "text": "Check Conv", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -58, + "loc": "-524.328125 44", + "group": -57 + }, + { + "category": "memory", + "text": "result", + "data_volume": 5, + "group_end": 0, + "key": -59, + "loc": "-467.328125 147", + "group": -57 + }, + { + "category": "memory", + "text": "Start Data ", + "data_volume": 5, + "group_end": 0, + "key": -55, + "loc": "-315.328125 -124" + }, + { + "category": "Start", + "text": "Start", + "key": -1, + "loc": "-314.328125 -193" + }, + { + "category": "Component", + "text": "Predict 02", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -60, + "loc": "121.671875 35", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle Entry 2", + "key": -61, + "loc": "84.671875 -2", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle Entry 1", + "key": -62, + "loc": "-457.328125 -1", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle End ", + "key": -63, + "loc": "-491.328125 286", + "group": -57 + }, + { + "category": "Comment", + "text": "Cycle End ", + "key": -64, + "loc": "242.671875 325", + "group": -46 + }, + { + "category": "Comment", + "text": "Cycle Entry", + "key": -65, + "loc": "461.671875 356", + "group": -46 + } + ], + "linkDataArray": [ + { + "from": -15, + "to": -54, + "fromPort": "T", + "toPort": "B", + "points": [ + -355.0000000000002, + 78.56227569580095, + -355.0000000000002, + 68.56227569580095, + -355.0000000000002, + 45.000000000000085, + -337.328125, + 45.000000000000085, + -337.328125, + 21.43772430419923, + -337.328125, + 11.437724304199229 + ] + }, + { + "from": -18, + "to": -36, + "fromPort": "L", + "toPort": "B", + "points": [ + -362.7963333129884, + 457, + -372.7963333129884, + 457, + -444.328125, + 457, + -444.328125, + 455.71886215209963, + -444.328125, + 454.4377243041992, + -444.328125, + 444.4377243041992 + ] + }, + { + "from": -60, + "to": -21, + "fromPort": "R", + "toPort": "T", + "points": [ + 163.17472076416016, + 35, + 173.17472076416016, + 35, + 245.9999999999999, + 35, + 245.9999999999999, + 124.78113784790047, + 245.9999999999999, + 214.56227569580093, + 245.9999999999999, + 224.56227569580093 + ] + }, + { + "from": -23, + "to": -47, + "fromPort": "T", + "toPort": "B", + "points": [ + -167.00000000000017, + 507.56227569580074, + -167.00000000000017, + 497.56227569580074, + -167.00000000000017, + 472.5, + -167.328125, + 472.5, + -167.328125, + 447.4377243041992, + -167.328125, + 437.4377243041992 + ] + }, + { + "from": -25, + "to": -49, + "fromPort": "R", + "toPort": "L", + "points": [ + 137.79776763916033, + 420.0000000000003, + 147.79776763916033, + 420.0000000000003, + 147.79776763916033, + 419.0000000000001, + 145.7803192138671, + 419.0000000000001, + 145.7803192138671, + 417.9999999999999, + 155.7803192138671, + 417.9999999999999 + ] + }, + { + "from": -26, + "to": -50, + "fromPort": "R", + "toPort": "L", + "points": [ + 165.75912475586, + 353.9999999999999, + 175.75912475586, + 353.9999999999999, + 178, + 353.9999999999999, + 178, + 356.00000000000006, + 244.84688949584944, + 356.00000000000006, + 254.84688949584944, + 356.00000000000006 + ] + }, + { + "from": -22, + "to": -42, + "fromPort": "B", + "toPort": "T", + "points": [ + 374.9999999999999, + 50.43772430419914, + 374.9999999999999, + 60.43772430419914, + 374.9999999999999, + 141.99999999999997, + 375.671875, + 141.99999999999997, + 375.671875, + 223.5622756958008, + 375.671875, + 233.5622756958008 + ] + }, + { + "from": -6, + "to": -15, + "fromPort": "T", + "toPort": "B", + "visible": true, + "points": [ + -373, + 177.74910278320306, + -373, + 167.74910278320306, + -373, + 144.59341354370122, + -355.0000000000002, + 144.59341354370122, + -355.0000000000002, + 121.43772430419938, + -355.0000000000002, + 111.43772430419938 + ] + }, + { + "from": -6, + "to": -12, + "fromPort": "R", + "toPort": "L", + "visible": true, + "points": [ + -296.7820587158203, + 213.99999999999994, + -286.7820587158203, + 213.99999999999994, + -275.64245223999023, + 213.99999999999994, + -275.64245223999023, + 112.00000000000013, + -264.50284576416016, + 112.00000000000013, + -254.50284576416016, + 112.00000000000013 + ], + "text": "No" + }, + { + "from": -56, + "to": -25, + "fromPort": "B", + "toPort": "T", + "points": [ + 102.671875, + 252.4377243041992, + 102.671875, + 262.4377243041992, + 102.671875, + 328.0000000000001, + 102.00000000000023, + 328.0000000000001, + 102.00000000000023, + 393.5622756958011, + 102.00000000000023, + 403.5622756958011 + ] + }, + { + "from": -16, + "to": -35, + "fromPort": "L", + "toPort": "R", + "points": [ + -58.83570861816406, + 222.9999999999999, + -68.83570861816406, + 222.9999999999999, + -79.37219047546387, + 222.9999999999999, + -79.37219047546387, + 222.9999999999998, + -89.90867233276367, + 222.9999999999998, + -99.90867233276367, + 222.9999999999998 + ] + }, + { + "from": -35, + "to": -24, + "fromPort": "B", + "toPort": "T", + "points": [ + -160.328125, + 247.37544860839824, + -160.328125, + 257.37544860839824, + -160.328125, + 260, + -93, + 260, + -93, + 365.56227569580113, + -93, + 375.56227569580113 + ] + }, + { + "from": -36, + "to": -17, + "fromPort": "T", + "toPort": "L", + "points": [ + -444.328125, + 411.5622756958008, + -444.328125, + 401.5622756958008, + -444.328125, + 372.99999999999983, + -416.7862854003905, + 372.99999999999983, + -389.2444458007811, + 372.99999999999983, + -379.2444458007811, + 372.99999999999983 + ] + }, + { + "from": -19, + "to": -37, + "fromPort": "L", + "toPort": "B", + "points": [ + -370.43267822265625, + 563.9999999999999, + -380.43267822265625, + 563.9999999999999, + -440.328125, + 563.9999999999999, + -440.328125, + 557.7188621520995, + -440.328125, + 551.4377243041992, + -440.328125, + 541.4377243041992 + ] + }, + { + "from": -37, + "to": -18, + "fromPort": "R", + "toPort": "B", + "points": [ + -409.9686107635498, + 525, + -399.9686107635498, + 525, + -316.0000000000001, + 525, + -316.0000000000001, + 508.18772430419926, + -316.0000000000001, + 491.37544860839853, + -316.0000000000001, + 481.3754486083985 + ] + }, + { + "from": -12, + "to": -38, + "fromPort": "R", + "toPort": "L", + "points": [ + -171.49715423583984, + 112.00000000000013, + -161.49715423583984, + 112.00000000000013, + -144.59239673614502, + 112.00000000000013, + -144.59239673614502, + 112.00000000000001, + -127.6876392364502, + 112.00000000000001, + -117.6876392364502, + 112.00000000000001 + ] + }, + { + "from": -38, + "to": -16, + "fromPort": "R", + "toPort": "T", + "points": [ + -56.968610763549805, + 112.00000000000001, + -46.968610763549805, + 112.00000000000001, + -32, + 112.00000000000001, + -32, + 154.28113784790034, + -32, + 196.56227569580068, + -32, + 206.56227569580068 + ] + }, + { + "from": -16, + "to": -39, + "fromPort": "R", + "toPort": "B", + "points": [ + -5.1642913818359375, + 222.9999999999999, + 4.8357086181640625, + 222.9999999999999, + 24.671875, + 222.9999999999999, + 24.671875, + 182.21886215209958, + 24.671875, + 141.43772430419924, + 24.671875, + 131.43772430419924 + ] + }, + { + "from": -39, + "to": -20, + "fromPort": "R", + "toPort": "T", + "points": [ + 55.031389236450195, + 115.00000000000001, + 65.0313892364502, + 115.00000000000001, + 95, + 115.00000000000001, + 95, + 134.28113784790045, + 95, + 153.5622756958009, + 95, + 163.5622756958009 + ] + }, + { + "from": -20, + "to": -40, + "fromPort": "R", + "toPort": "B", + "points": [ + 127.5300521850586, + 180.0000000000001, + 137.5300521850586, + 180.0000000000001, + 159.671875, + 180.0000000000001, + 159.671875, + 162.7188621520997, + 159.671875, + 145.43772430419924, + 159.671875, + 135.43772430419924 + ] + }, + { + "from": -40, + "to": -21, + "fromPort": "R", + "toPort": "L", + "points": [ + 190.0313892364502, + 119.00000000000001, + 200.0313892364502, + 119.00000000000001, + 200.11681079864496, + 119.00000000000001, + 200.11681079864496, + 241.00000000000014, + 200.20223236083973, + 241.00000000000014, + 210.20223236083973, + 241.00000000000014 + ] + }, + { + "from": -21, + "to": -41, + "fromPort": "R", + "toPort": "B", + "points": [ + 281.79776763916004, + 241.00000000000014, + 291.79776763916004, + 241.00000000000014, + 292.671875, + 241.00000000000014, + 292.671875, + 150.7188621520997, + 292.671875, + 60.43772430419923, + 292.671875, + 50.43772430419923 + ] + }, + { + "from": -41, + "to": -22, + "fromPort": "R", + "toPort": "L", + "points": [ + 323.0313892364502, + 34.000000000000014, + 333.0313892364502, + 34.000000000000014, + 337.63613224029535, + 34.000000000000014, + 337.63613224029535, + 33.99999999999993, + 342.2408752441405, + 33.99999999999993, + 352.2408752441405, + 33.99999999999993 + ] + }, + { + "from": -2, + "to": -53, + "fromPort": "L", + "toPort": "R", + "points": [ + 214.27639007568365, + 521.9999999999998, + 204.27639007568365, + 521.9999999999998, + 197.84099197387698, + 521.9999999999998, + 197.84099197387698, + 523.0000000000001, + 191.4055938720703, + 523.0000000000001, + 181.4055938720703, + 523.0000000000001 + ] + }, + { + "from": -32, + "to": -44, + "fromPort": "L", + "toPort": "R", + "points": [ + 15.859012603759766, + 524.4822916666668, + 5.859012603759766, + 524.4822916666668, + -1.7508373260498047, + 524.4822916666668, + -1.7508373260498047, + 525, + -9.360687255859375, + 525, + -19.360687255859375, + 525 + ] + }, + { + "from": -28, + "to": -45, + "fromPort": "B", + "toPort": "T", + "points": [ + 381.9999999999999, + 490.4377243041992, + 381.9999999999999, + 500.4377243041992, + 381.9999999999999, + 504, + 381.671875, + 504, + 381.671875, + 507.56227569580074, + 381.671875, + 517.5622756958007 + ] + }, + { + "from": -45, + "to": -2, + "fromPort": "L", + "toPort": "R", + "points": [ + 344.69101905822754, + 534, + 334.69101905822754, + 534, + 325.879189491272, + 534, + 325.879189491272, + 522, + 317.0673599243164, + 522, + 307.0673599243164, + 522 + ] + }, + { + "from": -44, + "to": -23, + "fromPort": "L", + "toPort": "R", + "points": [ + -93.29556274414062, + 525, + -103.29556274414062, + 525, + -118.36735534667977, + 525, + -118.36735534667977, + 524, + -133.43914794921892, + 524, + -143.43914794921892, + 524 + ] + }, + { + "from": -45, + "to": -19, + "fromPort": "B", + "toPort": "R", + "points": [ + 381.671875, + 550.4377243041992, + 381.671875, + 560.4377243041992, + 381.671875, + 572, + 381.671875, + 572, + 381.671875, + 580, + -212, + 580, + -212, + 563.9999999999999, + -219.56732177734375, + 563.9999999999999, + -229.56732177734375, + 563.9999999999999 + ] + }, + { + "from": -47, + "to": -24, + "fromPort": "T", + "toPort": "L", + "points": [ + -167.328125, + 404.5622756958008, + -167.328125, + 394.5622756958008, + -167.328125, + 392.00000000000034, + -150.4144172668457, + 392.00000000000034, + -133.5007095336914, + 392.00000000000034, + -123.5007095336914, + 392.00000000000034 + ] + }, + { + "from": -48, + "to": -25, + "fromPort": "R", + "toPort": "L", + "points": [ + 44.93762588500975, + 420.0000000000001, + 54.93762588500975, + 420.0000000000001, + 55.56992912292489, + 420.0000000000001, + 55.56992912292489, + 420.0000000000003, + 56.202232360840014, + 420.0000000000003, + 66.20223236084001, + 420.0000000000003 + ] + }, + { + "from": -49, + "to": -26, + "fromPort": "T", + "toPort": "B", + "points": [ + 215.67187499999991, + 401.5622756958007, + 215.67187499999991, + 391.5622756958007, + 215.67187499999991, + 385.9999999999999, + 143.00000000000063, + 385.9999999999999, + 143.00000000000063, + 380.4377243041991, + 143.00000000000063, + 370.4377243041991 + ] + }, + { + "from": -51, + "to": -28, + "fromPort": "B", + "toPort": "T", + "points": [ + 381.671875, + 429.4377243041992, + 381.671875, + 439.4377243041992, + 381.671875, + 443.5, + 381.9999999999999, + 443.5, + 381.9999999999999, + 447.5622756958008, + 381.9999999999999, + 457.5622756958008 + ] + }, + { + "from": -42, + "to": -52, + "fromPort": "B", + "toPort": "T", + "points": [ + 375.671875, + 266.4377243041992, + 375.671875, + 276.4377243041992, + 375.671875, + 304, + 381.671875, + 304, + 381.671875, + 331.5622756958008, + 381.671875, + 341.5622756958008 + ] + }, + { + "from": -52, + "to": -51, + "fromPort": "B", + "toPort": "T", + "points": [ + 381.671875, + 374.4377243041992, + 381.671875, + 384.4377243041992, + 381.671875, + 385.5, + 381.671875, + 385.5, + 381.671875, + 386.5622756958008, + 381.671875, + 396.5622756958008 + ] + }, + { + "from": -53, + "to": -32, + "fromPort": "L", + "toPort": "R", + "points": [ + 133.9381561279297, + 523.0000000000001, + 123.93815612792969, + 523.0000000000001, + 120.05569648742676, + 523.0000000000001, + 120.05569648742676, + 524.4822916666666, + 116.17323684692384, + 524.4822916666666, + 106.17323684692384, + 524.4822916666666 + ] + }, + { + "from": -54, + "to": -29, + "fromPort": "R", + "toPort": "L", + "points": [ + -305.95750617980957, + -4.999999999999989, + -295.95750617980957, + -4.999999999999989, + -134.04723086180513, + -4.999999999999989, + -134.04723086180513, + -103.99999999999999, + 27.863044456199333, + -103.99999999999999, + 37.86304445619933, + -103.99999999999999 + ] + }, + { + "from": -24, + "to": -48, + "fromPort": "R", + "toPort": "T", + "points": [ + -62.499290466308594, + 392.00000000000034, + -52.499290466308594, + 392.00000000000034, + -8.328125000000014, + 392.00000000000034, + -8.328125000000014, + 392.7811378479006, + -8.328125000000014, + 393.5622756958009, + -8.328125000000014, + 403.5622756958009 + ] + }, + { + "from": -17, + "to": -3, + "fromPort": "T", + "toPort": "R", + "points": [ + -329.99999999999983, + 356.5622756958006, + -329.99999999999983, + 346.5622756958006, + -329.99999999999983, + 331, + -395.2437858581542, + 331, + -460.4875717163086, + 331, + -470.4875717163086, + 331 + ] + }, + { + "from": -58, + "to": -59, + "fromPort": "B", + "toPort": "L", + "points": [ + -524.328125, + 60.43772430419922, + -524.328125, + 70.43772430419922, + -524.328125, + 147, + -518.5535154342651, + 147, + -512.7789058685303, + 147, + -502.7789058685303, + 147 + ] + }, + { + "from": -59, + "to": -6, + "fromPort": "B", + "toPort": "L", + "points": [ + -467.328125, + 163.43772430419924, + -467.328125, + 173.43772430419924, + -467.328125, + 213.99999999999994, + -463.27303314208984, + 213.99999999999994, + -459.2179412841797, + 213.99999999999994, + -449.2179412841797, + 213.99999999999994 + ] + }, + { + "from": -55, + "to": -58, + "fromPort": "L", + "toPort": "T", + "points": [ + -369.1083450317383, + -123.99999999999999, + -379.1083450317383, + -123.99999999999999, + -380, + -123.99999999999999, + -380, + -123.99999999999999, + -524.328125, + -123.99999999999999, + -524.328125, + 17.562275695800782, + -524.328125, + 27.562275695800782 + ] + }, + { + "from": -1, + "to": -55, + "fromPort": "B", + "toPort": "T", + "points": [ + -314.328125, + -173, + -314.328125, + -163, + -314.328125, + -156.7188621520996, + -315.328125, + -156.7188621520996, + -315.328125, + -150.4377243041992, + -315.328125, + -140.4377243041992 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json index 1dbd129fa..063b957a4 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json +++ b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather.json @@ -1 +1,1160 @@ -{"copiesArrayObjects": true, "linkToPortIdProperty": "toPort", "linkFromPortIdProperty": "fromPort", "linkDataArray": [{"toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", "points": [224.375, 309, 224.375, 319, 224.375, 319, 236, 319, 236, 374.399609375, 232.203125, 374.399609375, 242.203125, 374.399609375], "from": -20, "to": -4}, {"toPort": "input_string", "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", "points": [426.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 428, 332, 428, 332, 529.399609375, 329.203125, 529.399609375, 339.203125, 529.399609375], "from": -4, "to": -22}, {"toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 532, 529.399609375, 532, 529.399609375, 548, 529.399609375, 548, 476, 468, 476, 468, 397.899609375, 469.703125, 397.899609375, 479.703125, 397.899609375], "from": -22, "to": -7}, {"toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 580, 484, 580, 484, 646.899609375, 481.703125, 646.899609375, 491.703125, 646.899609375], "from": -22, "to": -8}, {"toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", "fromPort": "output_string", "points": [154.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 124, 36, 124, 36, 192.899609375, 35.703125, 192.899609375, 45.703125, 192.899609375], "from": -5, "to": -6}, {"toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", "points": [230.390625, 192.899609375, 240.390625, 192.899609375, 244, 192.899609375, 244, 192.899609375, 260, 192.899609375, 260, 140, 20, 140, 20, 266, 165.859375, 266, 175.859375, 266], "from": -6, "to": -20}, {"toPort": "6539b8fc-633b-4431-9149-8625ca6cde6a", "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", "points": [1139.069722498308, 132, 1149.069722498308, 132, 1149.069722498308, 194.1998046875, 1103.703125, 194.1998046875, 1103.703125, 256.399609375, 1113.703125, 256.399609375], "from": -23, "to": -12}, {"toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", "fromPort": "34d5dd7a-3f90-4309-b7fc-120b47dd053d", "points": [1298.390625, 256.399609375, 1308.390625, 256.399609375, 1308.390625, 358.6998046875, 1118.203125, 358.6998046875, 1118.203125, 459.399609375, 1128.203125, 459.399609375], "from": -12, "to": -11}, {"toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", "to": -23, "points": [664.390625, 397.899609375, 674.390625, 397.899609375, 676, 397.899609375, 676, 132, 764.859375, 132, 774.859375, 132], "from": -7, "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1"}, {"toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", "points": [823.375, 175, 823.375, 185, 823.375, 188, 823.375, 188, 823.375, 231.899609375, 823.703125, 231.899609375, 833.703125, 231.899609375], "from": -23, "to": -14}, {"toPort": "input_string", "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", "points": [1018.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 284, 828, 284, 828, 339.399609375, 827.203125, 339.399609375, 837.203125, 339.399609375], "from": -14, "to": -13}, {"toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", "fromPort": "output_string", "points": [1021.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 396, 828, 396, 828, 452.899609375, 828.703125, 452.899609375, 838.703125, 452.899609375], "from": -13, "to": -15}, {"toPort": "5599e2ee-707e-4337-b983-bd90005bc35b", "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034", "points": [1023.390625, 452.899609375, 1033.390625, 452.899609375, 1036, 452.899609375, 1036, 452.899609375, 1077.03125, 452.899609375, 1077.03125, 185, 1077.03125, 175], "from": -15, "to": -23}], "nodeDataArray": [{"category": "memory", "loc": "479.703125 373.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -7, "text": "image per freq", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10"}]}, {"category": "SplitData", "loc": "208.203125 292", "isData": false, "outputPorts": [{"IdText": "string", "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3"}], "outputLocalPorts": [{"IdText": "string", "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6"}], "text": "ms-transform", "colour": " #DDAD00", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 491, "class": "go.Size", "height": 398}, "inputLocalPorts": [{"IdText": "string", "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988"}], "isGroup": true, "key": -20, "fields": [{"text": "Number of copies", "name": "num_of_copies", "value": "4"}, {"text": "Scatter axis", "name": "scatter_axis", "value": "time"}], "categoryType": "GroupComponent", "type": "Scatter", "inputPorts": [{"IdText": "string", "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "mstransform.sh"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "BashShellApp", "loc": "339.203125 505", "group": -20, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -22, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "242.203125 350", "group": -20, "outputPorts": [{"IdText": "string", "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -4, "text": "buffer", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "111b3131-57a7-4023-ab14-ca67f6eec728"}]}, {"category": "memory", "loc": "491.703125 622.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -8, "text": "clean statistics", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "d5653abf-b12f-4d97-ac15-d26702b20748"}]}, {"category": "BashShellApp", "loc": "-29.796875 45", "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -5, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "file", "loc": "45.703125 168.5", "outputPorts": [{"IdText": "string", "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -6, "text": "MeasurementSet", "type": "File Drop", "inputPorts": [{"IdText": "string", "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2"}]}, {"category": "DataGather", "loc": "807.203125 158", "type": "Gather", "isData": false, "outputPorts": [{"IdText": "string", "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7"}], "outputLocalPorts": [{"IdText": "string", "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec"}], "text": "ImageConcat", "colour": " #D35400", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 285, "class": "go.Size", "height": 333}, "inputLocalPorts": [{"IdText": "string", "Id": "5599e2ee-707e-4337-b983-bd90005bc35b"}], "isGroup": true, "key": -23, "fields": [{"text": "Number of inputs", "name": "num_of_inputs", "value": "2"}, {"text": "Gather axis", "name": "gather_axis", "value": "frequency"}], "categoryType": "GroupComponent", "inputPorts": [{"IdText": "string", "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "imconcat"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "End", "loc": "1128.203125 435", "type": "End", "outputPorts": [], "isData": false, "fields": [], "colour": " #CB4335", "canHaveOutputs": false, "canHaveInputs": true, "isGroup": false, "key": -11, "text": "Enter label", "categoryType": "ControlComponent", "inputPorts": [{"IdText": "string", "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da"}]}, {"category": "file", "loc": "1113.703125 232", "type": "File Drop", "outputPorts": [{"IdText": "string", "Id": "34d5dd7a-3f90-4309-b7fc-120b47dd053d"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -12, "text": "Cube", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "6539b8fc-633b-4431-9149-8625ca6cde6a"}]}, {"category": "BashShellApp", "loc": "837.203125 315", "group": -23, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "type": "Shell App", "isGroup": false, "key": -13, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "833.703125 207.5", "type": "Memory Drop", "outputPorts": [{"IdText": "string", "Id": "6942fe35-99ae-4911-9e99-aead7b13de16"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -14, "text": "Enter label", "group": -23, "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411"}]}, {"category": "memory", "loc": "838.703125 428.5", "group": -23, "outputPorts": [{"IdText": "string", "Id": "69b3949c-536f-455d-acd0-eee91e24a034"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -15, "text": "Enter label", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d"}]}], "modelData": {"fileType": "graph"}, "class": "go.GraphLinksModel", "copiesArrays": true} \ No newline at end of file +{ + "copiesArrayObjects": true, + "linkToPortIdProperty": "toPort", + "linkFromPortIdProperty": "fromPort", + "linkDataArray": [ + { + "toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", + "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", + "points": [ + 224.375, + 309, + 224.375, + 319, + 224.375, + 319, + 236, + 319, + 236, + 374.399609375, + 232.203125, + 374.399609375, + 242.203125, + 374.399609375 + ], + "from": -20, + "to": -4 + }, + { + "toPort": "input_string", + "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", + "points": [ + 426.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 428, + 332, + 428, + 332, + 529.399609375, + 329.203125, + 529.399609375, + 339.203125, + 529.399609375 + ], + "from": -4, + "to": -22 + }, + { + "toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 532, + 529.399609375, + 532, + 529.399609375, + 548, + 529.399609375, + 548, + 476, + 468, + 476, + 468, + 397.899609375, + 469.703125, + 397.899609375, + 479.703125, + 397.899609375 + ], + "from": -22, + "to": -7 + }, + { + "toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 580, + 484, + 580, + 484, + 646.899609375, + 481.703125, + 646.899609375, + 491.703125, + 646.899609375 + ], + "from": -22, + "to": -8 + }, + { + "toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", + "fromPort": "output_string", + "points": [ + 154.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 124, + 36, + 124, + 36, + 192.899609375, + 35.703125, + 192.899609375, + 45.703125, + 192.899609375 + ], + "from": -5, + "to": -6 + }, + { + "toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", + "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", + "points": [ + 230.390625, + 192.899609375, + 240.390625, + 192.899609375, + 244, + 192.899609375, + 244, + 192.899609375, + 260, + 192.899609375, + 260, + 140, + 20, + 140, + 20, + 266, + 165.859375, + 266, + 175.859375, + 266 + ], + "from": -6, + "to": -20 + }, + { + "toPort": "6539b8fc-633b-4431-9149-8625ca6cde6a", + "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", + "points": [ + 1139.069722498308, + 132, + 1149.069722498308, + 132, + 1149.069722498308, + 194.1998046875, + 1103.703125, + 194.1998046875, + 1103.703125, + 256.399609375, + 1113.703125, + 256.399609375 + ], + "from": -23, + "to": -12 + }, + { + "toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", + "fromPort": "34d5dd7a-3f90-4309-b7fc-120b47dd053d", + "points": [ + 1298.390625, + 256.399609375, + 1308.390625, + 256.399609375, + 1308.390625, + 358.6998046875, + 1118.203125, + 358.6998046875, + 1118.203125, + 459.399609375, + 1128.203125, + 459.399609375 + ], + "from": -12, + "to": -11 + }, + { + "toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", + "to": -23, + "points": [ + 664.390625, + 397.899609375, + 674.390625, + 397.899609375, + 676, + 397.899609375, + 676, + 132, + 764.859375, + 132, + 774.859375, + 132 + ], + "from": -7, + "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1" + }, + { + "toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", + "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", + "points": [ + 823.375, + 175, + 823.375, + 185, + 823.375, + 188, + 823.375, + 188, + 823.375, + 231.899609375, + 823.703125, + 231.899609375, + 833.703125, + 231.899609375 + ], + "from": -23, + "to": -14 + }, + { + "toPort": "input_string", + "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", + "points": [ + 1018.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 284, + 828, + 284, + 828, + 339.399609375, + 827.203125, + 339.399609375, + 837.203125, + 339.399609375 + ], + "from": -14, + "to": -13 + }, + { + "toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", + "fromPort": "output_string", + "points": [ + 1021.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 396, + 828, + 396, + 828, + 452.899609375, + 828.703125, + 452.899609375, + 838.703125, + 452.899609375 + ], + "from": -13, + "to": -15 + }, + { + "toPort": "5599e2ee-707e-4337-b983-bd90005bc35b", + "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034", + "points": [ + 1023.390625, + 452.899609375, + 1033.390625, + 452.899609375, + 1036, + 452.899609375, + 1036, + 452.899609375, + 1077.03125, + 452.899609375, + 1077.03125, + 185, + 1077.03125, + 175 + ], + "from": -15, + "to": -23 + } + ], + "nodeDataArray": [ + { + "category": "memory", + "loc": "479.703125 373.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -7, + "text": "image per freq", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10" + } + ] + }, + { + "category": "SplitData", + "loc": "208.203125 292", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6" + } + ], + "text": "ms-transform", + "colour": " #DDAD00", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 491, + "class": "go.Size", + "height": 398 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988" + } + ], + "isGroup": true, + "key": -20, + "fields": [ + { + "text": "Number of copies", + "name": "num_of_copies", + "value": "4" + }, + { + "text": "Scatter axis", + "name": "scatter_axis", + "value": "time" + } + ], + "categoryType": "GroupComponent", + "type": "Scatter", + "inputPorts": [ + { + "IdText": "string", + "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "mstransform.sh" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "BashShellApp", + "loc": "339.203125 505", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -22, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "242.203125 350", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -4, + "text": "buffer", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "111b3131-57a7-4023-ab14-ca67f6eec728" + } + ] + }, + { + "category": "memory", + "loc": "491.703125 622.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -8, + "text": "clean statistics", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "d5653abf-b12f-4d97-ac15-d26702b20748" + } + ] + }, + { + "category": "BashShellApp", + "loc": "-29.796875 45", + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -5, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "file", + "loc": "45.703125 168.5", + "outputPorts": [ + { + "IdText": "string", + "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -6, + "text": "MeasurementSet", + "type": "File Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2" + } + ] + }, + { + "category": "DataGather", + "loc": "807.203125 158", + "type": "Gather", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec" + } + ], + "text": "ImageConcat", + "colour": " #D35400", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 285, + "class": "go.Size", + "height": 333 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "5599e2ee-707e-4337-b983-bd90005bc35b" + } + ], + "isGroup": true, + "key": -23, + "fields": [ + { + "text": "Number of inputs", + "name": "num_of_inputs", + "value": "2" + }, + { + "text": "Gather axis", + "name": "gather_axis", + "value": "frequency" + } + ], + "categoryType": "GroupComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "imconcat" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "End", + "loc": "1128.203125 435", + "type": "End", + "outputPorts": [], + "isData": false, + "fields": [], + "colour": " #CB4335", + "canHaveOutputs": false, + "canHaveInputs": true, + "isGroup": false, + "key": -11, + "text": "Enter label", + "categoryType": "ControlComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da" + } + ] + }, + { + "category": "file", + "loc": "1113.703125 232", + "type": "File Drop", + "outputPorts": [ + { + "IdText": "string", + "Id": "34d5dd7a-3f90-4309-b7fc-120b47dd053d" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -12, + "text": "Cube", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "6539b8fc-633b-4431-9149-8625ca6cde6a" + } + ] + }, + { + "category": "BashShellApp", + "loc": "837.203125 315", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "type": "Shell App", + "isGroup": false, + "key": -13, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "833.703125 207.5", + "type": "Memory Drop", + "outputPorts": [ + { + "IdText": "string", + "Id": "6942fe35-99ae-4911-9e99-aead7b13de16" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -14, + "text": "Enter label", + "group": -23, + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411" + } + ] + }, + { + "category": "memory", + "loc": "838.703125 428.5", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "69b3949c-536f-455d-acd0-eee91e24a034" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -15, + "text": "Enter label", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d" + } + ] + } + ], + "modelData": { + "fileType": "graph" + }, + "class": "go.GraphLinksModel", + "copiesArrays": true +} \ No newline at end of file diff --git a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json index a98e57ae4..8a5e43c97 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json +++ b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_empty.json @@ -1 +1,886 @@ -{"copiesArrayObjects": true, "linkToPortIdProperty": "toPort", "linkFromPortIdProperty": "fromPort", "linkDataArray": [{"toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", "points": [224.375, 309, 224.375, 319, 224.375, 319, 236, 319, 236, 374.399609375, 232.203125, 374.399609375, 242.203125, 374.399609375], "from": -20, "to": -4}, {"toPort": "input_string", "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", "points": [426.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 428, 332, 428, 332, 529.399609375, 329.203125, 529.399609375, 339.203125, 529.399609375], "from": -4, "to": -22}, {"toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 532, 529.399609375, 532, 529.399609375, 548, 529.399609375, 548, 476, 468, 476, 468, 397.899609375, 469.703125, 397.899609375, 479.703125, 397.899609375], "from": -22, "to": -7}, {"toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 580, 484, 580, 484, 646.899609375, 481.703125, 646.899609375, 491.703125, 646.899609375], "from": -22, "to": -8}, {"toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", "fromPort": "output_string", "points": [154.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 124, 36, 124, 36, 192.899609375, 35.703125, 192.899609375, 45.703125, 192.899609375], "from": -5, "to": -6}, {"toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", "points": [230.390625, 192.899609375, 240.390625, 192.899609375, 244, 192.899609375, 244, 192.899609375, 260, 192.899609375, 260, 140, 20, 140, 20, 266, 165.859375, 266, 175.859375, 266], "from": -6, "to": -20}, {"toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", "to": -23, "points": [664.390625, 397.899609375, 674.390625, 397.899609375, 676, 397.899609375, 676, 132, 764.859375, 132, 774.859375, 132], "from": -7, "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1"}, {"toPort": "e53d93aa-2141-4d1b-b126-c21d204e9989", "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", "points": [1054.0697224983078, 132, 1064.0697224983078, 132, 1064.0697224983078, 203.9498046875, 1009.703125, 203.9498046875, 1009.703125, 275.899609375, 1019.703125, 275.899609375], "from": -23, "to": -10}, {"toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", "fromPort": "61a22f9c-5232-409e-b54b-36d64e2c977e", "points": [1204.390625, 275.899609375, 1214.390625, 275.899609375, 1214.390625, 275.899609375, 1214.390625, 420, 1044, 420, 1044, 552.399609375, 1047.203125, 552.399609375, 1057.203125, 552.399609375], "from": -10, "to": -11}], "nodeDataArray": [{"category": "memory", "loc": "479.703125 373.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -7, "text": "image per freq", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10"}]}, {"category": "SplitData", "loc": "208.203125 292", "type": "Scatter", "isData": false, "outputPorts": [{"IdText": "string", "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3"}], "outputLocalPorts": [{"IdText": "string", "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6"}], "text": "ms-transform", "colour": " #DDAD00", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 491, "class": "go.Size", "height": 398}, "inputLocalPorts": [{"IdText": "string", "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988"}], "isGroup": true, "key": -20, "fields": [{"text": "Number of copies", "name": "num_of_copies", "value": "4"}, {"text": "Scatter axis", "name": "scatter_axis", "value": "time"}], "categoryType": "GroupComponent", "inputPorts": [{"IdText": "string", "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "mstransform.sh"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "BashShellApp", "loc": "339.203125 505", "group": -20, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "type": "Shell App", "isGroup": false, "key": -22, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "242.203125 350", "group": -20, "outputPorts": [{"IdText": "string", "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -4, "text": "buffer", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "111b3131-57a7-4023-ab14-ca67f6eec728"}]}, {"category": "memory", "loc": "491.703125 622.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -8, "text": "clean statistics", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "d5653abf-b12f-4d97-ac15-d26702b20748"}]}, {"category": "BashShellApp", "loc": "-29.796875 45", "type": "Shell App", "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "isGroup": false, "key": -5, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "file", "loc": "45.703125 168.5", "type": "File Drop", "outputPorts": [{"IdText": "string", "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -6, "text": "MeasurementSet", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2"}]}, {"category": "DataGather", "loc": "807.203125 158", "isData": false, "outputPorts": [{"IdText": "string", "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7"}], "outputLocalPorts": [{"IdText": "string", "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec"}], "text": "ImageConcat", "colour": " #D35400", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 200, "class": "go.Size", "height": 232}, "inputLocalPorts": [{"IdText": "string", "Id": "5599e2ee-707e-4337-b983-bd90005bc35b"}], "isGroup": true, "key": -23, "fields": [{"text": "Number of inputs", "name": "num_of_inputs", "value": "2"}, {"text": "Gather axis", "name": "gather_axis", "value": "frequency"}], "categoryType": "GroupComponent", "type": "Gather", "inputPorts": [{"IdText": "string", "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "imconcat"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "End", "loc": "1057.203125 528", "outputPorts": [], "isData": false, "fields": [], "colour": " #CB4335", "canHaveOutputs": false, "canHaveInputs": true, "categoryType": "ControlComponent", "isGroup": false, "key": -11, "text": "Enter label", "type": "End", "inputPorts": [{"IdText": "string", "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da"}]}, {"category": "memory", "loc": "1019.703125 251.5", "outputPorts": [{"IdText": "string", "Id": "61a22f9c-5232-409e-b54b-36d64e2c977e"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -10, "text": "Cube", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "e53d93aa-2141-4d1b-b126-c21d204e9989"}]}], "modelData": {"fileType": "graph"}, "class": "go.GraphLinksModel", "copiesArrays": true} \ No newline at end of file +{ + "copiesArrayObjects": true, + "linkToPortIdProperty": "toPort", + "linkFromPortIdProperty": "fromPort", + "linkDataArray": [ + { + "toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", + "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", + "points": [ + 224.375, + 309, + 224.375, + 319, + 224.375, + 319, + 236, + 319, + 236, + 374.399609375, + 232.203125, + 374.399609375, + 242.203125, + 374.399609375 + ], + "from": -20, + "to": -4 + }, + { + "toPort": "input_string", + "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", + "points": [ + 426.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 428, + 332, + 428, + 332, + 529.399609375, + 329.203125, + 529.399609375, + 339.203125, + 529.399609375 + ], + "from": -4, + "to": -22 + }, + { + "toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 532, + 529.399609375, + 532, + 529.399609375, + 548, + 529.399609375, + 548, + 476, + 468, + 476, + 468, + 397.899609375, + 469.703125, + 397.899609375, + 479.703125, + 397.899609375 + ], + "from": -22, + "to": -7 + }, + { + "toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 580, + 484, + 580, + 484, + 646.899609375, + 481.703125, + 646.899609375, + 491.703125, + 646.899609375 + ], + "from": -22, + "to": -8 + }, + { + "toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", + "fromPort": "output_string", + "points": [ + 154.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 124, + 36, + 124, + 36, + 192.899609375, + 35.703125, + 192.899609375, + 45.703125, + 192.899609375 + ], + "from": -5, + "to": -6 + }, + { + "toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", + "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", + "points": [ + 230.390625, + 192.899609375, + 240.390625, + 192.899609375, + 244, + 192.899609375, + 244, + 192.899609375, + 260, + 192.899609375, + 260, + 140, + 20, + 140, + 20, + 266, + 165.859375, + 266, + 175.859375, + 266 + ], + "from": -6, + "to": -20 + }, + { + "toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", + "to": -23, + "points": [ + 664.390625, + 397.899609375, + 674.390625, + 397.899609375, + 676, + 397.899609375, + 676, + 132, + 764.859375, + 132, + 774.859375, + 132 + ], + "from": -7, + "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1" + }, + { + "toPort": "e53d93aa-2141-4d1b-b126-c21d204e9989", + "fromPort": "ee986ccc-7c86-42e6-8913-9c36b595b2f7", + "points": [ + 1054.0697224983078, + 132, + 1064.0697224983078, + 132, + 1064.0697224983078, + 203.9498046875, + 1009.703125, + 203.9498046875, + 1009.703125, + 275.899609375, + 1019.703125, + 275.899609375 + ], + "from": -23, + "to": -10 + }, + { + "toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", + "fromPort": "61a22f9c-5232-409e-b54b-36d64e2c977e", + "points": [ + 1204.390625, + 275.899609375, + 1214.390625, + 275.899609375, + 1214.390625, + 275.899609375, + 1214.390625, + 420, + 1044, + 420, + 1044, + 552.399609375, + 1047.203125, + 552.399609375, + 1057.203125, + 552.399609375 + ], + "from": -10, + "to": -11 + } + ], + "nodeDataArray": [ + { + "category": "memory", + "loc": "479.703125 373.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -7, + "text": "image per freq", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10" + } + ] + }, + { + "category": "SplitData", + "loc": "208.203125 292", + "type": "Scatter", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6" + } + ], + "text": "ms-transform", + "colour": " #DDAD00", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 491, + "class": "go.Size", + "height": 398 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988" + } + ], + "isGroup": true, + "key": -20, + "fields": [ + { + "text": "Number of copies", + "name": "num_of_copies", + "value": "4" + }, + { + "text": "Scatter axis", + "name": "scatter_axis", + "value": "time" + } + ], + "categoryType": "GroupComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "mstransform.sh" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "BashShellApp", + "loc": "339.203125 505", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "type": "Shell App", + "isGroup": false, + "key": -22, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "242.203125 350", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -4, + "text": "buffer", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "111b3131-57a7-4023-ab14-ca67f6eec728" + } + ] + }, + { + "category": "memory", + "loc": "491.703125 622.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -8, + "text": "clean statistics", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "d5653abf-b12f-4d97-ac15-d26702b20748" + } + ] + }, + { + "category": "BashShellApp", + "loc": "-29.796875 45", + "type": "Shell App", + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "isGroup": false, + "key": -5, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "file", + "loc": "45.703125 168.5", + "type": "File Drop", + "outputPorts": [ + { + "IdText": "string", + "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -6, + "text": "MeasurementSet", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2" + } + ] + }, + { + "category": "DataGather", + "loc": "807.203125 158", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec" + } + ], + "text": "ImageConcat", + "colour": " #D35400", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 200, + "class": "go.Size", + "height": 232 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "5599e2ee-707e-4337-b983-bd90005bc35b" + } + ], + "isGroup": true, + "key": -23, + "fields": [ + { + "text": "Number of inputs", + "name": "num_of_inputs", + "value": "2" + }, + { + "text": "Gather axis", + "name": "gather_axis", + "value": "frequency" + } + ], + "categoryType": "GroupComponent", + "type": "Gather", + "inputPorts": [ + { + "IdText": "string", + "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "imconcat" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "End", + "loc": "1057.203125 528", + "outputPorts": [], + "isData": false, + "fields": [], + "colour": " #CB4335", + "canHaveOutputs": false, + "canHaveInputs": true, + "categoryType": "ControlComponent", + "isGroup": false, + "key": -11, + "text": "Enter label", + "type": "End", + "inputPorts": [ + { + "IdText": "string", + "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da" + } + ] + }, + { + "category": "memory", + "loc": "1019.703125 251.5", + "outputPorts": [ + { + "IdText": "string", + "Id": "61a22f9c-5232-409e-b54b-36d64e2c977e" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -10, + "text": "Cube", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "e53d93aa-2141-4d1b-b126-c21d204e9989" + } + ] + } + ], + "modelData": { + "fileType": "graph" + }, + "class": "go.GraphLinksModel", + "copiesArrays": true +} \ No newline at end of file diff --git a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json index 85a55de77..4a5ff4008 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json +++ b/daliuge-translator/test/dropmake/logical_graphs/eagle_gather_simple.json @@ -1 +1,1065 @@ -{"copiesArrayObjects": true, "linkToPortIdProperty": "toPort", "linkFromPortIdProperty": "fromPort", "linkDataArray": [{"toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", "points": [224.375, 309, 224.375, 319, 224.375, 319, 236, 319, 236, 374.399609375, 232.203125, 374.399609375, 242.203125, 374.399609375], "from": -20, "to": -4}, {"toPort": "input_string", "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", "points": [426.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 374.399609375, 436.890625, 428, 332, 428, 332, 529.399609375, 329.203125, 529.399609375, 339.203125, 529.399609375], "from": -4, "to": -22}, {"toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 532, 529.399609375, 532, 529.399609375, 548, 529.399609375, 548, 476, 468, 476, 468, 397.899609375, 469.703125, 397.899609375, 479.703125, 397.899609375], "from": -22, "to": -7}, {"toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", "fromPort": "output_string", "points": [523.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 529.399609375, 533.890625, 580, 484, 580, 484, 646.899609375, 481.703125, 646.899609375, 491.703125, 646.899609375], "from": -22, "to": -8}, {"toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", "fromPort": "output_string", "points": [154.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 69.399609375, 164.890625, 124, 36, 124, 36, 192.899609375, 35.703125, 192.899609375, 45.703125, 192.899609375], "from": -5, "to": -6}, {"toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", "points": [230.390625, 192.899609375, 240.390625, 192.899609375, 244, 192.899609375, 244, 192.899609375, 260, 192.899609375, 260, 140, 20, 140, 20, 266, 165.859375, 266, 175.859375, 266], "from": -6, "to": -20}, {"toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", "to": -23, "points": [664.390625, 397.899609375, 674.390625, 397.899609375, 676, 397.899609375, 676, 132, 764.859375, 132, 774.859375, 132], "from": -7, "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1"}, {"toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", "points": [823.375, 175, 823.375, 185, 823.375, 188, 823.375, 188, 823.375, 231.899609375, 823.703125, 231.899609375, 833.703125, 231.899609375], "from": -23, "to": -14}, {"toPort": "input_string", "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", "points": [1018.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 231.899609375, 1028.390625, 284, 828, 284, 828, 339.399609375, 827.203125, 339.399609375, 837.203125, 339.399609375], "from": -14, "to": -13}, {"toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", "fromPort": "output_string", "points": [1021.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 339.399609375, 1031.890625, 396, 828, 396, 828, 452.899609375, 828.703125, 452.899609375, 838.703125, 452.899609375], "from": -13, "to": -15}, {"toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", "to": -11, "points": [1023.390625, 452.899609375, 1033.390625, 452.899609375, 1036, 452.899609375, 1036, 459.399609375, 1118.203125, 459.399609375, 1128.203125, 459.399609375], "from": -15, "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034"}], "nodeDataArray": [{"category": "memory", "loc": "479.703125 373.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -7, "text": "image per freq", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10"}]}, {"category": "SplitData", "loc": "208.203125 292", "isData": false, "outputPorts": [{"IdText": "string", "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3"}], "outputLocalPorts": [{"IdText": "string", "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6"}], "text": "ms-transform", "colour": " #DDAD00", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 491, "class": "go.Size", "height": 398}, "inputLocalPorts": [{"IdText": "string", "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988"}], "isGroup": true, "key": -20, "fields": [{"text": "Number of copies", "name": "num_of_copies", "value": "4"}, {"text": "Scatter axis", "name": "scatter_axis", "value": "time"}], "categoryType": "GroupComponent", "type": "Scatter", "inputPorts": [{"IdText": "string", "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "mstransform.sh"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "BashShellApp", "loc": "339.203125 505", "group": -20, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -22, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "242.203125 350", "group": -20, "outputPorts": [{"IdText": "string", "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -4, "text": "buffer", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "111b3131-57a7-4023-ab14-ca67f6eec728"}]}, {"category": "memory", "loc": "491.703125 622.5", "group": -20, "outputPorts": [{"IdText": "string", "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -8, "text": "clean statistics", "type": "Memory Drop", "inputPorts": [{"IdText": "string", "Id": "d5653abf-b12f-4d97-ac15-d26702b20748"}]}, {"category": "BashShellApp", "loc": "-29.796875 45", "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "ApplicationDrop", "isGroup": false, "key": -5, "text": "Clean", "type": "Shell App", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "file", "loc": "45.703125 168.5", "outputPorts": [{"IdText": "string", "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9"}], "isData": true, "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}, {"text": "Check file path exists", "name": "check_filepath_exists", "value": "1"}, {"text": "File path", "name": "filepath", "value": ""}, {"text": "Directory name", "name": "dirname", "value": ""}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "categoryType": "DataDrop", "shape": "Card", "isGroup": false, "key": -6, "text": "MeasurementSet", "type": "File Drop", "inputPorts": [{"IdText": "string", "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2"}]}, {"category": "DataGather", "loc": "807.203125 158", "type": "Gather", "isData": false, "outputPorts": [{"IdText": "string", "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7"}], "outputLocalPorts": [{"IdText": "string", "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec"}], "text": "ImageConcat", "colour": " #D35400", "canHaveOutputs": true, "canHaveInputs": true, "application": "BashShellApp", "desiredSize": {"width": 285, "class": "go.Size", "height": 333}, "inputLocalPorts": [{"IdText": "string", "Id": "5599e2ee-707e-4337-b983-bd90005bc35b"}], "isGroup": true, "key": -23, "fields": [{"text": "Number of inputs", "name": "num_of_inputs", "value": "2"}, {"text": "Gather axis", "name": "gather_axis", "value": "frequency"}], "categoryType": "GroupComponent", "inputPorts": [{"IdText": "string", "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1"}], "appFields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": "imconcat"}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}]}, {"category": "End", "loc": "1128.203125 435", "type": "End", "outputPorts": [], "isData": false, "fields": [], "colour": " #CB4335", "canHaveOutputs": false, "canHaveInputs": true, "isGroup": false, "key": -11, "text": "Enter label", "categoryType": "ControlComponent", "inputPorts": [{"IdText": "string", "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da"}]}, {"category": "BashShellApp", "loc": "837.203125 315", "group": -23, "outputPorts": [{"IdText": "string", "Id": "output_string"}], "isData": false, "fields": [{"text": "Execution time", "name": "execution_time", "value": "5"}, {"text": "Num CPUs", "name": "num_cpus", "value": "1"}, {"text": "Group start", "name": "group_start", "value": "0"}, {"text": "Arg01", "name": "Arg01", "value": ""}, {"text": "Arg02", "name": "Arg02", "value": ""}, {"text": "Arg03", "name": "Arg03", "value": ""}, {"text": "Arg04", "name": "Arg04", "value": ""}, {"text": "Arg05", "name": "Arg05", "value": ""}, {"text": "Arg06", "name": "Arg06", "value": ""}, {"text": "Arg07", "name": "Arg07", "value": ""}, {"text": "Arg08", "name": "Arg08", "value": ""}, {"text": "Arg09", "name": "Arg09", "value": ""}, {"text": "Arg10", "name": "Arg10", "value": ""}], "colour": " #1C2833", "canHaveOutputs": true, "canHaveInputs": true, "type": "Shell App", "isGroup": false, "key": -13, "text": "Clean", "categoryType": "ApplicationDrop", "inputPorts": [{"IdText": "string", "Id": "input_string"}]}, {"category": "memory", "loc": "833.703125 207.5", "group": -23, "outputPorts": [{"IdText": "string", "Id": "6942fe35-99ae-4911-9e99-aead7b13de16"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -14, "text": "Enter label", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411"}]}, {"category": "memory", "loc": "838.703125 428.5", "group": -23, "outputPorts": [{"IdText": "string", "Id": "69b3949c-536f-455d-acd0-eee91e24a034"}], "isData": true, "type": "Memory Drop", "fields": [{"text": "Data volume", "name": "data_volume", "value": "5"}, {"text": "Group end", "name": "group_end", "value": "0"}], "colour": " #394BB2", "canHaveOutputs": true, "canHaveInputs": true, "shape": "Card", "isGroup": false, "key": -15, "text": "Enter label", "categoryType": "DataDrop", "inputPorts": [{"IdText": "string", "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d"}]}], "modelData": {"fileType": "graph"}, "class": "go.GraphLinksModel", "copiesArrays": true} \ No newline at end of file +{ + "copiesArrayObjects": true, + "linkToPortIdProperty": "toPort", + "linkFromPortIdProperty": "fromPort", + "linkDataArray": [ + { + "toPort": "111b3131-57a7-4023-ab14-ca67f6eec728", + "fromPort": "a4fd601e-8726-49c6-ba1b-da075385caf6", + "points": [ + 224.375, + 309, + 224.375, + 319, + 224.375, + 319, + 236, + 319, + 236, + 374.399609375, + 232.203125, + 374.399609375, + 242.203125, + 374.399609375 + ], + "from": -20, + "to": -4 + }, + { + "toPort": "input_string", + "fromPort": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9", + "points": [ + 426.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 374.399609375, + 436.890625, + 428, + 332, + 428, + 332, + 529.399609375, + 329.203125, + 529.399609375, + 339.203125, + 529.399609375 + ], + "from": -4, + "to": -22 + }, + { + "toPort": "add668b4-f4f1-4ea9-91fc-80e3315d0f10", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 532, + 529.399609375, + 532, + 529.399609375, + 548, + 529.399609375, + 548, + 476, + 468, + 476, + 468, + 397.899609375, + 469.703125, + 397.899609375, + 479.703125, + 397.899609375 + ], + "from": -22, + "to": -7 + }, + { + "toPort": "d5653abf-b12f-4d97-ac15-d26702b20748", + "fromPort": "output_string", + "points": [ + 523.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 529.399609375, + 533.890625, + 580, + 484, + 580, + 484, + 646.899609375, + 481.703125, + 646.899609375, + 491.703125, + 646.899609375 + ], + "from": -22, + "to": -8 + }, + { + "toPort": "fa25afa9-43a1-4383-b10f-7e8570bb41d2", + "fromPort": "output_string", + "points": [ + 154.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 69.399609375, + 164.890625, + 124, + 36, + 124, + 36, + 192.899609375, + 35.703125, + 192.899609375, + 45.703125, + 192.899609375 + ], + "from": -5, + "to": -6 + }, + { + "toPort": "94a41ddc-d86b-4100-a6e8-c40d2811f128", + "fromPort": "d768bb12-632d-4403-9b9d-0a484fbe72a9", + "points": [ + 230.390625, + 192.899609375, + 240.390625, + 192.899609375, + 244, + 192.899609375, + 244, + 192.899609375, + 260, + 192.899609375, + 260, + 140, + 20, + 140, + 20, + 266, + 165.859375, + 266, + 175.859375, + 266 + ], + "from": -6, + "to": -20 + }, + { + "toPort": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1", + "to": -23, + "points": [ + 664.390625, + 397.899609375, + 674.390625, + 397.899609375, + 676, + 397.899609375, + 676, + 132, + 764.859375, + 132, + 774.859375, + 132 + ], + "from": -7, + "fromPort": "8102d2db-478d-41ad-ae16-fe22c805aed1" + }, + { + "toPort": "0c408803-5d21-4f76-9f11-ee96e8a53411", + "fromPort": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec", + "points": [ + 823.375, + 175, + 823.375, + 185, + 823.375, + 188, + 823.375, + 188, + 823.375, + 231.899609375, + 823.703125, + 231.899609375, + 833.703125, + 231.899609375 + ], + "from": -23, + "to": -14 + }, + { + "toPort": "input_string", + "fromPort": "6942fe35-99ae-4911-9e99-aead7b13de16", + "points": [ + 1018.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 231.899609375, + 1028.390625, + 284, + 828, + 284, + 828, + 339.399609375, + 827.203125, + 339.399609375, + 837.203125, + 339.399609375 + ], + "from": -14, + "to": -13 + }, + { + "toPort": "eda46751-ff55-48dc-9c95-67a5f3ca220d", + "fromPort": "output_string", + "points": [ + 1021.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 339.399609375, + 1031.890625, + 396, + 828, + 396, + 828, + 452.899609375, + 828.703125, + 452.899609375, + 838.703125, + 452.899609375 + ], + "from": -13, + "to": -15 + }, + { + "toPort": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da", + "to": -11, + "points": [ + 1023.390625, + 452.899609375, + 1033.390625, + 452.899609375, + 1036, + 452.899609375, + 1036, + 459.399609375, + 1118.203125, + 459.399609375, + 1128.203125, + 459.399609375 + ], + "from": -15, + "fromPort": "69b3949c-536f-455d-acd0-eee91e24a034" + } + ], + "nodeDataArray": [ + { + "category": "memory", + "loc": "479.703125 373.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "8102d2db-478d-41ad-ae16-fe22c805aed1" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -7, + "text": "image per freq", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "add668b4-f4f1-4ea9-91fc-80e3315d0f10" + } + ] + }, + { + "category": "SplitData", + "loc": "208.203125 292", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "1b564b43-b3f0-4b92-97e1-fab12ea2aff3" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "a4fd601e-8726-49c6-ba1b-da075385caf6" + } + ], + "text": "ms-transform", + "colour": " #DDAD00", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 491, + "class": "go.Size", + "height": 398 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "35b56fbb-3bc4-4496-9cc1-cfa823f6f988" + } + ], + "isGroup": true, + "key": -20, + "fields": [ + { + "text": "Number of copies", + "name": "num_of_copies", + "value": "4" + }, + { + "text": "Scatter axis", + "name": "scatter_axis", + "value": "time" + } + ], + "categoryType": "GroupComponent", + "type": "Scatter", + "inputPorts": [ + { + "IdText": "string", + "Id": "94a41ddc-d86b-4100-a6e8-c40d2811f128" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "mstransform.sh" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "BashShellApp", + "loc": "339.203125 505", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -22, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "242.203125 350", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "0f4b9df1-ca4e-455c-adfd-d27f38fb0ab9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -4, + "text": "buffer", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "111b3131-57a7-4023-ab14-ca67f6eec728" + } + ] + }, + { + "category": "memory", + "loc": "491.703125 622.5", + "group": -20, + "outputPorts": [ + { + "IdText": "string", + "Id": "39891be9-f800-49fc-8e0c-2b595c921ba3" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -8, + "text": "clean statistics", + "type": "Memory Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "d5653abf-b12f-4d97-ac15-d26702b20748" + } + ] + }, + { + "category": "BashShellApp", + "loc": "-29.796875 45", + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "ApplicationDrop", + "isGroup": false, + "key": -5, + "text": "Clean", + "type": "Shell App", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "file", + "loc": "45.703125 168.5", + "outputPorts": [ + { + "IdText": "string", + "Id": "d768bb12-632d-4403-9b9d-0a484fbe72a9" + } + ], + "isData": true, + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + }, + { + "text": "Check file path exists", + "name": "check_filepath_exists", + "value": "1" + }, + { + "text": "File path", + "name": "filepath", + "value": "" + }, + { + "text": "Directory name", + "name": "dirname", + "value": "" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "categoryType": "DataDrop", + "shape": "Card", + "isGroup": false, + "key": -6, + "text": "MeasurementSet", + "type": "File Drop", + "inputPorts": [ + { + "IdText": "string", + "Id": "fa25afa9-43a1-4383-b10f-7e8570bb41d2" + } + ] + }, + { + "category": "DataGather", + "loc": "807.203125 158", + "type": "Gather", + "isData": false, + "outputPorts": [ + { + "IdText": "string", + "Id": "ee986ccc-7c86-42e6-8913-9c36b595b2f7" + } + ], + "outputLocalPorts": [ + { + "IdText": "string", + "Id": "56d5b31a-3734-4f44-b94c-8b59ba5f59ec" + } + ], + "text": "ImageConcat", + "colour": " #D35400", + "canHaveOutputs": true, + "canHaveInputs": true, + "application": "BashShellApp", + "desiredSize": { + "width": 285, + "class": "go.Size", + "height": 333 + }, + "inputLocalPorts": [ + { + "IdText": "string", + "Id": "5599e2ee-707e-4337-b983-bd90005bc35b" + } + ], + "isGroup": true, + "key": -23, + "fields": [ + { + "text": "Number of inputs", + "name": "num_of_inputs", + "value": "2" + }, + { + "text": "Gather axis", + "name": "gather_axis", + "value": "frequency" + } + ], + "categoryType": "GroupComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "878cdcfb-d6f8-47f7-be8b-bcbdc1159ca1" + } + ], + "appFields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "imconcat" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ] + }, + { + "category": "End", + "loc": "1128.203125 435", + "type": "End", + "outputPorts": [], + "isData": false, + "fields": [], + "colour": " #CB4335", + "canHaveOutputs": false, + "canHaveInputs": true, + "isGroup": false, + "key": -11, + "text": "Enter label", + "categoryType": "ControlComponent", + "inputPorts": [ + { + "IdText": "string", + "Id": "1c6140f4-b8bc-42e8-9ae7-7187bfffa2da" + } + ] + }, + { + "category": "BashShellApp", + "loc": "837.203125 315", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "output_string" + } + ], + "isData": false, + "fields": [ + { + "text": "Execution time", + "name": "execution_time", + "value": "5" + }, + { + "text": "Num CPUs", + "name": "num_cpus", + "value": "1" + }, + { + "text": "Group start", + "name": "group_start", + "value": "0" + }, + { + "text": "Arg01", + "name": "Arg01", + "value": "" + }, + { + "text": "Arg02", + "name": "Arg02", + "value": "" + }, + { + "text": "Arg03", + "name": "Arg03", + "value": "" + }, + { + "text": "Arg04", + "name": "Arg04", + "value": "" + }, + { + "text": "Arg05", + "name": "Arg05", + "value": "" + }, + { + "text": "Arg06", + "name": "Arg06", + "value": "" + }, + { + "text": "Arg07", + "name": "Arg07", + "value": "" + }, + { + "text": "Arg08", + "name": "Arg08", + "value": "" + }, + { + "text": "Arg09", + "name": "Arg09", + "value": "" + }, + { + "text": "Arg10", + "name": "Arg10", + "value": "" + } + ], + "colour": " #1C2833", + "canHaveOutputs": true, + "canHaveInputs": true, + "type": "Shell App", + "isGroup": false, + "key": -13, + "text": "Clean", + "categoryType": "ApplicationDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "input_string" + } + ] + }, + { + "category": "memory", + "loc": "833.703125 207.5", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "6942fe35-99ae-4911-9e99-aead7b13de16" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -14, + "text": "Enter label", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "0c408803-5d21-4f76-9f11-ee96e8a53411" + } + ] + }, + { + "category": "memory", + "loc": "838.703125 428.5", + "group": -23, + "outputPorts": [ + { + "IdText": "string", + "Id": "69b3949c-536f-455d-acd0-eee91e24a034" + } + ], + "isData": true, + "type": "Memory Drop", + "fields": [ + { + "text": "Data volume", + "name": "data_volume", + "value": "5" + }, + { + "text": "Group end", + "name": "group_end", + "value": "0" + } + ], + "colour": " #394BB2", + "canHaveOutputs": true, + "canHaveInputs": true, + "shape": "Card", + "isGroup": false, + "key": -15, + "text": "Enter label", + "categoryType": "DataDrop", + "inputPorts": [ + { + "IdText": "string", + "Id": "eda46751-ff55-48dc-9c95-67a5f3ca220d" + } + ] + } + ], + "modelData": { + "fileType": "graph" + }, + "class": "go.GraphLinksModel", + "copiesArrays": true +} \ No newline at end of file diff --git a/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json b/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json index 85e1dea79..ef5728ead 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json +++ b/daliuge-translator/test/dropmake/logical_graphs/lofar_std.json @@ -1,78 +1,1180 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Comment", "loc":"471.00000000000017 -377.0000000000003", "text":"LOFAR Standard", "key":-13}, -{"category":"memory", "text":"Calibrator \nDB", "key":-22, "loc":"-546.2187499999995 -145.9999999999998"}, -{"category":"memory", "text":"GSM", "key":-5, "loc":"390.78125000000017 -185.00000000000028"}, -{"category":"Start", "text":"Start", "key":-1, "loc":"-273.21875 -445"}, -{"category":"Variables", "text":"Global Variables", "columnDefinitions":[ {"attr":"name", "text":"Var name", "column":0},{"attr":"value", "text":"Value", "column":1},{"attr":"unit", "text":"Unit", "column":2} ], "var_list":[ {"columns":[ {"attr":"name", "text":"num_sub_band"},{"attr":"value", "text":"80"},{"attr":"unit", "text":""} ]},{"columns":[ {"attr":"name", "text":"num_beam"},{"attr":"value", "text":"2"},{"attr":"unit", "text":""} ]},{"columns":[ {"attr":"name", "text":"num_time_slice"},{"attr":"value", "text":"9"},{"attr":"unit", "text":""} ]},{"columns":[ {"attr":"name", "text":"num_subb_per_img"},{"attr":"value", "text":"10"},{"attr":"unit", "text":""} ]} ], "key":-54, "loc":"79.67187499999966 -474.99999999999994"}, -{"category":"memory", "text":"Cal Beam\nMS file", "data_volume":100, "key":-63, "loc":"-376.330987930298 -117.51546071370467", "group":-38}, -{"category":"memory", "text":"Flagged n\n Avged", "data_volume":25, "key":-36, "loc":"-377.828125 118.98453928629512", "group":-38}, -{"category":"SplitData", "text":"Scatter by Channel", "isGroup":true, "num_of_splits":"4", "scatter_axis":"frequency", "key":-38, "loc":"-287.3309879302981 3.4081855773920324", "group":-12}, -{"category":"memory", "text":"Cal Beam \nVis stream", "data_volume":100, "key":-3, "loc":"-376.5106678009031 -251.230443827312", "group":-38}, -{"category":"memory", "text":"Target Beam\nVis stream", "data_volume":100, "key":-42, "loc":"-198.35711097717325 -253.23044382731177", "group":-38}, -{"category":"Component", "text":"Data Writer", "execution_time":5, "Arg01":"MS_path=/home/lofar", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"-376.3309879302975 -186.51546071370456", "group":-38}, -{"category":"Component", "text":"Data Writer", "execution_time":5, "Arg01":"MS_path=/home/lofar", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-43, "loc":"-198.3309879302981 -173.5154607137047", "group":-38}, -{"category":"memory", "text":"Target Beam\nMS file", "data_volume":100, "key":-44, "loc":"-197.33098793029768 -95.5154607137047", "group":-38}, -{"category":"Component", "text":"NDPPP\nFlagging +\n Subtract + Average ", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-45, "loc":"-377.33098793029836 -41.51546071370474", "group":-38}, -{"category":"Component", "text":"NDPPP\nFlagging +\n Subtract + Average ", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-46, "loc":"-197.33098793029774 27.484539286295266", "group":-38}, -{"category":"memory", "text":"Flagged n\n Avged", "data_volume":25, "key":-47, "loc":"-196.8281250000002 108.98453928629526", "group":-38}, -{"category":"memory", "text":"Gain Table", "data_volume":5, "key":-53, "loc":"-380.8281249999997 267.9845392862951", "group":-38}, -{"category":"SplitData", "text":"Scatter by Timeslice", "isGroup":true, "num_of_splits":"2", "scatter_axis":"time", "key":-12, "loc":"-273.2414979934695 -10.713640594482968"}, -{"category":"Component", "text":"Gain Calibration", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-39, "loc":"-379.8281250000001 192.9845392862954", "group":-38}, -{"category":"Component", "text":"BBS Apply \nGain Cal", "execution_time":20, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-55, "loc":"-196.82812500000009 184.9845392862955", "group":-38}, -{"category":"GroupBy", "text":"Group By", "isGroup":true, "num_of_inputs":"${num_channel} * ${num_beam}", "gather_axis":"frequency", "group_by":"-38", "key":-14, "loc":"55.96484375000006 -323.19443918863976"}, -{"category":"memory", "text":"Calibrated\nMS file", "key":-57, "data_volume":25, "loc":"-198.03515625 257.4688420613602", "group":-38}, -{"category":"Comment", "text":"", "key":-16, "loc":"-101.328125 149", "group":-12}, -{"category":"memory", "text":"Local SM + \nA-team sources", "key":-35, "loc":"142.78124999999997 -41.999999999999716"}, -{"category":"Component", "text":"MakeSourceDB", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-52, "loc":"142.67187500000045 109.99999999999991"}, -{"category":"memory", "text":"LSM", "key":-33, "loc":"142.78124999999997 214.00000000000009"}, -{"category":"Component", "text":"Extract LSM", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-51, "loc":"142.67187499999974 -185.00000000000023"}, -{"category":"DataGather", "text":"Gather ", "isGroup":true, "num_of_inputs":"2", "gather_axis":"group id", "key":-41, "loc":"465.5623029067058 69.50000000000024"}, -{"category":"Component", "text":"Source finding", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-49, "loc":"428.6718749999992 -26.00000000000027", "group":-15}, -{"category":"memory", "text":"Image", "data_volume":5, "key":-48, "loc":"388.67196146526703 39.65525156656861", "group":-15}, -{"category":"Component", "text":"DD Calibration", "execution_time":20, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-56, "loc":"505.6718750000001 236.00000000000045", "group":-15}, -{"category":"Branch", "text":"DD Cal \nDone?", "key":-6, "loc":"404.6718750000004 128.99999999999997", "group":-15}, -{"category":"Component", "text":"AWImager", "execution_time":50, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-40, "loc":"518.6718750000003 38.999999999999986", "group":-15}, -{"category":"Loop", "text":"Loop", "isGroup":true, "num_of_iter":3, "key":-15, "loc":"465.5623029067058 105.00000000000011", "group":-41}, -{"category":"End", "text":"End", "key":-9, "loc":"266.7812500000001 221.9999999999999"}, -{"category":"memory", "text":"DD \nGain Tables", "data_volume":5, "group_end":1, "key":-50, "loc":"517.671875 128", "group":-15}, -{"category":"Component", "text":"Combine", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-37, "loc":"398.671875 -101", "group":-41}, -{"category":"memory", "text":"Combined", "data_volume":5, "group_end":0, "key":-58, "loc":"521.671875 -103", "group":-41} - ], - "linkDataArray": [ -{"from":-39, "to":-53, "fromPort":"B", "toPort":"T", "points":[-379.828125,209.42226359049462,-379.828125,219.42226359049462,-379.828125,230.4845392862954,-380.8281249999998,230.4845392862954,-380.8281249999998,241.54681498209618,-380.8281249999998,251.54681498209618]}, -{"from":-53, "to":-55, "fromPort":"R", "toPort":"L", "points":[-323.4866657257077,267.9845392862954,-313.4866657257077,267.9845392862954,-281.92707157135,267.9845392862954,-281.92707157135,184.9845392862954,-250.36747741699222,184.9845392862954,-240.36747741699222,184.9845392862954]}, -{"from":-63, "to":-45, "fromPort":"B", "toPort":"T", "points":[-376.3309879302979,-93.14001210530625,-376.3309879302979,-83.14001210530625,-376.8309879302979,-83.14001210530625,-376.8309879302979,-83.82863362630238,-377.3309879302979,-83.82863362630238,-377.3309879302979,-73.82863362630238]}, -{"from":-22, "to":-45, "fromPort":"B", "toPort":"L", "points":[-546.2187499999995,-121.62455139160147,-546.2187499999995,-111.62455139160147,-546.2187499999995,-41.51546071370475,-502.43681049346924,-41.51546071370475,-458.654870986939,-41.51546071370475,-448.654870986939,-41.51546071370475]}, -{"from":-45, "to":-36, "fromPort":"B", "toPort":"T", "points":[-377.33098793029785,-9.202287801107062,-377.33098793029785,0.7977121988929383,-377.33098793029785,42.703401438394856,-377.8281250000002,42.703401438394856,-377.8281250000002,84.60909067789677,-377.8281250000002,94.60909067789677]}, -{"from":-36, "to":-39, "fromPort":"B", "toPort":"T", "points":[-377.8281250000002,143.35998789469363,-377.8281250000002,153.35998789469363,-377.8281250000002,159.9534014383949,-379.82812499999994,159.9534014383949,-379.82812499999994,166.54681498209618,-379.82812499999994,176.54681498209618]}, -{"from":-3, "to":-2, "fromPort":"B", "toPort":"T", "points":[-376.51066780090315,-226.85499521891336,-376.51066780090315,-216.85499521891336,-376.51066780090315,-214.9040901184086,-376.33098793029745,-214.9040901184086,-376.33098793029745,-212.95318501790382,-376.33098793029745,-202.95318501790382]}, -{"from":-2, "to":-63, "fromPort":"B", "toPort":"T", "points":[-376.3309879302974,-170.07773640950538,-376.3309879302974,-160.07773640950538,-376.3309879302974,-155.98432286580424,-376.33098793029785,-155.98432286580424,-376.33098793029785,-151.8909093221031,-376.33098793029785,-141.8909093221031]}, -{"from":-42, "to":-43, "fromPort":"B", "toPort":"T", "points":[-198.35711097717316,-228.85499521891336,-198.35711097717316,-218.85499521891336,-198.35711097717316,-209.4040901184087,-198.3309879302979,-209.4040901184087,-198.3309879302979,-199.95318501790402,-198.3309879302979,-189.95318501790402]}, -{"from":-43, "to":-44, "fromPort":"B", "toPort":"T", "points":[-198.3309879302979,-157.07773640950558,-198.3309879302979,-147.07773640950558,-198.3309879302979,-138.48432286580436,-197.33098793029794,-138.48432286580436,-197.33098793029794,-129.89090932210314,-197.33098793029794,-119.89090932210314]}, -{"from":-44, "to":-46, "fromPort":"B", "toPort":"T", "points":[-197.33098793029794,-71.14001210530627,-197.33098793029794,-61.14001210530627,-197.33098793029794,-37.98432286580433,-197.33098793029785,-37.98432286580433,-197.33098793029785,-14.828633626302398,-197.33098793029785,-4.828633626302398]}, -{"from":-22, "to":-46, "fromPort":"B", "toPort":"L", "points":[-546.2187499999995,-121.62455139160147,-546.2187499999995,-111.62455139160147,-546.2187499999995,27.484539286295266,-412.43681049346895,27.484539286295266,-278.65487098693836,27.484539286295266,-268.65487098693836,27.484539286295266]}, -{"from":-46, "to":-47, "fromPort":"B", "toPort":"T", "points":[-197.33098793029785,59.79771219889292,-197.33098793029785,69.79771219889292,-197.33098793029785,72.20340143839489,-196.8281250000001,72.20340143839489,-196.8281250000001,74.60909067789686,-196.8281250000001,84.60909067789686]}, -{"from":-47, "to":-55, "fromPort":"B", "toPort":"T", "points":[-196.8281250000001,133.35998789469375,-196.8281250000001,143.35998789469375,-196.8281250000001,146.98453928629533,-196.82812500000006,146.98453928629533,-196.82812500000006,150.60909067789694,-196.82812500000006,160.60909067789694]}, -{"from":-55, "to":-57, "fromPort":"B", "toPort":"T", "points":[-196.82812500000006,209.3599878946938,-196.82812500000006,219.3599878946938,-196.82812500000006,221.22669067382782,-198.03515624999997,221.22669067382782,-198.03515624999997,223.09339345296183,-198.03515624999997,233.09339345296183]}, -{"from":-57, "to":-14, "fromPort":"R", "toPort":"B", "points":[-142.7293243408203,257.4688420613602,-132.7293243408203,257.4688420613602,-124,257.4688420613602,-124,257.4688420613602,-76,257.4688420613602,-76,-212,105.17157999915403,-212,105.17157999915403,-307.19443918863993,105.17157999915403,-317.19443918863993]}, -{"from":-52, "to":-33, "fromPort":"B", "toPort":"T", "points":[142.67187500000043,126.43772430419915,142.67187500000043,136.43772430419915,142.67187500000043,162,142.78124999999997,162,142.78124999999997,187.56227569580088,142.78124999999997,197.56227569580088]}, -{"from":-5, "to":-51, "fromPort":"L", "toPort":"R", "points":[350.28125000000017,-185.00000000000017,340.28125000000017,-185.00000000000017,270.6853942871093,-185.00000000000017,270.6853942871093,-185.00000000000023,201.0895385742185,-185.00000000000023,191.0895385742185,-185.00000000000023]}, -{"from":-51, "to":-35, "fromPort":"B", "toPort":"T", "points":[142.67187499999974,-168.562275695801,142.67187499999974,-158.562275695801,142.67187499999974,-120.45329322814938,142.78124999999997,-120.45329322814938,142.78124999999997,-82.34431076049776,142.78124999999997,-72.34431076049776]}, -{"from":-35, "to":-52, "fromPort":"R", "toPort":"T", "points":[206.27766418457028,-41.999999999999716,216.27766418457028,-41.999999999999716,216.27766418457028,39.95329322814951,142.67187500000045,39.95329322814951,142.67187500000045,83.5622756958007,142.67187500000045,93.5622756958007]}, -{"from":-35, "to":-46, "fromPort":"B", "toPort":"R", "points":[142.78124999999997,-11.655689239501676,142.78124999999997,-1.655689239501676,142.78124999999997,-4,142.78124999999997,-4,142.78124999999997,27.484539286295263,-115.87825965881348,27.484539286295263,-125.87825965881348,27.484539286295263]}, -{"from":-35, "to":-45, "fromPort":"L", "toPort":"R", "points":[79.28483581542966,-41.999999999999716,69.28483581542966,-41.999999999999716,-113.29671192169214,-41.999999999999716,-113.29671192169214,-41.51546071370472,-295.87825965881393,-41.51546071370472,-305.87825965881393,-41.51546071370472]}, -{"from":-1, "to":-3, "fromPort":"B", "toPort":"T", "points":[-273.21875,-425,-273.21875,-415,-273.21875,-412,-376.5106678009031,-412,-376.5106678009031,-285.6058924357104,-376.5106678009031,-275.6058924357104]}, -{"from":-1, "to":-42, "fromPort":"B", "toPort":"T", "points":[-273.21875,-425,-273.21875,-415,-273.21875,-412,-198.35711097717325,-412,-198.35711097717325,-287.6058924357102,-198.35711097717325,-277.6058924357102]}, -{"from":-14, "to":-41, "fromPort":"R", "toPort":"T", "points":[113.19174041371397,0.7279162766875871,123.19174041371397,0.7279162766875871,168.87385454440658,0.7279162766875871,168.87385454440658,-99.84113349749197,75.59860446345674,-99.84113349749197,75.59860446345674,-89.84113349749197]}, -{"from":-48, "to":-49, "fromPort":"T", "toPort":"B", "points":[388.67196146526703,23.2175272623694,388.67196146526703,13.217527262369401,388.67196146526703,6.82762578328418,428.6718749999995,6.82762578328418,428.6718749999995,0.4377243041989587,428.6718749999995,-9.562275695801041]}, -{"from":-48, "to":-6, "fromPort":"B", "toPort":"T", "points":[388.67196146526703,56.09297587076784,388.67196146526703,66.09297587076784,388.67196146526703,74.42103932698545,404.67187500000045,74.42103932698545,404.67187500000045,82.74910278320307,404.67187500000045,92.74910278320307]}, -{"from":-6, "to":-56, "fromPort":"B", "toPort":"L", "visible":true, "points":[404.67187500000045,165.25089721679683,404.67187500000045,175.25089721679683,404.67187500000045,236.00000000000045,422.09045791626005,236.00000000000045,439.50904083251964,236.00000000000045,449.50904083251964,236.00000000000045], "text":"No"}, -{"from":-40, "to":-48, "fromPort":"L", "toPort":"R", "points":[475.5512695312502,38.999999999999986,465.5512695312502,38.999999999999986,450.60204346914486,38.999999999999986,450.60204346914486,39.65525156656862,435.6528174070395,39.65525156656862,425.6528174070395,39.65525156656862]}, -{"from":-6, "to":-9, "fromPort":"L", "toPort":"T", "visible":true, "points":[352.92778015136764,128.99999999999994,342.92778015136764,128.99999999999994,332,128.99999999999994,332,128.99999999999994,266.7812500000001,128.99999999999994,266.7812500000001,191.9999999999999,266.7812500000001,201.9999999999999]}, -{"from":-56, "to":-50, "fromPort":"T", "toPort":"B", "points":[505.6718750000001,219.56227569580125,505.6718750000001,209.56227569580125,505.6718750000001,185.96886215209983,517.671875,185.96886215209983,517.671875,162.37544860839841,517.671875,152.37544860839841]}, -{"from":-37, "to":-58, "fromPort":"R", "toPort":"L", "points":[436.5061569213867,-100.99999999999999,446.5061569213867,-100.99999999999999,451.44279956817627,-100.99999999999999,451.44279956817627,-103,456.3794422149658,-103,466.3794422149658,-103]}, -{"from":-58, "to":-40, "fromPort":"B", "toPort":"T", "points":[521.671875,-86.56227569580079,521.671875,-76.56227569580079,521.671875,-32.000000000000014,518.6718750000002,-32.000000000000014,518.6718750000002,12.562275695800764,518.6718750000002,22.562275695800764]} - ]} + "nodeDataArray": [ + { + "category": "Comment", + "loc": "471.00000000000017 -377.0000000000003", + "text": "LOFAR Standard", + "key": -13 + }, + { + "category": "memory", + "text": "Calibrator \nDB", + "key": -22, + "loc": "-546.2187499999995 -145.9999999999998" + }, + { + "category": "memory", + "text": "GSM", + "key": -5, + "loc": "390.78125000000017 -185.00000000000028" + }, + { + "category": "Start", + "text": "Start", + "key": -1, + "loc": "-273.21875 -445" + }, + { + "category": "Variables", + "text": "Global Variables", + "columnDefinitions": [ + { + "attr": "name", + "text": "Var name", + "column": 0 + }, + { + "attr": "value", + "text": "Value", + "column": 1 + }, + { + "attr": "unit", + "text": "Unit", + "column": 2 + } + ], + "var_list": [ + { + "columns": [ + { + "attr": "name", + "text": "num_sub_band" + }, + { + "attr": "value", + "text": "80" + }, + { + "attr": "unit", + "text": "" + } + ] + }, + { + "columns": [ + { + "attr": "name", + "text": "num_beam" + }, + { + "attr": "value", + "text": "2" + }, + { + "attr": "unit", + "text": "" + } + ] + }, + { + "columns": [ + { + "attr": "name", + "text": "num_time_slice" + }, + { + "attr": "value", + "text": "9" + }, + { + "attr": "unit", + "text": "" + } + ] + }, + { + "columns": [ + { + "attr": "name", + "text": "num_subb_per_img" + }, + { + "attr": "value", + "text": "10" + }, + { + "attr": "unit", + "text": "" + } + ] + } + ], + "key": -54, + "loc": "79.67187499999966 -474.99999999999994" + }, + { + "category": "memory", + "text": "Cal Beam\nMS file", + "data_volume": 100, + "key": -63, + "loc": "-376.330987930298 -117.51546071370467", + "group": -38 + }, + { + "category": "memory", + "text": "Flagged n\n Avged", + "data_volume": 25, + "key": -36, + "loc": "-377.828125 118.98453928629512", + "group": -38 + }, + { + "category": "SplitData", + "text": "Scatter by Channel", + "isGroup": true, + "num_of_splits": "4", + "scatter_axis": "frequency", + "key": -38, + "loc": "-287.3309879302981 3.4081855773920324", + "group": -12 + }, + { + "category": "memory", + "text": "Cal Beam \nVis stream", + "data_volume": 100, + "key": -3, + "loc": "-376.5106678009031 -251.230443827312", + "group": -38 + }, + { + "category": "memory", + "text": "Target Beam\nVis stream", + "data_volume": 100, + "key": -42, + "loc": "-198.35711097717325 -253.23044382731177", + "group": -38 + }, + { + "category": "Component", + "text": "Data Writer", + "execution_time": 5, + "Arg01": "MS_path=/home/lofar", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "-376.3309879302975 -186.51546071370456", + "group": -38 + }, + { + "category": "Component", + "text": "Data Writer", + "execution_time": 5, + "Arg01": "MS_path=/home/lofar", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -43, + "loc": "-198.3309879302981 -173.5154607137047", + "group": -38 + }, + { + "category": "memory", + "text": "Target Beam\nMS file", + "data_volume": 100, + "key": -44, + "loc": "-197.33098793029768 -95.5154607137047", + "group": -38 + }, + { + "category": "Component", + "text": "NDPPP\nFlagging +\n Subtract + Average ", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -45, + "loc": "-377.33098793029836 -41.51546071370474", + "group": -38 + }, + { + "category": "Component", + "text": "NDPPP\nFlagging +\n Subtract + Average ", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -46, + "loc": "-197.33098793029774 27.484539286295266", + "group": -38 + }, + { + "category": "memory", + "text": "Flagged n\n Avged", + "data_volume": 25, + "key": -47, + "loc": "-196.8281250000002 108.98453928629526", + "group": -38 + }, + { + "category": "memory", + "text": "Gain Table", + "data_volume": 5, + "key": -53, + "loc": "-380.8281249999997 267.9845392862951", + "group": -38 + }, + { + "category": "SplitData", + "text": "Scatter by Timeslice", + "isGroup": true, + "num_of_splits": "2", + "scatter_axis": "time", + "key": -12, + "loc": "-273.2414979934695 -10.713640594482968" + }, + { + "category": "Component", + "text": "Gain Calibration", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -39, + "loc": "-379.8281250000001 192.9845392862954", + "group": -38 + }, + { + "category": "Component", + "text": "BBS Apply \nGain Cal", + "execution_time": 20, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -55, + "loc": "-196.82812500000009 184.9845392862955", + "group": -38 + }, + { + "category": "GroupBy", + "text": "Group By", + "isGroup": true, + "num_of_inputs": "${num_channel} * ${num_beam}", + "gather_axis": "frequency", + "group_by": "-38", + "key": -14, + "loc": "55.96484375000006 -323.19443918863976" + }, + { + "category": "memory", + "text": "Calibrated\nMS file", + "key": -57, + "data_volume": 25, + "loc": "-198.03515625 257.4688420613602", + "group": -38 + }, + { + "category": "Comment", + "text": "", + "key": -16, + "loc": "-101.328125 149", + "group": -12 + }, + { + "category": "memory", + "text": "Local SM + \nA-team sources", + "key": -35, + "loc": "142.78124999999997 -41.999999999999716" + }, + { + "category": "Component", + "text": "MakeSourceDB", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -52, + "loc": "142.67187500000045 109.99999999999991" + }, + { + "category": "memory", + "text": "LSM", + "key": -33, + "loc": "142.78124999999997 214.00000000000009" + }, + { + "category": "Component", + "text": "Extract LSM", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -51, + "loc": "142.67187499999974 -185.00000000000023" + }, + { + "category": "DataGather", + "text": "Gather ", + "isGroup": true, + "num_of_inputs": "2", + "gather_axis": "group id", + "key": -41, + "loc": "465.5623029067058 69.50000000000024" + }, + { + "category": "Component", + "text": "Source finding", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -49, + "loc": "428.6718749999992 -26.00000000000027", + "group": -15 + }, + { + "category": "memory", + "text": "Image", + "data_volume": 5, + "key": -48, + "loc": "388.67196146526703 39.65525156656861", + "group": -15 + }, + { + "category": "Component", + "text": "DD Calibration", + "execution_time": 20, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -56, + "loc": "505.6718750000001 236.00000000000045", + "group": -15 + }, + { + "category": "Branch", + "text": "DD Cal \nDone?", + "key": -6, + "loc": "404.6718750000004 128.99999999999997", + "group": -15 + }, + { + "category": "Component", + "text": "AWImager", + "execution_time": 50, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -40, + "loc": "518.6718750000003 38.999999999999986", + "group": -15 + }, + { + "category": "Loop", + "text": "Loop", + "isGroup": true, + "num_of_iter": 3, + "key": -15, + "loc": "465.5623029067058 105.00000000000011", + "group": -41 + }, + { + "category": "End", + "text": "End", + "key": -9, + "loc": "266.7812500000001 221.9999999999999" + }, + { + "category": "memory", + "text": "DD \nGain Tables", + "data_volume": 5, + "group_end": 1, + "key": -50, + "loc": "517.671875 128", + "group": -15 + }, + { + "category": "Component", + "text": "Combine", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -37, + "loc": "398.671875 -101", + "group": -41 + }, + { + "category": "memory", + "text": "Combined", + "data_volume": 5, + "group_end": 0, + "key": -58, + "loc": "521.671875 -103", + "group": -41 + } + ], + "linkDataArray": [ + { + "from": -39, + "to": -53, + "fromPort": "B", + "toPort": "T", + "points": [ + -379.828125, + 209.42226359049462, + -379.828125, + 219.42226359049462, + -379.828125, + 230.4845392862954, + -380.8281249999998, + 230.4845392862954, + -380.8281249999998, + 241.54681498209618, + -380.8281249999998, + 251.54681498209618 + ] + }, + { + "from": -53, + "to": -55, + "fromPort": "R", + "toPort": "L", + "points": [ + -323.4866657257077, + 267.9845392862954, + -313.4866657257077, + 267.9845392862954, + -281.92707157135, + 267.9845392862954, + -281.92707157135, + 184.9845392862954, + -250.36747741699222, + 184.9845392862954, + -240.36747741699222, + 184.9845392862954 + ] + }, + { + "from": -63, + "to": -45, + "fromPort": "B", + "toPort": "T", + "points": [ + -376.3309879302979, + -93.14001210530625, + -376.3309879302979, + -83.14001210530625, + -376.8309879302979, + -83.14001210530625, + -376.8309879302979, + -83.82863362630238, + -377.3309879302979, + -83.82863362630238, + -377.3309879302979, + -73.82863362630238 + ] + }, + { + "from": -22, + "to": -45, + "fromPort": "B", + "toPort": "L", + "points": [ + -546.2187499999995, + -121.62455139160147, + -546.2187499999995, + -111.62455139160147, + -546.2187499999995, + -41.51546071370475, + -502.43681049346924, + -41.51546071370475, + -458.654870986939, + -41.51546071370475, + -448.654870986939, + -41.51546071370475 + ] + }, + { + "from": -45, + "to": -36, + "fromPort": "B", + "toPort": "T", + "points": [ + -377.33098793029785, + -9.202287801107062, + -377.33098793029785, + 0.7977121988929383, + -377.33098793029785, + 42.703401438394856, + -377.8281250000002, + 42.703401438394856, + -377.8281250000002, + 84.60909067789677, + -377.8281250000002, + 94.60909067789677 + ] + }, + { + "from": -36, + "to": -39, + "fromPort": "B", + "toPort": "T", + "points": [ + -377.8281250000002, + 143.35998789469363, + -377.8281250000002, + 153.35998789469363, + -377.8281250000002, + 159.9534014383949, + -379.82812499999994, + 159.9534014383949, + -379.82812499999994, + 166.54681498209618, + -379.82812499999994, + 176.54681498209618 + ] + }, + { + "from": -3, + "to": -2, + "fromPort": "B", + "toPort": "T", + "points": [ + -376.51066780090315, + -226.85499521891336, + -376.51066780090315, + -216.85499521891336, + -376.51066780090315, + -214.9040901184086, + -376.33098793029745, + -214.9040901184086, + -376.33098793029745, + -212.95318501790382, + -376.33098793029745, + -202.95318501790382 + ] + }, + { + "from": -2, + "to": -63, + "fromPort": "B", + "toPort": "T", + "points": [ + -376.3309879302974, + -170.07773640950538, + -376.3309879302974, + -160.07773640950538, + -376.3309879302974, + -155.98432286580424, + -376.33098793029785, + -155.98432286580424, + -376.33098793029785, + -151.8909093221031, + -376.33098793029785, + -141.8909093221031 + ] + }, + { + "from": -42, + "to": -43, + "fromPort": "B", + "toPort": "T", + "points": [ + -198.35711097717316, + -228.85499521891336, + -198.35711097717316, + -218.85499521891336, + -198.35711097717316, + -209.4040901184087, + -198.3309879302979, + -209.4040901184087, + -198.3309879302979, + -199.95318501790402, + -198.3309879302979, + -189.95318501790402 + ] + }, + { + "from": -43, + "to": -44, + "fromPort": "B", + "toPort": "T", + "points": [ + -198.3309879302979, + -157.07773640950558, + -198.3309879302979, + -147.07773640950558, + -198.3309879302979, + -138.48432286580436, + -197.33098793029794, + -138.48432286580436, + -197.33098793029794, + -129.89090932210314, + -197.33098793029794, + -119.89090932210314 + ] + }, + { + "from": -44, + "to": -46, + "fromPort": "B", + "toPort": "T", + "points": [ + -197.33098793029794, + -71.14001210530627, + -197.33098793029794, + -61.14001210530627, + -197.33098793029794, + -37.98432286580433, + -197.33098793029785, + -37.98432286580433, + -197.33098793029785, + -14.828633626302398, + -197.33098793029785, + -4.828633626302398 + ] + }, + { + "from": -22, + "to": -46, + "fromPort": "B", + "toPort": "L", + "points": [ + -546.2187499999995, + -121.62455139160147, + -546.2187499999995, + -111.62455139160147, + -546.2187499999995, + 27.484539286295266, + -412.43681049346895, + 27.484539286295266, + -278.65487098693836, + 27.484539286295266, + -268.65487098693836, + 27.484539286295266 + ] + }, + { + "from": -46, + "to": -47, + "fromPort": "B", + "toPort": "T", + "points": [ + -197.33098793029785, + 59.79771219889292, + -197.33098793029785, + 69.79771219889292, + -197.33098793029785, + 72.20340143839489, + -196.8281250000001, + 72.20340143839489, + -196.8281250000001, + 74.60909067789686, + -196.8281250000001, + 84.60909067789686 + ] + }, + { + "from": -47, + "to": -55, + "fromPort": "B", + "toPort": "T", + "points": [ + -196.8281250000001, + 133.35998789469375, + -196.8281250000001, + 143.35998789469375, + -196.8281250000001, + 146.98453928629533, + -196.82812500000006, + 146.98453928629533, + -196.82812500000006, + 150.60909067789694, + -196.82812500000006, + 160.60909067789694 + ] + }, + { + "from": -55, + "to": -57, + "fromPort": "B", + "toPort": "T", + "points": [ + -196.82812500000006, + 209.3599878946938, + -196.82812500000006, + 219.3599878946938, + -196.82812500000006, + 221.22669067382782, + -198.03515624999997, + 221.22669067382782, + -198.03515624999997, + 223.09339345296183, + -198.03515624999997, + 233.09339345296183 + ] + }, + { + "from": -57, + "to": -14, + "fromPort": "R", + "toPort": "B", + "points": [ + -142.7293243408203, + 257.4688420613602, + -132.7293243408203, + 257.4688420613602, + -124, + 257.4688420613602, + -124, + 257.4688420613602, + -76, + 257.4688420613602, + -76, + -212, + 105.17157999915403, + -212, + 105.17157999915403, + -307.19443918863993, + 105.17157999915403, + -317.19443918863993 + ] + }, + { + "from": -52, + "to": -33, + "fromPort": "B", + "toPort": "T", + "points": [ + 142.67187500000043, + 126.43772430419915, + 142.67187500000043, + 136.43772430419915, + 142.67187500000043, + 162, + 142.78124999999997, + 162, + 142.78124999999997, + 187.56227569580088, + 142.78124999999997, + 197.56227569580088 + ] + }, + { + "from": -5, + "to": -51, + "fromPort": "L", + "toPort": "R", + "points": [ + 350.28125000000017, + -185.00000000000017, + 340.28125000000017, + -185.00000000000017, + 270.6853942871093, + -185.00000000000017, + 270.6853942871093, + -185.00000000000023, + 201.0895385742185, + -185.00000000000023, + 191.0895385742185, + -185.00000000000023 + ] + }, + { + "from": -51, + "to": -35, + "fromPort": "B", + "toPort": "T", + "points": [ + 142.67187499999974, + -168.562275695801, + 142.67187499999974, + -158.562275695801, + 142.67187499999974, + -120.45329322814938, + 142.78124999999997, + -120.45329322814938, + 142.78124999999997, + -82.34431076049776, + 142.78124999999997, + -72.34431076049776 + ] + }, + { + "from": -35, + "to": -52, + "fromPort": "R", + "toPort": "T", + "points": [ + 206.27766418457028, + -41.999999999999716, + 216.27766418457028, + -41.999999999999716, + 216.27766418457028, + 39.95329322814951, + 142.67187500000045, + 39.95329322814951, + 142.67187500000045, + 83.5622756958007, + 142.67187500000045, + 93.5622756958007 + ] + }, + { + "from": -35, + "to": -46, + "fromPort": "B", + "toPort": "R", + "points": [ + 142.78124999999997, + -11.655689239501676, + 142.78124999999997, + -1.655689239501676, + 142.78124999999997, + -4, + 142.78124999999997, + -4, + 142.78124999999997, + 27.484539286295263, + -115.87825965881348, + 27.484539286295263, + -125.87825965881348, + 27.484539286295263 + ] + }, + { + "from": -35, + "to": -45, + "fromPort": "L", + "toPort": "R", + "points": [ + 79.28483581542966, + -41.999999999999716, + 69.28483581542966, + -41.999999999999716, + -113.29671192169214, + -41.999999999999716, + -113.29671192169214, + -41.51546071370472, + -295.87825965881393, + -41.51546071370472, + -305.87825965881393, + -41.51546071370472 + ] + }, + { + "from": -1, + "to": -3, + "fromPort": "B", + "toPort": "T", + "points": [ + -273.21875, + -425, + -273.21875, + -415, + -273.21875, + -412, + -376.5106678009031, + -412, + -376.5106678009031, + -285.6058924357104, + -376.5106678009031, + -275.6058924357104 + ] + }, + { + "from": -1, + "to": -42, + "fromPort": "B", + "toPort": "T", + "points": [ + -273.21875, + -425, + -273.21875, + -415, + -273.21875, + -412, + -198.35711097717325, + -412, + -198.35711097717325, + -287.6058924357102, + -198.35711097717325, + -277.6058924357102 + ] + }, + { + "from": -14, + "to": -41, + "fromPort": "R", + "toPort": "T", + "points": [ + 113.19174041371397, + 0.7279162766875871, + 123.19174041371397, + 0.7279162766875871, + 168.87385454440658, + 0.7279162766875871, + 168.87385454440658, + -99.84113349749197, + 75.59860446345674, + -99.84113349749197, + 75.59860446345674, + -89.84113349749197 + ] + }, + { + "from": -48, + "to": -49, + "fromPort": "T", + "toPort": "B", + "points": [ + 388.67196146526703, + 23.2175272623694, + 388.67196146526703, + 13.217527262369401, + 388.67196146526703, + 6.82762578328418, + 428.6718749999995, + 6.82762578328418, + 428.6718749999995, + 0.4377243041989587, + 428.6718749999995, + -9.562275695801041 + ] + }, + { + "from": -48, + "to": -6, + "fromPort": "B", + "toPort": "T", + "points": [ + 388.67196146526703, + 56.09297587076784, + 388.67196146526703, + 66.09297587076784, + 388.67196146526703, + 74.42103932698545, + 404.67187500000045, + 74.42103932698545, + 404.67187500000045, + 82.74910278320307, + 404.67187500000045, + 92.74910278320307 + ] + }, + { + "from": -6, + "to": -56, + "fromPort": "B", + "toPort": "L", + "visible": true, + "points": [ + 404.67187500000045, + 165.25089721679683, + 404.67187500000045, + 175.25089721679683, + 404.67187500000045, + 236.00000000000045, + 422.09045791626005, + 236.00000000000045, + 439.50904083251964, + 236.00000000000045, + 449.50904083251964, + 236.00000000000045 + ], + "text": "No" + }, + { + "from": -40, + "to": -48, + "fromPort": "L", + "toPort": "R", + "points": [ + 475.5512695312502, + 38.999999999999986, + 465.5512695312502, + 38.999999999999986, + 450.60204346914486, + 38.999999999999986, + 450.60204346914486, + 39.65525156656862, + 435.6528174070395, + 39.65525156656862, + 425.6528174070395, + 39.65525156656862 + ] + }, + { + "from": -6, + "to": -9, + "fromPort": "L", + "toPort": "T", + "visible": true, + "points": [ + 352.92778015136764, + 128.99999999999994, + 342.92778015136764, + 128.99999999999994, + 332, + 128.99999999999994, + 332, + 128.99999999999994, + 266.7812500000001, + 128.99999999999994, + 266.7812500000001, + 191.9999999999999, + 266.7812500000001, + 201.9999999999999 + ] + }, + { + "from": -56, + "to": -50, + "fromPort": "T", + "toPort": "B", + "points": [ + 505.6718750000001, + 219.56227569580125, + 505.6718750000001, + 209.56227569580125, + 505.6718750000001, + 185.96886215209983, + 517.671875, + 185.96886215209983, + 517.671875, + 162.37544860839841, + 517.671875, + 152.37544860839841 + ] + }, + { + "from": -37, + "to": -58, + "fromPort": "R", + "toPort": "L", + "points": [ + 436.5061569213867, + -100.99999999999999, + 446.5061569213867, + -100.99999999999999, + 451.44279956817627, + -100.99999999999999, + 451.44279956817627, + -103, + 456.3794422149658, + -103, + 466.3794422149658, + -103 + ] + }, + { + "from": -58, + "to": -40, + "fromPort": "B", + "toPort": "T", + "points": [ + 521.671875, + -86.56227569580079, + 521.671875, + -76.56227569580079, + 521.671875, + -32.000000000000014, + 518.6718750000002, + -32.000000000000014, + 518.6718750000002, + 12.562275695800764, + 518.6718750000002, + 22.562275695800764 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json b/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json index b95c6b514..adcca7489 100644 --- a/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json +++ b/daliuge-translator/test/dropmake/logical_graphs/test_grpby_gather.json @@ -1,39 +1,458 @@ -{ "class": "go.GraphLinksModel", +{ + "class": "go.GraphLinksModel", "linkFromPortIdProperty": "fromPort", "linkToPortIdProperty": "toPort", - "nodeDataArray": [ -{"category":"Start", "text":"Start", "key":-1, "loc":"-754.3281250000008 -817.0000000000003"}, -{"category":"memory", "text":"Data2", "data_volume":5, "key":-3, "loc":"-1038.3281250000005 -608.0000000000002"}, -{"category":"SplitData", "text":"Scatter1", "isGroup":true, "num_of_splits":"5", "scatter_axis":"time", "key":-12, "loc":"-765.8664207458503 -514.6218261718749"}, -{"category":"SplitData", "text":"Scatter2", "isGroup":true, "num_of_splits":"4", "scatter_axis":"frequency", "key":-5, "loc":"-800.3281250000013 -537.9999999999997", "group":-12}, -{"category":"Component", "text":"Component1", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-2, "loc":"-800.3281250000013 -540.9999999999994", "group":-5}, -{"category":"memory", "text":"Data1", "data_volume":5, "key":-8, "loc":"-800.3281250000001 -594.9999999999997", "group":-5}, -{"category":"memory", "text":"Data3", "data_volume":5, "key":-10, "loc":"-800.3281249999995 -480.99999999999955", "group":-5}, -{"category":"Component", "text":"Component4", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-21, "loc":"-1135.3281249999998 -469.9999999999997", "group":-24}, -{"category":"Component", "text":"Component", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-22, "loc":"-721.328125 -400", "group":-12}, -{"category":"memory", "text":"Data5", "data_volume":5, "key":-23, "loc":"-1137.3281249999995 -407", "group":-24}, -{"category":"DataGather", "text":"Gather", "isGroup":true, "num_of_inputs":2, "gather_axis":"frequency", "key":-24, "loc":"-1135.3281249999998 -438.4999999999999"}, -{"category":"GroupBy", "text":"Group By 2", "isGroup":true, "group_key":-5, "group_axis":"frequency", "key":-14, "loc":"-800.328125 -265"}, -{"category":"Component", "text":"Component 2", "execution_time":5, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-20, "loc":"-800.328125 -265", "group":-14}, -{"category":"DataGather", "text":"Gather", "isGroup":true, "num_of_inputs":2, "gather_axis":"frequency", "key":-25, "loc":"-380.81971359252907 -289"}, -{"category":"memory", "text":"Data4", "data_volume":5, "key":-27, "loc":"-396.32812499999955 -253", "group":-25}, -{"category":"GroupBy", "text":"Group By 1", "isGroup":true, "group_key":-5, "group_axis":"frequency", "key":-28, "loc":"-555.3281249999995 -566.0000000000001"}, -{"category":"Comment", "text":"All data within each group\nis processed by Cpnt2", "key":-16, "loc":"-971.328125 -311"}, -{"category":"Comment", "text":"Data gathered from every 2 groups\nis processed by Cpnt3", "key":-19, "loc":"-335.328125 -416"}, -{"category":"Component", "text":"Component3", "execution_time":5, "group_start":1, "Arg01":"", "Arg02":"", "Arg03":"", "Arg04":"", "Arg05":"", "Arg06":"", "Arg07":"", "Arg08":"", "Arg09":"", "Arg10":"", "key":-29, "loc":"-380.328125 -325", "group":-25}, -{"category":"Comment", "text":"Data of the same group_key value on the group_axis is gathered inside the same group", "key":-26, "loc":"-480.328125 -656"}, -{"category":"Comment", "text":"Sorry this is NOT Lofar Calibration pipeline", "key":-17, "loc":"-1130.328125 -825"} - ], - "linkDataArray": [ -{"from":-1, "to":-8, "fromPort":"B", "toPort":"T", "points":[-754.3281250000009,-797.0000000000003,-754.3281250000009,-787.0000000000003,-754.3281250000009,-704.2188621520996,-800.3281250000001,-704.2188621520996,-800.3281250000001,-621.4377243041989,-800.3281250000001,-611.4377243041989]}, -{"from":-3, "to":-2, "fromPort":"R", "toPort":"L", "points":[-1002.8728713989262,-608.0000000000002,-992.8728713989262,-608.0000000000002,-992.8728713989262,-608.0000000000002,-992.8728713989262,-540.9999999999992,-860.800201416017,-540.9999999999992,-850.800201416017,-540.9999999999992]}, -{"from":-8, "to":-2, "fromPort":"B", "toPort":"T", "points":[-800.3281250000001,-578.5622756958005,-800.3281250000001,-568.5622756958005,-800.3281250000001,-567.9999999999995,-800.3281250000014,-567.9999999999995,-800.3281250000014,-567.4377243041985,-800.3281250000014,-557.4377243041985]}, -{"from":-2, "to":-10, "fromPort":"B", "toPort":"T", "points":[-800.3281250000014,-524.5622756958,-800.3281250000014,-514.5622756958,-800.3281250000014,-510.99999999999943,-800.3281249999995,-510.99999999999943,-800.3281249999995,-507.43772430419875,-800.3281249999995,-497.43772430419875]}, -{"from":-21, "to":-23, "fromPort":"B", "toPort":"T", "points":[-1135.3281249999998,-453.5622756958002,-1135.3281249999998,-443.5622756958002,-1135.3281249999998,-438.4999999999997,-1137.3281249999998,-438.4999999999997,-1137.3281249999998,-433.4377243041992,-1137.3281249999998,-423.4377243041992]}, -{"from":-10, "to":-22, "fromPort":"R", "toPort":"T", "points":[-764.8728713989253,-480.9999999999996,-754.8728713989253,-480.9999999999996,-748,-480.9999999999996,-748,-480.9999999999996,-721.328125,-480.9999999999996,-721.328125,-426.4377243041992,-721.328125,-416.4377243041992]}, -{"from":-10, "to":-24, "fromPort":"L", "toPort":"R", "points":[-835.7833786010738,-480.99999999999955,-845.7833786010738,-480.99999999999955,-852,-480.99999999999955,-852,-480.99999999999955,-876,-480.99999999999955,-876,-453.1632812499999,-1068.8560485839841,-453.1632812499999,-1078.8560485839841,-453.1632812499999]}, -{"from":-10, "to":-14, "fromPort":"B", "toPort":"T", "points":[-800.3281249999995,-464.56227569580034,-800.3281249999995,-454.56227569580034,-800.3281249999995,-444,-800.3281249999995,-444,-800.3281249999995,-364,-796.9580968196937,-364,-796.9580968196937,-326.76428680419923,-796.9580968196937,-316.76428680419923]}, -{"from":-10, "to":-28, "fromPort":"R", "toPort":"L", "points":[-764.8728713989253,-480.99999999999955,-754.8728713989253,-480.99999999999955,-748,-480.99999999999955,-748,-480.99999999999955,-660,-480.99999999999955,-660,-580.6632812500003,-571.3281249999993,-580.6632812500003,-561.3281249999993,-580.6632812500003]}, -{"from":-28, "to":-25, "fromPort":"B", "toPort":"L", "points":[-33.83535590729249,-61.207674232613215,-33.83535590729249,-51.207674232613215,-33.83535590729249,9.13475769039826,-89.62485198496458,9.13475769039826,-89.62485198496458,-47.06727364578387,-79.62485198496458,-47.06727364578387]}, -{"from":-29, "to":-27, "fromPort":"B", "toPort":"T", "points":[-380.328125,-308.5622756958008,-380.328125,-298.5622756958008,-380.328125,-288.99999999999994,-396.32812499999955,-288.99999999999994,-396.32812499999955,-279.4377243041991,-396.32812499999955,-269.4377243041991]} - ]} + "nodeDataArray": [ + { + "category": "Start", + "text": "Start", + "key": -1, + "loc": "-754.3281250000008 -817.0000000000003" + }, + { + "category": "memory", + "text": "Data2", + "data_volume": 5, + "key": -3, + "loc": "-1038.3281250000005 -608.0000000000002" + }, + { + "category": "SplitData", + "text": "Scatter1", + "isGroup": true, + "num_of_splits": "5", + "scatter_axis": "time", + "key": -12, + "loc": "-765.8664207458503 -514.6218261718749" + }, + { + "category": "SplitData", + "text": "Scatter2", + "isGroup": true, + "num_of_splits": "4", + "scatter_axis": "frequency", + "key": -5, + "loc": "-800.3281250000013 -537.9999999999997", + "group": -12 + }, + { + "category": "Component", + "text": "Component1", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -2, + "loc": "-800.3281250000013 -540.9999999999994", + "group": -5 + }, + { + "category": "memory", + "text": "Data1", + "data_volume": 5, + "key": -8, + "loc": "-800.3281250000001 -594.9999999999997", + "group": -5 + }, + { + "category": "memory", + "text": "Data3", + "data_volume": 5, + "key": -10, + "loc": "-800.3281249999995 -480.99999999999955", + "group": -5 + }, + { + "category": "Component", + "text": "Component4", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -21, + "loc": "-1135.3281249999998 -469.9999999999997", + "group": -24 + }, + { + "category": "Component", + "text": "Component", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -22, + "loc": "-721.328125 -400", + "group": -12 + }, + { + "category": "memory", + "text": "Data5", + "data_volume": 5, + "key": -23, + "loc": "-1137.3281249999995 -407", + "group": -24 + }, + { + "category": "DataGather", + "text": "Gather", + "isGroup": true, + "num_of_inputs": 2, + "gather_axis": "frequency", + "key": -24, + "loc": "-1135.3281249999998 -438.4999999999999" + }, + { + "category": "GroupBy", + "text": "Group By 2", + "isGroup": true, + "group_key": -5, + "group_axis": "frequency", + "key": -14, + "loc": "-800.328125 -265" + }, + { + "category": "Component", + "text": "Component 2", + "execution_time": 5, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -20, + "loc": "-800.328125 -265", + "group": -14 + }, + { + "category": "DataGather", + "text": "Gather", + "isGroup": true, + "num_of_inputs": 2, + "gather_axis": "frequency", + "key": -25, + "loc": "-380.81971359252907 -289" + }, + { + "category": "memory", + "text": "Data4", + "data_volume": 5, + "key": -27, + "loc": "-396.32812499999955 -253", + "group": -25 + }, + { + "category": "GroupBy", + "text": "Group By 1", + "isGroup": true, + "group_key": -5, + "group_axis": "frequency", + "key": -28, + "loc": "-555.3281249999995 -566.0000000000001" + }, + { + "category": "Comment", + "text": "All data within each group\nis processed by Cpnt2", + "key": -16, + "loc": "-971.328125 -311" + }, + { + "category": "Comment", + "text": "Data gathered from every 2 groups\nis processed by Cpnt3", + "key": -19, + "loc": "-335.328125 -416" + }, + { + "category": "Component", + "text": "Component3", + "execution_time": 5, + "group_start": 1, + "Arg01": "", + "Arg02": "", + "Arg03": "", + "Arg04": "", + "Arg05": "", + "Arg06": "", + "Arg07": "", + "Arg08": "", + "Arg09": "", + "Arg10": "", + "key": -29, + "loc": "-380.328125 -325", + "group": -25 + }, + { + "category": "Comment", + "text": "Data of the same group_key value on the group_axis is gathered inside the same group", + "key": -26, + "loc": "-480.328125 -656" + }, + { + "category": "Comment", + "text": "Sorry this is NOT Lofar Calibration pipeline", + "key": -17, + "loc": "-1130.328125 -825" + } + ], + "linkDataArray": [ + { + "from": -1, + "to": -8, + "fromPort": "B", + "toPort": "T", + "points": [ + -754.3281250000009, + -797.0000000000003, + -754.3281250000009, + -787.0000000000003, + -754.3281250000009, + -704.2188621520996, + -800.3281250000001, + -704.2188621520996, + -800.3281250000001, + -621.4377243041989, + -800.3281250000001, + -611.4377243041989 + ] + }, + { + "from": -3, + "to": -2, + "fromPort": "R", + "toPort": "L", + "points": [ + -1002.8728713989262, + -608.0000000000002, + -992.8728713989262, + -608.0000000000002, + -992.8728713989262, + -608.0000000000002, + -992.8728713989262, + -540.9999999999992, + -860.800201416017, + -540.9999999999992, + -850.800201416017, + -540.9999999999992 + ] + }, + { + "from": -8, + "to": -2, + "fromPort": "B", + "toPort": "T", + "points": [ + -800.3281250000001, + -578.5622756958005, + -800.3281250000001, + -568.5622756958005, + -800.3281250000001, + -567.9999999999995, + -800.3281250000014, + -567.9999999999995, + -800.3281250000014, + -567.4377243041985, + -800.3281250000014, + -557.4377243041985 + ] + }, + { + "from": -2, + "to": -10, + "fromPort": "B", + "toPort": "T", + "points": [ + -800.3281250000014, + -524.5622756958, + -800.3281250000014, + -514.5622756958, + -800.3281250000014, + -510.99999999999943, + -800.3281249999995, + -510.99999999999943, + -800.3281249999995, + -507.43772430419875, + -800.3281249999995, + -497.43772430419875 + ] + }, + { + "from": -21, + "to": -23, + "fromPort": "B", + "toPort": "T", + "points": [ + -1135.3281249999998, + -453.5622756958002, + -1135.3281249999998, + -443.5622756958002, + -1135.3281249999998, + -438.4999999999997, + -1137.3281249999998, + -438.4999999999997, + -1137.3281249999998, + -433.4377243041992, + -1137.3281249999998, + -423.4377243041992 + ] + }, + { + "from": -10, + "to": -22, + "fromPort": "R", + "toPort": "T", + "points": [ + -764.8728713989253, + -480.9999999999996, + -754.8728713989253, + -480.9999999999996, + -748, + -480.9999999999996, + -748, + -480.9999999999996, + -721.328125, + -480.9999999999996, + -721.328125, + -426.4377243041992, + -721.328125, + -416.4377243041992 + ] + }, + { + "from": -10, + "to": -24, + "fromPort": "L", + "toPort": "R", + "points": [ + -835.7833786010738, + -480.99999999999955, + -845.7833786010738, + -480.99999999999955, + -852, + -480.99999999999955, + -852, + -480.99999999999955, + -876, + -480.99999999999955, + -876, + -453.1632812499999, + -1068.8560485839841, + -453.1632812499999, + -1078.8560485839841, + -453.1632812499999 + ] + }, + { + "from": -10, + "to": -14, + "fromPort": "B", + "toPort": "T", + "points": [ + -800.3281249999995, + -464.56227569580034, + -800.3281249999995, + -454.56227569580034, + -800.3281249999995, + -444, + -800.3281249999995, + -444, + -800.3281249999995, + -364, + -796.9580968196937, + -364, + -796.9580968196937, + -326.76428680419923, + -796.9580968196937, + -316.76428680419923 + ] + }, + { + "from": -10, + "to": -28, + "fromPort": "R", + "toPort": "L", + "points": [ + -764.8728713989253, + -480.99999999999955, + -754.8728713989253, + -480.99999999999955, + -748, + -480.99999999999955, + -748, + -480.99999999999955, + -660, + -480.99999999999955, + -660, + -580.6632812500003, + -571.3281249999993, + -580.6632812500003, + -561.3281249999993, + -580.6632812500003 + ] + }, + { + "from": -28, + "to": -25, + "fromPort": "B", + "toPort": "L", + "points": [ + -33.83535590729249, + -61.207674232613215, + -33.83535590729249, + -51.207674232613215, + -33.83535590729249, + 9.13475769039826, + -89.62485198496458, + 9.13475769039826, + -89.62485198496458, + -47.06727364578387, + -79.62485198496458, + -47.06727364578387 + ] + }, + { + "from": -29, + "to": -27, + "fromPort": "B", + "toPort": "T", + "points": [ + -380.328125, + -308.5622756958008, + -380.328125, + -298.5622756958008, + -380.328125, + -288.99999999999994, + -396.32812499999955, + -288.99999999999994, + -396.32812499999955, + -279.4377243041991, + -396.32812499999955, + -269.4377243041991 + ] + } + ] +} diff --git a/daliuge-translator/test/dropmake/test_lg_fill.py b/daliuge-translator/test/dropmake/test_lg_fill.py index 86a11ceb4..12eb84349 100644 --- a/daliuge-translator/test/dropmake/test_lg_fill.py +++ b/daliuge-translator/test/dropmake/test_lg_fill.py @@ -20,15 +20,16 @@ # MA 02111-1307 USA # -import unittest +import json import os -import pkg_resources +import unittest +import pkg_resources from dlg.dropmake import pg_generator -import json lg_dir = pkg_resources.resource_filename(__name__, 'logical_graphs') # @UndefinedVariable + class LGFillTest(unittest.TestCase): def test_fill_lg(self): @@ -43,4 +44,4 @@ def test_fill_lg(self): with open(os.path.join(lg_dir, 'chiles_simple.json')) as f: lg = pg_generator.fill(json.load(f), params) for node_idx, value in zip((20, 21, 22, 23), ('1', '2', 'True', 'hi')): - self.assertEqual(lg['nodeDataArray'][node_idx]['Arg10'], value) \ No newline at end of file + self.assertEqual(lg['nodeDataArray'][node_idx]['Arg10'], value) diff --git a/daliuge-translator/test/dropmake/test_lgweb.py b/daliuge-translator/test/dropmake/test_lgweb.py index 441eeb51b..b8fee3fe9 100644 --- a/daliuge-translator/test/dropmake/test_lgweb.py +++ b/daliuge-translator/test/dropmake/test_lgweb.py @@ -26,9 +26,7 @@ import unittest import pkg_resources - import six.moves.urllib_parse as urllib # @UnresolvedImport - from dlg import common from dlg.common import tool from dlg.restutils import RestClient, RestClientException @@ -36,6 +34,7 @@ lg_dir = pkg_resources.resource_filename(__name__, '.') # @UndefinedVariable lgweb_port = 8000 + class TestLGWeb(unittest.TestCase): def setUp(self): @@ -52,7 +51,8 @@ def tearDown(self): unittest.TestCase.tearDown(self) def _generate_pgt(self, c): - c._GET('/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') + c._GET( + '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') def test_get_lgjson(self): @@ -100,16 +100,19 @@ def test_gen_pgt(self): c = RestClient('localhost', lgweb_port, 10) # doesn't exist! - self.assertRaises(RestClientException, c._GET, '/gen_pgt?lg_name=doesnt_exist.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') + self.assertRaises(RestClientException, c._GET, + '/gen_pgt?lg_name=doesnt_exist.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') # unknown algorithm - self.assertRaises(RestClientException, c._GET, '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=noidea') + self.assertRaises(RestClientException, c._GET, + '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=noidea') # this should work now self._generate_pgt(c) def test_get_pgtjson(self): c = RestClient('localhost', lgweb_port, 10) - c._GET('/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') + c._GET( + '/gen_pgt?lg_name=logical_graphs/chiles_simple.json&num_par=5&algo=metis&min_goal=0&ptype=0&max_load_imb=100') # doesn't exist self.assertRaises(RestClientException, c._get_json, '/pgt_jsonbody?pgt_name=unknown.json') @@ -137,7 +140,7 @@ def test_get_pgt_post(self): 'par_label': 'Partition', 'max_load_imb': 100, 'max_cpu': 8 - } + } # POST form to /gen_pgt try: @@ -169,7 +172,6 @@ def test_pg_viewer(self): # also fine, PGT exists c._GET('/pg_viewer?pgt_view_name=logical_graphs/chiles_simple1_pgt.json') - def _test_pgt_action(self, path, unknown_fails): c = RestClient('localhost', lgweb_port, 10) diff --git a/daliuge-translator/test/dropmake/test_pg_gen.py b/daliuge-translator/test/dropmake/test_pg_gen.py index 27e86676b..78c6035dd 100644 --- a/daliuge-translator/test/dropmake/test_pg_gen.py +++ b/daliuge-translator/test/dropmake/test_pg_gen.py @@ -19,46 +19,49 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, # MA 02111-1307 USA -import unittest, pkg_resources +import unittest -from dlg.dropmake.pg_generator import LG, PGT, MetisPGTP, MySarkarPGTP,\ - MinNumPartsPGTP, GPGTNoNeedMergeException +import pkg_resources +from dlg.dropmake.pg_generator import LG, PGT, MetisPGTP, MySarkarPGTP, \ + MinNumPartsPGTP, GPGTNoNeedMergeException """ python -m unittest test.dropmake.test_pg_gen """ + def get_lg_fname(lg_name): return pkg_resources.resource_filename(__name__, 'logical_graphs/{0}'.format(lg_name)) # @UndefinedVariable + class TestPGGen(unittest.TestCase): def test_pg_generator(self): fp = get_lg_fname('lofar_std.json') - #fp = '/Users/Chen/proj/dfms/dfms/lg/web/lofar_std.json' + # fp = '/Users/Chen/proj/dfms/dfms/lg/web/lofar_std.json' lg = LG(fp) self.assertEqual(len(lg._done_dict.keys()), 36) drop_list = lg.unroll_to_tpl() - #print json.dumps(drop_list, indent=2) - #pprint.pprint(drop_list) - #pprint.pprint(dict(lg._drop_dict)) - #input_dict = defaultdict(list) - #lg.to_pg_tpl(input_dict) + # print json.dumps(drop_list, indent=2) + # pprint.pprint(drop_list) + # pprint.pprint(dict(lg._drop_dict)) + # input_dict = defaultdict(list) + # lg.to_pg_tpl(input_dict) def test_pg_test(self): fp = get_lg_fname('test_grpby_gather.json') lg = LG(fp) lg.unroll_to_tpl() - #input_dict = defaultdict(list) - #lg.to_pg_tpl(input_dict) - #pprint.pprint(dict(lg._drop_dict)) + # input_dict = defaultdict(list) + # lg.to_pg_tpl(input_dict) + # pprint.pprint(dict(lg._drop_dict)) def test_pgt_to_json(self): fp = get_lg_fname('lofar_std.json') lg = LG(fp) drop_list = lg.unroll_to_tpl() pgt = PGT(drop_list) - #print pgt.to_gojs_json() + # print pgt.to_gojs_json() def test_metis_pgtp(self): lgnames = ['lofar_std.json', 'test_grpby_gather.json', 'chiles_simple.json'] @@ -79,7 +82,7 @@ def test_metis_pgtp_gen_pg(self): lg = LG(fp) drop_list = lg.unroll_to_tpl() pgtp = MetisPGTP(drop_list, 3, merge_parts=True) - #pgtp.json + # pgtp.json pgtp.to_gojs_json(visual=False) pg_spec = pgtp.to_pg_spec(node_list) # with open('/tmp/met_{0}_pgspec.json'.format(lgn.split('.')[0]), 'w') as f: @@ -121,7 +124,7 @@ def test_mysarkar_pgtp_gen_pg(self): lg = LG(fp) drop_list = lg.unroll_to_tpl() pgtp = MySarkarPGTP(drop_list, 3, merge_parts=True) - #pgtp.json + # pgtp.json pgtp.to_gojs_json(visual=False) pg_spec = pgtp.to_pg_spec(node_list) @@ -137,7 +140,7 @@ def test_mysarkar_pgtp_gen_pg_island(self): pgtp = MySarkarPGTP(drop_list, None, merge_parts=True) pgtp.to_gojs_json(visual=False) nb_islands = 2 - #print(lgn) + # print(lgn) try: pgtp.merge_partitions(len(node_list) - nb_islands, form_island=False) except GPGTNoNeedMergeException as ge: @@ -147,7 +150,7 @@ def test_mysarkar_pgtp_gen_pg_island(self): def test_minnumparts_pgtp(self): lgnames = ['lofar_std.json', 'test_grpby_gather.json', 'chiles_simple.json'] - #tgt_partnum = [15, 15, 10, 10, 5] + # tgt_partnum = [15, 15, 10, 10, 5] tgt_deadline = [200, 300, 90, 80, 160] for i, lgn in enumerate(lgnames): fp = get_lg_fname(lgn) diff --git a/daliuge-translator/test/dropmake/test_scheduler.py b/daliuge-translator/test/dropmake/test_scheduler.py index 88c3d9def..63e8de299 100644 --- a/daliuge-translator/test/dropmake/test_scheduler.py +++ b/daliuge-translator/test/dropmake/test_scheduler.py @@ -24,32 +24,32 @@ import pkg_resources import psutil - from dlg.dropmake.pg_generator import LG from dlg.dropmake.scheduler import (Scheduler, MySarkarScheduler, DAGUtil, -Partition, MinNumPartsScheduler, PSOScheduler, SAScheduler, MCTSScheduler) - + Partition, MinNumPartsScheduler, PSOScheduler, SAScheduler, MCTSScheduler) if 'DALIUGE_TESTS_RUNLONGTESTS' in os.environ: skip_long_tests = not bool(os.environ['DALIUGE_TESTS_RUNLONGTESTS']) else: if ((psutil.Process().username().lower() in ('chen', 'cwu')) and - bool(int(os.environ.get('TEST_PSO_SCHEDULER', 0)))): + bool(int(os.environ.get('TEST_PSO_SCHEDULER', 0)))): skip_long_tests = False else: skip_long_tests = True + def get_lg_fname(lg_name): return pkg_resources.resource_filename(__name__, 'logical_graphs/{0}'.format(lg_name)) # @UndefinedVariable + class TestScheduler(unittest.TestCase): def test_incremental_antichain(self): part = Partition(100, 8) G = part._dag - assert(part.probe_max_dop(1, 2, True, True, True) == DAGUtil.get_max_dop(part._dag)) + assert (part.probe_max_dop(1, 2, True, True, True) == DAGUtil.get_max_dop(part._dag)) G.add_edge(2, 3) - assert(part.probe_max_dop(2, 3, False, True, True) == DAGUtil.get_max_dop(part._dag)) + assert (part.probe_max_dop(2, 3, False, True, True) == DAGUtil.get_max_dop(part._dag)) # G.add_edge(1, 4) # assert(part.probe_max_dop(1, 4, False, True, True) == DAGUtil.get_max_dop(part._dag)) # G.add_edge(2, 5) @@ -90,7 +90,7 @@ def test_mysarkar_scheduler(self): part.schedule.schedule_matrix DAGUtil.ganttchart_matrix(part.schedule._dag, part.schedule._topo_sort) """ - #mys.merge_partitions(numparts) + # mys.merge_partitions(numparts) @unittest.skipIf(skip_long_tests, "Skipping because they take too long. Chen to eventually shorten them") def test_pso_scheduler(self): diff --git a/daliuge-translator/test/test_tool.py b/daliuge-translator/test/test_tool.py index 2b3a5c37d..8015bea08 100644 --- a/daliuge-translator/test/test_tool.py +++ b/daliuge-translator/test/test_tool.py @@ -24,16 +24,15 @@ import unittest import pkg_resources - -from dlg.common import tool from dlg import common +from dlg.common import tool class TestTool(unittest.TestCase): def test_pipeline(self): """A pipeline from an LG all the way to a finished graph execution""" - lg = pkg_resources.resource_filename( # @UndefinedVariable + lg = pkg_resources.resource_filename( # @UndefinedVariable 'test.dropmake', 'logical_graphs/lofar_std.json') fill = tool.start_process('fill', ['-L', lg], stdout=subprocess.PIPE) @@ -48,4 +47,4 @@ def test_pipeline(self): # It's valid JSON content, and actually a physical graph mapped_graph = json.loads(common.b2s(mapped_graph)) self.assertTrue(list(common.get_roots(mapped_graph))) - self.assertTrue(list(common.get_leaves(mapped_graph))) \ No newline at end of file + self.assertTrue(list(common.get_leaves(mapped_graph))) diff --git a/docs/api/apps.rst b/docs/api/apps.rst index a6c434a2f..87b1bd085 100644 --- a/docs/api/apps.rst +++ b/docs/api/apps.rst @@ -1,4 +1,3 @@ - .. _api.dlg.apps: dlg.apps diff --git a/docs/conf.py b/docs/conf.py index 4188b0162..823173b2e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,12 +13,12 @@ # serve to show the default. import os -import shlex import subprocess import sys read_the_docs_build = os.environ.get('READTHEDOCS', None) == 'True' + def prepare_for_docs(path): # Run "python setup.py build" to generate the version.py files, and make # packages available for documenting their APIs @@ -27,11 +27,11 @@ def prepare_for_docs(path): if read_the_docs_build: subprocess.Popen([sys.executable, 'setup.py', 'build'], cwd=path).wait() + prepare_for_docs('../daliuge-common') prepare_for_docs('../daliuge-translator') prepare_for_docs('../daliuge-runtime') - # Mock the rest of the external modules we need so the API autodoc # gets correctly generated try: @@ -39,18 +39,19 @@ def prepare_for_docs(path): except: from mock import Mock as MagicMock + class Mock(MagicMock): @classmethod def __getattr__(cls, _): return MagicMock() + MOCK_MODULES = ("boto3", "botocore", "bottle", "configobj", "crc32c", "dill", - "docker", "lockfile", "metis", "netifaces", "networkx", "numpy", - "paramiko", "paramiko.client", "paramiko.rsakey", "psutil", - "pyswarm", "python-daemon", "pyzmq", "scp", "zeroconf", "zerorpc") + "docker", "lockfile", "metis", "netifaces", "networkx", "numpy", + "paramiko", "paramiko.client", "paramiko.rsakey", "psutil", + "pyswarm", "python-daemon", "pyzmq", "scp", "zeroconf", "zerorpc") sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) - # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. @@ -75,7 +76,7 @@ def __getattr__(cls, _): source_suffix = '.rst' # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' @@ -108,9 +109,9 @@ def __getattr__(cls, _): # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. @@ -118,27 +119,27 @@ def __getattr__(cls, _): # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = True @@ -159,26 +160,26 @@ def __getattr__(cls, _): # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -#html_theme_options = {} +# html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -#html_favicon = None +# html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, @@ -188,62 +189,62 @@ def __getattr__(cls, _): # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -#html_extra_path = [] +# html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' +# html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} +# html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' +# html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = 'daliugedoc' @@ -251,46 +252,46 @@ def __getattr__(cls, _): # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', + # The paper size ('letterpaper' or 'a4paper'). + # 'papersize': 'letterpaper', -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', + # The font size ('10pt', '11pt' or '12pt'). + # 'pointsize': '10pt', -# Additional stuff for the LaTeX preamble. -#'preamble': '', + # Additional stuff for the LaTeX preamble. + # 'preamble': '', -# Latex figure (float) alignment -#'figure_align': 'htbp', + # Latex figure (float) alignment + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'daliuge.tex', u'daliuge Documentation', - u'ICRAR', 'manual'), + (master_doc, 'daliuge.tex', u'daliuge Documentation', + u'ICRAR', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- @@ -303,7 +304,7 @@ def __getattr__(cls, _): ] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -312,19 +313,19 @@ def __getattr__(cls, _): # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'daliuge', u'daliuge Documentation', - author, 'daliuge', 'One line description of project.', - 'Miscellaneous'), + (master_doc, 'daliuge', u'daliuge Documentation', + author, 'daliuge', 'One line description of project.', + 'Miscellaneous'), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +# texinfo_no_detailmenu = False diff --git a/docs/index.rst b/docs/index.rst index da12c7019..6f0aef01e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,7 +1,7 @@ .. daliuge documentation master file, created by - sphinx-quickstart on Mon Feb 8 16:19:47 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. +sphinx-quickstart on Mon Feb 8 16:19:47 2016. +You can adapt this file completely to your liking, but it should at least +contain the root `toctree` directive. |daliuge| ######### diff --git a/docs/intro.rst b/docs/intro.rst index f5f00aef2..216776e83 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -1,4 +1,3 @@ - .. _intro: Introduction diff --git a/docs/managers.rst b/docs/managers.rst index 2285ba142..1bacf0ab6 100644 --- a/docs/managers.rst +++ b/docs/managers.rst @@ -1,4 +1,3 @@ - .. _drop.managers: DROP Managers diff --git a/docs/reference.rst b/docs/reference.rst index cab9e6b97..87ee37580 100644 --- a/docs/reference.rst +++ b/docs/reference.rst @@ -1,4 +1,3 @@ - .. _overview.refs: References diff --git a/daliuge-runtime/dlg/reproducibility/constants.py b/reproducibility/constants.py similarity index 56% rename from daliuge-runtime/dlg/reproducibility/constants.py rename to reproducibility/constants.py index 03e954007..95225e423 100644 --- a/daliuge-runtime/dlg/reproducibility/constants.py +++ b/reproducibility/constants.py @@ -1,12 +1,11 @@ from enum import Enum -class ReproducibilityLevels(Enum): - # Handle None with the default keyword +class ReproduciblityFlags(Enum): NOTHING = 0 RERUN = 1 REPEAT = 2 REPRODUCE = 3 REPLICATE_COMP = 4 REPLICATE_SCI = 5 - REPLICATE_FULL = 6 + EXPERIMENTAL = 6 From 49e88b2f02dd05a330c04a621a8b28c779433a0f Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 May 2020 17:01:01 +0800 Subject: [PATCH 005/484] Moves common reproducibility codes --- __init__.py | 0 .../common/reproducibility/MerkleTree/LICENSE | 674 ++++++++++++++++++ .../MerkleTree/MerkleTree/MerkleTree.py | 79 ++ .../MerkleTree/MerkleTree/Node.py | 61 ++ .../MerkleTree/MerkleTree/__init__.py | 0 .../reproducibility/MerkleTree/README.md | 21 + .../reproducibility/MerkleTree/__init__.py | 0 .../MerkleTree/requirements.txt | 1 + .../MerkleTree/test/__init__.py | 0 .../MerkleTree/test/test_Node.py | 44 ++ .../MerkleTree/test/test_merkleTree.py | 37 + .../dlg/common/reproducibility/__init__.py | 0 .../dlg/common/reproducibility}/constants.py | 0 13 files changed, 917 insertions(+) create mode 100644 __init__.py create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/__init__.py create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/README.md create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/__init__.py create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/test/__init__.py create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py create mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py create mode 100644 daliuge-common/dlg/common/reproducibility/__init__.py rename {reproducibility => daliuge-common/dlg/common/reproducibility}/constants.py (100%) diff --git a/__init__.py b/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE b/daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py new file mode 100644 index 000000000..39922eefd --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py @@ -0,0 +1,79 @@ +# Copyright (c) 2020 N.J. Pritchard +from Node import Node + + +class MerkleTree: + """ + Basic implementation of a MerkleTree + """ + + def __init__(self): + self.left = None + self.right = None + self.parent = None + self.data = Node() + + def print(self): + """ + Prints a representation of the MerkleTree + :return: + """ + self.data.print() + if type(self.left) == MerkleTree: + self.left.print() + if type(self.right) == MerkleTree: + self.right.print() + + def _add_data(self, data: list): + """ + Internal recursive data adding routine + Splits supplied data into halves at each stages building the MerkleTree with recursive hashing + :param data: List of JSON-friendly elements + :return hash: The resulting hash of the current list + """ + print(data) + if type(data) != list: + raise TypeError("Data must be supplied in list form") + self.data.add_data(data) + if len(data) > 1: + bound = len(data) // 2 + if len(data) % 2 != 0: + bound += 1 + if self.left is None: + self.left = MerkleTree() + self.left.parent = self + if self.right is None: + self.right = MerkleTree() + self.right.parent = self + self.data.add_data(self.left._add_data(data[:bound]), "left") + self.data.add_data(self.right._add_data(data[bound:]), "right") + self.data.generate_hash() + return self.data.hash + + def add_data(self, data): # Assumes data is list + """ + Attempts to add the supplied data to the tree by splitting on a per-item basis. + Expects data to be serialized by JSON and in a list + :param data: List of JSON-friendly elements + :return hash: A string representation of the resulting root hash + """ + print(data) + return self._add_data(data) + + +def compare_mktree(x: MerkleTree, y: MerkleTree): + """ + Compares two MerkleTrees using the minimal number of comparisons + :param x: The first MerkleTree + :param y: The second MerkleTree + :return: True if the trees are identical, false otherwise + """ + if x is None and y is None: + return True + if type(x) != MerkleTree or type(y) != MerkleTree: + raise TypeError("Must compare MerkleTrees") + if x is not None and y is not None: + return ((x.data.hash == y.data.hash) and + compare_mktree(x.left, y.left) and + compare_mktree(x.right, y.right)) + return False diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py new file mode 100644 index 000000000..b53fda395 --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py @@ -0,0 +1,61 @@ +# Copyright (c) 2020 N.J. Pritchard +import hashlib +import json + + +class Node(object): + """ + Our own implemenetation of a data-node as a precursor to a block structure. + Abstracts away hash generation + """ + + def __init__(self): + self.data = {} + self.data_serial = None + self.hash = None + self.changed = False + + @property + def is_empty(self): + return self.data == {} + + def add_data(self, value, key="data"): + """ + Adds data values blindly + :param value: The data + :param key: The internal dictionary key which can be specified if non-default behaviour is needed + """ + self.data[key] = value + self.changed = True + + def get_data(self): + return self.data + + def generate_hash(self): + """ + Hashes the current data + """ + if self.changed: + self.data_serial = json.dumps(self.data, sort_keys=True) + self.hash = hashlib.sha3_256(self.data_serial.encode(encoding="utf-8")).hexdigest() + self.changed = False + + def print(self): + for element in self.data: + print(str(element) + " " + str(self.data.get(element))) + print(self.hash) + + +def node_compare(x: Node, y: Node): + """ + Compares two nodes by hash + :param x: The first node + :param y: The second node + :return: True if matching, false otherwise + """ + if type(x) != Node or type(y) != Node: + raise TypeError("Need to compare Nodes") + if x.hash != y.hash: + return False + else: + return True diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/__init__.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/README.md b/daliuge-common/dlg/common/reproducibility/MerkleTree/README.md new file mode 100644 index 000000000..95eebf26b --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/MerkleTree/README.md @@ -0,0 +1,21 @@ +# Merkle Tree +An implementation of a MerkleTree in Python + +## MerkleTrees + +A Merkle-Tree is a binary tree constructed from a list of data elements (the leaves of the tree). Each leaf is labelled +with a cryptographic hash of its contents with all internal nodes labelled with the cryptographic hash of the +cryptographic hashes of its children. + +Doing so guarantees that if two nodes' hashes match they represent the same Merkle Tree (since this is a recursively +defined data-structure). + +Thus one can compare a vast amount of content by comparing only root-hashes. + +Our implementation makes the following restriction: + + - The initial data must be in a Python List. + +## Installation on Windows +Installing the Cryptography library can be a pain on windows platforms +[help](https://stackoverflow.com/questions/45089805/pip-install-cryptography-in-windows) \ No newline at end of file diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/__init__.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt b/daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt new file mode 100644 index 000000000..5d231f5fe --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt @@ -0,0 +1 @@ +pytest>=5.4.1 \ No newline at end of file diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/__init__.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py new file mode 100644 index 000000000..ac79a726d --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py @@ -0,0 +1,44 @@ +# Copyright (c) 2020 N.J. Pritchard +from Node import Node, node_compare + + +class TestNode: + x = Node() + + def test_add_data(self): + test_node = Node() + test_node.add_data(0) + assert test_node.get_data()['data'] == 0 + test_node.add_data(1) + assert test_node.get_data()['data'] == 1 + test_node.add_data([0, 1, 2]) + assert test_node.get_data()['data'] == [0, 1, 2] + test_node.add_data(0, "test") + assert test_node.get_data()["test"] == 0 + test_node.add_data("ABCDEFG", "txList") + assert test_node.get_data()["txList"] == "ABCDEFG" + test_node.add_data(True, "boolTest") + assert test_node.get_data()["boolTest"] + test_node.add_data(None, "nullTest") + assert test_node.get_data()["nullTest"] is None + + def test_generate_hash(self): + assert True + + +class TestComparison: + x = Node() + y = Node() + z = Node() + x.add_data("help") + y.add_data("help") + z.add_data("helP") + x.generate_hash() + y.generate_hash() + z.generate_hash() + + def test_node_compare(self): + assert node_compare(self.x, self.y) + assert node_compare(self.y, self.x) + assert not node_compare(self.x, self.z) + assert not node_compare(self.z, self.x) diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py new file mode 100644 index 000000000..69c35ecdd --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py @@ -0,0 +1,37 @@ +# Copyright (c) 2020 N.J. Pritchard +from MerkleTree import MerkleTree, compare_mktree + + +class TestMerkleTree: + x = MerkleTree() + y = MerkleTree() + x.add_data(['A', 'B', 'C', 'D', 'E', 'F', 'G']) + y.add_data(['A', 'B', 'C', 'C', 'E', 'F', 'G']) + + def test_add_data(self): + assert not compare_mktree(self.x, self.y) + self.y.add_data(['A', 'B', 'C', 'D', 'E', 'F', 'G']) + assert compare_mktree(self.x, self.y) + + +class TestCompareMKTree: + x = MerkleTree() + y = MerkleTree() + z = MerkleTree() + w = MerkleTree() + a = MerkleTree() + b = MerkleTree() + x.add_data([1, 2, 3, 4]) + y.add_data([1, 2, 3, 4]) + z.add_data([2, 3, 4, 5]) + w.add_data([1, 2, 3, 6]) + a.add_data(['1', '2', '3', '4']) + b.add_data(['1', '2', '3', '4', '5']) + + def test_compare_mktree(self): + assert compare_mktree(self.x, self.y) + assert not compare_mktree(self.x, self.z) + assert not compare_mktree(self.x, self.w) + assert not compare_mktree(self.x, self.a) + assert not compare_mktree(self.a, self.b) + assert not compare_mktree(self.b, self.a) diff --git a/daliuge-common/dlg/common/reproducibility/__init__.py b/daliuge-common/dlg/common/reproducibility/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py similarity index 100% rename from reproducibility/constants.py rename to daliuge-common/dlg/common/reproducibility/constants.py From 0df80a124effa18bb9179cc13111f9cfed368ced Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 May 2020 17:10:51 +0800 Subject: [PATCH 006/484] Adds some basic Rerun hash functionality. --- daliuge-runtime/dlg/drop.py | 56 +++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 78de60684..96fea8de5 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -41,6 +41,8 @@ from abc import ABCMeta, abstractmethod import six +from dlg.common.reproducibility.MerkleTree.MerkleTree.MerkleTree import MerkleTree +from dlg.common.reproducibility.constants import ReproduciblityFlags from six import BytesIO from .ddap_protocol import ExecutionMode, ChecksumTypes, AppDROPStates, \ @@ -70,6 +72,7 @@ class ListAsDict(list): """A list that adds drop UIDs to a set as they get appended to the list""" def __init__(self, my_set): + super().__init__() self.set = my_set def append(self, drop): @@ -229,8 +232,9 @@ def __init__(self, oid, uid, **kwargs): self._merkleRoot = None self._committed = False - self._MerkleTree = None + self._merkleTree = None self._merkleData = [] + self._reproduciblity = ReproduciblityFlags.NOTHING # The DataIO instance we use in our write method. It's initialized to # None because it's lazily initialized in the write method, since data @@ -275,8 +279,8 @@ def __init__(self, oid, uid, **kwargs): # the DROP. # Expected lifespan for this object, used by to expire them if 'lifespan' in kwargs and 'expireAfterUse' in kwargs: - raise InvalidDropException(self, "%r specifies both `lifespan` and `expireAfterUse`" \ - "but they are mutually exclusive" % (self,)) + raise InvalidDropException(self, "%r specifies both `lifespan` and `expireAfterUse` but they are mutually " + "exclusive" % (self,)) self._expireAfterUse = self._getArg(kwargs, 'expireAfterUse', False) self._expirationDate = -1 @@ -563,9 +567,9 @@ def checksum(self): @checksum.setter def checksum(self, value): if self._checksum is not None: - raise Exception("The checksum for DROP %s is already calculated, cannot overwrite with new value" % (self)) + raise Exception("The checksum for DROP %s is already calculated, cannot overwrite with new value" % self) if self.status in [DROPStates.INITIALIZED, DROPStates.WRITING]: - raise Exception("DROP %s is still not fully written, cannot manually set a checksum yet" % (self)) + raise Exception("DROP %s is still not fully written, cannot manually set a checksum yet" % self) self._checksum = value @property @@ -590,6 +594,46 @@ def checksumType(self, value): raise Exception("DROP %s is still not fully written, cannot manually set a checksum type yet" % (self)) self._checksumType = value + @property + def merkleroot(self): + return self._merkleRoot + + def generate_rerun_data(self): + """ + Provides a serailized list of Rerun data. + At runtime, Rerunning only requires execution success or failure. + :return: A list containing + """ + return [self._status] + + def generate_merkle_data(self): + """ + Provides a serialized summary of data as a list. + Fields constitute a single entry in this list. + Wraps several methods dependent on this DROPs reproducibility level + Some of these are abstract. + :return: A list of elements constituting a summary of this drop + """ + if self._reproduciblity is ReproduciblityFlags.NOTHING: + return [] + elif self._reproduciblity is ReproduciblityFlags.RERUN: + return self.generate_rerun_data() + else: + raise NotImplementedError("Currently other levels are not in development.") + + def commit(self): + """ + Generates the MerkleRoot of this DROP + """ + if not self._committed: + # Generate the MerkleData + self._merkleData = self.generate_merkle_data() + # Fill MerkleTree, add data and set the MerkleRoot Value + self._merkleTree = MerkleTree() + self._merkleRoot = self._merkleTree.add_data(self._merkleData) + else: + raise Exception("Trying to re-commit DROP %s, cannot overwrite." % self) + @property def oid(self): """ @@ -1252,7 +1296,7 @@ def insert(self, vals): # vals is a dictionary, its keys are the column names and its # values are the values to insert sql = "INSERT into %s (%s) VALUES (%s)" % ( - self._db_table, ','.join(vals.keys()), ','.join(['{}'] * len(vals))) + self._db_table, ','.join(vals.keys()), ','.join(['{}'] * len(vals))) sql, vals = prepare_sql(sql, self._db_drv.paramstyle, list(vals.values())) logger.debug('Executing SQL with parameters: %s / %r', sql, vals) cur.execute(sql, vals) From 1a0d21b604e18e4fb4bb186fb00db29d5afa2ccc Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 29 May 2020 11:39:20 +0800 Subject: [PATCH 007/484] Removes my own MerkleTree implementation. We will use the merklelib for now instead. --- .../common/reproducibility/MerkleTree/LICENSE | 674 ------------------ .../MerkleTree/MerkleTree/MerkleTree.py | 79 -- .../MerkleTree/MerkleTree/Node.py | 61 -- .../MerkleTree/MerkleTree/__init__.py | 0 .../reproducibility/MerkleTree/README.md | 21 - .../reproducibility/MerkleTree/__init__.py | 0 .../MerkleTree/requirements.txt | 1 - .../MerkleTree/test/__init__.py | 0 .../MerkleTree/test/test_Node.py | 44 -- .../MerkleTree/test/test_merkleTree.py | 37 - 10 files changed, 917 deletions(-) delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/__init__.py delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/README.md delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/__init__.py delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/test/__init__.py delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py delete mode 100644 daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE b/daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE deleted file mode 100644 index f288702d2..000000000 --- a/daliuge-common/dlg/common/reproducibility/MerkleTree/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py deleted file mode 100644 index 39922eefd..000000000 --- a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/MerkleTree.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright (c) 2020 N.J. Pritchard -from Node import Node - - -class MerkleTree: - """ - Basic implementation of a MerkleTree - """ - - def __init__(self): - self.left = None - self.right = None - self.parent = None - self.data = Node() - - def print(self): - """ - Prints a representation of the MerkleTree - :return: - """ - self.data.print() - if type(self.left) == MerkleTree: - self.left.print() - if type(self.right) == MerkleTree: - self.right.print() - - def _add_data(self, data: list): - """ - Internal recursive data adding routine - Splits supplied data into halves at each stages building the MerkleTree with recursive hashing - :param data: List of JSON-friendly elements - :return hash: The resulting hash of the current list - """ - print(data) - if type(data) != list: - raise TypeError("Data must be supplied in list form") - self.data.add_data(data) - if len(data) > 1: - bound = len(data) // 2 - if len(data) % 2 != 0: - bound += 1 - if self.left is None: - self.left = MerkleTree() - self.left.parent = self - if self.right is None: - self.right = MerkleTree() - self.right.parent = self - self.data.add_data(self.left._add_data(data[:bound]), "left") - self.data.add_data(self.right._add_data(data[bound:]), "right") - self.data.generate_hash() - return self.data.hash - - def add_data(self, data): # Assumes data is list - """ - Attempts to add the supplied data to the tree by splitting on a per-item basis. - Expects data to be serialized by JSON and in a list - :param data: List of JSON-friendly elements - :return hash: A string representation of the resulting root hash - """ - print(data) - return self._add_data(data) - - -def compare_mktree(x: MerkleTree, y: MerkleTree): - """ - Compares two MerkleTrees using the minimal number of comparisons - :param x: The first MerkleTree - :param y: The second MerkleTree - :return: True if the trees are identical, false otherwise - """ - if x is None and y is None: - return True - if type(x) != MerkleTree or type(y) != MerkleTree: - raise TypeError("Must compare MerkleTrees") - if x is not None and y is not None: - return ((x.data.hash == y.data.hash) and - compare_mktree(x.left, y.left) and - compare_mktree(x.right, y.right)) - return False diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py deleted file mode 100644 index b53fda395..000000000 --- a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/Node.py +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) 2020 N.J. Pritchard -import hashlib -import json - - -class Node(object): - """ - Our own implemenetation of a data-node as a precursor to a block structure. - Abstracts away hash generation - """ - - def __init__(self): - self.data = {} - self.data_serial = None - self.hash = None - self.changed = False - - @property - def is_empty(self): - return self.data == {} - - def add_data(self, value, key="data"): - """ - Adds data values blindly - :param value: The data - :param key: The internal dictionary key which can be specified if non-default behaviour is needed - """ - self.data[key] = value - self.changed = True - - def get_data(self): - return self.data - - def generate_hash(self): - """ - Hashes the current data - """ - if self.changed: - self.data_serial = json.dumps(self.data, sort_keys=True) - self.hash = hashlib.sha3_256(self.data_serial.encode(encoding="utf-8")).hexdigest() - self.changed = False - - def print(self): - for element in self.data: - print(str(element) + " " + str(self.data.get(element))) - print(self.hash) - - -def node_compare(x: Node, y: Node): - """ - Compares two nodes by hash - :param x: The first node - :param y: The second node - :return: True if matching, false otherwise - """ - if type(x) != Node or type(y) != Node: - raise TypeError("Need to compare Nodes") - if x.hash != y.hash: - return False - else: - return True diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/__init__.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/MerkleTree/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/README.md b/daliuge-common/dlg/common/reproducibility/MerkleTree/README.md deleted file mode 100644 index 95eebf26b..000000000 --- a/daliuge-common/dlg/common/reproducibility/MerkleTree/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Merkle Tree -An implementation of a MerkleTree in Python - -## MerkleTrees - -A Merkle-Tree is a binary tree constructed from a list of data elements (the leaves of the tree). Each leaf is labelled -with a cryptographic hash of its contents with all internal nodes labelled with the cryptographic hash of the -cryptographic hashes of its children. - -Doing so guarantees that if two nodes' hashes match they represent the same Merkle Tree (since this is a recursively -defined data-structure). - -Thus one can compare a vast amount of content by comparing only root-hashes. - -Our implementation makes the following restriction: - - - The initial data must be in a Python List. - -## Installation on Windows -Installing the Cryptography library can be a pain on windows platforms -[help](https://stackoverflow.com/questions/45089805/pip-install-cryptography-in-windows) \ No newline at end of file diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/__init__.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt b/daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt deleted file mode 100644 index 5d231f5fe..000000000 --- a/daliuge-common/dlg/common/reproducibility/MerkleTree/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -pytest>=5.4.1 \ No newline at end of file diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/__init__.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py deleted file mode 100644 index ac79a726d..000000000 --- a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_Node.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2020 N.J. Pritchard -from Node import Node, node_compare - - -class TestNode: - x = Node() - - def test_add_data(self): - test_node = Node() - test_node.add_data(0) - assert test_node.get_data()['data'] == 0 - test_node.add_data(1) - assert test_node.get_data()['data'] == 1 - test_node.add_data([0, 1, 2]) - assert test_node.get_data()['data'] == [0, 1, 2] - test_node.add_data(0, "test") - assert test_node.get_data()["test"] == 0 - test_node.add_data("ABCDEFG", "txList") - assert test_node.get_data()["txList"] == "ABCDEFG" - test_node.add_data(True, "boolTest") - assert test_node.get_data()["boolTest"] - test_node.add_data(None, "nullTest") - assert test_node.get_data()["nullTest"] is None - - def test_generate_hash(self): - assert True - - -class TestComparison: - x = Node() - y = Node() - z = Node() - x.add_data("help") - y.add_data("help") - z.add_data("helP") - x.generate_hash() - y.generate_hash() - z.generate_hash() - - def test_node_compare(self): - assert node_compare(self.x, self.y) - assert node_compare(self.y, self.x) - assert not node_compare(self.x, self.z) - assert not node_compare(self.z, self.x) diff --git a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py b/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py deleted file mode 100644 index 69c35ecdd..000000000 --- a/daliuge-common/dlg/common/reproducibility/MerkleTree/test/test_merkleTree.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2020 N.J. Pritchard -from MerkleTree import MerkleTree, compare_mktree - - -class TestMerkleTree: - x = MerkleTree() - y = MerkleTree() - x.add_data(['A', 'B', 'C', 'D', 'E', 'F', 'G']) - y.add_data(['A', 'B', 'C', 'C', 'E', 'F', 'G']) - - def test_add_data(self): - assert not compare_mktree(self.x, self.y) - self.y.add_data(['A', 'B', 'C', 'D', 'E', 'F', 'G']) - assert compare_mktree(self.x, self.y) - - -class TestCompareMKTree: - x = MerkleTree() - y = MerkleTree() - z = MerkleTree() - w = MerkleTree() - a = MerkleTree() - b = MerkleTree() - x.add_data([1, 2, 3, 4]) - y.add_data([1, 2, 3, 4]) - z.add_data([2, 3, 4, 5]) - w.add_data([1, 2, 3, 6]) - a.add_data(['1', '2', '3', '4']) - b.add_data(['1', '2', '3', '4', '5']) - - def test_compare_mktree(self): - assert compare_mktree(self.x, self.y) - assert not compare_mktree(self.x, self.z) - assert not compare_mktree(self.x, self.w) - assert not compare_mktree(self.x, self.a) - assert not compare_mktree(self.a, self.b) - assert not compare_mktree(self.b, self.a) From d8a1d75aa910dd3b44e172983ccca8506e7d7701 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 29 May 2020 15:19:37 +0800 Subject: [PATCH 008/484] Adds default flag value to be used for initialization. --- daliuge-common/dlg/common/reproducibility/constants.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 95225e423..678021bb5 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -9,3 +9,6 @@ class ReproduciblityFlags(Enum): REPLICATE_COMP = 4 REPLICATE_SCI = 5 EXPERIMENTAL = 6 + + +REPRO_DEFAULT = ReproduciblityFlags.RERUN From c26b2d7302e6da7e6978d106d46034418e0e2eaf Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 29 May 2020 15:23:58 +0800 Subject: [PATCH 009/484] Implements Rerun drop-hashing and tests new functionality. DROPS now add reproducibility data to a merkletree object upon completion. A (hopefully sufficient) number of checks are in place to handle edge-cases. --- daliuge-runtime/dlg/drop.py | 41 +++++- .../dlg/reproducibility/__jnit__.py | 24 ---- .../test/reproducibility/test_drophash.py | 119 ++++++++++++++++++ 3 files changed, 154 insertions(+), 30 deletions(-) delete mode 100644 daliuge-runtime/dlg/reproducibility/__jnit__.py create mode 100644 daliuge-runtime/test/reproducibility/test_drophash.py diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 96fea8de5..817c4716f 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -27,6 +27,7 @@ import collections import contextlib import errno +import hashlib import heapq import importlib import inspect @@ -41,8 +42,8 @@ from abc import ABCMeta, abstractmethod import six -from dlg.common.reproducibility.MerkleTree.MerkleTree.MerkleTree import MerkleTree -from dlg.common.reproducibility.constants import ReproduciblityFlags +from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT +from merklelib import MerkleTree from six import BytesIO from .ddap_protocol import ExecutionMode, ChecksumTypes, AppDROPStates, \ @@ -83,6 +84,10 @@ def append(self, drop): track_current_drop = object_tracking('drop') +def drop_hash(value): + return hashlib.sha3_256(value).hexdigest() + + # =============================================================================== # DROP classes follow # =============================================================================== @@ -230,11 +235,13 @@ def __init__(self, oid, uid, **kwargs): self._checksumType = None self._size = None - self._merkleRoot = None + # Recording runtime repropduciblity information is handled via MerkleTrees + # Switching on the reproduciblity level will determine what information is recorded. self._committed = False + self._merkleRoot = None self._merkleTree = None self._merkleData = [] - self._reproduciblity = ReproduciblityFlags.NOTHING + self._reproduciblity = REPRO_DEFAULT # The DataIO instance we use in our write method. It's initialized to # None because it's lazily initialized in the write method, since data @@ -598,6 +605,23 @@ def checksumType(self, value): def merkleroot(self): return self._merkleRoot + @property + def reproducibility_level(self): + return self._reproduciblity + + @reproducibility_level.setter + def reproducibility_level(self, new_flag): + if type(new_flag) != ReproduciblityFlags: + raise TypeError("new_flag must be a Reproduciblity flag enum.") + else: + if self._committed: + # Current behaviour, set to un-committed again after change + self._committed = False + self._merkleRoot = None + self._merkleTree = None + self._merkleData = [] + self._reproduciblity = new_flag + def generate_rerun_data(self): """ Provides a serailized list of Rerun data. @@ -624,13 +648,16 @@ def generate_merkle_data(self): def commit(self): """ Generates the MerkleRoot of this DROP + Should only be called once this DROP is completed. """ if not self._committed: # Generate the MerkleData self._merkleData = self.generate_merkle_data() # Fill MerkleTree, add data and set the MerkleRoot Value - self._merkleTree = MerkleTree() - self._merkleRoot = self._merkleTree.add_data(self._merkleData) + self._merkleTree = MerkleTree(self._merkleData, drop_hash) + self._merkleRoot = self._merkleTree.merkle_root + # Set as committed + self._committed = True else: raise Exception("Trying to re-commit DROP %s, cannot overwrite." % self) @@ -1004,6 +1031,8 @@ def setCompleted(self): logger.debug("Moving %r to COMPLETED", self) self.status = DROPStates.COMPLETED + # Commits current reproduciblity data to an internal MerkleTree + self.commit() # Signal our subscribers that the show is over self._fire('dropCompleted', status=DROPStates.COMPLETED) diff --git a/daliuge-runtime/dlg/reproducibility/__jnit__.py b/daliuge-runtime/dlg/reproducibility/__jnit__.py deleted file mode 100644 index f56e77e7d..000000000 --- a/daliuge-runtime/dlg/reproducibility/__jnit__.py +++ /dev/null @@ -1,24 +0,0 @@ -# -# ICRAR - International Centre for Radio Astronomy Research -# (c) UWA - The University of Western Australia, 2015 -# Copyright by UWA (in the framework of the ICRAR) -# All rights reserved -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Lesser General Public -# License as published by the Free Software Foundation; either -# version 2.1 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public -# License along with this library; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, -# MA 02111-1307 USA -# -""" -This package contains code resources required to integrate reproduciblity measure into DALiuGE. -""" diff --git a/daliuge-runtime/test/reproducibility/test_drophash.py b/daliuge-runtime/test/reproducibility/test_drophash.py new file mode 100644 index 000000000..e568adf27 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/test_drophash.py @@ -0,0 +1,119 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +""" +Tests the low-level functionality for drops to hash runtime data. +""" + +import unittest + +from dlg.common.reproducibility.constants import ReproduciblityFlags +from dlg.ddap_protocol import DROPStates +from dlg.drop import AbstractDROP, drop_hash +from merklelib import MerkleTree + + +class RerunHashTests(unittest.TestCase): + def test_null_merkleroot(self): + """ + Sanity check that the default MerkleRoot of an abstract drop is Null + Consider it a cardinal sin to change this. + """ + a = AbstractDROP('a', 'a') + self.assertIsNone(a.merkleroot) + + def test_generate_rerun_data(self): + """ + Tests that completed Rerun data contains the completed flag. + """ + a = AbstractDROP('a', 'a') + a.reproducibility_level = ReproduciblityFlags.RERUN + a.setCompleted() + self.assertTrue(a.generate_rerun_data(), [DROPStates.COMPLETED]) + + def test_unimplemented_flags(self): + """ + Asserts that unimplemented but planned functionality is handled accordingly. + """ + a = AbstractDROP('a', 'a') + a.reproducibility_level = ReproduciblityFlags.RERUN + with self.assertRaises(NotImplementedError): + a.reproducibility_level = ReproduciblityFlags.REPEAT + a.generate_merkle_data() + + def test_commit_on_complete(self): + """ + Tests that merkle_data is generated upon set_complete status and is correct (NOTHING, RERUN) + """ + + a = AbstractDROP('a', 'a') + b = AbstractDROP('b', 'b') + a.reproducibility_level = ReproduciblityFlags.RERUN + b.reproducibility_level = ReproduciblityFlags.NOTHING + self.assertIsNone(a.merkleroot) + self.assertIsNone(b.merkleroot) + + # Test RERUN + a.setCompleted() + test = MerkleTree([DROPStates.COMPLETED], drop_hash) + # 6d1be79de51c1a5846bb0498b7779802710b2452c20e1b65013ad3ebe459f51e + self.assertTrue(test.merkle_root == a.merkleroot) + + # Test NOTHING + b.setCompleted() + # None + self.assertIsNone(b.merkleroot) + self.assertTrue(b._committed) + + def test_recommit(self): + """ + Should raise an exception preventing a straight-recommit. + """ + a = AbstractDROP('a', 'a') + a.reproducibility_level = ReproduciblityFlags.RERUN + a.setCompleted() + with self.assertRaises(Exception): + a.commit() + + def test_set_reproducibility_level(self): + """ + Tests functionality for changing a DROP's reproducibility flag + If already committed. The drop should reset and re-commit all reproducibility data + If not committed, the change can proceed simply. + """ + a = AbstractDROP('a', 'a') + b = AbstractDROP('b', 'b') + a.reproducibility_level = ReproduciblityFlags.NOTHING + b.reproducibility_level = ReproduciblityFlags.NOTHING + + a.setCompleted() + self.assertIsNone(a.merkleroot) + a.reproducibility_level = ReproduciblityFlags.RERUN + a.commit() + self.assertIsNotNone(a.merkleroot) + + self.assertIsNone(b.merkleroot) + b.reproducibility_level = ReproduciblityFlags.RERUN + b.setCompleted() + self.assertIsNotNone(b.merkleroot) + + with self.assertRaises(TypeError): + a.reproducibility_level = 'REPEAT' From 2e672915beb8556bb16763149a0a0461a2ac4c25 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 1 Jun 2020 14:34:35 +0800 Subject: [PATCH 010/484] Changes default reproducibility flag to NOTHING. Allows us to explicitly test setting the value manually --- daliuge-common/dlg/common/reproducibility/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 678021bb5..03a5a8ddd 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -11,4 +11,4 @@ class ReproduciblityFlags(Enum): EXPERIMENTAL = 6 -REPRO_DEFAULT = ReproduciblityFlags.RERUN +REPRO_DEFAULT = ReproduciblityFlags.NOTHING From 598ee993cb2ef52e84a70e7a6efa8dd1cc82afbe Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 1 Jun 2020 14:35:40 +0800 Subject: [PATCH 011/484] Changes parameter default from tuple to list, so that it does not crash when used. --- daliuge-translator/dlg/translator/tool_commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index f98369e58..3b383856a 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -116,7 +116,7 @@ def fill(parser, args): parser.add_option( '-p', '--parameter', action='append', help="Parameter specification (either 'name=value' or a JSON string)", - default=()) + default=[]) (opts, args) = parser.parse_args(args) tool.setup_logging(opts) From 20f9f690bbe275a86fee9a87f8fdec8252fa671c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 1 Jun 2020 15:16:08 +0800 Subject: [PATCH 012/484] Adds new CLA (-R) for reproducibility. Adds setup.py - Used to append and process reproducibility information. --- .../dlg/common/reproducibility/setup.py | 21 +++++++++++++++++++ .../dlg/translator/tool_commands.py | 7 ++++++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 daliuge-common/dlg/common/reproducibility/setup.py diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py new file mode 100644 index 000000000..ca3e5c962 --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -0,0 +1,21 @@ +def initialize_lg_data(lg: dict, level: str): + """ + Creates and appends graph-wide reproducibility data at the logical template stage. + Currently, this is basically a stub that adds the requested flag to the graph. + Later, this will contain significantly more information. + :param lg: The logical graph data structure (a JSON object (a dict)) + :param level: One several values 0-5 defined in constants.py + :return: The same lg object with new information appended + + TODO: Handling supported and unsupported options + TODO: Per-drop initialization + TODO: Cryptographic processing of structure + TODO: Definition of behaviour + """ + level = int(level) + reproData = { + 'level': level + } + lg['reproData'] = reproData + + return lg diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 3b383856a..3e4fdb76c 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -27,6 +27,8 @@ import os import sys +from dlg.common.reproducibility.setup import initialize_lg_data + from ..common import tool logger = logging.getLogger(__name__) @@ -117,6 +119,9 @@ def fill(parser, args): '-p', '--parameter', action='append', help="Parameter specification (either 'name=value' or a JSON string)", default=[]) + parser.add_option( + '-R', '--reproducibility', default='0', + help="Level of reproducibility. Default 0 (NOTHING). Accepts '0'-'5'") (opts, args) = parser.parse_args(args) tool.setup_logging(opts) @@ -142,7 +147,7 @@ def param_spec_type(s): params.update(json_param) from ..dropmake.pg_generator import fill - dump(fill(_open_i(opts.logical_graph), params)) + dump(initialize_lg_data(fill(_open_i(opts.logical_graph), params), opts.reproducibility)) def _add_unroll_options(parser): From 8529c1587459bee7992c65d24e8a39e0384f708e Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 2 Jun 2020 10:25:39 +0800 Subject: [PATCH 013/484] Adds support for very basic initialized LG data. Adds handler for currently unsupported functionality. Updates Explanation.md with new changes and queries. --- .../dlg/common/reproducibility/constants.py | 17 +++++++++++++++++ .../dlg/common/reproducibility/setup.py | 12 ++++++++---- daliuge-runtime/dlg/drop.py | 6 ++++-- .../dlg/translator/tool_commands.py | 4 ++-- 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 03a5a8ddd..692c75f05 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -12,3 +12,20 @@ class ReproduciblityFlags(Enum): REPRO_DEFAULT = ReproduciblityFlags.NOTHING + + +def rmode_supported(flag: ReproduciblityFlags): + """ + Determines in a given flag is currently supported. + A slightly pedantic solution but it does centralize the process. + There is the possiblity that different functionality is possible on a per-install basis. + Named to be used as a if rmode_supported(flag) + :param flag: A ReproducibilityFlag enum being queried + :return: True if supported, False otherwise + """ + if flag == ReproduciblityFlags.NOTHING \ + or flag == ReproduciblityFlags.RERUN \ + or flag == ReproduciblityFlags.EXPERIMENTAL: + return True + else: + return False diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index ca3e5c962..b89f94dfa 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -1,3 +1,6 @@ +from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported + + def initialize_lg_data(lg: dict, level: str): """ Creates and appends graph-wide reproducibility data at the logical template stage. @@ -7,15 +10,16 @@ def initialize_lg_data(lg: dict, level: str): :param level: One several values 0-5 defined in constants.py :return: The same lg object with new information appended - TODO: Handling supported and unsupported options TODO: Per-drop initialization TODO: Cryptographic processing of structure TODO: Definition of behaviour """ - level = int(level) - reproData = { + level = ReproduciblityFlags(level) + if not rmode_supported(level): + level = REPRO_DEFAULT + reprodata = { 'level': level } - lg['reproData'] = reproData + lg['reproData'] = reprodata return lg diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 817c4716f..bda8d4094 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -42,7 +42,7 @@ from abc import ABCMeta, abstractmethod import six -from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT +from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported from merklelib import MerkleTree from six import BytesIO @@ -613,7 +613,7 @@ def reproducibility_level(self): def reproducibility_level(self, new_flag): if type(new_flag) != ReproduciblityFlags: raise TypeError("new_flag must be a Reproduciblity flag enum.") - else: + elif rmode_supported(new_flag): if self._committed: # Current behaviour, set to un-committed again after change self._committed = False @@ -621,6 +621,8 @@ def reproducibility_level(self, new_flag): self._merkleTree = None self._merkleData = [] self._reproduciblity = new_flag + else: + raise ValueError("new_flag %d is not supported", new_flag) def generate_rerun_data(self): """ diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 3e4fdb76c..d017ec471 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -27,7 +27,7 @@ import os import sys -from dlg.common.reproducibility.setup import initialize_lg_data +from dlg.common.reproducibility.setup import init_lg_repro_data from ..common import tool @@ -147,7 +147,7 @@ def param_spec_type(s): params.update(json_param) from ..dropmake.pg_generator import fill - dump(initialize_lg_data(fill(_open_i(opts.logical_graph), params), opts.reproducibility)) + dump(init_lg_repro_data(fill(_open_i(opts.logical_graph), params), opts.reproducibility)) def _add_unroll_options(parser): From f38e34da928750f5790cba188d4847148f44f1d2 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 2 Jun 2020 10:41:12 +0800 Subject: [PATCH 014/484] Adds stub functions for reproducibility functions. Broadly speaking, this is where most of the magic will happen. --- .../dlg/common/reproducibility/setup.py | 51 +++++++++++++++---- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index b89f94dfa..47a27700f 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -1,25 +1,56 @@ from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported -def initialize_lg_data(lg: dict, level: str): +# ------ Drop-Based Functionality ------ + +def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): + pass + + +def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): + pass + + +def init_pgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): + pass + + +def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): + pass + + +# ------ Graph-Wide Functionality ------ + +def init_lgt_repro_data(lgt: dict, rmode: str): """ Creates and appends graph-wide reproducibility data at the logical template stage. Currently, this is basically a stub that adds the requested flag to the graph. Later, this will contain significantly more information. - :param lg: The logical graph data structure (a JSON object (a dict)) - :param level: One several values 0-5 defined in constants.py + :param lgt: The logical graph data structure (a JSON object (a dict)) + :param rmode: One several values 0-5 defined in constants.py :return: The same lg object with new information appended TODO: Per-drop initialization TODO: Cryptographic processing of structure - TODO: Definition of behaviour """ - level = ReproduciblityFlags(level) - if not rmode_supported(level): - level = REPRO_DEFAULT + rmode = ReproduciblityFlags(rmode) + if not rmode_supported(rmode): + rmode = REPRO_DEFAULT reprodata = { - 'level': level + 'rmode': rmode } - lg['reproData'] = reprodata + lgt['reproData'] = reprodata + + return lgt + + +def init_lg_repro_data(lg: dict, level: str): + pass + + +def init_pgt_repro_data(pgt: dict, level: str): + pass + - return lg +def init_pg_repro_data(pg: dict, level: str): + pass From 6cd2aa071d5333c19312aeb3f4afe4ca011a1955 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 4 Jun 2020 13:56:07 +0800 Subject: [PATCH 015/484] Adds docstrings for reproducibility functions --- .../dlg/common/reproducibility/setup.py | 59 +++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index 47a27700f..c3fef7044 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -2,20 +2,53 @@ # ------ Drop-Based Functionality ------ +def accumulate_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Accumulates relevant reproducibility fields for a given drop. + :param drop: + :param level: + :return: A dictionary containing accumulated reproducibility data for a given drop. + """ + pass + def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Creates and appends per-drop reproducibility information at the logical template stage. + :param drop: + :param level: + :return: The same drop with appended reproduciblity information. + """ pass def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Creates and appends per-drop reproducibility information at the logical graph stage. + :param drop: + :param level: + :return: The same drop with appended reproducibility information + """ pass def init_pgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Creates and appends per-drop reproducibility information at the physical graph template stage. + :param drop: + :param level: + :return: The same drop with appended reproducibility information + """ pass def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Creates and appends per-drop reproducibility information at the physical graph stage. + :param drop: + :param level: + :return: The same drop with appended reproducibility information + """ pass @@ -28,7 +61,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): Later, this will contain significantly more information. :param lgt: The logical graph data structure (a JSON object (a dict)) :param rmode: One several values 0-5 defined in constants.py - :return: The same lg object with new information appended + :return: The same lgt object with new information appended TODO: Per-drop initialization TODO: Cryptographic processing of structure @@ -44,13 +77,31 @@ def init_lgt_repro_data(lgt: dict, rmode: str): return lgt -def init_lg_repro_data(lg: dict, level: str): +def init_lg_repro_data(lg: dict, rmode: str): + """ + Handles adding reproducibility data at the logical graph level. + :param lg: The logical graph data structure (a JSON object (a dict)) + :param rmode: One several values 0-5 defined in constants.py + :return: The same lgt object with new information appended + """ pass -def init_pgt_repro_data(pgt: dict, level: str): +def init_pgt_repro_data(pgt: dict, rmode: str): + """ + Handles adding reproducibility data at the physical graph template level. + :param pgt: The logical graph data structure (a JSON object (a dict)) + :param rmode: One several values 0-5 defined in constants.py + :return: The same lgt object with new information appended + """ pass -def init_pg_repro_data(pg: dict, level: str): +def init_pg_repro_data(pg: dict, rmode: str): + """ + Handles adding reproducibility data at the physical graph template level. + :param pg: The logical graph data structure (a JSON object (a dict)) + :param rmode: One several values 0-5 defined in constants.py + :return: The same lgt object with new information appended + """ pass From fb2c43b127ed1e8e91e8fb074c2e7fbb5af7e9f0 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 4 Jun 2020 14:33:46 +0800 Subject: [PATCH 016/484] Small fix to get rmode JSON serialized --- daliuge-common/dlg/common/reproducibility/setup.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index c3fef7044..0d9e3423a 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -66,14 +66,13 @@ def init_lgt_repro_data(lgt: dict, rmode: str): TODO: Per-drop initialization TODO: Cryptographic processing of structure """ - rmode = ReproduciblityFlags(rmode) + rmode = ReproduciblityFlags(int(rmode)) if not rmode_supported(rmode): rmode = REPRO_DEFAULT reprodata = { - 'rmode': rmode + 'rmode': str(rmode.value) } lgt['reproData'] = reprodata - return lgt From 8d24e8266aa36a887daba69c76fad08db62f9cca Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 5 Jun 2020 11:09:17 +0800 Subject: [PATCH 017/484] Updates repro library call --- daliuge-translator/dlg/translator/tool_commands.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index d017ec471..350371ca6 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -27,7 +27,7 @@ import os import sys -from dlg.common.reproducibility.setup import init_lg_repro_data +from dlg.common.reproducibility.setup import init_lgt_repro_data from ..common import tool @@ -147,7 +147,7 @@ def param_spec_type(s): params.update(json_param) from ..dropmake.pg_generator import fill - dump(init_lg_repro_data(fill(_open_i(opts.logical_graph), params), opts.reproducibility)) + dump(init_lgt_repro_data(fill(_open_i(opts.logical_graph), params), opts.reproducibility)) def _add_unroll_options(parser): From 0195b75bd3e0a379ab994f9ded8f727935bb2ae2 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 5 Jun 2020 11:10:53 +0800 Subject: [PATCH 018/484] Reproducibility calls now 'fail' gracefully, returning original data; they are proper stubs now. --- .../dlg/common/reproducibility/setup.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index 0d9e3423a..2b0c7f3d9 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -9,7 +9,8 @@ def accumulate_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. """ - pass + data = {} + return data def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): @@ -19,7 +20,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproduciblity information. """ - pass + return drop def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): @@ -29,7 +30,7 @@ def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproducibility information """ - pass + return drop def init_pgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): @@ -39,7 +40,7 @@ def init_pgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproducibility information """ - pass + return drop def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): @@ -49,7 +50,7 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproducibility information """ - pass + return drop # ------ Graph-Wide Functionality ------ @@ -83,7 +84,7 @@ def init_lg_repro_data(lg: dict, rmode: str): :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended """ - pass + return lg def init_pgt_repro_data(pgt: dict, rmode: str): @@ -93,7 +94,7 @@ def init_pgt_repro_data(pgt: dict, rmode: str): :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended """ - pass + return pgt def init_pg_repro_data(pg: dict, rmode: str): @@ -103,4 +104,4 @@ def init_pg_repro_data(pg: dict, rmode: str): :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended """ - pass + return pg From 061f54a6007b021c10ad30516516e336cbc4bd99 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 5 Jun 2020 11:19:40 +0800 Subject: [PATCH 019/484] Implements accumulate_rerun_drop_data --- .../dlg/common/reproducibility/setup.py | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index 2b0c7f3d9..1ac10dbbf 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -2,14 +2,32 @@ # ------ Drop-Based Functionality ------ -def accumulate_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_rerun_drop_data(drop: dict): """ - Accumulates relevant reproducibility fields for a given drop. + Accumulates relevant reproducibility fields for a given drop at the Rerun level. + Asserting Rerunning requires relatively little information. We are more interested in the structure between drops. :param drop: - :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} + category_type = drop['categoryType'] + + data['category_type'] = category_type + data['category'] = drop['category'] + + if category_type == "Data": + data['streaming'] = drop['Streaming'] + pass + elif category_type == "Application": + data['streaming'] = drop['Streaming'] + pass + elif category_type == "Group": + pass + elif category_type == "Control": + pass + elif category_type == "Other": + pass + return data From 7ff18d296e8129cc74887a42b5f477caf616beb6 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 5 Jun 2020 11:49:16 +0800 Subject: [PATCH 020/484] Implements per-drop initialization for rerun data. Adds boilerplate for subsequent levels. --- .../dlg/common/reproducibility/setup.py | 42 +++++++++++++------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index 1ac10dbbf..c205542e1 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -1,25 +1,30 @@ from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported +from merklelib import MerkleTree # ------ Drop-Based Functionality ------ -def accumulate_rerun_drop_data(drop: dict): +def accumulate_drop_data(drop: dict, level: ReproduciblityFlags): """ - Accumulates relevant reproducibility fields for a given drop at the Rerun level. - Asserting Rerunning requires relatively little information. We are more interested in the structure between drops. + Accumulates relevant reproducibility fields for a single drop. + TODO: Implement alternative level functionality. :param drop: + :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} + if level == ReproduciblityFlags.NOTHING: + return data + category_type = drop['categoryType'] data['category_type'] = category_type data['category'] = drop['category'] if category_type == "Data": - data['streaming'] = drop['Streaming'] + data['streaming'] = drop['streaming'] pass elif category_type == "Application": - data['streaming'] = drop['Streaming'] + data['streaming'] = drop['streaming'] pass elif category_type == "Group": pass @@ -36,8 +41,16 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): Creates and appends per-drop reproducibility information at the logical template stage. :param drop: :param level: - :return: The same drop with appended reproduciblity information. - """ + :return: The same drop with appended reproducibility information. + """ + data = accumulate_drop_data(drop, level) + merkledata = [] + for key, value in data.items(): + temp = [key, value] + merkledata.append(temp) + merkletree = MerkleTree(merkledata) + data['merkleroot'] = merkletree.merkle_root + drop['reprodata'] = data return drop @@ -82,16 +95,19 @@ def init_lgt_repro_data(lgt: dict, rmode: str): :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended - TODO: Per-drop initialization - TODO: Cryptographic processing of structure + TODO: Cryptographic processing of structure (chaining) + TODO: Topological sorting of graph + - We generate the hash-data of root nodes, moving through the graph to the leaves + - This way we visit all drops once generating data in O(drop + link) time --> O(V + E) --> Optimal + TODO: Chaining links """ rmode = ReproduciblityFlags(int(rmode)) if not rmode_supported(rmode): rmode = REPRO_DEFAULT - reprodata = { - 'rmode': str(rmode.value) - } - lgt['reproData'] = reprodata + reprodata = {'rmode': str(rmode.value)} + for drop in lgt['nodeDataArray']: + init_lgt_repro_drop_data(drop, rmode) + lgt['reprodata'] = reprodata return lgt From 7f960ad271a6bc97de6e1a9509491ae1895333e5 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 5 Jun 2020 11:55:34 +0800 Subject: [PATCH 021/484] Adds hook for lg initialization --- daliuge-translator/dlg/translator/tool_commands.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 350371ca6..75665ef1f 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -27,7 +27,7 @@ import os import sys -from dlg.common.reproducibility.setup import init_lgt_repro_data +from dlg.common.reproducibility.setup import init_lgt_repro_data, init_lg_repro_data from ..common import tool @@ -147,7 +147,8 @@ def param_spec_type(s): params.update(json_param) from ..dropmake.pg_generator import fill - dump(init_lgt_repro_data(fill(_open_i(opts.logical_graph), params), opts.reproducibility)) + graph = fill(_open_i(opts.logical_graph), params) + dump(init_lg_repro_data(init_lgt_repro_data(graph, opts.reproducibility), opts.reproducibility)) def _add_unroll_options(parser): From 03a89a5d83ca3b53739dbb8db17aa74cd5fc44cd Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 5 Jun 2020 14:20:14 +0800 Subject: [PATCH 022/484] Docstring update in setup.py --- daliuge-common/dlg/common/reproducibility/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index c205542e1..d3e9605fe 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -100,6 +100,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): - We generate the hash-data of root nodes, moving through the graph to the leaves - This way we visit all drops once generating data in O(drop + link) time --> O(V + E) --> Optimal TODO: Chaining links + - Takes the merkle_root of a node, it's parents and adds those to a new Merkletree appending that merkle_root """ rmode = ReproduciblityFlags(int(rmode)) if not rmode_supported(rmode): From e6ef96174819e4dd1f5b3d0870bef9bd074cad8e Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 8 Jun 2020 15:25:23 +0800 Subject: [PATCH 023/484] Adds a topological sorting implementation for LGT / LG structures. Uses Kahn's algorithm --- .../dlg/common/reproducibility/setup.py | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index d3e9605fe..3cb16a613 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -86,6 +86,52 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): # ------ Graph-Wide Functionality ------ +def topo_sort(lg: dict): + """ + Uses Kahn's algorithm to topologically sort a logical graph dictionary. + Exploits that a DAG contains at least one node with in-degree 0. + Processes nodes in-order. + O(V + E) time complexity. + :param lg: + :return: + """ + from collections import deque + dropset = {} # Also contains in-degree information + neighbourset = {} + visited = 0 + q = deque() + + for drop in lg['nodeDataArray']: + did = int(drop['key']) + dropset[did] = [drop, 0] + neighbourset[did] = [] + + for edge in lg['linkDataArray']: + src = int(edge['from']) + dest = int(edge['to']) + dropset[dest][1] += 1 + neighbourset[src].append(dest) + + # did == 'drop id' + for did in dropset: + if dropset[did][1] == 0: + q.append(did) + + while q: + did = q.pop() + visited += 1 + for n in neighbourset[did]: + dropset[n][1] -= 1 + if dropset[n][1] == 0: # Add drops at the DAG-frontier + q.append(n) + # Process TODO: This is where the block-dag will be built. + print(did) + + if visited != len(dropset): + print("Not a DAG") + # TODO: Improve error handling + + def init_lgt_repro_data(lgt: dict, rmode: str): """ Creates and appends graph-wide reproducibility data at the logical template stage. @@ -96,9 +142,6 @@ def init_lgt_repro_data(lgt: dict, rmode: str): :return: The same lgt object with new information appended TODO: Cryptographic processing of structure (chaining) - TODO: Topological sorting of graph - - We generate the hash-data of root nodes, moving through the graph to the leaves - - This way we visit all drops once generating data in O(drop + link) time --> O(V + E) --> Optimal TODO: Chaining links - Takes the merkle_root of a node, it's parents and adds those to a new Merkletree appending that merkle_root """ @@ -108,6 +151,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): reprodata = {'rmode': str(rmode.value)} for drop in lgt['nodeDataArray']: init_lgt_repro_drop_data(drop, rmode) + topo_sort(lgt) lgt['reprodata'] = reprodata return lgt From 24565f228ee81816f1489c6d2b838d4ddfcef8fe Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 8 Jun 2020 16:09:38 +0800 Subject: [PATCH 024/484] DALiuGE now builds block-dag information into LGs. --- .../dlg/common/reproducibility/setup.py | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/setup.py index 3cb16a613..7f950b9c1 100644 --- a/daliuge-common/dlg/common/reproducibility/setup.py +++ b/daliuge-common/dlg/common/reproducibility/setup.py @@ -50,6 +50,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): merkledata.append(temp) merkletree = MerkleTree(merkledata) data['merkleroot'] = merkletree.merkle_root + data['parenthashes'] = [] # Initialized here in-case this drop ends up having in-deg = 0 drop['reprodata'] = data return drop @@ -86,11 +87,19 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): # ------ Graph-Wide Functionality ------ +def build_block_data(drop: dict): + block_data = [drop['reprodata']['merkleroot']] + for parenthash in sorted(drop['reprodata']['parenthashes']): + block_data.append(parenthash) + mtree = MerkleTree(block_data) + drop['reprodata']['blockhash'] = mtree.merkle_root + + def topo_sort(lg: dict): """ Uses Kahn's algorithm to topologically sort a logical graph dictionary. Exploits that a DAG contains at least one node with in-degree 0. - Processes nodes in-order. + Processes drops in-order. O(V + E) time complexity. :param lg: :return: @@ -119,13 +128,15 @@ def topo_sort(lg: dict): while q: did = q.pop() + # Process + build_block_data(dropset[did][0]) visited += 1 for n in neighbourset[did]: dropset[n][1] -= 1 + # Add our new hash to the parent-hash list + dropset[n][0]['reprodata']['parenthashes'].append(dropset[did][0]['reprodata']['blockhash']) if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) - # Process TODO: This is where the block-dag will be built. - print(did) if visited != len(dropset): print("Not a DAG") @@ -140,10 +151,6 @@ def init_lgt_repro_data(lgt: dict, rmode: str): :param lgt: The logical graph data structure (a JSON object (a dict)) :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended - - TODO: Cryptographic processing of structure (chaining) - TODO: Chaining links - - Takes the merkle_root of a node, it's parents and adds those to a new Merkletree appending that merkle_root """ rmode = ReproduciblityFlags(int(rmode)) if not rmode_supported(rmode): From b06d3679f47cb59c3d5cb4f736a9d8269d902fc9 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 13:44:47 +0800 Subject: [PATCH 025/484] Renames reproducibility/setup.py to reproducibility.py --- .../dlg/common/reproducibility/{setup.py => reproducibility.py} | 0 daliuge-translator/dlg/translator/tool_commands.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename daliuge-common/dlg/common/reproducibility/{setup.py => reproducibility.py} (100%) diff --git a/daliuge-common/dlg/common/reproducibility/setup.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py similarity index 100% rename from daliuge-common/dlg/common/reproducibility/setup.py rename to daliuge-common/dlg/common/reproducibility/reproducibility.py diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 75665ef1f..5232f2216 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -27,7 +27,7 @@ import os import sys -from dlg.common.reproducibility.setup import init_lgt_repro_data, init_lg_repro_data +from dlg.common.reproducibility.reproducibility import init_lgt_repro_data, init_lg_repro_data from ..common import tool From 685e8846f25e35cf676214aeb4954f0bc0fb4a40 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 13:55:36 +0800 Subject: [PATCH 026/484] Adds merklelib dependency to DALiuGE common --- daliuge-common/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daliuge-common/setup.py b/daliuge-common/setup.py index e4a71a149..7e5230eaa 100644 --- a/daliuge-common/setup.py +++ b/daliuge-common/setup.py @@ -50,6 +50,7 @@ def do_versioning(): install_requires = [ # 1.10 contains an important race-condition fix on lazy-loaded modules "six>=1.10", + "merklelib>=1.0", ] setup( From 7240a3a1155967d0e66876cd194fe74ad386dd33 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 15:22:41 +0800 Subject: [PATCH 027/484] PGT now contains reproducibility information from LGT --- daliuge-translator/dlg/dropmake/pg_generator.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index e42a334ca..6218dfde1 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -831,6 +831,7 @@ def make_single_drop(self, iid="0", **kwargs): kwargs["lg_key"] = self.id kwargs["dt"] = self.jd["category"] kwargs["nm"] = self.text + kwargs["reprodata"] = self.jd["reprodata"] dropSpec.update(kwargs) return dropSpec @@ -2316,13 +2317,13 @@ def unroll_to_tpl(self): tdrops = self._drop_dict[tid] chunk_size = self._get_chunk_size(slgn, tlgn) if slgn.is_group() and not tlgn.is_group(): - # this link must be artifically added (within group link) + # this link must be artificially added (within group link) # since # 1. GroupBy's "natual" output must be a Scatter (i.e. group) # 2. Scatter "naturally" does not have output if ( slgn.is_gather() and tlgn.gid != sid - ): # not the artifical link between gather and its own start child + ): # not the artificial link between gather and its own start child # gather iteration case, tgt must be a Group-Start Component # this is a way to manually sequentialise a Scatter that has a high DoP for i, ga_drop in enumerate(sdrops): @@ -2613,6 +2614,7 @@ def unroll(lg, oid_prefix=None, zerorun=False, app=None): start = time.time() lg = LG(lg, ssid=oid_prefix) drop_list = lg.unroll_to_tpl() + print(drop_list) logger.info( "Logical Graph unroll completed in %.3f [s]. # of Drops: %d", (time.time() - start), From 9eb6e14b19da8e4f9b5dcbfdb991e2ff0ec266cd Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 16:17:31 +0800 Subject: [PATCH 028/484] PGT now contains reproducibility information from LGT. Now confirmed to not break further functionality until it is implemented. --- .../dlg/common/reproducibility/reproducibility.py | 4 ++-- daliuge-translator/dlg/dropmake/pg_generator.py | 12 ++++++++++-- daliuge-translator/dlg/translator/tool_commands.py | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 7f950b9c1..0a07cb929 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -173,10 +173,10 @@ def init_lg_repro_data(lg: dict, rmode: str): return lg -def init_pgt_repro_data(pgt: dict, rmode: str): +def init_pgt_repro_data(pgt: list, rmode: str): """ Handles adding reproducibility data at the physical graph template level. - :param pgt: The logical graph data structure (a JSON object (a dict)) + :param pgt: The physical graph template structure (a list of drops) :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended """ diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 6218dfde1..60b80f34e 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -63,6 +63,7 @@ import networkx as nx import numpy as np import six +from dlg.common.reproducibility.reproducibility import init_pgt_repro_data from .dm_utils import ( get_lg_ver_type, @@ -131,6 +132,7 @@ def __init__(self, jd, group_q, done_dict, ssid): self._dop = None self._gaw = None self._grpw = None + self._reprodata = jd["reprodata"] if "isGroup" in jd and jd["isGroup"] is True: self._isgrp = True for wn in group_q[self.id]: @@ -831,7 +833,7 @@ def make_single_drop(self, iid="0", **kwargs): kwargs["lg_key"] = self.id kwargs["dt"] = self.jd["category"] kwargs["nm"] = self.text - kwargs["reprodata"] = self.jd["reprodata"] + kwargs["reprodata"] = self._reprodata dropSpec.update(kwargs) return dropSpec @@ -1943,6 +1945,7 @@ def __init__(self, f, ssid=None): # key - lgn id, val - a list of pgns associated with this lgn self._drop_dict = collections.defaultdict(list) self._lgn_list = all_list + self._reprodata = lg["reprodata"] def validate_link(self, src, tgt): if src.is_scatter() or tgt.is_scatter(): @@ -2580,6 +2583,10 @@ def unroll_to_tpl(self): return ret + @property + def reprodata(self): + return self._reprodata + class _LGTemplate(string.Template): delimiter = "%" @@ -2614,7 +2621,6 @@ def unroll(lg, oid_prefix=None, zerorun=False, app=None): start = time.time() lg = LG(lg, ssid=oid_prefix) drop_list = lg.unroll_to_tpl() - print(drop_list) logger.info( "Logical Graph unroll completed in %.3f [s]. # of Drops: %d", (time.time() - start), @@ -2629,6 +2635,8 @@ def unroll(lg, oid_prefix=None, zerorun=False, app=None): for dropspec in drop_list: if "app" in dropspec: dropspec["app"] = app + init_pgt_repro_data(drop_list, lg.reprodata["rmode"]) + drop_list.append(lg.reprodata) return drop_list diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 5232f2216..1187d4d9c 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -75,7 +75,6 @@ def parse_partition_algo_params(algo_params): def partition(pgt, opts): from ..dropmake import pg_generator - algo_params = parse_partition_algo_params(opts.algo_params or []) pg = pg_generator.partition(pgt, algo=opts.algo, num_partitions=opts.partitions, num_islands=opts.islands, partition_label='partition', @@ -207,6 +206,7 @@ def dlg_partition(parser, args): with _open_i(opts.pgt_path) as fi: pgt = json.load(fi) + repro = pgt.pop() dump(partition(pgt, opts)) From df21c58bba66d5d75aa0550bf15b52947c65fa26 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 16:20:05 +0800 Subject: [PATCH 029/484] Renames fill to dlg_fill for consistency --- daliuge-translator/dlg/dropmake/pg_generator.py | 1 + daliuge-translator/dlg/translator/tool_commands.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 60b80f34e..9d41f8f0c 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -2770,6 +2770,7 @@ def partition( tpl_nodes_len=num_partitions + num_islands, ) + print(type(pgt)) return pgt diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 1187d4d9c..1deb026e1 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -108,7 +108,7 @@ def dump(obj): return dump -def fill(parser, args): +def dlg_fill(parser, args): tool.add_logging_options(parser) _add_output_options(parser) parser.add_option( @@ -298,4 +298,4 @@ def register_commands(): tool.cmdwrap('unroll', 'Unrolls a Logical Graph into a Physical Graph Template', dlg_unroll) tool.cmdwrap('partition', 'Divides a Physical Graph Template into N logical partitions', dlg_partition) tool.cmdwrap('unroll-and-partition', 'unroll + partition', dlg_unroll_and_partition) - tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', fill) + tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', dlg_fill) From 1837af88079cd0881a6c72c73a3b5ed458a72a6b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 17:40:01 +0800 Subject: [PATCH 030/484] Moves all reproducibility calls to dlg_x Changes function signatures to include the rmode within the graph structure itself. The only time it should be set is the lgt call. --- .../common/reproducibility/reproducibility.py | 20 +++++++++++++------ .../dlg/dropmake/pg_generator.py | 4 ---- .../dlg/translator/tool_commands.py | 15 ++++++++------ 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 0a07cb929..6ac3b14eb 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -173,12 +173,20 @@ def init_lg_repro_data(lg: dict, rmode: str): return lg -def init_pgt_repro_data(pgt: list, rmode: str): +def init_pgt_unroll_repro_data(pgt: list): """ Handles adding reproducibility data at the physical graph template level. - :param pgt: The physical graph template structure (a list of drops) - :param rmode: One several values 0-5 defined in constants.py - :return: The same lgt object with new information appended + :param pgt: The physical graph template structure (a list of drops + reprodata dictionary) + :return: The same pgt object with new information appended + """ + return pgt + + +def init_pgt_partition_repro_data(pgt: list): + """ + Handles adding reproducibility data at the physical graph template level after resource partitioning. + :param pgt: The physical graph template structure (a list of drops + reprodata dictionary) + :return: The same pgt object with new information recorded """ return pgt @@ -187,7 +195,7 @@ def init_pg_repro_data(pg: dict, rmode: str): """ Handles adding reproducibility data at the physical graph template level. :param pg: The logical graph data structure (a JSON object (a dict)) - :param rmode: One several values 0-5 defined in constants.py - :return: The same lgt object with new information appended + :param rmode: One of several values 0-5 defined in constants.py + :return: The same pg object with new information appended """ return pg diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 9d41f8f0c..49f776cd3 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -63,7 +63,6 @@ import networkx as nx import numpy as np import six -from dlg.common.reproducibility.reproducibility import init_pgt_repro_data from .dm_utils import ( get_lg_ver_type, @@ -2635,7 +2634,6 @@ def unroll(lg, oid_prefix=None, zerorun=False, app=None): for dropspec in drop_list: if "app" in dropspec: dropspec["app"] = app - init_pgt_repro_data(drop_list, lg.reprodata["rmode"]) drop_list.append(lg.reprodata) return drop_list @@ -2769,8 +2767,6 @@ def partition( num_islands=num_islands, tpl_nodes_len=num_partitions + num_islands, ) - - print(type(pgt)) return pgt diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 1deb026e1..f73289062 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -27,7 +27,8 @@ import os import sys -from dlg.common.reproducibility.reproducibility import init_lgt_repro_data, init_lg_repro_data +from dlg.common.reproducibility.reproducibility import init_lgt_repro_data, init_lg_repro_data, \ + init_pgt_unroll_repro_data, init_pgt_partition_repro_data from ..common import tool @@ -178,8 +179,8 @@ def dlg_unroll(parser, args): (opts, args) = parser.parse_args(args) tool.setup_logging(opts) dump = _setup_output(opts) - - dump(unroll(opts.lg_path, opts.oid_prefix, zerorun=opts.zerorun, app=apps[opts.app])) + pgt = unroll(opts.lg_path, opts.oid_prefix, zerorun=opts.zerorun, app=apps[opts.app]) + dump(init_pgt_unroll_repro_data(pgt)) def _add_partition_options(parser): @@ -207,8 +208,9 @@ def dlg_partition(parser, args): with _open_i(opts.pgt_path) as fi: pgt = json.load(fi) repro = pgt.pop() - - dump(partition(pgt, opts)) + pgt = partition(pgt, opts) + pgt.append(repro) + dump(init_pgt_partition_repro_data(pgt)) def dlg_unroll_and_partition(parser, args): @@ -221,7 +223,8 @@ def dlg_unroll_and_partition(parser, args): dump = _setup_output(opts) pgt = unroll(opts.lg_path, opts.oid_prefix, zerorun=opts.zerorun, app=apps[opts.app]) - dump(partition(pgt, opts)) + init_pgt_unroll_repro_data(pgt) + dump(init_pgt_partition_repro_data(partition(pgt, opts))) def dlg_map(parser, args): From 996cbbeb1b9d8555eed3b607f18757215ae91c5c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 17:45:00 +0800 Subject: [PATCH 031/484] Ensures remaining functionality (mapping, submitting) is not affected by unimplemented components. --- daliuge-translator/dlg/translator/tool_commands.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index f73289062..6064bbc47 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -224,7 +224,10 @@ def dlg_unroll_and_partition(parser, args): pgt = unroll(opts.lg_path, opts.oid_prefix, zerorun=opts.zerorun, app=apps[opts.app]) init_pgt_unroll_repro_data(pgt) - dump(init_pgt_partition_repro_data(partition(pgt, opts))) + repro = pgt.pop() + pgt = partition(pgt, opts) + pgt.append(repro) + dump(init_pgt_partition_repro_data(pgt)) def dlg_map(parser, args): @@ -264,6 +267,7 @@ def dlg_map(parser, args): with _open_i(opts.pgt_path) as f: pgt = json.load(f) + repro = pgt.pop() # TODO: Re-include dump(pg_generator.resource_map(pgt, nodes, opts.islands)) From e4927fc1be3dc95c2bf902861a04bfa6dcf4f02b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Jun 2020 18:29:48 +0800 Subject: [PATCH 032/484] Reproducibility function hooks are in-place end-to-end --- .../common/reproducibility/reproducibility.py | 5 ++--- .../dlg/translator/tool_commands.py | 17 +++++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 6ac3b14eb..ae57e049b 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -191,11 +191,10 @@ def init_pgt_partition_repro_data(pgt: list): return pgt -def init_pg_repro_data(pg: dict, rmode: str): +def init_pg_repro_data(pg: dict): """ Handles adding reproducibility data at the physical graph template level. - :param pg: The logical graph data structure (a JSON object (a dict)) - :param rmode: One of several values 0-5 defined in constants.py + :param pg: The logical graph data structure (a list of drops + reprodata dictionary) :return: The same pg object with new information appended """ return pg diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 6064bbc47..91b0c25d6 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -28,7 +28,7 @@ import sys from dlg.common.reproducibility.reproducibility import init_lgt_repro_data, init_lg_repro_data, \ - init_pgt_unroll_repro_data, init_pgt_partition_repro_data + init_pgt_unroll_repro_data, init_pgt_partition_repro_data, init_pg_repro_data from ..common import tool @@ -207,7 +207,7 @@ def dlg_partition(parser, args): with _open_i(opts.pgt_path) as fi: pgt = json.load(fi) - repro = pgt.pop() + repro = pgt.pop() # TODO: Re-integrate pgt = partition(pgt, opts) pgt.append(repro) dump(init_pgt_partition_repro_data(pgt)) @@ -224,7 +224,7 @@ def dlg_unroll_and_partition(parser, args): pgt = unroll(opts.lg_path, opts.oid_prefix, zerorun=opts.zerorun, app=apps[opts.app]) init_pgt_unroll_repro_data(pgt) - repro = pgt.pop() + repro = pgt.pop() # TODO: Re-integrate pgt = partition(pgt, opts) pgt.append(repro) dump(init_pgt_partition_repro_data(pgt)) @@ -267,8 +267,10 @@ def dlg_map(parser, args): with _open_i(opts.pgt_path) as f: pgt = json.load(f) - repro = pgt.pop() # TODO: Re-include - dump(pg_generator.resource_map(pgt, nodes, opts.islands)) + repro = pgt.pop() # TODO: Re-include + pg = pg_generator.resource_map(pgt, nodes, opts.islands) + pg.append(repro) + dump(init_pg_repro_data(pg)) def dlg_submit(parser, args): @@ -295,7 +297,10 @@ def dlg_submit(parser, args): (opts, args) = parser.parse_args(args) with _open_i(opts.pg_path) as f: - submit(json.load(f), opts) + pg = json.load(f) + repro = pg.pop() # TODO: Re-integrate + submit(pg, opts) + pg.append(repro) def register_commands(): From b6bd5fa67a21f8f61d1a0615b76e9f13cf910a06 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 09:31:51 +0800 Subject: [PATCH 033/484] Updates init_lg_repro_data function signature --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 3 +-- daliuge-translator/dlg/translator/tool_commands.py | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index ae57e049b..9caf2f206 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -163,11 +163,10 @@ def init_lgt_repro_data(lgt: dict, rmode: str): return lgt -def init_lg_repro_data(lg: dict, rmode: str): +def init_lg_repro_data(lg: dict): """ Handles adding reproducibility data at the logical graph level. :param lg: The logical graph data structure (a JSON object (a dict)) - :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended """ return lg diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 91b0c25d6..5dbce90f5 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -148,7 +148,7 @@ def param_spec_type(s): from ..dropmake.pg_generator import fill graph = fill(_open_i(opts.logical_graph), params) - dump(init_lg_repro_data(init_lgt_repro_data(graph, opts.reproducibility), opts.reproducibility)) + dump(init_lg_repro_data(init_lgt_repro_data(graph, opts.reproducibility))) def _add_unroll_options(parser): From a9c570e6078909a5f6722607a75e5e85d764d85e Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 11:19:22 +0800 Subject: [PATCH 034/484] Generator now appends the actual bash command, not the object --- daliuge-translator/dlg/dropmake/pg_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 49f776cd3..8d7ed60cb 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -691,7 +691,7 @@ def _create_test_drop_spec(self, oid, rank, kwargs): if v is not None and len(str(v)) > 0: cmds.append(str(v)) # kwargs['command'] = ' '.join(cmds) - kwargs["command"] = BashCommand(cmds) + kwargs["command"] = BashCommand(cmds).to_real_command() # TODO: Surely one records the actual command. kwargs["num_cpus"] = int(self.jd.get("num_cpus", 1)) drop_spec.update(kwargs) From 1fa33760037aaecc3b9de7743bcc673391f03ff2 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 13:22:02 +0800 Subject: [PATCH 035/484] Partially implements lgt -> lg -> pgt hashing --- .../common/reproducibility/reproducibility.py | 74 +++++++++++++++++-- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 9caf2f206..c48032ef9 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -3,7 +3,7 @@ # ------ Drop-Based Functionality ------ -def accumulate_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): """ Accumulates relevant reproducibility fields for a single drop. TODO: Implement alternative level functionality. @@ -36,6 +36,27 @@ def accumulate_drop_data(drop: dict, level: ReproduciblityFlags): return data +def accumulate_pgt_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Accumulates relevant reproducibility fields for a single drop at the physical template level. + TODO: Implement alternative level functionality. + :param drop: + :param level: + :return: A dictionary containing accumulated reproducibility data for a given drop. + """ + data = {} + if level == ReproduciblityFlags.NOTHING: + return data + data["type"] = drop["type"] + data["rank"] = drop["rank"] + if data["type"] == 'plain': + data["storage"] = drop['storage'] + else: + data["app"] = drop["app"] + + return data + + def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): """ Creates and appends per-drop reproducibility information at the logical template stage. @@ -43,7 +64,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproducibility information. """ - data = accumulate_drop_data(drop, level) + data = accumulate_lg_drop_data(drop, level) merkledata = [] for key, value in data.items(): temp = [key, value] @@ -65,7 +86,28 @@ def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): return drop -def init_pgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): +def init_pgt_unroll_repro_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Creates and appends per-drop reproducibility information at the physical graph template stage. + :param drop: + :param level: + :return: The same drop with appended reproducibility information + """ + data = accumulate_pgt_drop_data(drop, level) + merkledata = [] + for key, value in data.items(): + temp = [key, value] + merkledata.append(temp) + merkletree = MerkleTree(merkledata) + data['merkleroot'] = merkletree.merkle_root + data['parenthashes'] = [] # Initialized here in-case this drop ends up having in-deg = 0 + # Separated so chaining can happen on independent elements (or both later) + data['lgdata'] = drop['reprodata'] # Embedding into a sub-dict + drop['reprodata'] = data + return drop + + +def init_pgt_partition_repro_drop_data(drop: dict, level: ReproduciblityFlags): """ Creates and appends per-drop reproducibility information at the physical graph template stage. :param drop: @@ -95,7 +137,7 @@ def build_block_data(drop: dict): drop['reprodata']['blockhash'] = mtree.merkle_root -def topo_sort(lg: dict): +def lg_build_blockdag(lg: dict): """ Uses Kahn's algorithm to topologically sort a logical graph dictionary. Exploits that a DAG contains at least one node with in-degree 0. @@ -143,6 +185,19 @@ def topo_sort(lg: dict): # TODO: Improve error handling +def pgt_build_blockdag(drops: list): + """ + Uses Kahn's algorithm to topologically sort a list of physical graph template nodes + Exploits that a DAG contains at least one node with in-degree 0. + Processes drops in-order. + O(V + E) time complexity. + :param drops: The list of drops + :return: + """ + + pass + + def init_lgt_repro_data(lgt: dict, rmode: str): """ Creates and appends graph-wide reproducibility data at the logical template stage. @@ -158,7 +213,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): reprodata = {'rmode': str(rmode.value)} for drop in lgt['nodeDataArray']: init_lgt_repro_drop_data(drop, rmode) - topo_sort(lgt) + lg_build_blockdag(lgt) lgt['reprodata'] = reprodata return lgt @@ -178,6 +233,15 @@ def init_pgt_unroll_repro_data(pgt: list): :param pgt: The physical graph template structure (a list of drops + reprodata dictionary) :return: The same pgt object with new information appended """ + reprodata = pgt.pop() + rmode = ReproduciblityFlags(int(reprodata["rmode"])) + if not rmode_supported(rmode): + rmode = REPRO_DEFAULT + reprodata["rmode"] = str(rmode.value) + for drop in pgt: + init_pgt_unroll_repro_drop_data(drop, rmode) + pgt_build_blockdag(pgt) + pgt.append(reprodata) return pgt From 76cda88cd77075edb67b7838a694a752649bc8b0 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 14:04:47 +0800 Subject: [PATCH 036/484] Restructures reproducibility data storage to explicitly separate domains. --- .../common/reproducibility/reproducibility.py | 53 ++++++++++++++----- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index c48032ef9..09aded545 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -3,7 +3,7 @@ # ------ Drop-Based Functionality ------ -def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): """ Accumulates relevant reproducibility fields for a single drop. TODO: Implement alternative level functionality. @@ -36,6 +36,17 @@ def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): return data +def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Accumulates relevant reproducibility fields for a single drop. + TODO: Implement alternative level functionality. + :param drop: + :param level: + :return: A dictionary containing accumulated reproducibility data for a given drop. + """ + return {} + + def accumulate_pgt_drop_data(drop: dict, level: ReproduciblityFlags): """ Accumulates relevant reproducibility fields for a single drop at the physical template level. @@ -64,15 +75,14 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproducibility information. """ - data = accumulate_lg_drop_data(drop, level) + data = accumulate_lgt_drop_data(drop, level) merkledata = [] for key, value in data.items(): temp = [key, value] merkledata.append(temp) merkletree = MerkleTree(merkledata) data['merkleroot'] = merkletree.merkle_root - data['parenthashes'] = [] # Initialized here in-case this drop ends up having in-deg = 0 - drop['reprodata'] = data + drop['reprodata'] = {'lgt_data': data, 'lg_parenthashes': []} return drop @@ -83,6 +93,14 @@ def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproducibility information """ + data = accumulate_lg_drop_data(drop, level) + merkledata = [] + for key, value in data.items(): + temp = [key, value] + merkledata.append(temp) + merkletree = MerkleTree(merkledata) + data['merkleroot'] = merkletree.merkle_root + drop['reprodata']['lg_data'] = data return drop @@ -100,10 +118,9 @@ def init_pgt_unroll_repro_drop_data(drop: dict, level: ReproduciblityFlags): merkledata.append(temp) merkletree = MerkleTree(merkledata) data['merkleroot'] = merkletree.merkle_root - data['parenthashes'] = [] # Initialized here in-case this drop ends up having in-deg = 0 # Separated so chaining can happen on independent elements (or both later) - data['lgdata'] = drop['reprodata'] # Embedding into a sub-dict - drop['reprodata'] = data + drop['reprodata']['pg_parenthashes'] = [] + drop['reprodata']['pgt_data'] = data return drop @@ -129,12 +146,12 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): # ------ Graph-Wide Functionality ------ -def build_block_data(drop: dict): - block_data = [drop['reprodata']['merkleroot']] - for parenthash in sorted(drop['reprodata']['parenthashes']): +def build_lg_block_data(drop: dict): + block_data = [drop['reprodata']['lgt_data']['merkleroot']] + for parenthash in sorted(drop['reprodata']['lg_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data) - drop['reprodata']['blockhash'] = mtree.merkle_root + drop['reprodata']['lg_blockhash'] = mtree.merkle_root def lg_build_blockdag(lg: dict): @@ -171,12 +188,12 @@ def lg_build_blockdag(lg: dict): while q: did = q.pop() # Process - build_block_data(dropset[did][0]) + build_lg_block_data(dropset[did][0]) visited += 1 for n in neighbourset[did]: dropset[n][1] -= 1 # Add our new hash to the parent-hash list - dropset[n][0]['reprodata']['parenthashes'].append(dropset[did][0]['reprodata']['blockhash']) + dropset[n][0]['reprodata']['lg_parenthashes'].append(dropset[did][0]['reprodata']['lg_blockhash']) if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) @@ -213,7 +230,6 @@ def init_lgt_repro_data(lgt: dict, rmode: str): reprodata = {'rmode': str(rmode.value)} for drop in lgt['nodeDataArray']: init_lgt_repro_drop_data(drop, rmode) - lg_build_blockdag(lgt) lgt['reprodata'] = reprodata return lgt @@ -221,9 +237,17 @@ def init_lgt_repro_data(lgt: dict, rmode: str): def init_lg_repro_data(lg: dict): """ Handles adding reproducibility data at the logical graph level. + Also builds the logical data blockdag over the entire structure. :param lg: The logical graph data structure (a JSON object (a dict)) :return: The same lgt object with new information appended """ + rmode = ReproduciblityFlags(int(lg['reprodata']['rmode'])) + if not rmode_supported(rmode): + rmode = REPRO_DEFAULT + lg['reprodata']["rmode"] = str(rmode.value) + for drop in lg['nodeDataArray']: + init_lg_repro_drop_data(drop, rmode) + lg_build_blockdag(lg) return lg @@ -251,6 +275,7 @@ def init_pgt_partition_repro_data(pgt: list): :param pgt: The physical graph template structure (a list of drops + reprodata dictionary) :return: The same pgt object with new information recorded """ + # Check if pg-blockhash is none return pgt From 489586ee746c22448e307f663ab71686c55eeea2 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 14:07:50 +0800 Subject: [PATCH 037/484] Undoes change to accomodate mpi apps --- daliuge-translator/dlg/dropmake/pg_generator.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 8d7ed60cb..4ca4c80a8 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -691,7 +691,10 @@ def _create_test_drop_spec(self, oid, rank, kwargs): if v is not None and len(str(v)) > 0: cmds.append(str(v)) # kwargs['command'] = ' '.join(cmds) - kwargs["command"] = BashCommand(cmds).to_real_command() # TODO: Surely one records the actual command. + if drop_type == 'mpi': + kwargs["command"] = BashCommand(cmds).to_real_command() + else: + kwargs["command"] = BashCommand(cmds) # TODO: Check if this actually solves a problem. kwargs["num_cpus"] = int(self.jd.get("num_cpus", 1)) drop_spec.update(kwargs) From 136e0f38a58186d806b1bbdb4881920e8b27f118 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 15:38:31 +0800 Subject: [PATCH 038/484] Fixes bug causing aliased reprodata dictionaries. --- daliuge-translator/dlg/dropmake/pg_generator.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 4ca4c80a8..11109d2c6 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -131,7 +131,7 @@ def __init__(self, jd, group_q, done_dict, ssid): self._dop = None self._gaw = None self._grpw = None - self._reprodata = jd["reprodata"] + self._reprodata = jd['reprodata'].copy() if "isGroup" in jd and jd["isGroup"] is True: self._isgrp = True for wn in group_q[self.id]: @@ -835,7 +835,8 @@ def make_single_drop(self, iid="0", **kwargs): kwargs["lg_key"] = self.id kwargs["dt"] = self.jd["category"] kwargs["nm"] = self.text - kwargs["reprodata"] = self._reprodata + # Behaviour is that child-nodes inherit reproducibility data from their parents. + kwargs["reprodata"] = self._reprodata.copy() dropSpec.update(kwargs) return dropSpec From c7d2c30f8b3f5c861be7ef43d1059d69d31f7a05 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 15:38:50 +0800 Subject: [PATCH 039/484] Implements init_pgt_partition_repro_data --- .../dlg/common/reproducibility/reproducibility.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 09aded545..4fc587335 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -211,7 +211,7 @@ def pgt_build_blockdag(drops: list): :param drops: The list of drops :return: """ - + # Check if pg-blockhash is none pass @@ -275,7 +275,15 @@ def init_pgt_partition_repro_data(pgt: list): :param pgt: The physical graph template structure (a list of drops + reprodata dictionary) :return: The same pgt object with new information recorded """ - # Check if pg-blockhash is none + reprodata = pgt.pop() + rmode = ReproduciblityFlags(int(reprodata["rmode"])) + if not rmode_supported(rmode): + rmode = REPRO_DEFAULT + reprodata["rmode"] = str(rmode.value) + for drop in pgt: + init_pgt_partition_repro_drop_data(drop, rmode) + pgt_build_blockdag(pgt) + pgt.append(reprodata) return pgt From 25baea9126af7eec5a3125e7ef2f11f70a70206e Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 12 Jun 2020 17:00:35 +0800 Subject: [PATCH 040/484] Builds a blockDAG at the PGT level (unroll) --- .../common/reproducibility/reproducibility.py | 54 +++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 4fc587335..8b6f81fb2 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -119,7 +119,7 @@ def init_pgt_unroll_repro_drop_data(drop: dict, level: ReproduciblityFlags): merkletree = MerkleTree(merkledata) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) - drop['reprodata']['pg_parenthashes'] = [] + drop['reprodata']['pgt_parenthashes'] = [] drop['reprodata']['pgt_data'] = data return drop @@ -154,6 +154,14 @@ def build_lg_block_data(drop: dict): drop['reprodata']['lg_blockhash'] = mtree.merkle_root +def build_pgt_block_data(drop: dict): + block_data = [drop['reprodata']['pgt_data']['merkleroot'], drop['reprodata']['lg_blockhash']] + for parenthash in sorted(drop['reprodata']['pgt_parenthashes']): + block_data.append(parenthash) + mtree = MerkleTree(block_data) + drop['reprodata']['pgt_blockhash'] = mtree.merkle_root + + def lg_build_blockdag(lg: dict): """ Uses Kahn's algorithm to topologically sort a logical graph dictionary. @@ -193,7 +201,8 @@ def lg_build_blockdag(lg: dict): for n in neighbourset[did]: dropset[n][1] -= 1 # Add our new hash to the parent-hash list - dropset[n][0]['reprodata']['lg_parenthashes'].append(dropset[did][0]['reprodata']['lg_blockhash']) + parenthash = dropset[did][0]['reprodata']['lg_blockhash'] + dropset[n][0]['reprodata']['lg_parenthashes'].append(parenthash) if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) @@ -212,7 +221,46 @@ def pgt_build_blockdag(drops: list): :return: """ # Check if pg-blockhash is none - pass + from collections import deque + dropset = {} + neighbourset = {} + visited = 0 + q = deque() + + for drop in drops: + did = drop['oid'] + dropset[did] = [drop, 0] # To guarantee all nodes have entries + for drop in drops: + did = drop['oid'] + neighbourset[did] = [] + if 'outputs' in drop: + for dest in drop['outputs']: + dropset[dest][1] += 1 + neighbourset[did].append(dest) + if 'consumers' in drop: # There may be some bizarre scenario when a drop has both + for dest in drop['consumers']: + dropset[dest][1] += 1 + neighbourset[did].append(dest) + + for did in dropset: + if dropset[did][1] == 0: + q.append(did) + + while q: + did = q.pop() + build_pgt_block_data(dropset[did][0]) + visited += 1 + for n in neighbourset[did]: + dropset[n][1] -= 1 + # Add our new hash to the parest-hash list + parenthash = dropset[did][0]['reprodata']['pgt_blockhash'] + dropset[n][0]['reprodata']['pgt_parenthashes'].append(parenthash) + if dropset[n][1] == 0: + q.append(n) + + if visited != len(dropset): + print("Not a DAG") + # TODO: Improve error handling def init_lgt_repro_data(lgt: dict, rmode: str): From b7c2c1a323559aba710ac29d0d1b21623c814de5 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 15 Jun 2020 13:48:55 +0800 Subject: [PATCH 041/484] Changes ordering of reproducibility enums Computational replication is more precise than scientific in my opinion. --- daliuge-common/dlg/common/reproducibility/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 692c75f05..7b2eb414c 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -6,8 +6,8 @@ class ReproduciblityFlags(Enum): RERUN = 1 REPEAT = 2 REPRODUCE = 3 - REPLICATE_COMP = 4 - REPLICATE_SCI = 5 + REPLICATE_SCI = 4 # Rerun + Reproduce (holds numerically) + REPLICATE_COMP = 5 # Repeat + Reproduce (holds numerically) EXPERIMENTAL = 6 From 6d74ac3eec50af9fc611e3ecaece5a754637d004 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 15 Jun 2020 14:40:14 +0800 Subject: [PATCH 042/484] Adds partition pgt data. --- .../common/reproducibility/reproducibility.py | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 8b6f81fb2..8774b02ba 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -47,7 +47,7 @@ def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): return {} -def accumulate_pgt_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_pgt_unroll_drop_data(drop: dict, level: ReproduciblityFlags): """ Accumulates relevant reproducibility fields for a single drop at the physical template level. TODO: Implement alternative level functionality. @@ -68,6 +68,25 @@ def accumulate_pgt_drop_data(drop: dict, level: ReproduciblityFlags): return data +def accumulate_pgt_partition_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Is as combination of unroll drop data + :param drop: + :param level: + :return: + """ + data = {} + if level == ReproduciblityFlags.NOTHING: + return data + data = accumulate_pgt_unroll_drop_data(drop, level) + # This is the only piece of new information added at the partition level + # It is only pertinent to Repetition and Computational replication + if level == ReproduciblityFlags.REPEAT or level == ReproduciblityFlags.REPLICATE_COMP: + data["node"] = drop["node"][1:] + data["island"] = drop["island"][1:] + return data + + def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): """ Creates and appends per-drop reproducibility information at the logical template stage. @@ -104,14 +123,7 @@ def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): return drop -def init_pgt_unroll_repro_drop_data(drop: dict, level: ReproduciblityFlags): - """ - Creates and appends per-drop reproducibility information at the physical graph template stage. - :param drop: - :param level: - :return: The same drop with appended reproducibility information - """ - data = accumulate_pgt_drop_data(drop, level) +def append_pgt_repro_data(drop: dict, data: dict): merkledata = [] for key, value in data.items(): temp = [key, value] @@ -124,13 +136,27 @@ def init_pgt_unroll_repro_drop_data(drop: dict, level: ReproduciblityFlags): return drop +def init_pgt_unroll_repro_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Creates and appends per-drop reproducibility information at the physical graph template stage when unrolling. + :param drop: + :param level: + :return: The same drop with appended reproducibility information + """ + data = accumulate_pgt_unroll_drop_data(drop, level) + append_pgt_repro_data(drop, data) + return drop + + def init_pgt_partition_repro_drop_data(drop: dict, level: ReproduciblityFlags): """ - Creates and appends per-drop reproducibility information at the physical graph template stage. + Creates and appends per-drop reproducibility information at the physical graph template stage when partitioning. :param drop: :param level: :return: The same drop with appended reproducibility information """ + data = accumulate_pgt_partition_drop_data(drop, level) + append_pgt_repro_data(drop, data) return drop From 98f36d92e7b6a31c20dee740697c45999c54a722 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 15 Jun 2020 16:11:04 +0800 Subject: [PATCH 043/484] Very minor typo --- daliuge-translator/dlg/translator/tool_commands.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 5dbce90f5..96cf76f55 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -207,7 +207,7 @@ def dlg_partition(parser, args): with _open_i(opts.pgt_path) as fi: pgt = json.load(fi) - repro = pgt.pop() # TODO: Re-integrate + repro = pgt.pop() # TODO: Re-integrate pgt = partition(pgt, opts) pgt.append(repro) dump(init_pgt_partition_repro_data(pgt)) @@ -224,7 +224,7 @@ def dlg_unroll_and_partition(parser, args): pgt = unroll(opts.lg_path, opts.oid_prefix, zerorun=opts.zerorun, app=apps[opts.app]) init_pgt_unroll_repro_data(pgt) - repro = pgt.pop() # TODO: Re-integrate + repro = pgt.pop() # TODO: Re-integrate pgt = partition(pgt, opts) pgt.append(repro) dump(init_pgt_partition_repro_data(pgt)) From dff0591f88c496d3067f9dbacc1c43b8c906d994 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 15 Jun 2020 16:22:51 +0800 Subject: [PATCH 044/484] Adds skeleton for mapping step and accumulates pg data. --- .../common/reproducibility/reproducibility.py | 46 ++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 8774b02ba..d1c0f66b6 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -87,6 +87,23 @@ def accumulate_pgt_partition_drop_data(drop: dict, level: ReproduciblityFlags): return data +def accumulate_pg_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Accumulate relevant reproducibility fields for a single drop at the physical graph level. + TODO: Implement alternative level functionality. + :param drop: + :param level: + :return: A dictionary containing accumulated reproducibility data for a given drop. + """ + data = {} + if level == ReproduciblityFlags.NOTHING: + return data + if level == ReproduciblityFlags.REPEAT or level == ReproduciblityFlags.REPLICATE_COMP: + data['node'] = drop['node'] + data['island'] = drop['island'] + return data + + def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): """ Creates and appends per-drop reproducibility information at the logical template stage. @@ -167,6 +184,16 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: The same drop with appended reproducibility information """ + data = accumulate_pg_drop_data(drop, level) + merkledata = [] + for key, value in data.items(): + temp = [key, value] + merkledata.append(temp) + merkletree = MerkleTree(merkledata) + data['merkleroot'] = merkletree.merkle_root + # Separated so chaining can happen on independent elements (or both later) + drop['reprodata']['pg_parenthashes'] = [] + drop['reprodata']['pg_data'] = data return drop @@ -188,6 +215,10 @@ def build_pgt_block_data(drop: dict): drop['reprodata']['pgt_blockhash'] = mtree.merkle_root +def build_pg_block_data(drop: dict): + pass + + def lg_build_blockdag(lg: dict): """ Uses Kahn's algorithm to topologically sort a logical graph dictionary. @@ -289,6 +320,10 @@ def pgt_build_blockdag(drops: list): # TODO: Improve error handling +def pg_build_blockdag(drops: list): + pass + + def init_lgt_repro_data(lgt: dict, rmode: str): """ Creates and appends graph-wide reproducibility data at the logical template stage. @@ -361,10 +396,19 @@ def init_pgt_partition_repro_data(pgt: list): return pgt -def init_pg_repro_data(pg: dict): +def init_pg_repro_data(pg: list): """ Handles adding reproducibility data at the physical graph template level. :param pg: The logical graph data structure (a list of drops + reprodata dictionary) :return: The same pg object with new information appended """ + reprodata = pg.pop() + rmode = ReproduciblityFlags(int(reprodata["rmode"])) + if not rmode_supported(rmode): + rmode = REPRO_DEFAULT + reprodata["rmode"] = str(rmode.value) + for drop in pg: + init_pg_repro_drop_data(drop, rmode) + pg_build_blockdag(pg) + pg.append(reprodata) return pg From 6d7ded231784c1fc4868602554ea30b942eeaeac Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 18 Jun 2020 12:08:50 +0800 Subject: [PATCH 045/484] Adds protocol version (in a rudimentary manner) for use with meta-data. --- daliuge-common/dlg/common/reproducibility/constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 7b2eb414c..f488d18d2 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -1,5 +1,7 @@ from enum import Enum +PROTOCOL_VERSION = 0.1 + class ReproduciblityFlags(Enum): NOTHING = 0 From 02043228c1bb5f352acb5af7e08a36cd444fe6cf Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 18 Jun 2020 12:13:10 +0800 Subject: [PATCH 046/484] Adds a default hashing algorithm settable in constants.py --- daliuge-common/dlg/common/reproducibility/constants.py | 2 ++ daliuge-runtime/dlg/drop.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index f488d18d2..7343e487d 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -1,4 +1,5 @@ from enum import Enum +import hashlib PROTOCOL_VERSION = 0.1 @@ -14,6 +15,7 @@ class ReproduciblityFlags(Enum): REPRO_DEFAULT = ReproduciblityFlags.NOTHING +HASHING_ALG = hashlib.sha3_256 def rmode_supported(flag: ReproduciblityFlags): diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index bda8d4094..801b73f88 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -42,7 +42,7 @@ from abc import ABCMeta, abstractmethod import six -from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported +from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported, HASHING_ALG from merklelib import MerkleTree from six import BytesIO @@ -85,7 +85,7 @@ def append(self, drop): def drop_hash(value): - return hashlib.sha3_256(value).hexdigest() + return HASHING_ALG(value).hexdigest() # =============================================================================== From d87691c6390f313dfd090f49bf59475158fa27f9 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 18 Jun 2020 12:43:38 +0800 Subject: [PATCH 047/484] Default hashing algorithm now used in blockchain generation --- .../common/reproducibility/reproducibility.py | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index d1c0f66b6..6a26c9aac 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -1,7 +1,12 @@ -from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported +from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ + rmode_supported from merklelib import MerkleTree +def common_hash(value): + return HASHING_ALG(value).hexdigest() + + # ------ Drop-Based Functionality ------ def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): """ @@ -116,7 +121,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): for key, value in data.items(): temp = [key, value] merkledata.append(temp) - merkletree = MerkleTree(merkledata) + merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata'] = {'lgt_data': data, 'lg_parenthashes': []} return drop @@ -134,7 +139,7 @@ def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): for key, value in data.items(): temp = [key, value] merkledata.append(temp) - merkletree = MerkleTree(merkledata) + merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata']['lg_data'] = data return drop @@ -145,7 +150,7 @@ def append_pgt_repro_data(drop: dict, data: dict): for key, value in data.items(): temp = [key, value] merkledata.append(temp) - merkletree = MerkleTree(merkledata) + merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) drop['reprodata']['pgt_parenthashes'] = [] @@ -189,7 +194,7 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): for key, value in data.items(): temp = [key, value] merkledata.append(temp) - merkletree = MerkleTree(merkledata) + merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) drop['reprodata']['pg_parenthashes'] = [] @@ -199,11 +204,16 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): # ------ Graph-Wide Functionality ------ +def accumulate_meta_data(): + data = {'repro_protocol': PROTOCOL_VERSION, 'hashing_alg': str(HASHING_ALG)[8:-2]} + return data + + def build_lg_block_data(drop: dict): block_data = [drop['reprodata']['lgt_data']['merkleroot']] for parenthash in sorted(drop['reprodata']['lg_parenthashes']): block_data.append(parenthash) - mtree = MerkleTree(block_data) + mtree = MerkleTree(block_data, common_hash) drop['reprodata']['lg_blockhash'] = mtree.merkle_root @@ -211,7 +221,7 @@ def build_pgt_block_data(drop: dict): block_data = [drop['reprodata']['pgt_data']['merkleroot'], drop['reprodata']['lg_blockhash']] for parenthash in sorted(drop['reprodata']['pgt_parenthashes']): block_data.append(parenthash) - mtree = MerkleTree(block_data) + mtree = MerkleTree(block_data, common_hash) drop['reprodata']['pgt_blockhash'] = mtree.merkle_root @@ -336,7 +346,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): rmode = ReproduciblityFlags(int(rmode)) if not rmode_supported(rmode): rmode = REPRO_DEFAULT - reprodata = {'rmode': str(rmode.value)} + reprodata = {'rmode': str(rmode.value), 'meta_data': accumulate_meta_data()} for drop in lgt['nodeDataArray']: init_lgt_repro_drop_data(drop, rmode) lgt['reprodata'] = reprodata From dd8c288fec0f1a3452fc48f9e5ef895b609bfcdd Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 18 Jun 2020 13:28:31 +0800 Subject: [PATCH 048/484] Improves error handling for topological sorting --- .../dlg/common/reproducibility/reproducibility.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 6a26c9aac..7e08b0cfd 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -101,8 +101,6 @@ def accumulate_pg_drop_data(drop: dict, level: ReproduciblityFlags): :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - if level == ReproduciblityFlags.NOTHING: - return data if level == ReproduciblityFlags.REPEAT or level == ReproduciblityFlags.REPLICATE_COMP: data['node'] = drop['node'] data['island'] = drop['island'] @@ -274,8 +272,7 @@ def lg_build_blockdag(lg: dict): q.append(n) if visited != len(dropset): - print("Not a DAG") - # TODO: Improve error handling + raise ValueError("Not a DAG") def pgt_build_blockdag(drops: list): @@ -326,8 +323,7 @@ def pgt_build_blockdag(drops: list): q.append(n) if visited != len(dropset): - print("Not a DAG") - # TODO: Improve error handling + raise ValueError("Not a DAG") def pg_build_blockdag(drops: list): From 51ed9f4320f63e6ac2d45ca921281d7c8ac6b6d5 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 18 Jun 2020 14:25:07 +0800 Subject: [PATCH 049/484] Adds a reset of lg_parent hashes before building the LG blockdag --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 7e08b0cfd..b9a764d8e 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -140,6 +140,7 @@ def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata']['lg_data'] = data + drop['reprodata']['lg_parenthashes'] = [] return drop From 25c7c495bfac139fd925cde41ca7d2b5bff0ad31 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 18 Jun 2020 15:30:21 +0800 Subject: [PATCH 050/484] Adds logging to reproducbility functionality. --- .../common/reproducibility/reproducibility.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index b9a764d8e..726291f1a 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -1,6 +1,9 @@ from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ rmode_supported from merklelib import MerkleTree +import logging + +logger = logging.getLogger(__name__) def common_hash(value): @@ -37,7 +40,6 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): pass elif category_type == "Other": pass - return data @@ -275,6 +277,8 @@ def lg_build_blockdag(lg: dict): if visited != len(dropset): raise ValueError("Not a DAG") + logger.info("BlockDAG Generated at LG/T level") + def pgt_build_blockdag(drops: list): """ @@ -326,8 +330,11 @@ def pgt_build_blockdag(drops: list): if visited != len(dropset): raise ValueError("Not a DAG") + logger.info("BlockDAG Generated at PGT level") + def pg_build_blockdag(drops: list): + logger.debug("PG BlockDAG currently not implemented") pass @@ -342,11 +349,13 @@ def init_lgt_repro_data(lgt: dict, rmode: str): """ rmode = ReproduciblityFlags(int(rmode)) if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata = {'rmode': str(rmode.value), 'meta_data': accumulate_meta_data()} for drop in lgt['nodeDataArray']: init_lgt_repro_drop_data(drop, rmode) lgt['reprodata'] = reprodata + logger.info("Reproducibility data finished at LGT level") return lgt @@ -359,11 +368,13 @@ def init_lg_repro_data(lg: dict): """ rmode = ReproduciblityFlags(int(lg['reprodata']['rmode'])) if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT lg['reprodata']["rmode"] = str(rmode.value) for drop in lg['nodeDataArray']: init_lg_repro_drop_data(drop, rmode) lg_build_blockdag(lg) + logger.info("Reproducibility data finished at LG level") return lg @@ -376,12 +387,14 @@ def init_pgt_unroll_repro_data(pgt: list): reprodata = pgt.pop() rmode = ReproduciblityFlags(int(reprodata["rmode"])) if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata["rmode"] = str(rmode.value) for drop in pgt: init_pgt_unroll_repro_drop_data(drop, rmode) pgt_build_blockdag(pgt) pgt.append(reprodata) + logger.info("Reproducibility data finished at PGT unroll level") return pgt @@ -394,12 +407,14 @@ def init_pgt_partition_repro_data(pgt: list): reprodata = pgt.pop() rmode = ReproduciblityFlags(int(reprodata["rmode"])) if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata["rmode"] = str(rmode.value) for drop in pgt: init_pgt_partition_repro_drop_data(drop, rmode) pgt_build_blockdag(pgt) pgt.append(reprodata) + logger.info("Reproducibility data finished at PGT partition level") return pgt @@ -412,10 +427,12 @@ def init_pg_repro_data(pg: list): reprodata = pg.pop() rmode = ReproduciblityFlags(int(reprodata["rmode"])) if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata["rmode"] = str(rmode.value) for drop in pg: init_pg_repro_drop_data(drop, rmode) pg_build_blockdag(pg) pg.append(reprodata) + logger.info("Reproducibility data finished at PG level") return pg From 85e5bce3035520735e6832dd200fa42db0a71adc Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 18 Jun 2020 17:10:12 +0800 Subject: [PATCH 051/484] Hashes meta-data now --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 726291f1a..c20e6e116 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -352,6 +352,8 @@ def init_lgt_repro_data(lgt: dict, rmode: str): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata = {'rmode': str(rmode.value), 'meta_data': accumulate_meta_data()} + meta_tree = MerkleTree(reprodata, common_hash) + reprodata['merkleroot'] = meta_tree.merkle_root for drop in lgt['nodeDataArray']: init_lgt_repro_drop_data(drop, rmode) lgt['reprodata'] = reprodata From 6d6553c6fb15259d5c77633cfca86c59b8b76231 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 19 Jun 2020 11:37:50 +0800 Subject: [PATCH 052/484] New completedrop method is implemented. Now any listener to 'dropCompleted' should receive reproducibility data. --- daliuge-runtime/dlg/drop.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 801b73f88..92fb93f7b 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -998,6 +998,16 @@ def addStreamingConsumer(self, streamingConsumer, back=True): if self.executionMode == ExecutionMode.DROP: self.subscribe(streamingConsumer, 'dropCompleted') + def completedrop(self, status): + """ + Builds final reproducibility data for this drop and fires a 'dropComplete' event. + This should be called once a drop is finished in success or error + :return: + """ + self.commit() + reprodata = {'data': self._merkleData, 'merkleroot': self.merkleroot} + self._fire('dropCompleted', status=status, reprodata=reprodata) + @track_current_drop def setError(self): ''' @@ -1013,7 +1023,8 @@ def setError(self): self.status = DROPStates.ERROR # Signal our subscribers that the show is over - self._fire('dropCompleted', status=DROPStates.ERROR) + self.completedrop(status=DROPStates.ERROR) + #self._fire('dropCompleted', status=DROPStates.ERROR) @track_current_drop def setCompleted(self): @@ -1037,7 +1048,8 @@ def setCompleted(self): self.commit() # Signal our subscribers that the show is over - self._fire('dropCompleted', status=DROPStates.COMPLETED) + self.completedrop(status=DROPStates.COMPLETED) + #self._fire('dropCompleted', status=DROPStates.COMPLETED) def isCompleted(self): ''' From ccb4ec2a73931073b6851b6d13006529c6dbdd7d Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 19 Jun 2020 11:37:50 +0800 Subject: [PATCH 053/484] New completedrop method is implemented. Now any listener to 'dropCompleted' should receive reproducibility data. --- daliuge-runtime/dlg/drop.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 801b73f88..884189d82 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -998,6 +998,16 @@ def addStreamingConsumer(self, streamingConsumer, back=True): if self.executionMode == ExecutionMode.DROP: self.subscribe(streamingConsumer, 'dropCompleted') + def completedrop(self, status): + """ + Builds final reproducibility data for this drop and fires a 'dropComplete' event. + This should be called once a drop is finished in success or error + :return: + """ + self.commit() + reprodata = {'data': self._merkleData, 'merkleroot': self.merkleroot} + self._fire('dropCompleted', status=status, reprodata=reprodata) + @track_current_drop def setError(self): ''' @@ -1013,7 +1023,7 @@ def setError(self): self.status = DROPStates.ERROR # Signal our subscribers that the show is over - self._fire('dropCompleted', status=DROPStates.ERROR) + self.completedrop(status=DROPStates.ERROR) @track_current_drop def setCompleted(self): @@ -1037,7 +1047,7 @@ def setCompleted(self): self.commit() # Signal our subscribers that the show is over - self._fire('dropCompleted', status=DROPStates.COMPLETED) + self.completedrop(status=DROPStates.COMPLETED) def isCompleted(self): ''' From 2a27b58c0809013ef7329504f99269f7298635fa Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 19 Jun 2020 13:58:55 +0800 Subject: [PATCH 054/484] Changes ValueException to generic Exception when checking DAG status --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index c20e6e116..e849b22af 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -275,7 +275,7 @@ def lg_build_blockdag(lg: dict): q.append(n) if visited != len(dropset): - raise ValueError("Not a DAG") + raise Exception("Not a DAG") logger.info("BlockDAG Generated at LG/T level") @@ -328,7 +328,7 @@ def pgt_build_blockdag(drops: list): q.append(n) if visited != len(dropset): - raise ValueError("Not a DAG") + raise Exception("Not a DAG") logger.info("BlockDAG Generated at PGT level") From 8f844abbe49c2878b7209c4f92cd95c31ff84770 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 19 Jun 2020 14:08:50 +0800 Subject: [PATCH 055/484] Conditionally appends LG block hash data (if it exists). --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index e849b22af..69d7a7670 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -212,6 +212,9 @@ def accumulate_meta_data(): def build_lg_block_data(drop: dict): block_data = [drop['reprodata']['lgt_data']['merkleroot']] + lg_hash = drop['reprodata']['lg_data']['merkleroot'] + if lg_hash is not None: + block_data.append(lg_hash) for parenthash in sorted(drop['reprodata']['lg_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) From 96b0033ca6f880c62eecccafc48e7517cde4e458 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 19 Jun 2020 14:21:26 +0800 Subject: [PATCH 056/484] Separated out completedrop as a separate case (consider dropFinished vs. producerFinished) --- daliuge-runtime/dlg/drop.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 884189d82..019aca9d9 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -998,7 +998,7 @@ def addStreamingConsumer(self, streamingConsumer, back=True): if self.executionMode == ExecutionMode.DROP: self.subscribe(streamingConsumer, 'dropCompleted') - def completedrop(self, status): + def completedrop(self): """ Builds final reproducibility data for this drop and fires a 'dropComplete' event. This should be called once a drop is finished in success or error @@ -1006,7 +1006,7 @@ def completedrop(self, status): """ self.commit() reprodata = {'data': self._merkleData, 'merkleroot': self.merkleroot} - self._fire('dropCompleted', status=status, reprodata=reprodata) + self._fire(eventType='reproducibility', reprodata=reprodata) @track_current_drop def setError(self): @@ -1023,7 +1023,8 @@ def setError(self): self.status = DROPStates.ERROR # Signal our subscribers that the show is over - self.completedrop(status=DROPStates.ERROR) + self._fire(eventType='dropCompleted', status=DROPStates.ERROR) + self.completedrop() @track_current_drop def setCompleted(self): @@ -1043,11 +1044,9 @@ def setCompleted(self): logger.debug("Moving %r to COMPLETED", self) self.status = DROPStates.COMPLETED - # Commits current reproduciblity data to an internal MerkleTree - self.commit() - # Signal our subscribers that the show is over - self.completedrop(status=DROPStates.COMPLETED) + self._fire(eventType='dropCompleted', status=DROPStates.COMPLETED) + self.completedrop() def isCompleted(self): ''' @@ -1632,6 +1631,7 @@ def _notifyAppIsFinished(self): self.status = DROPStates.COMPLETED logger.debug("Moving %r to %s", self, "FINISHED" if not is_error else "ERROR") self._fire('producerFinished', status=self.status, execStatus=self.execStatus) + self.completedrop() def cancel(self): '''Moves this application drop to its CANCELLED state''' From cdb69d0caaff96f8e7edb720c6e80620fe2ad6c9 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Sat, 20 Jun 2020 11:57:33 +0800 Subject: [PATCH 057/484] Changes default to RERUN for sake of testing. Fixes typo --- daliuge-common/dlg/common/reproducibility/constants.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 7343e487d..5b780bb50 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -1,5 +1,5 @@ -from enum import Enum import hashlib +from enum import Enum PROTOCOL_VERSION = 0.1 @@ -14,7 +14,7 @@ class ReproduciblityFlags(Enum): EXPERIMENTAL = 6 -REPRO_DEFAULT = ReproduciblityFlags.NOTHING +REPRO_DEFAULT = ReproduciblityFlags.RERUN HASHING_ALG = hashlib.sha3_256 From f2bf6a9d396b50165178ccd0ce639620a9b7d006 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Sat, 20 Jun 2020 12:01:54 +0800 Subject: [PATCH 058/484] node_manager now logs reproducibility events in debug. --- daliuge-runtime/dlg/manager/node_manager.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index 542589b3f..b36e7255f 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -66,6 +66,8 @@ def handleEvent(self, event): logger.debug('Drop uid=%s, oid=%s changed to state %s', event.uid, event.oid, event.status) elif event.type == 'execStatus': logger.debug('AppDrop uid=%s, oid=%s changed to execState %s', event.uid, event.oid, event.execStatus) + elif event.type == 'reproducibility': + logger.debug('Reproducibility event Drop uid=%s, oid=%s merkleroot=%s', event.uid, event.oid, event.reprodata['merkleroot']) class ErrorStatusListener(object): @@ -235,11 +237,13 @@ def foreach(drop): drop.subscribe(evt_listener, 'producerFinished') else: drop.subscribe(evt_listener, 'dropCompleted') + drop.subscribe(evt_listener, 'reproducibility') # Purely for logging purposes log_evt_listener = self._logging_event_listener if log_evt_listener: drop.subscribe(log_evt_listener, 'status') + drop.subscribe(log_evt_listener, 'reproducibility') if isinstance(drop, AppDROP): drop.subscribe(log_evt_listener, 'execStatus') From d1488649de117d6157e0275cb95e2842b10a69b7 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 22 Jun 2020 12:53:33 +0800 Subject: [PATCH 059/484] Amusing typo fixing in comments --- daliuge-runtime/dlg/drop.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 019aca9d9..b99028ece 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -235,8 +235,8 @@ def __init__(self, oid, uid, **kwargs): self._checksumType = None self._size = None - # Recording runtime repropduciblity information is handled via MerkleTrees - # Switching on the reproduciblity level will determine what information is recorded. + # Recording runtime reproducibility information is handled via MerkleTrees + # Switching on the reproducibility level will determine what information is recorded. self._committed = False self._merkleRoot = None self._merkleTree = None From 9576f9a335153a47a44dd60f9676715b371663a0 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 22 Jun 2020 13:21:59 +0800 Subject: [PATCH 060/484] reproducibility_level setter is now more forgiving. --- daliuge-runtime/dlg/drop.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index b99028ece..50bda016d 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -611,6 +611,10 @@ def reproducibility_level(self): @reproducibility_level.setter def reproducibility_level(self, new_flag): + if type(new_flag) == str: + new_flag = ReproduciblityFlags(int(new_flag)) + elif type(new_flag) == int: + new_flag = ReproduciblityFlags(new_flag) if type(new_flag) != ReproduciblityFlags: raise TypeError("new_flag must be a Reproduciblity flag enum.") elif rmode_supported(new_flag): From 4fa747b9c3a783257a74c5ebae8801de2f37c36a Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 22 Jun 2020 13:23:17 +0800 Subject: [PATCH 061/484] Changes default rmode to NOTHING (again). --- daliuge-common/dlg/common/reproducibility/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 5b780bb50..f089e5fef 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -14,7 +14,7 @@ class ReproduciblityFlags(Enum): EXPERIMENTAL = 6 -REPRO_DEFAULT = ReproduciblityFlags.RERUN +REPRO_DEFAULT = ReproduciblityFlags.NOTHING HASHING_ALG = hashlib.sha3_256 From 4dd1aedf1d2be05f328905d47050aae784a39bcf Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 22 Jun 2020 13:24:56 +0800 Subject: [PATCH 062/484] Rmode now propages from graph description to actual instantiated DROPS! --- daliuge-runtime/dlg/deploy/common.py | 2 +- daliuge-runtime/dlg/graph_loader.py | 18 +++++++++++++----- daliuge-runtime/dlg/manager/session.py | 12 ++++++++++-- .../dlg/translator/tool_commands.py | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/daliuge-runtime/dlg/deploy/common.py b/daliuge-runtime/dlg/deploy/common.py index 7d9fcbe86..7e13b1603 100644 --- a/daliuge-runtime/dlg/deploy/common.py +++ b/daliuge-runtime/dlg/deploy/common.py @@ -126,7 +126,7 @@ def submit(pg, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, """ client = _get_client(host, port, timeout) session_id = session_id or "%f" % (time.time()) - completed_uids = droputils.get_roots(pg) + completed_uids = droputils.get_roots(pg[:-1]) with client: client.create_session(session_id) logger.info("Session %s created", session_id) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index ae511cf2a..363198577 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -175,10 +175,16 @@ def loadDropSpecs(dropSpecList): all DROP specifications (i.e., a dictionary of dictionaries) keyed on the OID of each DROP. Unlike `readObjectGraph` and `readObjectGraphS`, this method doesn't actually create the DROPs themselves. + + Slices off graph-wise reproducibility data for later use """ # Step #1: Check the DROP specs and collect them dropSpecs = {} + reprodata = None + if dropSpecList[-1]['merkleroot'] is not None: + reprodata = dropSpecList.pop() + logger.debug("Found reprodata in dropSpecList, rmode=%s", reprodata['rmode']) for n, dropSpec in enumerate(dropSpecList): # 'type' and 'oit' are mandatory check_dropspec(n, dropSpec) @@ -207,7 +213,7 @@ def loadDropSpecs(dropSpecList): dropSpecs[dropSpec[rel]] # Done! - return dropSpecs + return dropSpecs, reprodata def createGraphFromDropSpecList(dropSpecList, session=None): @@ -222,6 +228,8 @@ def createGraphFromDropSpecList(dropSpecList, session=None): cf = __CREATION_FUNCTIONS[dropType] drop = cf(dropSpec, session=session) + if session is not None: + drop.reproducibility_level = session.reprodata['rmode'] drops[drop.oid] = drop # Step #2: establish relationships @@ -264,7 +272,7 @@ def createGraphFromDropSpecList(dropSpecList, session=None): return roots -def _createPlain(dropSpec, dryRun=False, session=None): +def _createPlain(dropSpec, dryRun=False, session=None, rmode=0): oid, uid = _getIds(dropSpec) kwargs = _getKwargs(dropSpec) @@ -275,7 +283,7 @@ def _createPlain(dropSpec, dryRun=False, session=None): return storageType(oid, uid, dlg_session=session, **kwargs) -def _createContainer(dropSpec, dryRun=False, session=None): +def _createContainer(dropSpec, dryRun=False, session=None, rmode=0): oid, uid = _getIds(dropSpec) kwargs = _getKwargs(dropSpec) @@ -299,7 +307,7 @@ def _createContainer(dropSpec, dryRun=False, session=None): return containerType(oid, uid, dlg_session=session, **kwargs) -def _createSocket(dropSpec, dryRun=False, session=None): +def _createSocket(dropSpec, dryRun=False, session=None, rmode=0): oid, uid = _getIds(dropSpec) kwargs = _getKwargs(dropSpec) @@ -308,7 +316,7 @@ def _createSocket(dropSpec, dryRun=False, session=None): return SocketListenerApp(oid, uid, dlg_session=session, **kwargs) -def _createApp(dropSpec, dryRun=False, session=None): +def _createApp(dropSpec, dryRun=False, session=None, rmode=0): oid, uid = _getIds(dropSpec) kwargs = _getKwargs(dropSpec) del kwargs['app'] diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index bd381aa8c..8ed306c41 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -99,6 +99,7 @@ def __init__(self, sessionId, nm=None): self._error_status_listener = None self._nm = nm self._dropsubs = {} + self._reprodata = None @property def sessionId(self): @@ -122,6 +123,10 @@ def roots(self): def drops(self): return self._drops + @property + def reprodata(self): + return self._reprodata + @track_current_session def addGraphSpec(self, graphSpec): """ @@ -131,7 +136,10 @@ def addGraphSpec(self, graphSpec): DROP. Each DROP specification is checked to see it contains all the necessary details to construct a proper DROP. If one DROP specification is found to be inconsistent the whole operation - fill wail. + will fail. + + This operation also 'slices off' a dictionary containing graph-wide + reproducibility information. This is stored as a class variable for later use. Adding graph specs to the session is only allowed while the session is in the PRISTINE or BUILDING status; otherwise an exception will be @@ -150,7 +158,7 @@ def addGraphSpec(self, graphSpec): self.status = SessionStates.BUILDING # This will check the consistency of each dropSpec - graphSpecDict = graph_loader.loadDropSpecs(graphSpec) + graphSpecDict, self._reprodata = graph_loader.loadDropSpecs(graphSpec) # Check for duplicates duplicates = set(graphSpecDict) & set(self._graph) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 96cf76f55..c66572292 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -298,7 +298,7 @@ def dlg_submit(parser, args): with _open_i(opts.pg_path) as f: pg = json.load(f) - repro = pg.pop() # TODO: Re-integrate + repro = pg[-1] submit(pg, opts) pg.append(repro) From a2f949573b6421694baa492ec404b571d030af8a Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 22 Jun 2020 14:58:14 +0800 Subject: [PATCH 063/484] renames _reprodata to _graphreprodata --- daliuge-runtime/dlg/manager/session.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index 8ed306c41..3c936e690 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -99,7 +99,7 @@ def __init__(self, sessionId, nm=None): self._error_status_listener = None self._nm = nm self._dropsubs = {} - self._reprodata = None + self._graphreprodata = None @property def sessionId(self): @@ -125,7 +125,7 @@ def drops(self): @property def reprodata(self): - return self._reprodata + return self._graphreprodata @track_current_session def addGraphSpec(self, graphSpec): @@ -158,7 +158,7 @@ def addGraphSpec(self, graphSpec): self.status = SessionStates.BUILDING # This will check the consistency of each dropSpec - graphSpecDict, self._reprodata = graph_loader.loadDropSpecs(graphSpec) + graphSpecDict, self._graphreprodata = graph_loader.loadDropSpecs(graphSpec) # Check for duplicates duplicates = set(graphSpecDict) & set(self._graph) From 66788b36e02c392a73b253d41518488176bf1482 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 22 Jun 2020 18:06:06 +0800 Subject: [PATCH 064/484] Session now waits for reproducibility data before building the entire blockdag. A new listener was created for this. The node_manager creates and appends all drops to this listener --- .../common/reproducibility/reproducibility.py | 5 ++++ daliuge-runtime/dlg/manager/node_manager.py | 4 ++- daliuge-runtime/dlg/manager/session.py | 27 ++++++++++++++++++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 69d7a7670..5f95e672f 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -441,3 +441,8 @@ def init_pg_repro_data(pg: list): pg.append(reprodata) logger.info("Reproducibility data finished at PG level") return pg + + +def init_runtime_repro_data(pg: dict, reprodata: dict): + for drop in pg.values(): + print(drop['reprodata']['pg_data']) diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index b36e7255f..8dfe8aa13 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -201,6 +201,9 @@ def createSession(self, sessionId): self._sessions[sessionId] = Session(sessionId, nm=self) logger.info('Created session %s', sessionId) + def getsession(self, sessionId): + return self._sessions[sessionId] + def getSessionStatus(self, sessionId): self._check_session_id(sessionId) return self._sessions[sessionId].status @@ -237,7 +240,6 @@ def foreach(drop): drop.subscribe(evt_listener, 'producerFinished') else: drop.subscribe(evt_listener, 'dropCompleted') - drop.subscribe(evt_listener, 'reproducibility') # Purely for logging purposes log_evt_listener = self._logging_event_listener diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index 3c936e690..7a8382de7 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -38,6 +38,7 @@ LINKTYPE_1TON_APPEND_METHOD, LINKTYPE_1TON_BACK_APPEND_METHOD from ..exceptions import InvalidSessionState, InvalidGraphException, \ NoDropException, DaliugeException +from dlg.common.reproducibility.reproducibility import init_runtime_repro_data logger = logging.getLogger(__name__) @@ -66,6 +67,21 @@ def handleEvent(self, evt): self._session.finish() +class ReproFinishedListener(object): + def __init__(self, graph, session): + self._session = session + self._nexpected = len(graph) + self._completed = 0 + + def handleEvent(self, evt): + self._completed += 1 + self._session.append_reprodata(evt.oid, evt.reprodata) + logger.debug("%d/%d drops filed reproducibility", self._completed, self._nexpected) + if self._completed == self._nexpected: + logger.debug("Building Reproducibility BlockDAG") + init_runtime_repro_data(self._session._graph, self._session._graphreprodata) + + track_current_session = utils.object_tracking('session') @@ -230,6 +246,9 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): self._roots = graph_loader.createGraphFromDropSpecList(self._graph.values(), session=self) logger.info("%d drops successfully created", len(self._graph)) + # Add listeners for reproducibility information + repro_listener = ReproFinishedListener(self._graph, self) + for drop, _ in droputils.breadFirstTraverse(self._roots): # Register them @@ -244,6 +263,8 @@ def deploy(self, completedDrops=[], event_listeners=[], foreach=None): # Register them with the error handler for l in event_listeners: drop.subscribe(l) + # Register each drop for reproducibility listening + drop.subscribe(repro_listener, 'reproducibility') logger.info("Stored all drops, proceeding with further customization") @@ -305,7 +326,7 @@ def deliver_event(self, evt): Called when an event has been fired by a remote drop. The event is then delivered to the interested drops of this session. """ - if not evt.uid in self._dropsubs: + if evt.uid not in self._dropsubs: logger.debug("No subscription found for drop %s", evt.uid) return for tgt in self._dropsubs[evt.uid]: @@ -361,6 +382,10 @@ def add_node_subscriptions(self, relationships): self._proxyinfo.append((host, rpc_port, local_uid, mname, remote_uid)) + def append_reprodata(self, oid, reprodata): + if oid in self._graph: + self._graph[oid]['reprodata']['pg_data'] = reprodata + @track_current_session def finish(self): self.status = SessionStates.FINISHED From a246562a1764937c65f15ab51276cde096830f89 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 22 Jun 2020 21:27:22 +0800 Subject: [PATCH 065/484] Renames appended runtime data and merkleroot accordingly --- daliuge-runtime/dlg/manager/session.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index 7a8382de7..fdd6bba39 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -28,6 +28,8 @@ import logging import threading +from dlg.common.reproducibility.reproducibility import init_runtime_repro_data + from . import constants from .. import droputils from .. import graph_loader @@ -38,7 +40,6 @@ LINKTYPE_1TON_APPEND_METHOD, LINKTYPE_1TON_BACK_APPEND_METHOD from ..exceptions import InvalidSessionState, InvalidGraphException, \ NoDropException, DaliugeException -from dlg.common.reproducibility.reproducibility import init_runtime_repro_data logger = logging.getLogger(__name__) @@ -384,7 +385,8 @@ def add_node_subscriptions(self, relationships): def append_reprodata(self, oid, reprodata): if oid in self._graph: - self._graph[oid]['reprodata']['pg_data'] = reprodata + self._graph[oid]['reprodata']['pg_data']['run_data'] = reprodata['data'] + self._graph[oid]['reprodata']['pg_data']['run_merkleroot'] = reprodata['merkleroot'] @track_current_session def finish(self): From c6284c14c0627c0aa94459d5f6b7ef5a520acd4c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 22 Jun 2020 21:27:48 +0800 Subject: [PATCH 066/484] Runtime reproducibility data and PG data are merged and hashed together. --- .../common/reproducibility/reproducibility.py | 52 +++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 5f95e672f..972835bbe 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -1,7 +1,8 @@ +import logging + from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ rmode_supported from merklelib import MerkleTree -import logging logger = logging.getLogger(__name__) @@ -203,9 +204,33 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): return drop +def init_runtime_repro_drop_data(drop: dict, level: ReproduciblityFlags): + """ + Merges runtime and PG graph data on a per-drop basis. + :param drop: + :param level: + :return: + """ + pg_data = accumulate_pg_drop_data(drop, level) + merkledata = [] + for key, value in pg_data.items(): + temp = [key, value] + merkledata.append(temp) + merkledata.append(drop['reprodata']['pg_data']['run_merkleroot']) + merkletree = MerkleTree(merkledata, common_hash) + pg_data['run_data'] = drop['reprodata']['pg_data']['run_data'].copy() + pg_data['run_merkleroot'] = drop['reprodata']['pg_data']['run_merkleroot'] + pg_data['merkleroot'] = merkletree.merkle_root + drop['reprodata']['pg_data'] = pg_data + return drop + + # ------ Graph-Wide Functionality ------ def accumulate_meta_data(): + """ + WARNING: Relies on naming convention in hashlib. + """ data = {'repro_protocol': PROTOCOL_VERSION, 'hashing_alg': str(HASHING_ALG)[8:-2]} return data @@ -341,6 +366,11 @@ def pg_build_blockdag(drops: list): pass +def runtime_build_blockdag(drops: dict): + pass + # logger.debug("Runtime BlockDAG currently not implemented") + + def init_lgt_repro_data(lgt: dict, rmode: str): """ Creates and appends graph-wide reproducibility data at the logical template stage. @@ -444,5 +474,21 @@ def init_pg_repro_data(pg: list): def init_runtime_repro_data(pg: dict, reprodata: dict): - for drop in pg.values(): - print(drop['reprodata']['pg_data']) + """ + Adds reproducibility data at the runtime level to graph-wide values. + :param pg: + :param reprodata: + :return: + """ + rmode = ReproduciblityFlags(int(reprodata["rmode"])) + if not rmode_supported(rmode): + # TODO: Logging needs sessionID at this stage + # logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) + rmode = REPRO_DEFAULT + reprodata["rmode"] = str(rmode.value) + for drop in pg.items(): + init_runtime_repro_drop_data(drop[1], rmode) + runtime_build_blockdag(pg) + pg['reprodata'] = reprodata + # logger.info("Reproducibility data finished at runtime level") + return pg From 94f603dcbf64bfdfd93aa7dbbc4e286c5e297eef Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 22 Jun 2020 21:36:08 +0800 Subject: [PATCH 067/484] Blockdata is now generated at the PG level. --- .../common/reproducibility/reproducibility.py | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 972835bbe..9f0cdc4ce 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -255,7 +255,13 @@ def build_pgt_block_data(drop: dict): def build_pg_block_data(drop: dict): - pass + block_data = [drop['reprodata']['pg_data']['merkleroot'], + drop['reprodata']['pgt_blockhash'], + drop['reprodata']['lg_blockhash']] + for parenthash in sorted(drop['reprodata']['pg_parenthashes']): + block_data.append(parenthash) + mtree = MerkleTree(block_data, common_hash) + drop['reprodata']['pg_blockhash'] = mtree.merkle_root def lg_build_blockdag(lg: dict): @@ -362,8 +368,56 @@ def pgt_build_blockdag(drops: list): def pg_build_blockdag(drops: list): - logger.debug("PG BlockDAG currently not implemented") - pass + """ + Uses Kahn's algorithm to topologically sort a list of physical graph template nodes + Exploits that a DAG contains at least one node with in-degree 0. + Processes drops in-order. + O(V + E) time complexity. + :param drops: The list of drops + :return: + """ + # Check if pg-blockhash is none + from collections import deque + dropset = {} + neighbourset = {} + visited = 0 + q = deque() + + for drop in drops: + did = drop['oid'] + dropset[did] = [drop, 0] # To guarantee all nodes have entries + for drop in drops: + did = drop['oid'] + neighbourset[did] = [] + if 'outputs' in drop: + for dest in drop['outputs']: + dropset[dest][1] += 1 + neighbourset[did].append(dest) + if 'consumers' in drop: # There may be some bizarre scenario when a drop has both + for dest in drop['consumers']: + dropset[dest][1] += 1 + neighbourset[did].append(dest) + + for did in dropset: + if dropset[did][1] == 0: + q.append(did) + + while q: + did = q.pop() + build_pg_block_data(dropset[did][0]) + visited += 1 + for n in neighbourset[did]: + dropset[n][1] -= 1 + # Add our new hash to the parest-hash list + parenthash = dropset[did][0]['reprodata']['pg_blockhash'] + dropset[n][0]['reprodata']['pg_parenthashes'].append(parenthash) + if dropset[n][1] == 0: + q.append(n) + + if visited != len(dropset): + raise Exception("Not a DAG") + + logger.info("BlockDAG Generated at PG level") def runtime_build_blockdag(drops: dict): From 5cbcec628bee150597c0d644eecd0a0180cdabff Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 22 Jun 2020 22:22:19 +0800 Subject: [PATCH 068/484] Reproducibilty information is now calculated at all levels. Adds the first fully recorded DALiuGE run. --- .../dlg/common/reproducibility/reproducibility.py | 9 ++------- daliuge-runtime/dlg/manager/rest.py | 1 + 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 9f0cdc4ce..af86ae1b3 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -417,12 +417,7 @@ def pg_build_blockdag(drops: list): if visited != len(dropset): raise Exception("Not a DAG") - logger.info("BlockDAG Generated at PG level") - - -def runtime_build_blockdag(drops: dict): - pass - # logger.debug("Runtime BlockDAG currently not implemented") + # logger.info("BlockDAG Generated at PG level") def init_lgt_repro_data(lgt: dict, rmode: str): @@ -542,7 +537,7 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): reprodata["rmode"] = str(rmode.value) for drop in pg.items(): init_runtime_repro_drop_data(drop[1], rmode) - runtime_build_blockdag(pg) + pg_build_blockdag(list(pg.values())) pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") return pg diff --git a/daliuge-runtime/dlg/manager/rest.py b/daliuge-runtime/dlg/manager/rest.py index 0ad5fbbeb..46cfc0799 100644 --- a/daliuge-runtime/dlg/manager/rest.py +++ b/daliuge-runtime/dlg/manager/rest.py @@ -174,6 +174,7 @@ def getSessions(self): def getSessionInformation(self, sessionId): graphDict = self.dm.getGraph(sessionId) status = self.dm.getSessionStatus(sessionId) + logger.debug("%s", json.dumps(graphDict)) return {'status': status, 'graph': graphDict} @daliuge_aware From 70afa44e8bcd5f7f16f624975f9877924125fc32 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 24 Jun 2020 09:30:05 +0800 Subject: [PATCH 069/484] Adds rmode to each drop at lgt level --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index af86ae1b3..812bd16d4 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -124,7 +124,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): merkledata.append(temp) merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root - drop['reprodata'] = {'lgt_data': data, 'lg_parenthashes': []} + drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': []} return drop From 087ee7e83092ccee0402d44a3fe243c5ce3c540b Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 24 Jun 2020 09:52:57 +0800 Subject: [PATCH 070/484] Reproducibility data accumulations functions now rely on per-drop settings --- .../common/reproducibility/reproducibility.py | 90 +++++++++---------- 1 file changed, 42 insertions(+), 48 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 812bd16d4..fba0906de 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -55,16 +55,20 @@ def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): return {} -def accumulate_pgt_unroll_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_pgt_unroll_drop_data(drop: dict): """ Accumulates relevant reproducibility fields for a single drop at the physical template level. TODO: Implement alternative level functionality. :param drop: - :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - if level == ReproduciblityFlags.NOTHING: + rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) + rmode = REPRO_DEFAULT + drop['reprodata']["rmode"] = str(rmode.value) + if rmode == ReproduciblityFlags.NOTHING: return data data["type"] = drop["type"] data["rank"] = drop["rank"] @@ -76,35 +80,40 @@ def accumulate_pgt_unroll_drop_data(drop: dict, level: ReproduciblityFlags): return data -def accumulate_pgt_partition_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_pgt_partition_drop_data(drop: dict): """ Is as combination of unroll drop data :param drop: - :param level: :return: """ - data = {} - if level == ReproduciblityFlags.NOTHING: - return data - data = accumulate_pgt_unroll_drop_data(drop, level) + rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) + rmode = REPRO_DEFAULT + drop['reprodata']["rmode"] = str(rmode.value) + data = accumulate_pgt_unroll_drop_data(drop) # This is the only piece of new information added at the partition level # It is only pertinent to Repetition and Computational replication - if level == ReproduciblityFlags.REPEAT or level == ReproduciblityFlags.REPLICATE_COMP: + if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: data["node"] = drop["node"][1:] data["island"] = drop["island"][1:] return data -def accumulate_pg_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_pg_drop_data(drop: dict): """ Accumulate relevant reproducibility fields for a single drop at the physical graph level. TODO: Implement alternative level functionality. :param drop: - :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. """ + rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) + rmode = REPRO_DEFAULT + drop['reprodata']["rmode"] = str(rmode.value) data = {} - if level == ReproduciblityFlags.REPEAT or level == ReproduciblityFlags.REPLICATE_COMP: + if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: data['node'] = drop['node'] data['island'] = drop['island'] return data @@ -128,14 +137,18 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): return drop -def init_lg_repro_drop_data(drop: dict, level: ReproduciblityFlags): +def init_lg_repro_drop_data(drop: dict): """ Creates and appends per-drop reproducibility information at the logical graph stage. :param drop: - :param level: :return: The same drop with appended reproducibility information """ - data = accumulate_lg_drop_data(drop, level) + rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) + if not rmode_supported(rmode): + logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) + rmode = REPRO_DEFAULT + drop['reprodata']["rmode"] = str(rmode.value) + data = accumulate_lg_drop_data(drop, rmode) merkledata = [] for key, value in data.items(): temp = [key, value] @@ -160,38 +173,35 @@ def append_pgt_repro_data(drop: dict, data: dict): return drop -def init_pgt_unroll_repro_drop_data(drop: dict, level: ReproduciblityFlags): +def init_pgt_unroll_repro_drop_data(drop: dict): """ Creates and appends per-drop reproducibility information at the physical graph template stage when unrolling. :param drop: - :param level: :return: The same drop with appended reproducibility information """ - data = accumulate_pgt_unroll_drop_data(drop, level) + data = accumulate_pgt_unroll_drop_data(drop) append_pgt_repro_data(drop, data) return drop -def init_pgt_partition_repro_drop_data(drop: dict, level: ReproduciblityFlags): +def init_pgt_partition_repro_drop_data(drop: dict): """ Creates and appends per-drop reproducibility information at the physical graph template stage when partitioning. :param drop: - :param level: :return: The same drop with appended reproducibility information """ - data = accumulate_pgt_partition_drop_data(drop, level) + data = accumulate_pgt_partition_drop_data(drop) append_pgt_repro_data(drop, data) return drop -def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): +def init_pg_repro_drop_data(drop: dict): """ Creates and appends per-drop reproducibility information at the physical graph stage. :param drop: - :param level: :return: The same drop with appended reproducibility information """ - data = accumulate_pg_drop_data(drop, level) + data = accumulate_pg_drop_data(drop) merkledata = [] for key, value in data.items(): temp = [key, value] @@ -204,14 +214,13 @@ def init_pg_repro_drop_data(drop: dict, level: ReproduciblityFlags): return drop -def init_runtime_repro_drop_data(drop: dict, level: ReproduciblityFlags): +def init_runtime_repro_drop_data(drop: dict): """ Merges runtime and PG graph data on a per-drop basis. :param drop: - :param level: :return: """ - pg_data = accumulate_pg_drop_data(drop, level) + pg_data = accumulate_pg_drop_data(drop) merkledata = [] for key, value in pg_data.items(): temp = [key, value] @@ -450,13 +459,8 @@ def init_lg_repro_data(lg: dict): :param lg: The logical graph data structure (a JSON object (a dict)) :return: The same lgt object with new information appended """ - rmode = ReproduciblityFlags(int(lg['reprodata']['rmode'])) - if not rmode_supported(rmode): - logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) - rmode = REPRO_DEFAULT - lg['reprodata']["rmode"] = str(rmode.value) for drop in lg['nodeDataArray']: - init_lg_repro_drop_data(drop, rmode) + init_lg_repro_drop_data(drop) lg_build_blockdag(lg) logger.info("Reproducibility data finished at LG level") return lg @@ -469,13 +473,8 @@ def init_pgt_unroll_repro_data(pgt: list): :return: The same pgt object with new information appended """ reprodata = pgt.pop() - rmode = ReproduciblityFlags(int(reprodata["rmode"])) - if not rmode_supported(rmode): - logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) - rmode = REPRO_DEFAULT - reprodata["rmode"] = str(rmode.value) for drop in pgt: - init_pgt_unroll_repro_drop_data(drop, rmode) + init_pgt_unroll_repro_drop_data(drop) pgt_build_blockdag(pgt) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") @@ -489,13 +488,8 @@ def init_pgt_partition_repro_data(pgt: list): :return: The same pgt object with new information recorded """ reprodata = pgt.pop() - rmode = ReproduciblityFlags(int(reprodata["rmode"])) - if not rmode_supported(rmode): - logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) - rmode = REPRO_DEFAULT - reprodata["rmode"] = str(rmode.value) for drop in pgt: - init_pgt_partition_repro_drop_data(drop, rmode) + init_pgt_partition_repro_drop_data(drop) pgt_build_blockdag(pgt) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") @@ -515,7 +509,7 @@ def init_pg_repro_data(pg: list): rmode = REPRO_DEFAULT reprodata["rmode"] = str(rmode.value) for drop in pg: - init_pg_repro_drop_data(drop, rmode) + init_pg_repro_drop_data(drop) pg_build_blockdag(pg) pg.append(reprodata) logger.info("Reproducibility data finished at PG level") @@ -536,7 +530,7 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): rmode = REPRO_DEFAULT reprodata["rmode"] = str(rmode.value) for drop in pg.items(): - init_runtime_repro_drop_data(drop[1], rmode) + init_runtime_repro_drop_data(drop[1]) pg_build_blockdag(list(pg.values())) pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") From 9b2eaba64b5b22352af528557abc02585bef87f9 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 24 Jun 2020 09:58:44 +0800 Subject: [PATCH 071/484] DALiuGE now loads DROPs with reproducibility setting on a per-drop basis --- daliuge-runtime/dlg/graph_loader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index 363198577..f6e2d35f2 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -229,7 +229,8 @@ def createGraphFromDropSpecList(dropSpecList, session=None): cf = __CREATION_FUNCTIONS[dropType] drop = cf(dropSpec, session=session) if session is not None: - drop.reproducibility_level = session.reprodata['rmode'] + # Now using per-drop reproducibility setting. + drop.reproducibility_level = dropSpec['reprodata']['rmode'] # session.reprodata['rmode'] drops[drop.oid] = drop # Step #2: establish relationships From 56037ca86c106217e609ed5bf9e90568afddf15f Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 25 Jun 2020 14:54:37 +0800 Subject: [PATCH 072/484] Combines topological sort code for pgt and pg operations. --- .../common/reproducibility/reproducibility.py | 86 ++++--------------- 1 file changed, 16 insertions(+), 70 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index fba0906de..80f5ffcbf 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -323,69 +323,15 @@ def lg_build_blockdag(lg: dict): logger.info("BlockDAG Generated at LG/T level") -def pgt_build_blockdag(drops: list): - """ - Uses Kahn's algorithm to topologically sort a list of physical graph template nodes - Exploits that a DAG contains at least one node with in-degree 0. - Processes drops in-order. - O(V + E) time complexity. - :param drops: The list of drops - :return: - """ - # Check if pg-blockhash is none - from collections import deque - dropset = {} - neighbourset = {} - visited = 0 - q = deque() - - for drop in drops: - did = drop['oid'] - dropset[did] = [drop, 0] # To guarantee all nodes have entries - for drop in drops: - did = drop['oid'] - neighbourset[did] = [] - if 'outputs' in drop: - for dest in drop['outputs']: - dropset[dest][1] += 1 - neighbourset[did].append(dest) - if 'consumers' in drop: # There may be some bizarre scenario when a drop has both - for dest in drop['consumers']: - dropset[dest][1] += 1 - neighbourset[did].append(dest) +def build_blockdag(drops: list, abstraction: str = 'pgt'): + blockstr = 'pgt' + parentstr = 'pgt_parenthashes' + block_builder = build_pgt_block_data + if abstraction == "pg": + blockstr = 'pg' + parentstr = 'pg_parenthashes' + block_builder = build_pg_block_data - for did in dropset: - if dropset[did][1] == 0: - q.append(did) - - while q: - did = q.pop() - build_pgt_block_data(dropset[did][0]) - visited += 1 - for n in neighbourset[did]: - dropset[n][1] -= 1 - # Add our new hash to the parest-hash list - parenthash = dropset[did][0]['reprodata']['pgt_blockhash'] - dropset[n][0]['reprodata']['pgt_parenthashes'].append(parenthash) - if dropset[n][1] == 0: - q.append(n) - - if visited != len(dropset): - raise Exception("Not a DAG") - - logger.info("BlockDAG Generated at PGT level") - - -def pg_build_blockdag(drops: list): - """ - Uses Kahn's algorithm to topologically sort a list of physical graph template nodes - Exploits that a DAG contains at least one node with in-degree 0. - Processes drops in-order. - O(V + E) time complexity. - :param drops: The list of drops - :return: - """ - # Check if pg-blockhash is none from collections import deque dropset = {} neighbourset = {} @@ -413,20 +359,20 @@ def pg_build_blockdag(drops: list): while q: did = q.pop() - build_pg_block_data(dropset[did][0]) + block_builder(dropset[did][0]) visited += 1 for n in neighbourset[did]: dropset[n][1] -= 1 # Add our new hash to the parest-hash list - parenthash = dropset[did][0]['reprodata']['pg_blockhash'] - dropset[n][0]['reprodata']['pg_parenthashes'].append(parenthash) + parenthash = dropset[did][0]['reprodata'][blockstr] + dropset[n][0]['reprodata'][parentstr].append(parenthash) if dropset[n][1] == 0: q.append(n) if visited != len(dropset): raise Exception("Not a DAG") - # logger.info("BlockDAG Generated at PG level") + # logger.info("BlockDAG Generated at" + abstraction + " level") def init_lgt_repro_data(lgt: dict, rmode: str): @@ -475,7 +421,7 @@ def init_pgt_unroll_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_unroll_repro_drop_data(drop) - pgt_build_blockdag(pgt) + build_blockdag(pgt, 'pgt') pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") return pgt @@ -490,7 +436,7 @@ def init_pgt_partition_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_partition_repro_drop_data(drop) - pgt_build_blockdag(pgt) + build_blockdag(pgt, 'pgt') pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") return pgt @@ -510,7 +456,7 @@ def init_pg_repro_data(pg: list): reprodata["rmode"] = str(rmode.value) for drop in pg: init_pg_repro_drop_data(drop) - pg_build_blockdag(pg) + build_blockdag(pg, 'pg') pg.append(reprodata) logger.info("Reproducibility data finished at PG level") return pg @@ -531,7 +477,7 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): reprodata["rmode"] = str(rmode.value) for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) - pg_build_blockdag(list(pg.values())) + build_blockdag(list(pg.values()), 'pg') pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") return pg From 8a933635a6fc085dbb159cb08eb9a80c6cfce344 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 25 Jun 2020 14:54:37 +0800 Subject: [PATCH 073/484] Combines topological sort code for pgt and pg operations. --- .../common/reproducibility/reproducibility.py | 81 +++++-------------- 1 file changed, 18 insertions(+), 63 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index fba0906de..16e38ae4a 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -323,69 +323,24 @@ def lg_build_blockdag(lg: dict): logger.info("BlockDAG Generated at LG/T level") -def pgt_build_blockdag(drops: list): +def build_blockdag(drops: list, abstraction: str = 'pgt'): """ - Uses Kahn's algorithm to topologically sort a list of physical graph template nodes + Uses Kahn's algorithm to topologically sort a logical graph dictionary. Exploits that a DAG contains at least one node with in-degree 0. Processes drops in-order. O(V + E) time complexity. :param drops: The list of drops + :param abstraction: The level of graph abstraction 'pgt' || 'pg' :return: """ - # Check if pg-blockhash is none - from collections import deque - dropset = {} - neighbourset = {} - visited = 0 - q = deque() - - for drop in drops: - did = drop['oid'] - dropset[did] = [drop, 0] # To guarantee all nodes have entries - for drop in drops: - did = drop['oid'] - neighbourset[did] = [] - if 'outputs' in drop: - for dest in drop['outputs']: - dropset[dest][1] += 1 - neighbourset[did].append(dest) - if 'consumers' in drop: # There may be some bizarre scenario when a drop has both - for dest in drop['consumers']: - dropset[dest][1] += 1 - neighbourset[did].append(dest) - - for did in dropset: - if dropset[did][1] == 0: - q.append(did) - - while q: - did = q.pop() - build_pgt_block_data(dropset[did][0]) - visited += 1 - for n in neighbourset[did]: - dropset[n][1] -= 1 - # Add our new hash to the parest-hash list - parenthash = dropset[did][0]['reprodata']['pgt_blockhash'] - dropset[n][0]['reprodata']['pgt_parenthashes'].append(parenthash) - if dropset[n][1] == 0: - q.append(n) + blockstr = 'pgt' + parentstr = 'pgt_parenthashes' + block_builder = build_pgt_block_data + if abstraction == "pg": + blockstr = 'pg' + parentstr = 'pg_parenthashes' + block_builder = build_pg_block_data - if visited != len(dropset): - raise Exception("Not a DAG") - - logger.info("BlockDAG Generated at PGT level") - - -def pg_build_blockdag(drops: list): - """ - Uses Kahn's algorithm to topologically sort a list of physical graph template nodes - Exploits that a DAG contains at least one node with in-degree 0. - Processes drops in-order. - O(V + E) time complexity. - :param drops: The list of drops - :return: - """ - # Check if pg-blockhash is none from collections import deque dropset = {} neighbourset = {} @@ -413,20 +368,20 @@ def pg_build_blockdag(drops: list): while q: did = q.pop() - build_pg_block_data(dropset[did][0]) + block_builder(dropset[did][0]) visited += 1 for n in neighbourset[did]: dropset[n][1] -= 1 # Add our new hash to the parest-hash list - parenthash = dropset[did][0]['reprodata']['pg_blockhash'] - dropset[n][0]['reprodata']['pg_parenthashes'].append(parenthash) + parenthash = dropset[did][0]['reprodata'][blockstr] + dropset[n][0]['reprodata'][parentstr].append(parenthash) if dropset[n][1] == 0: q.append(n) if visited != len(dropset): raise Exception("Not a DAG") - # logger.info("BlockDAG Generated at PG level") + # logger.info("BlockDAG Generated at" + abstraction + " level") def init_lgt_repro_data(lgt: dict, rmode: str): @@ -475,7 +430,7 @@ def init_pgt_unroll_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_unroll_repro_drop_data(drop) - pgt_build_blockdag(pgt) + build_blockdag(pgt, 'pgt') pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") return pgt @@ -490,7 +445,7 @@ def init_pgt_partition_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_partition_repro_drop_data(drop) - pgt_build_blockdag(pgt) + build_blockdag(pgt, 'pgt') pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") return pgt @@ -510,7 +465,7 @@ def init_pg_repro_data(pg: list): reprodata["rmode"] = str(rmode.value) for drop in pg: init_pg_repro_drop_data(drop) - pg_build_blockdag(pg) + build_blockdag(pg, 'pg') pg.append(reprodata) logger.info("Reproducibility data finished at PG level") return pg @@ -531,7 +486,7 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): reprodata["rmode"] = str(rmode.value) for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) - pg_build_blockdag(list(pg.values())) + build_blockdag(list(pg.values()), 'pg') pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") return pg From 9e48de72660cc04c72e907c014ecf949eb4084aa Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 13:12:48 +0800 Subject: [PATCH 074/484] Adds abstract reproducibilty methods to NM base class --- daliuge-runtime/dlg/manager/drop_manager.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/daliuge-runtime/dlg/manager/drop_manager.py b/daliuge-runtime/dlg/manager/drop_manager.py index d3148c164..5782f8118 100644 --- a/daliuge-runtime/dlg/manager/drop_manager.py +++ b/daliuge-runtime/dlg/manager/drop_manager.py @@ -68,6 +68,13 @@ def getSessionStatus(self, sessionId): Returns the status of the session `sessionId`. """ + @abc.abstractmethod + def getSessionReproStatus(self, sessionId): + """ + Returns the reproducibility status of the session 'sessionId'. + Not guaranteed to be idenitcal to the usual SessionStatus. + """ + @abc.abstractmethod def addGraphSpec(self, sessionId, graphSpec): """ @@ -82,6 +89,12 @@ def getGraphStatus(self, sessionId): Returns the status of the graph being executed in session `sessionId`. """ + @abc.abstractmethod + def getGraphReproStatus(self, sessionId): + """ + Returns the reproducibility status of the graph being executed in session 'sessionId'. + """ + @abc.abstractmethod def getGraph(self, sessionId): """ From a6c79373d630d548f050009b2963fe5e601398dc Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 13:18:19 +0800 Subject: [PATCH 075/484] Adds dummy reproducibilty methods to NM class. --- daliuge-runtime/dlg/manager/node_manager.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index 8dfe8aa13..bbf8e7cff 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -208,6 +208,9 @@ def getSessionStatus(self, sessionId): self._check_session_id(sessionId) return self._sessions[sessionId].status + def getSessionReproStatus(self, sessionId): + pass + def linkGraphParts(self, sessionId, lhOID, rhOID, linkType): self._check_session_id(sessionId) self._sessions[sessionId].linkGraphParts(lhOID, rhOID, linkType) @@ -220,8 +223,12 @@ def getGraphStatus(self, sessionId): self._check_session_id(sessionId) return self._sessions[sessionId].getGraphStatus() + def getGraphReproStatus(self, sessionId): + pass + def getGraph(self, sessionId): self._check_session_id(sessionId) + # TODO: Ensure returns reproducibility data. return self._sessions[sessionId].getGraph() def deploySession(self, sessionId, completedDrops=[]): From 57be4eb309958eaad906603f2afe1dc879af4761 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 13:33:13 +0800 Subject: [PATCH 076/484] Removes getGraphReproStatus Implements getSessionReproStatus in NM and session --- daliuge-runtime/dlg/manager/drop_manager.py | 7 +------ daliuge-runtime/dlg/manager/node_manager.py | 2 +- daliuge-runtime/dlg/manager/session.py | 11 +++++++++++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/daliuge-runtime/dlg/manager/drop_manager.py b/daliuge-runtime/dlg/manager/drop_manager.py index 5782f8118..540e72330 100644 --- a/daliuge-runtime/dlg/manager/drop_manager.py +++ b/daliuge-runtime/dlg/manager/drop_manager.py @@ -71,7 +71,7 @@ def getSessionStatus(self, sessionId): @abc.abstractmethod def getSessionReproStatus(self, sessionId): """ - Returns the reproducibility status of the session 'sessionId'. + Returns the reproducibility status of the session `sessionId`. Not guaranteed to be idenitcal to the usual SessionStatus. """ @@ -89,11 +89,6 @@ def getGraphStatus(self, sessionId): Returns the status of the graph being executed in session `sessionId`. """ - @abc.abstractmethod - def getGraphReproStatus(self, sessionId): - """ - Returns the reproducibility status of the graph being executed in session 'sessionId'. - """ @abc.abstractmethod def getGraph(self, sessionId): diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index bbf8e7cff..d0b424f05 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -209,7 +209,7 @@ def getSessionStatus(self, sessionId): return self._sessions[sessionId].status def getSessionReproStatus(self, sessionId): - pass + return self._sessions[sessionId].reprostatus def linkGraphParts(self, sessionId, lhOID, rhOID, linkType): self._check_session_id(sessionId) diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index fdd6bba39..72310a061 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -81,6 +81,7 @@ def handleEvent(self, evt): if self._completed == self._nexpected: logger.debug("Building Reproducibility BlockDAG") init_runtime_repro_data(self._session._graph, self._session._graphreprodata) + self._session.reprostatus = True track_current_session = utils.object_tracking('session') @@ -117,6 +118,7 @@ def __init__(self, sessionId, nm=None): self._nm = nm self._dropsubs = {} self._graphreprodata = None + self._reprofinished = False @property def sessionId(self): @@ -144,6 +146,15 @@ def drops(self): def reprodata(self): return self._graphreprodata + @property + def reprostatus(self): + return self._reprofinished + + @reprostatus.setter + def reprostatus(self, status): + with self._statusLock: # TODO: Consider creating another lock + self._reprofinished = status + @track_current_session def addGraphSpec(self, graphSpec): """ From e3bc4ce94287f4381a4360738e8ad72e48c77f48 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 15:50:48 +0800 Subject: [PATCH 077/484] Fixes typo in docstring --- daliuge-runtime/dlg/manager/drop_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/manager/drop_manager.py b/daliuge-runtime/dlg/manager/drop_manager.py index 540e72330..4a6def070 100644 --- a/daliuge-runtime/dlg/manager/drop_manager.py +++ b/daliuge-runtime/dlg/manager/drop_manager.py @@ -72,7 +72,7 @@ def getSessionStatus(self, sessionId): def getSessionReproStatus(self, sessionId): """ Returns the reproducibility status of the session `sessionId`. - Not guaranteed to be idenitcal to the usual SessionStatus. + Not guaranteed to be identical to the usual SessionStatus. """ @abc.abstractmethod From 89ba7a4c91e61a3f7493c6b1df9da9c255f38532 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 15:52:10 +0800 Subject: [PATCH 078/484] Adds getGraphReproData --- daliuge-runtime/dlg/manager/drop_manager.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/daliuge-runtime/dlg/manager/drop_manager.py b/daliuge-runtime/dlg/manager/drop_manager.py index 4a6def070..6b62216df 100644 --- a/daliuge-runtime/dlg/manager/drop_manager.py +++ b/daliuge-runtime/dlg/manager/drop_manager.py @@ -97,6 +97,12 @@ def getGraph(self, sessionId): `sessionId`. """ + @abc.abstractmethod + def getGraphReproData(self, sessionId): + """ + Returns the graph-wide reproducibility data for session `sessionId` + """ + @abc.abstractmethod def deploySession(self, sessionId, completedDrops=[]): """ From ad552eab56ec007b4e79b35969e4efa1756e98ea Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 16:16:04 +0800 Subject: [PATCH 079/484] Adds getGraphReproData --- daliuge-runtime/dlg/manager/node_manager.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index d0b424f05..ca334969c 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -223,14 +223,15 @@ def getGraphStatus(self, sessionId): self._check_session_id(sessionId) return self._sessions[sessionId].getGraphStatus() - def getGraphReproStatus(self, sessionId): - pass - def getGraph(self, sessionId): self._check_session_id(sessionId) # TODO: Ensure returns reproducibility data. return self._sessions[sessionId].getGraph() + def getGraphReproData(self, sessionId): + # TODO make graph reprodata accessible + return self._sessions[sessionId]._graphreprodata + def deploySession(self, sessionId, completedDrops=[]): self._check_session_id(sessionId) session = self._sessions[sessionId] From 9e60c0faa696422a84a1822cb9b822c25ee446d6 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 16:16:25 +0800 Subject: [PATCH 080/484] Adds two rest API calls for reprodata access --- daliuge-runtime/dlg/manager/rest.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/daliuge-runtime/dlg/manager/rest.py b/daliuge-runtime/dlg/manager/rest.py index 46cfc0799..f8ec164aa 100644 --- a/daliuge-runtime/dlg/manager/rest.py +++ b/daliuge-runtime/dlg/manager/rest.py @@ -128,6 +128,9 @@ def __init__(self, dm, maxreqsize=10): app.get('/api/sessions//graph/size', callback=self.getGraphSize) app.get('/api/sessions//graph/status', callback=self.getGraphStatus) app.post('/api/sessions//graph/append', callback=self.addGraphParts) + app.get('/api/sessions//repro/status', callback=self.getSessionReproStatus) + app.get('/api/sessions//repro/data', callback=self.getSessionReproData) + # The non-REST mappings that serve HTML-related content app.route('/static/', callback=self.server_static) @@ -177,6 +180,17 @@ def getSessionInformation(self, sessionId): logger.debug("%s", json.dumps(graphDict)) return {'status': status, 'graph': graphDict} + @daliuge_aware + def getSessionReproStatus(self, sessionId): + return self.dm.getSessionReproStatus(sessionId) + + @daliuge_aware + def getSessionReproData(self, sessionId): + # For now, we only have information on a per-graph basis. + graphDict = self.dm.getGraph(sessionId) + reprodata = self.dm.getGraphReproData(sessionId) + return {'graph': graphDict, 'reprodata': reprodata} + @daliuge_aware def destroySession(self, sessionId): self.dm.destroySession(sessionId) From d2e84cf154d71a67a0dc663e845e0bd409d59180 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 29 Jun 2020 16:16:56 +0800 Subject: [PATCH 081/484] Adds client methods to GET repro status and data --- daliuge-common/dlg/clients.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/daliuge-common/dlg/clients.py b/daliuge-common/dlg/clients.py index 5d99de6b8..ee27e2ce0 100644 --- a/daliuge-common/dlg/clients.py +++ b/daliuge-common/dlg/clients.py @@ -125,6 +125,23 @@ def session_status(self, sessionId): logger.debug('Successfully read session %s status (%s) from %s:%s', sessionId, status, self.host, self.port) return status + def session_repro_status(self, sessionId): + """ + Returns the reproducibility status of session `sessionId`. + """ + status = self._get_json('/sessions/%s/repro/status' % (urllib.quote(sessionId),)) + logger.debug('Successfully read session %s reproducibility status (%s) from %s:%s', + sessionId, status, self.host, self.port) + return status + + def session_repro_data(self, sessionId): + """ + Returns the graph-wide reproducibility information of session `sessionId`. + """ + data = self._get_json('/sessions/%s/repro/data' % (urllib.quote(sessionId),)) + logger.debug('Successfully read session %s reproducibility data from %s:%s', sessionId, self.host, self.port) + return data + def graph_size(self, sessionId): """ Returns the size of the graph of session `sessionId` From ec6af057ba6da6e0f3d151ecb4cd74b26831882d Mon Sep 17 00:00:00 2001 From: pritchardn Date: Tue, 30 Jun 2020 09:58:41 +0800 Subject: [PATCH 082/484] Adds function to get reprostatus of all sessions in the manager --- daliuge-runtime/dlg/manager/rest.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daliuge-runtime/dlg/manager/rest.py b/daliuge-runtime/dlg/manager/rest.py index f8ec164aa..3e8b37ea3 100644 --- a/daliuge-runtime/dlg/manager/rest.py +++ b/daliuge-runtime/dlg/manager/rest.py @@ -184,6 +184,15 @@ def getSessionInformation(self, sessionId): def getSessionReproStatus(self, sessionId): return self.dm.getSessionReproStatus(sessionId) + @daliuge_aware + def getSessionsReproStatus(self): + sessions = [] + for sessionId in self.dm.getSessionIds(): + sessions.append({'sessionId': sessionId, 'status': self.dm.getSessionStatus(sessionId), + 'size': self.dm.getGraphSize(sessionId), + 'repro': self.dm.getSessionReproStatus(sessionId)}) + return sessions + @daliuge_aware def getSessionReproData(self, sessionId): # For now, we only have information on a per-graph basis. From 2f6993549afd9b7476b98b1e0fd40ea719e98aa5 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Tue, 30 Jun 2020 10:08:20 +0800 Subject: [PATCH 083/484] Adds reproducibility check option to dlg_submit --- daliuge-runtime/dlg/deploy/common.py | 23 +++++++++++++++++++ .../dlg/translator/tool_commands.py | 9 ++++++++ 2 files changed, 32 insertions(+) diff --git a/daliuge-runtime/dlg/deploy/common.py b/daliuge-runtime/dlg/deploy/common.py index 7e13b1603..1c9830b87 100644 --- a/daliuge-runtime/dlg/deploy/common.py +++ b/daliuge-runtime/dlg/deploy/common.py @@ -118,6 +118,29 @@ def monitor_sessions(session_id=None, poll_interval=10, host='127.0.0.1', time.sleep(poll_interval) +def monitor_sessions_repro(session_id=None, poll_interval=10, host='127.0.0.1', + port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60, + status_dump_path=None): + """ + Very similar to monitoring execution status of all (or one) session specified by `session_id` + by polling `host`:`port`, and returns when they all have finalized their reproducibility data. + """ + client = _get_client(host, port, timeout, status_dump_path) + if session_id: + while True: + repro_status = client.session_repro_status(session_id) + print("Status is ", repro_status) + if repro_status: + return True + time.sleep(poll_interval) + else: + while True: + sessions = client.sessions() + if all(client.session_repro_status(s) for s in sessions): + return {s['sessionId']: s['repro'] for s in sessions} + time.sleep(poll_interval) + + def submit(pg, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60, skip_deploy=False, session_id=None): """ diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index c66572292..60054dc94 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -93,6 +93,11 @@ def submit(pg, opts): common.monitor_sessions(session_id, host=opts.host, port=opts.port, poll_interval=opts.poll_interval) + if opts.reproducibility: + common.monitor_sessions_repro(session_id, host=opts.host, port=opts.port, + poll_interval=opts.poll_interval) + # TODO: If checking reproducibility. Get final data and return that. + def _add_output_options(parser): parser.add_option('-o', '--output', action="store", dest='output', type="string", @@ -277,6 +282,7 @@ def dlg_submit(parser, args): from ..manager import constants # Submit Physical Graph + _add_output_options(parser) tool.add_logging_options(parser) parser.add_option('-H', '--host', action='store', dest='host', help='The host we connect to to deploy the graph', default='localhost') @@ -294,12 +300,15 @@ def dlg_submit(parser, args): parser.add_option('-i', '--poll-interval', type='float', help='Polling interval used for monitoring the execution (default: 10)', default=10) + parser.add_option('-R', '--reproducibility', action='store_true', dest='reproducibility', + help='Fetch (and output) reproducibility data for the final execution graph (default: False)') (opts, args) = parser.parse_args(args) with _open_i(opts.pg_path) as f: pg = json.load(f) repro = pg[-1] submit(pg, opts) + # TODO: Add one more function to get the reprodata for the graph pg.append(repro) From b4e38b0561f6017781ea2a306cffc95b839c32c2 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Tue, 30 Jun 2020 10:34:55 +0800 Subject: [PATCH 084/484] dlg_submit will now fetch the final graph with reproducibility information attached. --- daliuge-runtime/dlg/deploy/common.py | 15 +++++++++++++++ .../dlg/translator/tool_commands.py | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/deploy/common.py b/daliuge-runtime/dlg/deploy/common.py index 1c9830b87..e54dda891 100644 --- a/daliuge-runtime/dlg/deploy/common.py +++ b/daliuge-runtime/dlg/deploy/common.py @@ -141,6 +141,21 @@ def monitor_sessions_repro(session_id=None, poll_interval=10, host='127.0.0.1', time.sleep(poll_interval) +def fetch_reproducibility(session_id=None, poll_interval=10, host='127.0.0.1', + port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60): + """ + Fetches the final graph and associated reproducibility information for `session_id`. + """ + if session_id is None: + return {} + client = _get_client(host, port, timeout) + while True: + repro_data = client.session_repro_data(session_id) + if repro_data is not None: + return repro_data + time.sleep(poll_interval) + + def submit(pg, host='127.0.0.1', port=constants.ISLAND_DEFAULT_REST_PORT, timeout=60, skip_deploy=False, session_id=None): """ diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 60054dc94..50cfaefa9 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -94,9 +94,12 @@ def submit(pg, opts): poll_interval=opts.poll_interval) if opts.reproducibility: + dump = _setup_output(opts) common.monitor_sessions_repro(session_id, host=opts.host, port=opts.port, poll_interval=opts.poll_interval) - # TODO: If checking reproducibility. Get final data and return that. + repro_data = common.fetch_reproducibility(session_id, host=opts.host, port=opts.port, + poll_interval=opts.poll_interval) + dump(repro_data['graph']) def _add_output_options(parser): @@ -308,7 +311,6 @@ def dlg_submit(parser, args): pg = json.load(f) repro = pg[-1] submit(pg, opts) - # TODO: Add one more function to get the reprodata for the graph pg.append(repro) From 573089458ce982388b9d8f491380918a5cfabdf9 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 6 Jul 2020 11:45:41 +0800 Subject: [PATCH 085/484] Printing adjustment --- daliuge-runtime/dlg/deploy/common.py | 1 - 1 file changed, 1 deletion(-) diff --git a/daliuge-runtime/dlg/deploy/common.py b/daliuge-runtime/dlg/deploy/common.py index e54dda891..e5a0518ef 100644 --- a/daliuge-runtime/dlg/deploy/common.py +++ b/daliuge-runtime/dlg/deploy/common.py @@ -129,7 +129,6 @@ def monitor_sessions_repro(session_id=None, poll_interval=10, host='127.0.0.1', if session_id: while True: repro_status = client.session_repro_status(session_id) - print("Status is ", repro_status) if repro_status: return True time.sleep(poll_interval) From 2bcf626a39caeb516b9985bfbf787bd7fb713286 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 6 Jul 2020 11:50:38 +0800 Subject: [PATCH 086/484] Adjusts drop reproduciblity_level setter to strictly support flagTypes. --- daliuge-runtime/dlg/drop.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 50bda016d..3b0f95e29 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -27,7 +27,6 @@ import collections import contextlib import errno -import hashlib import heapq import importlib import inspect @@ -611,13 +610,9 @@ def reproducibility_level(self): @reproducibility_level.setter def reproducibility_level(self, new_flag): - if type(new_flag) == str: - new_flag = ReproduciblityFlags(int(new_flag)) - elif type(new_flag) == int: - new_flag = ReproduciblityFlags(new_flag) if type(new_flag) != ReproduciblityFlags: raise TypeError("new_flag must be a Reproduciblity flag enum.") - elif rmode_supported(new_flag): + elif rmode_supported(new_flag): # TODO: Support custom checkers for repro-level if self._committed: # Current behaviour, set to un-committed again after change self._committed = False @@ -626,7 +621,7 @@ def reproducibility_level(self, new_flag): self._merkleData = [] self._reproduciblity = new_flag else: - raise ValueError("new_flag %d is not supported", new_flag) + raise NotImplementedError("new_flag %d is not supported", new_flag.value) def generate_rerun_data(self): """ From b4e96be8eecb9038a220edaba8a9ea4ba71c6a89 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 6 Jul 2020 14:34:35 +0800 Subject: [PATCH 087/484] Beginning to implement testing procedures --- .../reproducibility/reproGraphs/apps.graph | 333 ++++++++++++++++++ .../reproducibility/reproGraphs/files.graph | 204 +++++++++++ .../reproGraphs/groupUse.graph | 135 +++++++ .../reproducibility/reproGraphs/groups.graph | 260 ++++++++++++++ .../reproducibility/reproGraphs/misc.graph | 114 ++++++ .../reproducibility/test_accumulatedata.py | 98 ++++++ 6 files changed, 1144 insertions(+) create mode 100644 daliuge-runtime/test/reproducibility/reproGraphs/apps.graph create mode 100644 daliuge-runtime/test/reproducibility/reproGraphs/files.graph create mode 100644 daliuge-runtime/test/reproducibility/reproGraphs/groupUse.graph create mode 100644 daliuge-runtime/test/reproducibility/reproGraphs/groups.graph create mode 100644 daliuge-runtime/test/reproducibility/reproGraphs/misc.graph create mode 100644 daliuge-runtime/test/reproducibility/test_accumulatedata.py diff --git a/daliuge-runtime/test/reproducibility/reproGraphs/apps.graph b/daliuge-runtime/test/reproducibility/reproGraphs/apps.graph new file mode 100644 index 000000000..7da0e3daf --- /dev/null +++ b/daliuge-runtime/test/reproducibility/reproGraphs/apps.graph @@ -0,0 +1,333 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "apps.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "4e9ba4ed-1f51-45ed-9320-ad7978701970", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "260b62fe-1624-4fd2-b638-3e64f6293453", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Bash Shell App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "DynlibApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#3470AA", + "description": "An application component run from a dynamic library", + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "libpath", + "text": "Library path", + "value": "/usr/bin/example" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "73474b3f-d6ea-4455-8aab-ad88a9ccfa1b", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "e4d3d5fa-57b2-455c-8478-3ba65339c8dd", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Dynlib App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "mpi", + "categoryType": "Application", + "collapsed": false, + "colour": "#1E90FF", + "description": "An application component using the Message Passing Interface (MPI)", + "exitAppName": "", + "fields": [ + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "num_of_procs", + "text": "Num procs", + "value": "4" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "4f355f3f-ef01-47a3-b2d7-83ce335f5e77", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a4fe5623-4b95-4a10-b5ef-9e07a7a14688", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "MPI" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "docker", + "categoryType": "Application", + "collapsed": false, + "colour": "#331C54", + "description": "An application component run from a Docker image", + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "image", + "text": "Image", + "value": "dockerimage" + }, + { + "name": "command", + "text": "Command", + "value": "docker up" + }, + { + "name": "user", + "text": "User", + "value": "" + }, + { + "name": "ensureUserAndSwitch", + "text": "Ensure User And Switch", + "value": "0" + }, + { + "name": "removeContainer", + "text": "Remove Container", + "value": "1" + }, + { + "name": "additionalBindings", + "text": "Additional Bindings", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "8da67f95-5665-42f3-a0ec-a6213b4fae8f", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -4, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a33fa1c9-fc24-4975-9f5e-ba1d73b5d050", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Docker" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Component", + "categoryType": "Application", + "collapsed": false, + "colour": "#3498DB", + "description": "An application component in the form of a Python app", + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "appclass", + "text": "Appclass", + "value": "test.graphsRepository" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "821057f0-3b7f-4483-93a6-993120068566", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -5, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "2028e36a-f9a3-418e-99b0-8bd8f6129f26", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Python App" + } + ] +} \ No newline at end of file diff --git a/daliuge-runtime/test/reproducibility/reproGraphs/files.graph b/daliuge-runtime/test/reproducibility/reproGraphs/files.graph new file mode 100644 index 000000000..4c7c27f53 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/reproGraphs/files.graph @@ -0,0 +1,204 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "files.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "memory", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -1, + "loc": "345 76", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "796c37c8-3272-468e-99ac-0e8dfbf6374c", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Memory" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "file", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -2, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "c14575f4-17cc-470b-b2a4-4237e06196d3", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "s3", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -3, + "loc": "430 259", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "736cc3d7-8b3a-4752-8dc1-d71b5fb01911", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "S3" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "ngas", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -4, + "loc": "323 255", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "3ca32524-e658-47ea-8419-28efeabb826c", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "NGAS" + } + ] +} \ No newline at end of file diff --git a/daliuge-runtime/test/reproducibility/reproGraphs/groupUse.graph b/daliuge-runtime/test/reproducibility/reproGraphs/groupUse.graph new file mode 100644 index 000000000..a128f826c --- /dev/null +++ b/daliuge-runtime/test/reproducibility/reproGraphs/groupUse.graph @@ -0,0 +1,135 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "groupUse.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "GroupBy", + "categoryType": "Group", + "collapsed": false, + "colour": "#7F8C8D", + "description": "Placeholder 'group by' description", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [ + { + "name": "group_key", + "text": "Group key", + "value": "None" + }, + { + "name": "group_axis", + "text": "Group axis", + "value": "frequency" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "", + "inputLocalPorts": [ + { + "Id": "f21dd6fd-08ae-4955-bb05-6466dfa884f6", + "IdText": "event" + } + ], + "inputPorts": [ + { + "Id": "c4f1785d-2427-42ef-ad3e-b4ed2428c5b4", + "IdText": "event" + } + ], + "isData": false, + "isGroup": true, + "key": -1, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "", + "outputLocalPorts": [ + { + "Id": "ff77c691-624b-471e-ac7e-c0f25cf86559", + "IdText": "event" + } + ], + "outputPorts": [ + { + "Id": "8ac46084-6e76-4223-8ff7-a352488368d4", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Group By" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "4e9ba4ed-1f51-45ed-9320-ad7978701970", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "loc": "386 444", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "260b62fe-1624-4fd2-b638-3e64f6293453", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Bash Shell App" + } + ] +} \ No newline at end of file diff --git a/daliuge-runtime/test/reproducibility/reproGraphs/groups.graph b/daliuge-runtime/test/reproducibility/reproGraphs/groups.graph new file mode 100644 index 000000000..66d110a7b --- /dev/null +++ b/daliuge-runtime/test/reproducibility/reproGraphs/groups.graph @@ -0,0 +1,260 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "groups.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "GroupBy", + "categoryType": "Group", + "collapsed": false, + "colour": "#7F8C8D", + "description": "Placeholder 'group by' description", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [ + { + "name": "group_key", + "text": "Group key", + "value": "None" + }, + { + "name": "group_axis", + "text": "Group axis", + "value": "frequency" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "", + "inputLocalPorts": [ + { + "Id": "f21dd6fd-08ae-4955-bb05-6466dfa884f6", + "IdText": "event" + } + ], + "inputPorts": [ + { + "Id": "c4f1785d-2427-42ef-ad3e-b4ed2428c5b4", + "IdText": "event" + } + ], + "isData": false, + "isGroup": true, + "key": -1, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "", + "outputLocalPorts": [ + { + "Id": "ff77c691-624b-471e-ac7e-c0f25cf86559", + "IdText": "event" + } + ], + "outputPorts": [ + { + "Id": "8ac46084-6e76-4223-8ff7-a352488368d4", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Group By" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Gather", + "categoryType": "Group", + "collapsed": false, + "colour": "#D35400", + "description": "Placeholder 'gather' description", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [ + { + "name": "num_of_inputs", + "text": "Number of inputs", + "value": "2" + }, + { + "name": "gather_axis", + "text": "Gather axis", + "value": "frequency" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [ + { + "Id": "4694e4c6-c6ba-42f7-bad6-a2943d369ce6", + "IdText": "event" + } + ], + "inputPorts": [ + { + "Id": "0bdb44ea-123d-42ff-825d-cb939175586a", + "IdText": "event" + } + ], + "isData": false, + "isGroup": true, + "key": -2, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "", + "outputLocalPorts": [ + { + "Id": "5fcb853a-efa5-4c48-aa72-e803f6d96cb7", + "IdText": "event" + } + ], + "outputPorts": [ + { + "Id": "237f5a78-5bd6-412f-8a8b-70e2f4ea4af1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Gather" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Scatter", + "categoryType": "Group", + "collapsed": false, + "colour": "#DDAD00", + "description": "Placeholder 'scatter' description", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [ + { + "name": "num_of_copies", + "text": "Number of copies", + "value": "4" + }, + { + "name": "scatter_axis", + "text": "Scatter axis", + "value": "time" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [ + { + "Id": "88f46618-57ac-4e9c-99a7-f9cf2d682852", + "IdText": "event" + } + ], + "inputPorts": [ + { + "Id": "b8cc69ef-de0c-4c6a-bba2-df12aff17a8b", + "IdText": "event" + } + ], + "isData": false, + "isGroup": true, + "key": -3, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "", + "outputLocalPorts": [ + { + "Id": "c29554bd-8003-410a-9cce-c0d4376bb1ef", + "IdText": "event" + } + ], + "outputPorts": [ + { + "Id": "a8e147cb-065c-49ee-8c52-25c53cf36a07", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Scatter" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Loop", + "categoryType": "Group", + "collapsed": false, + "colour": "#512E5F", + "description": "Placeholder 'loop' description", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [ + { + "name": "num_of_iter", + "text": "Number loops", + "value": "5" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "", + "inputLocalPorts": [ + { + "Id": "cf7081c4-4950-4ec8-b81c-634e1317d51f", + "IdText": "event" + } + ], + "inputPorts": [ + { + "Id": "cb2023bd-4f82-4574-9be5-d9bdbe5a8960", + "IdText": "event" + } + ], + "isData": false, + "isGroup": true, + "key": -4, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "", + "outputLocalPorts": [ + { + "Id": "a71caf3a-3c4a-43b6-9732-275cc7e4e41a", + "IdText": "event" + } + ], + "outputPorts": [ + { + "Id": "355e0ec9-a0be-47f3-9257-a402be15c957", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Loop" + } + ] +} \ No newline at end of file diff --git a/daliuge-runtime/test/reproducibility/reproGraphs/misc.graph b/daliuge-runtime/test/reproducibility/reproGraphs/misc.graph new file mode 100644 index 000000000..4b41e1868 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/reproGraphs/misc.graph @@ -0,0 +1,114 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "misc.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": false, + "canHaveOutputs": false, + "category": "Comment", + "categoryType": "Other", + "collapsed": false, + "colour": "#799938", + "description": "A node that places a comment in the graph. The comment can be used to communicate important information or intention", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -1, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "Comment" + }, + { + "canHaveInputs": false, + "canHaveOutputs": false, + "category": "Description", + "categoryType": "Other", + "collapsed": false, + "colour": "#9B3065", + "description": "A node that places a description in the graph. The description should be used to communicate the purpose of the graph", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [ + { + "text": "Description", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -2, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "Description" + }, + { + "canHaveInputs": false, + "canHaveOutputs": false, + "category": "ExclusiveForceNode", + "categoryType": "Control", + "collapsed": false, + "colour": "#000000", + "description": "A group that completely specifies the computation on a single node. All child components must be deployed to a single node, and no other components can be deployed to the same node.", + "desiredSize": { + "height": 200, + "width": 200 + }, + "exitAppName": "", + "fields": [], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": true, + "key": -3, + "loc": "300 100", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "Exclusive Force Node" + } + ] +} \ No newline at end of file diff --git a/daliuge-runtime/test/reproducibility/test_accumulatedata.py b/daliuge-runtime/test/reproducibility/test_accumulatedata.py new file mode 100644 index 000000000..2ca999c15 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/test_accumulatedata.py @@ -0,0 +1,98 @@ +import json +import unittest + +from dlg.common.reproducibility.constants import ReproduciblityFlags +from dlg.common.reproducibility.reproducibility import accumulate_lgt_drop_data + + +class AccumulateLGTRerunData(unittest.TestCase): + # Locations in apps.graph for various application types + bash_app = 0 + dyn_lib = 1 + mpi = 2 + docker = 3 + python = 4 + + def test_app_accumulate(self): + fp = open('reproGraphs/apps.graph') + node_data = json.load(fp)['nodeDataArray'] + app_hashes = [] + for i in range(5): + app = node_data[i] + hash_data = accumulate_lgt_drop_data(app, ReproduciblityFlags.RERUN) + print(hash_data) + #app_hashes.append(HASHING_ALG(hash_data).hexdigest())) + fp.close() + assert True + + def test_data_accumulate(self): + self.assertEqual(True, False) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulateLGRerunData(unittest.TestCase): + def test_all_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTUnrollRerunData(unittest.TestCase): + def test_app_accumulate(self): + self.assertEqual(True, False) + + def test_data_accumulate(self): + self.assertEqual(True, False) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTPartitionRerunData(unittest.TestCase): + def test_app_accumulate(self): + self.assertEqual(True, False) + + def test_data_accumulate(self): + self.assertEqual(True, False) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGRerunData(unittest.TestCase): + def test_app_accumulate(self): + self.assertEqual(True, False) + + def test_data_accumulate(self): + self.assertEqual(True, False) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +if __name__ == '__main__': + unittest.main() From 83bde480b26c768b1bb08eeee4585fcbc02cd989 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 16:15:23 +0800 Subject: [PATCH 088/484] Checking for lg_merkleroot now fails gracefully. --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 16e38ae4a..dcd18f692 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -246,8 +246,8 @@ def accumulate_meta_data(): def build_lg_block_data(drop: dict): block_data = [drop['reprodata']['lgt_data']['merkleroot']] - lg_hash = drop['reprodata']['lg_data']['merkleroot'] - if lg_hash is not None: + if 'merkleroot' in drop['reprodata']['lg_data']: + lg_hash = drop['reprodata']['lg_data']['merkleroot'] block_data.append(lg_hash) for parenthash in sorted(drop['reprodata']['lg_parenthashes']): block_data.append(parenthash) @@ -287,7 +287,6 @@ def lg_build_blockdag(lg: dict): neighbourset = {} visited = 0 q = deque() - for drop in lg['nodeDataArray']: did = int(drop['key']) dropset[did] = [drop, 0] From bf1fa8d2167297531c40ade6e5cbc7649ebdf2da Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 16:17:30 +0800 Subject: [PATCH 089/484] lg_build_blockdag now returns the order in which nodes are visited --- .../dlg/common/reproducibility/reproducibility.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index dcd18f692..72a036d9e 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -285,7 +285,7 @@ def lg_build_blockdag(lg: dict): from collections import deque dropset = {} # Also contains in-degree information neighbourset = {} - visited = 0 + visited = [] q = deque() for drop in lg['nodeDataArray']: did = int(drop['key']) @@ -307,7 +307,7 @@ def lg_build_blockdag(lg: dict): did = q.pop() # Process build_lg_block_data(dropset[did][0]) - visited += 1 + visited.append(did) for n in neighbourset[did]: dropset[n][1] -= 1 # Add our new hash to the parent-hash list @@ -316,10 +316,11 @@ def lg_build_blockdag(lg: dict): if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) - if visited != len(dropset): + if len(visited) != len(dropset): raise Exception("Not a DAG") logger.info("BlockDAG Generated at LG/T level") + return visited # For debugging def build_blockdag(drops: list, abstraction: str = 'pgt'): From fe48ce48274f603fa31057849ae83fefdad9b1c6 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 16:22:18 +0800 Subject: [PATCH 090/484] Setting up tests for topological sorts. Adds simple test case --- .../test/reproducibility/test_toposort.py | 99 +++++++++++++++++++ .../topoGraphs/testSingle.graph | 85 ++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 daliuge-runtime/test/reproducibility/test_toposort.py create mode 100644 daliuge-runtime/test/reproducibility/topoGraphs/testSingle.graph diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py new file mode 100644 index 000000000..b0a3d569d --- /dev/null +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -0,0 +1,99 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +""" +Tests the correctness of our topological sorting code. This module does not test the final blockDAG generation. +Assumptions: +- The graphs tests are valid (not malformed) +""" + +import json +import unittest + +from dlg.common.reproducibility.reproducibility import lg_build_blockdag + + +class ToposortTests(unittest.TestCase): + + def init_graph(self, filename): + fp = open(filename) + lgt = json.load(fp) + fp.close() + for drop in lgt['nodeDataArray']: + drop['reprodata'] = {} + drop['reprodata']['lg_parenthashes'] = [] + drop['reprodata']['lgt_data'] = {'merkleroot': "1"} + drop['reprodata']['lg_data'] = {} + return lgt + + def test_lg_blockdag_single(self): + """ + Tests a single drop + A + """ + lgt = self.init_graph("topoGraphs/testSingle.graph") + visited = lg_build_blockdag(lgt) + assert visited == [-1] + + def test_lg_blockdag_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + assert False + + def test_lg_blockdag_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + assert False + + def test_lg_blockdag_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + assert False + + def test_lg_blockdag_notDAG(self): + """ + A graph that is not a dag. This should fail. + A --> B --> C --> B + """ + assert False + + def test_lg_blockdag_cycle(self): + """ + A graph that is one cycle. This should fail + A --> B --> C --> A + """ + + def test_lg_blockdag_empty(self): + """ + Tests an empty graph. Should fail gracefully. + """ + assert False \ No newline at end of file diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testSingle.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testSingle.graph new file mode 100644 index 000000000..8382b4eb2 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testSingle.graph @@ -0,0 +1,85 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "testSingle.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": true, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 1044, + "y": 208 + } + ] +} \ No newline at end of file From 71b87abdb686604bf1c7ddce6a023b1ae5de75a8 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 18:29:55 +0800 Subject: [PATCH 091/484] Adds two start toposort test case --- .../test/reproducibility/test_toposort.py | 4 +- .../topoGraphs/testTwoStart.graph | 244 ++++++++++++++++++ 2 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 daliuge-runtime/test/reproducibility/topoGraphs/testTwoStart.graph diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index b0a3d569d..6bdbbd2eb 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -60,7 +60,9 @@ def test_lg_blockdag_twostart(self): C B --> """ - assert False + lgt = self.init_graph("topoGraphs/testTwoStart.graph") + visited = lg_build_blockdag(lgt) + assert visited == [-3, -1, -2] def test_lg_blockdag_twoend(self): """ diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testTwoStart.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testTwoStart.graph new file mode 100644 index 000000000..c30ddb125 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testTwoStart.graph @@ -0,0 +1,244 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -2, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -3, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -2, + "toPort": "a7ba815b-d723-493f-add7-ed78220fe504" + } + ], + "modelData": { + "filePath": "testTwoStart.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 264, + "y": 195 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + }, + { + "Id": "a7ba815b-d723-493f-add7-ed78220fe504", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": true, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 541, + "y": 202 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 800, + "y": 202 + } + ] +} \ No newline at end of file From e2256b502c145b5d076c22ed4e6ec772aa983db0 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 19:17:57 +0800 Subject: [PATCH 092/484] Adds two end toposort test case --- .../test/reproducibility/test_toposort.py | 4 +- .../topoGraphs/testTwoEnd.graph | 244 ++++++++++++++++++ 2 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 daliuge-runtime/test/reproducibility/topoGraphs/testTwoEnd.graph diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index 6bdbbd2eb..6ab060ef8 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -71,7 +71,9 @@ def test_lg_blockdag_twoend(self): A --> C """ - assert False + lgt = self.init_graph("topoGraphs/testTwoEnd.graph") + visited = lg_build_blockdag(lgt) + assert visited == [-1, -3, -2] def test_lg_blockdag_twolines(self): """ diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testTwoEnd.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testTwoEnd.graph new file mode 100644 index 000000000..a6f6f6b79 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testTwoEnd.graph @@ -0,0 +1,244 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -2, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -1, + "fromPort": "71334f53-a533-4c58-af49-8236582a0c9d", + "to": -3, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + } + ], + "modelData": { + "filePath": "testTwoEnd.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + }, + { + "Id": "71334f53-a533-4c58-af49-8236582a0c9d", + "IdText": "event" + } + ], + "selected": true, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 320, + "y": 146 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 657, + "y": 348 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 694, + "y": 99 + } + ] +} \ No newline at end of file From 9c0deb4803cd37f6231daa69adb2ef7c6a46a3f2 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 19:24:24 +0800 Subject: [PATCH 093/484] Adds two lines toposort test case --- .../test/reproducibility/test_toposort.py | 5 +- .../topoGraphs/testTwoLines.graph | 311 ++++++++++++++++++ 2 files changed, 315 insertions(+), 1 deletion(-) create mode 100644 daliuge-runtime/test/reproducibility/topoGraphs/testTwoLines.graph diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index 6ab060ef8..cc300590a 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -81,7 +81,10 @@ def test_lg_blockdag_twolines(self): A --> B C --> D """ - assert False + lgt = self.init_graph("topoGraphs/testTwoLines.graph") + visited = lg_build_blockdag(lgt) + print(visited) + assert visited == [-2, -3, -1, -4] def test_lg_blockdag_notDAG(self): """ diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testTwoLines.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testTwoLines.graph new file mode 100644 index 000000000..4f447002b --- /dev/null +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testTwoLines.graph @@ -0,0 +1,311 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -4, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -2, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -3, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + } + ], + "modelData": { + "filePath": "testTwoLines.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 393, + "y": 80 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 385, + "y": 351 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 749, + "y": 359 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -4, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": true, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 722, + "y": 100 + } + ] +} \ No newline at end of file From 897fbc4cdacdc0ef21fbce2e1a7b95a9f6bf3526 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 19:33:37 +0800 Subject: [PATCH 094/484] Adjusts test calls to proper unittest call --- daliuge-runtime/test/reproducibility/test_toposort.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index cc300590a..f9cfcf813 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -51,7 +51,7 @@ def test_lg_blockdag_single(self): """ lgt = self.init_graph("topoGraphs/testSingle.graph") visited = lg_build_blockdag(lgt) - assert visited == [-1] + self.assertTrue(visited == [-1]) def test_lg_blockdag_twostart(self): """ @@ -62,7 +62,7 @@ def test_lg_blockdag_twostart(self): """ lgt = self.init_graph("topoGraphs/testTwoStart.graph") visited = lg_build_blockdag(lgt) - assert visited == [-3, -1, -2] + self.assertTrue(visited == [-3, -1, -2]) def test_lg_blockdag_twoend(self): """ @@ -73,7 +73,7 @@ def test_lg_blockdag_twoend(self): """ lgt = self.init_graph("topoGraphs/testTwoEnd.graph") visited = lg_build_blockdag(lgt) - assert visited == [-1, -3, -2] + self.assertTrue(visited == [-1, -3, -2]) def test_lg_blockdag_twolines(self): """ @@ -84,7 +84,7 @@ def test_lg_blockdag_twolines(self): lgt = self.init_graph("topoGraphs/testTwoLines.graph") visited = lg_build_blockdag(lgt) print(visited) - assert visited == [-2, -3, -1, -4] + self.assertTrue(visited == [-2, -3, -1, -4]) def test_lg_blockdag_notDAG(self): """ @@ -98,6 +98,7 @@ def test_lg_blockdag_cycle(self): A graph that is one cycle. This should fail A --> B --> C --> A """ + assert False def test_lg_blockdag_empty(self): """ From 08bf017c095a2c7701d1c184f867adb847fef7a1 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 19:35:40 +0800 Subject: [PATCH 095/484] Adds not DAG topological sort test case --- .../test/reproducibility/test_toposort.py | 3 +- .../topoGraphs/testNotDAG.graph | 298 ++++++++++++++++++ 2 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index f9cfcf813..0741aedb9 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -91,7 +91,8 @@ def test_lg_blockdag_notDAG(self): A graph that is not a dag. This should fail. A --> B --> C --> B """ - assert False + lgt = self.init_graph("topoGraphs/testNotDAG.graph") + self.assertRaises(Exception, lg_build_blockdag(lgt)) def test_lg_blockdag_cycle(self): """ diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph new file mode 100644 index 000000000..d6c14f431 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph @@ -0,0 +1,298 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "testTwoLines.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": true, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 361, + "y": 104 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 385, + "y": 351 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 749, + "y": 359 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -4, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 722, + "y": 99 + } + ] +} \ No newline at end of file From 98c4a2f0f094bc0b1cd01ba9c533780320c2ff3d Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 19:43:00 +0800 Subject: [PATCH 096/484] Adds cycle topological sort test case --- .../test/reproducibility/test_toposort.py | 7 +- .../topoGraphs/testCycle.graph | 323 ++++++++++++++++++ 2 files changed, 328 insertions(+), 2 deletions(-) create mode 100644 daliuge-runtime/test/reproducibility/topoGraphs/testCycle.graph diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index 0741aedb9..2c07d28bc 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -92,14 +92,17 @@ def test_lg_blockdag_notDAG(self): A --> B --> C --> B """ lgt = self.init_graph("topoGraphs/testNotDAG.graph") - self.assertRaises(Exception, lg_build_blockdag(lgt)) + with self.assertRaises(Exception): + lg_build_blockdag(lgt) def test_lg_blockdag_cycle(self): """ A graph that is one cycle. This should fail A --> B --> C --> A """ - assert False + lgt = self.init_graph("topoGraphs/testCycle.graph") + with self.assertRaises(Exception): + lg_build_blockdag(lgt) def test_lg_blockdag_empty(self): """ diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testCycle.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testCycle.graph new file mode 100644 index 000000000..ce29bd624 --- /dev/null +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testCycle.graph @@ -0,0 +1,323 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -4, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -4, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -2, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -2, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -3, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -3, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -1, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + } + ], + "modelData": { + "filePath": "testCycle.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 361, + "y": 104 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 629, + "y": 595 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": true, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 1208, + "y": 548 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "", + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "description": "", + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "description": "", + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "text": "Arg01", + "value": "" + } + ], + "height": 200, + "inputAppFields": [], + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e9c700b7-778e-406e-a124-c3ab86903ef6", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -4, + "outputAppFields": [], + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "IdText": "event" + } + ], + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 722, + "y": 99 + } + ] +} \ No newline at end of file From fd7f22b1ff7f6ad7dfb1b61957f46971f6929d6c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 9 Jul 2020 19:44:22 +0800 Subject: [PATCH 097/484] Adds empty graph topological test --- .../test/reproducibility/test_toposort.py | 4 +++- .../test/reproducibility/topoGraphs/testEmpty.graph | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 daliuge-runtime/test/reproducibility/topoGraphs/testEmpty.graph diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index 2c07d28bc..5c30109fe 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -108,4 +108,6 @@ def test_lg_blockdag_empty(self): """ Tests an empty graph. Should fail gracefully. """ - assert False \ No newline at end of file + lgt = self.init_graph("topoGraphs/testEmpty.graph") + visited = lg_build_blockdag(lgt) + self.assertTrue(visited == []) diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testEmpty.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testEmpty.graph new file mode 100644 index 000000000..2755a14ee --- /dev/null +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testEmpty.graph @@ -0,0 +1,13 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "testEmpty.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [] +} \ No newline at end of file From 220b97d7142e5a0c6a412be19cb7391962a2d02c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 10 Jul 2020 10:12:08 +0800 Subject: [PATCH 098/484] Adjusts string delimiters for readibility (a pointless change) --- .../common/reproducibility/reproducibility.py | 50 +++++++++---------- daliuge-runtime/dlg/drop.py | 44 +++++++++------- daliuge-runtime/dlg/manager/node_manager.py | 4 +- .../dlg/dropmake/pg_generator.py | 4 +- 4 files changed, 54 insertions(+), 48 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 72a036d9e..9f9c7253b 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -29,17 +29,17 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): data['category_type'] = category_type data['category'] = drop['category'] - if category_type == "Data": + if category_type == 'Data': data['streaming'] = drop['streaming'] pass - elif category_type == "Application": + elif category_type == 'Application': data['streaming'] = drop['streaming'] pass - elif category_type == "Group": + elif category_type == 'Group': pass - elif category_type == "Control": + elif category_type == 'Control': pass - elif category_type == "Other": + elif category_type == 'Other': pass return data @@ -63,19 +63,19 @@ def accumulate_pgt_unroll_drop_data(drop: dict): :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) if not rmode_supported(rmode): - logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) + logger.warning('Requested reproducibility mode %s not yet implemented', str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) if rmode == ReproduciblityFlags.NOTHING: return data - data["type"] = drop["type"] - data["rank"] = drop["rank"] - if data["type"] == 'plain': - data["storage"] = drop['storage'] + data['type'] = drop['type'] + data['rank'] = drop['rank'] + if data['type'] == 'plain': + data['storage'] = drop['storage'] else: - data["app"] = drop["app"] + data['app'] = drop['app'] return data @@ -86,17 +86,17 @@ def accumulate_pgt_partition_drop_data(drop: dict): :param drop: :return: """ - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) data = accumulate_pgt_unroll_drop_data(drop) # This is the only piece of new information added at the partition level # It is only pertinent to Repetition and Computational replication if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: - data["node"] = drop["node"][1:] - data["island"] = drop["island"][1:] + data['node'] = drop['node'][1:] + data['island'] = drop['island'][1:] return data @@ -107,11 +107,11 @@ def accumulate_pg_drop_data(drop: dict): :param drop: :return: A dictionary containing accumulated reproducibility data for a given drop. """ - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) data = {} if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: data['node'] = drop['node'] @@ -147,7 +147,7 @@ def init_lg_repro_drop_data(drop: dict): if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) data = accumulate_lg_drop_data(drop, rmode) merkledata = [] for key, value in data.items(): @@ -336,7 +336,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): blockstr = 'pgt' parentstr = 'pgt_parenthashes' block_builder = build_pgt_block_data - if abstraction == "pg": + if abstraction == 'pg': blockstr = 'pg' parentstr = 'pg_parenthashes' block_builder = build_pg_block_data @@ -458,11 +458,11 @@ def init_pg_repro_data(pg: list): :return: The same pg object with new information appended """ reprodata = pg.pop() - rmode = ReproduciblityFlags(int(reprodata["rmode"])) + rmode = ReproduciblityFlags(int(reprodata['rmode'])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - reprodata["rmode"] = str(rmode.value) + reprodata['rmode'] = str(rmode.value) for drop in pg: init_pg_repro_drop_data(drop) build_blockdag(pg, 'pg') @@ -478,12 +478,12 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): :param reprodata: :return: """ - rmode = ReproduciblityFlags(int(reprodata["rmode"])) + rmode = ReproduciblityFlags(int(reprodata['rmode'])) if not rmode_supported(rmode): # TODO: Logging needs sessionID at this stage # logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - reprodata["rmode"] = str(rmode.value) + reprodata['rmode'] = str(rmode.value) for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) build_blockdag(list(pg.values()), 'pg') diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 3b0f95e29..82d83519f 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -169,7 +169,7 @@ def __init__(self, oid, uid, **kwargs): # A simple name that the Drop might receive # This is usually set in the Logical Graph Editor, # but is not necessarily always there - self.name = self._getArg(kwargs, 'nm', "") + self.name = self._getArg(kwargs, 'nm', '') # The key of this drop in the original Logical Graph # This information might or might not be present depending on how the @@ -466,13 +466,13 @@ def isBeingRead(self): @track_current_drop def write(self, data, **kwargs): - ''' + """ Writes the given `data` into this DROP. This method is only meant to be called while the DROP is in INITIALIZED or WRITING state; once the DROP is COMPLETE or beyond only reading is allowed. The underlying storage mechanism is responsible for implementing the final writing logic via the `self.writeMeta()` method. - ''' + """ if self.status not in [DROPStates.INITIALIZED, DROPStates.WRITING]: raise Exception("No more writing expected") @@ -490,7 +490,7 @@ def write(self, data, **kwargs): dataLen = len(data) if nbytes != dataLen: # TODO: Maybe this should be an actual error? - logger.warning('Not all data was correctly written by %s (%d/%d bytes written)' % (self, nbytes, dataLen)) + logger.warning("Not all data was correctly written by %s (%d/%d bytes written)" % (self, nbytes, dataLen)) # see __init__ for the initialization to None if self._size is None: @@ -859,7 +859,7 @@ def addConsumer(self, consumer, back=True): # Add the reverse reference too automatically if cuid in self._consumers_uids: return - logger.debug('Adding new consumer %r to %r', consumer, self) + logger.debug("Adding new consumer %r to %r", consumer, self) self._consumers.append(consumer) # Subscribe the consumer to events sent when this DROP moves to @@ -981,7 +981,7 @@ def addStreamingConsumer(self, streamingConsumer, back=True): # Add if not already present if scuid in self._streamingConsumers_uids: return - logger.debug('Adding new streaming streaming consumer for %r: %s' % (self, streamingConsumer)) + logger.debug("Adding new streaming streaming consumer for %r: %s" % (self, streamingConsumer)) self._streamingConsumers.append(streamingConsumer) # Automatic back-reference @@ -1009,9 +1009,9 @@ def completedrop(self): @track_current_drop def setError(self): - ''' + """ Moves this DROP to the ERROR state. - ''' + """ if self.status == DROPStates.CANCELLED: return @@ -1027,12 +1027,12 @@ def setError(self): @track_current_drop def setCompleted(self): - ''' + """ Moves this DROP to the COMPLETED state. This can be used when not all the expected data has arrived for a given DROP, but it should still be moved to COMPLETED, or when the expected amount of data held by a DROP is not known in advanced. - ''' + """ status = self.status if status == DROPStates.CANCELLED: return @@ -1048,15 +1048,17 @@ def setCompleted(self): self.completedrop() def isCompleted(self): - ''' + """ Checks whether this DROP is currently in the COMPLETED state or not - ''' + """ # Mind you we're not accessing _status, but status. This way we use the # lock in status() to access _status return (self.status == DROPStates.COMPLETED) def cancel(self): - '''Moves this drop to the CANCELLED state closing any writers we opened''' + """ + Moves this drop to the CANCELLED state closing any writers we opened + """ self._closeWriters() self.status = DROPStates.CANCELLED @@ -1070,7 +1072,9 @@ def dataIsland(self): class PathBasedDrop(object): - """Base class for data drops that handle paths (i.e., file and directory drops)""" + """ + Base class for data drops that handle paths (i.e., file and directory drops) + """ def initialize(self, **kwargs): self._path = None @@ -1237,9 +1241,9 @@ def dataURL(self): class NgasDROP(AbstractDROP): - ''' + """ A DROP that points to data stored in an NGAS server - ''' + """ ngasSrv = dlg_string_param('ngasSrv', 'localhost') ngasPort = dlg_int_param('ngasPort', 7777) ngasTimeout = dlg_int_param('ngasTimeout', 2) @@ -1481,7 +1485,7 @@ def exists(self): class AppDROP(ContainerDROP): - ''' + """ An AppDROP is a DROP representing an application that reads data from one or more DROPs (its inputs), and writes data onto one or more DROPs (its outputs). @@ -1503,7 +1507,7 @@ class AppDROP(ContainerDROP): `dataWritten`. A common scenario anyway is to start an application only after all its inputs have moved to COMPLETED (implying that none of them is an streaming input); for these cases see the `BarrierAppDROP`. - ''' + """ def initialize(self, **kwargs): @@ -1633,7 +1637,9 @@ def _notifyAppIsFinished(self): self.completedrop() def cancel(self): - '''Moves this application drop to its CANCELLED state''' + """ + Moves this application drop to its CANCELLED state + """ super(AppDROP, self).cancel() self.execStatus = AppDROPStates.CANCELLED diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index ca334969c..2987442e3 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -199,7 +199,7 @@ def createSession(self, sessionId): if sessionId in self._sessions: raise SessionAlreadyExistsException(sessionId) self._sessions[sessionId] = Session(sessionId, nm=self) - logger.info('Created session %s', sessionId) + logger.info("Created session %s", sessionId) def getsession(self, sessionId): return self._sessions[sessionId] @@ -284,7 +284,7 @@ def getGraphSize(self, sessionId): def trigger_drops(self, sessionId, uids): self._check_session_id(sessionId) t = threading.Thread(target=self._sessions[sessionId].trigger_drops, - name="Drop trigger", + name='Drop trigger', args=(uids,)) t.start() diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 11109d2c6..67479ce2d 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -338,7 +338,7 @@ def is_group_start(self): def is_group_end(self): return ( self.has_group() - and "group_end" in self.jd + and "group_end" in self.jdreprodata and 1 == int(self.jd["group_end"]) ) @@ -361,7 +361,7 @@ def is_mpi(self): return self._jd["category"] == "mpi" @property - def group_keys(self): + def group_keys(self):reprodata """ Return: None or a list of keys (each key is an integer) From 33c36a0cef9529ff2c9e2c07fcf6d262ac4e4e35 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 10 Jul 2020 10:12:08 +0800 Subject: [PATCH 099/484] Adjusts string delimiters for readibility (a pointless change) --- .../common/reproducibility/reproducibility.py | 50 +++++++++---------- daliuge-runtime/dlg/drop.py | 44 +++++++++------- daliuge-runtime/dlg/manager/node_manager.py | 4 +- 3 files changed, 52 insertions(+), 46 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 72a036d9e..9f9c7253b 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -29,17 +29,17 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): data['category_type'] = category_type data['category'] = drop['category'] - if category_type == "Data": + if category_type == 'Data': data['streaming'] = drop['streaming'] pass - elif category_type == "Application": + elif category_type == 'Application': data['streaming'] = drop['streaming'] pass - elif category_type == "Group": + elif category_type == 'Group': pass - elif category_type == "Control": + elif category_type == 'Control': pass - elif category_type == "Other": + elif category_type == 'Other': pass return data @@ -63,19 +63,19 @@ def accumulate_pgt_unroll_drop_data(drop: dict): :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) if not rmode_supported(rmode): - logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) + logger.warning('Requested reproducibility mode %s not yet implemented', str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) if rmode == ReproduciblityFlags.NOTHING: return data - data["type"] = drop["type"] - data["rank"] = drop["rank"] - if data["type"] == 'plain': - data["storage"] = drop['storage'] + data['type'] = drop['type'] + data['rank'] = drop['rank'] + if data['type'] == 'plain': + data['storage'] = drop['storage'] else: - data["app"] = drop["app"] + data['app'] = drop['app'] return data @@ -86,17 +86,17 @@ def accumulate_pgt_partition_drop_data(drop: dict): :param drop: :return: """ - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) data = accumulate_pgt_unroll_drop_data(drop) # This is the only piece of new information added at the partition level # It is only pertinent to Repetition and Computational replication if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: - data["node"] = drop["node"][1:] - data["island"] = drop["island"][1:] + data['node'] = drop['node'][1:] + data['island'] = drop['island'][1:] return data @@ -107,11 +107,11 @@ def accumulate_pg_drop_data(drop: dict): :param drop: :return: A dictionary containing accumulated reproducibility data for a given drop. """ - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) data = {} if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: data['node'] = drop['node'] @@ -147,7 +147,7 @@ def init_lg_repro_drop_data(drop: dict): if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - drop['reprodata']["rmode"] = str(rmode.value) + drop['reprodata']['rmode'] = str(rmode.value) data = accumulate_lg_drop_data(drop, rmode) merkledata = [] for key, value in data.items(): @@ -336,7 +336,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): blockstr = 'pgt' parentstr = 'pgt_parenthashes' block_builder = build_pgt_block_data - if abstraction == "pg": + if abstraction == 'pg': blockstr = 'pg' parentstr = 'pg_parenthashes' block_builder = build_pg_block_data @@ -458,11 +458,11 @@ def init_pg_repro_data(pg: list): :return: The same pg object with new information appended """ reprodata = pg.pop() - rmode = ReproduciblityFlags(int(reprodata["rmode"])) + rmode = ReproduciblityFlags(int(reprodata['rmode'])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - reprodata["rmode"] = str(rmode.value) + reprodata['rmode'] = str(rmode.value) for drop in pg: init_pg_repro_drop_data(drop) build_blockdag(pg, 'pg') @@ -478,12 +478,12 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): :param reprodata: :return: """ - rmode = ReproduciblityFlags(int(reprodata["rmode"])) + rmode = ReproduciblityFlags(int(reprodata['rmode'])) if not rmode_supported(rmode): # TODO: Logging needs sessionID at this stage # logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT - reprodata["rmode"] = str(rmode.value) + reprodata['rmode'] = str(rmode.value) for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) build_blockdag(list(pg.values()), 'pg') diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 3b0f95e29..82d83519f 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -169,7 +169,7 @@ def __init__(self, oid, uid, **kwargs): # A simple name that the Drop might receive # This is usually set in the Logical Graph Editor, # but is not necessarily always there - self.name = self._getArg(kwargs, 'nm', "") + self.name = self._getArg(kwargs, 'nm', '') # The key of this drop in the original Logical Graph # This information might or might not be present depending on how the @@ -466,13 +466,13 @@ def isBeingRead(self): @track_current_drop def write(self, data, **kwargs): - ''' + """ Writes the given `data` into this DROP. This method is only meant to be called while the DROP is in INITIALIZED or WRITING state; once the DROP is COMPLETE or beyond only reading is allowed. The underlying storage mechanism is responsible for implementing the final writing logic via the `self.writeMeta()` method. - ''' + """ if self.status not in [DROPStates.INITIALIZED, DROPStates.WRITING]: raise Exception("No more writing expected") @@ -490,7 +490,7 @@ def write(self, data, **kwargs): dataLen = len(data) if nbytes != dataLen: # TODO: Maybe this should be an actual error? - logger.warning('Not all data was correctly written by %s (%d/%d bytes written)' % (self, nbytes, dataLen)) + logger.warning("Not all data was correctly written by %s (%d/%d bytes written)" % (self, nbytes, dataLen)) # see __init__ for the initialization to None if self._size is None: @@ -859,7 +859,7 @@ def addConsumer(self, consumer, back=True): # Add the reverse reference too automatically if cuid in self._consumers_uids: return - logger.debug('Adding new consumer %r to %r', consumer, self) + logger.debug("Adding new consumer %r to %r", consumer, self) self._consumers.append(consumer) # Subscribe the consumer to events sent when this DROP moves to @@ -981,7 +981,7 @@ def addStreamingConsumer(self, streamingConsumer, back=True): # Add if not already present if scuid in self._streamingConsumers_uids: return - logger.debug('Adding new streaming streaming consumer for %r: %s' % (self, streamingConsumer)) + logger.debug("Adding new streaming streaming consumer for %r: %s" % (self, streamingConsumer)) self._streamingConsumers.append(streamingConsumer) # Automatic back-reference @@ -1009,9 +1009,9 @@ def completedrop(self): @track_current_drop def setError(self): - ''' + """ Moves this DROP to the ERROR state. - ''' + """ if self.status == DROPStates.CANCELLED: return @@ -1027,12 +1027,12 @@ def setError(self): @track_current_drop def setCompleted(self): - ''' + """ Moves this DROP to the COMPLETED state. This can be used when not all the expected data has arrived for a given DROP, but it should still be moved to COMPLETED, or when the expected amount of data held by a DROP is not known in advanced. - ''' + """ status = self.status if status == DROPStates.CANCELLED: return @@ -1048,15 +1048,17 @@ def setCompleted(self): self.completedrop() def isCompleted(self): - ''' + """ Checks whether this DROP is currently in the COMPLETED state or not - ''' + """ # Mind you we're not accessing _status, but status. This way we use the # lock in status() to access _status return (self.status == DROPStates.COMPLETED) def cancel(self): - '''Moves this drop to the CANCELLED state closing any writers we opened''' + """ + Moves this drop to the CANCELLED state closing any writers we opened + """ self._closeWriters() self.status = DROPStates.CANCELLED @@ -1070,7 +1072,9 @@ def dataIsland(self): class PathBasedDrop(object): - """Base class for data drops that handle paths (i.e., file and directory drops)""" + """ + Base class for data drops that handle paths (i.e., file and directory drops) + """ def initialize(self, **kwargs): self._path = None @@ -1237,9 +1241,9 @@ def dataURL(self): class NgasDROP(AbstractDROP): - ''' + """ A DROP that points to data stored in an NGAS server - ''' + """ ngasSrv = dlg_string_param('ngasSrv', 'localhost') ngasPort = dlg_int_param('ngasPort', 7777) ngasTimeout = dlg_int_param('ngasTimeout', 2) @@ -1481,7 +1485,7 @@ def exists(self): class AppDROP(ContainerDROP): - ''' + """ An AppDROP is a DROP representing an application that reads data from one or more DROPs (its inputs), and writes data onto one or more DROPs (its outputs). @@ -1503,7 +1507,7 @@ class AppDROP(ContainerDROP): `dataWritten`. A common scenario anyway is to start an application only after all its inputs have moved to COMPLETED (implying that none of them is an streaming input); for these cases see the `BarrierAppDROP`. - ''' + """ def initialize(self, **kwargs): @@ -1633,7 +1637,9 @@ def _notifyAppIsFinished(self): self.completedrop() def cancel(self): - '''Moves this application drop to its CANCELLED state''' + """ + Moves this application drop to its CANCELLED state + """ super(AppDROP, self).cancel() self.execStatus = AppDROPStates.CANCELLED diff --git a/daliuge-runtime/dlg/manager/node_manager.py b/daliuge-runtime/dlg/manager/node_manager.py index ca334969c..2987442e3 100644 --- a/daliuge-runtime/dlg/manager/node_manager.py +++ b/daliuge-runtime/dlg/manager/node_manager.py @@ -199,7 +199,7 @@ def createSession(self, sessionId): if sessionId in self._sessions: raise SessionAlreadyExistsException(sessionId) self._sessions[sessionId] = Session(sessionId, nm=self) - logger.info('Created session %s', sessionId) + logger.info("Created session %s", sessionId) def getsession(self, sessionId): return self._sessions[sessionId] @@ -284,7 +284,7 @@ def getGraphSize(self, sessionId): def trigger_drops(self, sessionId, uids): self._check_session_id(sessionId) t = threading.Thread(target=self._sessions[sessionId].trigger_drops, - name="Drop trigger", + name='Drop trigger', args=(uids,)) t.start() From 11cbcd3b602931aeabbf9a8e2a953dbad47b48bc Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 10 Jul 2020 11:31:26 +0800 Subject: [PATCH 100/484] Fixing a typo that snuck in but halted exeuction --- daliuge-translator/dlg/dropmake/pg_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 67479ce2d..cfcbc491d 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -361,7 +361,7 @@ def is_mpi(self): return self._jd["category"] == "mpi" @property - def group_keys(self):reprodata + def group_keys(self): """ Return: None or a list of keys (each key is an integer) From b180517f426a002fb21787d62b6ab98d5562ddc7 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 10 Jul 2020 12:26:45 +0800 Subject: [PATCH 101/484] Adds REPEAT functionality (currently EXPERIMENTAL) to the lg_accumulate method. Refactors lgt_accumulate method. --- .../common/reproducibility/reproducibility.py | 87 +++++++++++++++---- 1 file changed, 72 insertions(+), 15 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 9f9c7253b..65bce3df1 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -15,7 +15,6 @@ def common_hash(value): def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): """ Accumulates relevant reproducibility fields for a single drop. - TODO: Implement alternative level functionality. :param drop: :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. @@ -25,22 +24,17 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): return data category_type = drop['categoryType'] + category = drop['category'] - data['category_type'] = category_type - data['category'] = drop['category'] + if not rmode_supported(level): + raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) - if category_type == 'Data': - data['streaming'] = drop['streaming'] - pass - elif category_type == 'Application': + if level.value >= ReproduciblityFlags.RERUN.value: + data['category_type'] = category_type + data['category'] = category + data['numInputPorts'] = len(drop['inputPorts']) + data['numOutputPorts'] = len(drop['outputPorts']) data['streaming'] = drop['streaming'] - pass - elif category_type == 'Group': - pass - elif category_type == 'Control': - pass - elif category_type == 'Other': - pass return data @@ -52,7 +46,70 @@ def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. """ - return {} + data = {} + if level == ReproduciblityFlags.NOTHING: + return data + + category_type = drop['categoryType'] + category = drop['category'] + + # Cheeky way to get field list into dicts. map(dict, drop...) makes a copy + fields = {e.pop('name'): e['value'] for e in map(dict, drop['fields'])} + + if not rmode_supported(level): + raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) + if level == ReproduciblityFlags.RERUN: + pass + elif level == ReproduciblityFlags.EXPERIMENTAL: # TODO: Change to REPEAT + if category_type == 'Application': + data['execution_time'] = fields['execution_time'] + data['num_cpus'] = fields['num_cpus'] + if category == 'BashShellApp': + data['command'] = fields['Arg01'] + elif category == 'DynlibApp': + data['libpath'] = fields['libpath'] + elif category == 'mpi': + data['num_of_procs'] = fields['num_of_procs'] + elif category == 'docker': + data['image'] = fields['image'] + data['command'] = fields['commnad'] + data['user'] = fields['user'] + data['ensureUserAndSwitch'] = fields['ensureUserAndSwitch'] + data['removeContainer'] = fields['removeContainer'] + data['additionalBindings'] = fields['additionalBindings'] + elif category == 'component': + data['appclass'] = fields['appclass'] + elif category_type == 'Data': + data['data_volume'] = fields['data_volume'] + if category == 'memory': + pass + elif category == 'file': + data['filepath'] = fields['filepath'] + data['dirname'] = fields['dirname'] + data['check_filepath_exists'] = fields['check_filepath_exists'] + elif category == 's3': + pass + elif category == 'ngas': + pass + elif category_type == 'Group': + data['exitAppName'] = drop['exitAppName'] + if category == 'GroupBy': + data['group_key'] = fields['group_key'] + data['group_axis'] = fields['group_axis'] + elif category == 'Gather': + data['num_of_inputs'] = fields['num_of_inputs'] + data['gather_axis'] = fields['gather_axis'] + elif category == 'Scatter': + data['num_of_copies'] = fields['num_of_copies'] + data['scatter_axis'] = fields['scatter_axis'] + elif category == 'Loop': + data['num_of_iter'] = fields['num_of_iter'] + elif category_type == 'Control': + pass + elif category_type == 'Other': + pass + + return data def accumulate_pgt_unroll_drop_data(drop: dict): From 3a64a54d6e477900414fb20f1c183883e39157b9 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 10 Jul 2020 13:13:28 +0800 Subject: [PATCH 102/484] Adds edges to notDAG topological sort testcase --- .../test/reproducibility/test_toposort.py | 1 - .../topoGraphs/testNotDAG.graph | 23 +++++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index 5c30109fe..cdef9ba02 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -83,7 +83,6 @@ def test_lg_blockdag_twolines(self): """ lgt = self.init_graph("topoGraphs/testTwoLines.graph") visited = lg_build_blockdag(lgt) - print(visited) self.assertTrue(visited == [-2, -3, -1, -4]) def test_lg_blockdag_notDAG(self): diff --git a/daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph b/daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph index d6c14f431..90d248fee 100644 --- a/daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph +++ b/daliuge-runtime/test/reproducibility/topoGraphs/testNotDAG.graph @@ -1,7 +1,26 @@ { - "linkDataArray": [], + "linkDataArray": [ + { + "from": -1, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -2, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -2, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -3, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + }, + { + "from": -3, + "fromPort": "a2dc769f-9745-4440-851d-c8a9f7f66720", + "to": -1, + "toPort": "e9c700b7-778e-406e-a124-c3ab86903ef6" + } + ], "modelData": { - "filePath": "testTwoLines.graph", + "filePath": "testNotDAG.graph", "fileType": "graph", "git_url": "", "repo": "", From 71ec8616005c37414e2b3f72a4078a4867f1aae6 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 10 Jul 2020 14:12:44 +0800 Subject: [PATCH 103/484] DROPs now subscribe to their inputs' reproducibility messages (as consumers). Also added for streaming consumers. Handler for reproducibility event added but is a stub. --- daliuge-runtime/dlg/drop.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 82d83519f..140770075 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -876,6 +876,9 @@ def addConsumer(self, consumer, back=True): logger.debug("Adding back %r as input of %r", self, consumer) consumer.addInput(self, False) + # Add reproduciblity subscription + self.subscribe(consumer, 'reproducibility') + @property def producers(self): """ @@ -916,6 +919,8 @@ def handleEvent(self, e): """ if e.type == 'producerFinished': self.producerFinished(e.uid, e.status) + elif e.type == 'reproducibility': + self.dropReproComplete(e.uid, e.reprodata) @track_current_drop def producerFinished(self, uid, drop_state): @@ -952,6 +957,13 @@ def producerFinished(self, uid, drop_state): else: self.setCompleted() + def dropReproComplete(self, uid, reprodata): + """ + Callback invoved when a DROP with UID `uid` has finishing processing its reproducibility information. + Importantly, this is independent of that drop being completed. + """ + # TODO: Perform some action + @property def streamingConsumers(self): """ @@ -997,6 +1009,9 @@ def addStreamingConsumer(self, streamingConsumer, back=True): if self.executionMode == ExecutionMode.DROP: self.subscribe(streamingConsumer, 'dropCompleted') + # Add reproducibility subscription + self.subscribe(streamingConsumer, 'reproducibility') + def completedrop(self): """ Builds final reproducibility data for this drop and fires a 'dropComplete' event. From 041d75f3e7f81fad0746c66581dbfff3daa4a871 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 13 Jul 2020 13:37:03 +0800 Subject: [PATCH 104/484] Adjusts graph loader to convert specified string Rmode to an enum Rflag --- daliuge-runtime/dlg/graph_loader.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index f6e2d35f2..f4ddc5c53 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -28,6 +28,8 @@ import importlib import logging +from dlg.common.reproducibility.constants import ReproduciblityFlags + from . import droputils from .apps.socket_listener import SocketListenerApp from .ddap_protocol import DROPRel, DROPLinkType @@ -230,7 +232,8 @@ def createGraphFromDropSpecList(dropSpecList, session=None): drop = cf(dropSpec, session=session) if session is not None: # Now using per-drop reproducibility setting. - drop.reproducibility_level = dropSpec['reprodata']['rmode'] # session.reprodata['rmode'] + drop.reproducibility_level = ReproduciblityFlags(int(dropSpec['reprodata']['rmode'])) + # session.reprodata['rmode'] drops[drop.oid] = drop # Step #2: establish relationships From 5e0e23da9f2d2e5dd4fd84a880feffcec7065b96 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 14 Jul 2020 13:53:54 +0800 Subject: [PATCH 105/484] Adds runtime repeat data generation. --- daliuge-runtime/dlg/drop.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 82d83519f..ffd58ea6e 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -627,7 +627,15 @@ def generate_rerun_data(self): """ Provides a serailized list of Rerun data. At runtime, Rerunning only requires execution success or failure. - :return: A list containing + :return: A list containing rerun values + """ + return [self._status] + + def generate_repeat_data(self): + """ + Provides a list of Repeat data. + At runtime, repeating, like rerunning only requires execution success or failure. + :return: A list containing runtime exclusive repetition values. """ return [self._status] From 8cca2434f70af81398a65a749cdfd5ae2d7951d8 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 14 Jul 2020 13:57:54 +0800 Subject: [PATCH 106/484] Adds REPEAT support for all times --- daliuge-common/dlg/common/reproducibility/constants.py | 1 + daliuge-runtime/dlg/drop.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index f089e5fef..d0e5f3731 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -29,6 +29,7 @@ def rmode_supported(flag: ReproduciblityFlags): """ if flag == ReproduciblityFlags.NOTHING \ or flag == ReproduciblityFlags.RERUN \ + or flag == ReproduciblityFlags.REPEAT \ or flag == ReproduciblityFlags.EXPERIMENTAL: return True else: diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index ffd58ea6e..3dcd52c9b 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -651,6 +651,8 @@ def generate_merkle_data(self): return [] elif self._reproduciblity is ReproduciblityFlags.RERUN: return self.generate_rerun_data() + elif self._reproduciblity is ReproduciblityFlags.REPEAT: + return self.generate_repeat_data() else: raise NotImplementedError("Currently other levels are not in development.") From cf24066e445abf9b17f524ea03bd0b35a4d6a503 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 14 Jul 2020 13:59:39 +0800 Subject: [PATCH 107/484] Converts dictionary value for rmode to a Reproducibility flag --- daliuge-runtime/dlg/graph_loader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index f6e2d35f2..3cc4a77b7 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -28,6 +28,8 @@ import importlib import logging +from dlg.common.reproducibility.constants import ReproduciblityFlags + from . import droputils from .apps.socket_listener import SocketListenerApp from .ddap_protocol import DROPRel, DROPLinkType @@ -230,7 +232,7 @@ def createGraphFromDropSpecList(dropSpecList, session=None): drop = cf(dropSpec, session=session) if session is not None: # Now using per-drop reproducibility setting. - drop.reproducibility_level = dropSpec['reprodata']['rmode'] # session.reprodata['rmode'] + drop.reproducibility_level = ReproduciblityFlags(int(dropSpec['reprodata']['rmode'])) # session.reprodata['rmode'] drops[drop.oid] = drop # Step #2: establish relationships From dc11753bea267c619aa85f7b884e2552d93ea2b9 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 16 Jul 2020 13:46:15 +0800 Subject: [PATCH 108/484] Fixes simple typo from other branch --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 16e38ae4a..832a089be 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -373,7 +373,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for n in neighbourset[did]: dropset[n][1] -= 1 # Add our new hash to the parest-hash list - parenthash = dropset[did][0]['reprodata'][blockstr] + parenthash = dropset[did][0]['reprodata'][parentstr] dropset[n][0]['reprodata'][parentstr].append(parenthash) if dropset[n][1] == 0: q.append(n) From 2bf62430d1e5f78c850993c61d4beb99b761b25f Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 16 Jul 2020 15:37:19 +0800 Subject: [PATCH 109/484] Changes _LGTemplate delimiter to '~' since '%' is often used when piping --- daliuge-translator/dlg/dropmake/pg_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 11109d2c6..e90a0e291 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -2592,7 +2592,7 @@ def reprodata(self): class _LGTemplate(string.Template): - delimiter = "%" + delimiter = "~" idpattern = r"[_a-z][_a-z0-9\.]*" From 2c7cabc1294efa08fb1232c3dbbad1561c5259fc Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 16 Jul 2020 16:25:05 +0800 Subject: [PATCH 110/484] Adds leaf nodes to merkle data --- .../common/reproducibility/reproducibility.py | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 832a089be..633152446 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -285,6 +285,7 @@ def lg_build_blockdag(lg: dict): from collections import deque dropset = {} # Also contains in-degree information neighbourset = {} + leaves = [] visited = 0 q = deque() @@ -303,6 +304,8 @@ def lg_build_blockdag(lg: dict): for did in dropset: if dropset[did][1] == 0: q.append(did) + if not neighbourset[did]: # Leaf node + leaves.append(did) while q: did = q.pop() @@ -322,6 +325,11 @@ def lg_build_blockdag(lg: dict): logger.info("BlockDAG Generated at LG/T level") + for i in range(len(leaves)): + leaf = leaves[i] + leaves[i] = dropset[leaf][0]['reprodata']['lg_blockhash'] + return leaves + def build_blockdag(drops: list, abstraction: str = 'pgt'): """ @@ -344,6 +352,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): from collections import deque dropset = {} neighbourset = {} + leaves = [] visited = 0 q = deque() @@ -365,6 +374,8 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for did in dropset: if dropset[did][1] == 0: q.append(did) + if not neighbourset[did]: # Leaf node + leaves.append(did) while q: did = q.pop() @@ -381,6 +392,11 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): if visited != len(dropset): raise Exception("Not a DAG") + for i in range(len(leaves)): + leaf = leaves[i] + leaves[i] = dropset[leaf][0]['reprodata'][blockstr + '_blockhash'] + return leaves + # logger.info("BlockDAG Generated at" + abstraction + " level") @@ -416,7 +432,8 @@ def init_lg_repro_data(lg: dict): """ for drop in lg['nodeDataArray']: init_lg_repro_drop_data(drop) - lg_build_blockdag(lg) + leaves = lg_build_blockdag(lg) + lg['reprodata']['leaves'] = leaves logger.info("Reproducibility data finished at LG level") return lg @@ -430,7 +447,8 @@ def init_pgt_unroll_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_unroll_repro_drop_data(drop) - build_blockdag(pgt, 'pgt') + leaves = build_blockdag(pgt, 'pgt') + reprodata['leaves'] = leaves pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") return pgt @@ -445,7 +463,8 @@ def init_pgt_partition_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_partition_repro_drop_data(drop) - build_blockdag(pgt, 'pgt') + leaves = build_blockdag(pgt, 'pgt') + reprodata['leaves'] = leaves pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") return pgt @@ -465,7 +484,8 @@ def init_pg_repro_data(pg: list): reprodata["rmode"] = str(rmode.value) for drop in pg: init_pg_repro_drop_data(drop) - build_blockdag(pg, 'pg') + leaves = build_blockdag(pg, 'pg') + reprodata['leaves'] = leaves pg.append(reprodata) logger.info("Reproducibility data finished at PG level") return pg @@ -486,7 +506,8 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): reprodata["rmode"] = str(rmode.value) for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) - build_blockdag(list(pg.values()), 'pg') + leaves = build_blockdag(list(pg.values()), 'pg') + reprodata['leaves'] = leaves pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") return pg From d9cf1abcd3c9cbf9c0ec97072f83d5447cfaae47 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 17 Jul 2020 16:00:43 +0800 Subject: [PATCH 111/484] Fixes typo in Reproducibility/Constants.py --- .../dlg/common/reproducibility/constants.py | 12 +++++----- .../common/reproducibility/reproducibility.py | 16 +++++++------- daliuge-runtime/dlg/drop.py | 8 +++---- daliuge-runtime/dlg/graph_loader.py | 2 -- .../reproducibility/test_accumulatedata.py | 4 ++-- .../test/reproducibility/test_drophash.py | 22 +++++++++---------- 6 files changed, 31 insertions(+), 33 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index f089e5fef..908c2b307 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -4,7 +4,7 @@ PROTOCOL_VERSION = 0.1 -class ReproduciblityFlags(Enum): +class ReproducibilityFlags(Enum): NOTHING = 0 RERUN = 1 REPEAT = 2 @@ -14,11 +14,11 @@ class ReproduciblityFlags(Enum): EXPERIMENTAL = 6 -REPRO_DEFAULT = ReproduciblityFlags.NOTHING +REPRO_DEFAULT = ReproducibilityFlags.NOTHING HASHING_ALG = hashlib.sha3_256 -def rmode_supported(flag: ReproduciblityFlags): +def rmode_supported(flag: ReproducibilityFlags): """ Determines in a given flag is currently supported. A slightly pedantic solution but it does centralize the process. @@ -27,9 +27,9 @@ def rmode_supported(flag: ReproduciblityFlags): :param flag: A ReproducibilityFlag enum being queried :return: True if supported, False otherwise """ - if flag == ReproduciblityFlags.NOTHING \ - or flag == ReproduciblityFlags.RERUN \ - or flag == ReproduciblityFlags.EXPERIMENTAL: + if flag == ReproducibilityFlags.NOTHING \ + or flag == ReproducibilityFlags.RERUN \ + or flag == ReproducibilityFlags.EXPERIMENTAL: return True else: return False diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 633152446..cab448197 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -1,6 +1,6 @@ import logging -from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ +from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ rmode_supported from merklelib import MerkleTree @@ -12,7 +12,7 @@ def common_hash(value): # ------ Drop-Based Functionality ------ -def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_lgt_drop_data(drop: dict, level: ReproducibilityFlags): """ Accumulates relevant reproducibility fields for a single drop. TODO: Implement alternative level functionality. @@ -21,7 +21,7 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - if level == ReproduciblityFlags.NOTHING: + if level == ReproducibilityFlags.NOTHING: return data category_type = drop['categoryType'] @@ -44,7 +44,7 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproduciblityFlags): return data -def accumulate_lg_drop_data(drop: dict, level: ReproduciblityFlags): +def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): """ Accumulates relevant reproducibility fields for a single drop. TODO: Implement alternative level functionality. @@ -68,7 +68,7 @@ def accumulate_pgt_unroll_drop_data(drop: dict): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT drop['reprodata']["rmode"] = str(rmode.value) - if rmode == ReproduciblityFlags.NOTHING: + if rmode == ReproducibilityFlags.NOTHING: return data data["type"] = drop["type"] data["rank"] = drop["rank"] @@ -94,7 +94,7 @@ def accumulate_pgt_partition_drop_data(drop: dict): data = accumulate_pgt_unroll_drop_data(drop) # This is the only piece of new information added at the partition level # It is only pertinent to Repetition and Computational replication - if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: + if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP: data["node"] = drop["node"][1:] data["island"] = drop["island"][1:] return data @@ -113,13 +113,13 @@ def accumulate_pg_drop_data(drop: dict): rmode = REPRO_DEFAULT drop['reprodata']["rmode"] = str(rmode.value) data = {} - if rmode == ReproduciblityFlags.REPEAT or rmode == ReproduciblityFlags.REPLICATE_COMP: + if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP: data['node'] = drop['node'] data['island'] = drop['island'] return data -def init_lgt_repro_drop_data(drop: dict, level: ReproduciblityFlags): +def init_lgt_repro_drop_data(drop: dict, level: ReproducibilityFlags): """ Creates and appends per-drop reproducibility information at the logical template stage. :param drop: diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 3b0f95e29..0905bbfbe 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -41,7 +41,7 @@ from abc import ABCMeta, abstractmethod import six -from dlg.common.reproducibility.constants import ReproduciblityFlags, REPRO_DEFAULT, rmode_supported, HASHING_ALG +from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, rmode_supported, HASHING_ALG from merklelib import MerkleTree from six import BytesIO @@ -610,7 +610,7 @@ def reproducibility_level(self): @reproducibility_level.setter def reproducibility_level(self, new_flag): - if type(new_flag) != ReproduciblityFlags: + if type(new_flag) != ReproducibilityFlags: raise TypeError("new_flag must be a Reproduciblity flag enum.") elif rmode_supported(new_flag): # TODO: Support custom checkers for repro-level if self._committed: @@ -639,9 +639,9 @@ def generate_merkle_data(self): Some of these are abstract. :return: A list of elements constituting a summary of this drop """ - if self._reproduciblity is ReproduciblityFlags.NOTHING: + if self._reproduciblity is ReproducibilityFlags.NOTHING: return [] - elif self._reproduciblity is ReproduciblityFlags.RERUN: + elif self._reproduciblity is ReproducibilityFlags.RERUN: return self.generate_rerun_data() else: raise NotImplementedError("Currently other levels are not in development.") diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index f4ddc5c53..86d1de405 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -28,8 +28,6 @@ import importlib import logging -from dlg.common.reproducibility.constants import ReproduciblityFlags - from . import droputils from .apps.socket_listener import SocketListenerApp from .ddap_protocol import DROPRel, DROPLinkType diff --git a/daliuge-runtime/test/reproducibility/test_accumulatedata.py b/daliuge-runtime/test/reproducibility/test_accumulatedata.py index 2ca999c15..f7389b39b 100644 --- a/daliuge-runtime/test/reproducibility/test_accumulatedata.py +++ b/daliuge-runtime/test/reproducibility/test_accumulatedata.py @@ -1,7 +1,7 @@ import json import unittest -from dlg.common.reproducibility.constants import ReproduciblityFlags +from dlg.common.reproducibility.constants import ReproducibilityFlags from dlg.common.reproducibility.reproducibility import accumulate_lgt_drop_data @@ -19,7 +19,7 @@ def test_app_accumulate(self): app_hashes = [] for i in range(5): app = node_data[i] - hash_data = accumulate_lgt_drop_data(app, ReproduciblityFlags.RERUN) + hash_data = accumulate_lgt_drop_data(app, ReproducibilityFlags.RERUN) print(hash_data) #app_hashes.append(HASHING_ALG(hash_data).hexdigest())) fp.close() diff --git a/daliuge-runtime/test/reproducibility/test_drophash.py b/daliuge-runtime/test/reproducibility/test_drophash.py index e568adf27..2cc001285 100644 --- a/daliuge-runtime/test/reproducibility/test_drophash.py +++ b/daliuge-runtime/test/reproducibility/test_drophash.py @@ -25,7 +25,7 @@ import unittest -from dlg.common.reproducibility.constants import ReproduciblityFlags +from dlg.common.reproducibility.constants import ReproducibilityFlags from dlg.ddap_protocol import DROPStates from dlg.drop import AbstractDROP, drop_hash from merklelib import MerkleTree @@ -45,7 +45,7 @@ def test_generate_rerun_data(self): Tests that completed Rerun data contains the completed flag. """ a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproduciblityFlags.RERUN + a.reproducibility_level = ReproducibilityFlags.RERUN a.setCompleted() self.assertTrue(a.generate_rerun_data(), [DROPStates.COMPLETED]) @@ -54,9 +54,9 @@ def test_unimplemented_flags(self): Asserts that unimplemented but planned functionality is handled accordingly. """ a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproduciblityFlags.RERUN + a.reproducibility_level = ReproducibilityFlags.RERUN with self.assertRaises(NotImplementedError): - a.reproducibility_level = ReproduciblityFlags.REPEAT + a.reproducibility_level = ReproducibilityFlags.REPEAT a.generate_merkle_data() def test_commit_on_complete(self): @@ -66,8 +66,8 @@ def test_commit_on_complete(self): a = AbstractDROP('a', 'a') b = AbstractDROP('b', 'b') - a.reproducibility_level = ReproduciblityFlags.RERUN - b.reproducibility_level = ReproduciblityFlags.NOTHING + a.reproducibility_level = ReproducibilityFlags.RERUN + b.reproducibility_level = ReproducibilityFlags.NOTHING self.assertIsNone(a.merkleroot) self.assertIsNone(b.merkleroot) @@ -88,7 +88,7 @@ def test_recommit(self): Should raise an exception preventing a straight-recommit. """ a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproduciblityFlags.RERUN + a.reproducibility_level = ReproducibilityFlags.RERUN a.setCompleted() with self.assertRaises(Exception): a.commit() @@ -101,17 +101,17 @@ def test_set_reproducibility_level(self): """ a = AbstractDROP('a', 'a') b = AbstractDROP('b', 'b') - a.reproducibility_level = ReproduciblityFlags.NOTHING - b.reproducibility_level = ReproduciblityFlags.NOTHING + a.reproducibility_level = ReproducibilityFlags.NOTHING + b.reproducibility_level = ReproducibilityFlags.NOTHING a.setCompleted() self.assertIsNone(a.merkleroot) - a.reproducibility_level = ReproduciblityFlags.RERUN + a.reproducibility_level = ReproducibilityFlags.RERUN a.commit() self.assertIsNotNone(a.merkleroot) self.assertIsNone(b.merkleroot) - b.reproducibility_level = ReproduciblityFlags.RERUN + b.reproducibility_level = ReproducibilityFlags.RERUN b.setCompleted() self.assertIsNotNone(b.merkleroot) From 92d72034699255843435f01b7041e65287acd4ff Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 17 Jul 2020 16:32:50 +0800 Subject: [PATCH 112/484] Fixes typo --- .../dlg/common/reproducibility/reproducibility.py | 14 +++++++------- daliuge-runtime/dlg/graph_loader.py | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index cab448197..0ba453c11 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -63,7 +63,7 @@ def accumulate_pgt_unroll_drop_data(drop: dict): :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproducibilityFlags(int(drop['reprodata']["rmode"])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -86,7 +86,7 @@ def accumulate_pgt_partition_drop_data(drop: dict): :param drop: :return: """ - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproducibilityFlags(int(drop['reprodata']["rmode"])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -107,7 +107,7 @@ def accumulate_pg_drop_data(drop: dict): :param drop: :return: A dictionary containing accumulated reproducibility data for a given drop. """ - rmode = ReproduciblityFlags(int(drop['reprodata']["rmode"])) + rmode = ReproducibilityFlags(int(drop['reprodata']["rmode"])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -143,7 +143,7 @@ def init_lg_repro_drop_data(drop: dict): :param drop: :return: The same drop with appended reproducibility information """ - rmode = ReproduciblityFlags(int(drop['reprodata']['rmode'])) + rmode = ReproducibilityFlags(int(drop['reprodata']['rmode'])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -409,7 +409,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended """ - rmode = ReproduciblityFlags(int(rmode)) + rmode = ReproducibilityFlags(int(rmode)) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -477,7 +477,7 @@ def init_pg_repro_data(pg: list): :return: The same pg object with new information appended """ reprodata = pg.pop() - rmode = ReproduciblityFlags(int(reprodata["rmode"])) + rmode = ReproducibilityFlags(int(reprodata["rmode"])) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -498,7 +498,7 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): :param reprodata: :return: """ - rmode = ReproduciblityFlags(int(reprodata["rmode"])) + rmode = ReproducibilityFlags(int(reprodata["rmode"])) if not rmode_supported(rmode): # TODO: Logging needs sessionID at this stage # logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index 86d1de405..8027dbec1 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -28,6 +28,8 @@ import importlib import logging +from dlg.common.reproducibility.constants import ReproducibilityFlags + from . import droputils from .apps.socket_listener import SocketListenerApp from .ddap_protocol import DROPRel, DROPLinkType @@ -230,7 +232,7 @@ def createGraphFromDropSpecList(dropSpecList, session=None): drop = cf(dropSpec, session=session) if session is not None: # Now using per-drop reproducibility setting. - drop.reproducibility_level = ReproduciblityFlags(int(dropSpec['reprodata']['rmode'])) + drop.reproducibility_level = ReproducibilityFlags(int(dropSpec['reprodata']['rmode'])) # session.reprodata['rmode'] drops[drop.oid] = drop From b9b701cf68c7340276d2aeeeadd1230806c0e13d Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 20 Jul 2020 14:56:41 +0800 Subject: [PATCH 113/484] Fixes typo --- daliuge-translator/dlg/dropmake/pg_generator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/dropmake/pg_generator.py b/daliuge-translator/dlg/dropmake/pg_generator.py index 000ca44e3..b24fffca1 100644 --- a/daliuge-translator/dlg/dropmake/pg_generator.py +++ b/daliuge-translator/dlg/dropmake/pg_generator.py @@ -361,7 +361,7 @@ def is_mpi(self): return self._jd["category"] == "mpi" @property - def group_keys(self):reprodata + def group_keys(self): """ Return: None or a list of keys (each key is an integer) From fe14f99423e71d5ed5210809db05380b86e00d40 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 27 Jul 2020 12:59:54 +0800 Subject: [PATCH 114/484] Importing typing.re --- daliuge-runtime/dlg/drop.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 4f390f21a..87874c3cb 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -22,7 +22,7 @@ """ Module containing the core DROP classes. """ - +import re from abc import ABCMeta, abstractmethod import base64 import collections From 3b3e1fbcb4420da5d523be3c280514f43d847ac4 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 30 Jul 2020 13:55:15 +0800 Subject: [PATCH 115/484] Adds leaf agglomeration function --- .../dlg/common/reproducibility/reproducibility.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 219f036bc..493869bce 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -456,6 +456,15 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): # logger.info("BlockDAG Generated at" + abstraction + " level") +def agglomerate_leaves(leaves: list): + """ + Inserts all hash values in `leaves` into a merkleTree in sorted order (ascending). + Returns the root of this tree + """ + merkletree = MerkleTree(sorted(leaves)) + return merkletree.merkle_root + + def init_lgt_repro_data(lgt: dict, rmode: str): """ Creates and appends graph-wide reproducibility data at the logical template stage. From f9f223bb38d4f9eac7ee5fdf6d662e9d969a47ee Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 30 Jul 2020 13:58:55 +0800 Subject: [PATCH 116/484] Renames 'leaves' to 'signature' indicating the finality of the collected leaf hashes. --- .../common/reproducibility/reproducibility.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 493869bce..a3ba54002 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -29,7 +29,7 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproducibilityFlags): if not rmode_supported(level): raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) - if level.value >= ReproduciblityFlags.RERUN.value: + if level.value >= ReproducibilityFlags.RERUN.value: data['category_type'] = category_type data['category'] = category data['numInputPorts'] = len(drop['inputPorts']) @@ -47,7 +47,7 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - if level == ReproduciblityFlags.NOTHING: + if level == ReproducibilityFlags.NOTHING: return data category_type = drop['categoryType'] @@ -58,9 +58,9 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): if not rmode_supported(level): raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) - if level == ReproduciblityFlags.RERUN: + if level == ReproducibilityFlags.RERUN: pass - elif level == ReproduciblityFlags.EXPERIMENTAL: # TODO: Change to REPEAT + elif level == ReproducibilityFlags.EXPERIMENTAL: # TODO: Change to REPEAT if category_type == 'Application': data['execution_time'] = fields['execution_time'] data['num_cpus'] = fields['num_cpus'] @@ -498,7 +498,7 @@ def init_lg_repro_data(lg: dict): for drop in lg['nodeDataArray']: init_lg_repro_drop_data(drop) leaves = lg_build_blockdag(lg) - lg['reprodata']['leaves'] = leaves + lg['reprodata']['signature'] = agglomerate_leaves(leaves) logger.info("Reproducibility data finished at LG level") return lg @@ -513,7 +513,7 @@ def init_pgt_unroll_repro_data(pgt: list): for drop in pgt: init_pgt_unroll_repro_drop_data(drop) leaves = build_blockdag(pgt, 'pgt') - reprodata['leaves'] = leaves + reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") return pgt @@ -529,7 +529,7 @@ def init_pgt_partition_repro_data(pgt: list): for drop in pgt: init_pgt_partition_repro_drop_data(drop) leaves = build_blockdag(pgt, 'pgt') - reprodata['leaves'] = leaves + reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") return pgt @@ -550,7 +550,7 @@ def init_pg_repro_data(pg: list): for drop in pg: init_pg_repro_drop_data(drop) leaves = build_blockdag(pg, 'pg') - reprodata['leaves'] = leaves + reprodata['signature'] = agglomerate_leaves(leaves) pg.append(reprodata) logger.info("Reproducibility data finished at PG level") return pg @@ -572,7 +572,7 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) leaves = build_blockdag(list(pg.values()), 'pg') - reprodata['leaves'] = leaves + reprodata['signature'] = agglomerate_leaves(leaves) pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") return pg From 1274154449eb2342dd18e89caa50aa94a16526a9 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 3 Aug 2020 13:28:45 +0800 Subject: [PATCH 117/484] Adds 'Reproduce' constant --- daliuge-common/dlg/common/reproducibility/constants.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 908c2b307..32041c8c8 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -29,6 +29,7 @@ def rmode_supported(flag: ReproducibilityFlags): """ if flag == ReproducibilityFlags.NOTHING \ or flag == ReproducibilityFlags.RERUN \ + or flag == ReproducibilityFlags.REPRODUCE \ or flag == ReproducibilityFlags.EXPERIMENTAL: return True else: From b82f5bddc074b6246fa03d5f259bf7951dd45d16 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 3 Aug 2020 13:38:20 +0800 Subject: [PATCH 118/484] Adds Reproduce to accumulate_lgt_drop_dat Adds other TODOs critical for Repetition that were missed before. --- .../dlg/common/reproducibility/reproducibility.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index a3ba54002..4dfcfa471 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -29,6 +29,11 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproducibilityFlags): if not rmode_supported(level): raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) + if level == ReproducibilityFlags.REPRODUCE: + data['category_type'] = category_type + data['category'] = category + return data # Early return to avoid next conditional + if level.value >= ReproducibilityFlags.RERUN.value: data['category_type'] = category_type data['category'] = category @@ -91,6 +96,7 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): pass elif category == 'ngas': pass + # TODO: Add NULL and JSON cases elif category_type == 'Group': data['exitAppName'] = drop['exitAppName'] if category == 'GroupBy': @@ -108,6 +114,8 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): pass elif category_type == 'Other': pass + elif level == ReproducibilityFlags.REPRODUCE: + pass return data @@ -127,6 +135,7 @@ def accumulate_pgt_unroll_drop_data(drop: dict): drop['reprodata']['rmode'] = str(rmode.value) if rmode == ReproducibilityFlags.NOTHING: return data + # TODO: Consider adding more conditionals data['type'] = drop['type'] data['rank'] = drop['rank'] if data['type'] == 'plain': From 76170a3ab09e180f9ff7c6e75f09b2b5a615093e Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 6 Aug 2020 13:08:21 +0800 Subject: [PATCH 119/484] Somehow 'reproduciblity' snuck back in again... --- daliuge-runtime/dlg/drop.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 202a945b4..3d7af4685 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -238,7 +238,7 @@ def __init__(self, oid, uid, **kwargs): self._merkleRoot = None self._merkleTree = None self._merkleData = [] - self._reproduciblity = REPRO_DEFAULT + self._reproducibility = REPRO_DEFAULT # The DataIO instance we use in our write method. It's initialized to # None because it's lazily initialized in the write method, since data @@ -604,12 +604,12 @@ def merkleroot(self): @property def reproducibility_level(self): - return self._reproduciblity + return self._reproducibility @reproducibility_level.setter def reproducibility_level(self, new_flag): if type(new_flag) != ReproducibilityFlags: - raise TypeError("new_flag must be a Reproduciblity flag enum.") + raise TypeError("new_flag must be a reproducibility flag enum.") elif rmode_supported(new_flag): # TODO: Support custom checkers for repro-level if self._committed: # Current behaviour, set to un-committed again after change @@ -617,7 +617,7 @@ def reproducibility_level(self, new_flag): self._merkleRoot = None self._merkleTree = None self._merkleData = [] - self._reproduciblity = new_flag + self._reproducibility = new_flag else: raise NotImplementedError("new_flag %d is not supported", new_flag.value) @@ -645,11 +645,11 @@ def generate_merkle_data(self): Some of these are abstract. :return: A list of elements constituting a summary of this drop """ - if self._reproduciblity is ReproducibilityFlags.NOTHING: + if self._reproducibility is ReproducibilityFlags.NOTHING: return [] - elif self._reproduciblity is ReproducibilityFlags.RERUN: + elif self._reproducibility is ReproducibilityFlags.RERUN: return self.generate_rerun_data() - elif self._reproduciblity is ReproduciblityFlags.REPEAT: + elif self._reproducibility is ReproducibilityFlags.REPEAT: return self.generate_repeat_data() else: raise NotImplementedError("Currently other levels are not in development.") @@ -884,7 +884,7 @@ def addConsumer(self, consumer, back=True): logger.debug("Adding back %r as input of %r", self, consumer) consumer.addInput(self, False) - # Add reproduciblity subscription + # Add reproducibility subscription self.subscribe(consumer, 'reproducibility') @property From 8c1bc3f2d26ec29d7fa674297d6d1c51235df945 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 6 Aug 2020 13:08:40 +0800 Subject: [PATCH 120/484] Changes EXPERIMENTAL to REPEAT --- daliuge-common/dlg/common/reproducibility/constants.py | 1 + daliuge-common/dlg/common/reproducibility/reproducibility.py | 5 +---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 908c2b307..9d5875799 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -29,6 +29,7 @@ def rmode_supported(flag: ReproducibilityFlags): """ if flag == ReproducibilityFlags.NOTHING \ or flag == ReproducibilityFlags.RERUN \ + or flag == ReproducibilityFlags.REPEAT \ or flag == ReproducibilityFlags.EXPERIMENTAL: return True else: diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index a3ba54002..8167b7780 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -41,7 +41,6 @@ def accumulate_lgt_drop_data(drop: dict, level: ReproducibilityFlags): def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): """ Accumulates relevant reproducibility fields for a single drop. - TODO: Implement alternative level functionality. :param drop: :param level: :return: A dictionary containing accumulated reproducibility data for a given drop. @@ -60,7 +59,7 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) if level == ReproducibilityFlags.RERUN: pass - elif level == ReproducibilityFlags.EXPERIMENTAL: # TODO: Change to REPEAT + elif level == ReproducibilityFlags.REPEAT: if category_type == 'Application': data['execution_time'] = fields['execution_time'] data['num_cpus'] = fields['num_cpus'] @@ -115,7 +114,6 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): def accumulate_pgt_unroll_drop_data(drop: dict): """ Accumulates relevant reproducibility fields for a single drop at the physical template level. - TODO: Implement alternative level functionality. :param drop: :return: A dictionary containing accumulated reproducibility data for a given drop. """ @@ -160,7 +158,6 @@ def accumulate_pgt_partition_drop_data(drop: dict): def accumulate_pg_drop_data(drop: dict): """ Accumulate relevant reproducibility fields for a single drop at the physical graph level. - TODO: Implement alternative level functionality. :param drop: :return: A dictionary containing accumulated reproducibility data for a given drop. """ From 4881d17c255be355983f838da9f9fffc61fd6331 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 6 Aug 2020 13:22:28 +0800 Subject: [PATCH 121/484] Adds support for new DALiuGE Drop Categories. Adds support for NULL and JSON drops (boilerplate) in Repeat accumulate --- .../common/reproducibility/reproducibility.py | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 8167b7780..1a5e706c8 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -2,6 +2,7 @@ from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ rmode_supported +from .. import Categories from merklelib import MerkleTree logger = logging.getLogger(__name__) @@ -63,45 +64,49 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): if category_type == 'Application': data['execution_time'] = fields['execution_time'] data['num_cpus'] = fields['num_cpus'] - if category == 'BashShellApp': + if category == Categories.BASH_SHELL_APP: data['command'] = fields['Arg01'] - elif category == 'DynlibApp': + elif category == Categories.DYNLIB_APP: # TODO: Deal with DYNLIB_PROC data['libpath'] = fields['libpath'] - elif category == 'mpi': + elif category == Categories.MPI: data['num_of_procs'] = fields['num_of_procs'] - elif category == 'docker': + elif category == Categories.DOCKER: data['image'] = fields['image'] data['command'] = fields['commnad'] data['user'] = fields['user'] data['ensureUserAndSwitch'] = fields['ensureUserAndSwitch'] data['removeContainer'] = fields['removeContainer'] data['additionalBindings'] = fields['additionalBindings'] - elif category == 'component': + elif category == Categories.COMPONENT: data['appclass'] = fields['appclass'] - elif category_type == 'Data': + elif category_type == Categories.DATA: data['data_volume'] = fields['data_volume'] - if category == 'memory': + if category == Categories.MEMORY: pass - elif category == 'file': + elif category == Categories.FILE: data['filepath'] = fields['filepath'] data['dirname'] = fields['dirname'] data['check_filepath_exists'] = fields['check_filepath_exists'] - elif category == 's3': + elif category == Categories.S3: pass - elif category == 'ngas': + elif category == Categories.NGAS: + pass + elif category == Categories.JSON: + pass + elif category == Categories.NULL: pass elif category_type == 'Group': data['exitAppName'] = drop['exitAppName'] - if category == 'GroupBy': + if category == Categories.GROUP_BY: data['group_key'] = fields['group_key'] data['group_axis'] = fields['group_axis'] - elif category == 'Gather': + elif category == Categories.GATHER: data['num_of_inputs'] = fields['num_of_inputs'] data['gather_axis'] = fields['gather_axis'] - elif category == 'Scatter': + elif category == Categories.SCATTER: data['num_of_copies'] = fields['num_of_copies'] data['scatter_axis'] = fields['scatter_axis'] - elif category == 'Loop': + elif category == Categories.LOOP: data['num_of_iter'] = fields['num_of_iter'] elif category_type == 'Control': pass From 346d10fca7a7998c63c34eb436cfaaba8f6ca933 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 6 Aug 2020 13:35:53 +0800 Subject: [PATCH 122/484] Adds condition to accumulate_pgt_unroll_drop_data for varying reproducibility level support. --- .../dlg/common/reproducibility/reproducibility.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 1a5e706c8..f42699a0c 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -130,12 +130,13 @@ def accumulate_pgt_unroll_drop_data(drop: dict): drop['reprodata']['rmode'] = str(rmode.value) if rmode == ReproducibilityFlags.NOTHING: return data - data['type'] = drop['type'] - data['rank'] = drop['rank'] - if data['type'] == 'plain': - data['storage'] = drop['storage'] - else: - data['app'] = drop['app'] + if rmode == ReproducibilityFlags.value >= ReproducibilityFlags.RERUN.value: + data['type'] = drop['type'] + data['rank'] = drop['rank'] + if data['type'] == 'plain': + data['storage'] = drop['storage'] + else: + data['app'] = drop['app'] return data From f5ed210c0fb29340fa09eace801907f44d8468d4 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 10 Aug 2020 13:27:35 +0800 Subject: [PATCH 123/484] Adds reproducibility behaviour for data-graph-minor blockdag generation --- .../common/reproducibility/reproducibility.py | 61 +++++++++++++++---- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index f4167801f..8835ea8fc 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -100,7 +100,6 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): pass elif category == Categories.NULL: pass - # TODO: Add NULL and JSON cases elif category_type == 'Group': data['exitAppName'] = drop['exitAppName'] if category == Categories.GROUP_BY: @@ -138,7 +137,7 @@ def accumulate_pgt_unroll_drop_data(drop: dict): drop['reprodata']['rmode'] = str(rmode.value) if rmode == ReproducibilityFlags.NOTHING: return data - if rmode == ReproducibilityFlags.value >= ReproducibilityFlags.RERUN.value: + if rmode.value >= ReproducibilityFlags.RERUN.value: data['type'] = drop['type'] data['rank'] = drop['rank'] if data['type'] == 'plain': @@ -201,7 +200,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproducibilityFlags): merkledata.append(temp) merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root - drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': []} + drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': set()} return drop @@ -224,7 +223,7 @@ def init_lg_repro_drop_data(drop: dict): merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata']['lg_data'] = data - drop['reprodata']['lg_parenthashes'] = [] + drop['reprodata']['lg_parenthashes'] = set() return drop @@ -236,7 +235,7 @@ def append_pgt_repro_data(drop: dict, data: dict): merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) - drop['reprodata']['pgt_parenthashes'] = [] + drop['reprodata']['pgt_parenthashes'] = set() drop['reprodata']['pgt_data'] = data return drop @@ -277,7 +276,7 @@ def init_pg_repro_drop_data(drop: dict): merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) - drop['reprodata']['pg_parenthashes'] = [] + drop['reprodata']['pg_parenthashes'] = set() drop['reprodata']['pg_data'] = data return drop @@ -381,9 +380,20 @@ def lg_build_blockdag(lg: dict): visited.append(did) for n in neighbourset[did]: dropset[n][1] -= 1 - # Add our new hash to the parent-hash list - parenthash = dropset[did][0]['reprodata']['lg_blockhash'] - dropset[n][0]['reprodata']['lg_parenthashes'].append(parenthash) + parenthash = set() + rmode = dropset[did][0]['reprodata']['rmode'] + if rmode == ReproducibilityFlags.REPRODUCE or \ + rmode == ReproducibilityFlags.REPLICATE_COMP or \ + rmode == ReproducibilityFlags.REPLICATE_SCI: + if dropset[did][0]['categoryType'] == Categories.DATA: + # Add my hash into the child's parenthashes + parenthash.add(dropset[did][0]['reprodata']['lg_blockhash']) + else: + # Add my parenthashes into the child's parenthashes + parenthash.update(dropset[did][0]['reprodata']['lg_parenthashes']) + else: + parenthash.add(dropset[did][0]['reprodata']['lg_blockhash']) + dropset[n][0]['reprodata']['lg_parenthashes'].update(parenthash) if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) @@ -450,9 +460,21 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): visited += 1 for n in neighbourset[did]: dropset[n][1] -= 1 - # Add our new hash to the parest-hash list - parenthash = dropset[did][0]['reprodata'][parentstr] - dropset[n][0]['reprodata'][parentstr].append(parenthash) + parenthash = set() + rmode = dropset[did][0]['reprodata']['rmode'] + if rmode == ReproducibilityFlags.REPRODUCE or \ + rmode == ReproducibilityFlags.REPLICATE_COMP or \ + rmode == ReproducibilityFlags.REPLICATE_SCI: + if dropset[did][0]['categoryType'] == Categories.DATA: + # Add my hash into the child's parenthashes + parenthash.add(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) + else: + # Add my parenthashes into the child's parenthashes + parenthash.update(dropset[did][0]['reprodata'][parentstr]) + else: + # Add my parenthashes into the child's parenthashes + parenthash.update(dropset[did][0]['reprodata'][parentstr]) + dropset[n][0]['reprodata'][parentstr].update(parenthash) if dropset[n][1] == 0: q.append(n) @@ -509,6 +531,9 @@ def init_lg_repro_data(lg: dict): for drop in lg['nodeDataArray']: init_lg_repro_drop_data(drop) leaves = lg_build_blockdag(lg) + for drop in lg['nodeDataArray']: + # Convert parenthash set into sorted list for JSON serialization + drop['reprodata']['lg_parenthashes'] = sorted(list(drop['reprodata']['lg_parenthashes'])) lg['reprodata']['signature'] = agglomerate_leaves(leaves) logger.info("Reproducibility data finished at LG level") return lg @@ -524,6 +549,9 @@ def init_pgt_unroll_repro_data(pgt: list): for drop in pgt: init_pgt_unroll_repro_drop_data(drop) leaves = build_blockdag(pgt, 'pgt') + for drop in pgt: + # Convert parenthash set into sorted list for JSON serialization + drop['reprodata']['pgt_parenthashes'] = sorted(list(drop['reprodata']['pgt_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") @@ -540,6 +568,9 @@ def init_pgt_partition_repro_data(pgt: list): for drop in pgt: init_pgt_partition_repro_drop_data(drop) leaves = build_blockdag(pgt, 'pgt') + for drop in pgt: + # Convert parenthash set into sorted list for JSON serialization + drop['reprodata']['pgt_parenthashes'] = sorted(list(drop['reprodata']['pgt_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") @@ -561,6 +592,9 @@ def init_pg_repro_data(pg: list): for drop in pg: init_pg_repro_drop_data(drop) leaves = build_blockdag(pg, 'pg') + for drop in pg: + # Convert parenthash set into sorted list for JSON serialization + drop['reprodata']['pg_parenthashes'] = sorted(list(drop['reprodata']['pg_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pg.append(reprodata) logger.info("Reproducibility data finished at PG level") @@ -583,6 +617,9 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) leaves = build_blockdag(list(pg.values()), 'pg') + for drop in pg.items(): + # Convert parenthash set into sorted list for JSON serialization + drop[1]['reprodata']['pg_parenthashes'] = sorted(list(drop[1]['reprodata']['pg_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") From 68f30a5d75d21c6116e9eca998fb8eca4182a1d4 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Mon, 10 Aug 2020 13:54:44 +0800 Subject: [PATCH 124/484] Changes implementation of blockdag generation on the data-graph-minor Instead we remove duplicate values at the block-building stage. Also fixes a pgt/pg blockdag parenthash appending bug --- .../common/reproducibility/reproducibility.py | 71 ++++++++----------- 1 file changed, 29 insertions(+), 42 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 8835ea8fc..17f267937 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -200,7 +200,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproducibilityFlags): merkledata.append(temp) merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root - drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': set()} + drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': []} return drop @@ -223,7 +223,7 @@ def init_lg_repro_drop_data(drop: dict): merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata']['lg_data'] = data - drop['reprodata']['lg_parenthashes'] = set() + drop['reprodata']['lg_parenthashes'] = [] return drop @@ -235,7 +235,7 @@ def append_pgt_repro_data(drop: dict, data: dict): merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) - drop['reprodata']['pgt_parenthashes'] = set() + drop['reprodata']['pgt_parenthashes'] = [] drop['reprodata']['pgt_data'] = data return drop @@ -276,7 +276,7 @@ def init_pg_repro_drop_data(drop: dict): merkletree = MerkleTree(merkledata, common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) - drop['reprodata']['pg_parenthashes'] = set() + drop['reprodata']['pg_parenthashes'] = [] drop['reprodata']['pg_data'] = data return drop @@ -316,6 +316,8 @@ def build_lg_block_data(drop: dict): if 'merkleroot' in drop['reprodata']['lg_data']: lg_hash = drop['reprodata']['lg_data']['merkleroot'] block_data.append(lg_hash) + hashset = set(drop['reprodata']['lg_parenthashes']) + drop['reprodata']['lg_parenthashes'] = list(hashset) for parenthash in sorted(drop['reprodata']['lg_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) @@ -324,6 +326,8 @@ def build_lg_block_data(drop: dict): def build_pgt_block_data(drop: dict): block_data = [drop['reprodata']['pgt_data']['merkleroot'], drop['reprodata']['lg_blockhash']] + hashset = set(drop['reprodata']['pgt_parenthashes']) + drop['reprodata']['pgt_parenthashes'] = list(hashset) for parenthash in sorted(drop['reprodata']['pgt_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) @@ -334,6 +338,8 @@ def build_pg_block_data(drop: dict): block_data = [drop['reprodata']['pg_data']['merkleroot'], drop['reprodata']['pgt_blockhash'], drop['reprodata']['lg_blockhash']] + hashset = set(drop['reprodata']['pg_parenthashes']) + drop['reprodata']['pg_parenthashes'] = list(hashset) for parenthash in sorted(drop['reprodata']['pg_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) @@ -378,22 +384,21 @@ def lg_build_blockdag(lg: dict): # Process build_lg_block_data(dropset[did][0]) visited.append(did) + rmode = int(dropset[did][0]['reprodata']['rmode']) for n in neighbourset[did]: dropset[n][1] -= 1 - parenthash = set() - rmode = dropset[did][0]['reprodata']['rmode'] - if rmode == ReproducibilityFlags.REPRODUCE or \ - rmode == ReproducibilityFlags.REPLICATE_COMP or \ - rmode == ReproducibilityFlags.REPLICATE_SCI: + if rmode == ReproducibilityFlags.REPRODUCE.value: if dropset[did][0]['categoryType'] == Categories.DATA: - # Add my hash into the child's parenthashes - parenthash.add(dropset[did][0]['reprodata']['lg_blockhash']) + # Add my new hash to the parent-hash list + parenthash = dropset[did][0]['reprodata']['lg_blockhash'] else: - # Add my parenthashes into the child's parenthashes - parenthash.update(dropset[did][0]['reprodata']['lg_parenthashes']) + # Add my parenthashes to the parent-hash list + parenthash = dropset[did][0]['reprodata']['lg_parenthashes'] else: - parenthash.add(dropset[did][0]['reprodata']['lg_blockhash']) - dropset[n][0]['reprodata']['lg_parenthashes'].update(parenthash) + parenthash = dropset[did][0]['reprodata']['lg_blockhash'] + + # Add our new hash to the parent-hash list + dropset[n][0]['reprodata']['lg_parenthashes'].append(parenthash) # We deal with duplicates later if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) @@ -458,23 +463,20 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): did = q.pop() block_builder(dropset[did][0]) visited += 1 + rmode = int(dropset[did][0]['reprodata']['rmode']) for n in neighbourset[did]: dropset[n][1] -= 1 - parenthash = set() - rmode = dropset[did][0]['reprodata']['rmode'] - if rmode == ReproducibilityFlags.REPRODUCE or \ - rmode == ReproducibilityFlags.REPLICATE_COMP or \ - rmode == ReproducibilityFlags.REPLICATE_SCI: + if rmode == ReproducibilityFlags.REPRODUCE.value: if dropset[did][0]['categoryType'] == Categories.DATA: - # Add my hash into the child's parenthashes - parenthash.add(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) + # Add my new hash to the parent-hash list + parenthash = dropset[did][0]['reprodata'][blockstr + "_blockhash"] else: - # Add my parenthashes into the child's parenthashes - parenthash.update(dropset[did][0]['reprodata'][parentstr]) + # Add my parenthashes to the parent-hash list + parenthash = dropset[did][0]['reprodata'][parentstr] else: - # Add my parenthashes into the child's parenthashes - parenthash.update(dropset[did][0]['reprodata'][parentstr]) - dropset[n][0]['reprodata'][parentstr].update(parenthash) + parenthash = dropset[did][0]['reprodata'][blockstr + "_blockhash"] + # Add our new hash to the parest-hash list + dropset[n][0]['reprodata'][parentstr].append(parenthash) if dropset[n][1] == 0: q.append(n) @@ -531,9 +533,6 @@ def init_lg_repro_data(lg: dict): for drop in lg['nodeDataArray']: init_lg_repro_drop_data(drop) leaves = lg_build_blockdag(lg) - for drop in lg['nodeDataArray']: - # Convert parenthash set into sorted list for JSON serialization - drop['reprodata']['lg_parenthashes'] = sorted(list(drop['reprodata']['lg_parenthashes'])) lg['reprodata']['signature'] = agglomerate_leaves(leaves) logger.info("Reproducibility data finished at LG level") return lg @@ -549,9 +548,6 @@ def init_pgt_unroll_repro_data(pgt: list): for drop in pgt: init_pgt_unroll_repro_drop_data(drop) leaves = build_blockdag(pgt, 'pgt') - for drop in pgt: - # Convert parenthash set into sorted list for JSON serialization - drop['reprodata']['pgt_parenthashes'] = sorted(list(drop['reprodata']['pgt_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") @@ -568,9 +564,6 @@ def init_pgt_partition_repro_data(pgt: list): for drop in pgt: init_pgt_partition_repro_drop_data(drop) leaves = build_blockdag(pgt, 'pgt') - for drop in pgt: - # Convert parenthash set into sorted list for JSON serialization - drop['reprodata']['pgt_parenthashes'] = sorted(list(drop['reprodata']['pgt_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") @@ -592,9 +585,6 @@ def init_pg_repro_data(pg: list): for drop in pg: init_pg_repro_drop_data(drop) leaves = build_blockdag(pg, 'pg') - for drop in pg: - # Convert parenthash set into sorted list for JSON serialization - drop['reprodata']['pg_parenthashes'] = sorted(list(drop['reprodata']['pg_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pg.append(reprodata) logger.info("Reproducibility data finished at PG level") @@ -617,9 +607,6 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): for drop in pg.items(): init_runtime_repro_drop_data(drop[1]) leaves = build_blockdag(list(pg.values()), 'pg') - for drop in pg.items(): - # Convert parenthash set into sorted list for JSON serialization - drop[1]['reprodata']['pg_parenthashes'] = sorted(list(drop[1]['reprodata']['pg_parenthashes'])) reprodata['signature'] = agglomerate_leaves(leaves) pg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") From 2f9f550b4082bd8b1d43b0393a466e45fdab6464 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Tue, 11 Aug 2020 14:06:24 +0800 Subject: [PATCH 125/484] Adds python modules (now in the DALiuGE codebase, I cannot see another way forward without major time). --- .../dlg/common/reproducibility/apps.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 daliuge-common/dlg/common/reproducibility/apps.py diff --git a/daliuge-common/dlg/common/reproducibility/apps.py b/daliuge-common/dlg/common/reproducibility/apps.py new file mode 100644 index 000000000..04c3f8c84 --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/apps.py @@ -0,0 +1,21 @@ +from dlg.apps.pyfunc import PyFuncApp + + +def writeIn(): + return "world" + + +def writeOut(s="everybody"): + return "Hello " + s + + +class HelloWorldPythonIn(PyFuncApp): + def initialize(self, **kwargs): + fname = 'dlg.common.reproducibility.apps.writeIn' + super(HelloWorldPythonIn, self).initialize(func_name=fname) + + +class HelloWorldPythonOut(PyFuncApp): + def initialize(self, **kwargs): + fname = 'dlg.common.reproducibility.apps.writeOut' + super(HelloWorldPythonOut, self).initialize(func_name=fname) \ No newline at end of file From 3dc5fcf36830506d448a2061faf8d86cbafde136 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 13 Aug 2020 15:18:34 +0800 Subject: [PATCH 126/484] Adds basic DROP-level reproducibility functions. --- daliuge-runtime/dlg/drop.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 3d7af4685..422adced0 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -637,6 +637,14 @@ def generate_repeat_data(self): """ return [self._status] + def generate_reproduce_data(self): + """ + Provides a list of Reproducibility data (specifically). + The default behaviour is to return nothing. Per-class behaviour is to be achieved by overriding this method. + :return: A list containing runtime exclusive reproducibility data. + """ + return [] + def generate_merkle_data(self): """ Provides a serialized summary of data as a list. @@ -651,6 +659,8 @@ def generate_merkle_data(self): return self.generate_rerun_data() elif self._reproducibility is ReproducibilityFlags.REPEAT: return self.generate_repeat_data() + elif self._reproducibility is ReproducibilityFlags.REPRODUCE: + return self.generate_reproduce_data() else: raise NotImplementedError("Currently other levels are not in development.") @@ -1244,6 +1254,10 @@ def dataURL(self): hostname = os.uname()[1] # TODO: change when necessary return "file://" + hostname + self._path + # Override + def generate_reproduce_data(self): + # TODO: Implement correctly + return ["FILE"] class NgasDROP(AbstractDROP): """ @@ -1266,6 +1280,11 @@ def getIO(self): def dataURL(self): return "ngas://%s:%d/%s" % (self.ngasSrv, self.ngasPort, self.uid) + # Override + def generate_reproduce_data(self): + # TODO: Implement Correctly + return ["FILE"] + class InMemoryDROP(AbstractDROP): """ @@ -1289,6 +1308,11 @@ def dataURL(self): hostname = os.uname()[1] return "mem://%s/%d/%d" % (hostname, os.getpid(), id(self._buf)) + # Override + def generate_reproduce_data(self): + # TODO: Implement Correctly + return ["MEMORY"] + class NullDROP(AbstractDROP): """ @@ -1379,6 +1403,11 @@ def select(self, columns=None, condition=None, vals=()): def dataURL(self): return "rdbms://%s/%s/%r" % (self._db_drv.__name__, self._db_table, self._db_params) + # Override + def generate_reproduce_data(self): + # TODO: Implement Correctly + return ["RDBMS"] + class ContainerDROP(AbstractDROP): """ From 01581809605315a6d388a5f50110f76ac4978530 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Tue, 18 Aug 2020 10:50:00 +0800 Subject: [PATCH 127/484] Fixes many broken edge cases with building a data-graph-minor blockDAG --- .../common/reproducibility/reproducibility.py | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 17f267937..34a3d3743 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -387,18 +387,19 @@ def lg_build_blockdag(lg: dict): rmode = int(dropset[did][0]['reprodata']['rmode']) for n in neighbourset[did]: dropset[n][1] -= 1 + parenthash = [] if rmode == ReproducibilityFlags.REPRODUCE.value: if dropset[did][0]['categoryType'] == Categories.DATA: # Add my new hash to the parent-hash list - parenthash = dropset[did][0]['reprodata']['lg_blockhash'] + parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) else: # Add my parenthashes to the parent-hash list - parenthash = dropset[did][0]['reprodata']['lg_parenthashes'] - else: - parenthash = dropset[did][0]['reprodata']['lg_blockhash'] + parenthash.extend(dropset[did][0]['reprodata']['lg_parenthashes']) + else: # Non-compressing behaviour + parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) # Add our new hash to the parent-hash list - dropset[n][0]['reprodata']['lg_parenthashes'].append(parenthash) # We deal with duplicates later + dropset[n][0]['reprodata']['lg_parenthashes'].extend(parenthash) # We deal with duplicates later if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) @@ -466,17 +467,19 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): rmode = int(dropset[did][0]['reprodata']['rmode']) for n in neighbourset[did]: dropset[n][1] -= 1 + parenthash = [] if rmode == ReproducibilityFlags.REPRODUCE.value: - if dropset[did][0]['categoryType'] == Categories.DATA: + # TODO: Hack! may break later, proceed with caution + if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA: # Add my new hash to the parent-hash list - parenthash = dropset[did][0]['reprodata'][blockstr + "_blockhash"] + parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) else: # Add my parenthashes to the parent-hash list - parenthash = dropset[did][0]['reprodata'][parentstr] + parenthash.extend(dropset[did][0]['reprodata'][parentstr]) else: - parenthash = dropset[did][0]['reprodata'][blockstr + "_blockhash"] + parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) # Add our new hash to the parest-hash list - dropset[n][0]['reprodata'][parentstr].append(parenthash) + dropset[n][0]['reprodata'][parentstr].extend(parenthash) if dropset[n][1] == 0: q.append(n) From 0ba29e6635784ecc2a33ec03359a785905d1cff2 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Tue, 18 Aug 2020 11:18:26 +0800 Subject: [PATCH 128/484] Adds reproduce behaviour (simple, basic) for FileDROPs and MemoryDROPs --- daliuge-runtime/dlg/drop.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 422adced0..6e4e09395 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -42,6 +42,7 @@ import six from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, rmode_supported, HASHING_ALG +from dlg.common.reproducibility.reproducibility import common_hash from merklelib import MerkleTree from six import BytesIO @@ -1256,8 +1257,10 @@ def dataURL(self): # Override def generate_reproduce_data(self): - # TODO: Implement correctly - return ["FILE"] + from .droputils import allDropContents + data = allDropContents(self, self.size) + return [common_hash(data)] + class NgasDROP(AbstractDROP): """ @@ -1283,7 +1286,7 @@ def dataURL(self): # Override def generate_reproduce_data(self): # TODO: Implement Correctly - return ["FILE"] + return ["NGAS"] class InMemoryDROP(AbstractDROP): @@ -1310,8 +1313,9 @@ def dataURL(self): # Override def generate_reproduce_data(self): - # TODO: Implement Correctly - return ["MEMORY"] + from .droputils import allDropContents + data = allDropContents(self, self.size) + return [common_hash(data)] class NullDROP(AbstractDROP): From cd0ed44f87aab8316da88b39d10d06a06989d2d8 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 19 Aug 2020 09:18:33 +0800 Subject: [PATCH 129/484] A very basic NGAS implementation --- daliuge-runtime/dlg/drop.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 6e4e09395..7af192f50 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -1285,8 +1285,9 @@ def dataURL(self): # Override def generate_reproduce_data(self): - # TODO: Implement Correctly - return ["NGAS"] + from .droputils import allDropContents + data = allDropContents(self, self.size) + return [common_hash(data)] class InMemoryDROP(AbstractDROP): From 8d13e67e20247e0c5162351f4ea12539de8000a4 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 27 Aug 2020 12:56:07 +0800 Subject: [PATCH 130/484] Adds Reproducibility data for RDBMS drops --- daliuge-runtime/dlg/drop.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 7af192f50..a104d34c0 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -1353,6 +1353,9 @@ def initialize(self, **kwargs): # The table this Drop points at self._db_table = kwargs.pop('dbtable') + # Data store for reproducibility + self._querylog = [] + def getIO(self): # This Drop cannot be accessed directly return ErrorIO() @@ -1375,6 +1378,7 @@ def insert(self, vals): sql = "INSERT into %s (%s) VALUES (%s)" % (self._db_table, ','.join(vals.keys()), ','.join(['{}']*len(vals))) sql, vals = prepare_sql(sql, self._db_drv.paramstyle, list(vals.values())) logger.debug('Executing SQL with parameters: %s / %r', sql, vals) + self._querylog.append((sql, vals)) cur.execute(sql, vals) c.commit() @@ -1401,8 +1405,11 @@ def select(self, columns=None, condition=None, vals=()): logger.debug('Executing SQL with parameters: %s / %r', sql, vals) cur.execute(sql, vals) if cur.description: - return cur.fetchall() - return [] + ret = cur.fetchall() + else: + ret = [] + self._querylog.append((sql, vals, ret)) + return ret @property def dataURL(self): @@ -1410,8 +1417,7 @@ def dataURL(self): # Override def generate_reproduce_data(self): - # TODO: Implement Correctly - return ["RDBMS"] + return self._querylog class ContainerDROP(AbstractDROP): From 24f3b08237e2ef2d12800c94f9a971b944e34f5b Mon Sep 17 00:00:00 2001 From: pritchardn Date: Thu, 27 Aug 2020 13:02:27 +0800 Subject: [PATCH 131/484] Updates TODO --- daliuge-runtime/dlg/drop.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index a104d34c0..b9e28419d 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -1285,6 +1285,7 @@ def dataURL(self): # Override def generate_reproduce_data(self): + # TODO: This is a bad implementation. Will need to sort something better out from .droputils import allDropContents data = allDropContents(self, self.size) return [common_hash(data)] From e07be8227209595d6633ebc7c99d88b5df757c51 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 2 Sep 2020 12:59:08 +0800 Subject: [PATCH 132/484] Converts all runtime drop_data structures to dictionaries (were previously lists) --- daliuge-runtime/dlg/drop.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index b9e28419d..438992e81 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -628,7 +628,7 @@ def generate_rerun_data(self): At runtime, Rerunning only requires execution success or failure. :return: A list containing rerun values """ - return [self._status] + return {'status': self._status} def generate_repeat_data(self): """ @@ -636,7 +636,7 @@ def generate_repeat_data(self): At runtime, repeating, like rerunning only requires execution success or failure. :return: A list containing runtime exclusive repetition values. """ - return [self._status] + return {'status': self._status} def generate_reproduce_data(self): """ @@ -644,7 +644,7 @@ def generate_reproduce_data(self): The default behaviour is to return nothing. Per-class behaviour is to be achieved by overriding this method. :return: A list containing runtime exclusive reproducibility data. """ - return [] + return {} def generate_merkle_data(self): """ @@ -655,7 +655,7 @@ def generate_merkle_data(self): :return: A list of elements constituting a summary of this drop """ if self._reproducibility is ReproducibilityFlags.NOTHING: - return [] + return {} elif self._reproducibility is ReproducibilityFlags.RERUN: return self.generate_rerun_data() elif self._reproducibility is ReproducibilityFlags.REPEAT: @@ -1259,7 +1259,7 @@ def dataURL(self): def generate_reproduce_data(self): from .droputils import allDropContents data = allDropContents(self, self.size) - return [common_hash(data)] + return {'data_hash': common_hash(data)} class NgasDROP(AbstractDROP): @@ -1288,7 +1288,7 @@ def generate_reproduce_data(self): # TODO: This is a bad implementation. Will need to sort something better out from .droputils import allDropContents data = allDropContents(self, self.size) - return [common_hash(data)] + return {'data_hash': common_hash(data)} class InMemoryDROP(AbstractDROP): @@ -1317,7 +1317,7 @@ def dataURL(self): def generate_reproduce_data(self): from .droputils import allDropContents data = allDropContents(self, self.size) - return [common_hash(data)] + return {'data_hash': common_hash(data)} class NullDROP(AbstractDROP): @@ -1418,7 +1418,7 @@ def dataURL(self): # Override def generate_reproduce_data(self): - return self._querylog + return {'query_log': self._querylog} class ContainerDROP(AbstractDROP): From c01f21f65cb84338bc785ca315e12522f0548734 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 2 Sep 2020 12:59:42 +0800 Subject: [PATCH 133/484] Drop runtime data is now appended to the drop structure directly (effectively initializing the runtime drop data) --- daliuge-runtime/dlg/manager/session.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/manager/session.py b/daliuge-runtime/dlg/manager/session.py index 72310a061..0adf3585a 100644 --- a/daliuge-runtime/dlg/manager/session.py +++ b/daliuge-runtime/dlg/manager/session.py @@ -396,8 +396,8 @@ def add_node_subscriptions(self, relationships): def append_reprodata(self, oid, reprodata): if oid in self._graph: - self._graph[oid]['reprodata']['pg_data']['run_data'] = reprodata['data'] - self._graph[oid]['reprodata']['pg_data']['run_merkleroot'] = reprodata['merkleroot'] + self._graph[oid]['reprodata']['rg_data'] = reprodata['data'] + self._graph[oid]['reprodata']['rg_data']['merkleroot'] = reprodata['merkleroot'] @track_current_session def finish(self): From 6d1109d014bdeed8df38c7b14ae5eb87d74f5169 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 2 Sep 2020 13:01:10 +0800 Subject: [PATCH 134/484] separates Runtime data from PG data. It's more accurate vs. conflating the two. --- .../common/reproducibility/reproducibility.py | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 34a3d3743..17c0a160e 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -281,23 +281,13 @@ def init_pg_repro_drop_data(drop: dict): return drop -def init_runtime_repro_drop_data(drop: dict): +def init_rg_repro_drop_data(drop: dict): """ - Merges runtime and PG graph data on a per-drop basis. + Creates and appends per-drop reproducibility information at the runtime graph stage. :param drop: - :return: + :return: The same drop with appended reproducibility information """ - pg_data = accumulate_pg_drop_data(drop) - merkledata = [] - for key, value in pg_data.items(): - temp = [key, value] - merkledata.append(temp) - merkledata.append(drop['reprodata']['pg_data']['run_merkleroot']) - merkletree = MerkleTree(merkledata, common_hash) - pg_data['run_data'] = drop['reprodata']['pg_data']['run_data'].copy() - pg_data['run_merkleroot'] = drop['reprodata']['pg_data']['run_merkleroot'] - pg_data['merkleroot'] = merkletree.merkle_root - drop['reprodata']['pg_data'] = pg_data + drop['reprodata']['rg_parenthashes'] = [] return drop @@ -346,6 +336,19 @@ def build_pg_block_data(drop: dict): drop['reprodata']['pg_blockhash'] = mtree.merkle_root +def build_rg_block_data(drop: dict): + block_data = [drop['reprodata']['rg_data']['merkleroot'], + drop['reprodata']['pg_blockhash'], + drop['reprodata']['pgt_blockhash'], + drop['reprodata']['lg_blockhash']] + hashset = set(drop['reprodata']['rg_parenthashes']) + drop['reprodata']['rg_parenthashes'] = list(hashset) + for parenthash in sorted(drop['reprodata']['rg_parenthashes']): + block_data.append(parenthash) + mtree = MerkleTree(block_data, common_hash) + drop['reprodata']['rg_blockhash'] = mtree.merkle_root + + def lg_build_blockdag(lg: dict): """ Uses Kahn's algorithm to topologically sort a logical graph dictionary. @@ -431,6 +434,10 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): blockstr = 'pg' parentstr = 'pg_parenthashes' block_builder = build_pg_block_data + if abstraction == 'rg': + blockstr = 'rg' + parentstr = 'rg_parenthashes' + block_builder = build_rg_block_data from collections import deque dropset = {} @@ -594,10 +601,10 @@ def init_pg_repro_data(pg: list): return pg -def init_runtime_repro_data(pg: dict, reprodata: dict): +def init_runtime_repro_data(rg: dict, reprodata: dict): """ Adds reproducibility data at the runtime level to graph-wide values. - :param pg: + :param rg: :param reprodata: :return: """ @@ -607,10 +614,10 @@ def init_runtime_repro_data(pg: dict, reprodata: dict): # logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata['rmode'] = str(rmode.value) - for drop in pg.items(): - init_runtime_repro_drop_data(drop[1]) - leaves = build_blockdag(list(pg.values()), 'pg') + for id, drop in rg.items(): + init_rg_repro_drop_data(drop) + leaves = build_blockdag(list(rg.values()), 'rg') reprodata['signature'] = agglomerate_leaves(leaves) - pg['reprodata'] = reprodata + rg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") - return pg + return rg From fa3b8a1dd75d317c4d84682b5c31c0dc5cc120b6 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 4 Sep 2020 09:18:27 +0800 Subject: [PATCH 135/484] rmode_supported now supports replication --- daliuge-common/dlg/common/reproducibility/constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 7d0c1fe3a..0dc8bd116 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -31,6 +31,8 @@ def rmode_supported(flag: ReproducibilityFlags): or flag == ReproducibilityFlags.RERUN \ or flag == ReproducibilityFlags.REPEAT \ or flag == ReproducibilityFlags.REPRODUCE \ + or flag == ReproducibilityFlags.REPLICATE_SCI \ + or flag == ReproducibilityFlags.REPLICATE_COMP \ or flag == ReproducibilityFlags.EXPERIMENTAL: return True else: From 912ebcb31a5df1aad687dfa6f5c0f487d90169e1 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 4 Sep 2020 09:24:44 +0800 Subject: [PATCH 136/484] Drops now implement replication methods. --- daliuge-runtime/dlg/drop.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 438992e81..aef2d3a99 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -646,6 +646,28 @@ def generate_reproduce_data(self): """ return {} + def generate_replicate_sci_data(self): + """ + Provides a list of scientific replication data. + This is by definition a merging of both reproduction and rerun data + :return: A dictionary containing runtime exclusive scientific replication data. + """ + res = {} + res.update(self.generate_rerun_data()) + res.update(self.generate_reproduce_data()) + return res + + def generate_replicate_comp_data(self): + """ + Provides a list of computational replication data. + This is by definition a merging of both reproduction and repetition data + :return: A dictionary containing runtime exclusive computational replication data. + """ + res = {} + res.update(self.generate_repeat_data()) + res.update(self.generate_reproduce_data()) + return res + def generate_merkle_data(self): """ Provides a serialized summary of data as a list. From 7164c72136518c06071be95bc21645ea5009b563 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 4 Sep 2020 10:39:01 +0800 Subject: [PATCH 137/484] Drops now actually accumulate replicate information --- daliuge-runtime/dlg/drop.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index aef2d3a99..5abd05ccd 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -626,7 +626,7 @@ def generate_rerun_data(self): """ Provides a serailized list of Rerun data. At runtime, Rerunning only requires execution success or failure. - :return: A list containing rerun values + :return: A dictionary containing rerun values """ return {'status': self._status} @@ -634,7 +634,7 @@ def generate_repeat_data(self): """ Provides a list of Repeat data. At runtime, repeating, like rerunning only requires execution success or failure. - :return: A list containing runtime exclusive repetition values. + :return: A dictionary containing runtime exclusive repetition values. """ return {'status': self._status} @@ -642,7 +642,7 @@ def generate_reproduce_data(self): """ Provides a list of Reproducibility data (specifically). The default behaviour is to return nothing. Per-class behaviour is to be achieved by overriding this method. - :return: A list containing runtime exclusive reproducibility data. + :return: A dictionary containing runtime exclusive reproducibility data. """ return {} @@ -674,7 +674,7 @@ def generate_merkle_data(self): Fields constitute a single entry in this list. Wraps several methods dependent on this DROPs reproducibility level Some of these are abstract. - :return: A list of elements constituting a summary of this drop + :return: A dictionary of elements constituting a summary of this drop """ if self._reproducibility is ReproducibilityFlags.NOTHING: return {} @@ -684,6 +684,10 @@ def generate_merkle_data(self): return self.generate_repeat_data() elif self._reproducibility is ReproducibilityFlags.REPRODUCE: return self.generate_reproduce_data() + elif self._reproducibility is ReproducibilityFlags.REPLICATE_SCI: + return self.generate_replicate_sci_data() + elif self._reproducibility is ReproducibilityFlags.REPLICATE_COMP: + return self.generate_replicate_comp_data() else: raise NotImplementedError("Currently other levels are not in development.") From 601a7c9376dd706199842cb409ad76fe0f94251f Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 4 Sep 2020 10:39:23 +0800 Subject: [PATCH 138/484] Translator reproducibility functions now accumulate replication data --- .../dlg/common/reproducibility/reproducibility.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 17c0a160e..fd97fc690 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -65,7 +65,7 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) if level == ReproducibilityFlags.RERUN: pass - elif level == ReproducibilityFlags.REPEAT: + elif level == ReproducibilityFlags.REPEAT or level == ReproducibilityFlags.REPLICATE_COMP: if category_type == 'Application': data['execution_time'] = fields['execution_time'] data['num_cpus'] = fields['num_cpus'] @@ -391,7 +391,7 @@ def lg_build_blockdag(lg: dict): for n in neighbourset[did]: dropset[n][1] -= 1 parenthash = [] - if rmode == ReproducibilityFlags.REPRODUCE.value: + if rmode == ReproducibilityFlags.REPRODUCE.value: # TODO: Correct for replicate if dropset[did][0]['categoryType'] == Categories.DATA: # Add my new hash to the parent-hash list parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) @@ -474,7 +474,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): rmode = int(dropset[did][0]['reprodata']['rmode']) for n in neighbourset[did]: dropset[n][1] -= 1 - parenthash = [] + parenthash = [] # TODO: Correct for replicate if rmode == ReproducibilityFlags.REPRODUCE.value: # TODO: Hack! may break later, proceed with caution if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA: From 470ba0e6591338571891e5817a1a965a4e4ea349 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 4 Sep 2020 10:39:58 +0800 Subject: [PATCH 139/484] Fixes typo in documentation --- daliuge-common/dlg/common/reproducibility/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 0dc8bd116..cc84fdd4a 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -22,7 +22,7 @@ def rmode_supported(flag: ReproducibilityFlags): """ Determines in a given flag is currently supported. A slightly pedantic solution but it does centralize the process. - There is the possiblity that different functionality is possible on a per-install basis. + There is the possibility that different functionality is possible on a per-install basis. Named to be used as a if rmode_supported(flag) :param flag: A ReproducibilityFlag enum being queried :return: True if supported, False otherwise From 4503858eaed7dc4eda1030ef793d926b3627a619 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Fri, 4 Sep 2020 11:34:09 +0800 Subject: [PATCH 140/484] BlockDAG construction now adds both the full-graph and data-driven minor, completing the implementation of Replication. --- .../dlg/common/reproducibility/reproducibility.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index fd97fc690..73b79c5a7 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -391,14 +391,14 @@ def lg_build_blockdag(lg: dict): for n in neighbourset[did]: dropset[n][1] -= 1 parenthash = [] - if rmode == ReproducibilityFlags.REPRODUCE.value: # TODO: Correct for replicate + if rmode >= ReproducibilityFlags.REPRODUCE.value: if dropset[did][0]['categoryType'] == Categories.DATA: # Add my new hash to the parent-hash list parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) else: # Add my parenthashes to the parent-hash list parenthash.extend(dropset[did][0]['reprodata']['lg_parenthashes']) - else: # Non-compressing behaviour + if rmode != ReproducibilityFlags.REPRODUCE.value: # Non-compressing behaviour parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) # Add our new hash to the parent-hash list @@ -474,8 +474,8 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): rmode = int(dropset[did][0]['reprodata']['rmode']) for n in neighbourset[did]: dropset[n][1] -= 1 - parenthash = [] # TODO: Correct for replicate - if rmode == ReproducibilityFlags.REPRODUCE.value: + parenthash = [] + if rmode >= ReproducibilityFlags.REPRODUCE.value: # TODO: Hack! may break later, proceed with caution if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA: # Add my new hash to the parent-hash list @@ -483,7 +483,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): else: # Add my parenthashes to the parent-hash list parenthash.extend(dropset[did][0]['reprodata'][parentstr]) - else: + if rmode != ReproducibilityFlags.REPRODUCE.value: parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) # Add our new hash to the parest-hash list dropset[n][0]['reprodata'][parentstr].extend(parenthash) From 0693017ca58a7c6ef279f3c00d8e8cfb1089c914 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Tue, 15 Sep 2020 17:48:27 +0800 Subject: [PATCH 141/484] Adds some error checking --- daliuge-common/dlg/common/reproducibility/constants.py | 4 ++++ daliuge-common/dlg/common/reproducibility/reproducibility.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index cc84fdd4a..536d4d56b 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -17,6 +17,8 @@ class ReproducibilityFlags(Enum): REPRO_DEFAULT = ReproducibilityFlags.NOTHING HASHING_ALG = hashlib.sha3_256 +# TODO: Implement Rflag caster + def rmode_supported(flag: ReproducibilityFlags): """ @@ -27,6 +29,8 @@ def rmode_supported(flag: ReproducibilityFlags): :param flag: A ReproducibilityFlag enum being queried :return: True if supported, False otherwise """ + if type(flag) != ReproducibilityFlags: + raise TypeError("Need to be working with a ReproducibilityFlag enum") if flag == ReproducibilityFlags.NOTHING \ or flag == ReproducibilityFlags.RERUN \ or flag == ReproducibilityFlags.REPEAT \ diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 73b79c5a7..be59c66be 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -8,7 +8,7 @@ logger = logging.getLogger(__name__) -def common_hash(value): +def common_hash(value): # TODO: check type return HASHING_ALG(value).hexdigest() From c3444802aa9f227b45417f97688540e71c74069b Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 16 Sep 2020 11:26:47 +0800 Subject: [PATCH 142/484] Minor spacing fix --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index be59c66be..652f0335d 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -8,7 +8,7 @@ logger = logging.getLogger(__name__) -def common_hash(value): # TODO: check type +def common_hash(value): # TODO: check type return HASHING_ALG(value).hexdigest() From bd231cc11e688e9db8feb09384a8734173e75dfc Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 16 Sep 2020 11:36:00 +0800 Subject: [PATCH 143/484] Adds rflag_caster and docstrings to constants.py --- .../dlg/common/reproducibility/constants.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 536d4d56b..f93564a27 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -5,6 +5,10 @@ class ReproducibilityFlags(Enum): + """ + Enum for supported reproducibility modes. + TODO: Link to more detail description + """ NOTHING = 0 RERUN = 1 REPEAT = 2 @@ -17,7 +21,27 @@ class ReproducibilityFlags(Enum): REPRO_DEFAULT = ReproducibilityFlags.NOTHING HASHING_ALG = hashlib.sha3_256 -# TODO: Implement Rflag caster + +def rflag_caster(val, default=REPRO_DEFAULT): + """ + Function to safely cast strings and ints to their appropriate ReproducibilityFlag + E.g. rflag_caster(1) -> ReproducibilityFlag.RERUN + E.g. rlag_caster("3") -> ReproducibilityFlag.REPRODUCE + E.g. rflag_caster("two") -> REPRO_DEFAULT + :param val: The passed value (either int or str) + :param default: The default value to be returned upon failure + :return: Appropriate ReproducibilityFlag + """ + if type(val) == str: + try: + return ReproducibilityFlags(int(val)) + except(ValueError, TypeError): + return default + elif type(val) == int: + try: + return ReproducibilityFlags(val) + except(ValueError, TypeError): + return default def rmode_supported(flag: ReproducibilityFlags): From 8536f8829975bdcd5784f2dfd83601bae7c86ec3 Mon Sep 17 00:00:00 2001 From: pritchardn Date: Wed, 16 Sep 2020 11:37:17 +0800 Subject: [PATCH 144/484] Adds use of rflag_caster --- .../common/reproducibility/reproducibility.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 652f0335d..a26ed287b 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -1,7 +1,7 @@ import logging from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ - rmode_supported + rmode_supported, rflag_caster from .. import Categories from merklelib import MerkleTree @@ -130,7 +130,7 @@ def accumulate_pgt_unroll_drop_data(drop: dict): :return: A dictionary containing accumulated reproducibility data for a given drop. """ data = {} - rmode = ReproducibilityFlags(int(drop['reprodata']['rmode'])) + rmode = rflag_caster(drop['reprodata']['rmode']) if not rmode_supported(rmode): logger.warning('Requested reproducibility mode %s not yet implemented', str(rmode)) rmode = REPRO_DEFAULT @@ -154,7 +154,7 @@ def accumulate_pgt_partition_drop_data(drop: dict): :param drop: :return: """ - rmode = ReproducibilityFlags(int(drop['reprodata']['rmode'])) + rmode = rflag_caster(drop['reprodata']['rmode']) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -174,7 +174,7 @@ def accumulate_pg_drop_data(drop: dict): :param drop: :return: A dictionary containing accumulated reproducibility data for a given drop. """ - rmode = ReproducibilityFlags(int(drop['reprodata']['rmode'])) + rmode = rflag_caster(drop['reprodata']['rmode']) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -210,7 +210,7 @@ def init_lg_repro_drop_data(drop: dict): :param drop: :return: The same drop with appended reproducibility information """ - rmode = ReproducibilityFlags(int(drop['reprodata']['rmode'])) + rmode = rflag_caster(drop['reprodata']['rmode']) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -387,7 +387,7 @@ def lg_build_blockdag(lg: dict): # Process build_lg_block_data(dropset[did][0]) visited.append(did) - rmode = int(dropset[did][0]['reprodata']['rmode']) + rmode = rflag_caster(dropset[did][0]['reprodata']['rmode']).value for n in neighbourset[did]: dropset[n][1] -= 1 parenthash = [] @@ -519,7 +519,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): :param rmode: One several values 0-5 defined in constants.py :return: The same lgt object with new information appended """ - rmode = ReproducibilityFlags(int(rmode)) + rmode = rflag_caster(rmode) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -587,7 +587,7 @@ def init_pg_repro_data(pg: list): :return: The same pg object with new information appended """ reprodata = pg.pop() - rmode = ReproducibilityFlags(int(reprodata['rmode'])) + rmode = rflag_caster(reprodata['rmode']) if not rmode_supported(rmode): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT @@ -608,13 +608,13 @@ def init_runtime_repro_data(rg: dict, reprodata: dict): :param reprodata: :return: """ - rmode = ReproducibilityFlags(int(reprodata['rmode'])) + rmode = rflag_caster(reprodata['rmode']) if not rmode_supported(rmode): # TODO: Logging needs sessionID at this stage # logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata['rmode'] = str(rmode.value) - for id, drop in rg.items(): + for drop_id, drop in rg.items(): init_rg_repro_drop_data(drop) leaves = build_blockdag(list(rg.values()), 'rg') reprodata['signature'] = agglomerate_leaves(leaves) From e89bcbb6149ccdcaca41c0efb7ac72faf1ed629d Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 1 Oct 2020 16:33:45 +0800 Subject: [PATCH 145/484] Adds simple numpy average and my average function apps. --- .../dlg/common/reproducibility/apps.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps.py b/daliuge-common/dlg/common/reproducibility/apps.py index 04c3f8c84..de24223c4 100644 --- a/daliuge-common/dlg/common/reproducibility/apps.py +++ b/daliuge-common/dlg/common/reproducibility/apps.py @@ -9,6 +9,18 @@ def writeOut(s="everybody"): return "Hello " + s +def numpy_av(nums): + import numpy as np + return np.mean(nums) + + +def my_av(nums): + res = 0.0 + for x in nums: + res += x + return x / len(nums) + + class HelloWorldPythonIn(PyFuncApp): def initialize(self, **kwargs): fname = 'dlg.common.reproducibility.apps.writeIn' @@ -18,4 +30,16 @@ def initialize(self, **kwargs): class HelloWorldPythonOut(PyFuncApp): def initialize(self, **kwargs): fname = 'dlg.common.reproducibility.apps.writeOut' - super(HelloWorldPythonOut, self).initialize(func_name=fname) \ No newline at end of file + super(HelloWorldPythonOut, self).initialize(func_name=fname) + + +class NumpyAverage(PyFuncApp): + def initialize(self, **kwargs): + fname = 'dlg.common.reproducibility.apps.numpy_av' + super(NumpyAverage, self).initialize(func_name=fname) + + +class MyAverage(PyFuncApp): + def initialize(self, **kwargs): + fname = 'dlg.common.reproducibility.apps.my_av' + super(MyAverage, self).initialize(func_name=fname) \ No newline at end of file From 5a24032d3235f430e6a61fe791f6db9b4d811f31 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 1 Oct 2020 16:35:30 +0800 Subject: [PATCH 146/484] Adjustment made to pgt code to use 'dt' instead of 'app' to determine the type of each drop. --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index a26ed287b..4b8734859 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -2,9 +2,10 @@ from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ rmode_supported, rflag_caster -from .. import Categories from merklelib import MerkleTree +from .. import Categories + logger = logging.getLogger(__name__) @@ -143,7 +144,7 @@ def accumulate_pgt_unroll_drop_data(drop: dict): if data['type'] == 'plain': data['storage'] = drop['storage'] else: - data['app'] = drop['app'] + data['dt'] = drop['dt'] # WARNING: Added to differentiate between subtle component differences. return data From 395229ef9a877c81e52f53824131ca2546e88111 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 7 Oct 2020 12:19:11 +0800 Subject: [PATCH 147/484] Dictionaries inserted are inserted into MerkleTrees as .items() --- .../common/reproducibility/reproducibility.py | 26 ++++--------------- daliuge-runtime/dlg/drop.py | 9 +++---- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 4b8734859..14cdf4377 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -195,11 +195,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproducibilityFlags): :return: The same drop with appended reproducibility information. """ data = accumulate_lgt_drop_data(drop, level) - merkledata = [] - for key, value in data.items(): - temp = [key, value] - merkledata.append(temp) - merkletree = MerkleTree(merkledata, common_hash) + merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': []} return drop @@ -217,11 +213,7 @@ def init_lg_repro_drop_data(drop: dict): rmode = REPRO_DEFAULT drop['reprodata']['rmode'] = str(rmode.value) data = accumulate_lg_drop_data(drop, rmode) - merkledata = [] - for key, value in data.items(): - temp = [key, value] - merkledata.append(temp) - merkletree = MerkleTree(merkledata, common_hash) + merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata']['lg_data'] = data drop['reprodata']['lg_parenthashes'] = [] @@ -229,11 +221,7 @@ def init_lg_repro_drop_data(drop: dict): def append_pgt_repro_data(drop: dict, data: dict): - merkledata = [] - for key, value in data.items(): - temp = [key, value] - merkledata.append(temp) - merkletree = MerkleTree(merkledata, common_hash) + merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) drop['reprodata']['pgt_parenthashes'] = [] @@ -270,11 +258,7 @@ def init_pg_repro_drop_data(drop: dict): :return: The same drop with appended reproducibility information """ data = accumulate_pg_drop_data(drop) - merkledata = [] - for key, value in data.items(): - temp = [key, value] - merkledata.append(temp) - merkletree = MerkleTree(merkledata, common_hash) + merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) drop['reprodata']['pg_parenthashes'] = [] @@ -525,7 +509,7 @@ def init_lgt_repro_data(lgt: dict, rmode: str): logger.warning("Requested reproducibility mode %s not yet implemented", str(rmode)) rmode = REPRO_DEFAULT reprodata = {'rmode': str(rmode.value), 'meta_data': accumulate_meta_data()} - meta_tree = MerkleTree(reprodata, common_hash) + meta_tree = MerkleTree(reprodata.items(), common_hash) reprodata['merkleroot'] = meta_tree.merkle_root for drop in lgt['nodeDataArray']: init_lgt_repro_drop_data(drop, rmode) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 5abd05ccd..9e1be778b 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -22,22 +22,21 @@ """ Module containing the core DROP classes. """ -import re -from abc import ABCMeta, abstractmethod import base64 import collections import contextlib import errno import heapq import importlib +import inspect import logging import math import os import random +import re import shutil import threading import time -import inspect from abc import ABCMeta, abstractmethod import six @@ -51,9 +50,9 @@ from .event import EventFirer from .exceptions import InvalidDropException, InvalidRelationshipException from .io import OpenMode, FileIO, MemoryIO, NgasIO, ErrorIO, NullIO -from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking from .meta import dlg_float_param, dlg_int_param, dlg_list_param, \ dlg_string_param, dlg_bool_param, dlg_dict_param +from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking # Opt into using per-drop checksum calculation checksum_disabled = 'DLG_DISABLE_CHECKSUM' in os.environ @@ -700,7 +699,7 @@ def commit(self): # Generate the MerkleData self._merkleData = self.generate_merkle_data() # Fill MerkleTree, add data and set the MerkleRoot Value - self._merkleTree = MerkleTree(self._merkleData, drop_hash) + self._merkleTree = MerkleTree(self._merkleData.items(), drop_hash) self._merkleRoot = self._merkleTree.merkle_root # Set as committed self._committed = True From 5854df5282780cf22fa08fe4695fec323c181b88 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 7 Oct 2020 13:21:53 +0800 Subject: [PATCH 148/484] Fixes example apps --- daliuge-common/dlg/common/reproducibility/apps.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps.py b/daliuge-common/dlg/common/reproducibility/apps.py index de24223c4..ede2965bc 100644 --- a/daliuge-common/dlg/common/reproducibility/apps.py +++ b/daliuge-common/dlg/common/reproducibility/apps.py @@ -11,14 +11,14 @@ def writeOut(s="everybody"): def numpy_av(nums): import numpy as np - return np.mean(nums) + return np.asscalar(np.mean(nums)) def my_av(nums): res = 0.0 for x in nums: res += x - return x / len(nums) + return res / len(nums) class HelloWorldPythonIn(PyFuncApp): From f3c0f1c966616bfe71d958e0d2d725b46406c8ce Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 7 Oct 2020 22:04:24 +0800 Subject: [PATCH 149/484] Reproducibility now only tracks data-drops at the DAG-frontier. Data-Drops with no incoming or no outgoing edges. --- .../dlg/common/reproducibility/reproducibility.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 14cdf4377..954d0a121 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -351,13 +351,14 @@ def lg_build_blockdag(lg: dict): q = deque() for drop in lg['nodeDataArray']: did = int(drop['key']) - dropset[did] = [drop, 0] + dropset[did] = [drop, 0, 0] neighbourset[did] = [] for edge in lg['linkDataArray']: src = int(edge['from']) dest = int(edge['to']) dropset[dest][1] += 1 + dropset[src][2] += 1 neighbourset[src].append(dest) # did == 'drop id' @@ -377,7 +378,8 @@ def lg_build_blockdag(lg: dict): dropset[n][1] -= 1 parenthash = [] if rmode >= ReproducibilityFlags.REPRODUCE.value: - if dropset[did][0]['categoryType'] == Categories.DATA: + if dropset[did][0]['categoryType'] == Categories.DATA \ + and (dropset[did][1] == 0 or dropset[did][2] == 0): # Add my new hash to the parent-hash list parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) else: @@ -433,17 +435,20 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for drop in drops: did = drop['oid'] - dropset[did] = [drop, 0] # To guarantee all nodes have entries + dropset[did] = [drop, 0, 0] # To guarantee all nodes have entries for drop in drops: did = drop['oid'] neighbourset[did] = [] if 'outputs' in drop: + # Assumes the model where all edges are defined from source to destination. This may not always be the case. for dest in drop['outputs']: dropset[dest][1] += 1 + dropset[did][2] += 1 neighbourset[did].append(dest) if 'consumers' in drop: # There may be some bizarre scenario when a drop has both for dest in drop['consumers']: dropset[dest][1] += 1 + dropset[did][2] += 1 neighbourset[did].append(dest) for did in dropset: @@ -462,7 +467,8 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): parenthash = [] if rmode >= ReproducibilityFlags.REPRODUCE.value: # TODO: Hack! may break later, proceed with caution - if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA: + if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA\ + and (dropset[did][1] == 0 or dropset[did][2] == 0): # Add my new hash to the parent-hash list parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) else: From d4dd2fb9fff38a658e38a0148c6d6a661bb7aa29 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 7 Jan 2021 15:35:24 +0800 Subject: [PATCH 150/484] Adds high-level recompute and total-replication support --- .../dlg/common/reproducibility/constants.py | 12 ++++++++---- .../dlg/common/reproducibility/reproducibility.py | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index f93564a27..ec4237bda 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -12,10 +12,12 @@ class ReproducibilityFlags(Enum): NOTHING = 0 RERUN = 1 REPEAT = 2 - REPRODUCE = 3 - REPLICATE_SCI = 4 # Rerun + Reproduce (holds numerically) - REPLICATE_COMP = 5 # Repeat + Reproduce (holds numerically) - EXPERIMENTAL = 6 + RECOMPUTE = 4 + REPRODUCE = 5 + REPLICATE_SCI = 6 # Rerun + Reproduce + REPLICATE_COMP = 7 # Recompute + Reproduce + REPLICATE_TOTAL = 8 # Repeat + Reproduce + EXPERIMENTAL = 9 REPRO_DEFAULT = ReproducibilityFlags.NOTHING @@ -58,9 +60,11 @@ def rmode_supported(flag: ReproducibilityFlags): if flag == ReproducibilityFlags.NOTHING \ or flag == ReproducibilityFlags.RERUN \ or flag == ReproducibilityFlags.REPEAT \ + or flag == ReproducibilityFlags.RECOMPUTE \ or flag == ReproducibilityFlags.REPRODUCE \ or flag == ReproducibilityFlags.REPLICATE_SCI \ or flag == ReproducibilityFlags.REPLICATE_COMP \ + or flag == ReproducibilityFlags.REPLICATE_TOTAL \ or flag == ReproducibilityFlags.EXPERIMENTAL: return True else: diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 954d0a121..f37a3720a 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -66,7 +66,9 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) if level == ReproducibilityFlags.RERUN: pass - elif level == ReproducibilityFlags.REPEAT or level == ReproducibilityFlags.REPLICATE_COMP: + elif level == ReproducibilityFlags.REPEAT or level == ReproducibilityFlags.REPLICATE_COMP \ + or level == ReproducibilityFlags.RECOMPUTE \ + or level == ReproducibilityFlags.REPLICATE_TOTAL: if category_type == 'Application': data['execution_time'] = fields['execution_time'] data['num_cpus'] = fields['num_cpus'] @@ -78,7 +80,7 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): data['num_of_procs'] = fields['num_of_procs'] elif category == Categories.DOCKER: data['image'] = fields['image'] - data['command'] = fields['commnad'] + data['command'] = fields['command'] data['user'] = fields['user'] data['ensureUserAndSwitch'] = fields['ensureUserAndSwitch'] data['removeContainer'] = fields['removeContainer'] @@ -163,7 +165,8 @@ def accumulate_pgt_partition_drop_data(drop: dict): data = accumulate_pgt_unroll_drop_data(drop) # This is the only piece of new information added at the partition level # It is only pertinent to Repetition and Computational replication - if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP: + if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP\ + or rmode == ReproducibilityFlags.RECOMPUTE or rmode == ReproducibilityFlags.REPLICATE_TOTAL: data['node'] = drop['node'][1:] data['island'] = drop['island'][1:] return data @@ -181,7 +184,8 @@ def accumulate_pg_drop_data(drop: dict): rmode = REPRO_DEFAULT drop['reprodata']['rmode'] = str(rmode.value) data = {} - if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP: + if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP\ + or rmode == ReproducibilityFlags.RECOMPUTE or rmode == ReproducibilityFlags.REPLICATE_TOTAL: data['node'] = drop['node'] data['island'] = drop['island'] return data From 6ce8512c27f995a7867971317e0c4856017ebcd0 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 7 Jan 2021 15:36:20 +0800 Subject: [PATCH 151/484] Adds base recompute and total replication data code. --- daliuge-runtime/dlg/drop.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 9e1be778b..f44691d50 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -637,6 +637,15 @@ def generate_repeat_data(self): """ return {'status': self._status} + def generate_recompute_data(self): + """ + Provides a dictionary containing recompute data. + At runtime, recomputing, like repeating and rerunning, by default, only shows success or failure. + We anticipate that any further implemented behaviour be done at a lower class. + :return: A dictionary containing runtime exclusive recompute values. + """ + return {'status': self._status} + def generate_reproduce_data(self): """ Provides a list of Reproducibility data (specifically). @@ -659,10 +668,21 @@ def generate_replicate_sci_data(self): def generate_replicate_comp_data(self): """ Provides a list of computational replication data. - This is by definition a merging of both reproduction and repetition data + This is by definition a merging of both reproduction and recompute data :return: A dictionary containing runtime exclusive computational replication data. """ res = {} + res.update(self.generate_recompute_data()) + res.update(self.generate_reproduce_data()) + return res + + def generate_replicate_total_data(self): + """ + Provides a list of total replication data. + This is by definition a merging of reproduction and repetition data + :return: A dictionary containing runtime exclusive total replication data. + """ + res = {} res.update(self.generate_repeat_data()) res.update(self.generate_reproduce_data()) return res @@ -681,12 +701,16 @@ def generate_merkle_data(self): return self.generate_rerun_data() elif self._reproducibility is ReproducibilityFlags.REPEAT: return self.generate_repeat_data() + elif self._reproducibility is ReproducibilityFlags.RECOMPUTE: + return self.generate_recompute_data() elif self._reproducibility is ReproducibilityFlags.REPRODUCE: return self.generate_reproduce_data() elif self._reproducibility is ReproducibilityFlags.REPLICATE_SCI: return self.generate_replicate_sci_data() elif self._reproducibility is ReproducibilityFlags.REPLICATE_COMP: return self.generate_replicate_comp_data() + elif self._reproducibility is ReproducibilityFlags.REPLICATE_TOTAL: + return self.generate_replicate_total_data() else: raise NotImplementedError("Currently other levels are not in development.") From fa95c7af6127a8d272e350484468e78cda9cc819 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 8 Jan 2021 11:05:03 +0800 Subject: [PATCH 152/484] Adds low-level recompute information for bash_shell_app.py --- daliuge-runtime/dlg/apps/bash_shell_app.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/dlg/apps/bash_shell_app.py b/daliuge-runtime/dlg/apps/bash_shell_app.py index 6f895ef05..e2c2a4fe3 100644 --- a/daliuge-runtime/dlg/apps/bash_shell_app.py +++ b/daliuge-runtime/dlg/apps/bash_shell_app.py @@ -161,6 +161,8 @@ def initialize(self, **kwargs): if not self.command: raise InvalidDropException(self, 'No command specified, cannot create BashShellApp') + self._recompute_data = {} + def _run_bash(self, inputs, outputs, stdin=None, stdout=subprocess.PIPE): """ @@ -217,10 +219,11 @@ def _run_bash(self, inputs, outputs, stdin=None, if stdout != subprocess.PIPE: pstdout = b"" pcode = process.returncode - end = time.time() logger.info("Finished in %.3f [s] with exit code %d", (end - start), pcode) - + self._recompute_data['stdout'] = str(pstdout) + self._recompute_data['stderr'] = str(pstderr) + self._recompute_data['status'] = str(pcode) if pcode == 0 and logger.isEnabledFor(logging.DEBUG): logger.debug(mesage_stdouts("Command finished successfully", pstdout, pstderr)) elif pcode != 0: @@ -238,6 +241,10 @@ def cancel(self): except: logger.exception("Error while terminating process %r", self.proc) + def generate_recompute_data(self): + self._recompute_data['command'] = self.command + return self._recompute_data + class StreamingInputBashAppBase(BashShellBase, AppDROP): """ From 5d483c3890c4724966db50927e892ba0f94589cb Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 8 Jan 2021 11:20:06 +0800 Subject: [PATCH 153/484] Adds low-level recompute information for dockerapp.py --- daliuge-runtime/dlg/apps/dockerapp.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/daliuge-runtime/dlg/apps/dockerapp.py b/daliuge-runtime/dlg/apps/dockerapp.py index b9530cb54..d13c94330 100644 --- a/daliuge-runtime/dlg/apps/dockerapp.py +++ b/daliuge-runtime/dlg/apps/dockerapp.py @@ -248,6 +248,10 @@ def initialize(self, **kwargs): self._containerIp = None self._containerId = None self._waiters = [] + self._recompute_data = {'image': self._image, + 'user': self._user, + 'command': self._command, + 'ensureUserAndSwitch': self._ensureUserAndSwitch} @property def containerIp(self): @@ -289,7 +293,6 @@ def run(self): cmd = droputils.replace_path_placeholders(self._command, dockerInputs, dockerOutputs) cmd = droputils.replace_dataurl_placeholders(cmd, dataURLInputs, dataURLOutputs) - # We bind the inputs and outputs inside the docker under the DLG_ROOT # directory, maintaining the rest of their original paths. # Outputs are bound only up to their dirname (see class doc for details) @@ -306,7 +309,6 @@ def run(self): uid, ip = waiter.waitForIp() cmd = cmd.replace("%containerIp[{0}]%".format(uid), ip) logger.debug("Command after IP replacement is: %s", cmd) - # If a user has been given, we run the container as that user. It is # useful to make sure that the USER environment variable is set in those # cases (e.g., casapy requires this to correctly operate) @@ -335,7 +337,7 @@ def run(self): cmd = '/bin/bash -c "%s"' % (utils.escapeQuotes(cmd, singleQuotes=False)) logger.debug("Command after user creation and wrapping is: %s", cmd) - + self._recompute_data['command'] = cmd c = DockerApp._get_client() # Remove the container unless it's specified that we should keep it @@ -366,7 +368,7 @@ def rm(container): inspection = c.api.inspect_container(cId) logger.debug("Docker inspection: %r", inspection) self.containerIp = inspection['NetworkSettings']['IPAddress'] - + self._recompute_data['containerIP'] = self.containerIp # Wait until it finishes # In docker-py < 3 the .wait() method returns the exit code directly # In docker-py >= 3 the .wait() method returns a dictionary with the API response @@ -378,15 +380,15 @@ def rm(container): end = time.time() logger.info("Container %s finished in %.2f [s] with exit code %d", cId, (end - start), self._exitCode) - + stdout = container.logs(stream=False, stdout=True, stderr=False) + stderr = container.logs(stream=False, stdout=False, stderr=True) + self._recompute_data['status'] = self._exitCode + self._recompute_data['stdout'] = str(stdout) + self._recompute_data['stderr'] = str(stderr) if self._exitCode == 0 and logger.isEnabledFor(logging.DEBUG): - stdout = container.logs(stream=False, stdout=True, stderr=False) - stderr = container.logs(stream=False, stdout=False, stderr=True) logger.debug("Container %s finished successfully, output follows.\n==STDOUT==\n%s==STDERR==\n%s", cId, stdout, stderr) elif self._exitCode != 0: - stdout = container.logs(stream=False, stdout=True, stderr=False) - stderr = container.logs(stream=False, stdout=False, stderr=True) msg = "Container %s didn't finish successfully (exit code %d)" % (cId, self._exitCode) logger.error(msg + ", output follows.\n==STDOUT==\n%s==STDERR==\n%s", stdout, stderr) rm(container) @@ -411,3 +413,6 @@ def _kwargs_from_env(cls, ssl_version=None, assert_hostname=False): if os.path.exists(config_file_name): return ConfigObj(config_file_name) return {} + + def generate_recompute_data(self): + return self._recompute_data From 6dcd022959739bbdc58c281a84188273d4de8cfb Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 8 Jan 2021 11:43:39 +0800 Subject: [PATCH 154/484] Adds low-level recompute information for pyfunc.py --- daliuge-runtime/dlg/apps/pyfunc.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/apps/pyfunc.py b/daliuge-runtime/dlg/apps/pyfunc.py index d9ccb6f11..b6181ef6a 100644 --- a/daliuge-runtime/dlg/apps/pyfunc.py +++ b/daliuge-runtime/dlg/apps/pyfunc.py @@ -125,6 +125,7 @@ def initialize(self, **kwargs): # Mapping between argument name and input drop uids self.func_arg_mapping = self._getArg(kwargs, 'func_arg_mapping', {}) logger.debug("Input mapping: %r", self.func_arg_mapping) + self._recompute_data = {} def run(self): @@ -147,7 +148,8 @@ def run(self): logger.debug("Running %s with args=%r, kwargs=%r", self.fname, args, kwargs) result = self.f(*args, **kwargs) - + self._recompute_data['args'] = args + self._recompute_data['kwargs'] = kwargs # Depending on how many outputs we have we treat our result # as an iterable or as a single object. Each result is pickled # and written to its corresponding output @@ -155,4 +157,8 @@ def run(self): if len(outputs) == 1: result = [result] for r, o in zip(result, outputs): + self._recompute_data[o.dataURL] = str(r) # TODO: Revise if this is not ideal o.write(pickle.dumps(r)) # @UndefinedVariable + + def generate_recompute_data(self): + return self._recompute_data From 04a9b9c4fd44e85ec941a4e906e0f01f7a9b3201 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 8 Jan 2021 11:47:45 +0800 Subject: [PATCH 155/484] Adds low-level recompute information for mpi.py --- daliuge-runtime/dlg/apps/mpi.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/daliuge-runtime/dlg/apps/mpi.py b/daliuge-runtime/dlg/apps/mpi.py index b1e5f3046..4c741c7d3 100644 --- a/daliuge-runtime/dlg/apps/mpi.py +++ b/daliuge-runtime/dlg/apps/mpi.py @@ -52,6 +52,8 @@ def initialize(self, **kwargs): self._maxprocs = self._getArg(kwargs, 'maxprocs', 1) self._use_wrapper = self._getArg(kwargs, 'use_wrapper', False) self._args = self._getArg(kwargs, 'args', []) + self._recompute_data = {'command': self._command, + 'maxprocs': self._maxprocs} if not self._command: raise InvalidDropException(self, 'No command specified, cannot create MPIApp') @@ -91,6 +93,7 @@ def run(self): any_failed = False for rank, (stdout, stderr, code) in enumerate(children_data): + self._recompute_data[str(rank)] = [code, str(stdout), str(stderr)] if code == 0: continue any_failed = True @@ -102,6 +105,9 @@ def run(self): else: comm_children.barrier() + def generate_recompute_data(self): + return self._recompute_data + # When we are called by the MPIApp def module_as_main(): From b732afe34b4b3c456c105b5fd88664428e66c7a6 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 12 Jan 2021 12:55:42 +0800 Subject: [PATCH 156/484] Adds recompute functionality to dynlib.py Stores a dictionary of CDlgApp variables cast to string representations. --- daliuge-runtime/dlg/apps/dynlib.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daliuge-runtime/dlg/apps/dynlib.py b/daliuge-runtime/dlg/apps/dynlib.py index ead403e5d..ffaffe8a5 100644 --- a/daliuge-runtime/dlg/apps/dynlib.py +++ b/daliuge-runtime/dlg/apps/dynlib.py @@ -94,6 +94,12 @@ class CDlgApp(ctypes.Structure): ("data", ctypes.c_void_p), ] + def pack_python(self): + out = {} + for key, val in self._fields_.items(): + out[key] = six.b(str(val)) + return out + def _to_c_input(i): """ @@ -297,6 +303,9 @@ def _ensure_c_outputs_are_set(self): return prepare_c_outputs(self._c_app, self.outputs) + def generate_recompute_data(self): + return self._c_app.pack_python() + class DynlibStreamApp(DynlibAppBase, AppDROP): def initialize(self, **kwargs): From 364e694834cdb1e4440342ecdcf0eeaa45441c8c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 12 Jan 2021 13:01:43 +0800 Subject: [PATCH 157/484] Moves generate_recompute_data in dynlib.py to the Drop-inheriting classes. Adds 'status' field --- daliuge-runtime/dlg/apps/dynlib.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/daliuge-runtime/dlg/apps/dynlib.py b/daliuge-runtime/dlg/apps/dynlib.py index ffaffe8a5..7f4aa3cce 100644 --- a/daliuge-runtime/dlg/apps/dynlib.py +++ b/daliuge-runtime/dlg/apps/dynlib.py @@ -303,9 +303,6 @@ def _ensure_c_outputs_are_set(self): return prepare_c_outputs(self._c_app, self.outputs) - def generate_recompute_data(self): - return self._c_app.pack_python() - class DynlibStreamApp(DynlibAppBase, AppDROP): def initialize(self, **kwargs): @@ -341,6 +338,10 @@ def addStreamingInput(self, streamingInputDrop, back=True): super(DynlibStreamApp, self).addStreamingInput(streamingInputDrop, back) self._c_app.n_streaming_inputs += 1 + def generate_recompute_data(self): + out = {'status': self.status} + return out.update(self._c_app.pack_python()) + class DynlibApp(DynlibAppBase, BarrierAppDROP): """Loads a dynamic library into the current process and runs it""" @@ -355,6 +356,10 @@ def run(self): self._ensure_c_outputs_are_set() run(self.lib, self._c_app, input_closers) + def generate_recompute_data(self): + out = {'status': self.status} + return out.update(self._c_app.pack_python()) + class FinishSubprocess(Exception): pass From 78b3810980d042d989ffe913b31de4553adbb40f Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 14 Jan 2021 12:53:01 +0800 Subject: [PATCH 158/484] Exchanges PGS/PGT behaviour for repeat/total_replication and recompute/computational_replication --- .../dlg/common/reproducibility/reproducibility.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index f37a3720a..35a654658 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -165,8 +165,7 @@ def accumulate_pgt_partition_drop_data(drop: dict): data = accumulate_pgt_unroll_drop_data(drop) # This is the only piece of new information added at the partition level # It is only pertinent to Repetition and Computational replication - if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP\ - or rmode == ReproducibilityFlags.RECOMPUTE or rmode == ReproducibilityFlags.REPLICATE_TOTAL: + if rmode == ReproducibilityFlags.REPLICATE_COMP or rmode == ReproducibilityFlags.RECOMPUTE: data['node'] = drop['node'][1:] data['island'] = drop['island'][1:] return data @@ -184,8 +183,7 @@ def accumulate_pg_drop_data(drop: dict): rmode = REPRO_DEFAULT drop['reprodata']['rmode'] = str(rmode.value) data = {} - if rmode == ReproducibilityFlags.REPEAT or rmode == ReproducibilityFlags.REPLICATE_COMP\ - or rmode == ReproducibilityFlags.RECOMPUTE or rmode == ReproducibilityFlags.REPLICATE_TOTAL: + if rmode == ReproducibilityFlags.REPLICATE_COMP or rmode == ReproducibilityFlags.RECOMPUTE: data['node'] = drop['node'] data['island'] = drop['island'] return data From 0a7692e2c7c87d5d4190b4fefa4c922cc9c47e38 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 18 Jan 2021 12:02:54 +0800 Subject: [PATCH 159/484] Adds a signal generator drop --- .../dlg/common/reproducibility/apps.py | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps.py b/daliuge-common/dlg/common/reproducibility/apps.py index ede2965bc..c2d4fdc76 100644 --- a/daliuge-common/dlg/common/reproducibility/apps.py +++ b/daliuge-common/dlg/common/reproducibility/apps.py @@ -1,4 +1,13 @@ +import pickle + +import numpy as np +from dlg import droputils from dlg.apps.pyfunc import PyFuncApp +from dlg.apps.simple import BarrierAppDROP +from dlg.meta import dlg_batch_output, dlg_streaming_input +from dlg.meta import dlg_component, dlg_batch_input +from dlg.meta import dlg_int_param, dlg_list_param +from merklelib import MerkleTree def writeIn(): @@ -42,4 +51,56 @@ def initialize(self, **kwargs): class MyAverage(PyFuncApp): def initialize(self, **kwargs): fname = 'dlg.common.reproducibility.apps.my_av' - super(MyAverage, self).initialize(func_name=fname) \ No newline at end of file + super(MyAverage, self).initialize(func_name=fname) + + +class LP_SignalGenerator(BarrierAppDROP): + component_meta = dlg_component('LPSignalGen', 'Low-pass filter example signal generator', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + # default values + length = dlg_int_param('length', 512) + srate = dlg_int_param('sample rate', 5000) + freqs = dlg_list_param('Frequencies(int)', [440, 800, 1000, 2000]) + series = np.empty([1]) + + def initialize(self, **kwargs): + super(LP_SignalGenerator, self).initialize(**kwargs) + + def gen_sig(self): + series = np.zeros(self.length, dtype=np.float64) + for freq in self.freqs: + for i in range(self.length): + series[i] += np.sin(2 * np.pi * i * freq / self.srate) + return series + + def getInputArrays(self): + ins = self.inputs + if len(ins) < 1: + raise Exception('At least one input required for %r' % self) + + freqs = [pickle.loads(droputils.allDropContents(inp)) for inp in ins] + self.freqs = freqs + + def run(self): + outs = self.outputs + if len(outs) < 1: + raise Exception('At least one output required for %r' % self) + self.getInputArrays() + self.series = self.gen_sig() + for o in outs: + data = pickle.dumps(self.series) + o.len = len(data) + o.write(data) + + def generate_recompute_data(self): + # This will do for now + return {'length': self.length, + 'sample_rate': self.srate, + 'frequencies': self.freqs} + + def generate_reproduce_data(self): + # This will do for now + return {'data_hash': MerkleTree(self.series).merkle_root} From 172a85ceef29ca8a7a5573c37aa0409f67e474d4 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 18 Jan 2021 12:11:58 +0800 Subject: [PATCH 160/484] Adds a window generator drop and refines signal generator --- .../dlg/common/reproducibility/apps.py | 64 +++++++++++++++---- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps.py b/daliuge-common/dlg/common/reproducibility/apps.py index c2d4fdc76..20154ed2a 100644 --- a/daliuge-common/dlg/common/reproducibility/apps.py +++ b/daliuge-common/dlg/common/reproducibility/apps.py @@ -1,7 +1,6 @@ import pickle import numpy as np -from dlg import droputils from dlg.apps.pyfunc import PyFuncApp from dlg.apps.simple import BarrierAppDROP from dlg.meta import dlg_batch_output, dlg_streaming_input @@ -76,22 +75,13 @@ def gen_sig(self): series[i] += np.sin(2 * np.pi * i * freq / self.srate) return series - def getInputArrays(self): - ins = self.inputs - if len(ins) < 1: - raise Exception('At least one input required for %r' % self) - - freqs = [pickle.loads(droputils.allDropContents(inp)) for inp in ins] - self.freqs = freqs - def run(self): outs = self.outputs if len(outs) < 1: raise Exception('At least one output required for %r' % self) - self.getInputArrays() self.series = self.gen_sig() + data = pickle.dumps(self.series) for o in outs: - data = pickle.dumps(self.series) o.len = len(data) o.write(data) @@ -104,3 +94,55 @@ def generate_recompute_data(self): def generate_reproduce_data(self): # This will do for now return {'data_hash': MerkleTree(self.series).merkle_root} + + +class LP_WindowGenerator(BarrierAppDROP): + component_meta = dlg_component('LPWindowGen', 'Low-pass filter example window generator', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + # default values + length = dlg_int_param('length', 512) + cutoff = dlg_int_param('cutoff', 600) + srate = dlg_int_param('sample_rate', 5000) + series = np.empty([1]) + + def initialize(self, **kwargs): + super(LP_WindowGenerator, self).initialize(**kwargs) + + def sinc(self, x_val: np.float64): + """ + Computes the sin_c value for the input float + :param x_val: + """ + if np.isclose(x_val, 0.0): + return 1.0 + return np.sin(np.pi * x_val) / (np.pi * x_val) + + def gen_win(self): + alpha = 2 * self.cutoff / self.srate + win = np.zeros(self.length) + for i in range(self.length): + ham = 0.54 - 0.46 * np.cos(2 * np.pi * i / self.length) # Hamming coefficient + hsupp = (i - self.length / 2) + win[i] = ham * alpha * self.sinc(alpha * hsupp) + return win + + def run(self): + outs = self.outputs + if len(outs) < 1: + raise Exception('At least one output required for %r' % self) + self.series = self.gen_win() + data = pickle.dumps(self.series) + for o in outs: + o.len = len(data) + o.write(data) + + def generate_recompute_data(self): + return {'length': self.length, + 'cutoff': self.cutoff, + 'sample_rate': self.srate} + + def generate_reproduce_data(self): + return {'data_hash', MerkleTree(self.series).merkle_root} From e40ab0262061baa1b96cc1d5abd99f9f2d444a43 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 18 Jan 2021 12:21:53 +0800 Subject: [PATCH 161/484] Separates Lowpass example specific apps into apps_lowpass.py --- .../dlg/common/reproducibility/apps.py | 103 ------------------ .../common/reproducibility/apps_lowpass.py | 103 ++++++++++++++++++ 2 files changed, 103 insertions(+), 103 deletions(-) create mode 100644 daliuge-common/dlg/common/reproducibility/apps_lowpass.py diff --git a/daliuge-common/dlg/common/reproducibility/apps.py b/daliuge-common/dlg/common/reproducibility/apps.py index 20154ed2a..993993fe6 100644 --- a/daliuge-common/dlg/common/reproducibility/apps.py +++ b/daliuge-common/dlg/common/reproducibility/apps.py @@ -1,12 +1,4 @@ -import pickle - -import numpy as np from dlg.apps.pyfunc import PyFuncApp -from dlg.apps.simple import BarrierAppDROP -from dlg.meta import dlg_batch_output, dlg_streaming_input -from dlg.meta import dlg_component, dlg_batch_input -from dlg.meta import dlg_int_param, dlg_list_param -from merklelib import MerkleTree def writeIn(): @@ -51,98 +43,3 @@ class MyAverage(PyFuncApp): def initialize(self, **kwargs): fname = 'dlg.common.reproducibility.apps.my_av' super(MyAverage, self).initialize(func_name=fname) - - -class LP_SignalGenerator(BarrierAppDROP): - component_meta = dlg_component('LPSignalGen', 'Low-pass filter example signal generator', - [dlg_batch_input('binary/*', [])], - [dlg_batch_output('binary/*', [])], - [dlg_streaming_input('binary/*')]) - - # default values - length = dlg_int_param('length', 512) - srate = dlg_int_param('sample rate', 5000) - freqs = dlg_list_param('Frequencies(int)', [440, 800, 1000, 2000]) - series = np.empty([1]) - - def initialize(self, **kwargs): - super(LP_SignalGenerator, self).initialize(**kwargs) - - def gen_sig(self): - series = np.zeros(self.length, dtype=np.float64) - for freq in self.freqs: - for i in range(self.length): - series[i] += np.sin(2 * np.pi * i * freq / self.srate) - return series - - def run(self): - outs = self.outputs - if len(outs) < 1: - raise Exception('At least one output required for %r' % self) - self.series = self.gen_sig() - data = pickle.dumps(self.series) - for o in outs: - o.len = len(data) - o.write(data) - - def generate_recompute_data(self): - # This will do for now - return {'length': self.length, - 'sample_rate': self.srate, - 'frequencies': self.freqs} - - def generate_reproduce_data(self): - # This will do for now - return {'data_hash': MerkleTree(self.series).merkle_root} - - -class LP_WindowGenerator(BarrierAppDROP): - component_meta = dlg_component('LPWindowGen', 'Low-pass filter example window generator', - [dlg_batch_input('binary/*', [])], - [dlg_batch_output('binary/*', [])], - [dlg_streaming_input('binary/*')]) - - # default values - length = dlg_int_param('length', 512) - cutoff = dlg_int_param('cutoff', 600) - srate = dlg_int_param('sample_rate', 5000) - series = np.empty([1]) - - def initialize(self, **kwargs): - super(LP_WindowGenerator, self).initialize(**kwargs) - - def sinc(self, x_val: np.float64): - """ - Computes the sin_c value for the input float - :param x_val: - """ - if np.isclose(x_val, 0.0): - return 1.0 - return np.sin(np.pi * x_val) / (np.pi * x_val) - - def gen_win(self): - alpha = 2 * self.cutoff / self.srate - win = np.zeros(self.length) - for i in range(self.length): - ham = 0.54 - 0.46 * np.cos(2 * np.pi * i / self.length) # Hamming coefficient - hsupp = (i - self.length / 2) - win[i] = ham * alpha * self.sinc(alpha * hsupp) - return win - - def run(self): - outs = self.outputs - if len(outs) < 1: - raise Exception('At least one output required for %r' % self) - self.series = self.gen_win() - data = pickle.dumps(self.series) - for o in outs: - o.len = len(data) - o.write(data) - - def generate_recompute_data(self): - return {'length': self.length, - 'cutoff': self.cutoff, - 'sample_rate': self.srate} - - def generate_reproduce_data(self): - return {'data_hash', MerkleTree(self.series).merkle_root} diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py new file mode 100644 index 000000000..368c31d0f --- /dev/null +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -0,0 +1,103 @@ +import pickle + +import numpy as np +from dlg.apps.simple import BarrierAppDROP +from dlg.meta import dlg_batch_output, dlg_streaming_input +from dlg.meta import dlg_component, dlg_batch_input +from dlg.meta import dlg_int_param, dlg_list_param +from merklelib import MerkleTree + + +class LP_SignalGenerator(BarrierAppDROP): + component_meta = dlg_component('LPSignalGen', 'Low-pass filter example signal generator', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + # default values + length = dlg_int_param('length', 512) + srate = dlg_int_param('sample rate', 5000) + freqs = dlg_list_param('Frequencies(int)', [440, 800, 1000, 2000]) + series = np.empty([1]) + + def initialize(self, **kwargs): + super(LP_SignalGenerator, self).initialize(**kwargs) + + def gen_sig(self): + series = np.zeros(self.length, dtype=np.float64) + for freq in self.freqs: + for i in range(self.length): + series[i] += np.sin(2 * np.pi * i * freq / self.srate) + return series + + def run(self): + outs = self.outputs + if len(outs) < 1: + raise Exception('At least one output required for %r' % self) + self.series = self.gen_sig() + data = pickle.dumps(self.series) + for o in outs: + o.len = len(data) + o.write(data) + + def generate_recompute_data(self): + # This will do for now + return {'length': self.length, + 'sample_rate': self.srate, + 'frequencies': self.freqs} + + def generate_reproduce_data(self): + # This will do for now + return {'data_hash': MerkleTree(self.series).merkle_root} + + +class LP_WindowGenerator(BarrierAppDROP): + component_meta = dlg_component('LPWindowGen', 'Low-pass filter example window generator', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + # default values + length = dlg_int_param('length', 512) + cutoff = dlg_int_param('cutoff', 600) + srate = dlg_int_param('sample_rate', 5000) + series = np.empty([1]) + + def initialize(self, **kwargs): + super(LP_WindowGenerator, self).initialize(**kwargs) + + def sinc(self, x_val: np.float64): + """ + Computes the sin_c value for the input float + :param x_val: + """ + if np.isclose(x_val, 0.0): + return 1.0 + return np.sin(np.pi * x_val) / (np.pi * x_val) + + def gen_win(self): + alpha = 2 * self.cutoff / self.srate + win = np.zeros(self.length) + for i in range(self.length): + ham = 0.54 - 0.46 * np.cos(2 * np.pi * i / self.length) # Hamming coefficient + hsupp = (i - self.length / 2) + win[i] = ham * alpha * self.sinc(alpha * hsupp) + return win + + def run(self): + outs = self.outputs + if len(outs) < 1: + raise Exception('At least one output required for %r' % self) + self.series = self.gen_win() + data = pickle.dumps(self.series) + for o in outs: + o.len = len(data) + o.write(data) + + def generate_recompute_data(self): + return {'length': self.length, + 'cutoff': self.cutoff, + 'sample_rate': self.srate} + + def generate_reproduce_data(self): + return {'data_hash', MerkleTree(self.series).merkle_root} From 632357304115b822add7d8a297d44304cce2253b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 18 Jan 2021 12:58:13 +0800 Subject: [PATCH 162/484] Adds add_noise drop to Lowpass example. --- .../common/reproducibility/apps_lowpass.py | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 368c31d0f..e453c85ab 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -1,10 +1,11 @@ import pickle import numpy as np +from dlg import droputils from dlg.apps.simple import BarrierAppDROP from dlg.meta import dlg_batch_output, dlg_streaming_input from dlg.meta import dlg_component, dlg_batch_input -from dlg.meta import dlg_int_param, dlg_list_param +from dlg.meta import dlg_int_param, dlg_list_param, dlg_float_param from merklelib import MerkleTree @@ -101,3 +102,59 @@ def generate_recompute_data(self): def generate_reproduce_data(self): return {'data_hash', MerkleTree(self.series).merkle_root} + + +class LP_AddNoise(BarrierAppDROP): + component_meta = dlg_component('LPAddNoise', 'Adds noise to a signal generated for the low-pass filter example', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + # default values + mean = dlg_float_param('avg_noise', 0.0) + std = dlg_float_param('std_deviation', 1.0) + freq = dlg_int_param('frequency', 1200) + srate = dlg_int_param('sample_rate', 5000) + seed = dlg_int_param('random_seed', 42) + alpha = dlg_float_param('noise_multiplier', 0.1) + signal = np.empty([1]) + + def initialize(self, **kwargs): + super(LP_AddNoise).initialize(**kwargs) + + def add_noise(self): + np.random.seed(self.seed) + samples = self.alpha * np.random.normal(self.mean, self.std, size=len(self.signal)) + for i in range(len(self.signal)): + samples[i] += np.sin(2 * np.pi * i * self.freq / self.srate) + np.add(self.signal, samples, out=self.signal) + return self.signal + + def getInputArrays(self): + ins = self.inputs + if len(ins) != 1: + raise Exception('Precisely one input required for %r' % self) + + array = pickle.loads(droputils.allDropContents(ins[0])) + self.signal = array + + def run(self): + outs = self.outputs + if len(outs) < 1: + raise Exception('At least one output required for %r' % self) + self.getInputArrays() + sig = self.add_noise() + data = pickle.dumps(sig) + for o in outs: + o.len = len(data) + o.write(data) + + def generate_recompute_data(self): + return {'mean': self.mean, + 'std': self.std, + 'sample_rate': self.srate, + 'seed': self.seed, + 'alpha': self.alpha} + + def generate_reproduce_data(self): + return {'data_hash', MerkleTree(self.signal).merkle_root} From 39a1f5fb20feb68085fb00e7d9352eaf116156af Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 18 Jan 2021 16:01:54 +0800 Subject: [PATCH 163/484] Adds pointwise filter to apps_lowpass.py --- .../common/reproducibility/apps_lowpass.py | 160 +++++++++++++++++- 1 file changed, 159 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index e453c85ab..93c91ef9a 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -1,14 +1,23 @@ import pickle import numpy as np +import pyfftw from dlg import droputils from dlg.apps.simple import BarrierAppDROP from dlg.meta import dlg_batch_output, dlg_streaming_input from dlg.meta import dlg_component, dlg_batch_input -from dlg.meta import dlg_int_param, dlg_list_param, dlg_float_param +from dlg.meta import dlg_int_param, dlg_list_param, dlg_float_param, dlg_bool_param from merklelib import MerkleTree +def determine_size(length): + """ + :param length: + :return: Computes the next largest power of two needed to contain |length| elements + """ + return int(2 ** np.ceil(np.log2(length))) - 1 + + class LP_SignalGenerator(BarrierAppDROP): component_meta = dlg_component('LPSignalGen', 'Low-pass filter example signal generator', [dlg_batch_input('binary/*', [])], @@ -158,3 +167,152 @@ def generate_recompute_data(self): def generate_reproduce_data(self): return {'data_hash', MerkleTree(self.signal).merkle_root} + + +class LP_filter_fft_np(BarrierAppDROP): + component_meta = dlg_component('LP_filter_np', 'Filters a signal with a provided window using numpy', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + PRECISIONS = {'double': {'float': np.float64, 'complex': np.complex128}, + 'single': {'float': np.float32, 'complex': np.complex64}} + precision = {} + # default values + double_prec = dlg_bool_param('doublePrec', True) + series = [] + output = np.zeros([1]) + + def initialize(self, **kwargs): + super(LP_filter_fft_np, self).initialize(**kwargs) + if self.double_prec: + self.precision = self.PRECISIONS['double'] + else: + self.precision = self.PRECISIONS['single'] + + def getInputArrays(self): + ins = self.inputs + if len(ins) != 2: + raise Exception('Precisely two input required for %r' % self) + + array = [pickle.loads(droputils.allDropContents(inp)) for inp in ins] + self.series = array + + def filter(self): + nfft = int(2 ** np.ceil(np.log2(len(self.series[0] + self.series[1] - 1)))) - 1 + sig_zero_pad = np.zeros(nfft, dtype=self.precision['float']) + win_zero_pad = np.zeros(nfft, dtype=self.precision['float']) + sig_zero_pad[0:len(self.series[0])] = self.series[0] + win_zero_pad[0:len(self.series[1])] = self.series[1] + sig_fft = np.fft.fft(sig_zero_pad) + win_fft = np.fft.fft(win_zero_pad) + out_fft = np.multiply(sig_fft, win_fft) + out = np.fft.ifft(out_fft) + return out.astype(self.precision['complex']) + + def run(self): + outs = self.outputs + if len(outs) < 1: + raise Exception('At least one output required for %r' % self) + self.getInputArrays() + self.output = self.filter() + data = pickle.dumps(self.output) + for o in outs: + o.len = len(data) + o.write(data) + + def generate_recompute_data(self): + return {'precision_float': self.precision['float'], + 'precision_complex': self.precision['complex']} + + def generate_reproduce_data(self): + mtree = MerkleTree(self.series[0]) + mtree.append(self.series[1]) + mtree.append(self.output) + return {'data_hash': mtree.merkle_root} + + +class LP_filter_fft_fftw(LP_filter_fft_np): + component_meta = dlg_component('LP_filter_fftw', 'Filters a signal with a provided window using FFTW', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + def initialize(self, **kwargs): + super(LP_filter_fft_fftw, self).initialize(**kwargs) + + def filter(self): + pyfftw.interfaces.cache.disable() + signal = self.series[0] + window = self.series[1] + nfft = determine_size(len(signal) + len(window) - 1) + sig_zero_pad = pyfftw.empty_aligned(len(signal), dtype=self.precision['float']) + win_zero_pad = pyfftw.empty_aligned(len(window), dtype=self.precision['float']) + sig_zero_pad[0:len(signal)] = signal + win_zero_pad[0:len(window)] = window + sig_fft = pyfftw.interfaces.numpy_fft.fft(sig_zero_pad, n=nfft) + win_fft = pyfftw.interfaces.numpy_fft.fft(win_zero_pad, n=nfft) + out_fft = np.multiply(sig_fft, win_fft) + out = pyfftw.interfaces.numpy_fft.ifft(out_fft, n=nfft) + return out.astype(self.precision['complex']) + + +class LP_filter_fft_cuda(LP_filter_fft_np): + component_meta = dlg_component('LP_filter_fft_cuda', 'Filters a signal with a provided window using cuda', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + def initialize(self, **kwargs): + super(LP_filter_fft_cuda, self).initialize(**kwargs) + + def filter(self): + import pycuda.gpuarray as gpuarray + import skcuda.fft as cu_fft + import skcuda.linalg as linalg + signal = self.series[0] + window = self.series[1] + linalg.init() + nfft = determine_size(len(signal) + len(window) - 1) + # Move data to GPU + sig_zero_pad = np.zeros(nfft, dtype=self.precision['float']) + win_zero_pad = np.zeros(nfft, dtype=self.precision['float']) + sig_gpu = gpuarray.zeros(sig_zero_pad.shape, dtype=self.precision['float']) + win_gpu = gpuarray.zeros(win_zero_pad.shape, dtype=self.precision['float']) + sig_zero_pad[0:len(signal)] = signal + win_zero_pad[0:len(window)] = window + sig_gpu.set(sig_zero_pad) + win_gpu.set(win_zero_pad) + + # Plan forwards + sig_fft_gpu = gpuarray.zeros(nfft, dtype=self.precision['complex']) + win_fft_gpu = gpuarray.zeros(nfft, dtype=self.precision['complex']) + sig_plan_forward = cu_fft.Plan(sig_fft_gpu.shape, self.precision['float'], self.precision['complex']) + win_plan_forward = cu_fft.Plan(win_fft_gpu.shape, self.precision['float'], self.precision['complex']) + cu_fft.fft(sig_gpu, sig_fft_gpu, sig_plan_forward) + cu_fft.fft(win_gpu, win_fft_gpu, win_plan_forward) + + # Convolve + out_fft = linalg.multiply(sig_fft_gpu, win_fft_gpu, overwrite=True) + linalg.scale(2.0, out_fft) + + # Plan inverse + out_gpu = gpuarray.zeros_like(out_fft) + plan_inverse = cu_fft.Plan(out_fft.shape, self.precision['complex'], self.precision['complex']) + cu_fft.ifft(out_fft, out_gpu, plan_inverse, True) + out_np = np.zeros(len(out_gpu), self.precision['complex']) + out_gpu.get(out_np) + return out_np + + +class LP_filter_pointwise_np(LP_filter_fft_np): + component_meta = dlg_component('LP_filter_pointwise_np', 'Filters a signal with a provided window using cuda', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + def initialize(self, **kwargs): + super(LP_filter_pointwise_np, self).initialize(**kwargs) + + def filter(self): + return np.convolve(self.series[0], self.series[1], mode='full').astype(self.precision['complex']) From 974e780fd20de83ef99e2ee89f363742d57bf6b8 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 20 Jan 2021 15:07:36 +0800 Subject: [PATCH 164/484] Adds full support for lowpass filter implementations --- .../common/reproducibility/apps_lowpass.py | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 93c91ef9a..6c973ddc1 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -4,10 +4,10 @@ import pyfftw from dlg import droputils from dlg.apps.simple import BarrierAppDROP +from dlg.common.reproducibility.reproducibility import common_hash from dlg.meta import dlg_batch_output, dlg_streaming_input from dlg.meta import dlg_component, dlg_batch_input from dlg.meta import dlg_int_param, dlg_list_param, dlg_float_param, dlg_bool_param -from merklelib import MerkleTree def determine_size(length): @@ -20,7 +20,7 @@ def determine_size(length): class LP_SignalGenerator(BarrierAppDROP): component_meta = dlg_component('LPSignalGen', 'Low-pass filter example signal generator', - [dlg_batch_input('binary/*', [])], + [None], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) @@ -50,20 +50,21 @@ def run(self): o.len = len(data) o.write(data) + def generate_reproduce_data(self): + # This will do for now + return {'data_hash': common_hash(self.series)} + def generate_recompute_data(self): # This will do for now return {'length': self.length, 'sample_rate': self.srate, - 'frequencies': self.freqs} - - def generate_reproduce_data(self): - # This will do for now - return {'data_hash': MerkleTree(self.series).merkle_root} + 'frequencies': self.freqs, + 'status': self.status} class LP_WindowGenerator(BarrierAppDROP): component_meta = dlg_component('LPWindowGen', 'Low-pass filter example window generator', - [dlg_batch_input('binary/*', [])], + [None], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) @@ -88,9 +89,9 @@ def sinc(self, x_val: np.float64): def gen_win(self): alpha = 2 * self.cutoff / self.srate win = np.zeros(self.length) - for i in range(self.length): - ham = 0.54 - 0.46 * np.cos(2 * np.pi * i / self.length) # Hamming coefficient - hsupp = (i - self.length / 2) + for i in range(int(self.length)): + ham = 0.54 - 0.46 * np.cos(2 * np.pi * i / int(self.length)) # Hamming coefficient + hsupp = (i - int(self.length) / 2) win[i] = ham * alpha * self.sinc(alpha * hsupp) return win @@ -104,13 +105,16 @@ def run(self): o.len = len(data) o.write(data) - def generate_recompute_data(self): - return {'length': self.length, - 'cutoff': self.cutoff, - 'sample_rate': self.srate} - def generate_reproduce_data(self): - return {'data_hash', MerkleTree(self.series).merkle_root} + return dict(data_hash=common_hash(self.series)) + + def generate_recompute_data(self): + output = dict() + output['length'] = self.length + output['cutoff'] = self.cutoff + output['sample_rate'] = self.srate + output['status'] = self.status + return output class LP_AddNoise(BarrierAppDROP): @@ -158,15 +162,16 @@ def run(self): o.len = len(data) o.write(data) + def generate_reproduce_data(self): + return {'data_hash', common_hash(self.signal)} + def generate_recompute_data(self): return {'mean': self.mean, 'std': self.std, 'sample_rate': self.srate, 'seed': self.seed, - 'alpha': self.alpha} - - def generate_reproduce_data(self): - return {'data_hash', MerkleTree(self.signal).merkle_root} + 'alpha': self.alpha, + 'status': self.status} class LP_filter_fft_np(BarrierAppDROP): @@ -199,11 +204,14 @@ def getInputArrays(self): self.series = array def filter(self): - nfft = int(2 ** np.ceil(np.log2(len(self.series[0] + self.series[1] - 1)))) - 1 + signal = self.series[0] + window = self.series[1] + nfft = determine_size(len(signal) + len(window) - 1) + print(nfft) sig_zero_pad = np.zeros(nfft, dtype=self.precision['float']) win_zero_pad = np.zeros(nfft, dtype=self.precision['float']) - sig_zero_pad[0:len(self.series[0])] = self.series[0] - win_zero_pad[0:len(self.series[1])] = self.series[1] + sig_zero_pad[0:len(signal)] = signal + win_zero_pad[0:len(window)] = window sig_fft = np.fft.fft(sig_zero_pad) win_fft = np.fft.fft(win_zero_pad) out_fft = np.multiply(sig_fft, win_fft) @@ -222,14 +230,12 @@ def run(self): o.write(data) def generate_recompute_data(self): - return {'precision_float': self.precision['float'], - 'precision_complex': self.precision['complex']} + return {'precision_float': str(self.precision['float']), + 'precision_complex': str(self.precision['complex']), + 'status': self.status} def generate_reproduce_data(self): - mtree = MerkleTree(self.series[0]) - mtree.append(self.series[1]) - mtree.append(self.output) - return {'data_hash': mtree.merkle_root} + return {'output_hash': common_hash(self.output)} class LP_filter_fft_fftw(LP_filter_fft_np): From 1f59fbee542499bb0d8f0de40aff2ebd604ad3b8 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 20 Jan 2021 16:19:39 +0800 Subject: [PATCH 165/484] Adds ID to parenthash dictionaries (not lists). Resolves (un)intentional duplicates. --- .../common/reproducibility/reproducibility.py | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 35a654658..888892e1f 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -199,7 +199,7 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproducibilityFlags): data = accumulate_lgt_drop_data(drop, level) merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root - drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': []} + drop['reprodata'] = {'rmode': str(level.value), 'lgt_data': data, 'lg_parenthashes': {}} return drop @@ -218,7 +218,7 @@ def init_lg_repro_drop_data(drop: dict): merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root drop['reprodata']['lg_data'] = data - drop['reprodata']['lg_parenthashes'] = [] + drop['reprodata']['lg_parenthashes'] = {} return drop @@ -226,7 +226,7 @@ def append_pgt_repro_data(drop: dict, data: dict): merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) - drop['reprodata']['pgt_parenthashes'] = [] + drop['reprodata']['pgt_parenthashes'] = {} drop['reprodata']['pgt_data'] = data return drop @@ -263,7 +263,7 @@ def init_pg_repro_drop_data(drop: dict): merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) - drop['reprodata']['pg_parenthashes'] = [] + drop['reprodata']['pg_parenthashes'] = {} drop['reprodata']['pg_data'] = data return drop @@ -274,7 +274,7 @@ def init_rg_repro_drop_data(drop: dict): :param drop: :return: The same drop with appended reproducibility information """ - drop['reprodata']['rg_parenthashes'] = [] + drop['reprodata']['rg_parenthashes'] = {} return drop @@ -293,8 +293,6 @@ def build_lg_block_data(drop: dict): if 'merkleroot' in drop['reprodata']['lg_data']: lg_hash = drop['reprodata']['lg_data']['merkleroot'] block_data.append(lg_hash) - hashset = set(drop['reprodata']['lg_parenthashes']) - drop['reprodata']['lg_parenthashes'] = list(hashset) for parenthash in sorted(drop['reprodata']['lg_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) @@ -303,8 +301,6 @@ def build_lg_block_data(drop: dict): def build_pgt_block_data(drop: dict): block_data = [drop['reprodata']['pgt_data']['merkleroot'], drop['reprodata']['lg_blockhash']] - hashset = set(drop['reprodata']['pgt_parenthashes']) - drop['reprodata']['pgt_parenthashes'] = list(hashset) for parenthash in sorted(drop['reprodata']['pgt_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) @@ -315,8 +311,6 @@ def build_pg_block_data(drop: dict): block_data = [drop['reprodata']['pg_data']['merkleroot'], drop['reprodata']['pgt_blockhash'], drop['reprodata']['lg_blockhash']] - hashset = set(drop['reprodata']['pg_parenthashes']) - drop['reprodata']['pg_parenthashes'] = list(hashset) for parenthash in sorted(drop['reprodata']['pg_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) @@ -328,8 +322,6 @@ def build_rg_block_data(drop: dict): drop['reprodata']['pg_blockhash'], drop['reprodata']['pgt_blockhash'], drop['reprodata']['lg_blockhash']] - hashset = set(drop['reprodata']['rg_parenthashes']) - drop['reprodata']['rg_parenthashes'] = list(hashset) for parenthash in sorted(drop['reprodata']['rg_parenthashes']): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) @@ -378,20 +370,23 @@ def lg_build_blockdag(lg: dict): rmode = rflag_caster(dropset[did][0]['reprodata']['rmode']).value for n in neighbourset[did]: dropset[n][1] -= 1 - parenthash = [] + parenthash = {} if rmode >= ReproducibilityFlags.REPRODUCE.value: if dropset[did][0]['categoryType'] == Categories.DATA \ and (dropset[did][1] == 0 or dropset[did][2] == 0): # Add my new hash to the parent-hash list - parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) + if did not in parenthash.keys(): + parenthash[did] = dropset[did][0]['reprodata']['lg_blockhash'] + # parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) else: # Add my parenthashes to the parent-hash list - parenthash.extend(dropset[did][0]['reprodata']['lg_parenthashes']) + parenthash.update(dropset[did][0]['reprodata']['lg_parenthashes']) + # parenthash.extend(dropset[did][0]['reprodata']['lg_parenthashes']) if rmode != ReproducibilityFlags.REPRODUCE.value: # Non-compressing behaviour - parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) - + parenthash[did] = dropset[did][0]['reprodata']['lg_blockhash'] + # parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) # Add our new hash to the parent-hash list - dropset[n][0]['reprodata']['lg_parenthashes'].extend(parenthash) # We deal with duplicates later + dropset[n][0]['reprodata']['lg_parenthashes'].update(parenthash) # We deal with duplicates later if dropset[n][1] == 0: # Add drops at the DAG-frontier q.append(n) @@ -466,20 +461,22 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): rmode = int(dropset[did][0]['reprodata']['rmode']) for n in neighbourset[did]: dropset[n][1] -= 1 - parenthash = [] + parenthash = {} if rmode >= ReproducibilityFlags.REPRODUCE.value: # TODO: Hack! may break later, proceed with caution if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA\ and (dropset[did][1] == 0 or dropset[did][2] == 0): # Add my new hash to the parent-hash list - parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) + if did not in parenthash.keys(): + parenthash[did] = dropset[did][0]['reprodata'][blockstr + '_blockhash'] + # parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) else: # Add my parenthashes to the parent-hash list - parenthash.extend(dropset[did][0]['reprodata'][parentstr]) + parenthash.update(dropset[did][0]['reprodata'][parentstr]) if rmode != ReproducibilityFlags.REPRODUCE.value: - parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) + parenthash[did] = dropset[did][0]['reprodata'][blockstr + "_blockhash"] # Add our new hash to the parest-hash list - dropset[n][0]['reprodata'][parentstr].extend(parenthash) + dropset[n][0]['reprodata'][parentstr].update(parenthash) if dropset[n][1] == 0: q.append(n) From c0155d156080f1208b848ac60d7945ed49b5787d Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 20 Jan 2021 16:46:36 +0800 Subject: [PATCH 166/484] Block hashes are made only from the parent hash values. --- .../dlg/common/reproducibility/reproducibility.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 888892e1f..5a5e06243 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -293,7 +293,7 @@ def build_lg_block_data(drop: dict): if 'merkleroot' in drop['reprodata']['lg_data']: lg_hash = drop['reprodata']['lg_data']['merkleroot'] block_data.append(lg_hash) - for parenthash in sorted(drop['reprodata']['lg_parenthashes']): + for parenthash in sorted(drop['reprodata']['lg_parenthashes'].values()): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) drop['reprodata']['lg_blockhash'] = mtree.merkle_root @@ -301,7 +301,7 @@ def build_lg_block_data(drop: dict): def build_pgt_block_data(drop: dict): block_data = [drop['reprodata']['pgt_data']['merkleroot'], drop['reprodata']['lg_blockhash']] - for parenthash in sorted(drop['reprodata']['pgt_parenthashes']): + for parenthash in sorted(drop['reprodata']['pgt_parenthashes'].values()): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) drop['reprodata']['pgt_blockhash'] = mtree.merkle_root @@ -311,7 +311,7 @@ def build_pg_block_data(drop: dict): block_data = [drop['reprodata']['pg_data']['merkleroot'], drop['reprodata']['pgt_blockhash'], drop['reprodata']['lg_blockhash']] - for parenthash in sorted(drop['reprodata']['pg_parenthashes']): + for parenthash in sorted(drop['reprodata']['pg_parenthashes'].values()): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) drop['reprodata']['pg_blockhash'] = mtree.merkle_root @@ -322,7 +322,7 @@ def build_rg_block_data(drop: dict): drop['reprodata']['pg_blockhash'], drop['reprodata']['pgt_blockhash'], drop['reprodata']['lg_blockhash']] - for parenthash in sorted(drop['reprodata']['rg_parenthashes']): + for parenthash in sorted(drop['reprodata']['rg_parenthashes'].values()): block_data.append(parenthash) mtree = MerkleTree(block_data, common_hash) drop['reprodata']['rg_blockhash'] = mtree.merkle_root From b768333ecb7464ec66341329fd8f5951ce8c990b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 20 Jan 2021 17:16:40 +0800 Subject: [PATCH 167/484] Bug fixes cuda fft --- .../dlg/common/reproducibility/apps_lowpass.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 6c973ddc1..0847b325e 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -276,6 +276,11 @@ def filter(self): import pycuda.gpuarray as gpuarray import skcuda.fft as cu_fft import skcuda.linalg as linalg + import pycuda.driver as cuda + from pycuda.tools import make_default_context + cuda.init() + context = make_default_context() + device = context.get_device() signal = self.series[0] window = self.series[1] linalg.init() @@ -308,6 +313,10 @@ def filter(self): cu_fft.ifft(out_fft, out_gpu, plan_inverse, True) out_np = np.zeros(len(out_gpu), self.precision['complex']) out_gpu.get(out_np) + context.pop() + context = None + from pycuda.tools import clear_context_caches + clear_context_caches() return out_np From c4c7ba0376727a4dbbf26e771255f31293cd6abb Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 22 Jan 2021 11:38:02 +0800 Subject: [PATCH 168/484] Changes drop hash to common_hash function --- daliuge-runtime/dlg/drop.py | 8 ++------ .../test/reproducibility/test_drophash.py | 17 ++++------------- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index f44691d50..673e027af 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -40,7 +40,7 @@ from abc import ABCMeta, abstractmethod import six -from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, rmode_supported, HASHING_ALG +from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, rmode_supported from dlg.common.reproducibility.reproducibility import common_hash from merklelib import MerkleTree from six import BytesIO @@ -81,10 +81,6 @@ def append(self, drop): track_current_drop = object_tracking('drop') -def drop_hash(value): - return HASHING_ALG(value).hexdigest() - - # =============================================================================== # DROP classes follow # =============================================================================== @@ -723,7 +719,7 @@ def commit(self): # Generate the MerkleData self._merkleData = self.generate_merkle_data() # Fill MerkleTree, add data and set the MerkleRoot Value - self._merkleTree = MerkleTree(self._merkleData.items(), drop_hash) + self._merkleTree = MerkleTree(self._merkleData.items(), common_hash) self._merkleRoot = self._merkleTree.merkle_root # Set as committed self._committed = True diff --git a/daliuge-runtime/test/reproducibility/test_drophash.py b/daliuge-runtime/test/reproducibility/test_drophash.py index 2cc001285..e36dedadb 100644 --- a/daliuge-runtime/test/reproducibility/test_drophash.py +++ b/daliuge-runtime/test/reproducibility/test_drophash.py @@ -26,8 +26,9 @@ import unittest from dlg.common.reproducibility.constants import ReproducibilityFlags +from dlg.common.reproducibility.reproducibility import common_hash from dlg.ddap_protocol import DROPStates -from dlg.drop import AbstractDROP, drop_hash +from dlg.drop import AbstractDROP from merklelib import MerkleTree @@ -49,16 +50,6 @@ def test_generate_rerun_data(self): a.setCompleted() self.assertTrue(a.generate_rerun_data(), [DROPStates.COMPLETED]) - def test_unimplemented_flags(self): - """ - Asserts that unimplemented but planned functionality is handled accordingly. - """ - a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproducibilityFlags.RERUN - with self.assertRaises(NotImplementedError): - a.reproducibility_level = ReproducibilityFlags.REPEAT - a.generate_merkle_data() - def test_commit_on_complete(self): """ Tests that merkle_data is generated upon set_complete status and is correct (NOTHING, RERUN) @@ -73,8 +64,8 @@ def test_commit_on_complete(self): # Test RERUN a.setCompleted() - test = MerkleTree([DROPStates.COMPLETED], drop_hash) - # 6d1be79de51c1a5846bb0498b7779802710b2452c20e1b65013ad3ebe459f51e + test = MerkleTree({'status': DROPStates.COMPLETED}.items(), common_hash) + # 689fcf0d74c42200bef177db545adc43c135dfb0d7dc85b166db3af1dcded235 self.assertTrue(test.merkle_root == a.merkleroot) # Test NOTHING From 6d0fa40b5e6353cb70910233d9f2c4b283701299 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 22 Jan 2021 11:48:11 +0800 Subject: [PATCH 169/484] Updates original drophash testing functions --- daliuge-runtime/test/reproducibility/test_drophash.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-runtime/test/reproducibility/test_drophash.py b/daliuge-runtime/test/reproducibility/test_drophash.py index e36dedadb..28f64e973 100644 --- a/daliuge-runtime/test/reproducibility/test_drophash.py +++ b/daliuge-runtime/test/reproducibility/test_drophash.py @@ -48,7 +48,7 @@ def test_generate_rerun_data(self): a = AbstractDROP('a', 'a') a.reproducibility_level = ReproducibilityFlags.RERUN a.setCompleted() - self.assertTrue(a.generate_rerun_data(), [DROPStates.COMPLETED]) + self.assertEqual(a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) def test_commit_on_complete(self): """ From afa3034b9724853883316c514894bf941b86d6a3 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 22 Jan 2021 15:17:38 +0800 Subject: [PATCH 170/484] Changing a drop's flag will now automatically recommit it's reproducibilty data if it was previously committed. --- daliuge-runtime/dlg/drop.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/drop.py b/daliuge-runtime/dlg/drop.py index 673e027af..7901cf876 100644 --- a/daliuge-runtime/dlg/drop.py +++ b/daliuge-runtime/dlg/drop.py @@ -607,13 +607,14 @@ def reproducibility_level(self, new_flag): if type(new_flag) != ReproducibilityFlags: raise TypeError("new_flag must be a reproducibility flag enum.") elif rmode_supported(new_flag): # TODO: Support custom checkers for repro-level + self._reproducibility = new_flag if self._committed: # Current behaviour, set to un-committed again after change self._committed = False self._merkleRoot = None self._merkleTree = None self._merkleData = [] - self._reproducibility = new_flag + self.commit() else: raise NotImplementedError("new_flag %d is not supported", new_flag.value) From 79d08e7bb8201de3f38e8e9ec45c742c71acb818 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 22 Jan 2021 15:17:51 +0800 Subject: [PATCH 171/484] Adds reproducibility tests for bashShellApps --- daliuge-runtime/test/apps/test_bash.py | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/daliuge-runtime/test/apps/test_bash.py b/daliuge-runtime/test/apps/test_bash.py index dd7d07f7c..08d4265d0 100644 --- a/daliuge-runtime/test/apps/test_bash.py +++ b/daliuge-runtime/test/apps/test_bash.py @@ -106,6 +106,40 @@ def assert_envvar_is_there(varname, value): assert_envvar_is_there('DLG_UID', app_uid) assert_envvar_is_there('DLG_SESSION_ID', session_id) + def test_reproducibility(self): + from dlg.common.reproducibility.constants import ReproducibilityFlags + from dlg.drop import NullDROP + a = BashShellApp('a', 'a', command="echo 'Hello world'") + a.reproducibility_level = ReproducibilityFlags.RERUN + a.setCompleted() + b = NullDROP('b', 'b') + b.reproducibility_level = ReproducibilityFlags.RERUN + b.setCompleted() + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPEAT + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.RECOMPUTE + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'command': "echo 'Hello world'"}) + + a.reproducibility_level = ReproducibilityFlags.REPRODUCE + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_SCI + self.assertEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), a.generate_rerun_data()) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_COMP + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), a.generate_recompute_data()) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_TOTAL + self.assertEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), a.generate_repeat_data()) + class StreamingBashAppTests(unittest.TestCase): From adfc2e42e50fe43a36fe81605e92b3556e7f67e1 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 22 Jan 2021 15:18:00 +0800 Subject: [PATCH 172/484] Adds reproducibility tests for AbstractDrops --- daliuge-runtime/test/test_drop.py | 173 ++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) diff --git a/daliuge-runtime/test/test_drop.py b/daliuge-runtime/test/test_drop.py index 2da883ed8..3b09240fa 100644 --- a/daliuge-runtime/test/test_drop.py +++ b/daliuge-runtime/test/test_drop.py @@ -30,6 +30,7 @@ import six from dlg import droputils +from dlg.common.reproducibility.constants import ReproducibilityFlags from dlg.ddap_protocol import DROPStates, ExecutionMode, AppDROPStates from dlg.drop import FileDROP, AppDROP, InMemoryDROP, \ NullDROP, BarrierAppDROP, \ @@ -794,5 +795,177 @@ def test_rdbms_drop(self): os.unlink(dbfile) +class TestDROPReproducibility(unittest.TestCase): + def test_drop_rerun(self): + a = NullDROP('a', 'a') + a.reproducibility_level = ReproducibilityFlags.RERUN + a.setCompleted() + self.assertEqual(a.generate_merkle_data(), {'status': DROPStates.COMPLETED}) + self.assertIsNotNone(a.merkleroot) + + def test_drop_repeat(self): + a = NullDROP('a', 'a') + a.reproducibility_level = ReproducibilityFlags.REPEAT + a.setCompleted() + self.assertEqual(a.generate_merkle_data(), {'status': DROPStates.COMPLETED}) + self.assertIsNotNone(a.merkleroot) + pass + + def test_drop_recompute(self): + a = NullDROP('a', 'a') + a.reproducibility_level = ReproducibilityFlags.RECOMPUTE + a.setCompleted() + self.assertEqual(a.generate_merkle_data(), {'status': DROPStates.COMPLETED}) + self.assertIsNotNone(a.merkleroot) + pass + + def test_drop_reproduce(self): + a = NullDROP('a', 'a') + a.reproducibility_level = ReproducibilityFlags.REPRODUCE + a.setCompleted() + self.assertEqual(a.generate_merkle_data(), {}) + self.assertIsNone(a.merkleroot) + pass + + def test_drop_replicate_sci(self): + a = NullDROP('a', 'a') + a.reproducibility_level = ReproducibilityFlags.REPLICATE_SCI + a.setCompleted() + self.assertEqual(a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) + self.assertIsNotNone(a.merkleroot) + pass + + def test_drop_replicate_comp(self): + a = NullDROP('a', 'a') + a.reproducibility_level = ReproducibilityFlags.REPLICATE_COMP + a.setCompleted() + self.assertEqual(a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) + self.assertIsNotNone(a.merkleroot) + pass + + def test_drop_replicate_total(self): + a = NullDROP('a', 'a') + a.reproducibility_level = ReproducibilityFlags.REPLICATE_TOTAL + a.setCompleted() + self.assertEqual(a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) + self.assertIsNotNone(a.merkleroot) + pass + + def test_file_reproducibility(self): + from dlg.common.reproducibility.reproducibility import common_hash + data = b'Helloworld' + data_hash = common_hash(data) + a = FileDROP('a', 'a') + a.write(data) + a.reproducibility_level = ReproducibilityFlags.RERUN + a.setCompleted() + b = NullDROP('b', 'b') + b.reproducibility_level = ReproducibilityFlags.RERUN + b.setCompleted() + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPEAT + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.RECOMPUTE + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPRODUCE + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_SCI + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash, 'status': DROPStates.COMPLETED}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_COMP + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash, 'status': DROPStates.COMPLETED}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_TOTAL + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash, 'status': DROPStates.COMPLETED}) + + def test_memory_reproducibility(self): + from dlg.common.reproducibility.reproducibility import common_hash + data = b'Helloworld' + data_hash = common_hash(data) + a = InMemoryDROP('a', 'a') + a.write(data) + a.reproducibility_level = ReproducibilityFlags.RERUN + a.setCompleted() + b = NullDROP('b', 'b') + b.reproducibility_level = ReproducibilityFlags.RERUN + b.setCompleted() + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPEAT + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.RECOMPUTE + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPRODUCE + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_SCI + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash, 'status': DROPStates.COMPLETED}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_COMP + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash, 'status': DROPStates.COMPLETED}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_TOTAL + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'data_hash': data_hash, 'status': DROPStates.COMPLETED}) + + def test_rdbms_reproducibility(self): + dbfile = 'test_rdbms_drop.db' + if os.path.isfile(dbfile): + os.unlink(dbfile) + + b = NullDROP('b', 'b') + b.reproducibility_level = ReproducibilityFlags.RERUN + b.setCompleted() + + with contextlib.closing(sqlite3.connect(dbfile)) as conn: # @UndefinedVariable + with contextlib.closing(conn.cursor()) as cur: + cur.execute('CREATE TABLE super_mega_table(a_string varchar(64) PRIMARY KEY, an_integer integer)'); + + try: + a = RDBMSDrop('a', 'a', dbmodule='sqlite3', dbtable='super_mega_table', dbparams={'database': dbfile}) + a.insert({'a_string': 'hello', 'an_integer': 0}) + a.insert({'a_string': 'hello1', 'an_integer': 1}) + a.reproducibility_level = ReproducibilityFlags.RERUN + a.setCompleted() + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPEAT + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.RECOMPUTE + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPRODUCE + self.assertEqual(a.generate_merkle_data(), {'query_log': a._querylog}) + self.assertNotEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_SCI + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'query_log': a._querylog, 'status': DROPStates.COMPLETED}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_COMP + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'query_log': a._querylog, 'status': DROPStates.COMPLETED}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_TOTAL + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'query_log': a._querylog, 'status': DROPStates.COMPLETED}) + finally: + os.unlink(dbfile) + + if __name__ == '__main__': unittest.main() From 417e36d4d585a6f8d1c0dbb3851ba08b074ed550 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 22 Jan 2021 15:18:09 +0800 Subject: [PATCH 173/484] Adds reproducibility tests for PyFuncApps --- daliuge-runtime/test/apps/test_pyfunc.py | 37 +++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/test/apps/test_pyfunc.py b/daliuge-runtime/test/apps/test_pyfunc.py index 311f1b27d..7531610f2 100644 --- a/daliuge-runtime/test/apps/test_pyfunc.py +++ b/daliuge-runtime/test/apps/test_pyfunc.py @@ -29,11 +29,11 @@ import six.moves.cPickle as pickle # @UnresolvedImport from dlg import droputils from dlg.apps import pyfunc +from dlg.common import Categories from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType from dlg.drop import InMemoryDROP from dlg.droputils import DROPWaiterCtx from dlg.exceptions import InvalidDropException -from dlg.common import Categories from ..manager import test_dm @@ -245,6 +245,41 @@ def test_defaults_args_and_kwargs(self): self._test_defaults(0, 1, 1, x=40) self._test_defaults(249, 1, 2, x=35) + def test_reproducibility(self): + from dlg.common.reproducibility.constants import ReproducibilityFlags + from dlg.drop import NullDROP + a = _PyFuncApp('a', 'a', 'func3') + a.run() + b = NullDROP('b', 'b') + a.reproducibility_level = ReproducibilityFlags.RERUN + b.reproducibility_level = ReproducibilityFlags.RERUN + a.setCompleted() + b.setCompleted() + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.REPEAT + self.assertEqual(a.merkleroot, b.merkleroot) + + a.reproducibility_level = ReproducibilityFlags.RECOMPUTE + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {'args': [], 'kwargs': {}}) + + a.reproducibility_level = ReproducibilityFlags.REPRODUCE + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), {}) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_SCI + self.assertEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), a.generate_rerun_data()) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_COMP + self.assertNotEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), a.generate_recompute_data()) + + a.reproducibility_level = ReproducibilityFlags.REPLICATE_TOTAL + self.assertEqual(a.merkleroot, b.merkleroot) + self.assertEqual(a.generate_merkle_data(), a.generate_repeat_data()) + class PyFuncAppIntraNMTest(test_dm.NMTestsMixIn, unittest.TestCase): From a19c482a859e1ab4bcd1be4cee71be487e054d9b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 Jan 2021 12:36:05 +0800 Subject: [PATCH 174/484] Drops no longer store 'rank' at the PGT/PGS layer when rerunning. --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 5a5e06243..21d27dc53 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -142,11 +142,12 @@ def accumulate_pgt_unroll_drop_data(drop: dict): return data if rmode.value >= ReproducibilityFlags.RERUN.value: data['type'] = drop['type'] - data['rank'] = drop['rank'] if data['type'] == 'plain': data['storage'] = drop['storage'] else: data['dt'] = drop['dt'] # WARNING: Added to differentiate between subtle component differences. + if rmode.value > ReproducibilityFlags.RERUN.value and rmode != ReproducibilityFlags.REPLICATE_SCI: + data['rank'] = drop['rank'] return data From 4fa9531812e6acf12d6906a777e079c24e5f1952 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 Jan 2021 12:44:39 +0800 Subject: [PATCH 175/484] Drops only store 'rank' when recomputing or replicating_computationally. --- .../dlg/common/reproducibility/reproducibility.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 21d27dc53..593c7c1f4 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -92,8 +92,8 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): if category == Categories.MEMORY: pass elif category == Categories.FILE: - data['filepath'] = fields['filepath'] - data['dirname'] = fields['dirname'] + # data['filepath'] = fields['filepath'] + # data['dirname'] = fields['dirname'] data['check_filepath_exists'] = fields['check_filepath_exists'] elif category == Categories.S3: pass @@ -146,7 +146,7 @@ def accumulate_pgt_unroll_drop_data(drop: dict): data['storage'] = drop['storage'] else: data['dt'] = drop['dt'] # WARNING: Added to differentiate between subtle component differences. - if rmode.value > ReproducibilityFlags.RERUN.value and rmode != ReproducibilityFlags.REPLICATE_SCI: + if rmode == ReproducibilityFlags.RECOMPUTE or rmode == ReproducibilityFlags.REPLICATE_COMP: data['rank'] = drop['rank'] return data From 2047bc3741a1cd990fa71f630e99ca11b6840be0 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 Jan 2021 12:48:35 +0800 Subject: [PATCH 176/484] Data drops store filename and dirname when recomputing or replicating computationally --- .../dlg/common/reproducibility/reproducibility.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 593c7c1f4..4bc42f2e1 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -92,8 +92,6 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): if category == Categories.MEMORY: pass elif category == Categories.FILE: - # data['filepath'] = fields['filepath'] - # data['dirname'] = fields['dirname'] data['check_filepath_exists'] = fields['check_filepath_exists'] elif category == Categories.S3: pass @@ -122,6 +120,11 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): pass elif level == ReproducibilityFlags.REPRODUCE: pass + if level == ReproducibilityFlags.RECOMPUTE or level == ReproducibilityFlags.REPLICATE_COMP: + if category_type == Categories.DATA: + if category == Categories.FILE: + data['filepath'] = fields['filepath'] + data['dirname'] = fields['dirname'] return data From ff7a1b3e12b9bf8efffa9abbc9558bb0364c64ba Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 25 Jan 2021 12:53:28 +0800 Subject: [PATCH 177/484] Only data drops store any LGT,LG,PGS,PGT or PG data when reproducing. --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 4bc42f2e1..7be911cd3 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -143,6 +143,11 @@ def accumulate_pgt_unroll_drop_data(drop: dict): drop['reprodata']['rmode'] = str(rmode.value) if rmode == ReproducibilityFlags.NOTHING: return data + if rmode == ReproducibilityFlags.REPRODUCE: + data['type'] = drop['type'] + if drop['type'] == 'plain': + data['storage'] = drop['storage'] + return data if rmode.value >= ReproducibilityFlags.RERUN.value: data['type'] = drop['type'] if data['type'] == 'plain': From a33ecb802014394b44571b49ea835728dac1b4ec Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 28 Jan 2021 10:38:53 +0800 Subject: [PATCH 178/484] Separates writing out function. --- daliuge-runtime/dlg/apps/pyfunc.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/apps/pyfunc.py b/daliuge-runtime/dlg/apps/pyfunc.py index b6181ef6a..6cbb01ece 100644 --- a/daliuge-runtime/dlg/apps/pyfunc.py +++ b/daliuge-runtime/dlg/apps/pyfunc.py @@ -103,7 +103,6 @@ class PyFuncApp(BarrierAppDROP): def initialize(self, **kwargs): BarrierAppDROP.initialize(self, **kwargs) - self.fname = fname = self._getArg(kwargs, 'func_name', None) fcode = self._getArg(kwargs, 'func_code', None) if not fname and not fcode: @@ -153,6 +152,9 @@ def run(self): # Depending on how many outputs we have we treat our result # as an iterable or as a single object. Each result is pickled # and written to its corresponding output + self.write_results(result) + + def write_results(self, result): outputs = self.outputs if len(outputs) == 1: result = [result] From f92226fc32b7587ece2e9236c380f5502c4282fe Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 29 Jan 2021 11:12:39 +0800 Subject: [PATCH 179/484] Removes generate_reproduce_data for the processing components. --- .../dlg/common/reproducibility/apps_lowpass.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 0847b325e..84a1dc190 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -4,7 +4,7 @@ import pyfftw from dlg import droputils from dlg.apps.simple import BarrierAppDROP -from dlg.common.reproducibility.reproducibility import common_hash +# from dlg.common.reproducibility.reproducibility import common_hash from dlg.meta import dlg_batch_output, dlg_streaming_input from dlg.meta import dlg_component, dlg_batch_input from dlg.meta import dlg_int_param, dlg_list_param, dlg_float_param, dlg_bool_param @@ -50,9 +50,11 @@ def run(self): o.len = len(data) o.write(data) + """ def generate_reproduce_data(self): # This will do for now return {'data_hash': common_hash(self.series)} + """ def generate_recompute_data(self): # This will do for now @@ -105,8 +107,10 @@ def run(self): o.len = len(data) o.write(data) + """ def generate_reproduce_data(self): return dict(data_hash=common_hash(self.series)) + """ def generate_recompute_data(self): output = dict() @@ -162,8 +166,10 @@ def run(self): o.len = len(data) o.write(data) + """ def generate_reproduce_data(self): return {'data_hash', common_hash(self.signal)} + """ def generate_recompute_data(self): return {'mean': self.mean, @@ -234,8 +240,10 @@ def generate_recompute_data(self): 'precision_complex': str(self.precision['complex']), 'status': self.status} + """ def generate_reproduce_data(self): return {'output_hash': common_hash(self.output)} + """ class LP_filter_fft_fftw(LP_filter_fft_np): From 42618a62235dede10b0a16ea019455fbf19a8a33 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Fri, 29 Jan 2021 13:57:53 +0800 Subject: [PATCH 180/484] Lowpass filter apps now write out their numpy arrays as byte-strings. Now data is passed around correctly. --- .../common/reproducibility/apps_lowpass.py | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 84a1dc190..15a974abd 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -1,5 +1,3 @@ -import pickle - import numpy as np import pyfftw from dlg import droputils @@ -25,10 +23,10 @@ class LP_SignalGenerator(BarrierAppDROP): [dlg_streaming_input('binary/*')]) # default values - length = dlg_int_param('length', 512) + length = dlg_int_param('length', 256) srate = dlg_int_param('sample rate', 5000) freqs = dlg_list_param('Frequencies(int)', [440, 800, 1000, 2000]) - series = np.empty([1]) + series = None def initialize(self, **kwargs): super(LP_SignalGenerator, self).initialize(**kwargs) @@ -45,7 +43,7 @@ def run(self): if len(outs) < 1: raise Exception('At least one output required for %r' % self) self.series = self.gen_sig() - data = pickle.dumps(self.series) + data = self.series.tostring() for o in outs: o.len = len(data) o.write(data) @@ -71,10 +69,10 @@ class LP_WindowGenerator(BarrierAppDROP): [dlg_streaming_input('binary/*')]) # default values - length = dlg_int_param('length', 512) + length = dlg_int_param('length', 256) cutoff = dlg_int_param('cutoff', 600) srate = dlg_int_param('sample_rate', 5000) - series = np.empty([1]) + series = None def initialize(self, **kwargs): super(LP_WindowGenerator, self).initialize(**kwargs) @@ -90,7 +88,7 @@ def sinc(self, x_val: np.float64): def gen_win(self): alpha = 2 * self.cutoff / self.srate - win = np.zeros(self.length) + win = np.zeros(self.length, dtype=np.float64) for i in range(int(self.length)): ham = 0.54 - 0.46 * np.cos(2 * np.pi * i / int(self.length)) # Hamming coefficient hsupp = (i - int(self.length) / 2) @@ -102,7 +100,7 @@ def run(self): if len(outs) < 1: raise Exception('At least one output required for %r' % self) self.series = self.gen_win() - data = pickle.dumps(self.series) + data = self.series.tostring() for o in outs: o.len = len(data) o.write(data) @@ -152,8 +150,8 @@ def getInputArrays(self): if len(ins) != 1: raise Exception('Precisely one input required for %r' % self) - array = pickle.loads(droputils.allDropContents(ins[0])) - self.signal = array + array = np.fromstring(droputils.allDropContents(ins[0])) + self.signal = np.frombuffer(array) def run(self): outs = self.outputs @@ -161,7 +159,7 @@ def run(self): raise Exception('At least one output required for %r' % self) self.getInputArrays() sig = self.add_noise() - data = pickle.dumps(sig) + data = sig.tobytes() for o in outs: o.len = len(data) o.write(data) @@ -206,7 +204,7 @@ def getInputArrays(self): if len(ins) != 2: raise Exception('Precisely two input required for %r' % self) - array = [pickle.loads(droputils.allDropContents(inp)) for inp in ins] + array = [np.fromstring(droputils.allDropContents(inp)) for inp in ins] self.series = array def filter(self): @@ -230,7 +228,7 @@ def run(self): raise Exception('At least one output required for %r' % self) self.getInputArrays() self.output = self.filter() - data = pickle.dumps(self.output) + data = self.output.tostring() for o in outs: o.len = len(data) o.write(data) From 697afd49f3c63baf3091a9f38be11377a8cbbeda Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 10:35:03 +0800 Subject: [PATCH 181/484] Changes fill to dlg_fill --- daliuge-translator/dlg/translator/tool_commands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 5af8123a2..bb1306093 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -341,5 +341,5 @@ def register_commands(): tool.cmdwrap('unroll', 'Unrolls a Logical Graph into a Physical Graph Template', dlg_unroll) tool.cmdwrap('partition', 'Divides a Physical Graph Template into N logical partitions', dlg_partition) tool.cmdwrap('unroll-and-partition', 'unroll + partition', dlg_unroll_and_partition) - tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', fill) + tool.cmdwrap('fill', 'Fill a Logical Graph with parameters', dlg_fill) tool.cmdwrap('cwl', 'Translate a Logical Graph into a Common Workflow Language (CWL) workflow', cwl) From eca5233919692005ce79084f9c137ce994c24d3d Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 11:52:49 +0800 Subject: [PATCH 182/484] rflag caster now catches None case --- daliuge-common/dlg/common/reproducibility/constants.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index ec4237bda..a38bfabb5 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -44,6 +44,8 @@ def rflag_caster(val, default=REPRO_DEFAULT): return ReproducibilityFlags(val) except(ValueError, TypeError): return default + elif type(val) is None: + return default def rmode_supported(flag: ReproducibilityFlags): From 40871647f791bda8cdd39a871304c663f1ac4c2b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 14:53:34 +0800 Subject: [PATCH 183/484] deploy tests pass with added reproducibility considerations. --- daliuge-runtime/test/deploy/test_common.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/daliuge-runtime/test/deploy/test_common.py b/daliuge-runtime/test/deploy/test_common.py index aafe3d102..f5062de6b 100644 --- a/daliuge-runtime/test/deploy/test_common.py +++ b/daliuge-runtime/test/deploy/test_common.py @@ -23,11 +23,22 @@ import tempfile import unittest +from dlg.common import Categories from dlg.deploy import common from dlg.manager import constants from dlg.manager.session import SessionStates from dlg.testutils import ManagerStarter -from dlg.common import Categories + +default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} +default_graph_repro = {"rmode": "1", "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, + "merkleroot": "a", "signature": "b"} + + +def add_test_reprodata(graph: list): + for drop in graph: + drop['reprodata'] = default_repro.copy() + graph.append(default_graph_repro.copy()) + return graph class CommonTestsBase(ManagerStarter): @@ -35,7 +46,9 @@ class CommonTestsBase(ManagerStarter): def _submit(self): pg = [{"oid": "A", "type": "plain", "storage": Categories.MEMORY}, {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "inputs": ["A"], "outputs":["C"]}, - {"oid": "C", "type": "plain", "storage": Categories.MEMORY}] + {"oid": "C", "type": "plain", "storage": Categories.MEMORY}, + ] + pg = add_test_reprodata(pg) for drop in pg: drop['node'] = '127.0.0.1' drop['island'] = '127.0.0.1' From a78b27c92d9eadf305e888c11b70467e51e0d7b3 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 14:54:16 +0800 Subject: [PATCH 184/484] Graph loader now tests for a None dropSpecList upon loading --- daliuge-runtime/dlg/graph_loader.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/daliuge-runtime/dlg/graph_loader.py b/daliuge-runtime/dlg/graph_loader.py index 1b25127fb..34ebc3d39 100644 --- a/daliuge-runtime/dlg/graph_loader.py +++ b/daliuge-runtime/dlg/graph_loader.py @@ -32,13 +32,13 @@ from . import droputils from .apps.socket_listener import SocketListenerApp +from .common import Categories from .ddap_protocol import DROPRel, DROPLinkType from .drop import ContainerDROP, InMemoryDROP, \ FileDROP, NgasDROP, LINKTYPE_NTO1_PROPERTY, \ LINKTYPE_1TON_APPEND_METHOD, NullDROP from .exceptions import InvalidGraphException from .json_drop import JsonDROP -from .common import Categories STORAGE_TYPES = { Categories.MEMORY: InMemoryDROP, @@ -184,9 +184,11 @@ def loadDropSpecs(dropSpecList): # Step #1: Check the DROP specs and collect them dropSpecs = {} reprodata = None + if dropSpecList is None: + raise InvalidGraphException("DropSpec is empty %r" % dropSpecList) if dropSpecList[-1]['merkleroot'] is not None: - reprodata = dropSpecList.pop() - logger.debug("Found reprodata in dropSpecList, rmode=%s", reprodata['rmode']) + reprodata = dropSpecList.pop() + logger.debug("Found reprodata in dropSpecList, rmode=%s", reprodata['rmode']) for n, dropSpec in enumerate(dropSpecList): # 'type' and 'oit' are mandatory check_dropspec(n, dropSpec) From 1a89fd528b07a90652938310737d45c994666823 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 14:54:55 +0800 Subject: [PATCH 185/484] Composite manager now appends initial reprodata to all partitions. --- daliuge-runtime/dlg/manager/composite_manager.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/daliuge-runtime/dlg/manager/composite_manager.py b/daliuge-runtime/dlg/manager/composite_manager.py index 2f03d3a25..60b92eb27 100644 --- a/daliuge-runtime/dlg/manager/composite_manager.py +++ b/daliuge-runtime/dlg/manager/composite_manager.py @@ -296,6 +296,13 @@ def addGraphSpec(self, sessionId, graphSpec): # attribute set logger.info('Separating graph') perPartition = collections.defaultdict(list) + try: + if graphSpec[-1]['merkleroot'] is not None: + self._graph['reprodata'] = graphSpec.pop() + logger.debug("Composite manager found reprodata in dropspecList, rmode=%s", + self._graph['reprodata']['rmode']) + except KeyError: + pass for dropSpec in graphSpec: if self._partitionAttr not in dropSpec: msg = "Drop %s doesn't specify a %s attribute" % (dropSpec['oid'], self._partitionAttr) @@ -310,7 +317,6 @@ def addGraphSpec(self, sessionId, graphSpec): # Add the drop specs to our graph self._graph[uid_for_drop(dropSpec)] = dropSpec - # At each partition the relationships between DROPs should be local at the # moment of submitting the graph; thus we record the inter-partition # relationships separately and remove them from the original graph spec @@ -335,6 +341,11 @@ def addGraphSpec(self, sessionId, graphSpec): # Create the individual graphs on each DM now that they are correctly # separated. logger.info('Adding individual graphSpec of session %s to each DM', sessionId) + try: + for part in perPartition.values(): + part.append(self._graph['reprodata']) + except KeyError: + pass self.replicate(sessionId, self._addGraphSpec, "appending graphSpec to individual DMs", iterable=perPartition.items()) logger.info('Successfully added individual graphSpec of session %s to each DM', sessionId) From 19713c604cf47948d6560522c3e9acccc6edd430 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 14:55:30 +0800 Subject: [PATCH 186/484] lg_buildblockdag and build_blockdag now return leaves and visited nodes. This change cascades into downstream methods --- .../common/reproducibility/reproducibility.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 7be911cd3..8fd6896af 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -400,14 +400,14 @@ def lg_build_blockdag(lg: dict): q.append(n) if len(visited) != len(dropset): - raise Exception("Not a DAG") + raise Exception("Untraversed graph") logger.info("BlockDAG Generated at LG/T level") for i in range(len(leaves)): leaf = leaves[i] leaves[i] = dropset[leaf][0]['reprodata']['lg_blockhash'] - return leaves + return leaves, visited def build_blockdag(drops: list, abstraction: str = 'pgt'): @@ -495,7 +495,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for i in range(len(leaves)): leaf = leaves[i] leaves[i] = dropset[leaf][0]['reprodata'][blockstr + '_blockhash'] - return leaves + return leaves, visited # logger.info("BlockDAG Generated at" + abstraction + " level") @@ -541,7 +541,7 @@ def init_lg_repro_data(lg: dict): """ for drop in lg['nodeDataArray']: init_lg_repro_drop_data(drop) - leaves = lg_build_blockdag(lg) + leaves, visited = lg_build_blockdag(lg) lg['reprodata']['signature'] = agglomerate_leaves(leaves) logger.info("Reproducibility data finished at LG level") return lg @@ -556,7 +556,7 @@ def init_pgt_unroll_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_unroll_repro_drop_data(drop) - leaves = build_blockdag(pgt, 'pgt') + leaves, visited = build_blockdag(pgt, 'pgt') reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT unroll level") @@ -572,7 +572,7 @@ def init_pgt_partition_repro_data(pgt: list): reprodata = pgt.pop() for drop in pgt: init_pgt_partition_repro_drop_data(drop) - leaves = build_blockdag(pgt, 'pgt') + leaves, visited = build_blockdag(pgt, 'pgt') reprodata['signature'] = agglomerate_leaves(leaves) pgt.append(reprodata) logger.info("Reproducibility data finished at PGT partition level") @@ -593,7 +593,7 @@ def init_pg_repro_data(pg: list): reprodata['rmode'] = str(rmode.value) for drop in pg: init_pg_repro_drop_data(drop) - leaves = build_blockdag(pg, 'pg') + leaves, visited = build_blockdag(pg, 'pg') reprodata['signature'] = agglomerate_leaves(leaves) pg.append(reprodata) logger.info("Reproducibility data finished at PG level") @@ -615,7 +615,7 @@ def init_runtime_repro_data(rg: dict, reprodata: dict): reprodata['rmode'] = str(rmode.value) for drop_id, drop in rg.items(): init_rg_repro_drop_data(drop) - leaves = build_blockdag(list(rg.values()), 'rg') + leaves, visited = build_blockdag(list(rg.values()), 'rg') reprodata['signature'] = agglomerate_leaves(leaves) rg['reprodata'] = reprodata # logger.info("Reproducibility data finished at runtime level") From 4dac4079d4af8f33ee0a407f7d9282ba6147e690 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 15:04:50 +0800 Subject: [PATCH 187/484] test_dm now includes reprodata considerations --- daliuge-runtime/test/manager/test_dm.py | 38 +++++++++++++++++++------ 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/daliuge-runtime/test/manager/test_dm.py b/daliuge-runtime/test/manager/test_dm.py index 8f5ef8e44..5f869d096 100644 --- a/daliuge-runtime/test/manager/test_dm.py +++ b/daliuge-runtime/test/manager/test_dm.py @@ -25,10 +25,9 @@ import unittest import six - from dlg import droputils -from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType from dlg.common import dropdict, Categories +from dlg.ddap_protocol import DROPStates, DROPRel, DROPLinkType from dlg.drop import BarrierAppDROP from dlg.manager.node_manager import NodeManager @@ -39,17 +38,29 @@ hostname = "localhost" +default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} +default_graph_repro = {"rmode": "1", "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, + "merkleroot": "a", "signature": "b"} + + +def add_test_reprodata(graph: list): + for drop in graph: + drop['reprodata'] = default_repro.copy() + graph.append(default_graph_repro.copy()) + return graph def memory(uid, **kwargs): - dropSpec = dropdict({"oid": uid, "type": "plain", "storage": Categories.MEMORY}) + dropSpec = dropdict({"oid": uid, "type": "plain", "storage": Categories.MEMORY, + "reprodata": default_repro.copy()}) dropSpec.update(kwargs) return dropSpec def sleepAndCopy(uid, **kwargs): dropSpec = dropdict( - {"oid": uid, "type": "app", "app": "dlg.apps.simple.SleepAndCopyApp"} + {"oid": uid, "type": "app", "app": "dlg.apps.simple.SleepAndCopyApp", + "reprodata": default_repro.copy()} ) dropSpec.update(kwargs) return dropSpec @@ -161,6 +172,7 @@ def _deploy_error_graph(self, **kwargs): }, {"oid": "C", "type": "plain", "storage": Categories.MEMORY, "producers": ["B"]}, ] + add_test_reprodata(g) dm = self._start_dm(**kwargs) dm.createSession(sessionId) dm.addGraphSpec(sessionId, g) @@ -203,6 +215,8 @@ def _test_runGraphOneDOPerDOM(self, repeats=1): {"oid": "B", "type": "app", "app": "dlg.apps.crc.CRCApp"}, {"oid": "C", "type": "plain", "storage": Categories.MEMORY, "producers": ["B"]}, ] + add_test_reprodata(g1) + add_test_reprodata(g2) rels = [DROPRel("B", DROPLinkType.CONSUMER, "A")] a_data = os.urandom(32) c_data = six.b(str(crc32(a_data, 0))) @@ -258,7 +272,8 @@ def test_runGraphSeveralDropsPerDM(self): {"oid": "E", "type": "app", "app": "test.test_drop.SumupContainerChecksum"}, {"oid": "F", "type": "plain", "storage": Categories.MEMORY, "producers": ["E"]}, ] - + add_test_reprodata(g1) + add_test_reprodata(g2) rels = [ DROPRel("D", DROPLinkType.INPUT, "E"), DROPRel("B", DROPLinkType.INPUT, "E"), @@ -341,7 +356,8 @@ def test_runWithFourDMs(self): sleepAndCopy("N", inputs=["L", "M"], outputs=["O"], sleepTime=0), memory("O"), ] - + for g in [g1, g2, g3, g4]: + add_test_reprodata(g) rels_12 = [DROPRel("A", DROPLinkType.INPUT, "B")] rels_13 = [DROPRel("A", DROPLinkType.INPUT, "G")] rels_24 = [DROPRel("F", DROPLinkType.PRODUCER, "L")] @@ -423,7 +439,8 @@ def test_many_relationships(self): } ) rels.append(DROPRel("A", DROPLinkType.INPUT, b_oid)) - + add_test_reprodata(g1) + add_test_reprodata(g2) quickDeploy(dm1, sessionId, g1, {nm_conninfo(1): rels}) quickDeploy(dm2, sessionId, g2, {nm_conninfo(0): rels}) self.assertEqual(1, len(dm1._sessions[sessionId].drops)) @@ -488,7 +505,8 @@ def test_runGraphSeveralDropsPerDM_with_get_consumer_nodes(self): "node": ip_addr_2, }, ] - + add_test_reprodata(g1) + add_test_reprodata(g2) rels = [ DROPRel("D", DROPLinkType.INPUT, "E"), DROPRel("D", DROPLinkType.INPUT, "F"), @@ -541,6 +559,8 @@ def test_run_streaming_consumer_remotely(self): }, {"oid": "E", "type": "plain", "storage": Categories.MEMORY}, ] + add_test_reprodata(g1) + add_test_reprodata(g2) rels = [DROPRel("C", DROPLinkType.STREAMING_INPUT, "D")] a_data = os.urandom(32) e_data = six.b(str(crc32(a_data, 0))) @@ -571,6 +591,8 @@ def test_run_streaming_consumer_remotely2(self): }, {"oid": "E", "type": "plain", "storage": Categories.MEMORY}, ] + add_test_reprodata(g1) + add_test_reprodata(g2) rels = [DROPRel("C", DROPLinkType.OUTPUT, "B")] a_data = os.urandom(32) e_data = six.b(str(crc32(a_data, 0))) From 73a7eee2cfe5dda0fad47c659753e8f73c772a60 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 15:05:07 +0800 Subject: [PATCH 188/484] minor bug-fix in test_drophash --- daliuge-runtime/test/reproducibility/test_drophash.py | 1 - 1 file changed, 1 deletion(-) diff --git a/daliuge-runtime/test/reproducibility/test_drophash.py b/daliuge-runtime/test/reproducibility/test_drophash.py index 28f64e973..be9df517f 100644 --- a/daliuge-runtime/test/reproducibility/test_drophash.py +++ b/daliuge-runtime/test/reproducibility/test_drophash.py @@ -98,7 +98,6 @@ def test_set_reproducibility_level(self): a.setCompleted() self.assertIsNone(a.merkleroot) a.reproducibility_level = ReproducibilityFlags.RERUN - a.commit() self.assertIsNotNone(a.merkleroot) self.assertIsNone(b.merkleroot) From 1932f99dd7c716d197e7b29efa7210d4b6be99de Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 15:08:33 +0800 Subject: [PATCH 189/484] test_rest now had reprodata considerations --- daliuge-runtime/test/manager/test_rest.py | 39 ++++++++++++++++------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/daliuge-runtime/test/manager/test_rest.py b/daliuge-runtime/test/manager/test_rest.py index 833d38599..525c0958c 100644 --- a/daliuge-runtime/test/manager/test_rest.py +++ b/daliuge-runtime/test/manager/test_rest.py @@ -24,6 +24,7 @@ import unittest from dlg import exceptions +from dlg.common import Categories from dlg.exceptions import InvalidGraphException from dlg.manager import constants from dlg.manager.client import NodeManagerClient, DataIslandManagerClient @@ -31,12 +32,18 @@ from dlg.manager.node_manager import NodeManager from dlg.manager.rest import NMRestServer, CompositeManagerRestServer from dlg.restutils import RestClient -from dlg.manager.composite_manager import DataIslandManager -from dlg.exceptions import InvalidGraphException -from dlg.common import Categories - hostname = 'localhost' +default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} +default_graph_repro = {"rmode": "1", "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, + "merkleroot": "a", "signature": "b"} + + +def add_test_reprodata(graph: list): + for drop in graph: + drop['reprodata'] = default_repro.copy() + graph.append(default_graph_repro.copy()) + return graph class TestRest(unittest.TestCase): @@ -76,26 +83,31 @@ def test_errtype(self): sid = 'lala' c = NodeManagerClient(hostname) c.createSession(sid) - + gempty = [{}] + add_test_reprodata(gempty) # already exists self.assertRaises(exceptions.SessionAlreadyExistsException, c.createSession, sid) # different session - self.assertRaises(exceptions.NoSessionException, c.addGraphSpec, sid + "x", [{}]) + self.assertRaises(exceptions.NoSessionException, c.addGraphSpec, sid + "x", gempty) # invalid dropspec, it has no oid/type (is completely empty actually) - self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, [{}]) + self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, gempty) # invalid dropspec, app doesn't exist self.assertRaises(exceptions.InvalidGraphException, c.addGraphSpec, sid, - [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist'}]) + [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist', "reprodata": default_repro.copy()}, + default_graph_repro.copy()]) # invalid state, the graph status is only queried when the session is running self.assertRaises(exceptions.InvalidSessionState, c.getGraphStatus, sid) # valid dropspec, but the socket listener app doesn't allow inputs - c.addGraphSpec(sid, [{'type': 'socket', 'oid': 'a', 'inputs': ['b']}, - {'oid': 'b', 'type': 'plain', 'storage': Categories.MEMORY}]) + c.addGraphSpec(sid, [{'type': 'socket', 'oid': 'a', 'inputs': ['b'], + "reprodata": default_repro.copy()}, + {'oid': 'b', 'type': 'plain', 'storage': Categories.MEMORY, + "reprodata": default_repro.copy()}, + default_graph_repro.copy()]) self.assertRaises(exceptions.InvalidRelationshipException, c.deploySession, sid) # And here we point to an unexisting file, making an invalid drop @@ -103,7 +115,8 @@ def test_errtype(self): c.createSession(sid) fname = tempfile.mktemp() c.addGraphSpec(sid, [ - {'type': 'plain', 'storage': Categories.FILE, 'oid': 'a', 'filepath': fname, 'check_filepath_exists': True}]) + {'type': 'plain', 'storage': Categories.FILE, 'oid': 'a', 'filepath': fname, 'check_filepath_exists': True, + "reprodata": default_repro.copy()}, default_graph_repro.copy()]) self.assertRaises(exceptions.InvalidDropException, c.deploySession, sid) def test_recursive(self): @@ -115,7 +128,9 @@ def test_recursive(self): # This is not checked at the DIM level but only at the NM level # The exception should still pass through though with self.assertRaises(exceptions.SubManagerException) as cm: - c.addGraphSpec(sid, [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist', 'node': hostname}]) + c.addGraphSpec(sid, [{'oid': 'a', 'type': 'app', 'app': 'doesnt.exist', 'node': hostname, + "reprodata": default_repro.copy()}, + default_graph_repro.copy()]) ex = cm.exception self.assertTrue(hostname in ex.args[0]) self.assertTrue(isinstance(ex.args[0][hostname], InvalidGraphException)) From 7a4cbe1d9e89986b7eefcffd40c4f6833a1faf19 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 15:08:42 +0800 Subject: [PATCH 190/484] test_session now had reprodata considerations --- daliuge-runtime/test/test_session.py | 49 ++++++++++++++++++---------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/daliuge-runtime/test/test_session.py b/daliuge-runtime/test/test_session.py index 91ea6a69d..3c1d5a596 100644 --- a/daliuge-runtime/test/test_session.py +++ b/daliuge-runtime/test/test_session.py @@ -21,9 +21,23 @@ # import unittest +from dlg.common import Categories from dlg.ddap_protocol import DROPLinkType, DROPStates, AppDROPStates from dlg.droputils import DROPWaiterCtx -from dlg.common import Categories +from dlg.exceptions import InvalidGraphException +from dlg.manager.session import SessionStates, Session + +default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} +default_graph_repro = {"rmode": "1", "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, + "merkleroot": "a", "signature": "b"} + + +def add_test_reprodata(graph: list): + for drop in graph: + drop['reprodata'] = default_repro.copy() + graph.append(default_graph_repro.copy()) + return graph + class TestSession(unittest.TestCase): @@ -31,8 +45,7 @@ def test_sessionStates(self): with Session('1') as s: self.assertEqual(SessionStates.PRISTINE, s.status) self.assertRaises(Exception, s.linkGraphParts, '', '', 0) - - s.addGraphSpec([{"oid": "A", "type": "container"}]) + s.addGraphSpec(add_test_reprodata([{"oid": "A", "type": "container"}])) self.assertEqual(SessionStates.BUILDING, s.status) s.deploy() @@ -55,26 +68,26 @@ def test_sessionStates_noDrops(self): def test_addGraphSpec(self): with Session('1') as s: - s.addGraphSpec([{"oid": "A", "type": "container"}]) - s.addGraphSpec([{"oid": "B", "type": "container"}]) - s.addGraphSpec([{"oid": "C", "type": "container"}]) + s.addGraphSpec(add_test_reprodata([{"oid": "A", "type": "container"}])) + s.addGraphSpec(add_test_reprodata([{"oid": "B", "type": "container"}])) + s.addGraphSpec(add_test_reprodata([{"oid": "C", "type": "container"}])) # Adding an existing DROP - self.assertRaises(Exception, s.addGraphSpec, [{"oid": "A", "type": "container"}]) + self.assertRaises(Exception, s.addGraphSpec, add_test_reprodata([{"oid": "A", "type": "container"}])) # Adding invalid specs - self.assertRaises(Exception, s.addGraphSpec, [{"oid": "D", "type": "app"}]) # missing "storage" + self.assertRaises(Exception, s.addGraphSpec, add_test_reprodata([{"oid": "D", "type": "app"}])) # missing "storage" self.assertRaises(Exception, s.addGraphSpec, - [{"oid": "D", "type": "plain", "storage": "invalid"}]) # invalid "storage" - self.assertRaises(Exception, s.addGraphSpec, [{"oid": "D", "type": "invalid"}]) # invalid "type" + add_test_reprodata([{"oid": "D", "type": "plain", "storage": "invalid"}])) # invalid "storage" + self.assertRaises(Exception, s.addGraphSpec, add_test_reprodata([{"oid": "D", "type": "invalid"}])) # invalid "type" self.assertRaises(Exception, s.addGraphSpec, - [{"oid": "D", "type": "app", "storage": Categories.NULL, "outputs": ["X"]}]) # missing X DROP + add_test_reprodata([{"oid": "D", "type": "app", "storage": Categories.NULL, "outputs": ["X"]}])) # missing X DROP def test_linking(self): with Session('1') as s: - s.addGraphSpec([{"oid": "A", "type": "container"}]) - s.addGraphSpec([{"oid": "B", "type": "app", "storage": Categories.NULL, "app": "dlg.apps.crc.CRCApp"}]) - s.addGraphSpec([{"oid": "C", "type": "container"}]) + s.addGraphSpec(add_test_reprodata([{"oid": "A", "type": "container"}])) + s.addGraphSpec(add_test_reprodata([{"oid": "B", "type": "app", "storage": Categories.NULL, "app": "dlg.apps.crc.CRCApp"}])) + s.addGraphSpec(add_test_reprodata([{"oid": "C", "type": "container"}])) # Link them now s.linkGraphParts('A', 'B', DROPLinkType.CONSUMER) @@ -96,9 +109,9 @@ def test_linking(self): def test_cancel(self): '''Cancels a whole graph execution''' with Session('1') as s: - s.addGraphSpec([{"oid": "A", "type": "plain", "storage": Categories.MEMORY, 'consumers': ['B']}, + s.addGraphSpec(add_test_reprodata([{"oid": "A", "type": "plain", "storage": Categories.MEMORY, 'consumers': ['B']}, {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 2}, - {"oid": "C", "type": "plain", "storage": Categories.MEMORY, 'producers': ['B']}]) + {"oid": "C", "type": "plain", "storage": Categories.MEMORY, 'producers': ['B']}])) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) s.cancel() @@ -110,11 +123,11 @@ def test_cancel(self): def test_partial_cancel(self): '''Like test_cancel, but only part of the graph should be cancelled''' with Session('1') as s: - s.addGraphSpec([{"oid": "A", "type": "plain", "storage": Categories.MEMORY, 'consumers': ['B']}, + s.addGraphSpec(add_test_reprodata([{"oid": "A", "type": "plain", "storage": Categories.MEMORY, 'consumers': ['B']}, {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 0}, {"oid": "C", "type": "plain", "storage": Categories.MEMORY, 'producers': ['B'], 'consumers': ['D']}, {"oid": "D", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 10}, - {"oid": "E", "type": "plain", "storage": Categories.MEMORY, 'producers': ['D']}]) + {"oid": "E", "type": "plain", "storage": Categories.MEMORY, 'producers': ['D']}])) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) From b802c9e03572e2e6e8900e26a6820214ba64c4cb Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 15:09:39 +0800 Subject: [PATCH 191/484] test_toposort now runs graphs through reprodata initialization and uses the returned 'visited' list --- .../test/reproducibility/test_toposort.py | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/daliuge-runtime/test/reproducibility/test_toposort.py b/daliuge-runtime/test/reproducibility/test_toposort.py index cdef9ba02..494888f61 100644 --- a/daliuge-runtime/test/reproducibility/test_toposort.py +++ b/daliuge-runtime/test/reproducibility/test_toposort.py @@ -28,7 +28,7 @@ import json import unittest -from dlg.common.reproducibility.reproducibility import lg_build_blockdag +from dlg.common.reproducibility.reproducibility import init_lgt_repro_data, init_lg_repro_data, lg_build_blockdag class ToposortTests(unittest.TestCase): @@ -50,7 +50,9 @@ def test_lg_blockdag_single(self): A """ lgt = self.init_graph("topoGraphs/testSingle.graph") - visited = lg_build_blockdag(lgt) + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves, visited = lg_build_blockdag(lgt) self.assertTrue(visited == [-1]) def test_lg_blockdag_twostart(self): @@ -61,7 +63,9 @@ def test_lg_blockdag_twostart(self): B --> """ lgt = self.init_graph("topoGraphs/testTwoStart.graph") - visited = lg_build_blockdag(lgt) + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves, visited = lg_build_blockdag(lgt) self.assertTrue(visited == [-3, -1, -2]) def test_lg_blockdag_twoend(self): @@ -72,7 +76,9 @@ def test_lg_blockdag_twoend(self): --> C """ lgt = self.init_graph("topoGraphs/testTwoEnd.graph") - visited = lg_build_blockdag(lgt) + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves, visited = lg_build_blockdag(lgt) self.assertTrue(visited == [-1, -3, -2]) def test_lg_blockdag_twolines(self): @@ -82,31 +88,17 @@ def test_lg_blockdag_twolines(self): C --> D """ lgt = self.init_graph("topoGraphs/testTwoLines.graph") - visited = lg_build_blockdag(lgt) + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves, visited = lg_build_blockdag(lgt) self.assertTrue(visited == [-2, -3, -1, -4]) - def test_lg_blockdag_notDAG(self): - """ - A graph that is not a dag. This should fail. - A --> B --> C --> B - """ - lgt = self.init_graph("topoGraphs/testNotDAG.graph") - with self.assertRaises(Exception): - lg_build_blockdag(lgt) - - def test_lg_blockdag_cycle(self): - """ - A graph that is one cycle. This should fail - A --> B --> C --> A - """ - lgt = self.init_graph("topoGraphs/testCycle.graph") - with self.assertRaises(Exception): - lg_build_blockdag(lgt) - def test_lg_blockdag_empty(self): """ Tests an empty graph. Should fail gracefully. """ lgt = self.init_graph("topoGraphs/testEmpty.graph") - visited = lg_build_blockdag(lgt) + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves, visited = lg_build_blockdag(lgt) self.assertTrue(visited == []) From 761bf06f938a1820bef5ffa79570da6c8f60f82c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 17:46:32 +0800 Subject: [PATCH 192/484] FileDROP setComplete now fires the appropriate reproducibility event. --- daliuge-engine/dlg/drop.py | 1 + 1 file changed, 1 insertion(+) diff --git a/daliuge-engine/dlg/drop.py b/daliuge-engine/dlg/drop.py index c04251a3b..ccef86830 100644 --- a/daliuge-engine/dlg/drop.py +++ b/daliuge-engine/dlg/drop.py @@ -1316,6 +1316,7 @@ def setCompleted(self): self._size = os.stat(self.path).st_size # Signal our subscribers that the show is over self._fire('dropCompleted', status=DROPStates.COMPLETED) + self.completedrop() @property def dataURL(self): From 72fb888e401a1c7782f87a2d9aa30156cf3cf056 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 3 Feb 2021 17:48:00 +0800 Subject: [PATCH 193/484] Adjusts import statements for ray update --- .../dlg/translator/tool_commands.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index bb1306093..3fc93fa12 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -27,11 +27,10 @@ import os import sys +from dlg.common import tool from dlg.common.reproducibility.reproducibility import init_lgt_repro_data, init_lg_repro_data, \ init_pgt_unroll_repro_data, init_pgt_partition_repro_data, init_pg_repro_data -from ..common import tool - logger = logging.getLogger(__name__) @@ -85,7 +84,7 @@ def partition(pgt, opts): def submit(pg, opts): - from ..deploy import common + from dlg.deploy import common session_id = common.submit(pg, host=opts.host, port=opts.port, skip_deploy=opts.skip_deploy, session_id=opts.session_id) @@ -239,7 +238,7 @@ def dlg_unroll_and_partition(parser, args): def dlg_map(parser, args): - from .. import constants + import dlg.constants as con tool.add_logging_options(parser) _add_output_options(parser) @@ -247,7 +246,7 @@ def dlg_map(parser, args): dest='host', help='The host we connect to to deploy the graph', default='localhost') parser.add_option("-p", "--port", action="store", type="int", dest='port', help='The port we connect to to deploy the graph', - default=constants.ISLAND_DEFAULT_REST_PORT) + default=con.ISLAND_DEFAULT_REST_PORT) parser.add_option('-P', '--physical-graph-template', action='store', dest='pgt_path', type='string', help='Path to the Physical Graph to submit (default: stdin)', default='-') parser.add_option("-N", "--nodes", action="store", @@ -260,7 +259,7 @@ def dlg_map(parser, args): dump = _setup_output(opts) from ..dropmake import pg_generator - from ..clients import CompositeManagerClient + from dlg.clients import CompositeManagerClient if opts.nodes: nodes = [n for n in opts.nodes.split(',') if n] @@ -282,8 +281,7 @@ def dlg_map(parser, args): def dlg_submit(parser, args): - from ..manager import constants - + import dlg.constants as con # Submit Physical Graph _add_output_options(parser) tool.add_logging_options(parser) @@ -291,7 +289,7 @@ def dlg_submit(parser, args): dest='host', help='The host we connect to to deploy the graph', default='localhost') parser.add_option("-p", "--port", action="store", type="int", dest='port', help='The port we connect to to deploy the graph', - default=constants.ISLAND_DEFAULT_REST_PORT) + default=con.ISLAND_DEFAULT_REST_PORT) parser.add_option('-P', '--physical-graph', action='store', dest='pg_path', type='string', help='Path to the Physical Graph to submit (default: stdin)', default='-') parser.add_option('-s', '--session-id', action='store', dest='session_id', type='string', From dce6f39b1945f845917efa3f9d212689c657283a Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 11 Mar 2021 19:31:40 +0800 Subject: [PATCH 194/484] Very minor adjustment to reproducibility dag building behaviour. The Graph-minor traversal method is only used when Reproducing specifically. --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 8fd6896af..ba7ed4733 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -380,7 +380,7 @@ def lg_build_blockdag(lg: dict): for n in neighbourset[did]: dropset[n][1] -= 1 parenthash = {} - if rmode >= ReproducibilityFlags.REPRODUCE.value: + if rmode == ReproducibilityFlags.REPRODUCE.value: if dropset[did][0]['categoryType'] == Categories.DATA \ and (dropset[did][1] == 0 or dropset[did][2] == 0): # Add my new hash to the parent-hash list @@ -471,7 +471,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for n in neighbourset[did]: dropset[n][1] -= 1 parenthash = {} - if rmode >= ReproducibilityFlags.REPRODUCE.value: + if rmode == ReproducibilityFlags.REPRODUCE.value: # TODO: Hack! may break later, proceed with caution if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA\ and (dropset[did][1] == 0 or dropset[did][2] == 0): From 040618e5e0d15500b6cded3873f2182eee842789 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 15 Apr 2021 20:00:31 +0800 Subject: [PATCH 195/484] Adds rerun thesis graph tests --- .../common/reproducibility/apps_lowpass.py | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 15a974abd..039bccf12 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -25,12 +25,32 @@ class LP_SignalGenerator(BarrierAppDROP): # default values length = dlg_int_param('length', 256) srate = dlg_int_param('sample rate', 5000) - freqs = dlg_list_param('Frequencies(int)', [440, 800, 1000, 2000]) + freqs = dlg_list_param('frequencies', [440, 800, 1000, 2000]) + noise = dlg_list_param('noise', []) series = None def initialize(self, **kwargs): super(LP_SignalGenerator, self).initialize(**kwargs) + def add_noise(self, series: np.array, mean, std, freq, sample_rate, seed, alpha=0.1): + """ + A noise to the provided signal by producing random values of a given frequency + :param series: The input (and output) numpy array signal series + :param mean: The average value + :param std: The standard deviation of the value + :param freq: The frequency of the noisy signal + :param sample_rate: The sample rate of the input series + :param seed: The random seed + :param alpha: The multiplier + :return: The input series with noisy values added + """ + np.random.seed(seed) + samples = alpha * np.random.normal(mean, std, size=len(series)) + for i in range(len(series)): + samples[i] += np.sin(2 * np.pi * i * freq / sample_rate) + np.add(series, samples, out=series) + return series + def gen_sig(self): series = np.zeros(self.length, dtype=np.float64) for freq in self.freqs: @@ -43,6 +63,11 @@ def run(self): if len(outs) < 1: raise Exception('At least one output required for %r' % self) self.series = self.gen_sig() + if len(self.noise) > 0: + self.noise[0] = 1 / self.noise[0] + self.series = self.add_noise(self.series, self.noise[2], self.noise[4], self.noise[1], self.srate, + self.noise[3], self.noise[0]) + data = self.series.tostring() for o in outs: o.len = len(data) @@ -320,9 +345,6 @@ def filter(self): out_np = np.zeros(len(out_gpu), self.precision['complex']) out_gpu.get(out_np) context.pop() - context = None - from pycuda.tools import clear_context_caches - clear_context_caches() return out_np From f43a33e3b83262f6b6e19b294b5b759aac0a6465 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 22 Apr 2021 08:08:36 +0800 Subject: [PATCH 196/484] Adds system summary to lowpass apps --- .../common/reproducibility/apps_lowpass.py | 7 ++- .../dlg/common/reproducibility/constants.py | 58 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 039bccf12..9a7ec8f9c 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -3,6 +3,7 @@ from dlg import droputils from dlg.apps.simple import BarrierAppDROP # from dlg.common.reproducibility.reproducibility import common_hash +from dlg.common.reproducibility.constants import system_summary from dlg.meta import dlg_batch_output, dlg_streaming_input from dlg.meta import dlg_component, dlg_batch_input from dlg.meta import dlg_int_param, dlg_list_param, dlg_float_param, dlg_bool_param @@ -84,7 +85,8 @@ def generate_recompute_data(self): return {'length': self.length, 'sample_rate': self.srate, 'frequencies': self.freqs, - 'status': self.status} + 'status': self.status, + 'system': system_summary()} class LP_WindowGenerator(BarrierAppDROP): @@ -141,6 +143,7 @@ def generate_recompute_data(self): output['cutoff'] = self.cutoff output['sample_rate'] = self.srate output['status'] = self.status + output['system'] = system_summary() return output @@ -200,6 +203,7 @@ def generate_recompute_data(self): 'sample_rate': self.srate, 'seed': self.seed, 'alpha': self.alpha, + 'system': system_summary(), 'status': self.status} @@ -261,6 +265,7 @@ def run(self): def generate_recompute_data(self): return {'precision_float': str(self.precision['float']), 'precision_complex': str(self.precision['complex']), + 'system': system_summary(), 'status': self.status} """ diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index a38bfabb5..49272bba3 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -1,6 +1,12 @@ import hashlib +import platform +import sys from enum import Enum +import GPUtil +import psutil +from merklelib import MerkleTree + PROTOCOL_VERSION = 0.1 @@ -71,3 +77,55 @@ def rmode_supported(flag: ReproducibilityFlags): return True else: return False + + +def find_loaded_modules(): + """ + :return: A list of all loaded modules + """ + loaded_mods = [] + for name, module in sorted(sys.modules.items()): + if hasattr(module, '__version__'): + loaded_mods.append(name + " " + str(module.__version__)) + else: + loaded_mods.append(name) + return loaded_mods + + +def system_summary(): + """ + Summarises the system this function is run on. + Includes system, cpu, gpu and module details + :return: A dictionary of system details + """ + merkletree = MerkleTree() + system_info = {} + uname = platform.uname() + system_info['system'] = { + 'system': uname.system, + 'release': uname.release, + 'machine': uname.machine, + 'processor': uname.processor + } + cpu_freq = psutil.cpu_freq() + system_info['cpu'] = { + 'cores_phys': psutil.cpu_count(logical=False), + 'cores_logic': psutil.cpu_count(logical=True), + 'max_frequency': cpu_freq.max, + 'min_frequency': cpu_freq.min + } + sys_mem = psutil.virtual_memory() + system_info['memory'] = { + 'total': sys_mem.total + } + gpus = GPUtil.getGPUs() + system_info['gpu'] = {} + for gpu in gpus: + system_info['gpu'][gpu.id] = { + 'name': gpu.name, + 'memory': gpu.memoryTotal + } + system_info['modules'] = find_loaded_modules() + merkletree.append([system_info[item] for item in system_info]) + system_info['signature'] = merkletree.merkle_root + return system_info From 562b8521da0c5528a3aeca5d023669abdd721111 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 22 Apr 2021 11:22:50 +0800 Subject: [PATCH 197/484] Updates results with system information --- Dockerfile | 8 ++++---- Dockerfile.ray | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index e6982a175..7a04f2142 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,11 +2,11 @@ # Merging the ray engine (https://docs.ray.io/en/master/installation.html) # and DALiuGE FROM rayproject/ray:latest-cpu -RUN apt update && apt install -y gcc && test -e daliuge || git clone --branch ray_test https://github.com/ICRAR/daliuge.git +RUN sudo apt update && sudo apt install -y gcc && sudo test -e daliuge || sudo git clone https://github.com/pritchardn/daliuge.git RUN cd daliuge/daliuge-common && pip install . \ && cd ../daliuge-engine && pip install . \ - && rm -rf /root/anaconda3/lib/python3.7/site-packages/azure \ - && apt-get remove cmake gcc -y \ - && apt-get clean + && sudo rm -rf /root/anaconda3/lib/python3.7/site-packages/azure \ + && sudo apt-get remove cmake gcc -y \ + && sudo apt-get clean CMD ["dlg", "daemon", "-vv", "--no-nm"] \ No newline at end of file diff --git a/Dockerfile.ray b/Dockerfile.ray index 62af8c7e9..597b52aeb 100644 --- a/Dockerfile.ray +++ b/Dockerfile.ray @@ -1,7 +1,7 @@ # We need the base image we build with the other Dockerfile FROM rayproject/ray:latest-cpu -RUN git clone https://github.com/ICRAR/daliuge && \ +RUN git clone https://github.com/pritchardn/daliuge && \ apt update && \ apt install -y gcc &&\ cd daliuge && \ From 4abab3ba5f02557c40f22d3b35009ea279300c14 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 28 Apr 2021 10:36:09 +0800 Subject: [PATCH 198/484] Adds merklelib dependency for reproducibility --- daliuge-engine/pip/requirements.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/daliuge-engine/pip/requirements.txt b/daliuge-engine/pip/requirements.txt index 2c721c8f6..b80a6f778 100644 --- a/daliuge-engine/pip/requirements.txt +++ b/daliuge-engine/pip/requirements.txt @@ -21,3 +21,5 @@ six>=1.10 twine # 0.6 brings python3 support plus other fixes zerorpc >= 0.6 +# For reproducibility +merklelib = 1.0 From 6feff41de628e5957216c43649fa59172182c8e1 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 28 Apr 2021 11:15:45 +0800 Subject: [PATCH 199/484] Changes ''' to """ for consistency in plasma.py --- daliuge-engine/dlg/apps/plasma.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/daliuge-engine/dlg/apps/plasma.py b/daliuge-engine/dlg/apps/plasma.py index 54f29efe0..6b803c65a 100644 --- a/daliuge-engine/dlg/apps/plasma.py +++ b/daliuge-engine/dlg/apps/plasma.py @@ -30,7 +30,7 @@ class MSPlasmaReader(BarrierAppDROP): - ''' + """ A BarrierAppDROP that reads a CASA measurement from a plasma store and writes out to file. Example: @@ -39,7 +39,7 @@ class MSPlasmaReader(BarrierAppDROP): c = PlasmaDROP('c', 'c') d = MSPlasmaReader('d', 'd') e = FileDROP('e', 'e', filepath=out_file) - ''' + """ compontent_meta = dlg_component('MSPlasmaWriter', 'Measurement Set Plasma Writer.', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], @@ -97,7 +97,7 @@ def run(self, **kwargs): class MSPlasmaWriter(BarrierAppDROP): - ''' + """ A BarrierAppDROP that reads a CASA measurement set and writes it out to a plasma store. Example: @@ -106,7 +106,7 @@ class MSPlasmaWriter(BarrierAppDROP): c = PlasmaDROP('c', 'c') d = MSPlasmaReader('d', 'd') e = FileDROP('e', 'e', filepath=out_file) - ''' + """ compontent_meta = dlg_component('MSPlasmaWriter', 'Measurement Set Plasma Writer.', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], From b97b4999da5c8514e1dd0c6d986ec9e415363106 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 28 Apr 2021 11:33:42 +0800 Subject: [PATCH 200/484] Adds a first cut at a reproducibility implementation for plasma writers. --- daliuge-engine/dlg/apps/plasma.py | 31 +++++++++++++++++++++++++++++++ daliuge-engine/dlg/drop.py | 3 +++ 2 files changed, 34 insertions(+) diff --git a/daliuge-engine/dlg/apps/plasma.py b/daliuge-engine/dlg/apps/plasma.py index 6b803c65a..d534fa9e1 100644 --- a/daliuge-engine/dlg/apps/plasma.py +++ b/daliuge-engine/dlg/apps/plasma.py @@ -24,6 +24,7 @@ import numpy as np from casacore import tables +from dlg.common.reproducibility.reproducibility import common_hash from dlg.drop import BarrierAppDROP from dlg.meta import dlg_string_param, dlg_component, dlg_batch_input, \ dlg_batch_output, dlg_streaming_input @@ -47,6 +48,11 @@ class MSPlasmaReader(BarrierAppDROP): ms_output_path = dlg_string_param('ms_output_path', None) + def __init__(self, oid, uid, **kwargs): + super().__init__(oid, uid, kwargs) + self.reproduce_data = {} + self.recompute_data = {} + def initialize(self, **kwargs): super(MSPlasmaReader, self).initialize(**kwargs) @@ -81,6 +87,7 @@ def _deserialize_table(self, in_stream, path): load_bytes = io.BytesIO(in_stream) ms = np.load(load_bytes, allow_pickle=True).flat[0] self._write_table(ms, path) + self.reproduce_data['data_hash'] = common_hash(ms) def run(self, **kwargs): if len(self.inputs) != 1: @@ -90,11 +97,20 @@ def run(self, **kwargs): inp = self.inputs[0] out = self.outputs[0].path + self.recompute_data['in'] = str(inp) + self.recompute_data['out'] = str(out) desc = inp.open() input_stream = inp.read(desc) self._deserialize_table(input_stream, out) + def generate_recompute_data(self): + self.recompute_data['status'] = self.status + return self.recompute_data + + def generate_reproduce_data(self): + return self.reproduce_data + class MSPlasmaWriter(BarrierAppDROP): """ @@ -114,6 +130,11 @@ class MSPlasmaWriter(BarrierAppDROP): ms_input_path = dlg_string_param('ms_input_path', None) + def __init__(self, oid, uid, **kwargs): + super().__init__(oid, uid, kwargs) + self.recompute_data = {} + self.reproduce_data = {} + def initialize(self, **kwargs): super(MSPlasmaWriter, self).initialize(**kwargs) @@ -149,6 +170,16 @@ def run(self, **kwargs): inp = self.inputs[0].path out = self.outputs[0] + self.recompute_data['in'] = str(inp) + self.recompute_data['out'] = str(out) out_bytes = self._serialize_table(inp) out.write(out_bytes) + self.reproduce_data['data_hash'] = common_hash(out_bytes) + + def generate_recompute_data(self): + self.recompute_data['status'] = self.status + return self.recompute_data + + def generate_reproduce_data(self): + return self.reproduce_data diff --git a/daliuge-engine/dlg/drop.py b/daliuge-engine/dlg/drop.py index bfb6d132f..1e2ca5be8 100644 --- a/daliuge-engine/dlg/drop.py +++ b/daliuge-engine/dlg/drop.py @@ -1952,6 +1952,9 @@ def getIO(self): def dataURL(self): return "plasma://%s" % (self.object_id.encode('hex')) + def generate_recompute_data(self): + return {'status': self.status, 'object_id': self.object_id, 'plasma_link': self.plasma_link} + # Dictionary mapping 1-to-many DROPLinkType constants to the corresponding methods # used to append a a DROP into a relationship collection of another From bbf52bf31058da16744cbc831263f45253d9e6e3 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 24 May 2021 21:39:16 +0800 Subject: [PATCH 201/484] NGASDrop now uses the actual Ngas FileID NGASIO now paginates data-reads (although actual reading happens once) NGASIO now _writes with bytes and strings _close updates method to _post method. --- daliuge-engine/dlg/drop.py | 10 +++++---- daliuge-engine/dlg/io.py | 46 +++++++++++++++++++++++++++++--------- 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/daliuge-engine/dlg/drop.py b/daliuge-engine/dlg/drop.py index 1e2ca5be8..09d59ad84 100644 --- a/daliuge-engine/dlg/drop.py +++ b/daliuge-engine/dlg/drop.py @@ -1341,22 +1341,24 @@ class NgasDROP(AbstractDROP): ngasTimeout = dlg_int_param('ngasTimeout', 2) ngasConnectTimeout = dlg_int_param('ngasConnectTimeout', 2) len = dlg_int_param('len', -1) + ngasFileId = dlg_string_param('ngasFileId', None) def initialize(self, **kwargs): - pass + if self.ngasFileId is None: + self.ngasFileId = self.uid def getIO(self): try: - ngasIO = NgasIO(self.ngasSrv, self.uid, self.ngasPort, + ngasIO = NgasIO(self.ngasSrv, self.ngasFileId, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, self.len) except ImportError: - ngasIO = NgasLiteIO(self.ngasSrv, self.uid, self.ngasPort, + ngasIO = NgasLiteIO(self.ngasSrv, self.ngasFileId, self.ngasPort, self.ngasConnectTimeout, self.ngasTimeout, self.len) return ngasIO @property def dataURL(self): - return "ngas://%s:%d/%s" % (self.ngasSrv, self.ngasPort, self.uid) + return "ngas://%s:%d/%s" % (self.ngasSrv, self.ngasPort, self.ngasFileId) # Override def generate_reproduce_data(self): diff --git a/daliuge-engine/dlg/io.py b/daliuge-engine/dlg/io.py index 369f10a62..2b8f91c8f 100644 --- a/daliuge-engine/dlg/io.py +++ b/daliuge-engine/dlg/io.py @@ -269,10 +269,12 @@ def __init__(self, hostname, fileId, port=7777, ngasConnectTimeout=2, ngasTimeou self._ngasTimeout = ngasTimeout self._fileId = fileId self._length = length + self._loc = -1 + self._readData = None def _getClient(self): from ngamsPClient import ngamsPClient # @UnresolvedImport - return ngamsPClient.ngamsPClient(self._ngasSrv, self._ngasPort, self._ngasTimeout) + return ngamsPClient.ngamsPClient(host=self._ngasSrv, port=self._ngasPort, timeout=self._ngasTimeout) def _open(self, **kwargs): if self._mode == OpenMode.OPEN_WRITE: @@ -287,27 +289,49 @@ def _open(self, **kwargs): def _close(self, **kwargs): client = self._desc if self._mode == OpenMode.OPEN_WRITE: - reply, msg, _, _ = client._httpPost( - client.getHost(), client.getPort(), 'QARCHIVE', - 'application/octet-stream', dataRef=self._buf, - pars=[['filename', self._fileId]], dataSource='BUFFER', - dataSize=self._writtenDataSize) + reply = client._post( + cmd='QARCHIVE', + mime_type='application/octet-stream', + data=self._buf, + pars=[['filename', self._fileId]]) self._buf = None - if reply != 200: + if reply.http_status != 200: # Probably msg is not enough, we need to unpack the status XML doc # from the returning data and extract the real error message from # there - raise Exception(msg) + raise Exception(reply.message) # Release the reference to _desc so the client object gets destroyed del self._desc - def _read(self, count, **kwargs): + def _read(self, count=4096, **kwargs): # Read data from NGAS and give it back to our reader - self._desc.retrieve2File(self._fileId, cmd="QRETRIEVE") + # self._desc.retrieve2File(self._fileId, cmd="QRETRIEVE") # NIC: This function no longer exists + if self._loc == -1 and self._readData is None: + import tempfile + file = tempfile.NamedTemporaryFile('w+b') + self._desc.retrieve(self._fileId, targetFile=file.name) + file.seek(0) + self._readData = file.read() + self._length = len(self._readData) + self._loc = 0 + if self._loc < self._length and self._readData is not None: + if count is None: # Read it all then + count = self._length + num_read = min(count, self._length - self._loc) + end_loc = self._loc + num_read + data = self._readData[self._loc:end_loc] + self._loc = end_loc + return data + elif self._loc == self._length and self._readData is not None: + self._loc = 0 + return None def _write(self, data, **kwargs): - self._buf += data + if type(data) == bytes: + self._buf += str(data) + else: + self._buf += data self._writtenDataSize += len(data) return len(data) From ee9c520fff78dd08157fdaf3e080e6575039a4f4 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 24 May 2021 21:39:44 +0800 Subject: [PATCH 202/484] Removes duplicate mount points in dockerapp.py by using list->set->list trick. --- daliuge-engine/dlg/apps/dockerapp.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/daliuge-engine/dlg/apps/dockerapp.py b/daliuge-engine/dlg/apps/dockerapp.py index c2249c662..8afbc482f 100644 --- a/daliuge-engine/dlg/apps/dockerapp.py +++ b/daliuge-engine/dlg/apps/dockerapp.py @@ -306,6 +306,9 @@ def run(self): fsOutputs.items()] binds += [host_path + ":" + container_path for host_path, container_path in self._additionalBindings.items()] logger.debug("Volume bindings: %r", binds) + binds = set(binds) + binds = list(binds) + logger.debug("Reduced volume bindings: %r", binds) # Wait until the DockerApps this application runtime depends on have # started, and replace their IP placeholders by the real IPs From 234836b24d872fddb8a073d0bac6c55c2acf04d0 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 22 Jun 2021 10:25:17 +0800 Subject: [PATCH 203/484] Adds a quick and dirty DirectoryIO class in io.py to recursively read a directory's file contents into a buffer --- daliuge-engine/dlg/io.py | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/daliuge-engine/dlg/io.py b/daliuge-engine/dlg/io.py index 2b8f91c8f..3b2a629b9 100644 --- a/daliuge-engine/dlg/io.py +++ b/daliuge-engine/dlg/io.py @@ -246,6 +246,61 @@ def delete(self): os.unlink(self._fnm) +class DirectoryIO(DataIO): + """ + Implements a recursive walk of a directory structure as a drop. + This is not a production-ready approach + To be used sparingly where operations on what is logically a file, but practically a directory are needed + + Opening traverses the directory and sub-directory structure storing the roots, dirs and files in an internal + representation. Serializing the entire contents to a + + Reading will progress `count` bytes through the next file. The output of reading until null will be a single byte- + stream of all discovered files in their depth-first ordering. This is very basic but should be exhaustive + + Closing will delete all the internal structure. + + Writing will not be supported + """ + + def __init__(self, dirname, **kwargs): + from six import BytesIO + super(DirectoryIO, self).__init__() + self._dir = dirname + self._contents = [] + self._data = BytesIO() + + def _open(self, **kwargs): + for (root, dirs, files) in os.walk(self._dir, topdown=True): + self._contents.append((root, dirs, files)) + for file in files: + try: + open(file) + self._data.write(file.read()) + except FileNotFoundError: + logger.error("File %s not found", file) + + def _read(self, count=4096, **kwargs): + return self._data.read(count) + + def _write(self, data, **kwargs): + return NotImplementedError("Do not write to a directory, use a container or file.") + + def _close(self, **kwargs): + self._contents = [] + self._data = BytesIO() + + def getDirName(self): + return self._dir + + def exists(self): + return os.path.isdir(self._dir) + + def delete(self): + from shutil import rmtree + rmtree(self._dir) + + class NgasIO(DataIO): ''' A DROP whose data is finally stored into NGAS. Since NGAS doesn't From fd3e4c93814f359399094d5dbe636578bf04d008 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 22 Jun 2021 10:25:34 +0800 Subject: [PATCH 204/484] If a file is in fact a directory, use a DirectoryIO object --- daliuge-engine/dlg/drop.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/daliuge-engine/dlg/drop.py b/daliuge-engine/dlg/drop.py index 09d59ad84..f2750dd43 100644 --- a/daliuge-engine/dlg/drop.py +++ b/daliuge-engine/dlg/drop.py @@ -51,7 +51,7 @@ DROPLinkType, DROPPhases, DROPStates, DROPRel from .event import EventFirer from .exceptions import InvalidDropException, InvalidRelationshipException -from .io import OpenMode, FileIO, MemoryIO, NgasIO, NgasLiteIO, ErrorIO, NullIO, PlasmaIO +from .io import OpenMode, FileIO, MemoryIO, NgasIO, NgasLiteIO, ErrorIO, NullIO, PlasmaIO, DirectoryIO from .meta import dlg_float_param, dlg_int_param, dlg_list_param, \ dlg_string_param, dlg_bool_param, dlg_dict_param from .utils import prepare_sql, createDirIfMissing, isabs, object_tracking @@ -1286,6 +1286,8 @@ def initialize(self, **kwargs): self._wio = None def getIO(self): + if os.path.isdir(self._path): + return DirectoryIO(self._path) return FileIO(self._path) def delete(self): From fab3ba751867e4f69697b4c0eda2d36199df97d4 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 28 Jun 2021 16:04:17 +0800 Subject: [PATCH 205/484] Fixes faulty treatment of group nodes in reproducibility.py --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index ba7ed4733..5b8fb90a1 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -102,7 +102,8 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): elif category == Categories.NULL: pass elif category_type == 'Group': - data['exitAppName'] = drop['exitAppName'] + data['inputApplicationName'] = drop['inputApplicationName'] + data['inputApplicationType'] = drop['inputApplicationType'] if category == Categories.GROUP_BY: data['group_key'] = fields['group_key'] data['group_axis'] = fields['group_axis'] From bec5f23db8cf3b70a933c4776fb82f11c8ad2433 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 28 Jun 2021 16:05:18 +0800 Subject: [PATCH 206/484] convert_contruct now appends LGT group reprodata to input applications in dm_utils.py --- daliuge-translator/dlg/dropmake/dm_utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/daliuge-translator/dlg/dropmake/dm_utils.py b/daliuge-translator/dlg/dropmake/dm_utils.py index f2b749ff8..d7a4d4943 100644 --- a/daliuge-translator/dlg/dropmake/dm_utils.py +++ b/daliuge-translator/dlg/dropmake/dm_utils.py @@ -420,6 +420,9 @@ def convert_construct(lgo): app_node["category"] = node[has_app] # node['application'] app_node["text"] = node["text"] + # Adding Reprodaya + app_node['reprodata'] = node['reprodata'].copy() + if 'mkn' in node: app_node['mkn'] = node['mkn'] From 850a42a9d481ee6761a3c6a087b8f6e6fbcac202 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 28 Jun 2021 16:55:35 +0800 Subject: [PATCH 207/484] building the blockdag when rerunning now only includes nodes from the original logical graph --- .../dlg/common/reproducibility/reproducibility.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 5b8fb90a1..fba75f47a 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -467,8 +467,8 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): while q: did = q.pop() block_builder(dropset[did][0]) - visited += 1 rmode = int(dropset[did][0]['reprodata']['rmode']) + visited += 1 for n in neighbourset[did]: dropset[n][1] -= 1 parenthash = {} @@ -485,8 +485,9 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): parenthash.update(dropset[did][0]['reprodata'][parentstr]) if rmode != ReproducibilityFlags.REPRODUCE.value: parenthash[did] = dropset[did][0]['reprodata'][blockstr + "_blockhash"] - # Add our new hash to the parest-hash list - dropset[n][0]['reprodata'][parentstr].update(parenthash) + # Add our new hash to the parent-hash list if on the critical path + if rmode != ReproducibilityFlags.RERUN.value and dropset[did][0]['iid'] == '0/0': + dropset[n][0]['reprodata'][parentstr].update(parenthash) if dropset[n][1] == 0: q.append(n) From aea3fa359cf7feae7a5bc07b8c5d9052767b311c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 13 Jul 2021 11:19:46 +0800 Subject: [PATCH 208/484] Adds icrar accelerate cli leap_drops into daliuge for simpler calling. --- .../dlg/common/leap_drops/CallLeap.py | 90 ++++++++++++ .../dlg/common/leap_drops/LeapGather.py | 54 ++++++++ .../dlg/common/leap_drops/ProduceConfig.py | 131 ++++++++++++++++++ .../dlg/common/leap_drops/README.md | 30 ++++ .../dlg/common/leap_drops/__init__.py | 0 .../dlg/common/leap_drops/directions.csv | 9 ++ 6 files changed, 314 insertions(+) create mode 100644 daliuge-common/dlg/common/leap_drops/CallLeap.py create mode 100644 daliuge-common/dlg/common/leap_drops/LeapGather.py create mode 100644 daliuge-common/dlg/common/leap_drops/ProduceConfig.py create mode 100644 daliuge-common/dlg/common/leap_drops/README.md create mode 100644 daliuge-common/dlg/common/leap_drops/__init__.py create mode 100644 daliuge-common/dlg/common/leap_drops/directions.csv diff --git a/daliuge-common/dlg/common/leap_drops/CallLeap.py b/daliuge-common/dlg/common/leap_drops/CallLeap.py new file mode 100644 index 000000000..d77067f75 --- /dev/null +++ b/daliuge-common/dlg/common/leap_drops/CallLeap.py @@ -0,0 +1,90 @@ +import json +import os +import random +import subprocess +import time + +from dlg.drop import BarrierAppDROP +from dlg.droputils import DROPFile +from dlg.meta import dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input + + +## Call Leap +# @brief Call Leap +# @details A BarrierAppDrop that reads a config file, generates a command line for the LeapAccelerateCLI application, and then executes the application +# @par EAGLE_START +# @param gitrepo $(GIT_REPO) +# @param version $(PROJECT_VERSION) +# @param category PythonApp +# @param[in] param/measurementSetFilename/Measurement Set Filename/""/String/readwrite +# \~English The file from which the input measurement set should be loaded\n +# \~Chinese \n +# \~ +# @param[in] param/appclass/Application Class/leap_nodes.CallLeap.CallLeap/String/readonly +# \~English The path to the class that implements this app\n +# \~Chinese \n +# \~ +# @param[in] port/Config +# \~English The Config file containing JSON specifying how this instance of LeapAccelerateCLI should be run +# \~Chinese \n +# \~ +# @param[out] port/Result +# \~English The output of the LeapAccelerateCLI application (JSON) +# \~Chinese \n +# \~ +# @par EAGLE_END + +class CallLeap(BarrierAppDROP): + """A BarrierAppDrop that reads a config file, generates a command line for the LeapAccelerateCLI application, and then executes the application""" + compontent_meta = dlg_component('Call Leap', 'Call Leap.', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + # TODO: this measurementSetFilename is not being read by dlg_string_param + # hard-coding it for the moment + measurementSetFilename = "/Users/james/working/leap-accelerate/testdata/1197638568-split.ms" + + DEBUG = True + + + def initialize(self, **kwargs): + super(CallLeap, self).initialize(**kwargs) + + + def run(self): + # check number of inputs and outputs + if len(self.outputs) != 1: + raise Exception("One output is expected by this application") + if len(self.inputs) != 1: + raise Exception("One input is expected by this application") + + # check that measurement set DIRECTORY exists + if not os.path.isdir(self.measurementSetFilename): + raise Exception("Could not find measurement set directory:" + self.measurementSetFilename) + + # read config from input + config = self._readConfig(self.inputs[0]) + + # build command line + commandLine = [ + 'LeapAccelerateCLI', + '-f', self.measurementSetFilename, + '-s', str(config['numStations']), + '-d', str(config['directions']), + '-a', str(config['autoCorrelation']) + ] + + if self.DEBUG: + time.sleep(random.uniform(5,10)) + self.outputs[0].write(json.dumps(commandLine)) + else: + # call leap + result = subprocess.run(commandLine, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.outputs[0].write(result.stdout) + + + def _readConfig(self, inDrop): + with DROPFile(inDrop) as f: + config = json.load(f) + return config diff --git a/daliuge-common/dlg/common/leap_drops/LeapGather.py b/daliuge-common/dlg/common/leap_drops/LeapGather.py new file mode 100644 index 000000000..df319c6f8 --- /dev/null +++ b/daliuge-common/dlg/common/leap_drops/LeapGather.py @@ -0,0 +1,54 @@ +import json + +from dlg.drop import BarrierAppDROP +from dlg.droputils import DROPFile +from dlg.meta import dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input + + +## Leap Gather +# @brief Leap Gather +# @details A BarrierAppDrop that gathers output from multiple instances of the LeapAccelerateCLI application, sorts it, and outputs it +# @par EAGLE_START +# @param gitrepo $(GIT_REPO) +# @param version $(PROJECT_VERSION) +# @param category PythonApp +# @param[in] param/appclass/Application Class/leap_nodes.LeapGather.LeapGather/String/readonly +# \~English The path to the class that implements this app\n +# \~Chinese \n +# \~ +# @param[in] port/Result +# \~English The JSON output from an instance of LeapAccelerateCLI +# \~Chinese \n +# \~ +# @param[out] port/Result +# \~English The combined output from many instances the LeapAccelerateCLI application (JSON) +# \~Chinese \n +# \~ +# @par EAGLE_END + +class LeapGather(BarrierAppDROP): + """A BarrierAppDrop that gathers output from multiple instances of the LeapAccelerateCLI application, sorts it, and outputs it""" + compontent_meta = dlg_component('Leap Gather', 'Leap Gather.', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + + def initialize(self, **kwargs): + super(LeapGather, self).initialize(**kwargs) + + + def run(self): + # check number of outputs + if len(self.outputs) != 1: + raise Exception("One output is expected by this application") + + # read from all inputs + inputs = [] + for i in range(len(self.inputs)): + with DROPFile(self.inputs[i]) as f: + file_data = f.read() + inputs.append(json.loads(file_data)) + + # write to output + self.outputs[0].write(json.dumps(inputs)) diff --git a/daliuge-common/dlg/common/leap_drops/ProduceConfig.py b/daliuge-common/dlg/common/leap_drops/ProduceConfig.py new file mode 100644 index 000000000..3ad2fdf77 --- /dev/null +++ b/daliuge-common/dlg/common/leap_drops/ProduceConfig.py @@ -0,0 +1,131 @@ +import csv +import json +import math + +from dlg.drop import BarrierAppDROP +from dlg.droputils import DROPFile +from dlg.meta import dlg_string_param, \ + dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input + + +## Produce Config +# @brief Produce Config +# @details A BarrierAppDrop that produces multiple config files suitable for the CallLeap BarrierAppDrop +# @par EAGLE_START +# @param gitrepo $(GIT_REPO) +# @param version $(PROJECT_VERSION) +# @param category PythonApp +# @param[in] param/filePath/filePath//String/readwrite +# \~English Path to the MS\n +# \~Chinese \n +# \~ +# @param[in] param/outputFilePath/outputFilePath//String/readwrite +# \~English Path for output file\n +# \~Chinese \n +# \~ +# @param[in] param/implementation/Implementation/cpu/String/readwrite +# \~English The implementation of the LEAP algorithm to use (cpu, cuda)\n +# \~Chinese \n +# \~ +# @param[in] param/verbosity/verbosity/info/String/readwrite +# \~English The verbosity of the LEAP logging output (info|debug)\n +# \~Chinese \n +# \~ +# @param[in] param/appclass/Application Class/leap_nodes.ProduceConfig.ProduceConfig/String/readonly +# \~English The path to the class that implements this app\n +# \~Chinese \n +# \~ +# @param[in] port/Directions +# \~English A CSV file containing directions for calibration +# \~Chinese \n +# \~ +# @param[out] port/Config +# \~English A JSON config containing the specification for running an instance of LeapAccelerateCLI +# \~Chinese \n +# \~ +# @par EAGLE_END + +class ProduceConfig(BarrierAppDROP): + """A BarrierAppDrop that produces multiple config files suitable for the CallLeap BarrierAppDrop""" + compontent_meta = dlg_component('ProduceConfig', 'Produce Config.', + [dlg_batch_input('binary/*', [])], + [dlg_batch_output('binary/*', [])], + [dlg_streaming_input('binary/*')]) + + # read component parameters + filePath = dlg_string_param('filePath', '') + outputFilePath = dlg_string_param('outputFilePath', '') + implementation = dlg_string_param('implementation', 'cpu') + verbosity = dlg_string_param('verbosity', 'info') + + + def initialize(self, **kwargs): + super(ProduceConfig, self).initialize(**kwargs) + + + def run(self): + # check number of inputs and outputs + if len(self.inputs) != 1: + raise Exception("One input is expected by this application") + + # read directions from input 0 + directions = self._readDirections(self.inputs[0]) + + # determine number of directions per instance + numDirectionsPerInstance = float(len(directions)) / float(len(self.outputs)) + + startDirectionIndex = 0 + endDirectionIndex = 0 + + # split directions + for i in range(len(self.outputs)): + endDirectionIndex = int(math.floor((i+1)*numDirectionsPerInstance)) + + # split directions + partDirections = directions[startDirectionIndex:endDirectionIndex] + + # build config + configJSON = self._createConfig(partDirections) + + # stringify config + config = json.dumps(configJSON) + + # write config to output + self.outputs[i].write(config.encode()) + + # continue from here in the next iteration + startDirectionIndex = endDirectionIndex + + + def _readDirections(self, inDrop): + directions = [] + + # NOTE: it appears csv.reader() can't use the DROPFile(inDrop) directly, + # since DROPFile is not a iterator. Instead, we read the whole + # inDrop to a string and pass that to csv.reader() + with DROPFile(inDrop) as f: + file_data = f.read() + if type(file_data) == type(b''): + file_data = file_data.decode() + csvreader = csv.reader(file_data.split('\n')) + for row in csvreader: + # skip rows with incorrect number of values + if len(row) != 2: + continue + + x = float(row[0]) + y = float(row[1]) + directions.append([x,y]) + + return directions + + + def _createConfig(self, directions): + return { + 'filePath': self.filePath, + 'outputFilePath': self.outputFilePath, + 'directions': directions, + 'computeImplementation': self.implementation, + 'verbosity': self.verbosity + } + diff --git a/daliuge-common/dlg/common/leap_drops/README.md b/daliuge-common/dlg/common/leap_drops/README.md new file mode 100644 index 000000000..9220c8c8e --- /dev/null +++ b/daliuge-common/dlg/common/leap_drops/README.md @@ -0,0 +1,30 @@ +# Leap Drops + +This directory contains a number of Python classes that expose LEAP functionality to the DALiuGE workflow execution environment. The classes extend the DALiuGE BarrierDropApp class, making them executable as PythonApp drops within the DALiuGE system. + +The classes contain custom Doxygen comments that describe the interface to these components through DALiuGE ports and parameters. When changes to the source are pushed to this repository, a Travis CI step generates Doxygen XML for these classes and transforms the XML into an DALiuGE/EAGLE palette file. The palette file can be opened in the EAGLE editor to provide ready-made components for use in DALiuGE workflows. + +## ProduceConfig + +* Intended for use in a DALiuGE Scatter component +* Loads a CSV file containing directions +* Splits the directions into N groups, where N is the multiplicity of the DALiuGE scatter component +* Produces a JSON config file for each group + +## CallLeap + +* Loads a JSON config file +* Builds a command line based on the contents of the config file +* Executes LeapAccelerateCLI (or if DEBUG==True, calls Sleep for a short random time) +* Collects the output from LeapAccelerateCLI and writes it to the single output DALiuGE port + +## LeapGather + +* Intended for use in a DALiuGE Gather component +* Loads the JSON from N instances of CallLeap, where N is the multiplicity of the DALiuGE gather component +* Trivially combines the JSON into a single JSON object +* Sends the combined JSON to the single output DALiuGE port + +## Links +* [DALiuGE Application Development](https://daliuge.readthedocs.io/en/latest/writing_an_application.html) +* [EAGLE](http://eagle.icrar.org) diff --git a/daliuge-common/dlg/common/leap_drops/__init__.py b/daliuge-common/dlg/common/leap_drops/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/daliuge-common/dlg/common/leap_drops/directions.csv b/daliuge-common/dlg/common/leap_drops/directions.csv new file mode 100644 index 000000000..48e99a554 --- /dev/null +++ b/daliuge-common/dlg/common/leap_drops/directions.csv @@ -0,0 +1,9 @@ +-0.4606549305661674,-0.29719233792392513 +-0.753231018062671,-0.44387635324622354 +-0.6207547100721282,-0.2539086572881469 +-0.41958660604621867,-0.03677626900108552 +-0.41108685258900596,-0.08638012622791202 +-0.7782459495668798,-0.4887860989684432 +-0.17001324965728973,-0.28595644149463484 +-0.7129444556035118,-0.365286407171852 +-0.1512764129166089,-0.21161026349648748 From 5a7e38590eee5b706c86917eccd65118785818fe Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Tue, 13 Jul 2021 11:53:50 +0800 Subject: [PATCH 209/484] Adds conditional checking for scatter and gather fields existing. Consider adding better support for fields later on. --- .../dlg/common/reproducibility/reproducibility.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index fba75f47a..fef34361a 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -109,10 +109,12 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): data['group_axis'] = fields['group_axis'] elif category == Categories.GATHER: data['num_of_inputs'] = fields['num_of_inputs'] - data['gather_axis'] = fields['gather_axis'] + if 'gather_axis' in fields.keys(): + data['gather_axis'] = fields['gather_axis'] elif category == Categories.SCATTER: data['num_of_copies'] = fields['num_of_copies'] - data['scatter_axis'] = fields['scatter_axis'] + if 'scatter_axis' in fields.keys(): + data['scatter_axis'] = fields['scatter_axis'] elif category == Categories.LOOP: data['num_of_iter'] = fields['num_of_iter'] elif category_type == 'Control': From 86c3becca0d316d1485884969918b269fe206b17 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 19 Jul 2021 12:33:50 +0800 Subject: [PATCH 210/484] Moves leap drops from daliuge fork to windlass --- .../dlg/common/leap_drops/CallLeap.py | 90 ------------ .../dlg/common/leap_drops/LeapGather.py | 54 -------- .../dlg/common/leap_drops/ProduceConfig.py | 131 ------------------ .../dlg/common/leap_drops/README.md | 30 ---- .../dlg/common/leap_drops/__init__.py | 0 .../dlg/common/leap_drops/directions.csv | 9 -- 6 files changed, 314 deletions(-) delete mode 100644 daliuge-common/dlg/common/leap_drops/CallLeap.py delete mode 100644 daliuge-common/dlg/common/leap_drops/LeapGather.py delete mode 100644 daliuge-common/dlg/common/leap_drops/ProduceConfig.py delete mode 100644 daliuge-common/dlg/common/leap_drops/README.md delete mode 100644 daliuge-common/dlg/common/leap_drops/__init__.py delete mode 100644 daliuge-common/dlg/common/leap_drops/directions.csv diff --git a/daliuge-common/dlg/common/leap_drops/CallLeap.py b/daliuge-common/dlg/common/leap_drops/CallLeap.py deleted file mode 100644 index d77067f75..000000000 --- a/daliuge-common/dlg/common/leap_drops/CallLeap.py +++ /dev/null @@ -1,90 +0,0 @@ -import json -import os -import random -import subprocess -import time - -from dlg.drop import BarrierAppDROP -from dlg.droputils import DROPFile -from dlg.meta import dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input - - -## Call Leap -# @brief Call Leap -# @details A BarrierAppDrop that reads a config file, generates a command line for the LeapAccelerateCLI application, and then executes the application -# @par EAGLE_START -# @param gitrepo $(GIT_REPO) -# @param version $(PROJECT_VERSION) -# @param category PythonApp -# @param[in] param/measurementSetFilename/Measurement Set Filename/""/String/readwrite -# \~English The file from which the input measurement set should be loaded\n -# \~Chinese \n -# \~ -# @param[in] param/appclass/Application Class/leap_nodes.CallLeap.CallLeap/String/readonly -# \~English The path to the class that implements this app\n -# \~Chinese \n -# \~ -# @param[in] port/Config -# \~English The Config file containing JSON specifying how this instance of LeapAccelerateCLI should be run -# \~Chinese \n -# \~ -# @param[out] port/Result -# \~English The output of the LeapAccelerateCLI application (JSON) -# \~Chinese \n -# \~ -# @par EAGLE_END - -class CallLeap(BarrierAppDROP): - """A BarrierAppDrop that reads a config file, generates a command line for the LeapAccelerateCLI application, and then executes the application""" - compontent_meta = dlg_component('Call Leap', 'Call Leap.', - [dlg_batch_input('binary/*', [])], - [dlg_batch_output('binary/*', [])], - [dlg_streaming_input('binary/*')]) - - # TODO: this measurementSetFilename is not being read by dlg_string_param - # hard-coding it for the moment - measurementSetFilename = "/Users/james/working/leap-accelerate/testdata/1197638568-split.ms" - - DEBUG = True - - - def initialize(self, **kwargs): - super(CallLeap, self).initialize(**kwargs) - - - def run(self): - # check number of inputs and outputs - if len(self.outputs) != 1: - raise Exception("One output is expected by this application") - if len(self.inputs) != 1: - raise Exception("One input is expected by this application") - - # check that measurement set DIRECTORY exists - if not os.path.isdir(self.measurementSetFilename): - raise Exception("Could not find measurement set directory:" + self.measurementSetFilename) - - # read config from input - config = self._readConfig(self.inputs[0]) - - # build command line - commandLine = [ - 'LeapAccelerateCLI', - '-f', self.measurementSetFilename, - '-s', str(config['numStations']), - '-d', str(config['directions']), - '-a', str(config['autoCorrelation']) - ] - - if self.DEBUG: - time.sleep(random.uniform(5,10)) - self.outputs[0].write(json.dumps(commandLine)) - else: - # call leap - result = subprocess.run(commandLine, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - self.outputs[0].write(result.stdout) - - - def _readConfig(self, inDrop): - with DROPFile(inDrop) as f: - config = json.load(f) - return config diff --git a/daliuge-common/dlg/common/leap_drops/LeapGather.py b/daliuge-common/dlg/common/leap_drops/LeapGather.py deleted file mode 100644 index df319c6f8..000000000 --- a/daliuge-common/dlg/common/leap_drops/LeapGather.py +++ /dev/null @@ -1,54 +0,0 @@ -import json - -from dlg.drop import BarrierAppDROP -from dlg.droputils import DROPFile -from dlg.meta import dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input - - -## Leap Gather -# @brief Leap Gather -# @details A BarrierAppDrop that gathers output from multiple instances of the LeapAccelerateCLI application, sorts it, and outputs it -# @par EAGLE_START -# @param gitrepo $(GIT_REPO) -# @param version $(PROJECT_VERSION) -# @param category PythonApp -# @param[in] param/appclass/Application Class/leap_nodes.LeapGather.LeapGather/String/readonly -# \~English The path to the class that implements this app\n -# \~Chinese \n -# \~ -# @param[in] port/Result -# \~English The JSON output from an instance of LeapAccelerateCLI -# \~Chinese \n -# \~ -# @param[out] port/Result -# \~English The combined output from many instances the LeapAccelerateCLI application (JSON) -# \~Chinese \n -# \~ -# @par EAGLE_END - -class LeapGather(BarrierAppDROP): - """A BarrierAppDrop that gathers output from multiple instances of the LeapAccelerateCLI application, sorts it, and outputs it""" - compontent_meta = dlg_component('Leap Gather', 'Leap Gather.', - [dlg_batch_input('binary/*', [])], - [dlg_batch_output('binary/*', [])], - [dlg_streaming_input('binary/*')]) - - - def initialize(self, **kwargs): - super(LeapGather, self).initialize(**kwargs) - - - def run(self): - # check number of outputs - if len(self.outputs) != 1: - raise Exception("One output is expected by this application") - - # read from all inputs - inputs = [] - for i in range(len(self.inputs)): - with DROPFile(self.inputs[i]) as f: - file_data = f.read() - inputs.append(json.loads(file_data)) - - # write to output - self.outputs[0].write(json.dumps(inputs)) diff --git a/daliuge-common/dlg/common/leap_drops/ProduceConfig.py b/daliuge-common/dlg/common/leap_drops/ProduceConfig.py deleted file mode 100644 index 3ad2fdf77..000000000 --- a/daliuge-common/dlg/common/leap_drops/ProduceConfig.py +++ /dev/null @@ -1,131 +0,0 @@ -import csv -import json -import math - -from dlg.drop import BarrierAppDROP -from dlg.droputils import DROPFile -from dlg.meta import dlg_string_param, \ - dlg_component, dlg_batch_input, dlg_batch_output, dlg_streaming_input - - -## Produce Config -# @brief Produce Config -# @details A BarrierAppDrop that produces multiple config files suitable for the CallLeap BarrierAppDrop -# @par EAGLE_START -# @param gitrepo $(GIT_REPO) -# @param version $(PROJECT_VERSION) -# @param category PythonApp -# @param[in] param/filePath/filePath//String/readwrite -# \~English Path to the MS\n -# \~Chinese \n -# \~ -# @param[in] param/outputFilePath/outputFilePath//String/readwrite -# \~English Path for output file\n -# \~Chinese \n -# \~ -# @param[in] param/implementation/Implementation/cpu/String/readwrite -# \~English The implementation of the LEAP algorithm to use (cpu, cuda)\n -# \~Chinese \n -# \~ -# @param[in] param/verbosity/verbosity/info/String/readwrite -# \~English The verbosity of the LEAP logging output (info|debug)\n -# \~Chinese \n -# \~ -# @param[in] param/appclass/Application Class/leap_nodes.ProduceConfig.ProduceConfig/String/readonly -# \~English The path to the class that implements this app\n -# \~Chinese \n -# \~ -# @param[in] port/Directions -# \~English A CSV file containing directions for calibration -# \~Chinese \n -# \~ -# @param[out] port/Config -# \~English A JSON config containing the specification for running an instance of LeapAccelerateCLI -# \~Chinese \n -# \~ -# @par EAGLE_END - -class ProduceConfig(BarrierAppDROP): - """A BarrierAppDrop that produces multiple config files suitable for the CallLeap BarrierAppDrop""" - compontent_meta = dlg_component('ProduceConfig', 'Produce Config.', - [dlg_batch_input('binary/*', [])], - [dlg_batch_output('binary/*', [])], - [dlg_streaming_input('binary/*')]) - - # read component parameters - filePath = dlg_string_param('filePath', '') - outputFilePath = dlg_string_param('outputFilePath', '') - implementation = dlg_string_param('implementation', 'cpu') - verbosity = dlg_string_param('verbosity', 'info') - - - def initialize(self, **kwargs): - super(ProduceConfig, self).initialize(**kwargs) - - - def run(self): - # check number of inputs and outputs - if len(self.inputs) != 1: - raise Exception("One input is expected by this application") - - # read directions from input 0 - directions = self._readDirections(self.inputs[0]) - - # determine number of directions per instance - numDirectionsPerInstance = float(len(directions)) / float(len(self.outputs)) - - startDirectionIndex = 0 - endDirectionIndex = 0 - - # split directions - for i in range(len(self.outputs)): - endDirectionIndex = int(math.floor((i+1)*numDirectionsPerInstance)) - - # split directions - partDirections = directions[startDirectionIndex:endDirectionIndex] - - # build config - configJSON = self._createConfig(partDirections) - - # stringify config - config = json.dumps(configJSON) - - # write config to output - self.outputs[i].write(config.encode()) - - # continue from here in the next iteration - startDirectionIndex = endDirectionIndex - - - def _readDirections(self, inDrop): - directions = [] - - # NOTE: it appears csv.reader() can't use the DROPFile(inDrop) directly, - # since DROPFile is not a iterator. Instead, we read the whole - # inDrop to a string and pass that to csv.reader() - with DROPFile(inDrop) as f: - file_data = f.read() - if type(file_data) == type(b''): - file_data = file_data.decode() - csvreader = csv.reader(file_data.split('\n')) - for row in csvreader: - # skip rows with incorrect number of values - if len(row) != 2: - continue - - x = float(row[0]) - y = float(row[1]) - directions.append([x,y]) - - return directions - - - def _createConfig(self, directions): - return { - 'filePath': self.filePath, - 'outputFilePath': self.outputFilePath, - 'directions': directions, - 'computeImplementation': self.implementation, - 'verbosity': self.verbosity - } - diff --git a/daliuge-common/dlg/common/leap_drops/README.md b/daliuge-common/dlg/common/leap_drops/README.md deleted file mode 100644 index 9220c8c8e..000000000 --- a/daliuge-common/dlg/common/leap_drops/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# Leap Drops - -This directory contains a number of Python classes that expose LEAP functionality to the DALiuGE workflow execution environment. The classes extend the DALiuGE BarrierDropApp class, making them executable as PythonApp drops within the DALiuGE system. - -The classes contain custom Doxygen comments that describe the interface to these components through DALiuGE ports and parameters. When changes to the source are pushed to this repository, a Travis CI step generates Doxygen XML for these classes and transforms the XML into an DALiuGE/EAGLE palette file. The palette file can be opened in the EAGLE editor to provide ready-made components for use in DALiuGE workflows. - -## ProduceConfig - -* Intended for use in a DALiuGE Scatter component -* Loads a CSV file containing directions -* Splits the directions into N groups, where N is the multiplicity of the DALiuGE scatter component -* Produces a JSON config file for each group - -## CallLeap - -* Loads a JSON config file -* Builds a command line based on the contents of the config file -* Executes LeapAccelerateCLI (or if DEBUG==True, calls Sleep for a short random time) -* Collects the output from LeapAccelerateCLI and writes it to the single output DALiuGE port - -## LeapGather - -* Intended for use in a DALiuGE Gather component -* Loads the JSON from N instances of CallLeap, where N is the multiplicity of the DALiuGE gather component -* Trivially combines the JSON into a single JSON object -* Sends the combined JSON to the single output DALiuGE port - -## Links -* [DALiuGE Application Development](https://daliuge.readthedocs.io/en/latest/writing_an_application.html) -* [EAGLE](http://eagle.icrar.org) diff --git a/daliuge-common/dlg/common/leap_drops/__init__.py b/daliuge-common/dlg/common/leap_drops/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/daliuge-common/dlg/common/leap_drops/directions.csv b/daliuge-common/dlg/common/leap_drops/directions.csv deleted file mode 100644 index 48e99a554..000000000 --- a/daliuge-common/dlg/common/leap_drops/directions.csv +++ /dev/null @@ -1,9 +0,0 @@ --0.4606549305661674,-0.29719233792392513 --0.753231018062671,-0.44387635324622354 --0.6207547100721282,-0.2539086572881469 --0.41958660604621867,-0.03677626900108552 --0.41108685258900596,-0.08638012622791202 --0.7782459495668798,-0.4887860989684432 --0.17001324965728973,-0.28595644149463484 --0.7129444556035118,-0.365286407171852 --0.1512764129166089,-0.21161026349648748 From edd3086f4e8426373a3480ed32247618becaca12 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 19 Jul 2021 14:29:00 +0800 Subject: [PATCH 211/484] Style adjustments by pylint for reproducibility.py --- .../common/reproducibility/reproducibility.py | 136 ++++++++++++------ 1 file changed, 90 insertions(+), 46 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index fef34361a..081dda619 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -1,15 +1,30 @@ +""" +This module handles the building of reproducibility information for worklfow components and graphs +at all stages of unrolling and execution. + +Functions are organized top-to-bottom as per-drop to whole-graph operations. +Within each level of detail there are several functions to deal with different graph abstractions +arranged top-to-bottom as logical to physical to runtime. +""" +import collections import logging -from dlg.common.reproducibility.constants import ReproducibilityFlags, REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ +from dlg.common import Categories +from dlg.common.reproducibility.constants import ReproducibilityFlags, \ + REPRO_DEFAULT, PROTOCOL_VERSION, HASHING_ALG, \ rmode_supported, rflag_caster from merklelib import MerkleTree -from .. import Categories - logger = logging.getLogger(__name__) -def common_hash(value): # TODO: check type +def common_hash(value: bytes): + """ + Produces a hex digest of the `value` provided. + Assumes standard hashlib algorithm functionality. + :param value: Bytes to be hashed + :return: Hex-digest of the value + """ return HASHING_ALG(value).hexdigest() @@ -66,9 +81,8 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): raise NotImplementedError("Reproducibility level %s not yet supported" % level.name) if level == ReproducibilityFlags.RERUN: pass - elif level == ReproducibilityFlags.REPEAT or level == ReproducibilityFlags.REPLICATE_COMP \ - or level == ReproducibilityFlags.RECOMPUTE \ - or level == ReproducibilityFlags.REPLICATE_TOTAL: + elif level in (ReproducibilityFlags.REPEAT, ReproducibilityFlags.REPLICATE_COMP, + ReproducibilityFlags.RECOMPUTE, ReproducibilityFlags.REPLICATE_TOTAL): if category_type == 'Application': data['execution_time'] = fields['execution_time'] data['num_cpus'] = fields['num_cpus'] @@ -123,7 +137,7 @@ def accumulate_lg_drop_data(drop: dict, level: ReproducibilityFlags): pass elif level == ReproducibilityFlags.REPRODUCE: pass - if level == ReproducibilityFlags.RECOMPUTE or level == ReproducibilityFlags.REPLICATE_COMP: + if level in (ReproducibilityFlags.RECOMPUTE, ReproducibilityFlags.REPLICATE_COMP): if category_type == Categories.DATA: if category == Categories.FILE: data['filepath'] = fields['filepath'] @@ -156,8 +170,9 @@ def accumulate_pgt_unroll_drop_data(drop: dict): if data['type'] == 'plain': data['storage'] = drop['storage'] else: - data['dt'] = drop['dt'] # WARNING: Added to differentiate between subtle component differences. - if rmode == ReproducibilityFlags.RECOMPUTE or rmode == ReproducibilityFlags.REPLICATE_COMP: + data['dt'] = drop['dt'] + # WARNING: Added to differentiate between subtle component differences. + if rmode in (ReproducibilityFlags.RECOMPUTE, ReproducibilityFlags.REPLICATE_COMP): data['rank'] = drop['rank'] return data @@ -177,7 +192,7 @@ def accumulate_pgt_partition_drop_data(drop: dict): data = accumulate_pgt_unroll_drop_data(drop) # This is the only piece of new information added at the partition level # It is only pertinent to Repetition and Computational replication - if rmode == ReproducibilityFlags.REPLICATE_COMP or rmode == ReproducibilityFlags.RECOMPUTE: + if rmode in (ReproducibilityFlags.REPLICATE_COMP, ReproducibilityFlags.RECOMPUTE): data['node'] = drop['node'][1:] data['island'] = drop['island'][1:] return data @@ -195,7 +210,7 @@ def accumulate_pg_drop_data(drop: dict): rmode = REPRO_DEFAULT drop['reprodata']['rmode'] = str(rmode.value) data = {} - if rmode == ReproducibilityFlags.REPLICATE_COMP or rmode == ReproducibilityFlags.RECOMPUTE: + if rmode in (ReproducibilityFlags.REPLICATE_COMP, ReproducibilityFlags.RECOMPUTE): data['node'] = drop['node'] data['island'] = drop['island'] return data @@ -235,6 +250,12 @@ def init_lg_repro_drop_data(drop: dict): def append_pgt_repro_data(drop: dict, data: dict): + """ + Adds provided data dictionary to drop description at PGT level. + :param drop: The drop description + :param data: The data to be added - arbitrary dictionary + :return: + """ merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root # Separated so chaining can happen on independent elements (or both later) @@ -245,8 +266,9 @@ def append_pgt_repro_data(drop: dict, data: dict): def init_pgt_unroll_repro_drop_data(drop: dict): """ - Creates and appends per-drop reproducibility information at the physical graph template stage when unrolling. - :param drop: + Creates and appends per-drop reproducibility information + at the physical graph template stage when unrolling. + :param drop: The drop description :return: The same drop with appended reproducibility information """ data = accumulate_pgt_unroll_drop_data(drop) @@ -256,8 +278,9 @@ def init_pgt_unroll_repro_drop_data(drop: dict): def init_pgt_partition_repro_drop_data(drop: dict): """ - Creates and appends per-drop reproducibility information at the physical graph template stage when partitioning. - :param drop: + Creates and appends per-drop reproducibility information + at the physical graph template stage when partitioning. + :param drop: The drop description :return: The same drop with appended reproducibility information """ data = accumulate_pgt_partition_drop_data(drop) @@ -268,7 +291,7 @@ def init_pgt_partition_repro_drop_data(drop: dict): def init_pg_repro_drop_data(drop: dict): """ Creates and appends per-drop reproducibility information at the physical graph stage. - :param drop: + :param drop: The drop description :return: The same drop with appended reproducibility information """ data = accumulate_pg_drop_data(drop) @@ -301,6 +324,11 @@ def accumulate_meta_data(): def build_lg_block_data(drop: dict): + """ + Builds the logical graph reprodata entry for a processed drop description + :param drop: The drop description + :return: + """ block_data = [drop['reprodata']['lgt_data']['merkleroot']] if 'merkleroot' in drop['reprodata']['lg_data']: lg_hash = drop['reprodata']['lg_data']['merkleroot'] @@ -312,6 +340,11 @@ def build_lg_block_data(drop: dict): def build_pgt_block_data(drop: dict): + """ + Builds the physical graph template reprodata entry for a processed drop description + :param drop: The drop description + :return: + """ block_data = [drop['reprodata']['pgt_data']['merkleroot'], drop['reprodata']['lg_blockhash']] for parenthash in sorted(drop['reprodata']['pgt_parenthashes'].values()): block_data.append(parenthash) @@ -320,6 +353,11 @@ def build_pgt_block_data(drop: dict): def build_pg_block_data(drop: dict): + """ + Builds the physical graph reprodata entry for a processed drop description + :param drop: The drop description + :return: + """ block_data = [drop['reprodata']['pg_data']['merkleroot'], drop['reprodata']['pgt_blockhash'], drop['reprodata']['lg_blockhash']] @@ -330,6 +368,11 @@ def build_pg_block_data(drop: dict): def build_rg_block_data(drop: dict): + """ + Builds the runtime graph reprodata entry for a processed drop description. + :param drop: The drop description + :return: + """ block_data = [drop['reprodata']['rg_data']['merkleroot'], drop['reprodata']['pg_blockhash'], drop['reprodata']['pgt_blockhash'], @@ -340,27 +383,26 @@ def build_rg_block_data(drop: dict): drop['reprodata']['rg_blockhash'] = mtree.merkle_root -def lg_build_blockdag(lg: dict): +def lg_build_blockdag(logical_graph: dict): """ Uses Kahn's algorithm to topologically sort a logical graph dictionary. Exploits that a DAG contains at least one node with in-degree 0. Processes drops in-order. O(V + E) time complexity. - :param lg: - :return: + :param logical_graph: The logical graph description (template or actual) + :return: leaves set and the list of visited components (in order). """ - from collections import deque dropset = {} # Also contains in-degree information neighbourset = {} leaves = [] visited = [] - q = deque() - for drop in lg['nodeDataArray']: + queue = collections.deque() + for drop in logical_graph['nodeDataArray']: did = int(drop['key']) dropset[did] = [drop, 0, 0] neighbourset[did] = [] - for edge in lg['linkDataArray']: + for edge in logical_graph['linkDataArray']: src = int(edge['from']) dest = int(edge['to']) dropset[dest][1] += 1 @@ -370,18 +412,18 @@ def lg_build_blockdag(lg: dict): # did == 'drop id' for did in dropset: if dropset[did][1] == 0: - q.append(did) + queue.append(did) if not neighbourset[did]: # Leaf node leaves.append(did) - while q: - did = q.pop() + while queue: + did = queue.pop() # Process build_lg_block_data(dropset[did][0]) visited.append(did) rmode = rflag_caster(dropset[did][0]['reprodata']['rmode']).value - for n in neighbourset[did]: - dropset[n][1] -= 1 + for neighbour in neighbourset[did]: + dropset[neighbour][1] -= 1 parenthash = {} if rmode == ReproducibilityFlags.REPRODUCE.value: if dropset[did][0]['categoryType'] == Categories.DATA \ @@ -398,9 +440,10 @@ def lg_build_blockdag(lg: dict): parenthash[did] = dropset[did][0]['reprodata']['lg_blockhash'] # parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) # Add our new hash to the parent-hash list - dropset[n][0]['reprodata']['lg_parenthashes'].update(parenthash) # We deal with duplicates later - if dropset[n][1] == 0: # Add drops at the DAG-frontier - q.append(n) + # We deal with duplicates later + dropset[neighbour][0]['reprodata']['lg_parenthashes'].update(parenthash) + if dropset[neighbour][1] == 0: # Add drops at the DAG-frontier + queue.append(neighbour) if len(visited) != len(dropset): raise Exception("Untraversed graph") @@ -435,12 +478,11 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): parentstr = 'rg_parenthashes' block_builder = build_rg_block_data - from collections import deque dropset = {} neighbourset = {} leaves = [] visited = 0 - q = deque() + queue = collections.deque() for drop in drops: did = drop['oid'] @@ -449,7 +491,8 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): did = drop['oid'] neighbourset[did] = [] if 'outputs' in drop: - # Assumes the model where all edges are defined from source to destination. This may not always be the case. + # Assumes the model where all edges are defined from source to destination. + # This may not always be the case. for dest in drop['outputs']: dropset[dest][1] += 1 dropset[did][2] += 1 @@ -462,21 +505,21 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for did in dropset: if dropset[did][1] == 0: - q.append(did) + queue.append(did) if not neighbourset[did]: # Leaf node leaves.append(did) - while q: - did = q.pop() + while queue: + did = queue.pop() block_builder(dropset[did][0]) rmode = int(dropset[did][0]['reprodata']['rmode']) visited += 1 - for n in neighbourset[did]: - dropset[n][1] -= 1 + for neighbour in neighbourset[did]: + dropset[neighbour][1] -= 1 parenthash = {} if rmode == ReproducibilityFlags.REPRODUCE.value: - # TODO: Hack! may break later, proceed with caution - if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA\ + # WARNING: Hack! may break later, proceed with caution + if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA \ and (dropset[did][1] == 0 or dropset[did][2] == 0): # Add my new hash to the parent-hash list if did not in parenthash.keys(): @@ -489,9 +532,9 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): parenthash[did] = dropset[did][0]['reprodata'][blockstr + "_blockhash"] # Add our new hash to the parent-hash list if on the critical path if rmode != ReproducibilityFlags.RERUN.value and dropset[did][0]['iid'] == '0/0': - dropset[n][0]['reprodata'][parentstr].update(parenthash) - if dropset[n][1] == 0: - q.append(n) + dropset[neighbour][0]['reprodata'][parentstr].update(parenthash) + if dropset[neighbour][1] == 0: + queue.append(neighbour) if visited != len(dropset): raise Exception("Not a DAG") @@ -569,7 +612,8 @@ def init_pgt_unroll_repro_data(pgt: list): def init_pgt_partition_repro_data(pgt: list): """ - Handles adding reproducibility data at the physical graph template level after resource partitioning. + Handles adding reproducibility data at the physical graph template level + after resource partitioning. :param pgt: The physical graph template structure (a list of drops + reprodata dictionary) :return: The same pgt object with new information recorded """ From 53a0f0fa5bda768faa4f12caf99f0d28545c3b18 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 19 Jul 2021 14:53:02 +0800 Subject: [PATCH 212/484] Style adjustments by pylint for apps.py --- .../dlg/common/reproducibility/apps.py | 62 +++++++++++++++---- 1 file changed, 50 insertions(+), 12 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps.py b/daliuge-common/dlg/common/reproducibility/apps.py index 993993fe6..066f5ed5f 100644 --- a/daliuge-common/dlg/common/reproducibility/apps.py +++ b/daliuge-common/dlg/common/reproducibility/apps.py @@ -1,45 +1,83 @@ +""" +Contains several very basic apps to test python function reproducibility. +""" +import numpy as np + from dlg.apps.pyfunc import PyFuncApp -def writeIn(): +def write_in(): + """ + :return: "world" always + """ return "world" -def writeOut(s="everybody"): - return "Hello " + s +def write_out(phrase="everybody"): + """ + Appends s to "Hello " + :param phrase: The string to be appended + :return: "Hello " + s + """ + return "Hello " + phrase def numpy_av(nums): - import numpy as np + """ + Finds the mean of a list of numbers using numpy. + :param nums: The numbers to be averaged. + :return: The mean. + """ return np.asscalar(np.mean(nums)) def my_av(nums): + """ + Finds the mean of a list of numbers manually + :param nums: The numbers to be averaged + :return: The mean. + """ res = 0.0 - for x in nums: - res += x + for num in nums: + res += num return res / len(nums) class HelloWorldPythonIn(PyFuncApp): + """ + Wrapper app turning writeIn into a Python function app + """ + def initialize(self, **kwargs): - fname = 'dlg.common.reproducibility.apps.writeIn' - super(HelloWorldPythonIn, self).initialize(func_name=fname) + fname = 'dlg.common.reproducibility.apps.write_in' + super().initialize(func_name=fname) class HelloWorldPythonOut(PyFuncApp): + """ + Wrapper app turning writeOut into a Python function app + """ + def initialize(self, **kwargs): - fname = 'dlg.common.reproducibility.apps.writeOut' - super(HelloWorldPythonOut, self).initialize(func_name=fname) + fname = 'dlg.common.reproducibility.apps.write_out' + super().initialize(func_name=fname) class NumpyAverage(PyFuncApp): + """ + Wrapper app turning numpy_av into a Python function app + """ + def initialize(self, **kwargs): fname = 'dlg.common.reproducibility.apps.numpy_av' - super(NumpyAverage, self).initialize(func_name=fname) + super().initialize(func_name=fname) class MyAverage(PyFuncApp): + """ + Wrapper app turning my_av into a Python function app + """ + def initialize(self, **kwargs): fname = 'dlg.common.reproducibility.apps.my_av' - super(MyAverage, self).initialize(func_name=fname) + super().initialize(func_name=fname) From b0a4bb4104922184d87d57a2a406c68e7d69c506 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 19 Jul 2021 15:08:13 +0800 Subject: [PATCH 213/484] Style adjustments by pylint for constants.py --- .../dlg/common/reproducibility/constants.py | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/constants.py b/daliuge-common/dlg/common/reproducibility/constants.py index 49272bba3..6b1be3685 100644 --- a/daliuge-common/dlg/common/reproducibility/constants.py +++ b/daliuge-common/dlg/common/reproducibility/constants.py @@ -1,3 +1,7 @@ +""" +Defines constant values for reproduciblity DAG construction and associated utility functions. +""" + import hashlib import platform import sys @@ -7,7 +11,7 @@ import psutil from merklelib import MerkleTree -PROTOCOL_VERSION = 0.1 +PROTOCOL_VERSION = 0.1 # TODO: Update upon release class ReproducibilityFlags(Enum): @@ -34,24 +38,25 @@ def rflag_caster(val, default=REPRO_DEFAULT): """ Function to safely cast strings and ints to their appropriate ReproducibilityFlag E.g. rflag_caster(1) -> ReproducibilityFlag.RERUN - E.g. rlag_caster("3") -> ReproducibilityFlag.REPRODUCE + E.g. rlag_caster("4") -> ReproducibilityFlag.RECOMPUTE E.g. rflag_caster("two") -> REPRO_DEFAULT :param val: The passed value (either int or str) :param default: The default value to be returned upon failure :return: Appropriate ReproducibilityFlag """ - if type(val) == str: + if isinstance(val, str): try: return ReproducibilityFlags(int(val)) except(ValueError, TypeError): return default - elif type(val) == int: + elif isinstance(val, int): try: return ReproducibilityFlags(val) except(ValueError, TypeError): return default - elif type(val) is None: + elif val is None: return default + return default def rmode_supported(flag: ReproducibilityFlags): @@ -63,20 +68,19 @@ def rmode_supported(flag: ReproducibilityFlags): :param flag: A ReproducibilityFlag enum being queried :return: True if supported, False otherwise """ - if type(flag) != ReproducibilityFlags: + if not isinstance(flag, ReproducibilityFlags): raise TypeError("Need to be working with a ReproducibilityFlag enum") - if flag == ReproducibilityFlags.NOTHING \ - or flag == ReproducibilityFlags.RERUN \ - or flag == ReproducibilityFlags.REPEAT \ - or flag == ReproducibilityFlags.RECOMPUTE \ - or flag == ReproducibilityFlags.REPRODUCE \ - or flag == ReproducibilityFlags.REPLICATE_SCI \ - or flag == ReproducibilityFlags.REPLICATE_COMP \ - or flag == ReproducibilityFlags.REPLICATE_TOTAL \ - or flag == ReproducibilityFlags.EXPERIMENTAL: - return True - else: - return False + return flag in ( + ReproducibilityFlags.NOTHING, + ReproducibilityFlags.RERUN, + ReproducibilityFlags.REPEAT, + ReproducibilityFlags.RECOMPUTE, + ReproducibilityFlags.REPRODUCE, + ReproducibilityFlags.REPLICATE_SCI, + ReproducibilityFlags.REPLICATE_COMP, + ReproducibilityFlags.REPLICATE_TOTAL, + ReproducibilityFlags.EXPERIMENTAL + ) def find_loaded_modules(): From 28b9e61ddae5f7d7c793e72cb4ae01cc606b4abb Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 19 Jul 2021 15:40:36 +0800 Subject: [PATCH 214/484] Style adjustments by pylint for apps_lowpass.py --- .../common/reproducibility/apps_lowpass.py | 181 +++++++++++------- 1 file changed, 113 insertions(+), 68 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py index 9a7ec8f9c..2b999eed2 100644 --- a/daliuge-common/dlg/common/reproducibility/apps_lowpass.py +++ b/daliuge-common/dlg/common/reproducibility/apps_lowpass.py @@ -1,8 +1,11 @@ +""" +Implements several DALiuGE drops to build low-pass filters with various methods. +""" + import numpy as np import pyfftw from dlg import droputils from dlg.apps.simple import BarrierAppDROP -# from dlg.common.reproducibility.reproducibility import common_hash from dlg.common.reproducibility.constants import system_summary from dlg.meta import dlg_batch_output, dlg_streaming_input from dlg.meta import dlg_component, dlg_batch_input @@ -18,6 +21,9 @@ def determine_size(length): class LP_SignalGenerator(BarrierAppDROP): + """ + Generates a noisy sine signal for filtering. Effectively an input generator. + """ component_meta = dlg_component('LPSignalGen', 'Low-pass filter example signal generator', [None], [dlg_batch_output('binary/*', [])], @@ -30,9 +36,6 @@ class LP_SignalGenerator(BarrierAppDROP): noise = dlg_list_param('noise', []) series = None - def initialize(self, **kwargs): - super(LP_SignalGenerator, self).initialize(**kwargs) - def add_noise(self, series: np.array, mean, std, freq, sample_rate, seed, alpha=0.1): """ A noise to the provided signal by producing random values of a given frequency @@ -53,6 +56,10 @@ def add_noise(self, series: np.array, mean, std, freq, sample_rate, seed, alpha= return series def gen_sig(self): + """ + Generates an initial signal + :return: Numpy array of signal values. + """ series = np.zeros(self.length, dtype=np.float64) for freq in self.freqs: for i in range(self.length): @@ -60,25 +67,23 @@ def gen_sig(self): return series def run(self): + """ + Called by DALiuGE to start signal generation. Conditionally adds noise if parameters are set + :return: Writes signal to output ports. + """ outs = self.outputs if len(outs) < 1: raise Exception('At least one output required for %r' % self) self.series = self.gen_sig() if len(self.noise) > 0: self.noise[0] = 1 / self.noise[0] - self.series = self.add_noise(self.series, self.noise[2], self.noise[4], self.noise[1], self.srate, - self.noise[3], self.noise[0]) + self.series = self.add_noise(self.series, self.noise[2], self.noise[4], self.noise[1], + self.srate, self.noise[3], self.noise[0]) data = self.series.tostring() - for o in outs: - o.len = len(data) - o.write(data) - - """ - def generate_reproduce_data(self): - # This will do for now - return {'data_hash': common_hash(self.series)} - """ + for output in outs: + output.len = len(data) + output.write(data) def generate_recompute_data(self): # This will do for now @@ -90,6 +95,9 @@ def generate_recompute_data(self): class LP_WindowGenerator(BarrierAppDROP): + """ + Generates a Hann window for low-pass filtering. + """ component_meta = dlg_component('LPWindowGen', 'Low-pass filter example window generator', [None], [dlg_batch_output('binary/*', [])], @@ -101,9 +109,6 @@ class LP_WindowGenerator(BarrierAppDROP): srate = dlg_int_param('sample_rate', 5000) series = None - def initialize(self, **kwargs): - super(LP_WindowGenerator, self).initialize(**kwargs) - def sinc(self, x_val: np.float64): """ Computes the sin_c value for the input float @@ -114,6 +119,10 @@ def sinc(self, x_val: np.float64): return np.sin(np.pi * x_val) / (np.pi * x_val) def gen_win(self): + """ + Generates the window values. + :return: Numpy array of window series. + """ alpha = 2 * self.cutoff / self.srate win = np.zeros(self.length, dtype=np.float64) for i in range(int(self.length)): @@ -123,19 +132,18 @@ def gen_win(self): return win def run(self): + """ + Called by DALiuGE to start drop execution + :return: + """ outs = self.outputs if len(outs) < 1: raise Exception('At least one output required for %r' % self) self.series = self.gen_win() data = self.series.tostring() - for o in outs: - o.len = len(data) - o.write(data) - - """ - def generate_reproduce_data(self): - return dict(data_hash=common_hash(self.series)) - """ + for output in outs: + output.len = len(data) + output.write(data) def generate_recompute_data(self): output = dict() @@ -148,7 +156,11 @@ def generate_recompute_data(self): class LP_AddNoise(BarrierAppDROP): - component_meta = dlg_component('LPAddNoise', 'Adds noise to a signal generated for the low-pass filter example', + """ + Component to add additional noise to a signal array. + """ + component_meta = dlg_component('LPAddNoise', 'Adds noise to a signal generated ' + 'for the low-pass filter example', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) @@ -162,10 +174,11 @@ class LP_AddNoise(BarrierAppDROP): alpha = dlg_float_param('noise_multiplier', 0.1) signal = np.empty([1]) - def initialize(self, **kwargs): - super(LP_AddNoise).initialize(**kwargs) - def add_noise(self): + """ + Adds noise at a specified frequency. + :return: Modified signal + """ np.random.seed(self.seed) samples = self.alpha * np.random.normal(self.mean, self.std, size=len(self.signal)) for i in range(len(self.signal)): @@ -173,7 +186,11 @@ def add_noise(self): np.add(self.signal, samples, out=self.signal) return self.signal - def getInputArrays(self): + def get_inputs(self): + """ + Reads input data into a numpy array. + :return: + """ ins = self.inputs if len(ins) != 1: raise Exception('Precisely one input required for %r' % self) @@ -182,20 +199,19 @@ def getInputArrays(self): self.signal = np.frombuffer(array) def run(self): + """ + Called by DALiuGE to start drop execution. + :return: + """ outs = self.outputs if len(outs) < 1: raise Exception('At least one output required for %r' % self) - self.getInputArrays() + self.get_inputs() sig = self.add_noise() data = sig.tobytes() - for o in outs: - o.len = len(data) - o.write(data) - - """ - def generate_reproduce_data(self): - return {'data_hash', common_hash(self.signal)} - """ + for output in outs: + output.len = len(data) + output.write(data) def generate_recompute_data(self): return {'mean': self.mean, @@ -208,7 +224,11 @@ def generate_recompute_data(self): class LP_filter_fft_np(BarrierAppDROP): - component_meta = dlg_component('LP_filter_np', 'Filters a signal with a provided window using numpy', + """ + Uses numpy to filter a nosiy signal. + """ + component_meta = dlg_component('LP_filter_np', 'Filters a signal with ' + 'a provided window using numpy', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) @@ -222,13 +242,17 @@ class LP_filter_fft_np(BarrierAppDROP): output = np.zeros([1]) def initialize(self, **kwargs): - super(LP_filter_fft_np, self).initialize(**kwargs) + super().initialize(**kwargs) if self.double_prec: self.precision = self.PRECISIONS['double'] else: self.precision = self.PRECISIONS['single'] - def getInputArrays(self): + def get_inputs(self): + """ + Reads input arrays into numpy array + :return: Sets class series variable. + """ ins = self.inputs if len(ins) != 2: raise Exception('Precisely two input required for %r' % self) @@ -237,6 +261,10 @@ def getInputArrays(self): self.series = array def filter(self): + """ + Actually performs the filtering + :return: Numpy array of filtered signal. + """ signal = self.series[0] window = self.series[1] nfft = determine_size(len(signal) + len(window) - 1) @@ -252,15 +280,19 @@ def filter(self): return out.astype(self.precision['complex']) def run(self): + """ + Called by DALiuGE to start execution + :return: + """ outs = self.outputs if len(outs) < 1: raise Exception('At least one output required for %r' % self) - self.getInputArrays() + self.get_inputs() self.output = self.filter() data = self.output.tostring() - for o in outs: - o.len = len(data) - o.write(data) + for output in outs: + output.len = len(data) + output.write(data) def generate_recompute_data(self): return {'precision_float': str(self.precision['float']), @@ -268,22 +300,22 @@ def generate_recompute_data(self): 'system': system_summary(), 'status': self.status} - """ - def generate_reproduce_data(self): - return {'output_hash': common_hash(self.output)} - """ - class LP_filter_fft_fftw(LP_filter_fft_np): - component_meta = dlg_component('LP_filter_fftw', 'Filters a signal with a provided window using FFTW', + """ + Uses fftw to implement a low-pass filter + """ + component_meta = dlg_component('LP_filter_fftw', 'Filters a signal with ' + 'a provided window using FFTW', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) - def initialize(self, **kwargs): - super(LP_filter_fft_fftw, self).initialize(**kwargs) - def filter(self): + """ + Actually performs the filtering + :return: Filtered signal as numpy array. + """ pyfftw.interfaces.cache.disable() signal = self.series[0] window = self.series[1] @@ -300,15 +332,20 @@ def filter(self): class LP_filter_fft_cuda(LP_filter_fft_np): - component_meta = dlg_component('LP_filter_fft_cuda', 'Filters a signal with a provided window using cuda', + """ + Uses pycuda to implement a low-pass filter + """ + component_meta = dlg_component('LP_filter_fft_cuda', 'Filters a signal with ' + 'a provided window using cuda', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) - def initialize(self, **kwargs): - super(LP_filter_fft_cuda, self).initialize(**kwargs) - def filter(self): + """ + Actually performs the filtering + :return: + """ import pycuda.gpuarray as gpuarray import skcuda.fft as cu_fft import skcuda.linalg as linalg @@ -334,8 +371,12 @@ def filter(self): # Plan forwards sig_fft_gpu = gpuarray.zeros(nfft, dtype=self.precision['complex']) win_fft_gpu = gpuarray.zeros(nfft, dtype=self.precision['complex']) - sig_plan_forward = cu_fft.Plan(sig_fft_gpu.shape, self.precision['float'], self.precision['complex']) - win_plan_forward = cu_fft.Plan(win_fft_gpu.shape, self.precision['float'], self.precision['complex']) + sig_plan_forward = cu_fft.Plan(sig_fft_gpu.shape, + self.precision['float'], + self.precision['complex']) + win_plan_forward = cu_fft.Plan(win_fft_gpu.shape, + self.precision['float'], + self.precision['complex']) cu_fft.fft(sig_gpu, sig_fft_gpu, sig_plan_forward) cu_fft.fft(win_gpu, win_fft_gpu, win_plan_forward) @@ -345,7 +386,9 @@ def filter(self): # Plan inverse out_gpu = gpuarray.zeros_like(out_fft) - plan_inverse = cu_fft.Plan(out_fft.shape, self.precision['complex'], self.precision['complex']) + plan_inverse = cu_fft.Plan(out_fft.shape, + self.precision['complex'], + self.precision['complex']) cu_fft.ifft(out_fft, out_gpu, plan_inverse, True) out_np = np.zeros(len(out_gpu), self.precision['complex']) out_gpu.get(out_np) @@ -354,13 +397,15 @@ def filter(self): class LP_filter_pointwise_np(LP_filter_fft_np): - component_meta = dlg_component('LP_filter_pointwise_np', 'Filters a signal with a provided window using cuda', + """ + Uses raw numpy to implement a low-pass filter + """ + component_meta = dlg_component('LP_filter_pointwise_np', 'Filters a signal with ' + 'a provided window using cuda', [dlg_batch_input('binary/*', [])], [dlg_batch_output('binary/*', [])], [dlg_streaming_input('binary/*')]) - def initialize(self, **kwargs): - super(LP_filter_pointwise_np, self).initialize(**kwargs) - def filter(self): - return np.convolve(self.series[0], self.series[1], mode='full').astype(self.precision['complex']) + return np.convolve(self.series[0], self.series[1], mode='full')\ + .astype(self.precision['complex']) From 982624733192cac1bb4a7c87d1913b7b5143b7ff Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 13:28:40 +0800 Subject: [PATCH 215/484] Makes build_blockdag track and report the order of node visits, not just the count. --- .../dlg/common/reproducibility/reproducibility.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 081dda619..ac639b7c9 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -481,7 +481,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): dropset = {} neighbourset = {} leaves = [] - visited = 0 + visited = [] queue = collections.deque() for drop in drops: @@ -501,7 +501,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for dest in drop['consumers']: dropset[dest][1] += 1 dropset[did][2] += 1 - neighbourset[did].append(dest) + neighbourset[did].append(dest) # TODO: Appending may not be correct behaviour for did in dropset: if dropset[did][1] == 0: @@ -513,7 +513,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): did = queue.pop() block_builder(dropset[did][0]) rmode = int(dropset[did][0]['reprodata']['rmode']) - visited += 1 + visited.append(did) for neighbour in neighbourset[did]: dropset[neighbour][1] -= 1 parenthash = {} @@ -536,7 +536,7 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): if dropset[neighbour][1] == 0: queue.append(neighbour) - if visited != len(dropset): + if len(visited) != len(dropset): raise Exception("Not a DAG") for i in range(len(leaves)): From 5817902a635d553f18d75e772181389cbe53274c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 13:29:01 +0800 Subject: [PATCH 216/484] Adds toposorting tests for all graph abstraction levels. --- .../test/reproducibility/test_toposort.py | 251 ++++++++++++++++-- 1 file changed, 228 insertions(+), 23 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_toposort.py b/daliuge-engine/test/reproducibility/test_toposort.py index 494888f61..d2d2b4c70 100644 --- a/daliuge-engine/test/reproducibility/test_toposort.py +++ b/daliuge-engine/test/reproducibility/test_toposort.py @@ -20,7 +20,8 @@ # MA 02111-1307 USA # """ -Tests the correctness of our topological sorting code. This module does not test the final blockDAG generation. +Tests the correctness of our topological sorting code. +This module does not test the final blockDAG generation. Assumptions: - The graphs tests are valid (not malformed) """ @@ -28,31 +29,90 @@ import json import unittest -from dlg.common.reproducibility.reproducibility import init_lgt_repro_data, init_lg_repro_data, lg_build_blockdag +from dlg.common.reproducibility.reproducibility import \ + init_lgt_repro_data, init_lg_repro_data, lg_build_blockdag, build_blockdag +_dummydrop = {'oid': 1, + 'reprodata': { + 'rmode': "1", + 'lg_blockhash': "123", + 'pgt_data': { + 'merkleroot': "456" + }, + 'pgt_parenthashes': {}, + 'pgt_blockhash': "135", + 'pg_data': { + 'merkleroot': 'bogus' + }, + 'pg_parenthashes': {}, + 'pg_blockhash': "246", + 'rg_data': { + 'merkleroot': 'bogus2' + }, + 'rg_parenthashes': {}, + } + } -class ToposortTests(unittest.TestCase): - def init_graph(self, filename): - fp = open(filename) - lgt = json.load(fp) - fp.close() - for drop in lgt['nodeDataArray']: - drop['reprodata'] = {} - drop['reprodata']['lg_parenthashes'] = [] - drop['reprodata']['lgt_data'] = {'merkleroot': "1"} - drop['reprodata']['lg_data'] = {} - return lgt +def _init_graph(filename): + file = open(filename) + lgt = json.load(file) + file.close() + for drop in lgt['nodeDataArray']: + drop['reprodata'] = {} + drop['reprodata']['lg_parenthashes'] = [] + drop['reprodata']['lgt_data'] = {'merkleroot': "1"} + drop['reprodata']['lg_data'] = {} + return lgt + + +def _init_pgraph_single(): + return [_dummydrop.copy()] + + +def _init_pgraph_twostart(): + pgt = [_dummydrop.copy(), _dummydrop.copy(), _dummydrop.copy()] + pgt[1]['oid'] = 2 + pgt[2]['oid'] = 3 + pgt[0]['outputs'] = [2] + pgt[2]['outputs'] = [2] + return pgt + + +def _init_pgraph_twoend(): + pgt = [_dummydrop.copy(), _dummydrop.copy(), _dummydrop.copy()] + pgt[1]['oid'] = 2 + pgt[2]['oid'] = 3 + pgt[0]['outputs'] = [2, 3] + return pgt + + +def _init_pgraph_twolines(): + pgt = [_dummydrop.copy(), _dummydrop.copy(), _dummydrop.copy(), _dummydrop.copy()] + pgt[1]['oid'] = 2 + pgt[2]['oid'] = 3 + pgt[3]['oid'] = 4 + pgt[0]['outputs'] = [2] + pgt[2]['outputs'] = [4] + return pgt + + +class ToposortTests(unittest.TestCase): + """ + Reads test graphs from /topoGraphs, appends some dummy reprodata then runs through the + traversal code. + The goal is to make sure these routines execute correct topological sorts. + """ def test_lg_blockdag_single(self): """ Tests a single drop A """ - lgt = self.init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) - leaves, visited = lg_build_blockdag(lgt) + visited = lg_build_blockdag(lgt)[1] self.assertTrue(visited == [-1]) def test_lg_blockdag_twostart(self): @@ -62,10 +122,10 @@ def test_lg_blockdag_twostart(self): C B --> """ - lgt = self.init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) - leaves, visited = lg_build_blockdag(lgt) + visited = lg_build_blockdag(lgt)[1] self.assertTrue(visited == [-3, -1, -2]) def test_lg_blockdag_twoend(self): @@ -75,10 +135,10 @@ def test_lg_blockdag_twoend(self): A --> C """ - lgt = self.init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) - leaves, visited = lg_build_blockdag(lgt) + visited = lg_build_blockdag(lgt)[1] self.assertTrue(visited == [-1, -3, -2]) def test_lg_blockdag_twolines(self): @@ -87,18 +147,163 @@ def test_lg_blockdag_twolines(self): A --> B C --> D """ - lgt = self.init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) - leaves, visited = lg_build_blockdag(lgt) + visited = lg_build_blockdag(lgt)[1] self.assertTrue(visited == [-2, -3, -1, -4]) def test_lg_blockdag_empty(self): """ Tests an empty graph. Should fail gracefully. """ - lgt = self.init_graph("topoGraphs/testEmpty.graph") + lgt = _init_graph("topoGraphs/testEmpty.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) - leaves, visited = lg_build_blockdag(lgt) + visited = lg_build_blockdag(lgt)[1] + self.assertTrue(visited == []) + + def test_pgt_blockdag_single(self): + """ + Tests a single drop + 1 + """ + pgt = _init_pgraph_single() + visited = build_blockdag(pgt, 'pgt')[1] + self.assertTrue(visited == [1]) + + def test_pgt_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgt = _init_pgraph_twostart() + visited = build_blockdag(pgt, 'pgt')[1] + self.assertTrue(visited == [3, 1, 2]) + + def test_pgt_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgt = _init_pgraph_twoend() + visited = build_blockdag(pgt, 'pgt')[1] + self.assertTrue(visited == [1, 3, 2]) + + def test_pgt_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgt = _init_pgraph_twolines() + visited = build_blockdag(pgt, 'pgt')[1] + self.assertTrue(visited == [3, 4, 1, 2]) + + def test_pgt_blockdag_empty(self): + """ + Tests an empty graph. Should fail gracefully. + """ + pgt = [] + visited = build_blockdag(pgt, 'pgt')[1] + self.assertTrue(visited == []) + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pg = _init_pgraph_single() + visited = build_blockdag(pg, 'pg')[1] + self.assertTrue(visited == [1]) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pg = _init_pgraph_twostart() + visited = build_blockdag(pg, 'pg')[1] + self.assertTrue(visited == [3, 1, 2]) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pg = _init_pgraph_twoend() + visited = build_blockdag(pg, 'pg')[1] + self.assertTrue(visited == [1, 3, 2]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pg = _init_pgraph_twolines() + visited = build_blockdag(pg, 'pgt')[1] + self.assertTrue(visited == [3, 4, 1, 2]) + + def test_pg_blockdag_empty(self): + """ + Tests an empty graph. Should fail gracefully. + """ + pg = [] + visited = build_blockdag(pg, 'pg')[1] + self.assertTrue(visited == []) + + def test_rg_blockdag_single(self): + """ + Tests a single drop + """ + rg = _init_pgraph_single() + visited = build_blockdag(rg, 'rg')[1] + self.assertTrue(visited == [1]) + + def test_rg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + rg = _init_pgraph_twostart() + visited = build_blockdag(rg, 'rg')[1] + self.assertTrue(visited == [3, 1, 2]) + + def test_rg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + rg = _init_pgraph_twoend() + visited = build_blockdag(rg, 'rg')[1] + self.assertTrue(visited == [1, 3, 2]) + + def test_rg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + rg = _init_pgraph_twolines() + visited = build_blockdag(rg, 'rg')[1] + self.assertTrue(visited == [3, 4, 1, 2]) + + def test_rg_blockdag_empty(self): + """ + Tests an empty graph. Should fail gracefully. + """ + rg = [] + visited = build_blockdag(rg, 'rg')[1] self.assertTrue(visited == []) From 03106b005dcbc2d9b0e98ff44f5d31900634bfc7 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 15:04:03 +0800 Subject: [PATCH 217/484] Adds Logical Blockdag Rerun tests --- .../test/reproducibility/test_toposort.py | 109 +++++ .../topoGraphs/computationSandwich.graph | 294 +++++++++++++ .../reproducibility/topoGraphs/dataFan.graph | 399 +++++++++++++++++ .../topoGraphs/dataFunnel.graph | 405 ++++++++++++++++++ .../topoGraphs/dataSandwich.graph | 302 +++++++++++++ 5 files changed, 1509 insertions(+) create mode 100644 daliuge-engine/test/reproducibility/topoGraphs/computationSandwich.graph create mode 100644 daliuge-engine/test/reproducibility/topoGraphs/dataFan.graph create mode 100644 daliuge-engine/test/reproducibility/topoGraphs/dataFunnel.graph create mode 100644 daliuge-engine/test/reproducibility/topoGraphs/dataSandwich.graph diff --git a/daliuge-engine/test/reproducibility/test_toposort.py b/daliuge-engine/test/reproducibility/test_toposort.py index d2d2b4c70..19a99f914 100644 --- a/daliuge-engine/test/reproducibility/test_toposort.py +++ b/daliuge-engine/test/reproducibility/test_toposort.py @@ -307,3 +307,112 @@ def test_rg_blockdag_empty(self): rg = [] visited = build_blockdag(rg, 'rg')[1] self.assertTrue(visited == []) + + +class LogicalBlockdagRerunTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, "1") + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) diff --git a/daliuge-engine/test/reproducibility/topoGraphs/computationSandwich.graph b/daliuge-engine/test/reproducibility/topoGraphs/computationSandwich.graph new file mode 100644 index 000000000..88141cc67 --- /dev/null +++ b/daliuge-engine/test/reproducibility/topoGraphs/computationSandwich.graph @@ -0,0 +1,294 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "0a86d692-359d-4375-9a15-a0adb6a02cf9", + "loop_aware": "0", + "to": -2, + "toPort": "ec6c82a8-50d6-4efe-a6ff-12c1a211cd3e" + }, + { + "from": -2, + "fromPort": "47af027a-1090-4807-b50c-074ab84957b0", + "loop_aware": "0", + "to": -3, + "toPort": "68fc6be9-885d-498a-a009-eb9018022ca9" + } + ], + "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", + "filePath": "computationSandwich.graph", + "fileType": "graph", + "git_url": "", + "readonly": true, + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "schemaVersion": "OJS", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "0a86d692-359d-4375-9a15-a0adb6a02cf9", + "IdText": "in", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 413, + "y": 370 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "ec6c82a8-50d6-4efe-a6ff-12c1a211cd3e", + "IdText": "in", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "47af027a-1090-4807-b50c-074ab84957b0", + "IdText": "out", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 664, + "y": 352 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "68fc6be9-885d-498a-a009-eb9018022ca9", + "IdText": "out", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 883, + "y": 364 + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/topoGraphs/dataFan.graph b/daliuge-engine/test/reproducibility/topoGraphs/dataFan.graph new file mode 100644 index 000000000..113d1a292 --- /dev/null +++ b/daliuge-engine/test/reproducibility/topoGraphs/dataFan.graph @@ -0,0 +1,399 @@ +{ + "linkDataArray": [ + { + "from": -2, + "fromPort": "15c65149-507b-40de-8790-61dd2bcad568", + "loop_aware": "0", + "to": -1, + "toPort": "8e4bed29-ebc9-4f0a-9be1-4e2f0e613c4f" + }, + { + "from": -1, + "fromPort": "9f11fe8e-52ae-4891-a1b6-1f186e56809a", + "loop_aware": "0", + "to": -3, + "toPort": "b4cb7025-041a-494a-ad2f-95b367e54823" + }, + { + "from": -1, + "fromPort": "9f11fe8e-52ae-4891-a1b6-1f186e56809a", + "loop_aware": "0", + "to": -4, + "toPort": "b051f825-c8b1-412e-907b-45da1e70088f" + } + ], + "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", + "filePath": "dataFan.graph", + "fileType": "graph", + "git_url": "", + "readonly": true, + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "schemaVersion": "OJS", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "8e4bed29-ebc9-4f0a-9be1-4e2f0e613c4f", + "IdText": "out", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "9f11fe8e-52ae-4891-a1b6-1f186e56809a", + "IdText": "out", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 636, + "y": 450 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "15c65149-507b-40de-8790-61dd2bcad568", + "IdText": "out", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 356, + "y": 440 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "b4cb7025-041a-494a-ad2f-95b367e54823", + "IdText": "out", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 890, + "y": 333 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "b051f825-c8b1-412e-907b-45da1e70088f", + "IdText": "out", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -4, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 922, + "y": 602 + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/topoGraphs/dataFunnel.graph b/daliuge-engine/test/reproducibility/topoGraphs/dataFunnel.graph new file mode 100644 index 000000000..1273671ff --- /dev/null +++ b/daliuge-engine/test/reproducibility/topoGraphs/dataFunnel.graph @@ -0,0 +1,405 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "45afbec3-ab42-4f45-bdfb-35e4b96a3d12", + "loop_aware": "0", + "to": -2, + "toPort": "1bef30a1-6493-497f-b904-ba07b44ed128" + }, + { + "from": -3, + "fromPort": "385a5774-0057-4f2d-9b7c-bc1553afcc66", + "loop_aware": "0", + "to": -2, + "toPort": "78b040e6-2cab-4532-a4ef-77b599d61e17" + }, + { + "from": -2, + "fromPort": "eadc0bd3-09c2-4e3a-ac2c-54f48c132caf", + "loop_aware": "0", + "to": -4, + "toPort": "57018c1c-cf3d-4e41-8ef6-514a3f009e99" + } + ], + "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", + "filePath": "dataFunnel.graph", + "fileType": "graph", + "git_url": "", + "readonly": true, + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "schemaVersion": "OJS", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "45afbec3-ab42-4f45-bdfb-35e4b96a3d12", + "IdText": "first", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 406, + "y": 379 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "1bef30a1-6493-497f-b904-ba07b44ed128", + "IdText": "first", + "event": false, + "type": "String" + }, + { + "Id": "78b040e6-2cab-4532-a4ef-77b599d61e17", + "IdText": "second", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "eadc0bd3-09c2-4e3a-ac2c-54f48c132caf", + "IdText": "third", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 633, + "y": 386 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "385a5774-0057-4f2d-9b7c-bc1553afcc66", + "IdText": "second", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 425, + "y": 539 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "57018c1c-cf3d-4e41-8ef6-514a3f009e99", + "IdText": "third", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -4, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 893, + "y": 421 + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/topoGraphs/dataSandwich.graph b/daliuge-engine/test/reproducibility/topoGraphs/dataSandwich.graph new file mode 100644 index 000000000..b67a95c5c --- /dev/null +++ b/daliuge-engine/test/reproducibility/topoGraphs/dataSandwich.graph @@ -0,0 +1,302 @@ +{ + "linkDataArray": [ + { + "from": -2, + "fromPort": "1be17ff0-627d-408c-ad59-032e6be73b6a", + "loop_aware": "0", + "to": -1, + "toPort": "93dd2ec6-d8f6-4880-b738-bbcc7ff5109e" + }, + { + "from": -1, + "fromPort": "fe29461d-8718-4b7f-bb39-7d6a115749b6", + "loop_aware": "0", + "to": -3, + "toPort": "65612c49-6cd9-4370-8626-bc58bf327ac7" + } + ], + "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", + "filePath": "Diagram-2021-07-21-14-20-35.graph", + "fileType": "graph", + "git_url": "", + "readonly": true, + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "schemaVersion": "OJS", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "93dd2ec6-d8f6-4880-b738-bbcc7ff5109e", + "IdText": "in", + "event": false, + "type": "Integer" + } + ], + "isData": false, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "fe29461d-8718-4b7f-bb39-7d6a115749b6", + "IdText": "out", + "event": false, + "type": "Integer" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 612, + "y": 214 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -2, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "1be17ff0-627d-408c-ad59-032e6be73b6a", + "IdText": "in", + "event": false, + "type": "Integer" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 366, + "y": 216 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "65612c49-6cd9-4370-8626-bc58bf327ac7", + "IdText": "out", + "event": false, + "type": "Integer" + } + ], + "isData": true, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 932, + "y": 211 + } + ] +} \ No newline at end of file From f71ab6bd442e526b383a6a6cc552ac9a0b3e63d5 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 15:43:43 +0800 Subject: [PATCH 218/484] Adds behaviour for NOTHING rmode: Does not process parents at all. --- .../common/reproducibility/reproducibility.py | 66 ++++++++++--------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index ac639b7c9..5b266f3a5 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -425,23 +425,24 @@ def lg_build_blockdag(logical_graph: dict): for neighbour in neighbourset[did]: dropset[neighbour][1] -= 1 parenthash = {} - if rmode == ReproducibilityFlags.REPRODUCE.value: - if dropset[did][0]['categoryType'] == Categories.DATA \ - and (dropset[did][1] == 0 or dropset[did][2] == 0): - # Add my new hash to the parent-hash list - if did not in parenthash.keys(): - parenthash[did] = dropset[did][0]['reprodata']['lg_blockhash'] + if rmode != ReproducibilityFlags.NOTHING: + if rmode == ReproducibilityFlags.REPRODUCE.value: + if dropset[did][0]['categoryType'] == Categories.DATA \ + and (dropset[did][1] == 0 or dropset[did][2] == 0): + # Add my new hash to the parent-hash list + if did not in parenthash.keys(): + parenthash[did] = dropset[did][0]['reprodata']['lg_blockhash'] + # parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) + else: + # Add my parenthashes to the parent-hash list + parenthash.update(dropset[did][0]['reprodata']['lg_parenthashes']) + # parenthash.extend(dropset[did][0]['reprodata']['lg_parenthashes']) + if rmode != ReproducibilityFlags.REPRODUCE.value: # Non-compressing behaviour + parenthash[did] = dropset[did][0]['reprodata']['lg_blockhash'] # parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) - else: - # Add my parenthashes to the parent-hash list - parenthash.update(dropset[did][0]['reprodata']['lg_parenthashes']) - # parenthash.extend(dropset[did][0]['reprodata']['lg_parenthashes']) - if rmode != ReproducibilityFlags.REPRODUCE.value: # Non-compressing behaviour - parenthash[did] = dropset[did][0]['reprodata']['lg_blockhash'] - # parenthash.append(dropset[did][0]['reprodata']['lg_blockhash']) - # Add our new hash to the parent-hash list - # We deal with duplicates later - dropset[neighbour][0]['reprodata']['lg_parenthashes'].update(parenthash) + # Add our new hash to the parent-hash list + # We deal with duplicates later + dropset[neighbour][0]['reprodata']['lg_parenthashes'].update(parenthash) if dropset[neighbour][1] == 0: # Add drops at the DAG-frontier queue.append(neighbour) @@ -517,22 +518,23 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): for neighbour in neighbourset[did]: dropset[neighbour][1] -= 1 parenthash = {} - if rmode == ReproducibilityFlags.REPRODUCE.value: - # WARNING: Hack! may break later, proceed with caution - if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA \ - and (dropset[did][1] == 0 or dropset[did][2] == 0): - # Add my new hash to the parent-hash list - if did not in parenthash.keys(): - parenthash[did] = dropset[did][0]['reprodata'][blockstr + '_blockhash'] - # parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) - else: - # Add my parenthashes to the parent-hash list - parenthash.update(dropset[did][0]['reprodata'][parentstr]) - if rmode != ReproducibilityFlags.REPRODUCE.value: - parenthash[did] = dropset[did][0]['reprodata'][blockstr + "_blockhash"] - # Add our new hash to the parent-hash list if on the critical path - if rmode != ReproducibilityFlags.RERUN.value and dropset[did][0]['iid'] == '0/0': - dropset[neighbour][0]['reprodata'][parentstr].update(parenthash) + if rmode != ReproducibilityFlags.NOTHING: + if rmode == ReproducibilityFlags.REPRODUCE.value: + # WARNING: Hack! may break later, proceed with caution + if dropset[did][0]['reprodata']['lgt_data']['category_type'] == Categories.DATA \ + and (dropset[did][1] == 0 or dropset[did][2] == 0): + # Add my new hash to the parent-hash list + if did not in parenthash.keys(): + parenthash[did] = dropset[did][0]['reprodata'][blockstr + '_blockhash'] + # parenthash.append(dropset[did][0]['reprodata'][blockstr + "_blockhash"]) + else: + # Add my parenthashes to the parent-hash list + parenthash.update(dropset[did][0]['reprodata'][parentstr]) + if rmode != ReproducibilityFlags.REPRODUCE.value: + parenthash[did] = dropset[did][0]['reprodata'][blockstr + "_blockhash"] + # Add our new hash to the parent-hash list if on the critical path + if rmode != ReproducibilityFlags.RERUN.value and dropset[did][0]['iid'] == '0/0': + dropset[neighbour][0]['reprodata'][parentstr].update(parenthash) if dropset[neighbour][1] == 0: queue.append(neighbour) From 04964e4119417a638fbffabbd680f876a9d85976 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 15:46:18 +0800 Subject: [PATCH 219/484] Adds logical blockdag testing for repeating, recomputing, reproducing, replicating and nothing. --- .../test/reproducibility/test_toposort.py | 800 +++++++++++++++++- 1 file changed, 792 insertions(+), 8 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_toposort.py b/daliuge-engine/test/reproducibility/test_toposort.py index 19a99f914..7348c23a9 100644 --- a/daliuge-engine/test/reproducibility/test_toposort.py +++ b/daliuge-engine/test/reproducibility/test_toposort.py @@ -29,6 +29,7 @@ import json import unittest +from dlg.common.reproducibility.constants import ReproducibilityFlags from dlg.common.reproducibility.reproducibility import \ init_lgt_repro_data, init_lg_repro_data, lg_build_blockdag, build_blockdag @@ -315,13 +316,575 @@ class LogicalBlockdagRerunTests(unittest.TestCase): In all cases all drops should be included at this stage. """ + rmode = ReproducibilityFlags.RERUN + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagRepeatTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPEAT + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagRecomputeTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReproduceTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + Computing drops should be truncated out of the blockdag construction. + This means that the data tests will be very different. + """ + + rmode = ReproducibilityFlags.REPRODUCE + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + sig0 = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + sig1 = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + sig2 = lgt['nodeDataArray'][2]['reprodata']['lg_blockhash'] + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 0 and + sig0 == sig1 and sig1 == sig2) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehashes = [lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'], + lgt['nodeDataArray'][2]['reprodata']['lg_blockhash']] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehashes == parenthashes and len(parenthashes) == 2) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReplicateSciTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPLICATE_SCI + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReplicateCompTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPLICATE_COMP + def test_single(self): """ Tests a single drop A """ lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] self.assertTrue(len(leaves) == 1) @@ -334,7 +897,7 @@ def test_twostart(self): B --> """ lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) @@ -350,7 +913,7 @@ def test_twoend(self): --> C """ lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] self.assertTrue(leaves[0] == leaves[1]) @@ -362,7 +925,7 @@ def test_twolines(self): C --> D """ lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] self.assertTrue(leaves[0] == leaves[1]) @@ -372,7 +935,7 @@ def test_data_fan(self): Tests that a single data source scatters its signature to downstream data drops. """ lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] @@ -385,7 +948,7 @@ def test_data_funnel(self): Tests that two data sources are collected in a single downstream data drop """ lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] @@ -398,7 +961,7 @@ def test_data_sandwich(self): :return: """ lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] @@ -410,7 +973,228 @@ def test_computation_sandwich(self): Tests that an internal data drop surrounded by computing drops is handled correctly. """ lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, "1") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReplicateTOTALTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPLICATE_TOTAL + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagNothingTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + """ + + rmode = ReproducibilityFlags.NOTHING + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] From c9ea9f579c66d52d3500d0f4c364422d7ffc9380 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 15:53:53 +0800 Subject: [PATCH 220/484] Adds licence to reproducibility.py --- .../common/reproducibility/reproducibility.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 5b266f3a5..1c1e524ec 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -1,3 +1,25 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + """ This module handles the building of reproducibility information for worklfow components and graphs at all stages of unrolling and execution. From 22c4105eff007a8527f4b7a272025bc52b28d22e Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 15:54:22 +0800 Subject: [PATCH 221/484] Separates out blockdag construction testing into a separate module. Renames variables in test_toposort.py for pylint perfection. --- .../test/reproducibility/test_lg_blockdag.py | 939 ++++++++++++++++++ .../test/reproducibility/test_toposort.py | 933 +---------------- 2 files changed, 959 insertions(+), 913 deletions(-) create mode 100644 daliuge-engine/test/reproducibility/test_lg_blockdag.py diff --git a/daliuge-engine/test/reproducibility/test_lg_blockdag.py b/daliuge-engine/test/reproducibility/test_lg_blockdag.py new file mode 100644 index 000000000..f2b8d8053 --- /dev/null +++ b/daliuge-engine/test/reproducibility/test_lg_blockdag.py @@ -0,0 +1,939 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +""" +Tests how the logical blockdag construction logic works. +This refers to how parent hashes and signatures are built. + +Most of these tests will be asserting the obvious, with the exception of Reproducing behaviour. +""" + +import json +import unittest + +from dlg.common.reproducibility.constants import ReproducibilityFlags +from dlg.common.reproducibility.reproducibility import \ + init_lgt_repro_data, init_lg_repro_data, lg_build_blockdag + + +def _init_graph(filename): + file = open(filename) + lgt = json.load(file) + file.close() + for drop in lgt['nodeDataArray']: + drop['reprodata'] = {} + drop['reprodata']['lg_parenthashes'] = [] + drop['reprodata']['lgt_data'] = {'merkleroot': "1"} + drop['reprodata']['lg_data'] = {} + return lgt + + +class LogicalBlockdagRerunTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.RERUN + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagRepeatTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPEAT + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagRecomputeTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReproduceTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + Computing drops should be truncated out of the blockdag construction. + This means that the data tests will be very different. + """ + + rmode = ReproducibilityFlags.REPRODUCE + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + sig0 = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + sig1 = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + sig2 = lgt['nodeDataArray'][2]['reprodata']['lg_blockhash'] + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 0 and + sig0 == sig1 and sig1 == sig2) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehashes = [lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'], + lgt['nodeDataArray'][2]['reprodata']['lg_blockhash']] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehashes == parenthashes and len(parenthashes) == 2) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReplicateSciTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPLICATE_SCI + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReplicateCompTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPLICATE_COMP + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagReplicateTOTALTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + In all cases all drops should be included at this stage. + """ + + rmode = ReproducibilityFlags.REPLICATE_TOTAL + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class LogicalBlockdagNothingTests(unittest.TestCase): + """ + Tests the logical blockdag construction behaviour when rerunning. + """ + + rmode = ReproducibilityFlags.NOTHING + + def test_single(self): + """ + Tests a single drop + A + """ + lgt = _init_graph("topoGraphs/testSingle.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(len(leaves) == 1) + + def test_twostart(self): + """ + A graph with two starts + A --> + C + B --> + """ + lgt = _init_graph("topoGraphs/testTwoStart.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_twoend(self): + """ + A graph with two ends + --> B + A + --> C + """ + lgt = _init_graph("topoGraphs/testTwoEnd.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_twolines(self): + """ + A graph with two starts and two ends + A --> B + C --> D + """ + lgt = _init_graph("topoGraphs/testTwoLines.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + leaves = lg_build_blockdag(lgt)[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + lgt = _init_graph("topoGraphs/dataFan.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + lgt = _init_graph("topoGraphs/dataFunnel.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + lgt = _init_graph("topoGraphs/dataSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + lgt = _init_graph("topoGraphs/computationSandwich.graph") + init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) + init_lg_repro_data(lgt) + lg_build_blockdag(lgt) + sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] + parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) diff --git a/daliuge-engine/test/reproducibility/test_toposort.py b/daliuge-engine/test/reproducibility/test_toposort.py index 7348c23a9..8c9d5c2d2 100644 --- a/daliuge-engine/test/reproducibility/test_toposort.py +++ b/daliuge-engine/test/reproducibility/test_toposort.py @@ -29,7 +29,6 @@ import json import unittest -from dlg.common.reproducibility.constants import ReproducibilityFlags from dlg.common.reproducibility.reproducibility import \ init_lgt_repro_data, init_lg_repro_data, lg_build_blockdag, build_blockdag @@ -217,8 +216,8 @@ def test_pg_blockdag_single(self): """ Tests a single drop """ - pg = _init_pgraph_single() - visited = build_blockdag(pg, 'pg')[1] + pgr = _init_pgraph_single() + visited = build_blockdag(pgr, 'pg')[1] self.assertTrue(visited == [1]) def test_pg_blockdag_twostart(self): @@ -228,8 +227,8 @@ def test_pg_blockdag_twostart(self): 3 2 --> """ - pg = _init_pgraph_twostart() - visited = build_blockdag(pg, 'pg')[1] + pgr = _init_pgraph_twostart() + visited = build_blockdag(pgr, 'pg')[1] self.assertTrue(visited == [3, 1, 2]) def test_pg_blockdag_twoend(self): @@ -239,8 +238,8 @@ def test_pg_blockdag_twoend(self): 1 --> 3 """ - pg = _init_pgraph_twoend() - visited = build_blockdag(pg, 'pg')[1] + pgr = _init_pgraph_twoend() + visited = build_blockdag(pgr, 'pg')[1] self.assertTrue(visited == [1, 3, 2]) def test_pg_blockdag_twolines(self): @@ -249,24 +248,24 @@ def test_pg_blockdag_twolines(self): 1 --> 2 3 --> 4 """ - pg = _init_pgraph_twolines() - visited = build_blockdag(pg, 'pgt')[1] + pgr = _init_pgraph_twolines() + visited = build_blockdag(pgr, 'pgt')[1] self.assertTrue(visited == [3, 4, 1, 2]) def test_pg_blockdag_empty(self): """ Tests an empty graph. Should fail gracefully. """ - pg = [] - visited = build_blockdag(pg, 'pg')[1] + pgr = [] + visited = build_blockdag(pgr, 'pg')[1] self.assertTrue(visited == []) def test_rg_blockdag_single(self): """ Tests a single drop """ - rg = _init_pgraph_single() - visited = build_blockdag(rg, 'rg')[1] + rgr = _init_pgraph_single() + visited = build_blockdag(rgr, 'rg')[1] self.assertTrue(visited == [1]) def test_rg_blockdag_twostart(self): @@ -276,8 +275,8 @@ def test_rg_blockdag_twostart(self): 3 2 --> """ - rg = _init_pgraph_twostart() - visited = build_blockdag(rg, 'rg')[1] + rgr = _init_pgraph_twostart() + visited = build_blockdag(rgr, 'rg')[1] self.assertTrue(visited == [3, 1, 2]) def test_rg_blockdag_twoend(self): @@ -287,8 +286,8 @@ def test_rg_blockdag_twoend(self): 1 --> 3 """ - rg = _init_pgraph_twoend() - visited = build_blockdag(rg, 'rg')[1] + rgr = _init_pgraph_twoend() + visited = build_blockdag(rgr, 'rg')[1] self.assertTrue(visited == [1, 3, 2]) def test_rg_blockdag_twolines(self): @@ -297,906 +296,14 @@ def test_rg_blockdag_twolines(self): 1 --> 2 3 --> 4 """ - rg = _init_pgraph_twolines() - visited = build_blockdag(rg, 'rg')[1] + rgr = _init_pgraph_twolines() + visited = build_blockdag(rgr, 'rg')[1] self.assertTrue(visited == [3, 4, 1, 2]) def test_rg_blockdag_empty(self): """ Tests an empty graph. Should fail gracefully. """ - rg = [] - visited = build_blockdag(rg, 'rg')[1] + rgr = [] + visited = build_blockdag(rgr, 'rg')[1] self.assertTrue(visited == []) - - -class LogicalBlockdagRerunTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - In all cases all drops should be included at this stage. - """ - - rmode = ReproducibilityFlags.RERUN - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 2 and - parenthashes[0] == parenthashes[1]) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - -class LogicalBlockdagRepeatTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - In all cases all drops should be included at this stage. - """ - - rmode = ReproducibilityFlags.REPEAT - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 2 and - parenthashes[0] == parenthashes[1]) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - -class LogicalBlockdagRecomputeTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - In all cases all drops should be included at this stage. - """ - - rmode = ReproducibilityFlags.RECOMPUTE - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 2 and - parenthashes[0] == parenthashes[1]) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - -class LogicalBlockdagReproduceTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - Computing drops should be truncated out of the blockdag construction. - This means that the data tests will be very different. - """ - - rmode = ReproducibilityFlags.REPRODUCE - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - sig0 = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - sig1 = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - sig2 = lgt['nodeDataArray'][2]['reprodata']['lg_blockhash'] - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 0 and - sig0 == sig1 and sig1 == sig2) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehashes = [lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'], - lgt['nodeDataArray'][2]['reprodata']['lg_blockhash']] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehashes == parenthashes and len(parenthashes) == 2) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - -class LogicalBlockdagReplicateSciTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - In all cases all drops should be included at this stage. - """ - - rmode = ReproducibilityFlags.REPLICATE_SCI - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 2 and - parenthashes[0] == parenthashes[1]) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - -class LogicalBlockdagReplicateCompTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - In all cases all drops should be included at this stage. - """ - - rmode = ReproducibilityFlags.REPLICATE_COMP - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 2 and - parenthashes[0] == parenthashes[1]) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - -class LogicalBlockdagReplicateTOTALTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - In all cases all drops should be included at this stage. - """ - - rmode = ReproducibilityFlags.REPLICATE_TOTAL - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 2 and - parenthashes[0] == parenthashes[1]) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - -class LogicalBlockdagNothingTests(unittest.TestCase): - """ - Tests the logical blockdag construction behaviour when rerunning. - """ - - rmode = ReproducibilityFlags.NOTHING - - def test_single(self): - """ - Tests a single drop - A - """ - lgt = _init_graph("topoGraphs/testSingle.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(len(leaves) == 1) - - def test_twostart(self): - """ - A graph with two starts - A --> - C - B --> - """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - parenthashes = list(lgt['nodeDataArray'][1]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(len(leaves) == 1 and - len(parenthashes) == 2 and - parenthashes[0] == parenthashes[1]) - - def test_twoend(self): - """ - A graph with two ends - --> B - A - --> C - """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_twolines(self): - """ - A graph with two starts and two ends - A --> B - C --> D - """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - leaves = lg_build_blockdag(lgt)[0] - self.assertTrue(leaves[0] == leaves[1]) - - def test_data_fan(self): - """ - Tests that a single data source scatters its signature to downstream data drops. - """ - lgt = _init_graph("topoGraphs/dataFan.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthash1 = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - parenthash2 = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) - - def test_data_funnel(self): - """ - Tests that two data sources are collected in a single downstream data drop - """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][3]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_data_sandwich(self): - """ - Tests two data drops with an interim computing drop - :return: - """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][0]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) - - def test_computation_sandwich(self): - """ - Tests that an internal data drop surrounded by computing drops is handled correctly. - """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") - init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) - init_lg_repro_data(lgt) - lg_build_blockdag(lgt) - sourcehash = lgt['nodeDataArray'][1]['reprodata']['lg_blockhash'] - parenthashes = list(lgt['nodeDataArray'][2]['reprodata']['lg_parenthashes'].values()) - self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) From 8290cd1a1402a42b978573cc06ce419cbbdb9402 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 18:53:44 +0800 Subject: [PATCH 222/484] Typo fixes in docstrings --- .../test/reproducibility/test_lg_blockdag.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_lg_blockdag.py b/daliuge-engine/test/reproducibility/test_lg_blockdag.py index f2b8d8053..250e87ac7 100644 --- a/daliuge-engine/test/reproducibility/test_lg_blockdag.py +++ b/daliuge-engine/test/reproducibility/test_lg_blockdag.py @@ -160,7 +160,7 @@ def test_computation_sandwich(self): class LogicalBlockdagRepeatTests(unittest.TestCase): """ - Tests the logical blockdag construction behaviour when rerunning. + Tests the logical blockdag construction behaviour when repeating. In all cases all drops should be included at this stage. """ @@ -271,7 +271,7 @@ def test_computation_sandwich(self): class LogicalBlockdagRecomputeTests(unittest.TestCase): """ - Tests the logical blockdag construction behaviour when rerunning. + Tests the logical blockdag construction behaviour when recomputing. In all cases all drops should be included at this stage. """ @@ -382,7 +382,7 @@ def test_computation_sandwich(self): class LogicalBlockdagReproduceTests(unittest.TestCase): """ - Tests the logical blockdag construction behaviour when rerunning. + Tests the logical blockdag construction behaviour when reproducing. Computing drops should be truncated out of the blockdag construction. This means that the data tests will be very different. """ @@ -498,7 +498,7 @@ def test_computation_sandwich(self): class LogicalBlockdagReplicateSciTests(unittest.TestCase): """ - Tests the logical blockdag construction behaviour when rerunning. + Tests the logical blockdag construction behaviour when replicating scientifically. In all cases all drops should be included at this stage. """ @@ -609,7 +609,7 @@ def test_computation_sandwich(self): class LogicalBlockdagReplicateCompTests(unittest.TestCase): """ - Tests the logical blockdag construction behaviour when rerunning. + Tests the logical blockdag construction behaviour when replicating computationally. In all cases all drops should be included at this stage. """ @@ -720,7 +720,7 @@ def test_computation_sandwich(self): class LogicalBlockdagReplicateTOTALTests(unittest.TestCase): """ - Tests the logical blockdag construction behaviour when rerunning. + Tests the logical blockdag construction behaviour when replicating totally. In all cases all drops should be included at this stage. """ From 0983526e135f65c92817aa50057ddebf9449174a Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 21:29:19 +0800 Subject: [PATCH 223/484] Makes rerunning behaviour more explicit for correctness. --- .../dlg/common/reproducibility/reproducibility.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 1c1e524ec..7c6c2d5b3 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -555,11 +555,16 @@ def build_blockdag(drops: list, abstraction: str = 'pgt'): if rmode != ReproducibilityFlags.REPRODUCE.value: parenthash[did] = dropset[did][0]['reprodata'][blockstr + "_blockhash"] # Add our new hash to the parent-hash list if on the critical path - if rmode != ReproducibilityFlags.RERUN.value and dropset[did][0]['iid'] == '0/0': + if rmode == ReproducibilityFlags.RERUN.value: + if 'iid' in dropset[did][0].keys(): + if dropset[did][0]['iid'] == '0/0': + dropset[neighbour][0]['reprodata'][parentstr].update(parenthash) + else: + dropset[neighbour][0]['reprodata'][parentstr].update(parenthash) + elif rmode != ReproducibilityFlags.RERUN.value: dropset[neighbour][0]['reprodata'][parentstr].update(parenthash) if dropset[neighbour][1] == 0: queue.append(neighbour) - if len(visited) != len(dropset): raise Exception("Not a DAG") From 0404877f9b05d52d3c14788d5bd105ba8726c9bc Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 21 Jul 2021 21:29:47 +0800 Subject: [PATCH 224/484] Adds test_pg_blockdag.py which tests blockdag construction for all rmode standards. --- .../test/reproducibility/test_pg_blockdag.py | 824 ++++++++++++++++++ 1 file changed, 824 insertions(+) create mode 100644 daliuge-engine/test/reproducibility/test_pg_blockdag.py diff --git a/daliuge-engine/test/reproducibility/test_pg_blockdag.py b/daliuge-engine/test/reproducibility/test_pg_blockdag.py new file mode 100644 index 000000000..1f709d1d2 --- /dev/null +++ b/daliuge-engine/test/reproducibility/test_pg_blockdag.py @@ -0,0 +1,824 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +""" +Tests how the physical blockdag construction logic works. +This refers to how parent hashes and signatures are built. + +Most of these tests will be asserting the obvious, with the exception of Reproducing behaviour. +""" + +import unittest + +from dlg.common import Categories +from dlg.common.reproducibility.constants import ReproducibilityFlags +from dlg.common.reproducibility.reproducibility import build_blockdag + + +def _generate_dummy_compute(rmode: ReproducibilityFlags): + return {'oid': 1, + 'reprodata': { + 'rmode': str(rmode.value), + 'lgt_data': {'category_type': Categories.BASH_SHELL_APP}, + 'lg_blockhash': '1', + 'pgt_data': { + 'merkleroot': '2' + }, + 'pgt_parenthashes': {}, + 'pgt_blockhash': '3', + 'pg_data': { + 'merkleroot': '4' + }, + 'pg_parenthashes': {}, + 'pg_blockhash': '5', + 'rg_data': { + 'merkleroot': '6' + }, + 'rg_parenthashes': {}, + } + } + + +def _generate_dummy_data(rmode: ReproducibilityFlags): + return {'oid': 1, + 'reprodata': { + 'rmode': str(rmode.value), + 'lgt_data': {'category_type': Categories.DATA}, + 'lg_blockhash': 'a', + 'pgt_data': { + 'merkleroot': 'b' + }, + 'pgt_parenthashes': {}, + 'pgt_blockhash': 'c', + 'pg_data': { + 'merkleroot': 'd' + }, + 'pg_parenthashes': {}, + 'pg_blockhash': 'e', + 'rg_data': { + 'merkleroot': 'f' + }, + 'rg_parenthashes': {}, + } + } + + +def _init_pgraph_single(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_compute(rmode)] + return pgt + + +def _init_pgraph_twostart(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_compute(rmode), _generate_dummy_compute(rmode), + _generate_dummy_compute(rmode)] + pgt[1]['oid'] = 2 + pgt[2]['oid'] = 3 + pgt[0]['outputs'] = [2] + pgt[2]['outputs'] = [2] + return pgt + + +def _init_pgraph_twoend(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_compute(rmode), _generate_dummy_compute(rmode), + _generate_dummy_compute(rmode)] + pgt[1]['oid'] = 2 + pgt[2]['oid'] = 3 + pgt[0]['outputs'] = [2, 3] + for drop in pgt: + drop['reprodata']['rmode'] = str(rmode.value) + return pgt + + +def _init_pgraph_twolines(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_compute(rmode), _generate_dummy_compute(rmode), + _generate_dummy_compute(rmode), + _generate_dummy_compute(rmode)] + pgt[1]['oid'] = 2 + pgt[2]['oid'] = 3 + pgt[3]['oid'] = 4 + pgt[0]['outputs'] = [2] + pgt[2]['outputs'] = [4] + for drop in pgt: + drop['reprodata']['rmode'] = str(rmode.value) + return pgt + + +def _init_pgraph_data_fan(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode), + _generate_dummy_data(rmode)] + for i in range(len(pgt)): + pgt[i]['oid'] = i + pgt[i]['reprodata']['rmode'] = str(rmode.value) + pgt[0]['outputs'] = [1] + pgt[1]['outputs'] = [2, 3] + return pgt + + +def _init_pgraph_data_funnel(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_data(rmode), _generate_dummy_data(rmode), _generate_dummy_compute(rmode), + _generate_dummy_data(rmode)] + for i in range(len(pgt)): + pgt[i]['oid'] = i + pgt[i]['reprodata']['rmode'] = str(rmode.value) + pgt[0]['outputs'] = [2] + pgt[1]['outputs'] = [2] + pgt[2]['outputs'] = [3] + return pgt + + +def _init_pgraph_data_sandwich(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode)] + for i in range(len(pgt)): + pgt[i]['oid'] = i + pgt[i]['reprodata']['rmode'] = str(rmode.value) + pgt[0]['outputs'] = [1] + pgt[1]['outputs'] = [2] + return pgt + + +def _init_pgraph_computation_sandwich(rmode: ReproducibilityFlags): + pgt = [_generate_dummy_compute(rmode), _generate_dummy_data(rmode), + _generate_dummy_compute(rmode)] + for i in range(len(pgt)): + pgt[i]['oid'] = i + pgt[i]['reprodata']['rmode'] = str(rmode.value) + pgt[0]['outputs'] = [1] + pgt[1]['outputs'] = [2] + return pgt + + +class PhysicalBlockdagRerunTests(unittest.TestCase): + """ + Tests physical blockdag construction when rerunning. + This should be relatively straightforward, but expanded group nodes scatter/gather etc. are + special cases for rerunning specifically. + """ + + rmode = ReproducibilityFlags.RERUN + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pgr = _init_pgraph_single(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(len(leaves) == 1) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgr = _init_pgraph_twostart(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + parenthashes = list(pgr[1]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgr = _init_pgraph_twoend(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgr = _init_pgraph_twolines(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + pgr = _init_pgraph_data_fan(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthash1 = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + parenthash2 = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + pgr = _init_pgraph_data_funnel(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[2]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + pgr = _init_pgraph_data_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + pgr = _init_pgraph_computation_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class PhysicalBlockdagRepeatTests(unittest.TestCase): + """ + Tests physical blockdag construction when repeating. + This should be relatively straightforward. + """ + + rmode = ReproducibilityFlags.REPEAT + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pgr = _init_pgraph_single(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(len(leaves) == 1) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgr = _init_pgraph_twostart(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + parenthashes = list(pgr[1]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgr = _init_pgraph_twoend(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgr = _init_pgraph_twolines(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + pgr = _init_pgraph_data_fan(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthash1 = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + parenthash2 = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + pgr = _init_pgraph_data_funnel(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[2]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + pgr = _init_pgraph_data_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + pgr = _init_pgraph_computation_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class PhysicalBlockdagRecomputeTests(unittest.TestCase): + """ + Tests physical blockdag construction when recomputing. + This should be relatively straightforward. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pgr = _init_pgraph_single(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(len(leaves) == 1) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgr = _init_pgraph_twostart(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + parenthashes = list(pgr[1]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgr = _init_pgraph_twoend(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgr = _init_pgraph_twolines(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + pgr = _init_pgraph_data_fan(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthash1 = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + parenthash2 = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + pgr = _init_pgraph_data_funnel(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[2]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + pgr = _init_pgraph_data_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + pgr = _init_pgraph_computation_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class PhysicalBlockdagReproduceTests(unittest.TestCase): + """ + Tests physical blockdag construction when reproducing. + Rerunning should bring about contracting behaviour when data drops are introduced. + """ + + rmode = ReproducibilityFlags.REPRODUCE + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pgr = _init_pgraph_single(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(len(leaves) == 1) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgr = _init_pgraph_twostart(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + parenthashes = list(pgr[1]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 0) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgr = _init_pgraph_twoend(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgr = _init_pgraph_twolines(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + pgr = _init_pgraph_data_fan(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[0]['reprodata']['pg_blockhash'] + parenthash1 = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + parenthash2 = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + pgr = _init_pgraph_data_funnel(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[0]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 2) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + pgr = _init_pgraph_data_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[0]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + pgr = _init_pgraph_computation_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class PhysicalBlockdagReplicateScientificTests(unittest.TestCase): + """ + Tests physical blockdag construction when replicating scientifically. + This should be relatively straightforward. + """ + + rmode = ReproducibilityFlags.REPLICATE_SCI + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pgr = _init_pgraph_single(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(len(leaves) == 1) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgr = _init_pgraph_twostart(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + parenthashes = list(pgr[1]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgr = _init_pgraph_twoend(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgr = _init_pgraph_twolines(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + pgr = _init_pgraph_data_fan(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthash1 = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + parenthash2 = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + pgr = _init_pgraph_data_funnel(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[2]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + pgr = _init_pgraph_data_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + pgr = _init_pgraph_computation_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class PhysicalBlockdagReplicateComputationTests(unittest.TestCase): + """ + Tests physical blockdag construction when replicating computationally. + This should be relatively straightforward. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pgr = _init_pgraph_single(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(len(leaves) == 1) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgr = _init_pgraph_twostart(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + parenthashes = list(pgr[1]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgr = _init_pgraph_twoend(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgr = _init_pgraph_twolines(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + pgr = _init_pgraph_data_fan(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthash1 = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + parenthash2 = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + pgr = _init_pgraph_data_funnel(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[2]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + pgr = _init_pgraph_data_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + pgr = _init_pgraph_computation_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + +class PhysicalBlockdagReplicateTotalTests(unittest.TestCase): + """ + Tests physical blockdag construction when replicating totally. + This should be relatively straightforward. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + + def test_pg_blockdag_single(self): + """ + Tests a single drop + """ + pgr = _init_pgraph_single(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(len(leaves) == 1) + + def test_pg_blockdag_twostart(self): + """ + A graph with two starts + 1 --> + 3 + 2 --> + """ + pgr = _init_pgraph_twostart(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + parenthashes = list(pgr[1]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(len(leaves) == 1 and + len(parenthashes) == 2 and + parenthashes[0] == parenthashes[1]) + + def test_pg_blockdag_twoend(self): + """ + A graph with two ends + --> 2 + 1 + --> 3 + """ + pgr = _init_pgraph_twoend(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_pg_blockdag_twolines(self): + """ + A graph with two starts and two ends + 1 --> 2 + 3 --> 4 + """ + pgr = _init_pgraph_twolines(self.rmode) + leaves = build_blockdag(pgr, 'pg')[0] + self.assertTrue(leaves[0] == leaves[1]) + + def test_data_fan(self): + """ + Tests that a single data source scatters its signature to downstream data drops. + """ + pgr = _init_pgraph_data_fan(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthash1 = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + parenthash2 = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(parenthash1 == parenthash2 and parenthash1[0] == sourcehash) + + def test_data_funnel(self): + """ + Tests that two data sources are collected in a single downstream data drop + """ + pgr = _init_pgraph_data_funnel(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[2]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[3]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_data_sandwich(self): + """ + Tests two data drops with an interim computing drop + :return: + """ + pgr = _init_pgraph_data_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) + + def test_computation_sandwich(self): + """ + Tests that an internal data drop surrounded by computing drops is handled correctly. + """ + pgr = _init_pgraph_computation_sandwich(self.rmode) + build_blockdag(pgr, 'pg') + sourcehash = pgr[1]['reprodata']['pg_blockhash'] + parenthashes = list(pgr[2]['reprodata']['pg_parenthashes'].values()) + self.assertTrue(sourcehash == parenthashes[0] and len(parenthashes) == 1) From 995f528098fbabf0b5e6321003b6df309c896404 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 22 Jul 2021 12:38:11 +0800 Subject: [PATCH 225/484] Adds __init__.py to reproducibility testing folder --- daliuge-engine/test/reproducibility/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 daliuge-engine/test/reproducibility/__init__.py diff --git a/daliuge-engine/test/reproducibility/__init__.py b/daliuge-engine/test/reproducibility/__init__.py new file mode 100644 index 000000000..e69de29bb From bf4f0b02db0d5bea9b143f50ce3550a55d72cefe Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 22 Jul 2021 12:38:30 +0800 Subject: [PATCH 226/484] Adds a full-length 'nothing' standard integration test. --- .../test/reproducibility/test_integration.py | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 daliuge-engine/test/reproducibility/test_integration.py diff --git a/daliuge-engine/test/reproducibility/test_integration.py b/daliuge-engine/test/reproducibility/test_integration.py new file mode 100644 index 000000000..05728e6f0 --- /dev/null +++ b/daliuge-engine/test/reproducibility/test_integration.py @@ -0,0 +1,91 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +""" +This module ensures that one can submit a test-graph with the NOTHING flag and have nothing +happen. +""" +import json +import optparse +import tempfile +import unittest + +from dlg.common.reproducibility.constants import ReproducibilityFlags +from dlg.translator.tool_commands import dlg_fill, dlg_unroll, dlg_partition, dlg_map + + +def _run_full_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', + scratch_loc='./'): + lgt = workflow_loc + workflow + ".graph" + lgr = scratch_loc + workflow + "LG.graph" + pgs = scratch_loc + workflow + "PGS.graph" + pgt = scratch_loc + workflow + "PGT.graph" + pgr = scratch_loc + workflow + "PG.graph" + + rmodes = str(rmode.value) + + parser = optparse.OptionParser() + dlg_fill(parser, ['-L', lgt, '-R', rmodes, '-o', lgr, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_unroll(parser, ['-L', lgr, '-o', pgs, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_partition(parser, ['-P', pgs, '-o', pgt, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_map(parser, ['-P', pgt, '-N', '127.0.0.1, 127.0.0.1', '-o', pgr, '-f', 'newline']) + + +def _read_graph(filename): + file = open(filename) + graph = json.load(file) + file.close() + return graph + + +class IntegrationNothingTest(unittest.TestCase): + """ + Tests a simple graph up until submission for execution with the goal of asserting + that running a graph with the NOTHING standard produces no reproducibility information. + """ + temp_out = tempfile.TemporaryDirectory('out') + + def _cleanup(self): + self.temp_out.cleanup() + + def test_computation_sandwich(self): + """ + Opens a simple computationSandwich graph in a temporary directory + No data should be present at any level of abstraction, reflected by a null merkleroot. + """ + graph_name = 'computationSandwich' + graph_loc = 'topoGraphs/' + _run_full_workflow(rmode=ReproducibilityFlags.NOTHING, workflow=graph_name, + workflow_loc=graph_loc, scratch_loc=self.temp_out.name) + pgr = self.temp_out.name + graph_name + "PG.graph" + + graph = _read_graph(pgr) + graph = graph[0:-1] + + for drop in graph: + self.assertIsNone(drop['reprodata']['lgt_data']['merkleroot']) + self.assertIsNone(drop['reprodata']['lg_data']['merkleroot']) + self.assertIsNone(drop['reprodata']['pgt_data']['merkleroot']) + self.assertIsNone(drop['reprodata']['pg_data']['merkleroot']) + self._cleanup() From e484ef40c34b0233cf01ca11749c0e124583a8c5 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 22 Jul 2021 17:54:23 +0800 Subject: [PATCH 227/484] Adds a scattering graph and test to demonstrate how rerunning works. --- .../reproducibility/test_scatter_blockdag.py | 131 ++++ .../topoGraphs/simpleNoScatter.graph | 740 ++++++++++++++++++ .../topoGraphs/simpleScatter.graph | 740 ++++++++++++++++++ 3 files changed, 1611 insertions(+) create mode 100644 daliuge-engine/test/reproducibility/test_scatter_blockdag.py create mode 100644 daliuge-engine/test/reproducibility/topoGraphs/simpleNoScatter.graph create mode 100644 daliuge-engine/test/reproducibility/topoGraphs/simpleScatter.graph diff --git a/daliuge-engine/test/reproducibility/test_scatter_blockdag.py b/daliuge-engine/test/reproducibility/test_scatter_blockdag.py new file mode 100644 index 000000000..7bee908a5 --- /dev/null +++ b/daliuge-engine/test/reproducibility/test_scatter_blockdag.py @@ -0,0 +1,131 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +""" +Tests how the logical and physical graphs handle a simple scatter; the behaviour of control nodes +are quite different to standard graphs. +""" + +import json +import optparse +import tempfile +import unittest + +from dlg.common.reproducibility.constants import ReproducibilityFlags +from dlg.common.reproducibility.reproducibility import \ + init_lgt_repro_data, init_lg_repro_data, lg_build_blockdag +from dlg.translator.tool_commands import dlg_fill, dlg_partition, dlg_map, dlg_unroll + + +def _run_full_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', + scratch_loc='./'): + lgt = workflow_loc + workflow + ".graph" + lgr = scratch_loc + workflow + "LG.graph" + pgs = scratch_loc + workflow + "PGS.graph" + pgt = scratch_loc + workflow + "PGT.graph" + pgr = scratch_loc + workflow + "PG.graph" + + rmodes = str(rmode.value) + + parser = optparse.OptionParser() + dlg_fill(parser, ['-L', lgt, '-R', rmodes, '-o', lgr, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_unroll(parser, ['-L', lgr, '-o', pgs, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_partition(parser, ['-P', pgs, '-o', pgt, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_map(parser, ['-P', pgt, '-N', '127.0.0.1, 127.0.0.1', '-o', pgr, '-f', 'newline']) + + +def _read_graph(filename): + file = open(filename) + graph = json.load(file) + file.close() + return graph + + +def _init_graph(filename): + file = open(filename) + lgt = json.load(file) + file.close() + for drop in lgt['nodeDataArray']: + drop['reprodata'] = {} + drop['reprodata']['lg_parenthashes'] = [] + drop['reprodata']['lgt_data'] = {'merkleroot': "1"} + drop['reprodata']['lg_data'] = {} + return lgt + + +class ScatterTest(unittest.TestCase): + """ + Tests a very simple scattered and gathered graph full of dummy files and bash scripts. + See topoGraphs/simpleScatter.graph + """ + temp_out = tempfile.TemporaryDirectory('out') + + def test_lg_scatter_rerun(self): + """ + Tests how rerunning treats such a graph. + Expected behaviour should be the same as any other type of graph - they are all logical + components + """ + lgt = _init_graph("topoGraphs/simpleScatter.graph") + init_lgt_repro_data(lgt, rmode=str(ReproducibilityFlags.RERUN.value)) + init_lg_repro_data(lgt) + visited = lg_build_blockdag(lgt)[1] + scatter_drop = lgt['nodeDataArray'][1] + app_drop = lgt['nodeDataArray'][2] + scatter_inter_drop = lgt['nodeDataArray'][3] + # Checks that the input app drop is the parent of the main application + self.assertEqual(list(app_drop['reprodata']['lg_parenthashes'].values())[0], + scatter_inter_drop['reprodata']['lg_blockhash']) + # Checks that the scatter drop is the parent of the input drop + self.assertEqual(list(scatter_inter_drop['reprodata']['lg_parenthashes'].values())[0], + scatter_drop['reprodata']['lg_blockhash']) + self.assertEqual(visited, [-1, -2, -5, -3, -6, -7, -9]) + + def test_pg_scatter_rerun(self): + """ + Tests how rerunning treats such a graph. + Expected behaviour is as if there was no scattering or gathering - only the 'critical' + path contributes to the hash value + """ + scatter = 'simpleScatter' + noscatter = 'simpleNoScatter' + graph_loc = 'topoGraphs/' + _run_full_workflow(rmode=ReproducibilityFlags.RERUN, workflow=scatter, + workflow_loc=graph_loc, scratch_loc=self.temp_out.name) + _run_full_workflow(rmode=ReproducibilityFlags.RERUN, workflow=noscatter, + workflow_loc=graph_loc, scratch_loc=self.temp_out.name) + pgr_scatter = self.temp_out.name + scatter + "PG.graph" + pgr_noscatter = self.temp_out.name + noscatter + "PG.graph" + + scatter_graph = _read_graph(pgr_scatter) + scatter_graph = scatter_graph[0:-1] + no_scatter_graph = _read_graph(pgr_noscatter) + no_scatter_graph = no_scatter_graph[0:-1] + # Correct number of drops unrolled + self.assertEqual(len(scatter_graph), 10) + # Correct number of drops unscattered + self.assertEqual(len(no_scatter_graph), 7) + # Their signatures should in principal be identicle + self.assertEqual(scatter_graph[-1]['reprodata']['pg_blockhash'], + no_scatter_graph[-1]['reprodata']['pg_blockhash']) diff --git a/daliuge-engine/test/reproducibility/topoGraphs/simpleNoScatter.graph b/daliuge-engine/test/reproducibility/topoGraphs/simpleNoScatter.graph new file mode 100644 index 000000000..639f8a40f --- /dev/null +++ b/daliuge-engine/test/reproducibility/topoGraphs/simpleNoScatter.graph @@ -0,0 +1,740 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "117c2ed8-11dc-4709-9df4-0e74ec51effc", + "loop_aware": "0", + "to": -2, + "toPort": "711ae5b3-b5c8-4c04-875f-e65caab5f03d" + }, + { + "from": -2, + "fromPort": "a21bbe0e-2344-4603-920f-42df4bd48f88", + "loop_aware": "0", + "to": -5, + "toPort": "02c6de6f-48b1-43e5-9e29-35e472fb4cfb" + }, + { + "from": -5, + "fromPort": "f1f587c8-2c96-426b-b316-2b40aef7cabd", + "loop_aware": "0", + "to": -3, + "toPort": "a65e83bd-809e-4666-93c0-20fb395a1f82" + }, + { + "from": -3, + "fromPort": "6e6f8a13-eb45-4672-b96e-40867afeb444", + "loop_aware": "0", + "to": -6, + "toPort": "2f08137e-6c05-46d6-be2f-1d13c37978c1" + }, + { + "from": -7, + "fromPort": "49aecfc1-f75b-4716-a658-d943def1ec10", + "loop_aware": "0", + "to": -9, + "toPort": "d92511a5-58df-48a1-98f6-35440f95e47d" + }, + { + "from": -6, + "fromPort": "f4894341-ad8e-4776-9d1f-19e42c136881", + "loop_aware": "0", + "to": -7, + "toPort": "c09ef307-d3a8-4411-9e8c-bb34eb16b2a5" + } + ], + "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", + "filePath": "simpleScatter.graph", + "fileType": "graph", + "git_url": "", + "readonly": true, + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "schemaVersion": "OJS", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "117c2ed8-11dc-4709-9df4-0e74ec51effc", + "IdText": "in", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 708, + "y": 264 + }, + { + "canHaveInputs": false, + "canHaveOutputs": false, + "category": "Scatter", + "categoryType": "Group", + "collapsed": false, + "color": "#DDAD00", + "description": "Placeholder 'scatter' description", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": true, + "fields": [ + { + "description": "The number of outputs generated by this construct", + "name": "num_of_copies", + "readonly": false, + "text": "Number of copies", + "type": "Integer", + "value": 1 + }, + { + "description": "The axis used to split the input into multiple outputs", + "name": "scatter_axis", + "readonly": false, + "text": "Scatter axis", + "type": "String", + "value": "time" + } + ], + "flipPorts": false, + "height": 337, + "inputAppFields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "inputApplicationKey": -4, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [ + { + "Id": "a21bbe0e-2344-4603-920f-42df4bd48f88", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "inputPorts": [ + { + "Id": "711ae5b3-b5c8-4c04-875f-e65caab5f03d", + "IdText": "in", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": true, + "key": -2, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Scatter", + "width": 461, + "x": 925, + "y": 305 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -2, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "a65e83bd-809e-4666-93c0-20fb395a1f82", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "6e6f8a13-eb45-4672-b96e-40867afeb444", + "IdText": "intermediate", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 973, + "y": 526 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -2, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "02c6de6f-48b1-43e5-9e29-35e472fb4cfb", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -5, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "f1f587c8-2c96-426b-b316-2b40aef7cabd", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "scatter", + "width": 200, + "x": 954.5, + "y": 419.5 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -2, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "2f08137e-6c05-46d6-be2f-1d13c37978c1", + "IdText": "intermediate", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -6, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "f4894341-ad8e-4776-9d1f-19e42c136881", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 1178, + "y": 433 + }, + { + "canHaveInputs": false, + "canHaveOutputs": false, + "category": "Gather", + "categoryType": "Group", + "collapsed": false, + "color": "#D35400", + "description": "Placeholder 'gather' description", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": true, + "fields": [ + { + "description": "The number of inputs that will be gathered together by this construct.", + "name": "num_of_inputs", + "readonly": false, + "text": "Number of inputs", + "type": "Integer", + "value": 2 + }, + { + "description": "The axis by which to gather the inputs together", + "name": "gather_axis", + "readonly": false, + "text": "Gather axis", + "type": "String", + "value": "frequency" + } + ], + "flipPorts": false, + "height": 300, + "inputAppFields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "inputApplicationKey": -8, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [ + { + "Id": "49aecfc1-f75b-4716-a658-d943def1ec10", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "inputPorts": [ + { + "Id": "c09ef307-d3a8-4411-9e8c-bb34eb16b2a5", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": true, + "key": -7, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Gather", + "width": 286, + "x": 1474, + "y": 336 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -7, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "d92511a5-58df-48a1-98f6-35440f95e47d", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -9, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 1540, + "y": 472 + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/topoGraphs/simpleScatter.graph b/daliuge-engine/test/reproducibility/topoGraphs/simpleScatter.graph new file mode 100644 index 000000000..aa4d5c8f5 --- /dev/null +++ b/daliuge-engine/test/reproducibility/topoGraphs/simpleScatter.graph @@ -0,0 +1,740 @@ +{ + "linkDataArray": [ + { + "from": -1, + "fromPort": "117c2ed8-11dc-4709-9df4-0e74ec51effc", + "loop_aware": "0", + "to": -2, + "toPort": "711ae5b3-b5c8-4c04-875f-e65caab5f03d" + }, + { + "from": -2, + "fromPort": "a21bbe0e-2344-4603-920f-42df4bd48f88", + "loop_aware": "0", + "to": -5, + "toPort": "02c6de6f-48b1-43e5-9e29-35e472fb4cfb" + }, + { + "from": -5, + "fromPort": "f1f587c8-2c96-426b-b316-2b40aef7cabd", + "loop_aware": "0", + "to": -3, + "toPort": "a65e83bd-809e-4666-93c0-20fb395a1f82" + }, + { + "from": -3, + "fromPort": "6e6f8a13-eb45-4672-b96e-40867afeb444", + "loop_aware": "0", + "to": -6, + "toPort": "2f08137e-6c05-46d6-be2f-1d13c37978c1" + }, + { + "from": -7, + "fromPort": "49aecfc1-f75b-4716-a658-d943def1ec10", + "loop_aware": "0", + "to": -9, + "toPort": "d92511a5-58df-48a1-98f6-35440f95e47d" + }, + { + "from": -6, + "fromPort": "f4894341-ad8e-4776-9d1f-19e42c136881", + "loop_aware": "0", + "to": -7, + "toPort": "c09ef307-d3a8-4411-9e8c-bb34eb16b2a5" + } + ], + "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", + "filePath": "simpleScatter.graph", + "fileType": "graph", + "git_url": "", + "readonly": true, + "repo": "", + "repoBranch": "", + "repoService": "Unknown", + "schemaVersion": "OJS", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -1, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "117c2ed8-11dc-4709-9df4-0e74ec51effc", + "IdText": "in", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 708, + "y": 264 + }, + { + "canHaveInputs": false, + "canHaveOutputs": false, + "category": "Scatter", + "categoryType": "Group", + "collapsed": false, + "color": "#DDAD00", + "description": "Placeholder 'scatter' description", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": true, + "fields": [ + { + "description": "The number of outputs generated by this construct", + "name": "num_of_copies", + "readonly": false, + "text": "Number of copies", + "type": "Integer", + "value": 2 + }, + { + "description": "The axis used to split the input into multiple outputs", + "name": "scatter_axis", + "readonly": false, + "text": "Scatter axis", + "type": "String", + "value": "time" + } + ], + "flipPorts": false, + "height": 337, + "inputAppFields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "inputApplicationKey": -4, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [ + { + "Id": "a21bbe0e-2344-4603-920f-42df4bd48f88", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "inputPorts": [ + { + "Id": "711ae5b3-b5c8-4c04-875f-e65caab5f03d", + "IdText": "in", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": true, + "key": -2, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Scatter", + "width": 461, + "x": 925, + "y": 305 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "color": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -2, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "a65e83bd-809e-4666-93c0-20fb395a1f82", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "6e6f8a13-eb45-4672-b96e-40867afeb444", + "IdText": "intermediate", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Bash Shell App", + "width": 200, + "x": 973, + "y": 526 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -2, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "02c6de6f-48b1-43e5-9e29-35e472fb4cfb", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -5, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "f1f587c8-2c96-426b-b316-2b40aef7cabd", + "IdText": "scatter", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "scatter", + "width": 200, + "x": 954.5, + "y": 419.5 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -2, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "2f08137e-6c05-46d6-be2f-1d13c37978c1", + "IdText": "intermediate", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -6, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "f4894341-ad8e-4776-9d1f-19e42c136881", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 1178, + "y": 433 + }, + { + "canHaveInputs": false, + "canHaveOutputs": false, + "category": "Gather", + "categoryType": "Group", + "collapsed": false, + "color": "#D35400", + "description": "Placeholder 'gather' description", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": true, + "fields": [ + { + "description": "The number of inputs that will be gathered together by this construct.", + "name": "num_of_inputs", + "readonly": false, + "text": "Number of inputs", + "type": "Integer", + "value": 2 + }, + { + "description": "The axis by which to gather the inputs together", + "name": "gather_axis", + "readonly": false, + "text": "Gather axis", + "type": "String", + "value": "frequency" + } + ], + "flipPorts": false, + "height": 300, + "inputAppFields": [ + { + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" + } + ], + "inputApplicationKey": -8, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [ + { + "Id": "49aecfc1-f75b-4716-a658-d943def1ec10", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "inputPorts": [ + { + "Id": "c09ef307-d3a8-4411-9e8c-bb34eb16b2a5", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "isData": false, + "isGroup": true, + "key": -7, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "Gather", + "width": 286, + "x": 1474, + "y": 336 + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "color": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "Estimated size of the data contained in this node", + "name": "data_volume", + "readonly": false, + "text": "Data volume", + "type": "Float", + "value": 5 + }, + { + "description": "Is this node the end of a group?", + "name": "group_end", + "readonly": false, + "text": "Group end", + "type": "Boolean", + "value": false + }, + { + "description": "Perform a check to make sure the file path exists before proceeding with the application", + "name": "check_filepath_exists", + "readonly": false, + "text": "Check file path exists", + "type": "Boolean", + "value": false + }, + { + "description": "Path to the file for this node", + "name": "filepath", + "readonly": false, + "text": "File path", + "type": "String", + "value": "" + }, + { + "description": "Name of the directory containing the file for this node", + "name": "dirname", + "readonly": false, + "text": "Directory name", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "group": -7, + "height": 200, + "inputAppFields": [], + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "d92511a5-58df-48a1-98f6-35440f95e47d", + "IdText": "result", + "event": false, + "type": "String" + } + ], + "isData": true, + "isGroup": false, + "key": -9, + "outputAppFields": [], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, + "streaming": false, + "subject": null, + "text": "File", + "width": 200, + "x": 1540, + "y": 472 + } + ] +} \ No newline at end of file From e3ee74de8404d2cea67a60579ab4edb109bc392c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 11:20:25 +0800 Subject: [PATCH 228/484] Updates test graphs with latest EAGLE data. --- .../reproducibility/reproGraphs/apps.graph | 4 +- .../reproducibility/reproGraphs/files.graph | 50 +-- .../reproducibility/reproGraphs/groups.graph | 408 ++++++++++++------ .../reproducibility/reproGraphs/misc.graph | 120 +++--- 4 files changed, 345 insertions(+), 237 deletions(-) diff --git a/daliuge-engine/test/reproducibility/reproGraphs/apps.graph b/daliuge-engine/test/reproducibility/reproGraphs/apps.graph index 7da0e3daf..95e083136 100644 --- a/daliuge-engine/test/reproducibility/reproGraphs/apps.graph +++ b/daliuge-engine/test/reproducibility/reproGraphs/apps.graph @@ -130,7 +130,7 @@ { "canHaveInputs": true, "canHaveOutputs": true, - "category": "mpi", + "category": "Mpi", "categoryType": "Application", "collapsed": false, "colour": "#1E90FF", @@ -189,7 +189,7 @@ { "canHaveInputs": true, "canHaveOutputs": true, - "category": "docker", + "category": "Docker", "categoryType": "Application", "collapsed": false, "colour": "#331C54", diff --git a/daliuge-engine/test/reproducibility/reproGraphs/files.graph b/daliuge-engine/test/reproducibility/reproGraphs/files.graph index 4c7c27f53..d13546bd9 100644 --- a/daliuge-engine/test/reproducibility/reproGraphs/files.graph +++ b/daliuge-engine/test/reproducibility/reproGraphs/files.graph @@ -12,7 +12,7 @@ { "canHaveInputs": true, "canHaveOutputs": true, - "category": "memory", + "category": "Memory", "categoryType": "Data", "collapsed": false, "colour": "#394BB2", @@ -56,7 +56,7 @@ { "canHaveInputs": true, "canHaveOutputs": true, - "category": "file", + "category": "File", "categoryType": "Data", "collapsed": false, "colour": "#394BB2", @@ -115,51 +115,7 @@ { "canHaveInputs": true, "canHaveOutputs": true, - "category": "s3", - "categoryType": "Data", - "collapsed": false, - "colour": "#394BB2", - "description": "", - "exitAppName": "", - "fields": [ - { - "name": "data_volume", - "text": "Data volume", - "value": "5" - }, - { - "name": "group_end", - "text": "Group end", - "value": "0" - } - ], - "inputAppFields": [], - "inputAppName": "", - "inputApplication": "Unknown", - "inputLocalPorts": [], - "inputPorts": [], - "isData": true, - "isGroup": false, - "key": -3, - "loc": "430 259", - "outputAppFields": [], - "outputAppName": "", - "outputApplication": "Unknown", - "outputLocalPorts": [], - "outputPorts": [ - { - "Id": "736cc3d7-8b3a-4752-8dc1-d71b5fb01911", - "IdText": "event" - } - ], - "streaming": false, - "subject": null, - "text": "S3" - }, - { - "canHaveInputs": true, - "canHaveOutputs": true, - "category": "ngas", + "category": "NGAS", "categoryType": "Data", "collapsed": false, "colour": "#394BB2", diff --git a/daliuge-engine/test/reproducibility/reproGraphs/groups.graph b/daliuge-engine/test/reproducibility/reproGraphs/groups.graph index 66d110a7b..f6e172050 100644 --- a/daliuge-engine/test/reproducibility/reproGraphs/groups.graph +++ b/daliuge-engine/test/reproducibility/reproGraphs/groups.graph @@ -1,260 +1,406 @@ { "linkDataArray": [], "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", "filePath": "groups.graph", "fileType": "graph", "git_url": "", + "readonly": true, "repo": "", + "repoBranch": "", "repoService": "Unknown", + "schemaVersion": "OJS", "sha": "" }, "nodeDataArray": [ { - "canHaveInputs": true, - "canHaveOutputs": true, + "canHaveInputs": false, + "canHaveOutputs": false, "category": "GroupBy", "categoryType": "Group", "collapsed": false, - "colour": "#7F8C8D", + "color": "#7F8C8D", "description": "Placeholder 'group by' description", - "desiredSize": { - "height": 200, - "width": 200 - }, - "exitAppName": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, "fields": [ { + "description": "", "name": "group_key", + "readonly": false, "text": "Group key", + "type": "String", "value": "None" }, { + "description": "", "name": "group_axis", + "readonly": false, "text": "Group axis", + "type": "String", "value": "frequency" } ], - "inputAppFields": [], - "inputAppName": "", - "inputApplication": "", - "inputLocalPorts": [ + "flipPorts": false, + "height": 200, + "inputAppFields": [ { - "Id": "f21dd6fd-08ae-4955-bb05-6466dfa884f6", - "IdText": "event" + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" } ], + "inputApplicationKey": -6, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [], "inputPorts": [ { - "Id": "c4f1785d-2427-42ef-ad3e-b4ed2428c5b4", - "IdText": "event" + "Id": "d92ad23a-b146-4e1a-a06d-dbedcd54042a", + "IdText": "in", + "event": false, + "type": "String" } ], "isData": false, "isGroup": true, "key": -1, - "loc": "300 100", "outputAppFields": [], - "outputAppName": "", - "outputApplication": "", - "outputLocalPorts": [ - { - "Id": "ff77c691-624b-471e-ac7e-c0f25cf86559", - "IdText": "event" - } - ], - "outputPorts": [ - { - "Id": "8ac46084-6e76-4223-8ff7-a352488368d4", - "IdText": "event" - } - ], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, "streaming": false, "subject": null, - "text": "Group By" + "text": "Group By", + "width": 200, + "x": 613.6213734460798, + "y": 461.02769856795413 }, { - "canHaveInputs": true, - "canHaveOutputs": true, + "canHaveInputs": false, + "canHaveOutputs": false, "category": "Gather", "categoryType": "Group", "collapsed": false, - "colour": "#D35400", + "color": "#D35400", "description": "Placeholder 'gather' description", - "desiredSize": { - "height": 200, - "width": 200 - }, - "exitAppName": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, "fields": [ { + "description": "The number of inputs that will be gathered together by this construct.", "name": "num_of_inputs", + "readonly": false, "text": "Number of inputs", - "value": "2" + "type": "Integer", + "value": 2 }, { + "description": "The axis by which to gather the inputs together", "name": "gather_axis", + "readonly": false, "text": "Gather axis", + "type": "String", "value": "frequency" } ], - "inputAppFields": [], - "inputAppName": "", - "inputApplication": "Unknown", - "inputLocalPorts": [ + "flipPorts": false, + "height": 200, + "inputAppFields": [ { - "Id": "4694e4c6-c6ba-42f7-bad6-a2943d369ce6", - "IdText": "event" + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" } ], + "inputApplicationKey": -7, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [], "inputPorts": [ { - "Id": "0bdb44ea-123d-42ff-825d-cb939175586a", - "IdText": "event" + "Id": "6d8579c9-d27b-48ae-9875-89b1429e40a9", + "IdText": "in", + "event": false, + "type": "String" } ], "isData": false, "isGroup": true, "key": -2, - "loc": "300 100", "outputAppFields": [], - "outputAppName": "", - "outputApplication": "", - "outputLocalPorts": [ - { - "Id": "5fcb853a-efa5-4c48-aa72-e803f6d96cb7", - "IdText": "event" - } - ], - "outputPorts": [ - { - "Id": "237f5a78-5bd6-412f-8a8b-70e2f4ea4af1", - "IdText": "event" - } - ], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, "streaming": false, "subject": null, - "text": "Gather" + "text": "Gather", + "width": 200, + "x": 662.321482449737, + "y": 20.56226824598862 }, { - "canHaveInputs": true, - "canHaveOutputs": true, + "canHaveInputs": false, + "canHaveOutputs": false, "category": "Scatter", "categoryType": "Group", "collapsed": false, - "colour": "#DDAD00", + "color": "#DDAD00", "description": "Placeholder 'scatter' description", - "desiredSize": { - "height": 200, - "width": 200 - }, - "exitAppName": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, "fields": [ { + "description": "The number of outputs generated by this construct", "name": "num_of_copies", + "readonly": false, "text": "Number of copies", - "value": "4" + "type": "Integer", + "value": 4 }, { + "description": "The axis used to split the input into multiple outputs", "name": "scatter_axis", + "readonly": false, "text": "Scatter axis", + "type": "String", "value": "time" } ], - "inputAppFields": [], - "inputAppName": "", - "inputApplication": "Unknown", - "inputLocalPorts": [ + "flipPorts": false, + "height": 200, + "inputAppFields": [ { - "Id": "88f46618-57ac-4e9c-99a7-f9cf2d682852", - "IdText": "event" + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" } ], + "inputApplicationKey": -8, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [], "inputPorts": [ { - "Id": "b8cc69ef-de0c-4c6a-bba2-df12aff17a8b", - "IdText": "event" + "Id": "801298bd-3618-4dd8-8373-a5f31e268a3a", + "IdText": "in", + "event": false, + "type": "String" } ], "isData": false, "isGroup": true, "key": -3, - "loc": "300 100", "outputAppFields": [], - "outputAppName": "", - "outputApplication": "", - "outputLocalPorts": [ - { - "Id": "c29554bd-8003-410a-9cce-c0d4376bb1ef", - "IdText": "event" - } - ], - "outputPorts": [ - { - "Id": "a8e147cb-065c-49ee-8c52-25c53cf36a07", - "IdText": "event" - } - ], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, "streaming": false, "subject": null, - "text": "Scatter" + "text": "Scatter", + "width": 200, + "x": 261.8983639752229, + "y": -6.493347867154186 }, { - "canHaveInputs": true, - "canHaveOutputs": true, + "canHaveInputs": false, + "canHaveOutputs": false, "category": "Loop", "categoryType": "Group", "collapsed": false, - "colour": "#512E5F", + "color": "#512E5F", "description": "Placeholder 'loop' description", - "desiredSize": { - "height": 200, - "width": 200 - }, - "exitAppName": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, "fields": [ { + "description": "The number of iterations performed by this loop construct", "name": "num_of_iter", + "readonly": false, "text": "Number loops", - "value": "5" + "type": "Integer", + "value": 5 } ], - "inputAppFields": [], - "inputAppName": "", - "inputApplication": "", - "inputLocalPorts": [ + "flipPorts": false, + "height": 200, + "inputAppFields": [ { - "Id": "cf7081c4-4950-4ec8-b81c-634e1317d51f", - "IdText": "event" + "description": "Estimate of execution time (in seconds) for this application.", + "name": "execution_time", + "readonly": false, + "text": "Execution time", + "type": "Float", + "value": 5 + }, + { + "description": "Number of CPUs used for this application.", + "name": "num_cpus", + "readonly": false, + "text": "Num CPUs", + "type": "Integer", + "value": 1 + }, + { + "description": "Is this node the start of a group?", + "name": "group_start", + "readonly": false, + "text": "Group start", + "type": "Boolean", + "value": false + }, + { + "description": "The command line to be executed", + "name": "Arg01", + "readonly": false, + "text": "Arg01", + "type": "String", + "value": "" } ], + "inputApplicationKey": -5, + "inputApplicationName": "Bash Shell App", + "inputApplicationType": "BashShellApp", + "inputLocalPorts": [], "inputPorts": [ { - "Id": "cb2023bd-4f82-4574-9be5-d9bdbe5a8960", - "IdText": "event" + "Id": "7c1a04d0-0009-463e-bf91-ae79c328f89a", + "IdText": "in", + "event": false, + "type": "String" } ], "isData": false, "isGroup": true, "key": -4, - "loc": "300 100", "outputAppFields": [], - "outputAppName": "", - "outputApplication": "", - "outputLocalPorts": [ - { - "Id": "a71caf3a-3c4a-43b6-9732-275cc7e4e41a", - "IdText": "event" - } - ], - "outputPorts": [ - { - "Id": "355e0ec9-a0be-47f3-9257-a402be15c957", - "IdText": "event" - } - ], + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", + "outputLocalPorts": [], + "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, "streaming": false, "subject": null, - "text": "Loop" + "text": "Loop", + "width": 200, + "x": 153.6758995226514, + "y": 330.0785165803428 } ] } \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/reproGraphs/misc.graph b/daliuge-engine/test/reproducibility/reproGraphs/misc.graph index 4b41e1868..25849c184 100644 --- a/daliuge-engine/test/reproducibility/reproGraphs/misc.graph +++ b/daliuge-engine/test/reproducibility/reproGraphs/misc.graph @@ -1,11 +1,16 @@ { "linkDataArray": [], "modelData": { + "eagleCommitHash": "9dffb2c3f02e3f230247356191a5ca4e8e2c11a1", + "eagleVersion": "v3.0.4", "filePath": "misc.graph", "fileType": "graph", "git_url": "", + "readonly": true, "repo": "", + "repoBranch": "", "repoService": "Unknown", + "schemaVersion": "OJS", "sha": "" }, "nodeDataArray": [ @@ -15,31 +20,50 @@ "category": "Comment", "categoryType": "Other", "collapsed": false, - "colour": "#799938", + "color": "#799938", "description": "A node that places a comment in the graph. The comment can be used to communicate important information or intention", - "desiredSize": { - "height": 200, - "width": 200 - }, - "exitAppName": "", - "fields": [], + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, + "fields": [ + { + "description": "The text value of the comment", + "name": "comment", + "readonly": false, + "text": "Comment", + "type": "String", + "value": "" + } + ], + "flipPorts": false, + "height": 200, "inputAppFields": [], - "inputAppName": "", - "inputApplication": "Unknown", + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", "inputLocalPorts": [], "inputPorts": [], "isData": false, "isGroup": false, "key": -1, - "loc": "300 100", "outputAppFields": [], - "outputAppName": "", - "outputApplication": "Unknown", + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", "outputLocalPorts": [], "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, "streaming": false, "subject": null, - "text": "Comment" + "text": "Comment", + "width": 200, + "x": 207.7871317489371, + "y": 476.17884359131426 }, { "canHaveInputs": false, @@ -47,68 +71,50 @@ "category": "Description", "categoryType": "Other", "collapsed": false, - "colour": "#9B3065", + "color": "#9B3065", "description": "A node that places a description in the graph. The description should be used to communicate the purpose of the graph", - "desiredSize": { - "height": 200, - "width": 200 - }, - "exitAppName": "", + "drawOrderHint": 0, + "exitAppFields": [], + "exitApplicationKey": null, + "exitApplicationName": "", + "exitApplicationType": "None", + "expanded": false, "fields": [ { + "description": "The text value of the description", + "name": "description", + "readonly": false, "text": "Description", + "type": "String", "value": "" } ], + "flipPorts": false, + "height": 200, "inputAppFields": [], - "inputAppName": "", - "inputApplication": "Unknown", + "inputApplicationKey": null, + "inputApplicationName": "", + "inputApplicationType": "None", "inputLocalPorts": [], "inputPorts": [], "isData": false, "isGroup": false, "key": -2, - "loc": "300 100", - "outputAppFields": [], - "outputAppName": "", - "outputApplication": "Unknown", - "outputLocalPorts": [], - "outputPorts": [], - "streaming": false, - "subject": null, - "text": "Description" - }, - { - "canHaveInputs": false, - "canHaveOutputs": false, - "category": "ExclusiveForceNode", - "categoryType": "Control", - "collapsed": false, - "colour": "#000000", - "description": "A group that completely specifies the computation on a single node. All child components must be deployed to a single node, and no other components can be deployed to the same node.", - "desiredSize": { - "height": 200, - "width": 200 - }, - "exitAppName": "", - "fields": [], - "inputAppFields": [], - "inputAppName": "", - "inputApplication": "", - "inputLocalPorts": [], - "inputPorts": [], - "isData": false, - "isGroup": true, - "key": -3, - "loc": "300 100", "outputAppFields": [], - "outputAppName": "", - "outputApplication": "", + "outputApplicationKey": null, + "outputApplicationName": "", + "outputApplicationType": "None", "outputLocalPorts": [], "outputPorts": [], + "readonly": false, + "selected": false, + "showPorts": false, "streaming": false, "subject": null, - "text": "Exclusive Force Node" + "text": "Description", + "width": 200, + "x": 508.6455829270854, + "y": 396.09421989641135 } ] } \ No newline at end of file From c4110339d0a269760e423a4cf11b18510d7e748b Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 11:30:48 +0800 Subject: [PATCH 229/484] Adds licence, implements AccumulateLGTRerunData and AccumulateLGRerunData --- .../reproducibility/test_accumulatedata.py | 159 ++++++++++++++++-- 1 file changed, 141 insertions(+), 18 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index f7389b39b..4a418d695 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -1,11 +1,71 @@ +# +# ICRAR - International Centre for Radio Astronomy Research +# (c) UWA - The University of Western Australia, 2017 +# Copyright by UWA (in the framework of the ICRAR) +# All rights reserved +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +""" +Tests the routine generating a drop's reproducibility data. +Ideally, one would have a pre-existing standard for each drop-type to be tested individually. +For now, this will suffice. +""" + import json +import optparse +import tempfile import unittest from dlg.common.reproducibility.constants import ReproducibilityFlags -from dlg.common.reproducibility.reproducibility import accumulate_lgt_drop_data +from dlg.common.reproducibility.reproducibility import accumulate_lgt_drop_data, \ + accumulate_lg_drop_data +from dlg.translator.tool_commands import dlg_fill, dlg_unroll, dlg_partition, dlg_map + + +def _fill_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', scratch_loc='./'): + lgt = workflow_loc + workflow + ".graph" + lgr = scratch_loc + workflow + "LG.graph" + + rmodes = str(rmode.value) + + parser = optparse.OptionParser() + dlg_fill(parser, ['-L', lgt, '-R', rmodes, '-o', lgr, '-f', 'newline']) + + +def _run_full_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', + scratch_loc='./'): + lgr = scratch_loc + workflow + "LG.graph" + pgs = scratch_loc + workflow + "PGS.graph" + pgt = scratch_loc + workflow + "PGT.graph" + pgr = scratch_loc + workflow + "PG.graph" + + _fill_workflow(rmode, workflow, workflow_loc, scratch_loc) + parser = optparse.OptionParser() + dlg_unroll(parser, ['-L', lgr, '-o', pgs, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_partition(parser, ['-P', pgs, '-o', pgt, '-f', 'newline']) + parser = optparse.OptionParser() + dlg_map(parser, ['-P', pgt, '-N', '127.0.0.1, 127.0.0.1', '-o', pgr, '-f', 'newline']) class AccumulateLGTRerunData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph template level. + """ # Locations in apps.graph for various application types bash_app = 0 dyn_lib = 1 @@ -13,37 +73,100 @@ class AccumulateLGTRerunData(unittest.TestCase): docker = 3 python = 4 + expected = ['category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'] + + file = open('reproGraphs/apps.graph') + lgt_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/files.graph') + lgt_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/groups.graph') + lgt_groups_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/misc.graph') + lgt_misc_data = json.load(file)['nodeDataArray'] + file.close() + def test_app_accumulate(self): - fp = open('reproGraphs/apps.graph') - node_data = json.load(fp)['nodeDataArray'] - app_hashes = [] - for i in range(5): - app = node_data[i] - hash_data = accumulate_lgt_drop_data(app, ReproducibilityFlags.RERUN) - print(hash_data) - #app_hashes.append(HASHING_ALG(hash_data).hexdigest())) - fp.close() - assert True + """ + Tests that lgt rerun data is collected for application types + """ + for drop in enumerate(self.lgt_node_data): + hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + self.assertEqual(self.expected, list(hash_data.keys())) def test_data_accumulate(self): - self.assertEqual(True, False) + """ + Tests that lgt rerun data is collected for file types + """ + for drop in enumerate(self.lgt_files_data): + hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + self.assertEqual(self.expected, list(hash_data.keys())) def test_group_accumulate(self): - self.assertEqual(True, False) - - def test_control_accumulate(self): - self.assertEqual(True, False) + """ + Tests that lgt rerun data is collected for group types + """ + for drop in enumerate(self.lgt_groups_data): + hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + self.assertEqual(self.expected, list(hash_data.keys())) def test_other_accumulate(self): - self.assertEqual(True, False) + """ + Tests that lgt rerun data is collected for other types + """ + for drop in enumerate(self.lgt_misc_data): + hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + self.assertEqual(self.expected, list(hash_data.keys())) class AccumulateLGRerunData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph level. + """ + expected = [] + temp_out = tempfile.TemporaryDirectory('out') + + def _cleanup(self): + self.temp_out.cleanup() + + def _setup(self): + _fill_workflow(ReproducibilityFlags.RERUN, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(ReproducibilityFlags.RERUN, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(ReproducibilityFlags.RERUN, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(ReproducibilityFlags.RERUN, 'misc', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'LG.graph') + self.lg_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'files' + 'LG.graph') + self.lg_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'groups' + 'LG.graph') + self.lg_group_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'misc' + 'LG.graph') + self.lg_misc_data = json.load(file)['nodeDataArray'] + file.close() + def test_all_accumulate(self): - self.assertEqual(True, False) + """ + Tests that lg rerun data is collected correctly (should not contain any information) + """ + self._setup() + for drop in enumerate( + self.lg_node_data + self.lg_files_data + self.lg_group_data + self.lg_misc_data): + hash_data = accumulate_lg_drop_data(drop[1], ReproducibilityFlags.RERUN) + self.assertEqual(self.expected, list(hash_data.keys())) class AccumulatePGTUnrollRerunData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + Can currently only test apps.graph and files.graph, the translator cannot deal with groups + or comments easily. + """ def test_app_accumulate(self): self.assertEqual(True, False) From f3436302009008e3148ca72b557d8d708eb2f721 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 12:02:01 +0800 Subject: [PATCH 230/484] Implements AccumulatePGTUnrollRerunData test and cleans up some variables. --- .../reproducibility/test_accumulatedata.py | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index 4a418d695..f36a5a6d9 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -32,7 +32,7 @@ from dlg.common.reproducibility.constants import ReproducibilityFlags from dlg.common.reproducibility.reproducibility import accumulate_lgt_drop_data, \ - accumulate_lg_drop_data + accumulate_lg_drop_data, accumulate_pgt_unroll_drop_data from dlg.translator.tool_commands import dlg_fill, dlg_unroll, dlg_partition, dlg_map @@ -66,13 +66,8 @@ class AccumulateLGTRerunData(unittest.TestCase): """ Tests the rerun standard at the logical graph template level. """ - # Locations in apps.graph for various application types - bash_app = 0 - dyn_lib = 1 - mpi = 2 - docker = 3 - python = 4 + rmode = ReproducibilityFlags.RERUN expected = ['category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'] file = open('reproGraphs/apps.graph') @@ -93,7 +88,7 @@ def test_app_accumulate(self): Tests that lgt rerun data is collected for application types """ for drop in enumerate(self.lgt_node_data): - hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) self.assertEqual(self.expected, list(hash_data.keys())) def test_data_accumulate(self): @@ -101,7 +96,7 @@ def test_data_accumulate(self): Tests that lgt rerun data is collected for file types """ for drop in enumerate(self.lgt_files_data): - hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) self.assertEqual(self.expected, list(hash_data.keys())) def test_group_accumulate(self): @@ -109,7 +104,7 @@ def test_group_accumulate(self): Tests that lgt rerun data is collected for group types """ for drop in enumerate(self.lgt_groups_data): - hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) self.assertEqual(self.expected, list(hash_data.keys())) def test_other_accumulate(self): @@ -117,7 +112,7 @@ def test_other_accumulate(self): Tests that lgt rerun data is collected for other types """ for drop in enumerate(self.lgt_misc_data): - hash_data = accumulate_lgt_drop_data(drop[1], ReproducibilityFlags.RERUN) + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) self.assertEqual(self.expected, list(hash_data.keys())) @@ -125,6 +120,8 @@ class AccumulateLGRerunData(unittest.TestCase): """ Tests the rerun standard at the logical graph level. """ + + rmode = ReproducibilityFlags.RERUN expected = [] temp_out = tempfile.TemporaryDirectory('out') @@ -132,10 +129,10 @@ def _cleanup(self): self.temp_out.cleanup() def _setup(self): - _fill_workflow(ReproducibilityFlags.RERUN, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(ReproducibilityFlags.RERUN, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(ReproducibilityFlags.RERUN, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(ReproducibilityFlags.RERUN, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -157,8 +154,9 @@ def test_all_accumulate(self): self._setup() for drop in enumerate( self.lg_node_data + self.lg_files_data + self.lg_group_data + self.lg_misc_data): - hash_data = accumulate_lg_drop_data(drop[1], ReproducibilityFlags.RERUN) + hash_data = accumulate_lg_drop_data(drop[1], self.rmode) self.assertEqual(self.expected, list(hash_data.keys())) + self._cleanup() class AccumulatePGTUnrollRerunData(unittest.TestCase): @@ -167,11 +165,37 @@ class AccumulatePGTUnrollRerunData(unittest.TestCase): Can currently only test apps.graph and files.graph, the translator cannot deal with groups or comments easily. """ + + rmode = ReproducibilityFlags.RERUN + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGS.graph') + self.pgs_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGS.graph') + self.pgs_file_data = json.load(file)[0:-1] + file.close() + def test_app_accumulate(self): - self.assertEqual(True, False) + expected = ['type', 'dt'] + self._setup() + for drop in enumerate(self.pgs_node_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) def test_data_accumulate(self): - self.assertEqual(True, False) + expected = ['type', 'storage'] + self._setup() + for drop in enumerate(self.pgs_file_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) def test_group_accumulate(self): self.assertEqual(True, False) From e44793fc3ecf4587ac94eb0b0d0d729b571cc6f7 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 12:08:49 +0800 Subject: [PATCH 231/484] Implements AccumulatePGTPartitionRerunData and AccumulatePGPartitionRerunData --- .../reproducibility/test_accumulatedata.py | 61 +++++++++++++++++-- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index f36a5a6d9..2db4ab553 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -32,7 +32,8 @@ from dlg.common.reproducibility.constants import ReproducibilityFlags from dlg.common.reproducibility.reproducibility import accumulate_lgt_drop_data, \ - accumulate_lg_drop_data, accumulate_pgt_unroll_drop_data + accumulate_lg_drop_data, accumulate_pgt_unroll_drop_data, accumulate_pgt_partition_drop_data, \ + accumulate_pg_drop_data from dlg.translator.tool_commands import dlg_fill, dlg_unroll, dlg_partition, dlg_map @@ -208,11 +209,36 @@ def test_other_accumulate(self): class AccumulatePGTPartitionRerunData(unittest.TestCase): + rmode = ReproducibilityFlags.RERUN + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pgt_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pgt_file_data = json.load(file)[0:-1] + file.close() + def test_app_accumulate(self): - self.assertEqual(True, False) + expected = ['type', 'dt'] + self._setup() + for drop in enumerate(self.pgt_node_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) def test_data_accumulate(self): - self.assertEqual(True, False) + expected = ['type', 'storage'] + self._setup() + for drop in enumerate(self.pgt_file_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) def test_group_accumulate(self): self.assertEqual(True, False) @@ -225,11 +251,36 @@ def test_other_accumulate(self): class AccumulatePGRerunData(unittest.TestCase): + rmode = ReproducibilityFlags.RERUN + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pg_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pg_file_data = json.load(file)[0:-1] + file.close() + def test_app_accumulate(self): - self.assertEqual(True, False) + expected = [] + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) def test_data_accumulate(self): - self.assertEqual(True, False) + expected = [] + self._setup() + for drop in enumerate(self.pg_file_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) def test_group_accumulate(self): self.assertEqual(True, False) From 4c669dcc5a5aac0c45d666a0b00e16ad4f75a520 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 13:29:46 +0800 Subject: [PATCH 232/484] Implements Accumulate[X]PartitionRepeatData --- .../reproducibility/test_accumulatedata.py | 286 ++++++++++++++++++ 1 file changed, 286 insertions(+) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index 2db4ab553..160b7cf9f 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -292,5 +292,291 @@ def test_other_accumulate(self): self.assertEqual(True, False) +class AccumulateLGTRepeatData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph template level. + """ + + rmode = ReproducibilityFlags.REPEAT + expected = ['category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'] + + file = open('reproGraphs/apps.graph') + lgt_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/files.graph') + lgt_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/groups.graph') + lgt_groups_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/misc.graph') + lgt_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def test_app_accumulate(self): + """ + Tests that lgt rerun data is collected for application types + """ + for drop in enumerate(self.lgt_node_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, list(hash_data.keys())) + + def test_data_accumulate(self): + """ + Tests that lgt rerun data is collected for file types + """ + for drop in enumerate(self.lgt_files_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, list(hash_data.keys())) + + def test_group_accumulate(self): + """ + Tests that lgt rerun data is collected for group types + """ + for drop in enumerate(self.lgt_groups_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, list(hash_data.keys())) + + def test_other_accumulate(self): + """ + Tests that lgt rerun data is collected for other types + """ + for drop in enumerate(self.lgt_misc_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, list(hash_data.keys())) + + +class AccumulateLGRepeatData(unittest.TestCase): + """ + Tests the repeat standard at the logical graph level. + """ + + rmode = ReproducibilityFlags.REPEAT + expected = [] + temp_out = tempfile.TemporaryDirectory('out') + + def _cleanup(self): + self.temp_out.cleanup() + + def _setup(self): + _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'LG.graph') + self.lg_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'files' + 'LG.graph') + self.lg_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'groups' + 'LG.graph') + self.lg_group_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'misc' + 'LG.graph') + self.lg_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def _bash(self, drop): + expected = {'execution_time', 'num_cpus', 'command'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _dynlib(self, drop): + expected = {'execution_time', 'num_cpus', 'libpath'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _mpi(self, drop): + expected = {'execution_time', 'num_cpus', 'num_of_procs'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _docker(self, drop): + expected = {'execution_time', 'num_cpus', 'image', 'command', 'user', 'ensureUserAndSwitch', + 'removeContainer', 'additionalBindings'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _component(self, drop): + expected = {'execution_time', 'num_cpus', 'appclass'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _memory(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _file(self, drop): + expected = {'data_volume', 'check_filepath_exists'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _ngas(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _groupby(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'group_key', 'group_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _scatter(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_copies', 'scatter_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _loop(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_iter'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def test_all_accumulate(self): + self._setup() + self._bash(self.lg_node_data[0]) + self._dynlib(self.lg_node_data[1]) + self._mpi(self.lg_node_data[2]) + self._docker(self.lg_node_data[3]) + self._component(self.lg_node_data[4]) + self._memory(self.lg_files_data[0]) + self._file(self.lg_files_data[1]) + self._ngas(self.lg_files_data[2]) + self._cleanup() + + +class AccumulatePGTUnrollRepeatData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + Can currently only test apps.graph and files.graph, the translator cannot deal with groups + or comments easily. + """ + + rmode = ReproducibilityFlags.REPEAT + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGS.graph') + self.pgs_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGS.graph') + self.pgs_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = ['type', 'dt'] + self._setup() + for drop in enumerate(self.pgs_node_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_data_accumulate(self): + expected = ['type', 'storage'] + self._setup() + for drop in enumerate(self.pgs_file_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTPartitionRepeatData(unittest.TestCase): + rmode = ReproducibilityFlags.REPEAT + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pgt_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pgt_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = ['type', 'dt'] + self._setup() + for drop in enumerate(self.pgt_node_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_data_accumulate(self): + expected = ['type', 'storage'] + self._setup() + for drop in enumerate(self.pgt_file_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGRepeatData(unittest.TestCase): + rmode = ReproducibilityFlags.REPEAT + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pg_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pg_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = [] + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_data_accumulate(self): + expected = [] + self._setup() + for drop in enumerate(self.pg_file_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + if __name__ == '__main__': unittest.main() From 631ceebc0d044e5c3339fd51b44ce9dbeff99646 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 13:34:40 +0800 Subject: [PATCH 233/484] Improves key comparison in all tests. --- .../reproducibility/test_accumulatedata.py | 48 +++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index 160b7cf9f..58755ea54 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -69,7 +69,7 @@ class AccumulateLGTRerunData(unittest.TestCase): """ rmode = ReproducibilityFlags.RERUN - expected = ['category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'] + expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} file = open('reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] @@ -90,7 +90,7 @@ def test_app_accumulate(self): """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) def test_data_accumulate(self): """ @@ -98,7 +98,7 @@ def test_data_accumulate(self): """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) def test_group_accumulate(self): """ @@ -106,7 +106,7 @@ def test_group_accumulate(self): """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) def test_other_accumulate(self): """ @@ -114,7 +114,7 @@ def test_other_accumulate(self): """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) class AccumulateLGRerunData(unittest.TestCase): @@ -123,7 +123,7 @@ class AccumulateLGRerunData(unittest.TestCase): """ rmode = ReproducibilityFlags.RERUN - expected = [] + expected = {} temp_out = tempfile.TemporaryDirectory('out') def _cleanup(self): @@ -156,7 +156,7 @@ def test_all_accumulate(self): for drop in enumerate( self.lg_node_data + self.lg_files_data + self.lg_group_data + self.lg_misc_data): hash_data = accumulate_lg_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, dict(hash_data.keys())) self._cleanup() @@ -185,18 +185,18 @@ def _setup(self): file.close() def test_app_accumulate(self): - expected = ['type', 'dt'] + expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgs_node_data): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): - expected = ['type', 'storage'] + expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgs_file_data): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_group_accumulate(self): self.assertEqual(True, False) @@ -227,18 +227,18 @@ def _setup(self): file.close() def test_app_accumulate(self): - expected = ['type', 'dt'] + expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgt_node_data): hash_data = accumulate_pgt_partition_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): - expected = ['type', 'storage'] + expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgt_file_data): hash_data = accumulate_pgt_partition_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_group_accumulate(self): self.assertEqual(True, False) @@ -269,18 +269,18 @@ def _setup(self): file.close() def test_app_accumulate(self): - expected = [] + expected = {} self._setup() for drop in enumerate(self.pg_node_data): hash_data = accumulate_pg_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, dict(hash_data.keys())) def test_data_accumulate(self): - expected = [] + expected = {} self._setup() for drop in enumerate(self.pg_file_data): hash_data = accumulate_pg_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, dict(hash_data.keys())) def test_group_accumulate(self): self.assertEqual(True, False) @@ -298,7 +298,7 @@ class AccumulateLGTRepeatData(unittest.TestCase): """ rmode = ReproducibilityFlags.REPEAT - expected = ['category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'] + expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} file = open('reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] @@ -319,7 +319,7 @@ def test_app_accumulate(self): """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) def test_data_accumulate(self): """ @@ -327,7 +327,7 @@ def test_data_accumulate(self): """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) def test_group_accumulate(self): """ @@ -335,7 +335,7 @@ def test_group_accumulate(self): """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) def test_other_accumulate(self): """ @@ -343,7 +343,7 @@ def test_other_accumulate(self): """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) - self.assertEqual(self.expected, list(hash_data.keys())) + self.assertEqual(self.expected, hash_data.keys()) class AccumulateLGRepeatData(unittest.TestCase): From 06fe3faa2816864d6bfd1d28791f9d47eb806169 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 13:59:38 +0800 Subject: [PATCH 234/484] Implements accumulatedata Recompute tests --- .../reproducibility/test_accumulatedata.py | 307 +++++++++++++++++- 1 file changed, 296 insertions(+), 11 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index 58755ea54..d3c526477 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -471,18 +471,18 @@ def _setup(self): file.close() def test_app_accumulate(self): - expected = ['type', 'dt'] + expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgs_node_data): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): - expected = ['type', 'storage'] + expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgs_file_data): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_group_accumulate(self): self.assertEqual(True, False) @@ -513,18 +513,18 @@ def _setup(self): file.close() def test_app_accumulate(self): - expected = ['type', 'dt'] + expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgt_node_data): hash_data = accumulate_pgt_partition_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): - expected = ['type', 'storage'] + expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgt_file_data): hash_data = accumulate_pgt_partition_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, hash_data.keys()) def test_group_accumulate(self): self.assertEqual(True, False) @@ -555,17 +555,261 @@ def _setup(self): file.close() def test_app_accumulate(self): - expected = [] + expected = {} self._setup() for drop in enumerate(self.pg_node_data): hash_data = accumulate_pg_drop_data(drop[1]) - self.assertEqual(expected, list(hash_data.keys())) + self.assertEqual(expected, dict(hash_data.keys())) def test_data_accumulate(self): - expected = [] + expected = {} self._setup() for drop in enumerate(self.pg_file_data): hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, dict(hash_data.keys())) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulateLGTRecomputeData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph template level. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} + + file = open('reproGraphs/apps.graph') + lgt_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/files.graph') + lgt_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/groups.graph') + lgt_groups_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/misc.graph') + lgt_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def test_app_accumulate(self): + """ + Tests that lgt rerun data is collected for application types + """ + for drop in enumerate(self.lgt_node_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_data_accumulate(self): + """ + Tests that lgt rerun data is collected for file types + """ + for drop in enumerate(self.lgt_files_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_group_accumulate(self): + """ + Tests that lgt rerun data is collected for group types + """ + for drop in enumerate(self.lgt_groups_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_other_accumulate(self): + """ + Tests that lgt rerun data is collected for other types + """ + for drop in enumerate(self.lgt_misc_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + +class AccumulateLGRecomputeData(unittest.TestCase): + """ + Tests the repeat standard at the logical graph level. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + expected = {} + temp_out = tempfile.TemporaryDirectory('out') + + def _cleanup(self): + self.temp_out.cleanup() + + def _setup(self): + _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'LG.graph') + self.lg_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'files' + 'LG.graph') + self.lg_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'groups' + 'LG.graph') + self.lg_group_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'misc' + 'LG.graph') + self.lg_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def _bash(self, drop): + expected = {'execution_time', 'num_cpus', 'command'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _dynlib(self, drop): + expected = {'execution_time', 'num_cpus', 'libpath'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _mpi(self, drop): + expected = {'execution_time', 'num_cpus', 'num_of_procs'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _docker(self, drop): + expected = {'execution_time', 'num_cpus', 'image', 'command', 'user', 'ensureUserAndSwitch', + 'removeContainer', 'additionalBindings'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _component(self, drop): + expected = {'execution_time', 'num_cpus', 'appclass'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _memory(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _file(self, drop): + expected = {'data_volume', 'check_filepath_exists', 'filepath', 'dirname'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _ngas(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _groupby(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'group_key', 'group_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _scatter(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_copies', 'scatter_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _loop(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_iter'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def test_all_accumulate(self): + self._setup() + self._bash(self.lg_node_data[0]) + self._dynlib(self.lg_node_data[1]) + self._mpi(self.lg_node_data[2]) + self._docker(self.lg_node_data[3]) + self._component(self.lg_node_data[4]) + self._memory(self.lg_files_data[0]) + self._file(self.lg_files_data[1]) + self._ngas(self.lg_files_data[2]) + self._cleanup() + + +class AccumulatePGTUnrollRecomputeData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + Can currently only test apps.graph and files.graph, the translator cannot deal with groups + or comments easily. + """ + + rmode = ReproducibilityFlags.RECOMPUTE + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGS.graph') + self.pgs_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGS.graph') + self.pgs_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type', 'dt', 'rank'} + self._setup() + for drop in enumerate(self.pgs_node_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage', 'rank'} + self._setup() + for drop in enumerate(self.pgs_file_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTPartitionRecomputeData(unittest.TestCase): + rmode = ReproducibilityFlags.RECOMPUTE + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pgt_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pgt_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = ['type', 'dt', 'rank', 'node', 'island'] + self._setup() + for drop in enumerate(self.pgt_node_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_data_accumulate(self): + expected = ['type', 'storage', 'rank', 'node', 'island'] + self._setup() + for drop in enumerate(self.pgt_file_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) self.assertEqual(expected, list(hash_data.keys())) def test_group_accumulate(self): @@ -578,5 +822,46 @@ def test_other_accumulate(self): self.assertEqual(True, False) +class AccumulatePGRecomputeData(unittest.TestCase): + rmode = ReproducibilityFlags.RECOMPUTE + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pg_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pg_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'node', 'island'} + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'node', 'island'} + self._setup() + for drop in enumerate(self.pg_file_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + if __name__ == '__main__': unittest.main() From 888dca01a69c64e9aae66393eaeb92031438ae98 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 14:29:58 +0800 Subject: [PATCH 235/484] Implements accumulatedata Reproduce tests --- .../reproducibility/test_accumulatedata.py | 286 ++++++++++++++++++ 1 file changed, 286 insertions(+) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index d3c526477..2189bab4c 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -863,5 +863,291 @@ def test_control_accumulate(self): def test_other_accumulate(self): self.assertEqual(True, False) + +class AccumulateLGTReproduceData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph template level. + """ + + rmode = ReproducibilityFlags.REPRODUCE + expected = {'category_type', 'category'} + + file = open('reproGraphs/apps.graph') + lgt_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/files.graph') + lgt_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/groups.graph') + lgt_groups_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/misc.graph') + lgt_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def test_app_accumulate(self): + """ + Tests that lgt rerun data is collected for application types + """ + for drop in enumerate(self.lgt_node_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_data_accumulate(self): + """ + Tests that lgt rerun data is collected for file types + """ + for drop in enumerate(self.lgt_files_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_group_accumulate(self): + """ + Tests that lgt rerun data is collected for group types + """ + for drop in enumerate(self.lgt_groups_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_other_accumulate(self): + """ + Tests that lgt rerun data is collected for other types + """ + for drop in enumerate(self.lgt_misc_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + +class AccumulateLGReproduceData(unittest.TestCase): + """ + Tests the repeat standard at the logical graph level. + """ + + rmode = ReproducibilityFlags.REPRODUCE + expected = {} + temp_out = tempfile.TemporaryDirectory('out') + + def _cleanup(self): + self.temp_out.cleanup() + + def _setup(self): + _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'LG.graph') + self.lg_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'files' + 'LG.graph') + self.lg_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'groups' + 'LG.graph') + self.lg_group_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'misc' + 'LG.graph') + self.lg_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def _bash(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _dynlib(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _mpi(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _docker(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _component(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _memory(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _file(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _ngas(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _groupby(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _scatter(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def _loop(self, drop): + expected = {} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, dict(hash_data.keys())) + + def test_all_accumulate(self): + self._setup() + self._bash(self.lg_node_data[0]) + self._dynlib(self.lg_node_data[1]) + self._mpi(self.lg_node_data[2]) + self._docker(self.lg_node_data[3]) + self._component(self.lg_node_data[4]) + self._memory(self.lg_files_data[0]) + self._file(self.lg_files_data[1]) + self._ngas(self.lg_files_data[2]) + self._cleanup() + + +class AccumulatePGTUnrollReproduceData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + Can currently only test apps.graph and files.graph, the translator cannot deal with groups + or comments easily. + """ + + rmode = ReproducibilityFlags.REPRODUCE + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGS.graph') + self.pgs_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGS.graph') + self.pgs_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type'} + self._setup() + for drop in enumerate(self.pgs_node_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage'} + self._setup() + for drop in enumerate(self.pgs_file_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTPartitionReproduceData(unittest.TestCase): + rmode = ReproducibilityFlags.REPRODUCE + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pgt_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pgt_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = ['type'] + self._setup() + for drop in enumerate(self.pgt_node_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_data_accumulate(self): + expected = ['type', 'storage'] + self._setup() + for drop in enumerate(self.pgt_file_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, list(hash_data.keys())) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGReproduceData(unittest.TestCase): + rmode = ReproducibilityFlags.REPRODUCE + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pg_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pg_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {} + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, dict(hash_data.keys())) + + def test_data_accumulate(self): + expected = {} + self._setup() + for drop in enumerate(self.pg_file_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, dict(hash_data.keys())) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + if __name__ == '__main__': unittest.main() From e5f4a9ee0fb9059c00a53361960161c7babbb3ba Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 14:36:37 +0800 Subject: [PATCH 236/484] Implements accumulatedata Replicate-Sci tests --- .../reproducibility/test_accumulatedata.py | 226 ++++++++++++++++++ 1 file changed, 226 insertions(+) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index 2189bab4c..b78c71ca3 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -1149,5 +1149,231 @@ def test_other_accumulate(self): self.assertEqual(True, False) +class AccumulateLGTReplicateSciData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph template level. + """ + + rmode = ReproducibilityFlags.REPLICATE_SCI + expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} + + file = open('reproGraphs/apps.graph') + lgt_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/files.graph') + lgt_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/groups.graph') + lgt_groups_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/misc.graph') + lgt_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def test_app_accumulate(self): + """ + Tests that lgt rerun data is collected for application types + """ + for drop in enumerate(self.lgt_node_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_data_accumulate(self): + """ + Tests that lgt rerun data is collected for file types + """ + for drop in enumerate(self.lgt_files_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_group_accumulate(self): + """ + Tests that lgt rerun data is collected for group types + """ + for drop in enumerate(self.lgt_groups_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_other_accumulate(self): + """ + Tests that lgt rerun data is collected for other types + """ + for drop in enumerate(self.lgt_misc_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + +class AccumulateLGReplicateSciData(unittest.TestCase): + """ + Tests the repeat standard at the logical graph level. + """ + + rmode = ReproducibilityFlags.REPLICATE_SCI + expected = {} + temp_out = tempfile.TemporaryDirectory('out') + + def _cleanup(self): + self.temp_out.cleanup() + + def _setup(self): + _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'LG.graph') + self.lg_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'files' + 'LG.graph') + self.lg_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'groups' + 'LG.graph') + self.lg_group_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + 'misc' + 'LG.graph') + self.lg_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def test_all_accumulate(self): + self._setup() + for drop in enumerate( + self.lg_node_data + self.lg_files_data + self.lg_group_data + self.lg_misc_data): + hash_data = accumulate_lg_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, dict(hash_data.keys())) + self._cleanup() + + +class AccumulatePGTUnrollReplicateSciData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + Can currently only test apps.graph and files.graph, the translator cannot deal with groups + or comments easily. + """ + + rmode = ReproducibilityFlags.REPLICATE_SCI + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGS.graph') + self.pgs_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGS.graph') + self.pgs_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type', 'dt'} + self._setup() + for drop in enumerate(self.pgs_node_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage'} + self._setup() + for drop in enumerate(self.pgs_file_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTPartitionReplicateSciData(unittest.TestCase): + rmode = ReproducibilityFlags.REPLICATE_SCI + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pgt_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pgt_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type', 'dt'} + self._setup() + for drop in enumerate(self.pgt_node_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage'} + self._setup() + for drop in enumerate(self.pgt_file_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGReplicateSciData(unittest.TestCase): + rmode = ReproducibilityFlags.REPLICATE_SCI + temp_out = tempfile.TemporaryDirectory('out') + + def __del__(self): + self.temp_out.cleanup() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + 'apps' + 'PGT.graph') + self.pg_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + 'files' + 'PGT.graph') + self.pg_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {} + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, dict(hash_data.keys())) + + def test_data_accumulate(self): + expected = {} + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, dict(hash_data.keys())) + + def test_group_accumulate(self): + self.assertEqual(True, False) + + def test_control_accumulate(self): + self.assertEqual(True, False) + + def test_other_accumulate(self): + self.assertEqual(True, False) + + if __name__ == '__main__': unittest.main() From 785d6e02d9603a1eece9f1111c8fe086038e0eed Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 15:19:00 +0800 Subject: [PATCH 237/484] Tempfiles are now used correctly. --- .../test/reproducibility/test_integration.py | 12 ++++++------ .../test/reproducibility/test_scatter_blockdag.py | 14 +++++++------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_integration.py b/daliuge-engine/test/reproducibility/test_integration.py index 05728e6f0..0dde4484f 100644 --- a/daliuge-engine/test/reproducibility/test_integration.py +++ b/daliuge-engine/test/reproducibility/test_integration.py @@ -34,11 +34,11 @@ def _run_full_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', scratch_loc='./'): - lgt = workflow_loc + workflow + ".graph" - lgr = scratch_loc + workflow + "LG.graph" - pgs = scratch_loc + workflow + "PGS.graph" - pgt = scratch_loc + workflow + "PGT.graph" - pgr = scratch_loc + workflow + "PG.graph" + lgt = workflow_loc + '/' + workflow + ".graph" + lgr = scratch_loc + '/' + workflow + "LG.graph" + pgs = scratch_loc + '/' + workflow + "PGS.graph" + pgt = scratch_loc + '/' + workflow + "PGT.graph" + pgr = scratch_loc + '/' + workflow + "PG.graph" rmodes = str(rmode.value) @@ -78,7 +78,7 @@ def test_computation_sandwich(self): graph_loc = 'topoGraphs/' _run_full_workflow(rmode=ReproducibilityFlags.NOTHING, workflow=graph_name, workflow_loc=graph_loc, scratch_loc=self.temp_out.name) - pgr = self.temp_out.name + graph_name + "PG.graph" + pgr = self.temp_out.name + '/' + graph_name + "PG.graph" graph = _read_graph(pgr) graph = graph[0:-1] diff --git a/daliuge-engine/test/reproducibility/test_scatter_blockdag.py b/daliuge-engine/test/reproducibility/test_scatter_blockdag.py index 7bee908a5..c2b60e500 100644 --- a/daliuge-engine/test/reproducibility/test_scatter_blockdag.py +++ b/daliuge-engine/test/reproducibility/test_scatter_blockdag.py @@ -37,11 +37,11 @@ def _run_full_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', scratch_loc='./'): - lgt = workflow_loc + workflow + ".graph" - lgr = scratch_loc + workflow + "LG.graph" - pgs = scratch_loc + workflow + "PGS.graph" - pgt = scratch_loc + workflow + "PGT.graph" - pgr = scratch_loc + workflow + "PG.graph" + lgt = workflow_loc + '/' + workflow + ".graph" + lgr = scratch_loc + '/' + workflow + "LG.graph" + pgs = scratch_loc + '/' + workflow + "PGS.graph" + pgt = scratch_loc + '/' + workflow + "PGT.graph" + pgr = scratch_loc + '/' + workflow + "PG.graph" rmodes = str(rmode.value) @@ -115,8 +115,8 @@ def test_pg_scatter_rerun(self): workflow_loc=graph_loc, scratch_loc=self.temp_out.name) _run_full_workflow(rmode=ReproducibilityFlags.RERUN, workflow=noscatter, workflow_loc=graph_loc, scratch_loc=self.temp_out.name) - pgr_scatter = self.temp_out.name + scatter + "PG.graph" - pgr_noscatter = self.temp_out.name + noscatter + "PG.graph" + pgr_scatter = self.temp_out.name + '/' + scatter + "PG.graph" + pgr_noscatter = self.temp_out.name + '/' + noscatter + "PG.graph" scatter_graph = _read_graph(pgr_scatter) scatter_graph = scatter_graph[0:-1] From 658053171e7d4c218800ecf015754677cf3d2d4a Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 15:35:30 +0800 Subject: [PATCH 238/484] Adds AccumulateXReplicateCompData tests and skips unimplemented tests --- .../reproducibility/test_accumulatedata.py | 544 +++++++++++++----- 1 file changed, 402 insertions(+), 142 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index b78c71ca3..69a896d95 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -39,7 +39,7 @@ def _fill_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', scratch_loc='./'): lgt = workflow_loc + workflow + ".graph" - lgr = scratch_loc + workflow + "LG.graph" + lgr = scratch_loc + '/' + workflow + "LG.graph" rmodes = str(rmode.value) @@ -49,10 +49,10 @@ def _fill_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./' def _run_full_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', scratch_loc='./'): - lgr = scratch_loc + workflow + "LG.graph" - pgs = scratch_loc + workflow + "PGS.graph" - pgt = scratch_loc + workflow + "PGT.graph" - pgr = scratch_loc + workflow + "PG.graph" + lgr = scratch_loc + '/' + workflow + "LG.graph" + pgs = scratch_loc + '/' + workflow + "PGS.graph" + pgt = scratch_loc + '/' + workflow + "PGT.graph" + pgr = scratch_loc + '/' + workflow + "PG.graph" _fill_workflow(rmode, workflow, workflow_loc, scratch_loc) parser = optparse.OptionParser() @@ -124,10 +124,7 @@ class AccumulateLGRerunData(unittest.TestCase): rmode = ReproducibilityFlags.RERUN expected = {} - temp_out = tempfile.TemporaryDirectory('out') - - def _cleanup(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -135,16 +132,16 @@ def _setup(self): _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'files' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'files' + 'LG.graph') self.lg_files_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'groups' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'groups' + 'LG.graph') self.lg_group_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'misc' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'misc' + 'LG.graph') self.lg_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -157,7 +154,6 @@ def test_all_accumulate(self): self.lg_node_data + self.lg_files_data + self.lg_group_data + self.lg_misc_data): hash_data = accumulate_lg_drop_data(drop[1], self.rmode) self.assertEqual(self.expected, dict(hash_data.keys())) - self._cleanup() class AccumulatePGTUnrollRerunData(unittest.TestCase): @@ -168,19 +164,16 @@ class AccumulatePGTUnrollRerunData(unittest.TestCase): """ rmode = ReproducibilityFlags.RERUN - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGS.graph') self.pgs_file_data = json.load(file)[0:-1] file.close() @@ -198,31 +191,30 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) - class AccumulatePGTPartitionRerunData(unittest.TestCase): rmode = ReproducibilityFlags.RERUN - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pgt_file_data = json.load(file)[0:-1] file.close() @@ -240,31 +232,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_partition_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGRerunData(unittest.TestCase): rmode = ReproducibilityFlags.RERUN - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pg_file_data = json.load(file)[0:-1] file.close() @@ -282,12 +274,15 @@ def test_data_accumulate(self): hash_data = accumulate_pg_drop_data(drop[1]) self.assertEqual(expected, dict(hash_data.keys())) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) @@ -353,10 +348,7 @@ class AccumulateLGRepeatData(unittest.TestCase): rmode = ReproducibilityFlags.REPEAT expected = [] - temp_out = tempfile.TemporaryDirectory('out') - - def _cleanup(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -364,16 +356,16 @@ def _setup(self): _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'files' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'files' + 'LG.graph') self.lg_files_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'groups' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'groups' + 'LG.graph') self.lg_group_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'misc' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'misc' + 'LG.graph') self.lg_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -443,7 +435,6 @@ def test_all_accumulate(self): self._memory(self.lg_files_data[0]) self._file(self.lg_files_data[1]) self._ngas(self.lg_files_data[2]) - self._cleanup() class AccumulatePGTUnrollRepeatData(unittest.TestCase): @@ -454,19 +445,16 @@ class AccumulatePGTUnrollRepeatData(unittest.TestCase): """ rmode = ReproducibilityFlags.REPEAT - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGS.graph') self.pgs_file_data = json.load(file)[0:-1] file.close() @@ -484,31 +472,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGTPartitionRepeatData(unittest.TestCase): rmode = ReproducibilityFlags.REPEAT - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pgt_file_data = json.load(file)[0:-1] file.close() @@ -526,31 +514,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_partition_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGRepeatData(unittest.TestCase): rmode = ReproducibilityFlags.REPEAT - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pg_file_data = json.load(file)[0:-1] file.close() @@ -568,12 +556,15 @@ def test_data_accumulate(self): hash_data = accumulate_pg_drop_data(drop[1]) self.assertEqual(expected, dict(hash_data.keys())) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) @@ -639,10 +630,7 @@ class AccumulateLGRecomputeData(unittest.TestCase): rmode = ReproducibilityFlags.RECOMPUTE expected = {} - temp_out = tempfile.TemporaryDirectory('out') - - def _cleanup(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -650,16 +638,16 @@ def _setup(self): _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'files' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'files' + 'LG.graph') self.lg_files_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'groups' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'groups' + 'LG.graph') self.lg_group_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'misc' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'misc' + 'LG.graph') self.lg_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -729,7 +717,6 @@ def test_all_accumulate(self): self._memory(self.lg_files_data[0]) self._file(self.lg_files_data[1]) self._ngas(self.lg_files_data[2]) - self._cleanup() class AccumulatePGTUnrollRecomputeData(unittest.TestCase): @@ -740,19 +727,16 @@ class AccumulatePGTUnrollRecomputeData(unittest.TestCase): """ rmode = ReproducibilityFlags.RECOMPUTE - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGS.graph') self.pgs_file_data = json.load(file)[0:-1] file.close() @@ -770,31 +754,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGTPartitionRecomputeData(unittest.TestCase): rmode = ReproducibilityFlags.RECOMPUTE - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pgt_file_data = json.load(file)[0:-1] file.close() @@ -812,31 +796,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_partition_drop_data(drop[1]) self.assertEqual(expected, list(hash_data.keys())) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGRecomputeData(unittest.TestCase): rmode = ReproducibilityFlags.RECOMPUTE - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pg_file_data = json.load(file)[0:-1] file.close() @@ -854,12 +838,15 @@ def test_data_accumulate(self): hash_data = accumulate_pg_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) @@ -925,10 +912,7 @@ class AccumulateLGReproduceData(unittest.TestCase): rmode = ReproducibilityFlags.REPRODUCE expected = {} - temp_out = tempfile.TemporaryDirectory('out') - - def _cleanup(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -936,16 +920,16 @@ def _setup(self): _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'files' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'files' + 'LG.graph') self.lg_files_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'groups' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'groups' + 'LG.graph') self.lg_group_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'misc' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'misc' + 'LG.graph') self.lg_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -1014,7 +998,6 @@ def test_all_accumulate(self): self._memory(self.lg_files_data[0]) self._file(self.lg_files_data[1]) self._ngas(self.lg_files_data[2]) - self._cleanup() class AccumulatePGTUnrollReproduceData(unittest.TestCase): @@ -1025,19 +1008,16 @@ class AccumulatePGTUnrollReproduceData(unittest.TestCase): """ rmode = ReproducibilityFlags.REPRODUCE - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGS.graph') self.pgs_file_data = json.load(file)[0:-1] file.close() @@ -1055,31 +1035,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGTPartitionReproduceData(unittest.TestCase): rmode = ReproducibilityFlags.REPRODUCE - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pgt_file_data = json.load(file)[0:-1] file.close() @@ -1097,31 +1077,30 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_partition_drop_data(drop[1]) self.assertEqual(expected, list(hash_data.keys())) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) - class AccumulatePGReproduceData(unittest.TestCase): rmode = ReproducibilityFlags.REPRODUCE - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pg_file_data = json.load(file)[0:-1] file.close() @@ -1139,12 +1118,15 @@ def test_data_accumulate(self): hash_data = accumulate_pg_drop_data(drop[1]) self.assertEqual(expected, dict(hash_data.keys())) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) @@ -1210,10 +1192,7 @@ class AccumulateLGReplicateSciData(unittest.TestCase): rmode = ReproducibilityFlags.REPLICATE_SCI expected = {} - temp_out = tempfile.TemporaryDirectory('out') - - def _cleanup(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1221,16 +1200,16 @@ def _setup(self): _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'files' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'files' + 'LG.graph') self.lg_files_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'groups' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'groups' + 'LG.graph') self.lg_group_data = json.load(file)['nodeDataArray'] file.close() - file = open(self.temp_out.name + 'misc' + 'LG.graph') + file = open(self.temp_out.name + '/' + 'misc' + 'LG.graph') self.lg_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -1240,7 +1219,6 @@ def test_all_accumulate(self): self.lg_node_data + self.lg_files_data + self.lg_group_data + self.lg_misc_data): hash_data = accumulate_lg_drop_data(drop[1], self.rmode) self.assertEqual(self.expected, dict(hash_data.keys())) - self._cleanup() class AccumulatePGTUnrollReplicateSciData(unittest.TestCase): @@ -1251,19 +1229,16 @@ class AccumulatePGTUnrollReplicateSciData(unittest.TestCase): """ rmode = ReproducibilityFlags.REPLICATE_SCI - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGS.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGS.graph') self.pgs_file_data = json.load(file)[0:-1] file.close() @@ -1281,31 +1256,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_unroll_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGTPartitionReplicateSciData(unittest.TestCase): rmode = ReproducibilityFlags.REPLICATE_SCI - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pgt_file_data = json.load(file)[0:-1] file.close() @@ -1323,31 +1298,31 @@ def test_data_accumulate(self): hash_data = accumulate_pgt_partition_drop_data(drop[1]) self.assertEqual(expected, hash_data.keys()) + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) class AccumulatePGReplicateSciData(unittest.TestCase): rmode = ReproducibilityFlags.REPLICATE_SCI - temp_out = tempfile.TemporaryDirectory('out') - - def __del__(self): - self.temp_out.cleanup() + temp_out = tempfile.TemporaryDirectory() def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') self.pg_file_data = json.load(file)[0:-1] file.close() @@ -1365,12 +1340,297 @@ def test_data_accumulate(self): hash_data = accumulate_pg_drop_data(drop[1]) self.assertEqual(expected, dict(hash_data.keys())) + @unittest.skip("pg_generator does not like sample graphs") + def test_group_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_control_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulateLGTReplicateCompData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph template level. + """ + + rmode = ReproducibilityFlags.REPLICATE_COMP + expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} + + file = open('reproGraphs/apps.graph') + lgt_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/files.graph') + lgt_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/groups.graph') + lgt_groups_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/misc.graph') + lgt_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def test_app_accumulate(self): + """ + Tests that lgt rerun data is collected for application types + """ + for drop in enumerate(self.lgt_node_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_data_accumulate(self): + """ + Tests that lgt rerun data is collected for file types + """ + for drop in enumerate(self.lgt_files_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_group_accumulate(self): + """ + Tests that lgt rerun data is collected for group types + """ + for drop in enumerate(self.lgt_groups_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_other_accumulate(self): + """ + Tests that lgt rerun data is collected for other types + """ + for drop in enumerate(self.lgt_misc_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + +class AccumulateLGReplicateCompData(unittest.TestCase): + """ + Tests the repeat standard at the logical graph level. + """ + + rmode = ReproducibilityFlags.REPLICATE_COMP + expected = {} + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') + self.lg_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'LG.graph') + self.lg_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + '/' + 'groups' + 'LG.graph') + self.lg_group_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + '/' + 'misc' + 'LG.graph') + self.lg_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def _bash(self, drop): + expected = {'execution_time', 'num_cpus', 'command'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _dynlib(self, drop): + expected = {'execution_time', 'num_cpus', 'libpath'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _mpi(self, drop): + expected = {'execution_time', 'num_cpus', 'num_of_procs'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _docker(self, drop): + expected = {'execution_time', 'num_cpus', 'image', 'command', 'user', 'ensureUserAndSwitch', + 'removeContainer', 'additionalBindings'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _component(self, drop): + expected = {'execution_time', 'num_cpus', 'appclass'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _memory(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _file(self, drop): + expected = {'data_volume', 'check_filepath_exists', 'filepath', 'dirname'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _ngas(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _groupby(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'group_key', 'group_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _scatter(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_copies', 'scatter_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _loop(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_iter'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def test_all_accumulate(self): + self._setup() + self._bash(self.lg_node_data[0]) + self._dynlib(self.lg_node_data[1]) + self._mpi(self.lg_node_data[2]) + self._docker(self.lg_node_data[3]) + self._component(self.lg_node_data[4]) + self._memory(self.lg_files_data[0]) + self._file(self.lg_files_data[1]) + self._ngas(self.lg_files_data[2]) + + +class AccumulatePGTUnrollReplicateCompData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + Can currently only test apps.graph and files.graph, the translator cannot deal with groups + or comments easily. + """ + + rmode = ReproducibilityFlags.REPLICATE_COMP + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') + self.pgs_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'PGS.graph') + self.pgs_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type', 'dt', 'rank'} + self._setup() + for drop in enumerate(self.pgs_node_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage', 'rank'} + self._setup() + for drop in enumerate(self.pgs_file_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + @unittest.skip("pg_generator does not like sample graphs") + def test_group_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_control_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTPartitionReplicateCompData(unittest.TestCase): + rmode = ReproducibilityFlags.REPLICATE_COMP + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') + self.pgt_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') + self.pgt_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type', 'dt', 'rank', 'node', 'island'} + self._setup() + for drop in enumerate(self.pgt_node_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage', 'rank', 'node', 'island'} + self._setup() + for drop in enumerate(self.pgt_file_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + @unittest.skip("pg_generator does not like sample graphs") + def test_group_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_control_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGReplicateCompData(unittest.TestCase): + rmode = ReproducibilityFlags.REPLICATE_COMP + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'PG.graph') + self.pg_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'PG.graph') + self.pg_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'node', 'island'} + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'node', 'island'} + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): self.assertEqual(True, False) + @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): self.assertEqual(True, False) From 446b4e5de768da27a74066abf3fa3441476eef0f Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 15:39:23 +0800 Subject: [PATCH 239/484] Adds AccumulateXReplicateTotalData tests --- .../reproducibility/test_accumulatedata.py | 281 ++++++++++++++++++ 1 file changed, 281 insertions(+) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index 69a896d95..d17080946 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -1635,5 +1635,286 @@ def test_other_accumulate(self): self.assertEqual(True, False) +class AccumulateLGTReplicateTotalData(unittest.TestCase): + """ + Tests the rerun standard at the logical graph template level. + """ + + rmode = ReproducibilityFlags.REPLICATE_TOTAL + expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} + + file = open('reproGraphs/apps.graph') + lgt_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/files.graph') + lgt_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/groups.graph') + lgt_groups_data = json.load(file)['nodeDataArray'] + file.close() + file = open('reproGraphs/misc.graph') + lgt_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def test_app_accumulate(self): + """ + Tests that lgt rerun data is collected for application types + """ + for drop in enumerate(self.lgt_node_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_data_accumulate(self): + """ + Tests that lgt rerun data is collected for file types + """ + for drop in enumerate(self.lgt_files_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_group_accumulate(self): + """ + Tests that lgt rerun data is collected for group types + """ + for drop in enumerate(self.lgt_groups_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + def test_other_accumulate(self): + """ + Tests that lgt rerun data is collected for other types + """ + for drop in enumerate(self.lgt_misc_data): + hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) + self.assertEqual(self.expected, hash_data.keys()) + + +class AccumulateLGReplicateTotalData(unittest.TestCase): + """ + Tests the repeat standard at the logical graph level. + """ + + rmode = ReproducibilityFlags.REPLICATE_TOTAL + expected = [] + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') + self.lg_node_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'LG.graph') + self.lg_files_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + '/' + 'groups' + 'LG.graph') + self.lg_group_data = json.load(file)['nodeDataArray'] + file.close() + file = open(self.temp_out.name + '/' + 'misc' + 'LG.graph') + self.lg_misc_data = json.load(file)['nodeDataArray'] + file.close() + + def _bash(self, drop): + expected = {'execution_time', 'num_cpus', 'command'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _dynlib(self, drop): + expected = {'execution_time', 'num_cpus', 'libpath'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _mpi(self, drop): + expected = {'execution_time', 'num_cpus', 'num_of_procs'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _docker(self, drop): + expected = {'execution_time', 'num_cpus', 'image', 'command', 'user', 'ensureUserAndSwitch', + 'removeContainer', 'additionalBindings'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _component(self, drop): + expected = {'execution_time', 'num_cpus', 'appclass'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _memory(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _file(self, drop): + expected = {'data_volume', 'check_filepath_exists'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _ngas(self, drop): + expected = {'data_volume'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data.keys()) + + def _groupby(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'group_key', 'group_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _scatter(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_copies', 'scatter_axis'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def _loop(self, drop): + expected = {'inputApplicationName', 'inputApplicationType', 'num_of_iter'} + hash_data = accumulate_lg_drop_data(drop, self.rmode) + self.assertEqual(expected, hash_data) + + def test_all_accumulate(self): + self._setup() + self._bash(self.lg_node_data[0]) + self._dynlib(self.lg_node_data[1]) + self._mpi(self.lg_node_data[2]) + self._docker(self.lg_node_data[3]) + self._component(self.lg_node_data[4]) + self._memory(self.lg_files_data[0]) + self._file(self.lg_files_data[1]) + self._ngas(self.lg_files_data[2]) + + +class AccumulatePGTUnrollReplicateTotalData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + Can currently only test apps.graph and files.graph, the translator cannot deal with groups + or comments easily. + """ + + rmode = ReproducibilityFlags.REPLICATE_TOTAL + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') + self.pgs_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'PGS.graph') + self.pgs_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type', 'dt'} + self._setup() + for drop in enumerate(self.pgs_node_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage'} + self._setup() + for drop in enumerate(self.pgs_file_data): + hash_data = accumulate_pgt_unroll_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + @unittest.skip("pg_generator does not like sample graphs") + def test_group_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_control_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGTPartitionReplicateTotalData(unittest.TestCase): + rmode = ReproducibilityFlags.REPLICATE_TOTAL + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') + self.pgt_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') + self.pgt_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {'type', 'dt'} + self._setup() + for drop in enumerate(self.pgt_node_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + def test_data_accumulate(self): + expected = {'type', 'storage'} + self._setup() + for drop in enumerate(self.pgt_file_data): + hash_data = accumulate_pgt_partition_drop_data(drop[1]) + self.assertEqual(expected, hash_data.keys()) + + @unittest.skip("pg_generator does not like sample graphs") + def test_group_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_control_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_other_accumulate(self): + self.assertEqual(True, False) + + +class AccumulatePGReplicateTotalData(unittest.TestCase): + rmode = ReproducibilityFlags.REPLICATE_TOTAL + temp_out = tempfile.TemporaryDirectory() + + def _setup(self): + _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + + file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') + self.pg_node_data = json.load(file)[0:-1] + file.close() + file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') + self.pg_file_data = json.load(file)[0:-1] + file.close() + + def test_app_accumulate(self): + expected = {} + self._setup() + for drop in enumerate(self.pg_node_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, dict(hash_data.keys())) + + def test_data_accumulate(self): + expected = {} + self._setup() + for drop in enumerate(self.pg_file_data): + hash_data = accumulate_pg_drop_data(drop[1]) + self.assertEqual(expected, dict(hash_data.keys())) + + @unittest.skip("pg_generator does not like sample graphs") + def test_group_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_control_accumulate(self): + self.assertEqual(True, False) + + @unittest.skip("pg_generator does not like sample graphs") + def test_other_accumulate(self): + self.assertEqual(True, False) + if __name__ == '__main__': unittest.main() From f867e493b49084ceec99c839bdbaef8ff96585a1 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Mon, 26 Jul 2021 16:56:18 +0800 Subject: [PATCH 240/484] Fixes test_accumulatedata.py for pylint --- .../reproducibility/test_accumulatedata.py | 533 ++++++++++++++++-- 1 file changed, 490 insertions(+), 43 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index d17080946..00fdbe758 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -125,6 +125,10 @@ class AccumulateLGRerunData(unittest.TestCase): rmode = ReproducibilityFlags.RERUN expected = {} temp_out = tempfile.TemporaryDirectory() + lg_node_data = None + lg_files_data = None + lg_group_data = None + lg_misc_data = None def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -165,6 +169,8 @@ class AccumulatePGTUnrollRerunData(unittest.TestCase): rmode = ReproducibilityFlags.RERUN temp_out = tempfile.TemporaryDirectory() + pgs_node_data = None + pgs_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -178,6 +184,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + The the application type matters for rerunning + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgs_node_data): @@ -185,6 +194,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only the storage type matters for rerunning + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgs_file_data): @@ -193,19 +205,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only the drop type and input app type matters for rerunning + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only the drop type matters for rerunning + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Nothing should matter for rerunning + """ self.assertEqual(True, False) + class AccumulatePGTPartitionRerunData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph template level. + """ rmode = ReproducibilityFlags.RERUN temp_out = tempfile.TemporaryDirectory() + pgt_node_data = None + pgt_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -219,6 +246,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only application type matters for rerunning. + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgt_node_data): @@ -226,6 +256,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only storage type matters for rerunning. + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgt_file_data): @@ -234,33 +267,50 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only drop type matters for rerunning. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only drop type matters for rerunning. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Should not matter for rerunning. + """ self.assertEqual(True, False) class AccumulatePGRerunData(unittest.TestCase): + """ + Tests the rerun standard at the physical graph level + """ rmode = ReproducibilityFlags.RERUN temp_out = tempfile.TemporaryDirectory() + pg_node_data = None + pg_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'apps' + 'PG.graph') self.pg_node_data = json.load(file)[0:-1] file.close() - file = open(self.temp_out.name + '/' + 'files' + 'PGT.graph') + file = open(self.temp_out.name + '/' + 'files' + 'PG.graph') self.pg_file_data = json.load(file)[0:-1] file.close() def test_app_accumulate(self): + """ + Nothing matters for rerunning. + """ expected = {} self._setup() for drop in enumerate(self.pg_node_data): @@ -268,6 +318,9 @@ def test_app_accumulate(self): self.assertEqual(expected, dict(hash_data.keys())) def test_data_accumulate(self): + """ + Nothing matters for rerunning. + """ expected = {} self._setup() for drop in enumerate(self.pg_file_data): @@ -276,20 +329,29 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Nothing matters for rerunning. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Nothing matters for rerunning. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Nothing matters for rerunning. + """ self.assertEqual(True, False) class AccumulateLGTRepeatData(unittest.TestCase): """ - Tests the rerun standard at the logical graph template level. + Tests the repeat standard at the logical graph template level. """ rmode = ReproducibilityFlags.REPEAT @@ -310,7 +372,7 @@ class AccumulateLGTRepeatData(unittest.TestCase): def test_app_accumulate(self): """ - Tests that lgt rerun data is collected for application types + Tests that lgt repeat data is collected for application types """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -318,7 +380,7 @@ def test_app_accumulate(self): def test_data_accumulate(self): """ - Tests that lgt rerun data is collected for file types + Tests that lgt repeat data is collected for file types """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -326,7 +388,7 @@ def test_data_accumulate(self): def test_group_accumulate(self): """ - Tests that lgt rerun data is collected for group types + Tests that lgt repeat data is collected for group types """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -334,7 +396,7 @@ def test_group_accumulate(self): def test_other_accumulate(self): """ - Tests that lgt rerun data is collected for other types + Tests that lgt repeat data is collected for other types """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -349,6 +411,10 @@ class AccumulateLGRepeatData(unittest.TestCase): rmode = ReproducibilityFlags.REPEAT expected = [] temp_out = tempfile.TemporaryDirectory() + lg_node_data = None + lg_files_data = None + lg_group_data = None + lg_misc_data = None def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -426,6 +492,9 @@ def _loop(self, drop): self.assertEqual(expected, hash_data) def test_all_accumulate(self): + """ + We make the data expected for each accounted for drop type explicit. + """ self._setup() self._bash(self.lg_node_data[0]) self._dynlib(self.lg_node_data[1]) @@ -439,13 +508,15 @@ def test_all_accumulate(self): class AccumulatePGTUnrollRepeatData(unittest.TestCase): """ - Tests the rerun standard at the physical graph template level. + Tests the repeat standard at the physical graph template level. Can currently only test apps.graph and files.graph, the translator cannot deal with groups or comments easily. """ rmode = ReproducibilityFlags.REPEAT temp_out = tempfile.TemporaryDirectory() + pgs_node_data = None + pgs_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -459,6 +530,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only type matters + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgs_node_data): @@ -466,6 +540,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only type matters + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgs_file_data): @@ -474,20 +551,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) class AccumulatePGTPartitionRepeatData(unittest.TestCase): + """ + Tests the repeat standard at the physical graph template level. + """ rmode = ReproducibilityFlags.REPEAT temp_out = tempfile.TemporaryDirectory() + pgt_node_data = None + pgt_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -501,6 +592,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only type matters when repeating. + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgt_node_data): @@ -508,6 +602,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only type matters when repeating. + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgt_file_data): @@ -516,20 +613,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only type matters when repeating. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only type matters when repeating. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Should not matter when repeating. + """ self.assertEqual(True, False) class AccumulatePGRepeatData(unittest.TestCase): + """ + Tests the repeat standard at the physical graph level + """ rmode = ReproducibilityFlags.REPEAT temp_out = tempfile.TemporaryDirectory() + pg_node_data = None + pg_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -543,6 +654,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Nothing matters for repeating. + """ expected = {} self._setup() for drop in enumerate(self.pg_node_data): @@ -550,6 +664,9 @@ def test_app_accumulate(self): self.assertEqual(expected, dict(hash_data.keys())) def test_data_accumulate(self): + """ + Nothing matters for repeating. + """ expected = {} self._setup() for drop in enumerate(self.pg_file_data): @@ -558,20 +675,29 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Nothing matters for repeating. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Nothing matters for repeating. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulateLGTRecomputeData(unittest.TestCase): """ - Tests the rerun standard at the logical graph template level. + Tests the recompute standard at the logical graph template level. """ rmode = ReproducibilityFlags.RECOMPUTE @@ -592,7 +718,7 @@ class AccumulateLGTRecomputeData(unittest.TestCase): def test_app_accumulate(self): """ - Tests that lgt rerun data is collected for application types + Tests that lgt recompute data is collected for application types """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -600,7 +726,7 @@ def test_app_accumulate(self): def test_data_accumulate(self): """ - Tests that lgt rerun data is collected for file types + Tests that lgt recompute data is collected for file types """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -608,7 +734,7 @@ def test_data_accumulate(self): def test_group_accumulate(self): """ - Tests that lgt rerun data is collected for group types + Tests that lgt recompute data is collected for group types """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -616,7 +742,7 @@ def test_group_accumulate(self): def test_other_accumulate(self): """ - Tests that lgt rerun data is collected for other types + Tests that lgt recompute data is collected for other types """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -625,12 +751,16 @@ def test_other_accumulate(self): class AccumulateLGRecomputeData(unittest.TestCase): """ - Tests the repeat standard at the logical graph level. + Tests the recompute standard at the logical graph level. """ rmode = ReproducibilityFlags.RECOMPUTE expected = {} temp_out = tempfile.TemporaryDirectory() + lg_node_data = None + lg_files_data = None + lg_group_data = None + lg_misc_data = None def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -708,6 +838,9 @@ def _loop(self, drop): self.assertEqual(expected, hash_data) def test_all_accumulate(self): + """ + We make the data expected for each accounted for drop type explicit. + """ self._setup() self._bash(self.lg_node_data[0]) self._dynlib(self.lg_node_data[1]) @@ -721,13 +854,15 @@ def test_all_accumulate(self): class AccumulatePGTUnrollRecomputeData(unittest.TestCase): """ - Tests the rerun standard at the physical graph template level. + Tests the recompute standard at the physical graph template level. Can currently only test apps.graph and files.graph, the translator cannot deal with groups or comments easily. """ rmode = ReproducibilityFlags.RECOMPUTE temp_out = tempfile.TemporaryDirectory() + pgs_node_data = None + pgs_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -741,6 +876,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Type and rank matters. + """ expected = {'type', 'dt', 'rank'} self._setup() for drop in enumerate(self.pgs_node_data): @@ -748,6 +886,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Type and rank matters. + """ expected = {'type', 'storage', 'rank'} self._setup() for drop in enumerate(self.pgs_file_data): @@ -756,20 +897,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Type and rank matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Type and rank matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Should not matter + """ self.assertEqual(True, False) class AccumulatePGTPartitionRecomputeData(unittest.TestCase): + """ + Tests the recompute standard at the physical graph template level. + """ rmode = ReproducibilityFlags.RECOMPUTE temp_out = tempfile.TemporaryDirectory() + pgt_node_data = None + pgt_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -783,6 +938,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Type, rank and machine information matters + """ expected = ['type', 'dt', 'rank', 'node', 'island'] self._setup() for drop in enumerate(self.pgt_node_data): @@ -790,6 +948,9 @@ def test_app_accumulate(self): self.assertEqual(expected, list(hash_data.keys())) def test_data_accumulate(self): + """ + Type, rank and machine information matters + """ expected = ['type', 'storage', 'rank', 'node', 'island'] self._setup() for drop in enumerate(self.pgt_file_data): @@ -798,20 +959,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Type, rank and machine information matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Type, rank and machine information matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Should not matter + """ self.assertEqual(True, False) class AccumulatePGRecomputeData(unittest.TestCase): + """ + Tests the recompute standard at the physical graph level + """ rmode = ReproducibilityFlags.RECOMPUTE temp_out = tempfile.TemporaryDirectory() + pg_node_data = None + pg_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -825,6 +1000,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Machine information matters when recomputing + """ expected = {'node', 'island'} self._setup() for drop in enumerate(self.pg_node_data): @@ -832,6 +1010,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Machine information matters when recomputing + """ expected = {'node', 'island'} self._setup() for drop in enumerate(self.pg_file_data): @@ -840,20 +1021,29 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Machine information matters when recomputing + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Machine information matters when recomputing + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Should not matter. + """ self.assertEqual(True, False) class AccumulateLGTReproduceData(unittest.TestCase): """ - Tests the rerun standard at the logical graph template level. + Tests the reproduce standard at the logical graph template level. """ rmode = ReproducibilityFlags.REPRODUCE @@ -874,7 +1064,7 @@ class AccumulateLGTReproduceData(unittest.TestCase): def test_app_accumulate(self): """ - Tests that lgt rerun data is collected for application types + Tests that lgt reproduce data is collected for application types """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -882,7 +1072,7 @@ def test_app_accumulate(self): def test_data_accumulate(self): """ - Tests that lgt rerun data is collected for file types + Tests that lgt reproduce data is collected for file types """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -890,7 +1080,7 @@ def test_data_accumulate(self): def test_group_accumulate(self): """ - Tests that lgt rerun data is collected for group types + Tests that lgt reproduce data is collected for group types """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -898,7 +1088,7 @@ def test_group_accumulate(self): def test_other_accumulate(self): """ - Tests that lgt rerun data is collected for other types + Tests that lgt reproduce data is collected for other types """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -907,12 +1097,16 @@ def test_other_accumulate(self): class AccumulateLGReproduceData(unittest.TestCase): """ - Tests the repeat standard at the logical graph level. + Tests the reproduce standard at the logical graph level. """ rmode = ReproducibilityFlags.REPRODUCE expected = {} temp_out = tempfile.TemporaryDirectory() + lg_node_data = None + lg_files_data = None + lg_group_data = None + lg_misc_data = None def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -989,6 +1183,9 @@ def _loop(self, drop): self.assertEqual(expected, dict(hash_data.keys())) def test_all_accumulate(self): + """ + We make the data expected for each accounted for drop type explicit. + """ self._setup() self._bash(self.lg_node_data[0]) self._dynlib(self.lg_node_data[1]) @@ -1002,13 +1199,15 @@ def test_all_accumulate(self): class AccumulatePGTUnrollReproduceData(unittest.TestCase): """ - Tests the rerun standard at the physical graph template level. + Tests the reproduce standard at the physical graph template level. Can currently only test apps.graph and files.graph, the translator cannot deal with groups or comments easily. """ rmode = ReproducibilityFlags.REPRODUCE temp_out = tempfile.TemporaryDirectory() + pgs_node_data = None + pgs_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1022,6 +1221,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only type matters + """ expected = {'type'} self._setup() for drop in enumerate(self.pgs_node_data): @@ -1029,6 +1231,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only type matters + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgs_file_data): @@ -1037,20 +1242,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulatePGTPartitionReproduceData(unittest.TestCase): + """ + Tests the reproduce standard at the physical graph template level. + """ rmode = ReproducibilityFlags.REPRODUCE temp_out = tempfile.TemporaryDirectory() + pgt_node_data = None + pgt_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1064,6 +1283,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only type matters + """ expected = ['type'] self._setup() for drop in enumerate(self.pgt_node_data): @@ -1071,6 +1293,9 @@ def test_app_accumulate(self): self.assertEqual(expected, list(hash_data.keys())) def test_data_accumulate(self): + """ + Only type matters + """ expected = ['type', 'storage'] self._setup() for drop in enumerate(self.pgt_file_data): @@ -1079,19 +1304,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) + class AccumulatePGReproduceData(unittest.TestCase): + """ + Tests the reproduce standard at the physical graph level + """ rmode = ReproducibilityFlags.REPRODUCE temp_out = tempfile.TemporaryDirectory() + pg_node_data = None + pg_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1105,6 +1345,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + App information does not matter when reproducing + """ expected = {} self._setup() for drop in enumerate(self.pg_node_data): @@ -1112,6 +1355,9 @@ def test_app_accumulate(self): self.assertEqual(expected, dict(hash_data.keys())) def test_data_accumulate(self): + """ + Only data information matters, not the type of drop + """ expected = {} self._setup() for drop in enumerate(self.pg_file_data): @@ -1120,20 +1366,29 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Group information does not matter when reproducing + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Control information does not matter when reproducing + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulateLGTReplicateSciData(unittest.TestCase): """ - Tests the rerun standard at the logical graph template level. + Tests the replicate-sci standard at the logical graph template level. """ rmode = ReproducibilityFlags.REPLICATE_SCI @@ -1154,7 +1409,7 @@ class AccumulateLGTReplicateSciData(unittest.TestCase): def test_app_accumulate(self): """ - Tests that lgt rerun data is collected for application types + Tests that lgt replicate-sci data is collected for application types """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1162,7 +1417,7 @@ def test_app_accumulate(self): def test_data_accumulate(self): """ - Tests that lgt rerun data is collected for file types + Tests that lgt replicate-sci data is collected for file types """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1170,7 +1425,7 @@ def test_data_accumulate(self): def test_group_accumulate(self): """ - Tests that lgt rerun data is collected for group types + Tests that lgt replicate-sci data is collected for group types """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1178,7 +1433,7 @@ def test_group_accumulate(self): def test_other_accumulate(self): """ - Tests that lgt rerun data is collected for other types + Tests that lgt replicate-sci data is collected for other types """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1187,12 +1442,16 @@ def test_other_accumulate(self): class AccumulateLGReplicateSciData(unittest.TestCase): """ - Tests the repeat standard at the logical graph level. + Tests the replicate-sci standard at the logical graph level. """ rmode = ReproducibilityFlags.REPLICATE_SCI expected = {} temp_out = tempfile.TemporaryDirectory() + lg_node_data = None + lg_files_data = None + lg_group_data = None + lg_misc_data = None def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1214,6 +1473,9 @@ def _setup(self): file.close() def test_all_accumulate(self): + """ + Similar to rerunning. Nothing matters + """ self._setup() for drop in enumerate( self.lg_node_data + self.lg_files_data + self.lg_group_data + self.lg_misc_data): @@ -1223,13 +1485,15 @@ def test_all_accumulate(self): class AccumulatePGTUnrollReplicateSciData(unittest.TestCase): """ - Tests the rerun standard at the physical graph template level. + Tests the replicate-sci standard at the physical graph template level. Can currently only test apps.graph and files.graph, the translator cannot deal with groups or comments easily. """ rmode = ReproducibilityFlags.REPLICATE_SCI temp_out = tempfile.TemporaryDirectory() + pgs_node_data = None + pgs_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1243,6 +1507,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only type matters + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgs_node_data): @@ -1250,6 +1517,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only type matters + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgs_file_data): @@ -1258,20 +1528,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulatePGTPartitionReplicateSciData(unittest.TestCase): + """ + Tests the replicate-sci standard at the physical graph template level. + """ rmode = ReproducibilityFlags.REPLICATE_SCI temp_out = tempfile.TemporaryDirectory() + pgt_node_data = None + pgt_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1285,6 +1569,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only type matters + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgt_node_data): @@ -1292,6 +1579,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only type matters + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgt_file_data): @@ -1300,20 +1590,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulatePGReplicateSciData(unittest.TestCase): + """ + Tests the replicate-sci standard at the physical graph level + """ rmode = ReproducibilityFlags.REPLICATE_SCI temp_out = tempfile.TemporaryDirectory() + pg_node_data = None + pg_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1327,6 +1631,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Nothing matters. + """ expected = {} self._setup() for drop in enumerate(self.pg_node_data): @@ -1334,6 +1641,9 @@ def test_app_accumulate(self): self.assertEqual(expected, dict(hash_data.keys())) def test_data_accumulate(self): + """ + Nothing matters. + """ expected = {} self._setup() for drop in enumerate(self.pg_node_data): @@ -1342,20 +1652,29 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Nothing matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Nothing matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter. + """ self.assertEqual(True, False) class AccumulateLGTReplicateCompData(unittest.TestCase): """ - Tests the rerun standard at the logical graph template level. + Tests the replicate-comp standard at the logical graph template level. """ rmode = ReproducibilityFlags.REPLICATE_COMP @@ -1376,7 +1695,7 @@ class AccumulateLGTReplicateCompData(unittest.TestCase): def test_app_accumulate(self): """ - Tests that lgt rerun data is collected for application types + Tests that lgt replicate-comp data is collected for application types """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1384,7 +1703,7 @@ def test_app_accumulate(self): def test_data_accumulate(self): """ - Tests that lgt rerun data is collected for file types + Tests that lgt replicate-comp data is collected for file types """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1392,7 +1711,7 @@ def test_data_accumulate(self): def test_group_accumulate(self): """ - Tests that lgt rerun data is collected for group types + Tests that lgt replicate-comp data is collected for group types """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1400,7 +1719,7 @@ def test_group_accumulate(self): def test_other_accumulate(self): """ - Tests that lgt rerun data is collected for other types + Tests that lgt replicate-comp data is collected for other types """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1409,12 +1728,16 @@ def test_other_accumulate(self): class AccumulateLGReplicateCompData(unittest.TestCase): """ - Tests the repeat standard at the logical graph level. + Tests the replicate-comp standard at the logical graph level. """ rmode = ReproducibilityFlags.REPLICATE_COMP expected = {} temp_out = tempfile.TemporaryDirectory() + lg_node_data = None + lg_files_data = None + lg_group_data = None + lg_misc_data = None def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1492,6 +1815,9 @@ def _loop(self, drop): self.assertEqual(expected, hash_data) def test_all_accumulate(self): + """ + We make the data expected for each accounted for drop type explicit. + """ self._setup() self._bash(self.lg_node_data[0]) self._dynlib(self.lg_node_data[1]) @@ -1505,13 +1831,15 @@ def test_all_accumulate(self): class AccumulatePGTUnrollReplicateCompData(unittest.TestCase): """ - Tests the rerun standard at the physical graph template level. + Tests the replicate-comp standard at the physical graph template level. Can currently only test apps.graph and files.graph, the translator cannot deal with groups or comments easily. """ rmode = ReproducibilityFlags.REPLICATE_COMP temp_out = tempfile.TemporaryDirectory() + pgs_node_data = None + pgs_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1525,6 +1853,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Type and rank matter + """ expected = {'type', 'dt', 'rank'} self._setup() for drop in enumerate(self.pgs_node_data): @@ -1532,6 +1863,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Type and rank matter + """ expected = {'type', 'storage', 'rank'} self._setup() for drop in enumerate(self.pgs_file_data): @@ -1540,20 +1874,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Type and rank matter + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Type and rank matter + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulatePGTPartitionReplicateCompData(unittest.TestCase): + """ + Tests the replicate-comp standard at the physical graph template level. + """ rmode = ReproducibilityFlags.REPLICATE_COMP temp_out = tempfile.TemporaryDirectory() + pgt_node_data = None + pgt_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1567,6 +1915,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Type, rank and machine information matters. + """ expected = {'type', 'dt', 'rank', 'node', 'island'} self._setup() for drop in enumerate(self.pgt_node_data): @@ -1574,6 +1925,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Type, rank and machine information matters. + """ expected = {'type', 'storage', 'rank', 'node', 'island'} self._setup() for drop in enumerate(self.pgt_file_data): @@ -1582,20 +1936,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Type, rank and machine information matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Type, rank and machine information matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulatePGReplicateCompData(unittest.TestCase): + """ + Tests the replicate-comp standard at the physical graph level + """ rmode = ReproducibilityFlags.REPLICATE_COMP temp_out = tempfile.TemporaryDirectory() + pg_node_data = None + pg_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1609,6 +1977,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Machine information matters. + """ expected = {'node', 'island'} self._setup() for drop in enumerate(self.pg_node_data): @@ -1616,6 +1987,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Machine information matters. + """ expected = {'node', 'island'} self._setup() for drop in enumerate(self.pg_node_data): @@ -1624,20 +1998,29 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Machine information matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Machine information matters. + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter. + """ self.assertEqual(True, False) class AccumulateLGTReplicateTotalData(unittest.TestCase): """ - Tests the rerun standard at the logical graph template level. + Tests the replicate-total standard at the logical graph template level. """ rmode = ReproducibilityFlags.REPLICATE_TOTAL @@ -1658,7 +2041,7 @@ class AccumulateLGTReplicateTotalData(unittest.TestCase): def test_app_accumulate(self): """ - Tests that lgt rerun data is collected for application types + Tests that lgt replicate-total data is collected for application types """ for drop in enumerate(self.lgt_node_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1666,7 +2049,7 @@ def test_app_accumulate(self): def test_data_accumulate(self): """ - Tests that lgt rerun data is collected for file types + Tests that lgt replicate-total data is collected for file types """ for drop in enumerate(self.lgt_files_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1674,7 +2057,7 @@ def test_data_accumulate(self): def test_group_accumulate(self): """ - Tests that lgt rerun data is collected for group types + Tests that lgt replicate-total data is collected for group types """ for drop in enumerate(self.lgt_groups_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1682,7 +2065,7 @@ def test_group_accumulate(self): def test_other_accumulate(self): """ - Tests that lgt rerun data is collected for other types + Tests that lgt replicate-total data is collected for other types """ for drop in enumerate(self.lgt_misc_data): hash_data = accumulate_lgt_drop_data(drop[1], self.rmode) @@ -1691,12 +2074,16 @@ def test_other_accumulate(self): class AccumulateLGReplicateTotalData(unittest.TestCase): """ - Tests the repeat standard at the logical graph level. + Tests the replicate-total standard at the logical graph level. """ rmode = ReproducibilityFlags.REPLICATE_TOTAL expected = [] temp_out = tempfile.TemporaryDirectory() + lg_node_data = None + lg_files_data = None + lg_group_data = None + lg_misc_data = None def _setup(self): _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1774,6 +2161,9 @@ def _loop(self, drop): self.assertEqual(expected, hash_data) def test_all_accumulate(self): + """ + We make the data expected for each accounted for drop type explicit. + """ self._setup() self._bash(self.lg_node_data[0]) self._dynlib(self.lg_node_data[1]) @@ -1787,13 +2177,15 @@ def test_all_accumulate(self): class AccumulatePGTUnrollReplicateTotalData(unittest.TestCase): """ - Tests the rerun standard at the physical graph template level. + Tests the replicate-total standard at the physical graph template level. Can currently only test apps.graph and files.graph, the translator cannot deal with groups or comments easily. """ rmode = ReproducibilityFlags.REPLICATE_TOTAL temp_out = tempfile.TemporaryDirectory() + pgs_node_data = None + pgs_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1807,6 +2199,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Type matters + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgs_node_data): @@ -1814,6 +2209,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Type matters + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgs_file_data): @@ -1822,20 +2220,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulatePGTPartitionReplicateTotalData(unittest.TestCase): + """ + Tests the replicate-total standard at the physical graph template level. + """ rmode = ReproducibilityFlags.REPLICATE_TOTAL temp_out = tempfile.TemporaryDirectory() + pgt_node_data = None + pgt_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1849,6 +2261,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Only type matters + """ expected = {'type', 'dt'} self._setup() for drop in enumerate(self.pgt_node_data): @@ -1856,6 +2271,9 @@ def test_app_accumulate(self): self.assertEqual(expected, hash_data.keys()) def test_data_accumulate(self): + """ + Only type matters + """ expected = {'type', 'storage'} self._setup() for drop in enumerate(self.pgt_file_data): @@ -1864,20 +2282,34 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Only type matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) class AccumulatePGReplicateTotalData(unittest.TestCase): + """ + Tests the replicate-total standard at the physical graph level + """ rmode = ReproducibilityFlags.REPLICATE_TOTAL temp_out = tempfile.TemporaryDirectory() + pg_node_data = None + pg_file_data = None def _setup(self): _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) @@ -1891,6 +2323,9 @@ def _setup(self): file.close() def test_app_accumulate(self): + """ + Nothing matters + """ expected = {} self._setup() for drop in enumerate(self.pg_node_data): @@ -1898,6 +2333,9 @@ def test_app_accumulate(self): self.assertEqual(expected, dict(hash_data.keys())) def test_data_accumulate(self): + """ + Nothing matters + """ expected = {} self._setup() for drop in enumerate(self.pg_file_data): @@ -1906,14 +2344,23 @@ def test_data_accumulate(self): @unittest.skip("pg_generator does not like sample graphs") def test_group_accumulate(self): + """ + Nothing matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_control_accumulate(self): + """ + Nothing matters + """ self.assertEqual(True, False) @unittest.skip("pg_generator does not like sample graphs") def test_other_accumulate(self): + """ + Does not matter + """ self.assertEqual(True, False) if __name__ == '__main__': From c68ca4d4e989765bc1c6d6d746c3af4a7b7fae9c Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 28 Jul 2021 10:36:18 +0800 Subject: [PATCH 241/484] Adds integration tests for HelloWorld example - all rmodes down to Physical Graph. --- .../reproGraphs/HelloSBash.graph | 272 ++++++++++++++++++ .../reproGraphs/HelloSPython.graph | 272 ++++++++++++++++++ .../reproGraphs/HelloSPython2.graph | 272 ++++++++++++++++++ .../reproGraphs/HelloWorldBash.graph | 272 ++++++++++++++++++ .../reproGraphs/HelloWorldFile.graph | 73 +++++ .../test/reproducibility/test_integration.py | 270 ++++++++++++++++- 6 files changed, 1420 insertions(+), 11 deletions(-) create mode 100644 daliuge-engine/test/reproducibility/reproGraphs/HelloSBash.graph create mode 100644 daliuge-engine/test/reproducibility/reproGraphs/HelloSPython.graph create mode 100644 daliuge-engine/test/reproducibility/reproGraphs/HelloSPython2.graph create mode 100644 daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBash.graph create mode 100644 daliuge-engine/test/reproducibility/reproGraphs/HelloWorldFile.graph diff --git a/daliuge-engine/test/reproducibility/reproGraphs/HelloSBash.graph b/daliuge-engine/test/reproducibility/reproGraphs/HelloSBash.graph new file mode 100644 index 000000000..bf7ada046 --- /dev/null +++ b/daliuge-engine/test/reproducibility/reproGraphs/HelloSBash.graph @@ -0,0 +1,272 @@ +{ + "linkDataArray": [ + { + "from": -3, + "fromPort": "3o1", + "to": -1, + "toPort": "1i1" + }, + { + "from": -1, + "fromPort": "1o1", + "to": -4, + "toPort": "4i1" + }, + { + "from": -4, + "fromPort": "4o1", + "to": -2, + "toPort": "2i1" + } + ], + "modelData": { + "filePath": "HelloSBash.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result2.in" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "1i1", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -1, + "loc": "464 225", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "1o1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.out" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "2i1", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -2, + "loc": "993 208", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "echo -en 'world' > %o0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -3, + "loc": "86 220", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "3o1", + "IdText": "event" + } + ], + "streaming": true, + "subject": null, + "text": "Bash Shell App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "echo -en 'Hello' $(<%i0) > %o0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "4i1", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -4, + "loc": "680 194", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "4o1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Bash Shell App" + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/reproGraphs/HelloSPython.graph b/daliuge-engine/test/reproducibility/reproGraphs/HelloSPython.graph new file mode 100644 index 000000000..95ceb6301 --- /dev/null +++ b/daliuge-engine/test/reproducibility/reproGraphs/HelloSPython.graph @@ -0,0 +1,272 @@ +{ + "linkDataArray": [ + { + "from": -3, + "fromPort": "eea002c3-faea-421b-9e34-83cf95e833b1", + "to": -4, + "toPort": "9fe60c54-cacb-44db-ac9e-55ad85251cdc" + }, + { + "from": -1, + "fromPort": "eea002c3-faea-421b-9e34-83cf95e833b1", + "to": -2, + "toPort": "af373c7c-69fa-48e3-aabb-237820a5aa8a" + }, + { + "from": -2, + "fromPort": "b7c5d542-ceb9-4d1c-8784-bb43c1ec782a", + "to": -3, + "toPort": "e5fdd402-c9c6-4e1c-a288-aec1d7d9737c" + } + ], + "modelData": { + "filePath": "HelloSPython.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Component", + "categoryType": "Application", + "collapsed": false, + "colour": "#3498DB", + "description": "An application component in the form of a Python app", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "appclass", + "text": "Appclass", + "value": "dlg.common.reproducibility.apps.HelloWorldPythonIn" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -1, + "loc": "369 109", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "eea002c3-faea-421b-9e34-83cf95e833b1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Python App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.in" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "af373c7c-69fa-48e3-aabb-237820a5aa8a", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -2, + "loc": "688 109", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "b7c5d542-ceb9-4d1c-8784-bb43c1ec782a", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Component", + "categoryType": "Application", + "collapsed": false, + "colour": "#3498DB", + "description": "An application component in the form of a Python app", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "appclass", + "text": "Appclass", + "value": "dlg.common.reproducibility.apps.HelloWorldPythonOut" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e5fdd402-c9c6-4e1c-a288-aec1d7d9737c", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "loc": "977 110", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "eea002c3-faea-421b-9e34-83cf95e833b1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Python App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "0" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.out" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "9fe60c54-cacb-44db-ac9e-55ad85251cdc", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -4, + "loc": "1291 111", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "File" + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/reproGraphs/HelloSPython2.graph b/daliuge-engine/test/reproducibility/reproGraphs/HelloSPython2.graph new file mode 100644 index 000000000..f0c01fa1f --- /dev/null +++ b/daliuge-engine/test/reproducibility/reproGraphs/HelloSPython2.graph @@ -0,0 +1,272 @@ +{ + "linkDataArray": [ + { + "from": -3, + "fromPort": "eea002c3-faea-421b-9e34-83cf95e833b1", + "to": -4, + "toPort": "9fe60c54-cacb-44db-ac9e-55ad85251cdc" + }, + { + "from": -1, + "fromPort": "eea002c3-faea-421b-9e34-83cf95e833b1", + "to": -2, + "toPort": "af373c7c-69fa-48e3-aabb-237820a5aa8a" + }, + { + "from": -2, + "fromPort": "b7c5d542-ceb9-4d1c-8784-bb43c1ec782a", + "to": -3, + "toPort": "e5fdd402-c9c6-4e1c-a288-aec1d7d9737c" + } + ], + "modelData": { + "filePath": "HelloSPython.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Component", + "categoryType": "Application", + "collapsed": false, + "colour": "#3498DB", + "description": "An application component in the form of a Python app", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "appclass", + "text": "Appclass", + "value": "dlg.common.reproducibility.apps.HelloWorldPythonIn" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -1, + "loc": "369 109", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "eea002c3-faea-421b-9e34-83cf95e833b1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Python App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "alternate.in" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "af373c7c-69fa-48e3-aabb-237820a5aa8a", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -2, + "loc": "688 109", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "b7c5d542-ceb9-4d1c-8784-bb43c1ec782a", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "Component", + "categoryType": "Application", + "collapsed": false, + "colour": "#3498DB", + "description": "An application component in the form of a Python app", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "appclass", + "text": "Appclass", + "value": "dlg.common.reproducibility.apps.HelloWorldPythonOut" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "e5fdd402-c9c6-4e1c-a288-aec1d7d9737c", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -3, + "loc": "977 110", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "eea002c3-faea-421b-9e34-83cf95e833b1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Python App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "0" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.out" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "9fe60c54-cacb-44db-ac9e-55ad85251cdc", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -4, + "loc": "1291 111", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "File" + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBash.graph b/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBash.graph new file mode 100644 index 000000000..2f090edfb --- /dev/null +++ b/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBash.graph @@ -0,0 +1,272 @@ +{ + "linkDataArray": [ + { + "from": -3, + "fromPort": "3o1", + "to": -1, + "toPort": "1i1" + }, + { + "from": -1, + "fromPort": "1o1", + "to": -4, + "toPort": "4i1" + }, + { + "from": -4, + "fromPort": "4o1", + "to": -2, + "toPort": "2i1" + } + ], + "modelData": { + "filePath": "HelloWorldBash.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.in" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "1i1", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -1, + "loc": "538 309", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "1o1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.out" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "2i1", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -2, + "loc": "814 477", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "echo -en 'Hello world' > %o0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -3, + "loc": "222 343", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "3o1", + "IdText": "event" + } + ], + "streaming": true, + "subject": null, + "text": "Bash Shell App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "cp %i0 %o0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "4i1", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -4, + "loc": "684 176", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "4o1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Bash Shell App" + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldFile.graph b/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldFile.graph new file mode 100644 index 000000000..92dc0838e --- /dev/null +++ b/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldFile.graph @@ -0,0 +1,73 @@ +{ + "linkDataArray": [], + "modelData": { + "filePath": "HelloWorldFile.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.out" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": true, + "isGroup": false, + "key": -1, + "loc": "658 195", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "ad058285-1989-4e76-8133-9e1d1c830251", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "File" + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/test_integration.py b/daliuge-engine/test/reproducibility/test_integration.py index 0dde4484f..79db3c6ba 100644 --- a/daliuge-engine/test/reproducibility/test_integration.py +++ b/daliuge-engine/test/reproducibility/test_integration.py @@ -35,13 +35,12 @@ def _run_full_workflow(rmode: ReproducibilityFlags, workflow: str, workflow_loc='./', scratch_loc='./'): lgt = workflow_loc + '/' + workflow + ".graph" - lgr = scratch_loc + '/' + workflow + "LG.graph" - pgs = scratch_loc + '/' + workflow + "PGS.graph" - pgt = scratch_loc + '/' + workflow + "PGT.graph" - pgr = scratch_loc + '/' + workflow + "PG.graph" + lgr = scratch_loc + '/' + workflow + "_" + str(rmode.value) + "LG.graph" + pgs = scratch_loc + '/' + workflow + "_" + str(rmode.value) + "PGS.graph" + pgt = scratch_loc + '/' + workflow + "_" + str(rmode.value) + "PGT.graph" + pgr = scratch_loc + '/' + workflow + "_" + str(rmode.value) + "PG.graph" rmodes = str(rmode.value) - parser = optparse.OptionParser() dlg_fill(parser, ['-L', lgt, '-R', rmodes, '-o', lgr, '-f', 'newline']) parser = optparse.OptionParser() @@ -66,9 +65,6 @@ class IntegrationNothingTest(unittest.TestCase): """ temp_out = tempfile.TemporaryDirectory('out') - def _cleanup(self): - self.temp_out.cleanup() - def test_computation_sandwich(self): """ Opens a simple computationSandwich graph in a temporary directory @@ -76,9 +72,10 @@ def test_computation_sandwich(self): """ graph_name = 'computationSandwich' graph_loc = 'topoGraphs/' - _run_full_workflow(rmode=ReproducibilityFlags.NOTHING, workflow=graph_name, + rmode = ReproducibilityFlags.NOTHING + _run_full_workflow(rmode=rmode, workflow=graph_name, workflow_loc=graph_loc, scratch_loc=self.temp_out.name) - pgr = self.temp_out.name + '/' + graph_name + "PG.graph" + pgr = self.temp_out.name + '/' + graph_name + "_" + str(rmode.value) + "PG.graph" graph = _read_graph(pgr) graph = graph[0:-1] @@ -88,4 +85,255 @@ def test_computation_sandwich(self): self.assertIsNone(drop['reprodata']['lg_data']['merkleroot']) self.assertIsNone(drop['reprodata']['pgt_data']['merkleroot']) self.assertIsNone(drop['reprodata']['pg_data']['merkleroot']) - self._cleanup() + + +class IntegrationHelloWorldTest(unittest.TestCase): + """ + An example running multiple 'hello world' style workflows, comparing their hash-values. + This test is the first actual reproducibility test. + + For now, until I can find a way to launch a daliuge from the test and shut it down when finished + we will just go to the physical graph level. + Until that point arrives, it will be difficult to test Reproduce and beyond fairly. + TODO: Actually run full graphs as a test. + + We initalize the test by processing every graph for every level tested. + + HelloSPython and HelloSPython2 differ only in their input file arguments. + + """ + temp_out = tempfile.TemporaryDirectory('out') + graph_loc = 'reproGraphs/' + graphs = {'HelloWorldBash': {}, 'HelloSBash': {}, 'HelloWorldFile': {}, 'HelloSPython': {}, + 'HelloSPython2': {}} + + def _process_graphs(self, rmode: ReproducibilityFlags): + for graph in list(self.graphs.keys()): + _run_full_workflow(rmode=rmode, workflow=graph, + workflow_loc=self.graph_loc, scratch_loc=self.temp_out.name) + self.graphs[graph][rmode.value] = \ + _read_graph(self.temp_out.name + '/' + graph + '_' + str( + rmode.value) + 'PG.graph')[-1]['signature'] + + def test_integration_rerun(self): + """ + Compares the four hello world graphs by their signatures when rerunning + HelloWorldBash RR-> HelloSBash + HelloWorldBash !RR-> HelloWorldFile + HelloWorldBash !RR-> HelloSPython + HelloSBash !RR-> HelloWorldFile + HelloSBash !RR-> HelloSPython + HelloWorldFile !RR-> HelloSPython + HelloSPython RR-> HelloSPython2 + """ + rmode = ReproducibilityFlags.RERUN + self._process_graphs(rmode) + self.assertEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSBash'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldFile'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertEqual(self.graphs['HelloSPython'][rmode.value], + self.graphs['HelloSPython2'][rmode.value]) + + def test_integration_repeat(self): + """ + Compares the four hello world graphs by their signatures when repeating + HelloWorldBash !RT-> HelloSBash + HelloWorldBash !RT-> HelloWorldFile + HelloWorldBash !RT-> HelloSPython + HelloSBash !RT-> HelloWorldFile + HelloSBash !RT-> HelloSPython + HelloWorldFile !RT-> HelloSPython + HelloSPython RT-> HelloSPython2 + """ + rmode = ReproducibilityFlags.REPEAT + self._process_graphs(rmode) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSBash'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldFile'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertEqual(self.graphs['HelloSPython'][rmode.value], + self.graphs['HelloSPython2'][rmode.value]) + + def test_integration_recompute(self): + """ + Compares the four hello world graphs by their signatures when recomputing + HelloWorldBash !RC-> HelloSBash + HelloWorldBash !RC-> HelloWorldFile + HelloWorldBash !RC-> HelloSPython + HelloSBash !RC-> HelloWorldFile + HelloSBash !RC-> HelloSPython + HelloWorldFile !RC-> HelloSPython + HelloSPython !RC-> HelloSPython2 + """ + rmode = ReproducibilityFlags.RECOMPUTE + self._process_graphs(rmode) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSBash'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldFile'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSPython'][rmode.value], + self.graphs['HelloSPython2'][rmode.value]) + + def test_integration_reproduce(self): + """ + Compares the four hello world graphs by their signatures when reproducing + HelloWorldBash RP-> HelloSBash + HelloWorldBash !RP-> HelloWorldFile + HelloWorldBash RP-> HelloSPython + HelloSBash !RP-> HelloWorldFile + HelloSBash RP-> HelloSPython + HelloWorldFile !RP-> HelloSPython + HelloSPython RP-> HelloSPython2 + + HelloWorldFile is different to all others since it is a single file, the others have an + input and output file. + HelloSPython and HelloSPython2 differ in input filename only + """ + rmode = ReproducibilityFlags.REPRODUCE + self._process_graphs(rmode) + self.assertEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSBash'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + + self.assertEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldFile'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertEqual(self.graphs['HelloSPython'][rmode.value], + self.graphs['HelloSPython2'][rmode.value]) + + def test_integration_replicate_sci(self): + """ + Compares the four hello world graphs by their signatures when replicating scientifically + HelloWorldBash RPLS-> HelloSBash + HelloWorldBash !RPLS-> HelloWorldFile + HelloWorldBash !RPLS-> HelloSPython + HelloSBash !RPLS-> HelloWorldFile + HelloSBash !RPLS-> HelloSPython + HelloWorldFile !RPLS-> HelloSPython + HelloSPython RPLS-> HelloSPython2 + """ + rmode = ReproducibilityFlags.REPLICATE_SCI + self._process_graphs(rmode) + self.assertEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSBash'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldFile'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertEqual(self.graphs['HelloSPython'][rmode.value], + self.graphs['HelloSPython2'][rmode.value]) + + def test_integration_replicate_comp(self): + """ + Compares the four hello world graphs by their signatures when replicating computationally + HelloWorldBash !RPLC-> HelloSBash + HelloWorldBash !RPLC-> HelloWorldFile + HelloWorldBash !RPLC-> HelloSPython + HelloSBash !RPLC-> HelloWorldFile + HelloSBash !RPLC-> HelloSPython + HelloWorldFile !RPLC-> HelloSPython + HelloSPython !RPLC-> HelloSPython2 + """ + rmode = ReproducibilityFlags.REPLICATE_COMP + self._process_graphs(rmode) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSBash'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldFile'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSPython'][rmode.value], + self.graphs['HelloSPython2'][rmode.value]) + + def test_integration_replicate_total(self): + """ + Compares the four hello world graphs by their signatures when replicating totally + HelloWorldBash !RPLT-> HelloSBash + HelloWorldBash !RPLT-> HelloWorldFile + HelloWorldBash !RPLT-> HelloSPython + HelloSBash !RPLT-> HelloWorldFile + HelloSBash !RPLT-> HelloSPython + HelloWorldFile !RPLT-> HelloSPython + HelloSPython RPLT-> HelloSPython2 + """ + rmode = ReproducibilityFlags.REPLICATE_TOTAL + self._process_graphs(rmode) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSBash'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloWorldBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloWorldFile'][rmode.value]) + self.assertNotEqual(self.graphs['HelloSBash'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertNotEqual(self.graphs['HelloWorldFile'][rmode.value], + self.graphs['HelloSPython'][rmode.value]) + + self.assertEqual(self.graphs['HelloSPython'][rmode.value], + self.graphs['HelloSPython2'][rmode.value]) From 2e9dfaf5a36e1c45006735ab80b0590a6d5fd243 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 28 Jul 2021 10:43:15 +0800 Subject: [PATCH 242/484] Style changes to reproducibility tests for pylint score. --- .../test/reproducibility/test_drophash.py | 73 ++++++++++--------- .../test/reproducibility/test_pg_blockdag.py | 8 +- 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_drophash.py b/daliuge-engine/test/reproducibility/test_drophash.py index be9df517f..7d44d1b48 100644 --- a/daliuge-engine/test/reproducibility/test_drophash.py +++ b/daliuge-engine/test/reproducibility/test_drophash.py @@ -32,57 +32,60 @@ from merklelib import MerkleTree -class RerunHashTests(unittest.TestCase): +class AbstractDROPHashTests(unittest.TestCase): + """ + Tests the reprodata generation methods of the AbstractDROP class + """ def test_null_merkleroot(self): """ Sanity check that the default MerkleRoot of an abstract drop is Null Consider it a cardinal sin to change this. """ - a = AbstractDROP('a', 'a') - self.assertIsNone(a.merkleroot) + drop_a = AbstractDROP('a', 'a') + self.assertIsNone(drop_a.merkleroot) def test_generate_rerun_data(self): """ Tests that completed Rerun data contains the completed flag. """ - a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproducibilityFlags.RERUN - a.setCompleted() - self.assertEqual(a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) + drop_a = AbstractDROP('a', 'a') + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + drop_a.setCompleted() + self.assertEqual(drop_a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) def test_commit_on_complete(self): """ Tests that merkle_data is generated upon set_complete status and is correct (NOTHING, RERUN) """ - a = AbstractDROP('a', 'a') - b = AbstractDROP('b', 'b') - a.reproducibility_level = ReproducibilityFlags.RERUN - b.reproducibility_level = ReproducibilityFlags.NOTHING - self.assertIsNone(a.merkleroot) - self.assertIsNone(b.merkleroot) + drop_a = AbstractDROP('a', 'a') + drop_b = AbstractDROP('b', 'b') + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + drop_b.reproducibility_level = ReproducibilityFlags.NOTHING + self.assertIsNone(drop_a.merkleroot) + self.assertIsNone(drop_b.merkleroot) # Test RERUN - a.setCompleted() + drop_a.setCompleted() test = MerkleTree({'status': DROPStates.COMPLETED}.items(), common_hash) # 689fcf0d74c42200bef177db545adc43c135dfb0d7dc85b166db3af1dcded235 - self.assertTrue(test.merkle_root == a.merkleroot) + self.assertTrue(test.merkle_root == drop_a.merkleroot) # Test NOTHING - b.setCompleted() + drop_b.setCompleted() # None - self.assertIsNone(b.merkleroot) - self.assertTrue(b._committed) + self.assertIsNone(drop_b.merkleroot) + self.assertTrue(drop_b._committed) def test_recommit(self): """ Should raise an exception preventing a straight-recommit. """ - a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproducibilityFlags.RERUN - a.setCompleted() + drop_a = AbstractDROP('a', 'a') + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + drop_a.setCompleted() with self.assertRaises(Exception): - a.commit() + drop_a.commit() def test_set_reproducibility_level(self): """ @@ -90,20 +93,20 @@ def test_set_reproducibility_level(self): If already committed. The drop should reset and re-commit all reproducibility data If not committed, the change can proceed simply. """ - a = AbstractDROP('a', 'a') - b = AbstractDROP('b', 'b') - a.reproducibility_level = ReproducibilityFlags.NOTHING - b.reproducibility_level = ReproducibilityFlags.NOTHING + drop_a = AbstractDROP('a', 'a') + drop_b = AbstractDROP('b', 'b') + drop_a.reproducibility_level = ReproducibilityFlags.NOTHING + drop_b.reproducibility_level = ReproducibilityFlags.NOTHING - a.setCompleted() - self.assertIsNone(a.merkleroot) - a.reproducibility_level = ReproducibilityFlags.RERUN - self.assertIsNotNone(a.merkleroot) + drop_a.setCompleted() + self.assertIsNone(drop_a.merkleroot) + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + self.assertIsNotNone(drop_a.merkleroot) - self.assertIsNone(b.merkleroot) - b.reproducibility_level = ReproducibilityFlags.RERUN - b.setCompleted() - self.assertIsNotNone(b.merkleroot) + self.assertIsNone(drop_b.merkleroot) + drop_b.reproducibility_level = ReproducibilityFlags.RERUN + drop_b.setCompleted() + self.assertIsNotNone(drop_b.merkleroot) with self.assertRaises(TypeError): - a.reproducibility_level = 'REPEAT' + drop_a.reproducibility_level = 'REPEAT' diff --git a/daliuge-engine/test/reproducibility/test_pg_blockdag.py b/daliuge-engine/test/reproducibility/test_pg_blockdag.py index 1f709d1d2..3fad8d2c7 100644 --- a/daliuge-engine/test/reproducibility/test_pg_blockdag.py +++ b/daliuge-engine/test/reproducibility/test_pg_blockdag.py @@ -125,7 +125,7 @@ def _init_pgraph_twolines(rmode: ReproducibilityFlags): def _init_pgraph_data_fan(rmode: ReproducibilityFlags): pgt = [_generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode), _generate_dummy_data(rmode)] - for i in range(len(pgt)): + for i in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [1] @@ -136,7 +136,7 @@ def _init_pgraph_data_fan(rmode: ReproducibilityFlags): def _init_pgraph_data_funnel(rmode: ReproducibilityFlags): pgt = [_generate_dummy_data(rmode), _generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode)] - for i in range(len(pgt)): + for i in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [2] @@ -147,7 +147,7 @@ def _init_pgraph_data_funnel(rmode: ReproducibilityFlags): def _init_pgraph_data_sandwich(rmode: ReproducibilityFlags): pgt = [_generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode)] - for i in range(len(pgt)): + for i in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [1] @@ -158,7 +158,7 @@ def _init_pgraph_data_sandwich(rmode: ReproducibilityFlags): def _init_pgraph_computation_sandwich(rmode: ReproducibilityFlags): pgt = [_generate_dummy_compute(rmode), _generate_dummy_data(rmode), _generate_dummy_compute(rmode)] - for i in range(len(pgt)): + for i in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [1] From c7aed57f9075dd67e489a9e17e6c46eea5e1e4e2 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Wed, 28 Jul 2021 10:43:15 +0800 Subject: [PATCH 243/484] Style changes to reproducibility tests for pylint score. --- .../test/reproducibility/test_drophash.py | 73 ++++++++++--------- .../test/reproducibility/test_pg_blockdag.py | 8 +- 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/daliuge-engine/test/reproducibility/test_drophash.py b/daliuge-engine/test/reproducibility/test_drophash.py index be9df517f..7d44d1b48 100644 --- a/daliuge-engine/test/reproducibility/test_drophash.py +++ b/daliuge-engine/test/reproducibility/test_drophash.py @@ -32,57 +32,60 @@ from merklelib import MerkleTree -class RerunHashTests(unittest.TestCase): +class AbstractDROPHashTests(unittest.TestCase): + """ + Tests the reprodata generation methods of the AbstractDROP class + """ def test_null_merkleroot(self): """ Sanity check that the default MerkleRoot of an abstract drop is Null Consider it a cardinal sin to change this. """ - a = AbstractDROP('a', 'a') - self.assertIsNone(a.merkleroot) + drop_a = AbstractDROP('a', 'a') + self.assertIsNone(drop_a.merkleroot) def test_generate_rerun_data(self): """ Tests that completed Rerun data contains the completed flag. """ - a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproducibilityFlags.RERUN - a.setCompleted() - self.assertEqual(a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) + drop_a = AbstractDROP('a', 'a') + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + drop_a.setCompleted() + self.assertEqual(drop_a.generate_rerun_data(), {'status': DROPStates.COMPLETED}) def test_commit_on_complete(self): """ Tests that merkle_data is generated upon set_complete status and is correct (NOTHING, RERUN) """ - a = AbstractDROP('a', 'a') - b = AbstractDROP('b', 'b') - a.reproducibility_level = ReproducibilityFlags.RERUN - b.reproducibility_level = ReproducibilityFlags.NOTHING - self.assertIsNone(a.merkleroot) - self.assertIsNone(b.merkleroot) + drop_a = AbstractDROP('a', 'a') + drop_b = AbstractDROP('b', 'b') + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + drop_b.reproducibility_level = ReproducibilityFlags.NOTHING + self.assertIsNone(drop_a.merkleroot) + self.assertIsNone(drop_b.merkleroot) # Test RERUN - a.setCompleted() + drop_a.setCompleted() test = MerkleTree({'status': DROPStates.COMPLETED}.items(), common_hash) # 689fcf0d74c42200bef177db545adc43c135dfb0d7dc85b166db3af1dcded235 - self.assertTrue(test.merkle_root == a.merkleroot) + self.assertTrue(test.merkle_root == drop_a.merkleroot) # Test NOTHING - b.setCompleted() + drop_b.setCompleted() # None - self.assertIsNone(b.merkleroot) - self.assertTrue(b._committed) + self.assertIsNone(drop_b.merkleroot) + self.assertTrue(drop_b._committed) def test_recommit(self): """ Should raise an exception preventing a straight-recommit. """ - a = AbstractDROP('a', 'a') - a.reproducibility_level = ReproducibilityFlags.RERUN - a.setCompleted() + drop_a = AbstractDROP('a', 'a') + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + drop_a.setCompleted() with self.assertRaises(Exception): - a.commit() + drop_a.commit() def test_set_reproducibility_level(self): """ @@ -90,20 +93,20 @@ def test_set_reproducibility_level(self): If already committed. The drop should reset and re-commit all reproducibility data If not committed, the change can proceed simply. """ - a = AbstractDROP('a', 'a') - b = AbstractDROP('b', 'b') - a.reproducibility_level = ReproducibilityFlags.NOTHING - b.reproducibility_level = ReproducibilityFlags.NOTHING + drop_a = AbstractDROP('a', 'a') + drop_b = AbstractDROP('b', 'b') + drop_a.reproducibility_level = ReproducibilityFlags.NOTHING + drop_b.reproducibility_level = ReproducibilityFlags.NOTHING - a.setCompleted() - self.assertIsNone(a.merkleroot) - a.reproducibility_level = ReproducibilityFlags.RERUN - self.assertIsNotNone(a.merkleroot) + drop_a.setCompleted() + self.assertIsNone(drop_a.merkleroot) + drop_a.reproducibility_level = ReproducibilityFlags.RERUN + self.assertIsNotNone(drop_a.merkleroot) - self.assertIsNone(b.merkleroot) - b.reproducibility_level = ReproducibilityFlags.RERUN - b.setCompleted() - self.assertIsNotNone(b.merkleroot) + self.assertIsNone(drop_b.merkleroot) + drop_b.reproducibility_level = ReproducibilityFlags.RERUN + drop_b.setCompleted() + self.assertIsNotNone(drop_b.merkleroot) with self.assertRaises(TypeError): - a.reproducibility_level = 'REPEAT' + drop_a.reproducibility_level = 'REPEAT' diff --git a/daliuge-engine/test/reproducibility/test_pg_blockdag.py b/daliuge-engine/test/reproducibility/test_pg_blockdag.py index 1f709d1d2..00c637b68 100644 --- a/daliuge-engine/test/reproducibility/test_pg_blockdag.py +++ b/daliuge-engine/test/reproducibility/test_pg_blockdag.py @@ -125,7 +125,7 @@ def _init_pgraph_twolines(rmode: ReproducibilityFlags): def _init_pgraph_data_fan(rmode: ReproducibilityFlags): pgt = [_generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode), _generate_dummy_data(rmode)] - for i in range(len(pgt)): + for i, drop in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [1] @@ -136,7 +136,7 @@ def _init_pgraph_data_fan(rmode: ReproducibilityFlags): def _init_pgraph_data_funnel(rmode: ReproducibilityFlags): pgt = [_generate_dummy_data(rmode), _generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode)] - for i in range(len(pgt)): + for i, drop in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [2] @@ -147,7 +147,7 @@ def _init_pgraph_data_funnel(rmode: ReproducibilityFlags): def _init_pgraph_data_sandwich(rmode: ReproducibilityFlags): pgt = [_generate_dummy_data(rmode), _generate_dummy_compute(rmode), _generate_dummy_data(rmode)] - for i in range(len(pgt)): + for i, drop in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [1] @@ -158,7 +158,7 @@ def _init_pgraph_data_sandwich(rmode: ReproducibilityFlags): def _init_pgraph_computation_sandwich(rmode: ReproducibilityFlags): pgt = [_generate_dummy_compute(rmode), _generate_dummy_data(rmode), _generate_dummy_compute(rmode)] - for i in range(len(pgt)): + for i, drop in enumerate(pgt): pgt[i]['oid'] = i pgt[i]['reprodata']['rmode'] = str(rmode.value) pgt[0]['outputs'] = [1] From e2079a8b5f6ab94fd7268d0aed459fc76fc819c9 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 29 Jul 2021 12:00:17 +0800 Subject: [PATCH 244/484] Adds functionality for logical graph templates to have pre-set rmodes on a per-drop basis. --- daliuge-common/dlg/common/reproducibility/reproducibility.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/daliuge-common/dlg/common/reproducibility/reproducibility.py b/daliuge-common/dlg/common/reproducibility/reproducibility.py index 7c6c2d5b3..f1242b7b5 100644 --- a/daliuge-common/dlg/common/reproducibility/reproducibility.py +++ b/daliuge-common/dlg/common/reproducibility/reproducibility.py @@ -245,6 +245,10 @@ def init_lgt_repro_drop_data(drop: dict, level: ReproducibilityFlags): :param level: :return: The same drop with appended reproducibility information. """ + # Catch pre-set per-drop rmode + if 'reprodata' in drop.keys(): + if 'rmode' in drop['reprodata'].keys(): + level = rflag_caster(drop['reprodata']['rmode']) data = accumulate_lgt_drop_data(drop, level) merkletree = MerkleTree(data.items(), common_hash) data['merkleroot'] = merkletree.merkle_root From d4b6e190d2d30b2ab37167300411d76405d8be37 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 29 Jul 2021 12:00:26 +0800 Subject: [PATCH 245/484] Tests a split-rmode graph. --- .../reproGraphs/HelloWorldBashSplit.graph | 273 ++++++++++++++++++ .../test/reproducibility/test_integration.py | 51 ++++ 2 files changed, 324 insertions(+) create mode 100644 daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBashSplit.graph diff --git a/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBashSplit.graph b/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBashSplit.graph new file mode 100644 index 000000000..6ca5b30aa --- /dev/null +++ b/daliuge-engine/test/reproducibility/reproGraphs/HelloWorldBashSplit.graph @@ -0,0 +1,273 @@ +{ + "linkDataArray": [ + { + "from": -3, + "fromPort": "3o1", + "to": -1, + "toPort": "1i1" + }, + { + "from": -1, + "fromPort": "1o1", + "to": -4, + "toPort": "4i1" + }, + { + "from": -4, + "fromPort": "4o1", + "to": -2, + "toPort": "2i1" + } + ], + "modelData": { + "filePath": "HelloWorldBash.graph", + "fileType": "graph", + "git_url": "", + "repo": "", + "repoService": "Unknown", + "sha": "" + }, + "nodeDataArray": [ + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.in" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "1i1", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -1, + "loc": "538 309", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "1o1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "File", + "categoryType": "Data", + "collapsed": false, + "colour": "#394BB2", + "description": "", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "data_volume", + "text": "Data volume", + "value": "5" + }, + { + "name": "group_end", + "text": "Group end", + "value": "0" + }, + { + "name": "check_filepath_exists", + "text": "Check file path exists", + "value": "1" + }, + { + "name": "filepath", + "text": "File path", + "value": "result.out" + }, + { + "name": "dirname", + "text": "Directory name", + "value": "" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "2i1", + "IdText": "event" + } + ], + "isData": true, + "isGroup": false, + "key": -2, + "loc": "814 477", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [], + "streaming": false, + "subject": null, + "text": "File" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "echo -en 'Hello world' > %o0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [], + "isData": false, + "isGroup": false, + "key": -3, + "loc": "222 343", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "3o1", + "IdText": "event" + } + ], + "reprodata": {"rmode": 7}, + "streaming": true, + "subject": null, + "text": "Bash Shell App" + }, + { + "canHaveInputs": true, + "canHaveOutputs": true, + "category": "BashShellApp", + "categoryType": "Application", + "collapsed": false, + "colour": "#1C2833", + "description": "An application component run within the Bash Shell", + "drawOrderHint": 0, + "exitAppName": "", + "fields": [ + { + "name": "execution_time", + "text": "Execution time", + "value": "5" + }, + { + "name": "num_cpus", + "text": "Num CPUs", + "value": "1" + }, + { + "name": "group_start", + "text": "Group start", + "value": "0" + }, + { + "name": "Arg01", + "text": "Arg01", + "value": "cp %i0 %o0" + } + ], + "inputAppFields": [], + "inputAppName": "", + "inputApplication": "Unknown", + "inputLocalPorts": [], + "inputPorts": [ + { + "Id": "4i1", + "IdText": "event" + } + ], + "isData": false, + "isGroup": false, + "key": -4, + "loc": "684 176", + "outputAppFields": [], + "outputAppName": "", + "outputApplication": "Unknown", + "outputLocalPorts": [], + "outputPorts": [ + { + "Id": "4o1", + "IdText": "event" + } + ], + "streaming": false, + "subject": null, + "text": "Bash Shell App" + } + ] +} \ No newline at end of file diff --git a/daliuge-engine/test/reproducibility/test_integration.py b/daliuge-engine/test/reproducibility/test_integration.py index 79db3c6ba..09575d3b9 100644 --- a/daliuge-engine/test/reproducibility/test_integration.py +++ b/daliuge-engine/test/reproducibility/test_integration.py @@ -337,3 +337,54 @@ def test_integration_replicate_total(self): self.assertEqual(self.graphs['HelloSPython'][rmode.value], self.graphs['HelloSPython2'][rmode.value]) + + +class IntegrationSplitRmode(unittest.TestCase): + """ + It is not unreasonable for different reproducibility standards enforced on different drops in + a single workflow. + This test class tests this functionality. + """ + + temp_out = tempfile.TemporaryDirectory('out') + + def test_split_lgt(self): + """ + Tests a simple 'hello world' graph (HelloWorldBash) where a single component has + a pre-existing rmode in the graph file set (Replicate Computationally). + The rest are run with a NOTHING standard. + We should be able to tell: + - This graph's signature should be different to the standard graph run completely in + RERUN and NOTHING standards + - The reprodata of the set component should contain values while the rest do not + """ + graph_name = 'HelloWorldBashSplit' + control_graph_name = 'HelloWorldBash' + graph_loc = 'reproGraphs/' + rmode = ReproducibilityFlags.NOTHING + _run_full_workflow(rmode=rmode, workflow=graph_name, workflow_loc=graph_loc, + scratch_loc=self.temp_out.name) + pgr = self.temp_out.name + '/' + graph_name + "_" + str(rmode.value) + "PG.graph" + _run_full_workflow(rmode=rmode, workflow=control_graph_name, workflow_loc=graph_loc, + scratch_loc=self.temp_out.name) + pgr_2 = self.temp_out.name + '/' + control_graph_name + "_" + str(rmode.value) + "PG.graph" + + graph = _read_graph(pgr) + graph_reprodata = graph[-1] + graph = graph[0:-1] + control_graph = _read_graph(pgr_2) + control_signature = control_graph[-1]['signature'] + self.assertEqual(ReproducibilityFlags.NOTHING.value, int(graph_reprodata['rmode'])) + self.assertNotEqual(control_signature, graph_reprodata['signature']) + + for drop in graph: + if drop['reprodata']['rmode'] == str(ReproducibilityFlags.NOTHING.value): + self.assertIsNone(drop['reprodata']['lgt_data']['merkleroot']) + self.assertIsNone(drop['reprodata']['lg_data']['merkleroot']) + self.assertIsNone(drop['reprodata']['pgt_data']['merkleroot']) + self.assertIsNone(drop['reprodata']['pg_data']['merkleroot']) + else: + self.assertIsNotNone(drop['reprodata']['lgt_data']['merkleroot']) + self.assertIsNotNone(drop['reprodata']['lg_data']['merkleroot']) + self.assertIsNotNone(drop['reprodata']['pgt_data']['merkleroot']) + self.assertIsNotNone(drop['reprodata']['pg_data']['merkleroot']) From 1142ca35d5c37393c98950462f68aa0637404b6d Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 12 Aug 2021 14:47:05 +0800 Subject: [PATCH 246/484] Adds functionality to write reprodata out to file on a per-session basis. --- daliuge-engine/dlg/manager/session.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/daliuge-engine/dlg/manager/session.py b/daliuge-engine/dlg/manager/session.py index 0adf3585a..d292107ee 100644 --- a/daliuge-engine/dlg/manager/session.py +++ b/daliuge-engine/dlg/manager/session.py @@ -25,10 +25,13 @@ import collections import inspect +import json import logging +import os import threading from dlg.common.reproducibility.reproducibility import init_runtime_repro_data +from dlg.utils import createDirIfMissing from . import constants from .. import droputils @@ -82,6 +85,7 @@ def handleEvent(self, evt): logger.debug("Building Reproducibility BlockDAG") init_runtime_repro_data(self._session._graph, self._session._graphreprodata) self._session.reprostatus = True + self._session.write_reprodata() track_current_session = utils.object_tracking('session') @@ -155,6 +159,15 @@ def reprostatus(self, status): with self._statusLock: # TODO: Consider creating another lock self._reprofinished = status + def write_reprodata(self): + parts = ['.', self._sessionId] + the_dir = os.path.abspath(os.path.normpath(os.path.join(*parts))) + createDirIfMissing(the_dir) + the_path = os.path.join(the_dir, 'reprodata.out') + with open(the_path, 'w+') as file: + json.dump(self._graphreprodata, open(the_path, 'w+'), indent=4) + + @track_current_session def addGraphSpec(self, graphSpec): """ From aecf2ef8db71d7d8b1e1468b0cb8a20cbab9fe77 Mon Sep 17 00:00:00 2001 From: pritchardn <21726929@student.uwa.edu.au> Date: Thu, 19 Aug 2021 12:06:45 +0800 Subject: [PATCH 247/484] Adds GPUtil to requirements.txt GPUtil is used when generating machine recomputation information. --- daliuge-engine/pip/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/daliuge-engine/pip/requirements.txt b/daliuge-engine/pip/requirements.txt index b80a6f778..5d0471132 100644 --- a/daliuge-engine/pip/requirements.txt +++ b/daliuge-engine/pip/requirements.txt @@ -22,4 +22,5 @@ twine # 0.6 brings python3 support plus other fixes zerorpc >= 0.6 # For reproducibility -merklelib = 1.0 +merklelib >= 1.0 +gputil >= 1.4.0 From 4915289868069bb2068e21139723bbdb12b72163 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Tue, 25 Jan 2022 17:36:40 +0800 Subject: [PATCH 248/484] Adds compatibility for latest DALiuGE version --- daliuge-engine/dlg/apps/bash_shell_app.py | 5 +- daliuge-engine/dlg/drop.py | 10 +- daliuge-engine/dlg/graph_loader.py | 6 + daliuge-engine/dlg/manager/node_manager.py | 1 + daliuge-engine/test/apps/test_plasma.py | 1 + daliuge-engine/test/deploy/test_common.py | 1 + daliuge-engine/test/manager/test_dim.py | 15 ++ daliuge-engine/test/manager/test_dm.py | 22 +- daliuge-engine/test/manager/test_mm.py | 23 +- daliuge-engine/test/manager/test_rest.py | 4 +- .../test/manager/test_scalability.py | 15 +- daliuge-engine/test/manager/testutils.py | 1 + .../reproducibility/test_accumulatedata.py | 196 +++++++++--------- .../test/reproducibility/test_integration.py | 6 +- .../test/reproducibility/test_lg_blockdag.py | 128 ++++++------ .../reproducibility/test_scatter_blockdag.py | 8 +- .../test/reproducibility/test_toposort.py | 10 +- daliuge-engine/test/test_session.py | 83 ++++---- .../dlg/translator/tool_commands.py | 27 +-- 19 files changed, 316 insertions(+), 246 deletions(-) diff --git a/daliuge-engine/dlg/apps/bash_shell_app.py b/daliuge-engine/dlg/apps/bash_shell_app.py index a6d02f403..df2d62a5a 100644 --- a/daliuge-engine/dlg/apps/bash_shell_app.py +++ b/daliuge-engine/dlg/apps/bash_shell_app.py @@ -169,7 +169,10 @@ def initialize(self, **kwargs): self, "No command specified, cannot create BashShellApp" ) - def _run_bash(self, inputs, outputs, stdin=None, stdout=subprocess.PIPE): + self._recompute_data = {} + + def _run_bash(self, inputs, outputs, stdin=None, + stdout=subprocess.PIPE): """ Runs the given `cmd`. If any `inputs` and/or `outputs` are given (dictionaries of uid:drop elements) they are used to replace any placeholder diff --git a/daliuge-engine/dlg/drop.py b/daliuge-engine/dlg/drop.py index a3d39cc58..21d827788 100644 --- a/daliuge-engine/dlg/drop.py +++ b/daliuge-engine/dlg/drop.py @@ -1248,7 +1248,8 @@ def setError(self): self.status = DROPStates.ERROR # Signal our subscribers that the show is over - self._fire("dropCompleted", status=DROPStates.ERROR) + self._fire(eventType="dropCompleted", status=DROPStates.ERROR) + self.completedrop() @track_current_drop def setCompleted(self): @@ -1275,7 +1276,8 @@ def setCompleted(self): logger.debug("Moving %r to COMPLETED", self) self.status = DROPStates.COMPLETED # Signal our subscribers that the show is over - self._fire("dropCompleted", status=DROPStates.COMPLETED) + self._fire(eventType="dropCompleted", status=DROPStates.COMPLETED) + self.completedrop() def isCompleted(self): """ @@ -1517,6 +1519,7 @@ def setCompleted(self): self._size = 0 # Signal our subscribers that the show is over self._fire("dropCompleted", status=DROPStates.COMPLETED) + self.completedrop() @property def dataURL(self): @@ -1778,6 +1781,9 @@ def initialize(self, **kwargs): # The table this Drop points at self._db_table = kwargs.pop("dbtable") + # Data store for reproducibility + self._querylog = [] + def getIO(self): # This Drop cannot be accessed directly return ErrorIO() diff --git a/daliuge-engine/dlg/graph_loader.py b/daliuge-engine/dlg/graph_loader.py index c2b1d27a1..548066155 100644 --- a/daliuge-engine/dlg/graph_loader.py +++ b/daliuge-engine/dlg/graph_loader.py @@ -207,6 +207,12 @@ def loadDropSpecs(dropSpecList): # Step #1: Check the DROP specs and collect them dropSpecs = {} + reprodata = None + if dropSpecList is None: + raise InvalidGraphException("DropSpec is empty %r" % dropSpecList) + if dropSpecList[-1].get('merkleroot'): + reprodata = dropSpecList.pop() + logger.debug("Found reprodata in dropSpecList, rmode=%s", reprodata['rmode']) for n, dropSpec in enumerate(dropSpecList): # "type" and 'oit' are mandatory diff --git a/daliuge-engine/dlg/manager/node_manager.py b/daliuge-engine/dlg/manager/node_manager.py index 42624caf7..df280653e 100644 --- a/daliuge-engine/dlg/manager/node_manager.py +++ b/daliuge-engine/dlg/manager/node_manager.py @@ -294,6 +294,7 @@ def foreach(drop): log_evt_listener = self._logging_event_listener if log_evt_listener: drop.subscribe(log_evt_listener, "status") + drop.subscribe(log_evt_listener, 'reproducibility') if isinstance(drop, AppDROP): drop.subscribe(log_evt_listener, "execStatus") diff --git a/daliuge-engine/test/apps/test_plasma.py b/daliuge-engine/test/apps/test_plasma.py index 655c1416d..f4b1f999d 100644 --- a/daliuge-engine/test/apps/test_plasma.py +++ b/daliuge-engine/test/apps/test_plasma.py @@ -23,6 +23,7 @@ import tarfile import binascii import shutil +import unittest from dlg.drop import FileDROP, PlasmaDROP, InMemoryDROP from dlg import droputils diff --git a/daliuge-engine/test/deploy/test_common.py b/daliuge-engine/test/deploy/test_common.py index 2c8f83780..f65f58adb 100644 --- a/daliuge-engine/test/deploy/test_common.py +++ b/daliuge-engine/test/deploy/test_common.py @@ -56,6 +56,7 @@ def _submit(self): }, {"oid": "C", "type": "plain", "storage": Categories.MEMORY}, ] + pg = add_test_reprodata(pg) for drop in pg: drop["node"] = "127.0.0.1" drop["island"] = "127.0.0.1" diff --git a/daliuge-engine/test/manager/test_dim.py b/daliuge-engine/test/manager/test_dim.py index 642a40372..46ec437d6 100644 --- a/daliuge-engine/test/manager/test_dim.py +++ b/daliuge-engine/test/manager/test_dim.py @@ -42,6 +42,18 @@ +default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} +default_graph_repro = {"rmode": "1", "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, + "merkleroot": "a", "signature": "b"} + + +def add_test_reprodata(graph: list): + for drop in graph: + drop['reprodata'] = default_repro.copy() + graph.append(default_graph_repro.copy()) + return graph + + class LocalDimStarter(ManagerStarter): def setUp(self): super(LocalDimStarter, self).setUp() @@ -80,6 +92,7 @@ def createSessionAndAddTypicalGraph(self, sessionId, sleepTime=0): "node": hostname, }, ] + graphSpec = add_test_reprodata(graphSpec) self.dim.createSession(sessionId) self.assertEqual(0, self.dim.getGraphSize(sessionId)) self.dim.addGraphSpec(sessionId, graphSpec) @@ -108,6 +121,7 @@ def test_addGraphSpec(self): "node": "unknown_host", } ] + graphSpec = add_test_reprodata(graphSpec) self.assertRaises(Exception, self.dim.addGraphSpec, sessionId, graphSpec) # OK @@ -119,6 +133,7 @@ def test_addGraphSpec(self): "node": hostname, } ] + graphSpec = add_test_reprodata(graphSpec) self.dim.createSession(sessionId) self.assertEqual(0, self.dim.getGraphSize(sessionId)) self.dim.addGraphSpec(sessionId, graphSpec) diff --git a/daliuge-engine/test/manager/test_dm.py b/daliuge-engine/test/manager/test_dm.py index 3afe09a9b..029720ced 100644 --- a/daliuge-engine/test/manager/test_dm.py +++ b/daliuge-engine/test/manager/test_dm.py @@ -126,7 +126,8 @@ def _test_runGraphInTwoNMs( """Utility to run a graph in two Node Managers""" dm1, dm2 = node_managers or [self._start_dm(threads=threads) for _ in range(2)] - + add_test_reprodata(g1) + add_test_reprodata(g2) quickDeploy(dm1, sessionId, g1, {nm_conninfo(1): rels}) quickDeploy(dm2, sessionId, g2, {nm_conninfo(0): rels}) self.assertEqual(len(g1), len(dm1._sessions[sessionId].drops)) @@ -232,8 +233,6 @@ def _test_runGraphOneDOPerDOM(self, repeats=1): "producers": ["B"], }, ] - add_test_reprodata(g1) - add_test_reprodata(g2) rels = [DROPRel("B", DROPLinkType.CONSUMER, "A")] a_data = os.urandom(32) c_data = str(crc32c(a_data, 0)).encode("utf8") @@ -596,8 +595,6 @@ def test_run_streaming_consumer_remotely(self): }, {"oid": "E", "type": "plain", "storage": Categories.MEMORY}, ] - add_test_reprodata(g1) - add_test_reprodata(g2) rels = [DROPRel("C", DROPLinkType.STREAMING_INPUT, "D")] a_data = os.urandom(32) e_data = str(crc32c(a_data, 0)).encode('utf8') @@ -628,8 +625,6 @@ def test_run_streaming_consumer_remotely2(self): }, {"oid": "E", "type": "plain", "storage": Categories.MEMORY}, ] - add_test_reprodata(g1) - add_test_reprodata(g2) rels = [DROPRel("C", DROPLinkType.OUTPUT, "B")] a_data = os.urandom(32) e_data = str(crc32c(a_data, 0)).encode('utf8') @@ -643,6 +638,7 @@ def test_run_invalid_shmem_graph(self): """ graph = [{"oid": "A", "type": "plain", "storage": Categories.SHMEM}] + graph = add_test_reprodata(graph) dm = self._start_dm() sessionID = "s1" if sys.version_info < (3, 8): @@ -667,6 +663,7 @@ def _deploy_error_graph(self, **kwargs): }, {"oid": "C", "type": "plain", "storage": Categories.MEMORY, "producers": ["B"]}, ] + add_test_reprodata(g) dm = self._start_dm(threads=multiprocessing.cpu_count(), **kwargs) dm.createSession(sessionId) dm.addGraphSpec(sessionId, g) @@ -775,6 +772,8 @@ def test_runGraphSeveralDropsPerDM(self): DROPRel("D", DROPLinkType.INPUT, "E"), DROPRel("B", DROPLinkType.INPUT, "E"), ] + add_test_reprodata(g1) + add_test_reprodata(g2) quickDeploy(dm1, sessionId, g1, {nm_conninfo(1): rels}) quickDeploy(dm2, sessionId, g2, {nm_conninfo(0): rels}) @@ -857,6 +856,8 @@ def test_runWithFourDMs(self): rels_13 = [DROPRel("A", DROPLinkType.INPUT, "G")] rels_24 = [DROPRel("F", DROPLinkType.PRODUCER, "L")] rels_34 = [DROPRel("K", DROPLinkType.PRODUCER, "M")] + for g in [g1, g2, g3, g4]: + add_test_reprodata(g) quickDeploy( dm1, sessionId, g1, {nm_conninfo(1): rels_12, nm_conninfo(2): rels_13} ) @@ -914,7 +915,7 @@ def test_many_relationships(self): ======= ==================== """ - dm1, dm2 = [self._start_dm(threads=multiprocessing.cpu_count()) for _ in range(2)] + dm1, dm2 = [self._start_dm() for _ in range(2)] sessionId = f"s{random.randint(0, 1000)}" N = 100 @@ -934,7 +935,8 @@ def test_many_relationships(self): } ) rels.append(DROPRel("A", DROPLinkType.INPUT, b_oid)) - + add_test_reprodata(g1) + add_test_reprodata(g2) quickDeploy(dm1, sessionId, g1, {nm_conninfo(1): rels}) quickDeploy(dm2, sessionId, g2, {nm_conninfo(0): rels}) self.assertEqual(1, len(dm1._sessions[sessionId].drops)) @@ -1014,6 +1016,8 @@ def test_runGraphSeveralDropsPerDM_with_get_consumer_nodes(self): DROPRel("D", DROPLinkType.INPUT, "E"), DROPRel("D", DROPLinkType.INPUT, "F"), ] + add_test_reprodata(g1) + add_test_reprodata(g2) quickDeploy(dm1, sessionId, g1, {nm_conninfo(1): rels}) quickDeploy(dm2, sessionId, g2, {nm_conninfo(0): rels}) diff --git a/daliuge-engine/test/manager/test_mm.py b/daliuge-engine/test/manager/test_mm.py index 72f39ab6a..196ff30dd 100644 --- a/daliuge-engine/test/manager/test_mm.py +++ b/daliuge-engine/test/manager/test_mm.py @@ -37,9 +37,19 @@ from dlg.exceptions import NoSessionException from test.manager import testutils - hostname = "127.0.0.1" +default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} +default_graph_repro = {"rmode": "1", + "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, + "merkleroot": "a", "signature": "b"} + + +def add_test_reprodata(graph: list): + for drop in graph: + drop['reprodata'] = default_repro.copy() + graph.append(default_graph_repro.copy()) + return graph class DimAndNMStarter(ManagerStarter): @@ -85,6 +95,7 @@ def createSessionAndAddTypicalGraph(self, sessionId, sleepTime=0): "node": hostname, }, ] + add_test_reprodata(graphSpec) self.mm.createSession(sessionId) self.mm.addGraphSpec(sessionId, graphSpec) @@ -305,7 +316,7 @@ def test_fullRound(self): # we need to add it manually before submitting -- otherwise it will # get rejected by the DIM. with pkg_resources.resource_stream( - "test", "graphs/complex.js" + "test", "graphs/complex.js" ) as f: # @UndefinedVariable complexGraphSpec = json.load(codecs.getreader("utf-8")(f)) for dropSpec in complexGraphSpec: @@ -346,10 +357,10 @@ def test_fullRound(self): # Wait until the graph has finished its execution. We'll know # it finished by polling the status of the session while ( - SessionStates.RUNNING - in testutils.get(self, "/sessions/%s/status" % (sessionId), restPort)[ - hostname - ].values() + SessionStates.RUNNING + in testutils.get(self, "/sessions/%s/status" % (sessionId), restPort)[ + hostname + ].values() ): time.sleep(0.2) diff --git a/daliuge-engine/test/manager/test_rest.py b/daliuge-engine/test/manager/test_rest.py index 94cfd4df7..b5794bd16 100644 --- a/daliuge-engine/test/manager/test_rest.py +++ b/daliuge-engine/test/manager/test_rest.py @@ -27,9 +27,7 @@ from dlg.common import Categories from dlg.exceptions import InvalidGraphException -zfrom -dlg.manager -import constants +from dlg.manager import constants from dlg.manager.client import NodeManagerClient, DataIslandManagerClient from dlg.manager.composite_manager import DataIslandManager from dlg.manager.node_manager import NodeManager diff --git a/daliuge-engine/test/manager/test_scalability.py b/daliuge-engine/test/manager/test_scalability.py index b343beb9b..ed1f5763b 100644 --- a/daliuge-engine/test/manager/test_scalability.py +++ b/daliuge-engine/test/manager/test_scalability.py @@ -33,6 +33,18 @@ +default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} +default_graph_repro = {"rmode": "1", "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, + "merkleroot": "a", "signature": "b"} + + +def add_test_reprodata(graph: list): + for drop in graph: + drop['reprodata'] = default_repro.copy() + graph.append(default_graph_repro.copy()) + return graph + + def memory_drop(uid): return dropdict( { @@ -81,6 +93,7 @@ def create_graph(branches, drops_per_branch): final_drop.addProducer(final_app) graph.append(final_drop) + add_test_reprodata(graph) return graph, completed_uids @@ -109,7 +122,7 @@ def test_submit_hugegraph(self): graph, completed_uids = create_graph( branches=branches, drops_per_branch=drops_per_branch ) - self.assertEqual(n_drops, len(graph)) + self.assertEqual(n_drops, len(graph)-1) # -1 for reprodata at end self._run_graph(graph, completed_uids, timeout=5) def _run_graph(self, graph, completed_uids, timeout=5): diff --git a/daliuge-engine/test/manager/testutils.py b/daliuge-engine/test/manager/testutils.py index c6ed13a80..0394e4cf0 100644 --- a/daliuge-engine/test/manager/testutils.py +++ b/daliuge-engine/test/manager/testutils.py @@ -21,6 +21,7 @@ # import http.client import json +import codecs from dlg import utils diff --git a/daliuge-engine/test/reproducibility/test_accumulatedata.py b/daliuge-engine/test/reproducibility/test_accumulatedata.py index 00fdbe758..e6e02f367 100644 --- a/daliuge-engine/test/reproducibility/test_accumulatedata.py +++ b/daliuge-engine/test/reproducibility/test_accumulatedata.py @@ -71,16 +71,16 @@ class AccumulateLGTRerunData(unittest.TestCase): rmode = ReproducibilityFlags.RERUN expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} - file = open('reproGraphs/apps.graph') + file = open('test/reproducibility/reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/files.graph') + file = open('test/reproducibility/reproGraphs/files.graph') lgt_files_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/groups.graph') + file = open('test/reproducibility/reproGraphs/groups.graph') lgt_groups_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/misc.graph') + file = open('test/reproducibility/reproGraphs/misc.graph') lgt_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -131,10 +131,10 @@ class AccumulateLGRerunData(unittest.TestCase): lg_misc_data = None def _setup(self): - _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -173,8 +173,8 @@ class AccumulatePGTUnrollRerunData(unittest.TestCase): pgs_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] @@ -235,8 +235,8 @@ class AccumulatePGTPartitionRerunData(unittest.TestCase): pgt_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] @@ -297,8 +297,8 @@ class AccumulatePGRerunData(unittest.TestCase): pg_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PG.graph') self.pg_node_data = json.load(file)[0:-1] @@ -357,16 +357,16 @@ class AccumulateLGTRepeatData(unittest.TestCase): rmode = ReproducibilityFlags.REPEAT expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} - file = open('reproGraphs/apps.graph') + file = open('test/reproducibility/reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/files.graph') + file = open('test/reproducibility/reproGraphs/files.graph') lgt_files_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/groups.graph') + file = open('test/reproducibility/reproGraphs/groups.graph') lgt_groups_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/misc.graph') + file = open('test/reproducibility/reproGraphs/misc.graph') lgt_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -417,10 +417,10 @@ class AccumulateLGRepeatData(unittest.TestCase): lg_misc_data = None def _setup(self): - _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -519,8 +519,8 @@ class AccumulatePGTUnrollRepeatData(unittest.TestCase): pgs_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] @@ -581,8 +581,8 @@ class AccumulatePGTPartitionRepeatData(unittest.TestCase): pgt_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] @@ -643,8 +643,8 @@ class AccumulatePGRepeatData(unittest.TestCase): pg_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] @@ -703,16 +703,16 @@ class AccumulateLGTRecomputeData(unittest.TestCase): rmode = ReproducibilityFlags.RECOMPUTE expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} - file = open('reproGraphs/apps.graph') + file = open('test/reproducibility/reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/files.graph') + file = open('test/reproducibility/reproGraphs/files.graph') lgt_files_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/groups.graph') + file = open('test/reproducibility/reproGraphs/groups.graph') lgt_groups_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/misc.graph') + file = open('test/reproducibility/reproGraphs/misc.graph') lgt_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -763,10 +763,10 @@ class AccumulateLGRecomputeData(unittest.TestCase): lg_misc_data = None def _setup(self): - _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -865,8 +865,8 @@ class AccumulatePGTUnrollRecomputeData(unittest.TestCase): pgs_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] @@ -927,8 +927,8 @@ class AccumulatePGTPartitionRecomputeData(unittest.TestCase): pgt_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] @@ -989,8 +989,8 @@ class AccumulatePGRecomputeData(unittest.TestCase): pg_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] @@ -1049,16 +1049,16 @@ class AccumulateLGTReproduceData(unittest.TestCase): rmode = ReproducibilityFlags.REPRODUCE expected = {'category_type', 'category'} - file = open('reproGraphs/apps.graph') + file = open('test/reproducibility/reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/files.graph') + file = open('test/reproducibility/reproGraphs/files.graph') lgt_files_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/groups.graph') + file = open('test/reproducibility/reproGraphs/groups.graph') lgt_groups_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/misc.graph') + file = open('test/reproducibility/reproGraphs/misc.graph') lgt_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -1109,10 +1109,10 @@ class AccumulateLGReproduceData(unittest.TestCase): lg_misc_data = None def _setup(self): - _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -1210,8 +1210,8 @@ class AccumulatePGTUnrollReproduceData(unittest.TestCase): pgs_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] @@ -1272,8 +1272,8 @@ class AccumulatePGTPartitionReproduceData(unittest.TestCase): pgt_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] @@ -1334,8 +1334,8 @@ class AccumulatePGReproduceData(unittest.TestCase): pg_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] @@ -1394,16 +1394,16 @@ class AccumulateLGTReplicateSciData(unittest.TestCase): rmode = ReproducibilityFlags.REPLICATE_SCI expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} - file = open('reproGraphs/apps.graph') + file = open('test/reproducibility/reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/files.graph') + file = open('test/reproducibility/reproGraphs/files.graph') lgt_files_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/groups.graph') + file = open('test/reproducibility/reproGraphs/groups.graph') lgt_groups_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/misc.graph') + file = open('test/reproducibility/reproGraphs/misc.graph') lgt_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -1454,10 +1454,10 @@ class AccumulateLGReplicateSciData(unittest.TestCase): lg_misc_data = None def _setup(self): - _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -1496,8 +1496,8 @@ class AccumulatePGTUnrollReplicateSciData(unittest.TestCase): pgs_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] @@ -1558,8 +1558,8 @@ class AccumulatePGTPartitionReplicateSciData(unittest.TestCase): pgt_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] @@ -1620,8 +1620,8 @@ class AccumulatePGReplicateSciData(unittest.TestCase): pg_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] @@ -1680,16 +1680,16 @@ class AccumulateLGTReplicateCompData(unittest.TestCase): rmode = ReproducibilityFlags.REPLICATE_COMP expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} - file = open('reproGraphs/apps.graph') + file = open('test/reproducibility/reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/files.graph') + file = open('test/reproducibility/reproGraphs/files.graph') lgt_files_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/groups.graph') + file = open('test/reproducibility/reproGraphs/groups.graph') lgt_groups_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/misc.graph') + file = open('test/reproducibility/reproGraphs/misc.graph') lgt_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -1740,10 +1740,10 @@ class AccumulateLGReplicateCompData(unittest.TestCase): lg_misc_data = None def _setup(self): - _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -1842,8 +1842,8 @@ class AccumulatePGTUnrollReplicateCompData(unittest.TestCase): pgs_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] @@ -1904,8 +1904,8 @@ class AccumulatePGTPartitionReplicateCompData(unittest.TestCase): pgt_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] @@ -1966,8 +1966,8 @@ class AccumulatePGReplicateCompData(unittest.TestCase): pg_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PG.graph') self.pg_node_data = json.load(file)[0:-1] @@ -2026,16 +2026,16 @@ class AccumulateLGTReplicateTotalData(unittest.TestCase): rmode = ReproducibilityFlags.REPLICATE_TOTAL expected = {'category_type', 'category', 'numInputPorts', 'numOutputPorts', 'streaming'} - file = open('reproGraphs/apps.graph') + file = open('test/reproducibility/reproGraphs/apps.graph') lgt_node_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/files.graph') + file = open('test/reproducibility/reproGraphs/files.graph') lgt_files_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/groups.graph') + file = open('test/reproducibility/reproGraphs/groups.graph') lgt_groups_data = json.load(file)['nodeDataArray'] file.close() - file = open('reproGraphs/misc.graph') + file = open('test/reproducibility/reproGraphs/misc.graph') lgt_misc_data = json.load(file)['nodeDataArray'] file.close() @@ -2086,10 +2086,10 @@ class AccumulateLGReplicateTotalData(unittest.TestCase): lg_misc_data = None def _setup(self): - _fill_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'groups', 'reproGraphs/', self.temp_out.name) - _fill_workflow(self.rmode, 'misc', 'reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'groups', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _fill_workflow(self.rmode, 'misc', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'LG.graph') self.lg_node_data = json.load(file)['nodeDataArray'] @@ -2188,8 +2188,8 @@ class AccumulatePGTUnrollReplicateTotalData(unittest.TestCase): pgs_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGS.graph') self.pgs_node_data = json.load(file)[0:-1] @@ -2250,8 +2250,8 @@ class AccumulatePGTPartitionReplicateTotalData(unittest.TestCase): pgt_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pgt_node_data = json.load(file)[0:-1] @@ -2312,8 +2312,8 @@ class AccumulatePGReplicateTotalData(unittest.TestCase): pg_file_data = None def _setup(self): - _run_full_workflow(self.rmode, 'apps', 'reproGraphs/', self.temp_out.name) - _run_full_workflow(self.rmode, 'files', 'reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'apps', 'test/reproducibility/reproGraphs/', self.temp_out.name) + _run_full_workflow(self.rmode, 'files', 'test/reproducibility/reproGraphs/', self.temp_out.name) file = open(self.temp_out.name + '/' + 'apps' + 'PGT.graph') self.pg_node_data = json.load(file)[0:-1] diff --git a/daliuge-engine/test/reproducibility/test_integration.py b/daliuge-engine/test/reproducibility/test_integration.py index 09575d3b9..9f614d8e6 100644 --- a/daliuge-engine/test/reproducibility/test_integration.py +++ b/daliuge-engine/test/reproducibility/test_integration.py @@ -71,7 +71,7 @@ def test_computation_sandwich(self): No data should be present at any level of abstraction, reflected by a null merkleroot. """ graph_name = 'computationSandwich' - graph_loc = 'topoGraphs/' + graph_loc = 'test/reproducibility/topoGraphs/' rmode = ReproducibilityFlags.NOTHING _run_full_workflow(rmode=rmode, workflow=graph_name, workflow_loc=graph_loc, scratch_loc=self.temp_out.name) @@ -103,7 +103,7 @@ class IntegrationHelloWorldTest(unittest.TestCase): """ temp_out = tempfile.TemporaryDirectory('out') - graph_loc = 'reproGraphs/' + graph_loc = 'test/reproducibility/reproGraphs/' graphs = {'HelloWorldBash': {}, 'HelloSBash': {}, 'HelloWorldFile': {}, 'HelloSPython': {}, 'HelloSPython2': {}} @@ -360,7 +360,7 @@ def test_split_lgt(self): """ graph_name = 'HelloWorldBashSplit' control_graph_name = 'HelloWorldBash' - graph_loc = 'reproGraphs/' + graph_loc = 'test/reproducibility/reproGraphs/' rmode = ReproducibilityFlags.NOTHING _run_full_workflow(rmode=rmode, workflow=graph_name, workflow_loc=graph_loc, scratch_loc=self.temp_out.name) diff --git a/daliuge-engine/test/reproducibility/test_lg_blockdag.py b/daliuge-engine/test/reproducibility/test_lg_blockdag.py index 250e87ac7..aebf84544 100644 --- a/daliuge-engine/test/reproducibility/test_lg_blockdag.py +++ b/daliuge-engine/test/reproducibility/test_lg_blockdag.py @@ -60,7 +60,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -73,7 +73,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -89,7 +89,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -101,7 +101,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -111,7 +111,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -124,7 +124,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -137,7 +137,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -149,7 +149,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -171,7 +171,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -184,7 +184,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -200,7 +200,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -212,7 +212,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -222,7 +222,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -235,7 +235,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -248,7 +248,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -260,7 +260,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -282,7 +282,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -295,7 +295,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -311,7 +311,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -323,7 +323,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -333,7 +333,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -346,7 +346,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -359,7 +359,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -371,7 +371,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -394,7 +394,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -407,7 +407,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -426,7 +426,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -438,7 +438,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -448,7 +448,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -461,7 +461,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -475,7 +475,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -487,7 +487,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -509,7 +509,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -522,7 +522,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -538,7 +538,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -550,7 +550,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -560,7 +560,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -573,7 +573,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -586,7 +586,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -598,7 +598,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -620,7 +620,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -633,7 +633,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -649,7 +649,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -661,7 +661,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -671,7 +671,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -684,7 +684,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -697,7 +697,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -709,7 +709,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -731,7 +731,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -744,7 +744,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -760,7 +760,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -772,7 +772,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -782,7 +782,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -795,7 +795,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -808,7 +808,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -820,7 +820,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -841,7 +841,7 @@ def test_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -854,7 +854,7 @@ def test_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -870,7 +870,7 @@ def test_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -882,7 +882,7 @@ def test_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) leaves = lg_build_blockdag(lgt)[0] @@ -892,7 +892,7 @@ def test_data_fan(self): """ Tests that a single data source scatters its signature to downstream data drops. """ - lgt = _init_graph("topoGraphs/dataFan.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFan.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -905,7 +905,7 @@ def test_data_funnel(self): """ Tests that two data sources are collected in a single downstream data drop """ - lgt = _init_graph("topoGraphs/dataFunnel.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataFunnel.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -918,7 +918,7 @@ def test_data_sandwich(self): Tests two data drops with an interim computing drop :return: """ - lgt = _init_graph("topoGraphs/dataSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/dataSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) @@ -930,7 +930,7 @@ def test_computation_sandwich(self): """ Tests that an internal data drop surrounded by computing drops is handled correctly. """ - lgt = _init_graph("topoGraphs/computationSandwich.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/computationSandwich.graph") init_lgt_repro_data(lgt, rmode=str(self.rmode.value)) init_lg_repro_data(lgt) lg_build_blockdag(lgt) diff --git a/daliuge-engine/test/reproducibility/test_scatter_blockdag.py b/daliuge-engine/test/reproducibility/test_scatter_blockdag.py index c2b60e500..e784e265e 100644 --- a/daliuge-engine/test/reproducibility/test_scatter_blockdag.py +++ b/daliuge-engine/test/reproducibility/test_scatter_blockdag.py @@ -77,7 +77,7 @@ def _init_graph(filename): class ScatterTest(unittest.TestCase): """ Tests a very simple scattered and gathered graph full of dummy files and bash scripts. - See topoGraphs/simpleScatter.graph + See test/reproducibility/topoGraphs/simpleScatter.graph """ temp_out = tempfile.TemporaryDirectory('out') @@ -87,8 +87,8 @@ def test_lg_scatter_rerun(self): Expected behaviour should be the same as any other type of graph - they are all logical components """ - lgt = _init_graph("topoGraphs/simpleScatter.graph") - init_lgt_repro_data(lgt, rmode=str(ReproducibilityFlags.RERUN.value)) + lgt = _init_graph("test/reproducibility/topoGraphs/simpleScatter.graph") + init_lgt_repro_data(lgt, rmode=ReproducibilityFlags.RERUN.value) init_lg_repro_data(lgt) visited = lg_build_blockdag(lgt)[1] scatter_drop = lgt['nodeDataArray'][1] @@ -110,7 +110,7 @@ def test_pg_scatter_rerun(self): """ scatter = 'simpleScatter' noscatter = 'simpleNoScatter' - graph_loc = 'topoGraphs/' + graph_loc = 'test/reproducibility/topoGraphs/' _run_full_workflow(rmode=ReproducibilityFlags.RERUN, workflow=scatter, workflow_loc=graph_loc, scratch_loc=self.temp_out.name) _run_full_workflow(rmode=ReproducibilityFlags.RERUN, workflow=noscatter, diff --git a/daliuge-engine/test/reproducibility/test_toposort.py b/daliuge-engine/test/reproducibility/test_toposort.py index 8c9d5c2d2..3c9662d3f 100644 --- a/daliuge-engine/test/reproducibility/test_toposort.py +++ b/daliuge-engine/test/reproducibility/test_toposort.py @@ -109,7 +109,7 @@ def test_lg_blockdag_single(self): Tests a single drop A """ - lgt = _init_graph("topoGraphs/testSingle.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testSingle.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) visited = lg_build_blockdag(lgt)[1] @@ -122,7 +122,7 @@ def test_lg_blockdag_twostart(self): C B --> """ - lgt = _init_graph("topoGraphs/testTwoStart.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoStart.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) visited = lg_build_blockdag(lgt)[1] @@ -135,7 +135,7 @@ def test_lg_blockdag_twoend(self): A --> C """ - lgt = _init_graph("topoGraphs/testTwoEnd.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoEnd.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) visited = lg_build_blockdag(lgt)[1] @@ -147,7 +147,7 @@ def test_lg_blockdag_twolines(self): A --> B C --> D """ - lgt = _init_graph("topoGraphs/testTwoLines.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testTwoLines.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) visited = lg_build_blockdag(lgt)[1] @@ -157,7 +157,7 @@ def test_lg_blockdag_empty(self): """ Tests an empty graph. Should fail gracefully. """ - lgt = _init_graph("topoGraphs/testEmpty.graph") + lgt = _init_graph("test/reproducibility/topoGraphs/testEmpty.graph") init_lgt_repro_data(lgt, "1") init_lg_repro_data(lgt) visited = lg_build_blockdag(lgt)[1] diff --git a/daliuge-engine/test/test_session.py b/daliuge-engine/test/test_session.py index 30c04d872..407a8118b 100644 --- a/daliuge-engine/test/test_session.py +++ b/daliuge-engine/test/test_session.py @@ -26,9 +26,11 @@ from dlg.droputils import DROPWaiterCtx from dlg.exceptions import InvalidGraphException from dlg.manager.session import SessionStates, Session +from dlg.common import Categories default_repro = {"rmode": "1", "lg_blockhash": "x", "pgt_blockhash": "y", "pg_blockhash": "z"} -default_graph_repro = {"rmode": "1", "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, +default_graph_repro = {"rmode": "1", + "meta_data": {"repro_protocol": 0.1, "hashing_alg": "_sha3.sha3_256"}, "merkleroot": "a", "signature": "b"} @@ -39,7 +41,6 @@ def add_test_reprodata(graph: list): return graph - class TestSession(unittest.TestCase): def test_sessionStates(self): with Session("1") as s: @@ -75,29 +76,34 @@ def test_addGraphSpec(self): # Adding an existing DROP self.assertRaises( Exception, s.addGraphSpec, add_test_reprodata([{"oid": "A", "type": "container"}] - )) + )) # Adding invalid specs self.assertRaises( - Exception, s.addGraphSpec, add_test_reprodata([{"oid": "D", "type": "app"}])) # missing "storage" + Exception, s.addGraphSpec, + add_test_reprodata([{"oid": "D", "type": "app"}])) # missing "storage" self.assertRaises(Exception, s.addGraphSpec, - add_test_reprodata([{"oid": "D", "type": "plain", "storage": "invalid"}], - ) ) # invalid "storage" - self.assertRaises(Exception, s.addGraphSpec, add_test_reprodata([{"oid": "D", "type": "invalid"}])) # invalid "type" + add_test_reprodata( + [{"oid": "D", "type": "plain", "storage": "invalid"}], + )) # invalid "storage" + self.assertRaises(Exception, s.addGraphSpec, add_test_reprodata( + [{"oid": "D", "type": "invalid"}])) # invalid "type" self.assertRaises(Exception, s.addGraphSpec, - add_test_reprodata([{"oid": "D", "type": "app", "storage": Categories.NULL, "outputs": ["X"], - } - ], - ) ) # missing X DROP + add_test_reprodata([{"oid": "D", "type": "app", + "storage": Categories.NULL, "outputs": ["X"], + } + ], + )) # missing X DROP def test_linking(self): with Session("1") as s: s.addGraphSpec(add_test_reprodata([{"oid": "A", "type": "container"}])) s.addGraphSpec( - add_test_reprodata([{"oid": "B", "type": "app", "storage": Categories.NULL, "app": "dlg.apps.crc.CRCApp", - } - ] - )) + add_test_reprodata([{"oid": "B", "type": "app", "storage": Categories.NULL, + "app": "dlg.apps.crc.CRCApp", + } + ] + )) s.addGraphSpec(add_test_reprodata([{"oid": "C", "type": "container"}])) # Link them now @@ -121,14 +127,15 @@ def test_cancel(self): """Cancels a whole graph execution""" with Session("1") as s: s.addGraphSpec( - add_test_reprodata([{"oid": "A", "type": "plain", "storage": Categories.MEMORY, "consumers": ["B"], - }, - {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 2, - }, - {"oid": "C", "type": "plain", "storage": Categories.MEMORY, "producers": ["B"], - }, - ] - )) + add_test_reprodata( + [{"oid": "A", "type": "plain", "storage": Categories.MEMORY, "consumers": ["B"], + }, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 2, + }, + {"oid": "C", "type": "plain", "storage": Categories.MEMORY, "producers": ["B"], + }, + ] + )) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) s.cancel() @@ -141,20 +148,22 @@ def test_partial_cancel(self): """Like test_cancel, but only part of the graph should be cancelled""" with Session("1") as s: s.addGraphSpec( - add_test_reprodata([{"oid": "A", "type": "plain", "storage": Categories.MEMORY, "consumers": ["B"], - }, - {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 0, - }, - {"oid": "C", "type": "plain", "storage": Categories.MEMORY, "producers": ["B"], - "consumers": ["D"], - }, - { - "oid": "D", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 10, - }, - {"oid": "E", "type": "plain", "storage": Categories.MEMORY, "producers": ["D"], - }, - ] - )) + add_test_reprodata( + [{"oid": "A", "type": "plain", "storage": Categories.MEMORY, "consumers": ["B"], + }, + {"oid": "B", "type": "app", "app": "dlg.apps.simple.SleepApp", "sleepTime": 0, + }, + {"oid": "C", "type": "plain", "storage": Categories.MEMORY, "producers": ["B"], + "consumers": ["D"], + }, + { + "oid": "D", "type": "app", "app": "dlg.apps.simple.SleepApp", + "sleepTime": 10, + }, + {"oid": "E", "type": "plain", "storage": Categories.MEMORY, "producers": ["D"], + }, + ] + )) s.deploy() self.assertEqual(SessionStates.RUNNING, s.status) diff --git a/daliuge-translator/dlg/translator/tool_commands.py b/daliuge-translator/dlg/translator/tool_commands.py index 0c246b48d..3840e36fc 100644 --- a/daliuge-translator/dlg/translator/tool_commands.py +++ b/daliuge-translator/dlg/translator/tool_commands.py @@ -62,10 +62,10 @@ def unroll(lg_path, oid_prefix, zerorun=False, app=None): "min_goal": int, "ptype": int, "max_load_imb": int, - "max_cpu": int, + "max_cpu": int, "time_greedy": float, "deadline": int, - "topk": int, + "topk": int, "swarm_size": int, "max_mem": int, } @@ -116,7 +116,7 @@ def submit(pg, opts): common.monitor_sessions_repro(session_id, host=opts.host, port=opts.port, poll_interval=opts.poll_interval) repro_data = common.fetch_reproducibility(session_id, host=opts.host, port=opts.port, - poll_interval=opts.poll_interval) + poll_interval=opts.poll_interval) dump(repro_data['graph']) @@ -185,7 +185,7 @@ def param_spec_type(s): params = [p.split("=") for p in opts.parameter if param_spec_type(p) == "kv"] params = dict(params) for json_param in ( - json.loads(p) for p in opts.parameter if param_spec_type(p) == "json" + json.loads(p) for p in opts.parameter if param_spec_type(p) == "json" ): params.update(json_param) @@ -213,7 +213,7 @@ def _add_unroll_options(parser): type="string", help="Prefix to use for generated OIDs", - default="1", + default="1", ) parser.add_option( "-z", @@ -351,7 +351,7 @@ def dlg_map(parser, args): type="int", dest="port", help="The port we connect to to deploy the graph", - default=con.ISLAND_DEFAULT_REST_PORT, + default=con.ISLAND_DEFAULT_REST_PORT, ) parser.add_option( "-P", @@ -361,10 +361,12 @@ def dlg_map(parser, args): type="string", help="Path to the Physical Graph to submit (default: stdin)", default="-", - )parser.add_option("-N", "--nodes", action="store", - dest="nodes", help="The nodes where the Physical Graph will be distributed, comma-separated", - default=None, ) + parser.add_option("-N", "--nodes", action="store", + dest="nodes", + help="The nodes where the Physical Graph will be distributed, comma-separated", + default=None, + ) parser.add_option( "-i", "--islands", @@ -406,7 +408,7 @@ def dlg_map(parser, args): repro = pgt.pop() # TODO: Re-include pg = pg_generator.resource_map(pgt, nodes, opts.islands, - co_host_dim=opts.co_host_dim) + co_host_dim=opts.co_host_dim) pg.append(repro) dump(init_pg_repro_data(pg)) @@ -431,7 +433,7 @@ def dlg_submit(parser, args): type="int", dest="port", help="The port we connect to to deploy the graph", - default=con.ISLAND_DEFAULT_REST_PORT, + default=con.ISLAND_DEFAULT_REST_PORT, ) parser.add_option( "-P", @@ -471,7 +473,7 @@ def dlg_submit(parser, args): "--poll-interval", type="float", help="Polling interval used for monitoring the execution (default: 10)", - default=10,) + default=10, ) parser.add_option('-R', '--reproducibility', action='store_true', dest='reproducibility', help='Fetch (and output) reproducibility data for the final execution graph (default: False)') (opts, args) = parser.parse_args(args) @@ -483,7 +485,6 @@ def dlg_submit(parser, args): pg.append(repro) - def register_commands(): tool.cmdwrap( "lgweb", From adf82cef575f80d023bcc7683f092d47d3e7ca34 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Tue, 8 Feb 2022 11:51:20 +0800 Subject: [PATCH 249/484] Moves reprodata logging to logdir. --- daliuge-engine/dlg/manager/session.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-engine/dlg/manager/session.py b/daliuge-engine/dlg/manager/session.py index 897d85be7..83098f75a 100644 --- a/daliuge-engine/dlg/manager/session.py +++ b/daliuge-engine/dlg/manager/session.py @@ -216,7 +216,7 @@ def reprostatus(self, status): self._reprofinished = status def write_reprodata(self): - parts = ['.', self._sessionId] + parts = [utils.getDlgLogsDir(), self._sessionId] the_dir = os.path.abspath(os.path.normpath(os.path.join(*parts))) createDirIfMissing(the_dir) the_path = os.path.join(the_dir, 'reprodata.out') From 991ab3cdc3b3acd410fa92d50a9ab26cc4dbccab Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 14 Feb 2022 12:09:51 +0800 Subject: [PATCH 250/484] Adds multiple minikube nodes instructions. --- daliuge-k8s/helm/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/daliuge-k8s/helm/README.md b/daliuge-k8s/helm/README.md index f7a6bbb27..4d510fb1d 100644 --- a/daliuge-k8s/helm/README.md +++ b/daliuge-k8s/helm/README.md @@ -19,3 +19,11 @@ helm install daliuge-daemon . --values my-values.yaml kubectl get svc -o wide curl -d '{"nodes": ["localhost"]}' -H "Content-Type: application/json" -X POST http://:9000/managers/island/start helm uninstall daliuge-daemon + +# Multinode Minikube Setups +Useful for testing multi-node helm chart deployments. +Additional nodes need to be added to a minikube instance. + + minikube add node + +repeatedly, until the desired number of nodes are present. \ No newline at end of file From 7023a41939802da7aa1badf03f0547f5edf74759 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 14 Feb 2022 12:11:11 +0800 Subject: [PATCH 251/484] Adds anti-affinity rule to minikube deployment. Means there will only be a single daliuge-daemon pod deployed on each node. This minimises namespace conflicts. --- .../templates/daliuge-daemon-depl-store-minikube.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml index 83dbd2770..3724f012d 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml @@ -14,6 +14,16 @@ spec: labels: app: daliuge-daemon spec: + affinity: + podAntiAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + - labelSelector: + matchExpressions: + - key: app + operator: In + values: + - daliuge-daemon + topologyKey: kubernetes.io/hostname volumes: - name: dlg-mount hostPath: From 71627ab64aa345c5273ac5f3f4fc7898f6a3ce6e Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 14 Feb 2022 17:07:06 +0800 Subject: [PATCH 252/484] Adds simple function to find k8s node IPs --- daliuge-engine/dlg/deploy/deployment_utils.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/daliuge-engine/dlg/deploy/deployment_utils.py b/daliuge-engine/dlg/deploy/deployment_utils.py index 657c44868..25837e806 100644 --- a/daliuge-engine/dlg/deploy/deployment_utils.py +++ b/daliuge-engine/dlg/deploy/deployment_utils.py @@ -20,6 +20,7 @@ # MA 02111-1307 USA # import json +import subprocess class ListTokens(object): @@ -150,3 +151,11 @@ def num_daliuge_nodes(num_nodes: int, run_proxy: bool): "Not enough nodes {0} to run DALiuGE.".format(num_nodes) ) return ret + + +def find_node_ips(): + query = subprocess.check_output([ + r'kubectl get nodes --selector=kubernetes.io/role!=master -o jsonpath={.items[*].status.addresses[?\(@.type==\"InternalIP\"\)].address}'], + shell=True) + node_ips = query.decode(encoding='utf-8').split(' ') + return node_ips From 894f95b2dc52948463c4dcbe1b881adcc671d91c Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 14 Feb 2022 17:09:31 +0800 Subject: [PATCH 253/484] Adds node option to start_helm_cluster and experiments with scaling --- .../dlg/deploy/start_helm_cluster.py | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/daliuge-engine/dlg/deploy/start_helm_cluster.py b/daliuge-engine/dlg/deploy/start_helm_cluster.py index 24ac2577e..bee5e0037 100644 --- a/daliuge-engine/dlg/deploy/start_helm_cluster.py +++ b/daliuge-engine/dlg/deploy/start_helm_cluster.py @@ -29,8 +29,8 @@ import argparse import json import os -import tempfile +from dlg.deploy.deployment_utils import find_node_ips from dlg.dropmake import pg_generator from dlg.deploy.helm_client import HelmClient @@ -43,11 +43,11 @@ def get_pg(opts, node_managers: list, data_island_managers: list): if opts.logical_graph: unrolled_graph = pg_generator.unroll(opts.logical_graph) - pgt = pg_generator.partition(unrolled_graph, algo='metis', num_partitons=num_nms, + pgt = pg_generator.partition(unrolled_graph, algo='mysarkar', num_partitons=num_nms, num_islands=num_dims) del unrolled_graph else: - with open(opts.physical_graph, 'rb', encoding='utf-8') as pg_file: + with open(opts.physical_graph, 'r', encoding='utf-8') as pg_file: pgt = json.load(pg_file) physical_graph = pg_generator.resource_map(pgt, node_managers + data_island_managers) # TODO: Add dumping to log-dir @@ -56,10 +56,9 @@ def get_pg(opts, node_managers: list, data_island_managers: list): def start_helm(physical_graph_template, num_nodes: int, deploy_dir: str): # TODO: Dynamic helm chart logging dir - # TODO: Multiple node deployments - available_ips = ["127.0.0.1"] + available_ips = find_node_ips() pgt = json.loads(physical_graph_template) - pgt = pg_generator.partition(pgt, algo='metis', num_partitons=len(available_ips), + pgt = pg_generator.partition(pgt, algo='min_num_parts', num_partitons=len(available_ips), num_islands=len(available_ips)) pg = pg_generator.resource_map(pgt, available_ips + available_ips) helm_client = HelmClient( @@ -96,6 +95,15 @@ def main(): help="The filename of the physical graph (template) to deploy", default=None, ) + parser.add_argument( + "-N", + "--num_nodes", + action="store", + type=int, + dest="num_nodes", + help="The number of compute nodes you would like to try and deploy", + default=1 + ) options = parser.parse_args() if bool(options.logical_graph) == bool(options.physical_graph): @@ -106,13 +114,16 @@ def main(): if graph_file_name and not os.path.exists(graph_file_name): parser.error(f"Cannot locate graph_file at {graph_file_name}") - available_ips = ["127.0.0.1"] - physical_graph = get_pg(options, available_ips, available_ips) + if options.num_nodes <= 0: + parser.error("The number of nodes must be a positive integer") + available_ips = find_node_ips() + physical_graph = get_pg(options, available_ips, [available_ips[0]]) + # TODO: dynamic deployment directory. helm_client = HelmClient( deploy_name='daliuge-daemon', chart_name='daliuge-daemon', - deploy_dir='/home/nicholas/dlg_temp/demo' + deploy_dir='/home/nicholas/dlg_temp/demo', ) helm_client.create_helm_chart(json.dumps(physical_graph)) helm_client.launch_helm() From 90732a1af6239db17a4a6c5518fc99d34465e2f3 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 14 Feb 2022 17:09:56 +0800 Subject: [PATCH 254/484] Adds replica scaling to helm_client. Now, all requests to the exposed service hangs. This needs debugging. --- daliuge-engine/dlg/deploy/helm_client.py | 35 +++++++++++++++--------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/daliuge-engine/dlg/deploy/helm_client.py b/daliuge-engine/dlg/deploy/helm_client.py index 7e8b57d4a..740c3afd5 100644 --- a/daliuge-engine/dlg/deploy/helm_client.py +++ b/daliuge-engine/dlg/deploy/helm_client.py @@ -34,6 +34,7 @@ import yaml import subprocess from dlg.common.version import version as dlg_version +from dlg.deploy.deployment_utils import find_node_ips from dlg.restutils import RestClient from dlg.deploy.common import submit @@ -66,9 +67,9 @@ def _find_resources(pgt_data): pgt = json.loads(pgt_data) nodes = list(map(lambda x: x['node'], pgt)) islands = list(map(lambda x: x['island'], pgt)) - num_islands = len(dict(zip(islands, nodes))) - num_nodes = len(nodes) - return num_islands, num_nodes + islands = list(set(islands)) + nodes = list(set(nodes)) + return islands, nodes class HelmClient: @@ -99,6 +100,7 @@ def __init__(self, deploy_name, chart_name="daliuge-daemon", deploy_dir="./", self._submit = submit self._value_data = value_config if value_config is not None else {} self._submission_endpoint = None + self._k8s_nodes = find_node_ips() if physical_graph_file is not None: self._set_physical_graph(physical_graph_file) @@ -113,7 +115,7 @@ def __init__(self, deploy_name, chart_name="daliuge-daemon", deploy_dir="./", def _set_physical_graph(self, physical_graph_content): self._physical_graph_file = physical_graph_content - self._num_islands, self._num_nodes = _find_resources( + self._islands, self._nodes = _find_resources( self._physical_graph_file) def create_helm_chart(self, physical_graph_content): @@ -121,6 +123,9 @@ def create_helm_chart(self, physical_graph_content): Translates a physical graph to a kubernetes helm chart. For now, it will just try to run everything in a single container. """ + # Add charts + # TODO: Add charts to helm + self._set_physical_graph(physical_graph_content) _write_chart(self._chart_dir, 'Chart.yaml', self._chart_name, self._chart_version, dlg_version, self._chart_vars['home'], self._chart_vars['description'], @@ -129,11 +134,8 @@ def create_helm_chart(self, physical_graph_content): # Update values.yaml _write_values(self._chart_dir, self._value_data) self._value_data = _read_values(self._chart_dir) - # Add charts - # TODO: Add charts to helm - self._set_physical_graph(physical_graph_content) # Update template - # TODO: Update templates in helm + # TODO: Set number of replicas def launch_helm(self): """ @@ -144,6 +146,14 @@ def launch_helm(self): os.chdir(self._deploy_dir) instruction = f'helm install {self._deploy_name} {self._chart_name}/ ' \ f'--values {self._chart_name}{os.sep}custom-values.yaml' + print(subprocess.check_output([instruction], + shell=True).decode('utf-8')) + req_machines = set() + req_machines.update(set(self._nodes)) + req_machines.update(set(self._islands)) + num_machines = len(req_machines) + del req_machines + instruction = f'kubectl scale --replicas={num_machines} deployment {self._deploy_name}-deployment' print(subprocess.check_output([instruction], shell=True).decode('utf-8')) query = str(subprocess.check_output(['kubectl get svc -o wide'], shell=True)) @@ -152,12 +162,11 @@ def launch_helm(self): ip_pattern = r"\d+\.\d+\.\d+\.\d+" outcome = re.search(pattern, query) if outcome: - manager_ip = re.search(ip_pattern, outcome.string) - self._submission_endpoint = manager_ip.group(0) + manager_ip = re.search(ip_pattern, outcome.string).group(0) + self._submission_endpoint = manager_ip client = RestClient(self._submission_endpoint, - self._value_data['service']['daemon']['port']) - data = json.dumps({'nodes': ["127.0.0.1"]}).encode('utf-8') - time.sleep(5) # TODO: Deterministic deployment information + self._value_data['service']['daemon']['port'], timeout=30) + data = json.dumps({'nodes': self._nodes}).encode('utf-8') client._POST('/managers/island/start', content=data, content_type='application/json') client._POST('/managers/master/start', content=data, From 6ee93a51255d3223739482423b5f867fcaa0d761 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Fri, 18 Feb 2022 11:40:35 +0800 Subject: [PATCH 255/484] Broken dreams attempting to run multiple daliuge instances. --- daliuge-engine/dlg/deploy/helm_client.py | 11 ++++---- .../dlg/deploy/start_helm_cluster.py | 2 +- .../daliuge-daemon-depl-store-minikube.yaml | 25 ++++++++++--------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/daliuge-engine/dlg/deploy/helm_client.py b/daliuge-engine/dlg/deploy/helm_client.py index 740c3afd5..121028478 100644 --- a/daliuge-engine/dlg/deploy/helm_client.py +++ b/daliuge-engine/dlg/deploy/helm_client.py @@ -153,12 +153,12 @@ def launch_helm(self): req_machines.update(set(self._islands)) num_machines = len(req_machines) del req_machines - instruction = f'kubectl scale --replicas={num_machines} deployment {self._deploy_name}-deployment' - print(subprocess.check_output([instruction], - shell=True).decode('utf-8')) + # instruction = f'kubectl scale --replicas={num_machines} statefulset/{self._deploy_name}-deployment' + #print(subprocess.check_output([instruction], + # shell=True).decode('utf-8')) query = str(subprocess.check_output(['kubectl get svc -o wide'], shell=True)) # WARNING: May be problematic later if multiple services are running - pattern = r"-service\s*ClusterIP\s*\d+\.\d+\.\d+\.\d+" + pattern = r"-service\s*NodePort\s*\d+\.\d+\.\d+\.\d+" ip_pattern = r"\d+\.\d+\.\d+\.\d+" outcome = re.search(pattern, query) if outcome: @@ -166,7 +166,8 @@ def launch_helm(self): self._submission_endpoint = manager_ip client = RestClient(self._submission_endpoint, self._value_data['service']['daemon']['port'], timeout=30) - data = json.dumps({'nodes': self._nodes}).encode('utf-8') + data = json.dumps({'nodes': ['127.0.0.1']}).encode('utf-8') + time.sleep(5) client._POST('/managers/island/start', content=data, content_type='application/json') client._POST('/managers/master/start', content=data, diff --git a/daliuge-engine/dlg/deploy/start_helm_cluster.py b/daliuge-engine/dlg/deploy/start_helm_cluster.py index bee5e0037..a6d9330fd 100644 --- a/daliuge-engine/dlg/deploy/start_helm_cluster.py +++ b/daliuge-engine/dlg/deploy/start_helm_cluster.py @@ -123,7 +123,7 @@ def main(): helm_client = HelmClient( deploy_name='daliuge-daemon', chart_name='daliuge-daemon', - deploy_dir='/home/nicholas/dlg_temp/demo', + deploy_dir='~/dlg_temp/demo', ) helm_client.create_helm_chart(json.dumps(physical_graph)) helm_client.launch_helm() diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml index 3724f012d..d77ad2cad 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml @@ -1,5 +1,5 @@ apiVersion: apps/v1 -kind: Deployment +kind: StatefulSet metadata: name: daliuge-daemon-deployment labels: @@ -9,21 +9,22 @@ spec: selector: matchLabels: app: daliuge-daemon + serviceName: "daliuge" template: metadata: labels: app: daliuge-daemon spec: - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: app - operator: In - values: - - daliuge-daemon - topologyKey: kubernetes.io/hostname + #affinity: + # podAntiAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # - labelSelector: + # matchExpressions: + # - key: app + # operator: In + # values: + # - daliuge-daemon + # topologyKey: kubernetes.io/hostname volumes: - name: dlg-mount hostPath: @@ -41,4 +42,4 @@ spec: valueFrom: configMapKeyRef: name: daliuge-daemon-configmap - key: dlg_root + key: dlg_root \ No newline at end of file From 9687487b14aa236490bec1198998fa20af05038b Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 21 Feb 2022 16:37:32 +0800 Subject: [PATCH 256/484] A much closer attempt at a k8s deployment. --- daliuge-engine/dlg/deploy/deployment_utils.py | 36 ++++++++ daliuge-engine/dlg/deploy/helm_client.py | 90 +++++++++++-------- .../dlg/deploy/start_helm_cluster.py | 4 +- .../templates/daliuge-daemon-configmap.yaml | 2 +- .../daliuge-daemon-depl-store-minikube.yaml | 23 ++--- .../templates/daliuge-daemon-service.yaml | 6 +- daliuge-k8s/helm/daliuge-daemon/values.yaml | 1 + 7 files changed, 104 insertions(+), 58 deletions(-) diff --git a/daliuge-engine/dlg/deploy/deployment_utils.py b/daliuge-engine/dlg/deploy/deployment_utils.py index 25837e806..6a9627a10 100644 --- a/daliuge-engine/dlg/deploy/deployment_utils.py +++ b/daliuge-engine/dlg/deploy/deployment_utils.py @@ -21,6 +21,8 @@ # import json import subprocess +import re +import time class ListTokens(object): @@ -159,3 +161,37 @@ def find_node_ips(): shell=True) node_ips = query.decode(encoding='utf-8').split(' ') return node_ips + + +def find_service_ips(): + query = str(subprocess.check_output([ + r'kubectl get svc -o wide'], + shell=True)) + pattern = r"daliuge-daemon-service-\d+\s*ClusterIP\s*\d+\.\d+\.\d+\.\d+" + ip_pattern = r"\d+\.\d+\.\d+\.\d+" + outcome = re.findall(pattern, query) + ips = [] + for service in outcome: + ip = re.search(ip_pattern, service) + if ip: + ips.append(ip.group(0)) + return ips + + +def find_pod_ips(retries=3, timeout=10): + ips = [] + attempts = 0 + while ips == [] and attempts < retries: + query = str(subprocess.check_output([ + r'kubectl get pods -o wide'], + shell=True).decode(encoding='utf-8')) + pattern = r"^daliuge-daemon-deployment.*" + ip_pattern = r"\d+\.\d+\.\d+\.\d+" + outcome = re.findall(pattern, query, re.M) + for pod in outcome: + ip = re.search(ip_pattern, pod) + if ip: + ips.append(ip.group(0)) + print(ips) + time.sleep(timeout) + return ips diff --git a/daliuge-engine/dlg/deploy/helm_client.py b/daliuge-engine/dlg/deploy/helm_client.py index 121028478..32e2be2ba 100644 --- a/daliuge-engine/dlg/deploy/helm_client.py +++ b/daliuge-engine/dlg/deploy/helm_client.py @@ -34,11 +34,18 @@ import yaml import subprocess from dlg.common.version import version as dlg_version -from dlg.deploy.deployment_utils import find_node_ips +from dlg.deploy.deployment_utils import find_node_ips, find_service_ips, find_pod_ips from dlg.restutils import RestClient from dlg.deploy.common import submit +def _num_deployments_required(islands, nodes): + machines = set() + machines.update(islands) + machines.update(nodes) + return len(machines) + + def _write_chart(chart_dir, name: str, chart_name: str, version: str, app_version: str, home: str, description, keywords: list, sources: list, kubeVersion: str): chart_info = {'apiVersion': "v2", 'name': chart_name, 'type': 'application', 'version': version, @@ -50,7 +57,7 @@ def _write_chart(chart_dir, name: str, chart_name: str, version: str, app_versio def _write_values(chart_dir, config): - with open(f"{chart_dir}{os.sep}custom-values.yaml", 'w', encoding='utf-8') as value_file: + with open(f"{chart_dir}{os.sep}custom-values.yaml", 'w+', encoding='utf-8') as value_file: yaml.dump(config, value_file) @@ -101,6 +108,8 @@ def __init__(self, deploy_name, chart_name="daliuge-daemon", deploy_dir="./", self._value_data = value_config if value_config is not None else {} self._submission_endpoint = None self._k8s_nodes = find_node_ips() + self._num_machines = 1 + self._pod_details = {} if physical_graph_file is not None: self._set_physical_graph(physical_graph_file) @@ -117,6 +126,16 @@ def _set_physical_graph(self, physical_graph_content): self._physical_graph_file = physical_graph_content self._islands, self._nodes = _find_resources( self._physical_graph_file) + self._num_machines = _num_deployments_required(self._islands, self._nodes) + + def _find_pod_details(self): + service_ips = find_service_ips() + pod_ips = find_pod_ips() + labels = sorted([str(x) for x in range(self._num_machines)]) + for i in range(len(labels)): + self._pod_details[labels[i]] = {'svc': service_ips[i], + 'ip': pod_ips[i]} + print(self._pod_details) def create_helm_chart(self, physical_graph_content): """ @@ -124,7 +143,6 @@ def create_helm_chart(self, physical_graph_content): For now, it will just try to run everything in a single container. """ # Add charts - # TODO: Add charts to helm self._set_physical_graph(physical_graph_content) _write_chart(self._chart_dir, 'Chart.yaml', self._chart_name, self._chart_version, dlg_version, @@ -135,7 +153,28 @@ def create_helm_chart(self, physical_graph_content): _write_values(self._chart_dir, self._value_data) self._value_data = _read_values(self._chart_dir) # Update template - # TODO: Set number of replicas + + def start_manager(self, manager_node): + self._submission_endpoint = self._pod_details[manager_node]['svc'] + client = RestClient(self._submission_endpoint, + self._value_data['service']['daemon']['port'], timeout=30) + node_ips = [x['ip'] for x in self._pod_details.values()] + data = json.dumps({'nodes': node_ips}).encode('utf-8') + time.sleep(5) + client._POST('/managers/island/start', content=data, + content_type='application/json') + client._POST('/managers/master/start', content=data, + content_type='application/json') + + def start_nodes(self): + ips = [x['svc'] for x in self._pod_details.values()] + for ip in ips: + client = RestClient( + ip, + self._value_data['service']['nodemgr']['port'], + timeout=30 + ) + client._GET('/managers/node/start') def launch_helm(self): """ @@ -144,42 +183,21 @@ def launch_helm(self): """ if self._submit: os.chdir(self._deploy_dir) - instruction = f'helm install {self._deploy_name} {self._chart_name}/ ' \ - f'--values {self._chart_name}{os.sep}custom-values.yaml' - print(subprocess.check_output([instruction], - shell=True).decode('utf-8')) - req_machines = set() - req_machines.update(set(self._nodes)) - req_machines.update(set(self._islands)) - num_machines = len(req_machines) - del req_machines - # instruction = f'kubectl scale --replicas={num_machines} statefulset/{self._deploy_name}-deployment' - #print(subprocess.check_output([instruction], - # shell=True).decode('utf-8')) - query = str(subprocess.check_output(['kubectl get svc -o wide'], shell=True)) - # WARNING: May be problematic later if multiple services are running - pattern = r"-service\s*NodePort\s*\d+\.\d+\.\d+\.\d+" - ip_pattern = r"\d+\.\d+\.\d+\.\d+" - outcome = re.search(pattern, query) - if outcome: - manager_ip = re.search(ip_pattern, outcome.string).group(0) - self._submission_endpoint = manager_ip - client = RestClient(self._submission_endpoint, - self._value_data['service']['daemon']['port'], timeout=30) - data = json.dumps({'nodes': ['127.0.0.1']}).encode('utf-8') - time.sleep(5) - client._POST('/managers/island/start', content=data, - content_type='application/json') - client._POST('/managers/master/start', content=data, - content_type='application/json') - else: - print("Could not find manager IP address") - + for i in range(self._num_machines): + _write_values(self._chart_dir, {'deploy_id': i, 'name': f'{self._chart_name}-{i}'}) + instruction = f'helm install {self._deploy_name}-{i} {self._chart_name}/ ' \ + f'--values {self._chart_name}{os.sep}custom-values.yaml' + print(subprocess.check_output([instruction], + shell=True).decode('utf-8')) + # TODO: Check running nodes before launching another + self._find_pod_details() + self.start_manager("0") else: print(f"Created helm chart {self._chart_name} in {self._deploy_dir}") def teardown(self): - subprocess.check_output(['helm uninstall daliuge-daemon'], shell=True) + for i in range(self._num_machines): + subprocess.check_output([f'helm uninstall daliuge-daemon-{i}'], shell=True) def submit_job(self): """ diff --git a/daliuge-engine/dlg/deploy/start_helm_cluster.py b/daliuge-engine/dlg/deploy/start_helm_cluster.py index a6d9330fd..60a64b3cb 100644 --- a/daliuge-engine/dlg/deploy/start_helm_cluster.py +++ b/daliuge-engine/dlg/deploy/start_helm_cluster.py @@ -123,11 +123,11 @@ def main(): helm_client = HelmClient( deploy_name='daliuge-daemon', chart_name='daliuge-daemon', - deploy_dir='~/dlg_temp/demo', + deploy_dir='/home/nicholas/dlg_temp/demo/', ) helm_client.create_helm_chart(json.dumps(physical_graph)) helm_client.launch_helm() - helm_client.submit_job() + # helm_client.submit_job() helm_client.teardown() diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml index 43ab6312b..f694fe992 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml @@ -1,6 +1,6 @@ apiVersion: v1 kind: ConfigMap metadata: - name: daliuge-daemon-configmap + name: daliuge-daemon-configmap-{{ .Values.deploy_id }} data: dlg_root: {{ .Values.dlg_root_in_container }} diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml index d77ad2cad..c4cfc3d89 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml @@ -1,30 +1,19 @@ apiVersion: apps/v1 -kind: StatefulSet +kind: Deployment metadata: - name: daliuge-daemon-deployment + name: daliuge-daemon-deployment-{{ .Values.deploy_id }} labels: - app: daliuge-daemon + app: daliuge-daemon-{{ .Values.deploy_id }} spec: replicas: 1 selector: matchLabels: - app: daliuge-daemon - serviceName: "daliuge" + app: daliuge-daemon-{{ .Values.deploy_id }} template: metadata: labels: - app: daliuge-daemon + app: daliuge-daemon-{{ .Values.deploy_id }} spec: - #affinity: - # podAntiAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # - labelSelector: - # matchExpressions: - # - key: app - # operator: In - # values: - # - daliuge-daemon - # topologyKey: kubernetes.io/hostname volumes: - name: dlg-mount hostPath: @@ -41,5 +30,5 @@ spec: - name: DLG_ROOT valueFrom: configMapKeyRef: - name: daliuge-daemon-configmap + name: daliuge-daemon-configmap-{{ .Values.deploy_id }} key: dlg_root \ No newline at end of file diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml index 074d98812..41279b410 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml @@ -1,10 +1,11 @@ +{{- if .Values.master.enabled -}} apiVersion: v1 kind: Service metadata: name: daliuge-daemon-service spec: selector: - app: daliuge-daemon + app: daliuge-daemon-{{ .Values.deploy_id }} ports: - protocol: TCP name: {{ .Values.service.daemon.name }} @@ -17,4 +18,5 @@ spec: - protocol: TCP name: {{ .Values.service.nodemgr.name }} port: {{ .Values.service.nodemgr.port }} - targetPort: {{ .Values.containers.ports.nodemanagerPort }} \ No newline at end of file + targetPort: {{ .Values.containers.ports.nodemanagerPort }} +{{- end }} \ No newline at end of file diff --git a/daliuge-k8s/helm/daliuge-daemon/values.yaml b/daliuge-k8s/helm/daliuge-daemon/values.yaml index e51a922be..26bda9ab7 100644 --- a/daliuge-k8s/helm/daliuge-daemon/values.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/values.yaml @@ -1,6 +1,7 @@ name: daliuge-daemon dlg_root_on_cluster_nodes: /dlg dlg_root_in_container: /dlg +deploy_id: master containers: name: icrar/daliuge-engine:2.0.1 ports: From f4afd2766c3409401a627c2100d46d1210a9b356 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 21 Feb 2022 18:25:10 +0800 Subject: [PATCH 257/484] Reverts back to a scaling stateful set approach. --- daliuge-engine/dlg/deploy/deployment_utils.py | 4 +- daliuge-engine/dlg/deploy/helm_client.py | 39 ++++++++++++------- .../dlg/deploy/start_helm_cluster.py | 6 +-- .../templates/daliuge-daemon-configmap.yaml | 2 +- .../daliuge-daemon-depl-store-minikube.yaml | 13 ++++--- .../templates/daliuge-daemon-service.yaml | 6 +-- daliuge-k8s/helm/daliuge-daemon/values.yaml | 1 - 7 files changed, 38 insertions(+), 33 deletions(-) diff --git a/daliuge-engine/dlg/deploy/deployment_utils.py b/daliuge-engine/dlg/deploy/deployment_utils.py index 6a9627a10..3e608efe4 100644 --- a/daliuge-engine/dlg/deploy/deployment_utils.py +++ b/daliuge-engine/dlg/deploy/deployment_utils.py @@ -167,7 +167,7 @@ def find_service_ips(): query = str(subprocess.check_output([ r'kubectl get svc -o wide'], shell=True)) - pattern = r"daliuge-daemon-service-\d+\s*ClusterIP\s*\d+\.\d+\.\d+\.\d+" + pattern = r"daliuge-daemon-service\s*ClusterIP\s*\d+\.\d+\.\d+\.\d+" ip_pattern = r"\d+\.\d+\.\d+\.\d+" outcome = re.findall(pattern, query) ips = [] @@ -185,7 +185,7 @@ def find_pod_ips(retries=3, timeout=10): query = str(subprocess.check_output([ r'kubectl get pods -o wide'], shell=True).decode(encoding='utf-8')) - pattern = r"^daliuge-daemon-deployment.*" + pattern = r"^daliuge-daemon.*" ip_pattern = r"\d+\.\d+\.\d+\.\d+" outcome = re.findall(pattern, query, re.M) for pod in outcome: diff --git a/daliuge-engine/dlg/deploy/helm_client.py b/daliuge-engine/dlg/deploy/helm_client.py index 32e2be2ba..064c6c7ff 100644 --- a/daliuge-engine/dlg/deploy/helm_client.py +++ b/daliuge-engine/dlg/deploy/helm_client.py @@ -23,7 +23,6 @@ Contains a module translating physical graphs to kubernetes helm charts. """ import json -import re import time import os import sys @@ -37,6 +36,7 @@ from dlg.deploy.deployment_utils import find_node_ips, find_service_ips, find_pod_ips from dlg.restutils import RestClient from dlg.deploy.common import submit +from dlg.dropmake import pg_generator def _num_deployments_required(islands, nodes): @@ -133,8 +133,8 @@ def _find_pod_details(self): pod_ips = find_pod_ips() labels = sorted([str(x) for x in range(self._num_machines)]) for i in range(len(labels)): - self._pod_details[labels[i]] = {'svc': service_ips[i], - 'ip': pod_ips[i]} + self._pod_details[labels[i]] = {'ip': pod_ips[i]} + self._pod_details['master'] = {'ip': service_ips[0]} print(self._pod_details) def create_helm_chart(self, physical_graph_content): @@ -155,10 +155,11 @@ def create_helm_chart(self, physical_graph_content): # Update template def start_manager(self, manager_node): - self._submission_endpoint = self._pod_details[manager_node]['svc'] + self._submission_endpoint = self._pod_details[manager_node]['ip'] client = RestClient(self._submission_endpoint, self._value_data['service']['daemon']['port'], timeout=30) node_ips = [x['ip'] for x in self._pod_details.values()] + node_ips.remove(self._pod_details['master']['ip']) data = json.dumps({'nodes': node_ips}).encode('utf-8') time.sleep(5) client._POST('/managers/island/start', content=data, @@ -183,26 +184,34 @@ def launch_helm(self): """ if self._submit: os.chdir(self._deploy_dir) - for i in range(self._num_machines): - _write_values(self._chart_dir, {'deploy_id': i, 'name': f'{self._chart_name}-{i}'}) - instruction = f'helm install {self._deploy_name}-{i} {self._chart_name}/ ' \ - f'--values {self._chart_name}{os.sep}custom-values.yaml' - print(subprocess.check_output([instruction], + instruction = f'helm install {self._deploy_name} {self._chart_name}/ ' \ + f'--values {self._chart_name}{os.sep}custom-values.yaml' + print(subprocess.check_output([instruction], shell=True).decode('utf-8')) - # TODO: Check running nodes before launching another + instruction = f'kubectl scale --replicas={self._num_machines} statefulset/{self._deploy_name}' + print(subprocess.check_output([instruction], + shell=True).decode('utf-8')) + + # TODO: Check running nodes before launching another self._find_pod_details() - self.start_manager("0") + self.start_manager("master") else: print(f"Created helm chart {self._chart_name} in {self._deploy_dir}") def teardown(self): - for i in range(self._num_machines): - subprocess.check_output([f'helm uninstall daliuge-daemon-{i}'], shell=True) + subprocess.check_output([f'helm uninstall daliuge-daemon'], shell=True) def submit_job(self): """ There is a semi-dynamic element to fetching the IPs of Node(s) to deploy to. Hence, launching the chart and initiating graph execution have been de-coupled. """ - pg_data = json.loads(self._physical_graph_file) - submit(pg_data, self._submission_endpoint) + # TODO: Check all nodes are operational first. + pgt_data = json.loads(self._physical_graph_file) + node_ips = [x['ip'] for x in self._pod_details.values()] + node_ips.remove(self._pod_details['master']['ip']) + physical_graph = pg_generator.resource_map(pgt_data, node_ips) + print(json.dumps(physical_graph, indent=4)) + # TODO: Add dumping to log-dir + print(self._submission_endpoint) + submit(physical_graph, self._submission_endpoint, skip_deploy=True) diff --git a/daliuge-engine/dlg/deploy/start_helm_cluster.py b/daliuge-engine/dlg/deploy/start_helm_cluster.py index 60a64b3cb..c2ff6c73f 100644 --- a/daliuge-engine/dlg/deploy/start_helm_cluster.py +++ b/daliuge-engine/dlg/deploy/start_helm_cluster.py @@ -49,9 +49,7 @@ def get_pg(opts, node_managers: list, data_island_managers: list): else: with open(opts.physical_graph, 'r', encoding='utf-8') as pg_file: pgt = json.load(pg_file) - physical_graph = pg_generator.resource_map(pgt, node_managers + data_island_managers) - # TODO: Add dumping to log-dir - return physical_graph + return pgt def start_helm(physical_graph_template, num_nodes: int, deploy_dir: str): @@ -127,7 +125,7 @@ def main(): ) helm_client.create_helm_chart(json.dumps(physical_graph)) helm_client.launch_helm() - # helm_client.submit_job() + helm_client.submit_job() helm_client.teardown() diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml index f694fe992..43ab6312b 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml @@ -1,6 +1,6 @@ apiVersion: v1 kind: ConfigMap metadata: - name: daliuge-daemon-configmap-{{ .Values.deploy_id }} + name: daliuge-daemon-configmap data: dlg_root: {{ .Values.dlg_root_in_container }} diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml index c4cfc3d89..0004ff643 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml @@ -1,18 +1,19 @@ apiVersion: apps/v1 -kind: Deployment +kind: StatefulSet metadata: - name: daliuge-daemon-deployment-{{ .Values.deploy_id }} + name: daliuge-daemon labels: - app: daliuge-daemon-{{ .Values.deploy_id }} + app: daliuge-daemon spec: replicas: 1 selector: matchLabels: - app: daliuge-daemon-{{ .Values.deploy_id }} + app: daliuge-daemon + serviceName: "daliuge" template: metadata: labels: - app: daliuge-daemon-{{ .Values.deploy_id }} + app: daliuge-daemon spec: volumes: - name: dlg-mount @@ -30,5 +31,5 @@ spec: - name: DLG_ROOT valueFrom: configMapKeyRef: - name: daliuge-daemon-configmap-{{ .Values.deploy_id }} + name: daliuge-daemon-configmap key: dlg_root \ No newline at end of file diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml index 41279b410..8a03bbb7f 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml @@ -1,11 +1,10 @@ -{{- if .Values.master.enabled -}} apiVersion: v1 kind: Service metadata: name: daliuge-daemon-service spec: selector: - app: daliuge-daemon-{{ .Values.deploy_id }} + statefulset.kubernetes.io/pod-name: daliuge-daemon-0 ports: - protocol: TCP name: {{ .Values.service.daemon.name }} @@ -18,5 +17,4 @@ spec: - protocol: TCP name: {{ .Values.service.nodemgr.name }} port: {{ .Values.service.nodemgr.port }} - targetPort: {{ .Values.containers.ports.nodemanagerPort }} -{{- end }} \ No newline at end of file + targetPort: {{ .Values.containers.ports.nodemanagerPort }} \ No newline at end of file diff --git a/daliuge-k8s/helm/daliuge-daemon/values.yaml b/daliuge-k8s/helm/daliuge-daemon/values.yaml index 26bda9ab7..e51a922be 100644 --- a/daliuge-k8s/helm/daliuge-daemon/values.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/values.yaml @@ -1,7 +1,6 @@ name: daliuge-daemon dlg_root_on_cluster_nodes: /dlg dlg_root_in_container: /dlg -deploy_id: master containers: name: icrar/daliuge-engine:2.0.1 ports: From d869c17f42cd2a3dc9b7a97f6e833295011c0f70 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Mon, 21 Feb 2022 20:59:34 +0800 Subject: [PATCH 258/484] Re-implements manually scaled deployment options. Makes ip finding deterministic. --- daliuge-engine/dlg/deploy/deployment_utils.py | 30 +++++++------ daliuge-engine/dlg/deploy/helm_client.py | 43 ++++++++++++------- .../templates/daliuge-daemon-configmap.yaml | 2 +- .../daliuge-daemon-depl-store-minikube.yaml | 10 ++--- .../templates/daliuge-daemon-service.yaml | 4 +- daliuge-k8s/helm/daliuge-daemon/values.yaml | 1 + 6 files changed, 55 insertions(+), 35 deletions(-) diff --git a/daliuge-engine/dlg/deploy/deployment_utils.py b/daliuge-engine/dlg/deploy/deployment_utils.py index 3e608efe4..bfb6f41a7 100644 --- a/daliuge-engine/dlg/deploy/deployment_utils.py +++ b/daliuge-engine/dlg/deploy/deployment_utils.py @@ -163,25 +163,31 @@ def find_node_ips(): return node_ips -def find_service_ips(): - query = str(subprocess.check_output([ - r'kubectl get svc -o wide'], - shell=True)) - pattern = r"daliuge-daemon-service\s*ClusterIP\s*\d+\.\d+\.\d+\.\d+" +def find_service_ips(num_expected, retries=3, timeout=10): + pattern = r"^daliuge-daemon-service-.*\s*ClusterIP\s*\d+\.\d+\.\d+\.\d+" ip_pattern = r"\d+\.\d+\.\d+\.\d+" - outcome = re.findall(pattern, query) ips = [] - for service in outcome: - ip = re.search(ip_pattern, service) - if ip: - ips.append(ip.group(0)) + attempts = 0 + while len(ips) < num_expected and attempts < retries: + ips = [] + query = subprocess.check_output([ + r'kubectl get svc -o wide'], + shell=True).decode(encoding='utf-8') + outcome = re.findall(pattern, query, re.M) + for service in outcome: + ip = re.search(ip_pattern, service) + if ip: + ips.append(ip.group(0)) + print(ips) + time.sleep(timeout) return ips -def find_pod_ips(retries=3, timeout=10): +def find_pod_ips(num_expected, retries=3, timeout=10): ips = [] attempts = 0 - while ips == [] and attempts < retries: + while len(ips) < num_expected and attempts < retries: + ips = [] query = str(subprocess.check_output([ r'kubectl get pods -o wide'], shell=True).decode(encoding='utf-8')) diff --git a/daliuge-engine/dlg/deploy/helm_client.py b/daliuge-engine/dlg/deploy/helm_client.py index 064c6c7ff..b36a6f1ce 100644 --- a/daliuge-engine/dlg/deploy/helm_client.py +++ b/daliuge-engine/dlg/deploy/helm_client.py @@ -37,6 +37,7 @@ from dlg.restutils import RestClient from dlg.deploy.common import submit from dlg.dropmake import pg_generator +from dlg.constants import MASTER_DEFAULT_REST_PORT def _num_deployments_required(islands, nodes): @@ -129,12 +130,14 @@ def _set_physical_graph(self, physical_graph_content): self._num_machines = _num_deployments_required(self._islands, self._nodes) def _find_pod_details(self): - service_ips = find_service_ips() - pod_ips = find_pod_ips() + # NOTE: +1 for the master. + service_ips = find_service_ips(self._num_machines+1) + pod_ips = find_pod_ips(self._num_machines+1) labels = sorted([str(x) for x in range(self._num_machines)]) for i in range(len(labels)): - self._pod_details[labels[i]] = {'ip': pod_ips[i]} - self._pod_details['master'] = {'ip': service_ips[0]} + self._pod_details[labels[i]] = {'ip': pod_ips[i], 'svc': service_ips[i]} + self._pod_details['master'] = {'ip': pod_ips[-1], + 'svc': service_ips[-1]} print(self._pod_details) def create_helm_chart(self, physical_graph_content): @@ -155,13 +158,13 @@ def create_helm_chart(self, physical_graph_content): # Update template def start_manager(self, manager_node): - self._submission_endpoint = self._pod_details[manager_node]['ip'] + self._submission_endpoint = self._pod_details[manager_node]['svc'] client = RestClient(self._submission_endpoint, self._value_data['service']['daemon']['port'], timeout=30) node_ips = [x['ip'] for x in self._pod_details.values()] - node_ips.remove(self._pod_details['master']['ip']) data = json.dumps({'nodes': node_ips}).encode('utf-8') time.sleep(5) + print(f"Starting manager on {self._submission_endpoint}") client._POST('/managers/island/start', content=data, content_type='application/json') client._POST('/managers/master/start', content=data, @@ -169,13 +172,19 @@ def start_manager(self, manager_node): def start_nodes(self): ips = [x['svc'] for x in self._pod_details.values()] + ips.remove(self._pod_details['master']['svc']) for ip in ips: client = RestClient( ip, - self._value_data['service']['nodemgr']['port'], + self._value_data['service']['daemon']['port'], timeout=30 ) - client._GET('/managers/node/start') + time.sleep(5) + print(f"Starting node on {ip}") + node_ips = [x['ip'] for x in self._pod_details.values()] + data = json.dumps({'nodes': node_ips}).encode('utf-8') + client._POST("/managers/island/start", content=data, + content_type='application/json') def launch_helm(self): """ @@ -184,17 +193,21 @@ def launch_helm(self): """ if self._submit: os.chdir(self._deploy_dir) - instruction = f'helm install {self._deploy_name} {self._chart_name}/ ' \ + _write_values(self._chart_dir, {'deploy_id': 'master', 'name': f'{self._chart_name}-master'}) + instruction = f'helm install {self._deploy_name}-master {self._chart_name}/ ' \ f'--values {self._chart_name}{os.sep}custom-values.yaml' - print(subprocess.check_output([instruction], - shell=True).decode('utf-8')) - instruction = f'kubectl scale --replicas={self._num_machines} statefulset/{self._deploy_name}' print(subprocess.check_output([instruction], shell=True).decode('utf-8')) - - # TODO: Check running nodes before launching another + for i in range(self._num_machines): + _write_values(self._chart_dir, {'deploy_id': i, 'name': f'{self._chart_name}-{i}'}) + instruction = f'helm install {self._deploy_name}-{i} {self._chart_name}/ ' \ + f'--values {self._chart_name}{os.sep}custom-values.yaml' + print(subprocess.check_output([instruction], + shell=True).decode('utf-8')) + # TODO: Check running nodes before launching another self._find_pod_details() self.start_manager("master") + self.start_nodes() else: print(f"Created helm chart {self._chart_name} in {self._deploy_dir}") @@ -214,4 +227,4 @@ def submit_job(self): print(json.dumps(physical_graph, indent=4)) # TODO: Add dumping to log-dir print(self._submission_endpoint) - submit(physical_graph, self._submission_endpoint, skip_deploy=True) + submit(physical_graph, self._submission_endpoint, port=MASTER_DEFAULT_REST_PORT, skip_deploy=True) diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml index 43ab6312b..f694fe992 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-configmap.yaml @@ -1,6 +1,6 @@ apiVersion: v1 kind: ConfigMap metadata: - name: daliuge-daemon-configmap + name: daliuge-daemon-configmap-{{ .Values.deploy_id }} data: dlg_root: {{ .Values.dlg_root_in_container }} diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml index 0004ff643..73663d768 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-depl-store-minikube.yaml @@ -1,19 +1,19 @@ apiVersion: apps/v1 kind: StatefulSet metadata: - name: daliuge-daemon + name: daliuge-daemon-deployment-{{ .Values.deploy_id }} labels: - app: daliuge-daemon + app: daliuge-daemon-{{ .Values.deploy_id }} spec: replicas: 1 selector: matchLabels: - app: daliuge-daemon + app: daliuge-daemon-{{ .Values.deploy_id }} serviceName: "daliuge" template: metadata: labels: - app: daliuge-daemon + app: daliuge-daemon-{{ .Values.deploy_id }} spec: volumes: - name: dlg-mount @@ -31,5 +31,5 @@ spec: - name: DLG_ROOT valueFrom: configMapKeyRef: - name: daliuge-daemon-configmap + name: daliuge-daemon-configmap-{{ .Values.deploy_id }} key: dlg_root \ No newline at end of file diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml index 8a03bbb7f..b1377c2bc 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml @@ -1,10 +1,10 @@ apiVersion: v1 kind: Service metadata: - name: daliuge-daemon-service + name: daliuge-daemon-service-{{ .Values.deploy_id}} spec: selector: - statefulset.kubernetes.io/pod-name: daliuge-daemon-0 + app: daliuge-daemon-{{ .Values.deploy_id }} ports: - protocol: TCP name: {{ .Values.service.daemon.name }} diff --git a/daliuge-k8s/helm/daliuge-daemon/values.yaml b/daliuge-k8s/helm/daliuge-daemon/values.yaml index e51a922be..26bda9ab7 100644 --- a/daliuge-k8s/helm/daliuge-daemon/values.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/values.yaml @@ -1,6 +1,7 @@ name: daliuge-daemon dlg_root_on_cluster_nodes: /dlg dlg_root_in_container: /dlg +deploy_id: master containers: name: icrar/daliuge-engine:2.0.1 ports: From 5cdaae25eb027f9d7159090acbcb5b4ce118b982 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Wed, 23 Feb 2022 14:10:16 +0800 Subject: [PATCH 259/484] Working towards multi-node deployments with simple single-node deployments. --- daliuge-engine/dlg/deploy/deployment_utils.py | 31 +++++++++++++++ daliuge-engine/dlg/deploy/helm_client.py | 39 ++++++++++++------- .../dlg/deploy/start_helm_cluster.py | 27 ++++++++----- .../templates/daliuge-daemon-service.yaml | 6 ++- daliuge-k8s/helm/daliuge-daemon/values.yaml | 6 ++- 5 files changed, 82 insertions(+), 27 deletions(-) diff --git a/daliuge-engine/dlg/deploy/deployment_utils.py b/daliuge-engine/dlg/deploy/deployment_utils.py index bfb6f41a7..662e2fd56 100644 --- a/daliuge-engine/dlg/deploy/deployment_utils.py +++ b/daliuge-engine/dlg/deploy/deployment_utils.py @@ -201,3 +201,34 @@ def find_pod_ips(num_expected, retries=3, timeout=10): print(ips) time.sleep(timeout) return ips + + +def _status_all_running(statuses): + if statuses == []: + return False + for status in statuses: + if status != "Running": + return False + return True + + +def wait_for_pods(num_expected, retries=18, timeout=10): + all_running = False + attempts = 0 + while not all_running and attempts < retries: + query = str(subprocess.check_output([ + r'kubectl get pods -o wide'], + shell=True).decode(encoding='utf-8')) + print(query) + pattern = r"^daliuge-daemon.*" + outcome = re.findall(pattern, query, re.M) + if len(outcome) < num_expected: + all_running = False + continue + all_running = True + for pod in outcome: + if "Running" not in pod: + all_running = False + attempts += 1 + time.sleep(timeout) + return all_running diff --git a/daliuge-engine/dlg/deploy/helm_client.py b/daliuge-engine/dlg/deploy/helm_client.py index b36a6f1ce..33c007548 100644 --- a/daliuge-engine/dlg/deploy/helm_client.py +++ b/daliuge-engine/dlg/deploy/helm_client.py @@ -33,11 +33,10 @@ import yaml import subprocess from dlg.common.version import version as dlg_version -from dlg.deploy.deployment_utils import find_node_ips, find_service_ips, find_pod_ips +from dlg.deploy.deployment_utils import find_node_ips, find_service_ips, find_pod_ips, wait_for_pods from dlg.restutils import RestClient from dlg.deploy.common import submit from dlg.dropmake import pg_generator -from dlg.constants import MASTER_DEFAULT_REST_PORT def _num_deployments_required(islands, nodes): @@ -162,13 +161,13 @@ def start_manager(self, manager_node): client = RestClient(self._submission_endpoint, self._value_data['service']['daemon']['port'], timeout=30) node_ips = [x['ip'] for x in self._pod_details.values()] - data = json.dumps({'nodes': node_ips}).encode('utf-8') + data = json.dumps({'nodes': ['127.0.0.1']}).encode('utf-8') time.sleep(5) print(f"Starting manager on {self._submission_endpoint}") client._POST('/managers/island/start', content=data, - content_type='application/json') + content_type='application/json').read() client._POST('/managers/master/start', content=data, - content_type='application/json') + content_type='application/json').read() def start_nodes(self): ips = [x['svc'] for x in self._pod_details.values()] @@ -181,9 +180,9 @@ def start_nodes(self): ) time.sleep(5) print(f"Starting node on {ip}") - node_ips = [x['ip'] for x in self._pod_details.values()] - data = json.dumps({'nodes': node_ips}).encode('utf-8') - client._POST("/managers/island/start", content=data, + node_ips = ['127.0.0.1'] + [x['ip'] for x in self._pod_details.values()] + data = json.dumps({'nodes': ['127.0.0.1']}).encode('utf-8') + client._POST("/managers/master/start", content=data, content_type='application/json') def launch_helm(self): @@ -206,13 +205,19 @@ def launch_helm(self): shell=True).decode('utf-8')) # TODO: Check running nodes before launching another self._find_pod_details() - self.start_manager("master") - self.start_nodes() + if wait_for_pods(self._num_machines): + self.start_manager("master") + self.start_nodes() + else: + print("ERROR: Machines did not start in timeframe allocated") + self.teardown() else: print(f"Created helm chart {self._chart_name} in {self._deploy_dir}") def teardown(self): - subprocess.check_output([f'helm uninstall daliuge-daemon'], shell=True) + for i in range(self._num_machines-1, -1, -1): + subprocess.check_output([f'helm uninstall daliuge-daemon-{i}'], shell=True) + subprocess.check_output([f'helm uninstall daliuge-daemon-master'], shell=True) def submit_job(self): """ @@ -221,10 +226,14 @@ def submit_job(self): """ # TODO: Check all nodes are operational first. pgt_data = json.loads(self._physical_graph_file) - node_ips = [x['ip'] for x in self._pod_details.values()] - node_ips.remove(self._pod_details['master']['ip']) - physical_graph = pg_generator.resource_map(pgt_data, node_ips) + # node_ips = [x['ip'] for x in self._pod_details.values()] + # node_ips.remove(self._pod_details['master']['ip']) + #node_ips = [self._pod_details['master']['ip']] + node_ips + node_ips = ['127.0.0.1'] + print(node_ips) + print(json.dumps(pgt_data, indent=4)) + physical_graph = pg_generator.resource_map(pgt_data, node_ips, co_host_dim=True) print(json.dumps(physical_graph, indent=4)) # TODO: Add dumping to log-dir print(self._submission_endpoint) - submit(physical_graph, self._submission_endpoint, port=MASTER_DEFAULT_REST_PORT, skip_deploy=True) + submit(physical_graph, self._submission_endpoint, skip_deploy=False) diff --git a/daliuge-engine/dlg/deploy/start_helm_cluster.py b/daliuge-engine/dlg/deploy/start_helm_cluster.py index c2ff6c73f..92317ad82 100644 --- a/daliuge-engine/dlg/deploy/start_helm_cluster.py +++ b/daliuge-engine/dlg/deploy/start_helm_cluster.py @@ -30,21 +30,22 @@ import json import os +import dlg.restutils +import dlg.exceptions from dlg.deploy.deployment_utils import find_node_ips from dlg.dropmake import pg_generator from dlg.deploy.helm_client import HelmClient -def get_pg(opts, node_managers: list, data_island_managers: list): +def get_pg(opts, num_node_managers, num_data_island_managers): if not opts.logical_graph and not opts.physical_graph: return [] - num_nms = len(node_managers) - num_dims = len(data_island_managers) if opts.logical_graph: unrolled_graph = pg_generator.unroll(opts.logical_graph) - pgt = pg_generator.partition(unrolled_graph, algo='mysarkar', num_partitons=num_nms, - num_islands=num_dims) + pgt = pg_generator.partition(unrolled_graph, algo='metis', + num_partitons=num_node_managers, + num_islands=num_data_island_managers) del unrolled_graph else: with open(opts.physical_graph, 'r', encoding='utf-8') as pg_file: @@ -115,8 +116,7 @@ def main(): if options.num_nodes <= 0: parser.error("The number of nodes must be a positive integer") - available_ips = find_node_ips() - physical_graph = get_pg(options, available_ips, [available_ips[0]]) + physical_graph = get_pg(options, 1, 1) # TODO: dynamic deployment directory. helm_client = HelmClient( deploy_name='daliuge-daemon', @@ -124,9 +124,16 @@ def main(): deploy_dir='/home/nicholas/dlg_temp/demo/', ) helm_client.create_helm_chart(json.dumps(physical_graph)) - helm_client.launch_helm() - helm_client.submit_job() - helm_client.teardown() + try: + helm_client.launch_helm() + helm_client.query_nodes() + helm_client.submit_job() + except dlg.restutils.RestClientException as exp: + raise exp + except dlg.exceptions.InvalidGraphException as exp2: + raise exp2 + finally: + helm_client.teardown() if __name__ == "__main__": diff --git a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml index b1377c2bc..760e609fb 100644 --- a/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/templates/daliuge-daemon-service.yaml @@ -17,4 +17,8 @@ spec: - protocol: TCP name: {{ .Values.service.nodemgr.name }} port: {{ .Values.service.nodemgr.port }} - targetPort: {{ .Values.containers.ports.nodemanagerPort }} \ No newline at end of file + targetPort: {{ .Values.containers.ports.nodemanagerPort }} + - protocol: TCP + name: {{ .Values.service.master.name }} + port: {{ .Values.service.master.port }} + targetPort: {{ .Values.containers.ports.masterPort }} \ No newline at end of file diff --git a/daliuge-k8s/helm/daliuge-daemon/values.yaml b/daliuge-k8s/helm/daliuge-daemon/values.yaml index 26bda9ab7..3a791eaed 100644 --- a/daliuge-k8s/helm/daliuge-daemon/values.yaml +++ b/daliuge-k8s/helm/daliuge-daemon/values.yaml @@ -8,6 +8,7 @@ containers: containerPort: 9000 deploymentPort: 8001 nodemanagerPort: 8000 + masterPort: 8002 service: daemon: name: daemon-port @@ -17,4 +18,7 @@ service: port: 8001 nodemgr: name: node-manager-port - port: 8000 \ No newline at end of file + port: 8000 + master: + name: master-port + port: 8002 \ No newline at end of file From cde344c0a0448f5a3c99b5c8c055543e8b63e12d Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Wed, 23 Feb 2022 14:19:07 +0800 Subject: [PATCH 260/484] Updates start_helm function to force single node deployments. Removes needless printing from helm_client. --- daliuge-engine/dlg/deploy/helm_client.py | 4 -- .../dlg/deploy/start_helm_cluster.py | 48 ++++++++++--------- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/daliuge-engine/dlg/deploy/helm_client.py b/daliuge-engine/dlg/deploy/helm_client.py index 33c007548..b4a706c5c 100644 --- a/daliuge-engine/dlg/deploy/helm_client.py +++ b/daliuge-engine/dlg/deploy/helm_client.py @@ -230,10 +230,6 @@ def submit_job(self): # node_ips.remove(self._pod_details['master']['ip']) #node_ips = [self._pod_details['master']['ip']] + node_ips node_ips = ['127.0.0.1'] - print(node_ips) - print(json.dumps(pgt_data, indent=4)) physical_graph = pg_generator.resource_map(pgt_data, node_ips, co_host_dim=True) - print(json.dumps(physical_graph, indent=4)) # TODO: Add dumping to log-dir - print(self._submission_endpoint) submit(physical_graph, self._submission_endpoint, skip_deploy=False) diff --git a/daliuge-engine/dlg/deploy/start_helm_cluster.py b/daliuge-engine/dlg/deploy/start_helm_cluster.py index 92317ad82..496046a32 100644 --- a/daliuge-engine/dlg/deploy/start_helm_cluster.py +++ b/daliuge-engine/dlg/deploy/start_helm_cluster.py @@ -29,6 +29,7 @@ import argparse import json import os +import tempfile import dlg.restutils import dlg.exceptions @@ -55,23 +56,24 @@ def get_pg(opts, num_node_managers, num_data_island_managers): def start_helm(physical_graph_template, num_nodes: int, deploy_dir: str): # TODO: Dynamic helm chart logging dir - available_ips = find_node_ips() pgt = json.loads(physical_graph_template) - pgt = pg_generator.partition(pgt, algo='min_num_parts', num_partitons=len(available_ips), - num_islands=len(available_ips)) - pg = pg_generator.resource_map(pgt, available_ips + available_ips) + pgt = pg_generator.partition(pgt, algo='min_num_parts', num_partitons=1, + num_islands=1) helm_client = HelmClient( deploy_name='daliuge-daemon', chart_name='daliuge-daemon', deploy_dir=deploy_dir ) + helm_client.create_helm_chart(json.dumps(pgt)) try: - helm_client.create_helm_chart(json.dumps(pg)) helm_client.launch_helm() helm_client.submit_job() + except dlg.restutils.RestClientException as exp: + raise exp + except dlg.exceptions.InvalidGraphException as exp2: + raise exp2 + finally: helm_client.teardown() - except Exception as ex: - raise def main(): @@ -118,22 +120,22 @@ def main(): physical_graph = get_pg(options, 1, 1) # TODO: dynamic deployment directory. - helm_client = HelmClient( - deploy_name='daliuge-daemon', - chart_name='daliuge-daemon', - deploy_dir='/home/nicholas/dlg_temp/demo/', - ) - helm_client.create_helm_chart(json.dumps(physical_graph)) - try: - helm_client.launch_helm() - helm_client.query_nodes() - helm_client.submit_job() - except dlg.restutils.RestClientException as exp: - raise exp - except dlg.exceptions.InvalidGraphException as exp2: - raise exp2 - finally: - helm_client.teardown() + with tempfile.TemporaryDirectory() as tdir: + helm_client = HelmClient( + deploy_name='daliuge-daemon', + chart_name='daliuge-daemon', + deploy_dir=tdir, + ) + helm_client.create_helm_chart(json.dumps(physical_graph)) + try: + helm_client.launch_helm() + helm_client.submit_job() + except dlg.restutils.RestClientException as exp: + raise exp + except dlg.exceptions.InvalidGraphException as exp2: + raise exp2 + finally: + helm_client.teardown() if __name__ == "__main__": From a59a5d6e33c4e2e6ca0fa022ec7cb6e8ed96e7b0 Mon Sep 17 00:00:00 2001 From: Nicholas Pritchard <21726929@student.uwa.edu.au> Date: Wed, 23 Feb 2022 14:54:13 +0800 Subject: [PATCH 261/484] Changes HELM Deploy button to HELM Deploy (Experimental) --- daliuge-translator/dlg/dropmake/web/pg_viewer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daliuge-translator/dlg/dropmake/web/pg_viewer.html b/daliuge-translator/dlg/dropmake/web/pg_viewer.html index 1df8a5ca9..4ec201c2a 100755 --- a/daliuge-translator/dlg/dropmake/web/pg_viewer.html +++ b/daliuge-translator/dlg/dropmake/web/pg_viewer.html @@ -79,7 +79,7 @@
            + + @@ -155,7 +158,7 @@